├── examples ├── example1 │ ├── .terraform-version │ ├── tfmigrator.yaml │ ├── main.tf │ └── README.md └── .gitignore ├── .gitignore ├── aqua ├── ghcp.yaml ├── cosign.yaml ├── actionlint.yaml ├── ghalint.yaml ├── goreleaser.yaml ├── reviewdog.yaml ├── terraform.yaml └── golangci-lint.yaml ├── githooks └── pre-commit.sh ├── scripts ├── fmt.sh ├── githook.sh └── coverage.sh ├── pkg ├── controller │ ├── config.go │ ├── controller.go │ └── run.go ├── cli │ ├── run.go │ └── runner.go ├── config │ └── config.go └── planner │ └── planner.go ├── aqua.yaml ├── renovate.json5 ├── .github └── workflows │ ├── test-main.yaml │ ├── test.yaml │ ├── release.yaml │ ├── actionlint.yaml │ └── integration-test.yaml ├── .golangci.yml ├── cmd └── tfmigrator │ └── main.go ├── docs ├── USAGE.md └── CONFIGURATION.md ├── LICENSE ├── .cmdx.yaml ├── README.md ├── go.mod ├── .goreleaser.yml ├── aqua-checksums.json └── go.sum /examples/example1/.terraform-version: -------------------------------------------------------------------------------- 1 | 1.0.7 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist/* 2 | .git-rm-branch.yml 3 | .envrc 4 | -------------------------------------------------------------------------------- /aqua/ghcp.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - name: int128/ghcp@v1.13.5 3 | -------------------------------------------------------------------------------- /githooks/pre-commit.sh: -------------------------------------------------------------------------------- 1 | cmdx test || exit 1 2 | cmdx lint 3 | -------------------------------------------------------------------------------- /aqua/cosign.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - name: sigstore/cosign@v2.4.1 3 | -------------------------------------------------------------------------------- /aqua/actionlint.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - name: rhysd/actionlint@v1.7.4 3 | -------------------------------------------------------------------------------- /aqua/ghalint.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - name: suzuki-shunsuke/ghalint@v1.0.0 3 | -------------------------------------------------------------------------------- /aqua/goreleaser.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - name: goreleaser/goreleaser@v2.4.8 3 | -------------------------------------------------------------------------------- /aqua/reviewdog.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - name: reviewdog/reviewdog@v0.20.2 3 | -------------------------------------------------------------------------------- /aqua/terraform.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - name: hashicorp/terraform@v1.9.8 3 | -------------------------------------------------------------------------------- /aqua/golangci-lint.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - name: golangci/golangci-lint@v1.62.0 3 | -------------------------------------------------------------------------------- /examples/.gitignore: -------------------------------------------------------------------------------- 1 | *.backup 2 | .terraform.lock.hcl 3 | .terraform 4 | terraform.tfstate* 5 | -------------------------------------------------------------------------------- /examples/example1/tfmigrator.yaml: -------------------------------------------------------------------------------- 1 | rules: 2 | - if: Resource.Address == "null_resource.foo" 3 | address: null_resource.bar 4 | -------------------------------------------------------------------------------- /examples/example1/main.tf: -------------------------------------------------------------------------------- 1 | # comment 2 | resource "null_resource" "foo" {} 3 | 4 | locals { 5 | foo = "foo" 6 | } 7 | 8 | locals { 9 | bar = "bar" 10 | } 11 | -------------------------------------------------------------------------------- /scripts/fmt.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -eu 4 | set -o pipefail 5 | 6 | cd "$(dirname "$0")/.." 7 | 8 | git ls-files | grep -E ".*\.go$" | xargs gofumpt -l -s -w 9 | -------------------------------------------------------------------------------- /pkg/controller/config.go: -------------------------------------------------------------------------------- 1 | package controller 2 | 3 | type Param struct { 4 | ConfigFilePath string 5 | LogLevel string 6 | StatePath string 7 | DryRun bool 8 | HCLFilePaths []string 9 | } 10 | -------------------------------------------------------------------------------- /aqua.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | # aqua - Declarative CLI Version Manager 3 | # https://aquaproj.github.io/ 4 | registries: 5 | - type: standard 6 | ref: v4.258.0 # renovate: depName=aquaproj/aqua-registry 7 | packages: 8 | - import: aqua/*.yaml 9 | -------------------------------------------------------------------------------- /scripts/githook.sh: -------------------------------------------------------------------------------- 1 | echoEval() { 2 | echo "+ $@" 3 | eval "$@" 4 | } 5 | 6 | cd `dirname $0`/.. 7 | if [ ! -f .git/hooks/pre-commit ]; then 8 | echoEval ln -s ../../githooks/pre-commit.sh .git/hooks/pre-commit || exit 1 9 | fi 10 | echoEval chmod a+x githooks/* 11 | -------------------------------------------------------------------------------- /renovate.json5: -------------------------------------------------------------------------------- 1 | { 2 | extends: [ 3 | "github>aquaproj/aqua-renovate-config#2.5.0", 4 | "github>aquaproj/aqua-renovate-config:file#2.5.0(aqua/.*\\.ya?ml)", 5 | "github>suzuki-shunsuke/renovate-config#2.5.0", 6 | "github>suzuki-shunsuke/renovate-config:nolimit#2.5.0", 7 | ], 8 | } 9 | -------------------------------------------------------------------------------- /.github/workflows/test-main.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | name: test-main 3 | 4 | on: 5 | push: 6 | branches: [main] 7 | 8 | permissions: {} 9 | 10 | jobs: 11 | test-main: 12 | uses: suzuki-shunsuke/go-test-workflow/.github/workflows/test.yaml@6861ea245ad10752afcba66cb71f28cf5c46ce49 # v1.1.0 13 | with: 14 | go-version-file: go.mod 15 | aqua_version: v2.38.0 16 | permissions: 17 | pull-requests: write 18 | -------------------------------------------------------------------------------- /.golangci.yml: -------------------------------------------------------------------------------- 1 | --- 2 | linters: 3 | enable-all: true 4 | disable: 5 | - wsl 6 | - err113 7 | - lll 8 | - godot 9 | - nlreturn 10 | - godox 11 | - tagliatelle 12 | - varnamelen 13 | - exhaustruct 14 | - depguard 15 | - exportloopref # WARN The linter 'exportloopref' is deprecated (since v1.60.2) due to: Since Go1.22 (loopvar) this linter is no longer relevant. Replaced by copyloopvar. 16 | -------------------------------------------------------------------------------- /.github/workflows/test.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | name: test 3 | 4 | on: pull_request 5 | 6 | jobs: 7 | test: 8 | uses: suzuki-shunsuke/go-test-full-workflow/.github/workflows/test.yaml@c37f3fa8a1dc979f7c4152ea0850eef1cbad7c2f # v1.1.1 9 | with: 10 | aqua_version: v2.38.0 11 | go-version-file: go.mod 12 | secrets: 13 | gh_app_id: ${{secrets.APP_ID}} 14 | gh_app_private_key: ${{secrets.APP_PRIVATE_KEY}} 15 | permissions: 16 | pull-requests: write 17 | contents: read 18 | -------------------------------------------------------------------------------- /.github/workflows/release.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Release 3 | on: 4 | push: 5 | tags: [v*] 6 | jobs: 7 | release: 8 | uses: suzuki-shunsuke/go-release-workflow/.github/workflows/release.yaml@7f97a226912ee2978126019b1e95311d7d15c97a # v2.0.0 9 | with: 10 | homebrew: true 11 | go-version-file: go.mod 12 | aqua_version: v2.38.0 13 | secrets: 14 | gh_app_id: ${{ secrets.APP_ID }} 15 | gh_app_private_key: ${{ secrets.APP_PRIVATE_KEY }} 16 | permissions: 17 | contents: write 18 | id-token: write 19 | actions: read 20 | attestations: write 21 | -------------------------------------------------------------------------------- /.github/workflows/actionlint.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | # Separate the workflow for actionlint to other workflows, because if a workflow for actionlint is broken actionlint isn't run 3 | name: actionlint 4 | on: 5 | pull_request: 6 | paths: 7 | - .github/workflows/*.yaml 8 | - aqua/actionlint.yaml 9 | - aqua/reviewdog.yaml 10 | jobs: 11 | actionlint: 12 | uses: suzuki-shunsuke/actionlint-workflow/.github/workflows/actionlint.yaml@f39bb91c0f9391bea9750f89252fb364f9d64c13 # v1.2.0 13 | with: 14 | aqua_version: v2.38.0 15 | permissions: 16 | pull-requests: write 17 | contents: read 18 | -------------------------------------------------------------------------------- /scripts/coverage.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -eu 4 | 5 | ee() { 6 | echo "+ $*" 7 | eval "$@" 8 | } 9 | 10 | cd "$(dirname "$0")/.." 11 | 12 | if [ $# -eq 0 ]; then 13 | target="$(find pkg -type d | fzf)" 14 | if [ "$target" = "" ]; then 15 | exit 0 16 | fi 17 | elif [ $# -eq 1 ]; then 18 | target=$1 19 | else 20 | echo "too many arguments are given: $*" >&2 21 | exit 1 22 | fi 23 | 24 | if [ ! -d "$target" ]; then 25 | echo "$target is not found" >&2 26 | exit 1 27 | fi 28 | 29 | ee mkdir -p .coverage/"$target" 30 | ee go test "./$target" -coverprofile=".coverage/$target/coverage.txt" -covermode=atomic 31 | ee go tool cover -html=".coverage/$target/coverage.txt" 32 | -------------------------------------------------------------------------------- /pkg/controller/controller.go: -------------------------------------------------------------------------------- 1 | package controller 2 | 3 | import ( 4 | "context" 5 | "io" 6 | "os" 7 | 8 | "github.com/sirupsen/logrus" 9 | ) 10 | 11 | type Controller struct { //nolint:maligned 12 | Stdin io.Reader 13 | Stdout io.Writer 14 | Stderr io.Writer 15 | } 16 | 17 | func New(_ context.Context, param *Param) (*Controller, *Param, error) { 18 | if param.LogLevel != "" { 19 | lvl, err := logrus.ParseLevel(param.LogLevel) 20 | if err != nil { 21 | logrus.WithFields(logrus.Fields{ 22 | "log_level": param.LogLevel, 23 | }).WithError(err).Error("the log level is invalid") 24 | } 25 | logrus.SetLevel(lvl) 26 | } 27 | 28 | return &Controller{ 29 | Stdin: os.Stdin, 30 | Stdout: os.Stdout, 31 | Stderr: os.Stderr, 32 | }, param, nil 33 | } 34 | -------------------------------------------------------------------------------- /cmd/tfmigrator/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "os" 6 | "os/signal" 7 | 8 | "github.com/sirupsen/logrus" 9 | "github.com/tfmigrator/cli/pkg/cli" 10 | ) 11 | 12 | var ( 13 | version = "" 14 | commit = "" //nolint:gochecknoglobals 15 | date = "" //nolint:gochecknoglobals 16 | ) 17 | 18 | func main() { 19 | if err := core(); err != nil { 20 | logrus.Fatal(err) 21 | } 22 | } 23 | 24 | func core() error { 25 | runner := cli.Runner{ 26 | Stdin: os.Stdin, 27 | Stdout: os.Stdout, 28 | Stderr: os.Stderr, 29 | LDFlags: &cli.LDFlags{ 30 | Version: version, 31 | Commit: commit, 32 | Date: date, 33 | }, 34 | } 35 | ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) 36 | defer stop() 37 | return runner.Run(ctx, os.Args...) //nolint:wrapcheck 38 | } 39 | -------------------------------------------------------------------------------- /docs/USAGE.md: -------------------------------------------------------------------------------- 1 | # Usage 2 | 3 | ```console 4 | $ tfmigrator help 5 | NAME: 6 | tfmigrator - Migrate Terraform Configuration and State. https://github.com/tfmigrator/cli 7 | 8 | USAGE: 9 | tfmigrator [global options] command [command options] [arguments...] 10 | 11 | VERSION: 12 | 0.1.0 13 | 14 | COMMANDS: 15 | run Migrate Terraform Configuration and State 16 | help, h Shows a list of commands or help for one command 17 | 18 | GLOBAL OPTIONS: 19 | --help, -h show help (default: false) 20 | --version, -v print the version (default: false) 21 | ``` 22 | 23 | ```console 24 | $ tfmigrator help run 25 | NAME: 26 | tfmigrator run - Migrate Terraform Configuration and State 27 | 28 | USAGE: 29 | tfmigrator run [command options] [arguments...] 30 | 31 | OPTIONS: 32 | --log-level value log level 33 | --config value, -c value configuration file path 34 | --dry-run dry run (default: false) 35 | --state value the output of 'terraform show -json' 36 | ``` 37 | -------------------------------------------------------------------------------- /pkg/cli/run.go: -------------------------------------------------------------------------------- 1 | package cli 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/tfmigrator/cli/pkg/controller" 7 | "github.com/urfave/cli/v2" 8 | ) 9 | 10 | func (runner *Runner) setCLIArg(c *cli.Context, param *controller.Param) error { //nolint:unparam 11 | param.StatePath = c.String("state") 12 | if logLevel := c.String("log-level"); logLevel != "" { 13 | param.LogLevel = logLevel 14 | } 15 | param.DryRun = c.Bool("dry-run") 16 | param.ConfigFilePath = c.String("config") 17 | if param.ConfigFilePath == "" { 18 | param.ConfigFilePath = "tfmigrator.yaml" 19 | } 20 | param.HCLFilePaths = c.Args().Slice() 21 | return nil 22 | } 23 | 24 | func (runner *Runner) runAction(c *cli.Context) error { 25 | param := &controller.Param{} 26 | if err := runner.setCLIArg(c, param); err != nil { 27 | return fmt.Errorf("parse the command line arguments: %w", err) 28 | } 29 | 30 | ctrl, param, err := controller.New(c.Context, param) 31 | if err != nil { 32 | return fmt.Errorf("initialize a controller: %w", err) 33 | } 34 | 35 | return ctrl.Run(c.Context, param) //nolint:wrapcheck 36 | } 37 | -------------------------------------------------------------------------------- /pkg/config/config.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | import ( 4 | "fmt" 5 | "os" 6 | 7 | "github.com/suzuki-shunsuke/expr-unmarshaler/expr" 8 | "github.com/suzuki-shunsuke/go-template-unmarshaler/text" 9 | "gopkg.in/yaml.v2" 10 | ) 11 | 12 | type Config struct { 13 | Rules []*Rule 14 | } 15 | 16 | type Rule struct { 17 | If *expr.Bool 18 | Address *text.Template 19 | Dirname *text.Template 20 | HCLFileBasename *text.Template `yaml:"hcl_file_basename"` 21 | StateBasename *text.Template `yaml:"state_file_basename"` 22 | Ignored bool 23 | Removed bool 24 | SkipHCLMigration bool `yaml:"skip_hcl_migration"` 25 | SkipStateMigration bool `yaml:"skip_state_migration"` 26 | } 27 | 28 | func Read(p string, cfg *Config) error { 29 | cfgFile, err := os.Open(p) 30 | if err != nil { 31 | return fmt.Errorf("open a configuration file %s: %w", p, err) 32 | } 33 | defer cfgFile.Close() 34 | if err := yaml.NewDecoder(cfgFile).Decode(&cfg); err != nil { 35 | return fmt.Errorf("parse a configuration file as YAML %s: %w", p, err) 36 | } 37 | return nil 38 | } 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 tfmigrator 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/integration-test.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | name: integration-test 3 | permissions: {} 4 | on: 5 | push: 6 | branches: [main] 7 | pull_request: {} 8 | jobs: 9 | build: 10 | timeout-minutes: 30 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 14 | 15 | - uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0 16 | with: 17 | go-version-file: go.mod 18 | - run: go build -o /usr/local/bin/tfmigrator ./cmd/tfmigrator 19 | 20 | - uses: aquaproj/aqua-installer@f13c5d2f0357708d85477aabe50fd3f725528745 # v3.1.0 21 | with: 22 | aqua_version: v2.38.0 23 | env: 24 | GITHUB_TOKEN: ${{ github.token }} 25 | 26 | - run: terraform init 27 | working-directory: examples/example1 28 | env: 29 | GITHUB_TOKEN: ${{ github.token }} 30 | - run: terraform apply -auto-approve 31 | working-directory: examples/example1 32 | - run: tfmigrator run -dry-run main.tf 33 | working-directory: examples/example1 34 | - run: tfmigrator run main.tf 35 | working-directory: examples/example1 36 | - run: terraform plan 37 | working-directory: examples/example1 38 | - run: terraform state list 39 | working-directory: examples/example1 40 | - run: git diff . 41 | working-directory: examples/example1 42 | -------------------------------------------------------------------------------- /.cmdx.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | # the configuration file of cmdx - task runner 3 | # https://github.com/suzuki-shunsuke/cmdx 4 | tasks: 5 | - name: init 6 | short: i 7 | script: bash scripts/githook.sh 8 | description: setup git hooks 9 | usage: setup git hooks 10 | - name: coverage 11 | short: c 12 | description: test a package 13 | usage: test a package 14 | script: "bash scripts/coverage.sh {{.path}}" 15 | args: 16 | - name: path 17 | - name: test 18 | short: t 19 | description: test 20 | usage: test 21 | script: go test -v ./... -race -covermode=atomic 22 | - name: fmt 23 | description: format the go code 24 | usage: format the go code 25 | script: bash scripts/fmt.sh 26 | require: 27 | exec: 28 | - gofumpt 29 | - name: vet 30 | short: v 31 | description: go vet 32 | usage: go vet 33 | script: go vet ./... 34 | - name: lint 35 | short: l 36 | description: lint the go code 37 | usage: lint the go code 38 | script: golangci-lint run 39 | - name: release 40 | short: r 41 | description: release the new version 42 | usage: release the new version 43 | script: | 44 | git tag -m "chore: release {{.version}}" "{{.version}}" 45 | git push origin "{{.version}}" 46 | args: 47 | - name: version 48 | required: true 49 | validate: 50 | - regexp: "^v\\d+\\.\\d+.\\d+(-\\d+)?$" 51 | - name: build 52 | script: go build -o ./dist/tfmigrator ./cmd/tfmigrator 53 | -------------------------------------------------------------------------------- /examples/example1/README.md: -------------------------------------------------------------------------------- 1 | # Example 1 2 | 3 | ## Requirements 4 | 5 | * Terraform 6 | * tfmigrator CLI 7 | 8 | ## Setup 9 | 10 | Run `terraform apply` to create `terraform.tfstate`. 11 | 12 | ``` 13 | $ terraform init 14 | $ terraform apply 15 | ``` 16 | 17 | ## Dry Run 18 | 19 | ```console 20 | $ tfmigrator run -dry-run main.tf 21 | 2021/07/18 18:28:18 [INFO] [DRYRUN] + terraform state mv null_resource.foo null_resource.bar 22 | migrated_resources: 23 | - source_address: null_resource.foo 24 | source_tf_file_path: main.tf 25 | new_address: null_resource.bar 26 | removed_resources: [] 27 | not_migrated_resources: [] 28 | ``` 29 | 30 | ## Migrate 31 | 32 | ```console 33 | $ tfmigrator run main.tf 34 | 2021/07/18 18:31:24 [INFO] + terraform state mv null_resource.foo null_resource.bar 35 | migrated_resources: 36 | - source_address: null_resource.foo 37 | source_tf_file_path: main.tf 38 | new_address: null_resource.bar 39 | removed_resources: [] 40 | not_migrated_resources: [] 41 | ``` 42 | 43 | Confirm that main.tf is updated without losing code comment. 44 | 45 | ```diff 46 | $ git diff main.tf 47 | diff --git a/examples/example1/main.tf b/examples/example1/main.tf 48 | index b9aaa38..43f6c1a 100644 49 | --- a/examples/example1/main.tf 50 | +++ b/examples/example1/main.tf 51 | @@ -1,5 +1,5 @@ 52 | # comment 53 | -resource "null_resource" "foo" {} 54 | +resource "null_resource" "bar" {} 55 | 56 | locals { 57 | foo = "foo" 58 | ``` 59 | -------------------------------------------------------------------------------- /pkg/cli/runner.go: -------------------------------------------------------------------------------- 1 | package cli 2 | 3 | import ( 4 | "context" 5 | "io" 6 | 7 | "github.com/urfave/cli/v2" 8 | ) 9 | 10 | type LDFlags struct { 11 | Version string 12 | Commit string 13 | Date string 14 | } 15 | 16 | func (flags *LDFlags) AppVersion() string { 17 | return flags.Version + " (" + flags.Commit + ")" 18 | } 19 | 20 | type Runner struct { 21 | Stdin io.Reader 22 | Stdout io.Writer 23 | Stderr io.Writer 24 | LDFlags *LDFlags 25 | } 26 | 27 | func (runner *Runner) Run(ctx context.Context, args ...string) error { 28 | app := cli.App{ 29 | Name: "tfmigrator", 30 | Usage: "Migrate Terraform Configuration and State. https://github.com/tfmigrator/cli", 31 | Version: runner.LDFlags.AppVersion(), 32 | Commands: []*cli.Command{ 33 | { 34 | Name: "run", 35 | Usage: "Migrate Terraform Configuration and State", 36 | Action: runner.runAction, 37 | Flags: []cli.Flag{ 38 | &cli.StringFlag{ 39 | Name: "log-level", 40 | Usage: "log level", 41 | }, 42 | &cli.StringFlag{ 43 | Name: "config", 44 | Aliases: []string{"c"}, 45 | Usage: "configuration file path", 46 | }, 47 | &cli.BoolFlag{ 48 | Name: "dry-run", 49 | Usage: "dry run", 50 | }, 51 | &cli.StringFlag{ 52 | Name: "state", 53 | Usage: "the output of 'terraform show -json'", 54 | }, 55 | }, 56 | }, 57 | }, 58 | } 59 | 60 | return app.RunContext(ctx, args) //nolint:wrapcheck 61 | } 62 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # tfmigrator CLI 2 | 3 | [![Build Status](https://github.com/tfmigrator/cli/workflows/test/badge.svg)](https://github.com/tfmigrator/cli/actions) 4 | [![Go Report Card](https://goreportcard.com/badge/github.com/tfmigrator/cli)](https://goreportcard.com/report/github.com/tfmigrator/cli) 5 | [![GitHub last commit](https://img.shields.io/github/last-commit/tfmigrator/cli.svg)](https://github.com/tfmigrator/cli) 6 | [![License](http://img.shields.io/badge/license-mit-blue.svg?style=flat-square)](https://raw.githubusercontent.com/tfmigrator/cli/main/LICENSE) 7 | 8 | CLI to migrate Terraform Configuration and State. 9 | The migration feature is implemented with [tfmigrator/tfmigrator](https://github.com/tfmigrator/tfmigrator), so please see the document of [tfmigrator/tfmigrator](https://github.com/tfmigrator/tfmigrator) too. 10 | 11 | ## Requirement 12 | 13 | * Terraform 14 | 15 | ## Install 16 | 17 | Download a binary from the [release page](https://github.com/tfmigrator/cli/releases). 18 | You can install tfmigrator with [Homewbrew](https://brew.sh/) too. 19 | 20 | ```console 21 | $ brew install tfmigrator/cli/tfmigrator 22 | ``` 23 | 24 | You can install tfmigrator with [aqua](https://aquaproj.github.io/) too. 25 | 26 | ```console 27 | $ aqua g -i tfmigrator/cli 28 | ``` 29 | 30 | ## Index 31 | 32 | * [Examples](examples) 33 | * [Usage](docs/USAGE.md) 34 | * [Configuration](docs/CONFIGURATION.md) 35 | * [Change Log](https://github.com/tfmigrator/cli/releases) 36 | 37 | ## LICENSE 38 | 39 | [MIT](LICENSE) 40 | -------------------------------------------------------------------------------- /docs/CONFIGURATION.md: -------------------------------------------------------------------------------- 1 | # Configuration 2 | 3 | path | type | required | default | description 4 | --- | --- | --- | --- | --- 5 | .rules | rule | true | | 6 | 7 | ## type: rule 8 | 9 | path | type | required | default | example | description 10 | --- | --- | --- | --- | --- | --- 11 | if | bool expression | true | | `Resource.Type == "null_resource"` | If the result is `true`, the resource is proceeded by the rule 12 | address | template | false | no change | `{{.Resource.Type}}.{{.Resource.Name \| replace "-" "_"}}` | 13 | dirname | template | false | no change | `foo` | 14 | hcl_file_basename | template | false | no change | `{{.Resource.Type}}.tf` | 15 | state_basename | template | false | terraform.tfstate | `foo.tfstate` | 16 | removed | bool | false | false | | If this is true, resources which match the rule are removed 17 | ignored | bool | false | false | | If this is true, resources which match the rule aren't migrated by tfmigrator 18 | skip_hcl_migration | bool | false | false | | If this is true, Terraform Configuration isn't changed 19 | skip_state_migration | bool | false | false | | If this is true, Terraform State isn't changed 20 | 21 | ## type: bool expression 22 | 23 | [expr](https://github.com/antonmedv/expr/blob/master/docs/Language-Definition.md) expression. 24 | The expression must be returnes boolean (true or false). 25 | 26 | ## type: template 27 | 28 | Go's [text/template](https://golang.org/pkg/text/template/) 29 | 30 | [sprig](http://masterminds.github.io/sprig/) function can be used. 31 | 32 | ## expression and template parameter 33 | 34 | [*tfmigrator.Source](https://pkg.go.dev/github.com/tfmigrator/tfmigrator@v0.5.1/tfmigrator#Source) is passed. 35 | -------------------------------------------------------------------------------- /pkg/planner/planner.go: -------------------------------------------------------------------------------- 1 | package planner 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/tfmigrator/cli/pkg/config" 7 | "github.com/tfmigrator/tfmigrator/tfmigrator" 8 | ) 9 | 10 | type Planner struct { 11 | Rules []*config.Rule 12 | } 13 | 14 | func (planner *Planner) Plan(src *tfmigrator.Source) (*tfmigrator.MigratedResource, error) { 15 | for _, rule := range planner.Rules { 16 | matched, err := rule.If.Run(src) 17 | if err != nil { 18 | return nil, fmt.Errorf("evaluate the rule: %w", err) 19 | } 20 | if !matched { 21 | continue 22 | } 23 | if rule.Ignored { 24 | return nil, nil //nolint:nilnil 25 | } 26 | return planner.plan(src, rule) 27 | } 28 | return nil, nil //nolint:nilnil 29 | } 30 | 31 | func (planner *Planner) plan(src *tfmigrator.Source, rule *config.Rule) (*tfmigrator.MigratedResource, error) { 32 | rsc := &tfmigrator.MigratedResource{ 33 | Removed: rule.Removed, 34 | SkipHCLMigration: rule.SkipHCLMigration, 35 | SkipStateMigration: rule.SkipStateMigration, 36 | } 37 | if rule.Removed { 38 | return rsc, nil 39 | } 40 | 41 | if !rule.Address.Empty() { 42 | s, err := rule.Address.Execute(src) 43 | if err != nil { 44 | return nil, fmt.Errorf("evaluate the address: %w", err) 45 | } 46 | rsc.Address = s 47 | } 48 | 49 | if !rule.Dirname.Empty() { 50 | s, err := rule.Dirname.Execute(src) 51 | if err != nil { 52 | return nil, fmt.Errorf("evaluate the dirname: %w", err) 53 | } 54 | rsc.Dirname = s 55 | } 56 | 57 | if !rule.HCLFileBasename.Empty() { 58 | s, err := rule.HCLFileBasename.Execute(src) 59 | if err != nil { 60 | return nil, fmt.Errorf("evaluate the hcl_file_basename: %w", err) 61 | } 62 | rsc.HCLFileBasename = s 63 | } 64 | 65 | if !rule.StateBasename.Empty() { 66 | s, err := rule.StateBasename.Execute(src) 67 | if err != nil { 68 | return nil, fmt.Errorf("evaluate the state_basename: %w", err) 69 | } 70 | rsc.StateBasename = s 71 | } 72 | 73 | return rsc, nil 74 | } 75 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/tfmigrator/cli 2 | 3 | go 1.23.3 4 | 5 | require ( 6 | github.com/Masterminds/sprig/v3 v3.3.0 7 | github.com/hashicorp/terraform-exec v0.21.0 8 | github.com/sirupsen/logrus v1.9.3 9 | github.com/suzuki-shunsuke/expr-unmarshaler v0.1.0 10 | github.com/suzuki-shunsuke/go-template-unmarshaler v0.1.0 11 | github.com/tfmigrator/tfmigrator v0.5.1 12 | github.com/urfave/cli/v2 v2.27.5 13 | gopkg.in/yaml.v2 v2.4.0 14 | ) 15 | 16 | require ( 17 | dario.cat/mergo v1.0.1 // indirect 18 | github.com/Masterminds/goutils v1.1.1 // indirect 19 | github.com/Masterminds/semver/v3 v3.3.0 // indirect 20 | github.com/agext/levenshtein v1.2.1 // indirect 21 | github.com/antonmedv/expr v1.8.9 // indirect 22 | github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect 23 | github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect 24 | github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect 25 | github.com/go-playground/locales v0.13.0 // indirect 26 | github.com/go-playground/universal-translator v0.17.0 // indirect 27 | github.com/go-playground/validator/v10 v10.6.1 // indirect 28 | github.com/google/go-cmp v0.6.0 // indirect 29 | github.com/google/uuid v1.6.0 // indirect 30 | github.com/hashicorp/go-version v1.6.0 // indirect 31 | github.com/hashicorp/hcl/v2 v2.10.0 // indirect 32 | github.com/hashicorp/terraform-json v0.22.1 // indirect 33 | github.com/huandu/xstrings v1.5.0 // indirect 34 | github.com/leodido/go-urn v1.2.0 // indirect 35 | github.com/minamijoyo/hcledit v0.2.0 // indirect 36 | github.com/mitchellh/copystructure v1.2.0 // indirect 37 | github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 // indirect 38 | github.com/mitchellh/reflectwalk v1.0.2 // indirect 39 | github.com/russross/blackfriday/v2 v2.1.0 // indirect 40 | github.com/shopspring/decimal v1.4.0 // indirect 41 | github.com/spf13/cast v1.7.0 // indirect 42 | github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect 43 | github.com/zclconf/go-cty v1.14.4 // indirect 44 | golang.org/x/crypto v0.26.0 // indirect 45 | golang.org/x/sys v0.23.0 // indirect 46 | golang.org/x/text v0.17.0 // indirect 47 | ) 48 | -------------------------------------------------------------------------------- /.goreleaser.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: 2 3 | project_name: tfmigrator 4 | archives: 5 | - name_template: "{{.ProjectName}}_{{.Os}}_{{.Arch}}" 6 | builds: 7 | - binary: tfmigrator 8 | main: cmd/tfmigrator/main.go 9 | env: 10 | - CGO_ENABLED=0 11 | goos: 12 | - windows 13 | - darwin 14 | - linux 15 | goarch: 16 | - amd64 17 | - arm64 18 | release: 19 | prerelease: true 20 | header: | 21 | [Pull Requests](https://github.com/tfmigrator/cli/pulls?q=is%3Apr+milestone%3A{{.Tag}}) | [Issues](https://github.com/tfmigrator/cli/issues?q=is%3Aissue+milestone%3A{{.Tag}}) | https://github.com/tfmigrator/cli/compare/{{.PreviousTag}}...{{.Tag}} 22 | brews: 23 | - 24 | # NOTE: make sure the url_template, the token and given repo (github or gitlab) owner and name are from the 25 | # same kind. We will probably unify this in the next major version like it is done with scoop. 26 | 27 | # GitHub/GitLab repository to push the formula to 28 | repository: 29 | owner: tfmigrator 30 | name: homebrew-cli 31 | token: "{{ .Env.HOMEBREW_TAP_GITHUB_TOKEN }}" 32 | # The project name and current git tag are used in the format string. 33 | commit_msg_template: "Brew formula update for {{ .ProjectName }} version {{ .Tag }}" 34 | # Your app's homepage. 35 | # Default is empty. 36 | homepage: https://github.com/tfmigrator/cli 37 | 38 | # Template of your app's description. 39 | # Default is empty. 40 | description: Migrate Terraform Configuration and State 41 | license: MIT 42 | 43 | # Setting this will prevent goreleaser to actually try to commit the updated 44 | # formula - instead, the formula file will be stored on the dist folder only, 45 | # leaving the responsibility of publishing it to the user. 46 | # If set to auto, the release will not be uploaded to the homebrew tap 47 | # in case there is an indicator for prerelease in the tag e.g. v1.0.0-rc1 48 | # Default is false. 49 | skip_upload: auto 50 | 51 | # So you can `brew test` your formula. 52 | # Default is empty. 53 | test: | 54 | system "#{bin}/tfmigrator --version" 55 | signs: 56 | - cmd: cosign 57 | artifacts: checksum 58 | signature: ${artifact}.sig 59 | certificate: ${artifact}.pem 60 | output: true 61 | args: 62 | - sign-blob 63 | - "-y" 64 | - --output-signature 65 | - ${signature} 66 | - --output-certificate 67 | - ${certificate} 68 | - --oidc-provider 69 | - github 70 | - ${artifact} 71 | -------------------------------------------------------------------------------- /pkg/controller/run.go: -------------------------------------------------------------------------------- 1 | package controller 2 | 3 | import ( 4 | "context" 5 | "errors" 6 | "fmt" 7 | "os" 8 | "os/exec" 9 | "text/template" 10 | 11 | "github.com/Masterminds/sprig/v3" 12 | "github.com/hashicorp/terraform-exec/tfexec" 13 | "github.com/suzuki-shunsuke/go-template-unmarshaler/text" 14 | "github.com/tfmigrator/cli/pkg/config" 15 | "github.com/tfmigrator/cli/pkg/planner" 16 | "github.com/tfmigrator/tfmigrator/tfmigrator" 17 | "github.com/tfmigrator/tfmigrator/tfmigrator/hcledit" 18 | tflog "github.com/tfmigrator/tfmigrator/tfmigrator/log" 19 | "github.com/tfmigrator/tfmigrator/tfmigrator/tfstate" 20 | ) 21 | 22 | func (ctrl *Controller) Run(ctx context.Context, param *Param) error { //nolint:funlen 23 | text.SetTemplateFunc(func(s string) (*template.Template, error) { 24 | return template.New("_").Funcs(sprig.TxtFuncMap()).Parse(s) 25 | }) 26 | cfg := config.Config{} 27 | if err := config.Read(param.ConfigFilePath, &cfg); err != nil { 28 | return fmt.Errorf("read the configuration file %s: %w", param.ConfigFilePath, err) 29 | } 30 | pln := &planner.Planner{ 31 | Rules: cfg.Rules, 32 | } 33 | 34 | logger := &tflog.SimpleLogger{} 35 | if param.LogLevel != "" { 36 | if err := logger.SetLogLevel(param.LogLevel); err != nil { 37 | return fmt.Errorf("set the log level (%s): %w", param.LogLevel, err) 38 | } 39 | } 40 | 41 | wd, err := os.Getwd() 42 | if err != nil { 43 | return fmt.Errorf("get the current directory: %w", err) 44 | } 45 | tfCmdPath, err := exec.LookPath("terraform") 46 | if err != nil { 47 | return errors.New("the command `terraform` isn't found: %w") 48 | } 49 | tf, err := tfexec.NewTerraform(wd, tfCmdPath) 50 | if err != nil { 51 | return fmt.Errorf("initialize Terraform exec: %w", err) 52 | } 53 | 54 | editor := &hcledit.Client{ 55 | DryRun: param.DryRun, 56 | Stderr: os.Stderr, 57 | Logger: logger, 58 | } 59 | 60 | runner := &tfmigrator.Runner{ 61 | Planner: pln, 62 | Logger: logger, 63 | HCLEdit: editor, 64 | StateReader: &tfstate.Reader{ 65 | Stderr: os.Stderr, 66 | Logger: logger, 67 | Terraform: tf, 68 | }, 69 | Outputter: tfmigrator.NewYAMLOutputter(os.Stderr), 70 | Migrator: &tfmigrator.Migrator{ 71 | Stdout: os.Stdout, 72 | DryRun: param.DryRun, 73 | HCLEdit: editor, 74 | StateUpdater: &tfstate.Updater{ 75 | Stdout: os.Stdout, 76 | Stderr: os.Stderr, 77 | DryRun: param.DryRun, 78 | Logger: logger, 79 | Terraform: tf, 80 | }, 81 | }, 82 | DryRun: param.DryRun, 83 | } 84 | return runner.Run(ctx, &tfmigrator.RunOpt{ //nolint:wrapcheck 85 | SourceHCLFilePaths: param.HCLFilePaths, 86 | SourceStatePath: param.StatePath, 87 | }) 88 | } 89 | -------------------------------------------------------------------------------- /aqua-checksums.json: -------------------------------------------------------------------------------- 1 | { 2 | "checksums": [ 3 | { 4 | "id": "github_release/github.com/golangci/golangci-lint/v1.62.0/golangci-lint-1.62.0-darwin-amd64.tar.gz", 5 | "checksum": "0ED6F1A216DDB62E293858196799608D63894BD2EC178114484363CA45CDE84B", 6 | "algorithm": "sha256" 7 | }, 8 | { 9 | "id": "github_release/github.com/golangci/golangci-lint/v1.62.0/golangci-lint-1.62.0-darwin-arm64.tar.gz", 10 | "checksum": "DDE51958F0F24D442062B5709B6912D91E235115DFE5887E80B3E5602C9CC09B", 11 | "algorithm": "sha256" 12 | }, 13 | { 14 | "id": "github_release/github.com/golangci/golangci-lint/v1.62.0/golangci-lint-1.62.0-linux-amd64.tar.gz", 15 | "checksum": "53695531EEB824B6883C703335CEF6F07882F8BA6FEDC00ED43853EA07FA1FBD", 16 | "algorithm": "sha256" 17 | }, 18 | { 19 | "id": "github_release/github.com/golangci/golangci-lint/v1.62.0/golangci-lint-1.62.0-linux-arm64.tar.gz", 20 | "checksum": "E1E47209D7BDD288FD8CFE88548B477DF2F7ECA81B0E9EC1F9D45604F79185EB", 21 | "algorithm": "sha256" 22 | }, 23 | { 24 | "id": "github_release/github.com/golangci/golangci-lint/v1.62.0/golangci-lint-1.62.0-windows-amd64.zip", 25 | "checksum": "34E980AFE44655C395AA65F96953FC4B6A2E58206F1A7370AB88407B187184C8", 26 | "algorithm": "sha256" 27 | }, 28 | { 29 | "id": "github_release/github.com/golangci/golangci-lint/v1.62.0/golangci-lint-1.62.0-windows-arm64.zip", 30 | "checksum": "6CBE5C705F098B4AF79DAF3359C4C92BEA847215EA8D023E90436BC3A671842D", 31 | "algorithm": "sha256" 32 | }, 33 | { 34 | "id": "github_release/github.com/goreleaser/goreleaser/v2.4.8/goreleaser_Darwin_all.tar.gz", 35 | "checksum": "AF78A0E0AE01E9687B23B18CBED7CFDC9A15F89092789AA9CE3EB021499959EE", 36 | "algorithm": "sha256" 37 | }, 38 | { 39 | "id": "github_release/github.com/goreleaser/goreleaser/v2.4.8/goreleaser_Linux_arm64.tar.gz", 40 | "checksum": "B04032A54E40FC80EB6D8A3A7B428AB5CB3DD49606032D1AB14200D7F8287BE9", 41 | "algorithm": "sha256" 42 | }, 43 | { 44 | "id": "github_release/github.com/goreleaser/goreleaser/v2.4.8/goreleaser_Linux_x86_64.tar.gz", 45 | "checksum": "A115C78EDC90D0EB5D36272C54A8087C0B209644349F3E720E2EC53D48D77647", 46 | "algorithm": "sha256" 47 | }, 48 | { 49 | "id": "github_release/github.com/goreleaser/goreleaser/v2.4.8/goreleaser_Windows_arm64.zip", 50 | "checksum": "9F33640E74910CF38ED2FCE591439422D63A4C419FD0FB7A148D38A642E893AF", 51 | "algorithm": "sha256" 52 | }, 53 | { 54 | "id": "github_release/github.com/goreleaser/goreleaser/v2.4.8/goreleaser_Windows_x86_64.zip", 55 | "checksum": "D741624E79ADFD927A9D8B1D5137FA0E930826AF3E01D9AA6DE40983428F4E20", 56 | "algorithm": "sha256" 57 | }, 58 | { 59 | "id": "github_release/github.com/int128/ghcp/v1.13.5/ghcp_darwin_amd64.zip", 60 | "checksum": "6728BD668888A64C71BF01D9AFBA373F38D353B79D181B1401A4E5E4B329289D", 61 | "algorithm": "sha256" 62 | }, 63 | { 64 | "id": "github_release/github.com/int128/ghcp/v1.13.5/ghcp_linux_amd64.zip", 65 | "checksum": "3C808E566F0B663182AD5B5DD6E6B05DC8346610EA5613EA8C22AB19F47A4493", 66 | "algorithm": "sha256" 67 | }, 68 | { 69 | "id": "github_release/github.com/int128/ghcp/v1.13.5/ghcp_windows_amd64.zip", 70 | "checksum": "1A90AD7927F720EB8996AE143DF5D7AA2DF70689B7B5B9074D6FD32C244D688E", 71 | "algorithm": "sha256" 72 | }, 73 | { 74 | "id": "github_release/github.com/reviewdog/reviewdog/v0.20.2/reviewdog_0.20.2_Darwin_arm64.tar.gz", 75 | "checksum": "595D340888463796B4585FF5D1F2B0B9084E20E9A76692B4271EC92C6F4D6C64", 76 | "algorithm": "sha256" 77 | }, 78 | { 79 | "id": "github_release/github.com/reviewdog/reviewdog/v0.20.2/reviewdog_0.20.2_Darwin_x86_64.tar.gz", 80 | "checksum": "F4FE03E62D81FDBDA24F170DA9A36690EFE6B58B534B37CA37A848E1A2C1AD1C", 81 | "algorithm": "sha256" 82 | }, 83 | { 84 | "id": "github_release/github.com/reviewdog/reviewdog/v0.20.2/reviewdog_0.20.2_Linux_arm64.tar.gz", 85 | "checksum": "7142B52EA8734CA821AB82C36B0094D6B4B9F2B8A2ADB223CFD708CEB5581BE6", 86 | "algorithm": "sha256" 87 | }, 88 | { 89 | "id": "github_release/github.com/reviewdog/reviewdog/v0.20.2/reviewdog_0.20.2_Linux_x86_64.tar.gz", 90 | "checksum": "25D0A8A0E64E50D84503332F498D2AB54979145AC97D5457E6B1DDE79212E4FF", 91 | "algorithm": "sha256" 92 | }, 93 | { 94 | "id": "github_release/github.com/reviewdog/reviewdog/v0.20.2/reviewdog_0.20.2_Windows_arm64.tar.gz", 95 | "checksum": "0068BD16540746E808544DFA2745A39F9A188F6BF19B50198FCF8B9DCA28371F", 96 | "algorithm": "sha256" 97 | }, 98 | { 99 | "id": "github_release/github.com/reviewdog/reviewdog/v0.20.2/reviewdog_0.20.2_Windows_x86_64.tar.gz", 100 | "checksum": "B5344494EA629A063914149C4DD1AEDB052FCA4EFCAB61B108EF0560C3449632", 101 | "algorithm": "sha256" 102 | }, 103 | { 104 | "id": "github_release/github.com/rhysd/actionlint/v1.7.4/actionlint_1.7.4_darwin_amd64.tar.gz", 105 | "checksum": "63A3BA90EE2325AFAD3FF2E64A4D80688C261E6C68BE8E6AB91214637BF936B8", 106 | "algorithm": "sha256" 107 | }, 108 | { 109 | "id": "github_release/github.com/rhysd/actionlint/v1.7.4/actionlint_1.7.4_darwin_arm64.tar.gz", 110 | "checksum": "CBD193BB490F598D77E179261D7B76DFEBD049DDDEDE5803BA21CBF6A469AEEE", 111 | "algorithm": "sha256" 112 | }, 113 | { 114 | "id": "github_release/github.com/rhysd/actionlint/v1.7.4/actionlint_1.7.4_linux_amd64.tar.gz", 115 | "checksum": "FC0A6886BBB9A23A39EEEC4B176193CADB54DDBE77CDBB19B637933919545395", 116 | "algorithm": "sha256" 117 | }, 118 | { 119 | "id": "github_release/github.com/rhysd/actionlint/v1.7.4/actionlint_1.7.4_linux_arm64.tar.gz", 120 | "checksum": "EDE03682DC955381D057DDE95BB85CE9CA418122209A8A313B617D4ADEC56416", 121 | "algorithm": "sha256" 122 | }, 123 | { 124 | "id": "github_release/github.com/rhysd/actionlint/v1.7.4/actionlint_1.7.4_windows_amd64.zip", 125 | "checksum": "CEF5EA561B9BE20CFF390301C4062C1D7B260AF2F9963C26B406E57AAF30E4D8", 126 | "algorithm": "sha256" 127 | }, 128 | { 129 | "id": "github_release/github.com/rhysd/actionlint/v1.7.4/actionlint_1.7.4_windows_arm64.zip", 130 | "checksum": "205A2F99BE1CAA70CF0558561FAE47F099B5EF85CA57B00ABCE18C840452EAF3", 131 | "algorithm": "sha256" 132 | }, 133 | { 134 | "id": "github_release/github.com/sigstore/cosign/v2.4.1/cosign-darwin-amd64", 135 | "checksum": "666032CA283DA92B6F7953965688FD51200FDC891A86C19E05C98B898EA0AF4E", 136 | "algorithm": "sha256" 137 | }, 138 | { 139 | "id": "github_release/github.com/sigstore/cosign/v2.4.1/cosign-darwin-arm64", 140 | "checksum": "13343856B69F70388C4FE0B986A31DDE5958E444B41BE22D785D3DC5E1A9CC62", 141 | "algorithm": "sha256" 142 | }, 143 | { 144 | "id": "github_release/github.com/sigstore/cosign/v2.4.1/cosign-linux-amd64", 145 | "checksum": "8B24B946DD5809C6BD93DE08033BCF6BC0ED7D336B7785787C080F574B89249B", 146 | "algorithm": "sha256" 147 | }, 148 | { 149 | "id": "github_release/github.com/sigstore/cosign/v2.4.1/cosign-linux-arm64", 150 | "checksum": "3B2E2E3854D0356C45FE6607047526CCD04742D20BD44AFB5BE91FA2A6E7CB4A", 151 | "algorithm": "sha256" 152 | }, 153 | { 154 | "id": "github_release/github.com/sigstore/cosign/v2.4.1/cosign-windows-amd64.exe", 155 | "checksum": "8D57F8A42A981D27290C4227271FA9F0F62CA6630EB4A21D316BD6B01405B87C", 156 | "algorithm": "sha256" 157 | }, 158 | { 159 | "id": "github_release/github.com/suzuki-shunsuke/ghalint/v1.0.0/ghalint_1.0.0_darwin_amd64.tar.gz", 160 | "checksum": "707BB2D6D4564A950F7AD3A5B3340B0B5BC666FE82B32BD51A5FE0FEF7268804", 161 | "algorithm": "sha256" 162 | }, 163 | { 164 | "id": "github_release/github.com/suzuki-shunsuke/ghalint/v1.0.0/ghalint_1.0.0_darwin_arm64.tar.gz", 165 | "checksum": "3E3FDA71FFAE83CF713295DF2BEF09FC268811DEAB11DEA58D8CAA287642C9DC", 166 | "algorithm": "sha256" 167 | }, 168 | { 169 | "id": "github_release/github.com/suzuki-shunsuke/ghalint/v1.0.0/ghalint_1.0.0_linux_amd64.tar.gz", 170 | "checksum": "E9006FF212A3B27A99AF43DB687DED78173BAA2F9816B2E2A9BED03A2ED2F954", 171 | "algorithm": "sha256" 172 | }, 173 | { 174 | "id": "github_release/github.com/suzuki-shunsuke/ghalint/v1.0.0/ghalint_1.0.0_linux_arm64.tar.gz", 175 | "checksum": "73D110480FB94DB4F5F46980659FCAFB8146ACC0B49D0D3AA6D79EE161C97917", 176 | "algorithm": "sha256" 177 | }, 178 | { 179 | "id": "github_release/github.com/suzuki-shunsuke/ghalint/v1.0.0/ghalint_1.0.0_windows_amd64.zip", 180 | "checksum": "F91596B58827BBBBAA6EFD8B5220D2C49547D60E30E7CF797E02A9107A39FF11", 181 | "algorithm": "sha256" 182 | }, 183 | { 184 | "id": "github_release/github.com/suzuki-shunsuke/ghalint/v1.0.0/ghalint_1.0.0_windows_arm64.zip", 185 | "checksum": "77FB1B80BFEFECB2C43098C9BD76BB335435A56E362961E3BD6ED5E18FA471E6", 186 | "algorithm": "sha256" 187 | }, 188 | { 189 | "id": "http/releases.hashicorp.com/terraform/1.9.8/terraform_1.9.8_darwin_amd64.zip", 190 | "checksum": "BE591E8C59C49D0CFBC7664D24910A4B43840B89D0A4BBCA662149BBF0397E91", 191 | "algorithm": "sha256" 192 | }, 193 | { 194 | "id": "http/releases.hashicorp.com/terraform/1.9.8/terraform_1.9.8_darwin_arm64.zip", 195 | "checksum": "873D7B925D08578FB6BB9C12C7CD92AE73E289E07C360F2FDD69F9036B7BAAAB", 196 | "algorithm": "sha256" 197 | }, 198 | { 199 | "id": "http/releases.hashicorp.com/terraform/1.9.8/terraform_1.9.8_linux_amd64.zip", 200 | "checksum": "186E0145F5E5F2EB97CBD785BC78F21BAE4EF15119349F6AD4FA535B83B10DF8", 201 | "algorithm": "sha256" 202 | }, 203 | { 204 | "id": "http/releases.hashicorp.com/terraform/1.9.8/terraform_1.9.8_linux_arm64.zip", 205 | "checksum": "F85868798834558239F6148834884008F2722548F84034C9B0F62934B2D73EBB", 206 | "algorithm": "sha256" 207 | }, 208 | { 209 | "id": "http/releases.hashicorp.com/terraform/1.9.8/terraform_1.9.8_windows_amd64.zip", 210 | "checksum": "2667DE56106BC6707968286357E29C20F8DBBB2F429EF57099B04994F82D9684", 211 | "algorithm": "sha256" 212 | }, 213 | { 214 | "id": "registries/github_content/github.com/aquaproj/aqua-registry/v4.258.0/registry.yaml", 215 | "checksum": "862CD9531DEB8B1A36E5737548F9CF2D4DA57BA08A0532BE038ADD0892F95C56", 216 | "algorithm": "sha256" 217 | } 218 | ] 219 | } 220 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 3 | cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 4 | cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= 5 | cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= 6 | cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= 7 | cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= 8 | cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= 9 | dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= 10 | dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= 11 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 12 | github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= 13 | github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= 14 | github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= 15 | github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= 16 | github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= 17 | github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= 18 | github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= 19 | github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= 20 | github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= 21 | github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs= 22 | github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0= 23 | github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= 24 | github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= 25 | github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= 26 | github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= 27 | github.com/ProtonMail/go-crypto v1.1.0-alpha.2 h1:bkyFVUP+ROOARdgCiJzNQo2V2kiB97LyUpzH9P6Hrlg= 28 | github.com/ProtonMail/go-crypto v1.1.0-alpha.2/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= 29 | github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8= 30 | github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= 31 | github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= 32 | github.com/andybalholm/crlf v0.0.0-20171020200849-670099aa064f/go.mod h1:k8feO4+kXDxro6ErPXBRTJ/ro2mf0SsFG8s7doP9kJE= 33 | github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= 34 | github.com/antonmedv/expr v1.8.9 h1:O9stiHmHHww9b4ozhPx7T6BK7fXfOCHJ8ybxf0833zw= 35 | github.com/antonmedv/expr v1.8.9/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= 36 | github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= 37 | github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk= 38 | github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw= 39 | github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= 40 | github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= 41 | github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= 42 | github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= 43 | github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= 44 | github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= 45 | github.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM= 46 | github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= 47 | github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= 48 | github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= 49 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 50 | github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= 51 | github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= 52 | github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= 53 | github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= 54 | github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= 55 | github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= 56 | github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= 57 | github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 58 | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 59 | github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= 60 | github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= 61 | github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 62 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 63 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 64 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 65 | github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= 66 | github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= 67 | github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= 68 | github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= 69 | github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= 70 | github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= 71 | github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= 72 | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 73 | github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= 74 | github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM= 75 | github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= 76 | github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= 77 | github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= 78 | github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= 79 | github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= 80 | github.com/go-git/go-billy/v5 v5.1.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= 81 | github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= 82 | github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= 83 | github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= 84 | github.com/go-git/go-git/v5 v5.3.0/go.mod h1:xdX4bWJ48aOrdhnl2XqHYstHbbp6+LFS4r4X+lNVprw= 85 | github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= 86 | github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= 87 | github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= 88 | github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= 89 | github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= 90 | github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= 91 | github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= 92 | github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= 93 | github.com/go-playground/validator/v10 v10.6.1 h1:W6TRDXt4WcWp4c4nf/G+6BkGdhiIo0k417gfr+V6u4I= 94 | github.com/go-playground/validator/v10 v10.6.1/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk= 95 | github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= 96 | github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= 97 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 98 | github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= 99 | github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 100 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 101 | github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 102 | github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= 103 | github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 104 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 105 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 106 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 107 | github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 108 | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 109 | github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 110 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 111 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 112 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 113 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 114 | github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= 115 | github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 116 | github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= 117 | github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 118 | github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 119 | github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 120 | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= 121 | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 122 | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= 123 | github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= 124 | github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 125 | github.com/hashicorp/go-checkpoint v0.5.0/go.mod h1:7nfLNL10NsxqO4iWuW6tWW0HjZuDrwkBuEQsVcpCOgg= 126 | github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= 127 | github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= 128 | github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= 129 | github.com/hashicorp/go-getter v1.5.3/go.mod h1:BrrV/1clo8cCYu6mxvboYg+KutTiFnXjMEgDD8+i7ZI= 130 | github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= 131 | github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= 132 | github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 133 | github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 134 | github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 135 | github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= 136 | github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 137 | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 138 | github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 139 | github.com/hashicorp/hc-install v0.6.4 h1:QLqlM56/+SIIGvGcfFiwMY3z5WGXT066suo/v9Km8e0= 140 | github.com/hashicorp/hc-install v0.6.4/go.mod h1:05LWLy8TD842OtgcfBbOT0WMoInBMUSHjmDx10zuBIA= 141 | github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= 142 | github.com/hashicorp/hcl/v2 v2.9.0/go.mod h1:FwWsfWEjyV/CMj8s/gqAuiviY72rJ1/oayI9WftqcKg= 143 | github.com/hashicorp/hcl/v2 v2.10.0 h1:1S1UnuhDGlv3gRFV4+0EdwB+znNP5HmcGbIqwnSCByg= 144 | github.com/hashicorp/hcl/v2 v2.10.0/go.mod h1:FwWsfWEjyV/CMj8s/gqAuiviY72rJ1/oayI9WftqcKg= 145 | github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= 146 | github.com/hashicorp/terraform-exec v0.13.3/go.mod h1:SSg6lbUsVB3DmFyCPjBPklqf6EYGX0TlQ6QTxOlikDU= 147 | github.com/hashicorp/terraform-exec v0.21.0 h1:uNkLAe95ey5Uux6KJdua6+cv8asgILFVWkd/RG0D2XQ= 148 | github.com/hashicorp/terraform-exec v0.21.0/go.mod h1:1PPeMYou+KDUSSeRE9szMZ/oHf4fYUmB923Wzbq1ICg= 149 | github.com/hashicorp/terraform-json v0.10.0/go.mod h1:3defM4kkMfttwiE7VakJDwCd4R+umhSQnvJwORXbprE= 150 | github.com/hashicorp/terraform-json v0.11.0/go.mod h1:pmbq9o4EuL43db5+0ogX10Yofv1nozM+wskr/bGFJpI= 151 | github.com/hashicorp/terraform-json v0.22.1 h1:xft84GZR0QzjPVWs4lRUwvTcPnegqlyS7orfb5Ltvec= 152 | github.com/hashicorp/terraform-json v0.22.1/go.mod h1:JbWSQCLFSXFFhg42T7l9iJwdGXBYV8fmmD6o/ML4p3A= 153 | github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= 154 | github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= 155 | github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= 156 | github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= 157 | github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= 158 | github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= 159 | github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= 160 | github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= 161 | github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= 162 | github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= 163 | github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= 164 | github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= 165 | github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= 166 | github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= 167 | github.com/klauspost/compress v1.11.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= 168 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 169 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 170 | github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 171 | github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= 172 | github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= 173 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 174 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 175 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= 176 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 177 | github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 h1:MtvEpTB6LX3vkb4ax0b5D2DHbNAUsen0Gx5wZoq3lV4= 178 | github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= 179 | github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= 180 | github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= 181 | github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= 182 | github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= 183 | github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= 184 | github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= 185 | github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 186 | github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 187 | github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= 188 | github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= 189 | github.com/minamijoyo/hcledit v0.2.0 h1:JnRurU4gIur0mtq7P0PfgM9xWX24jF0VMEBuTE30VlA= 190 | github.com/minamijoyo/hcledit v0.2.0/go.mod h1:n/Is2+1cM1/jfKAMxiRe99rdYxI6c0vDbYGcPZxNiZg= 191 | github.com/mitchellh/cli v1.1.2/go.mod h1:6iaV0fGdElS6dPBx0EApTxHrcWvmJphyh2n8YBLPPZ4= 192 | github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= 193 | github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= 194 | github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= 195 | github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 196 | github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 197 | github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= 198 | github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= 199 | github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= 200 | github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 201 | github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= 202 | github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= 203 | github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= 204 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= 205 | github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= 206 | github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= 207 | github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= 208 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 209 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 210 | github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 211 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 212 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 213 | github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= 214 | github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84= 215 | github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 216 | github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= 217 | github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= 218 | github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= 219 | github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= 220 | github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 221 | github.com/sanity-io/litter v1.2.0/go.mod h1:JF6pZUFgu2Q0sBZ+HSV35P8TVPI1TTzEwyu9FXAw2W4= 222 | github.com/sebdah/goldie v1.0.0/go.mod h1:jXP4hmWywNEwZzhMuv2ccnqTSFpuq8iyQhtQdkkZBH4= 223 | github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= 224 | github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= 225 | github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= 226 | github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= 227 | github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= 228 | github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= 229 | github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= 230 | github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= 231 | github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= 232 | github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= 233 | github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= 234 | github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= 235 | github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= 236 | github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= 237 | github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= 238 | github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= 239 | github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= 240 | github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= 241 | github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 242 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 243 | github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 244 | github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= 245 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 246 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 247 | github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 248 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 249 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 250 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 251 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= 252 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 253 | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= 254 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 255 | github.com/suzuki-shunsuke/expr-unmarshaler v0.1.0 h1:bkiHvk5DYJj1VUbyu+PDlltZaRBt6/W1D4nSshH2Zes= 256 | github.com/suzuki-shunsuke/expr-unmarshaler v0.1.0/go.mod h1:vDJiypvJ+cvFl99LJvE/lgOLtuj6/zDoAz5b/GBrbso= 257 | github.com/suzuki-shunsuke/go-template-unmarshaler v0.1.0 h1:KZDo2ehzMj3zYrTSd6tlguq2kYOE5A88+EIzbwXUV1Q= 258 | github.com/suzuki-shunsuke/go-template-unmarshaler v0.1.0/go.mod h1:6Qd4LMPwAXbtKvgEoAQ7ZmVVyKcFVBOKTbNVLNtAQzU= 259 | github.com/tfmigrator/tfmigrator v0.5.1 h1:O56GSzi5qwW8zVhiukjknlvNEdwYWhyC2mUjlYA62fk= 260 | github.com/tfmigrator/tfmigrator v0.5.1/go.mod h1:SGPdM2VQocwtN5QyyFiFSXPImgiW0dtI3oa4UnRRg8o= 261 | github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= 262 | github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= 263 | github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w= 264 | github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= 265 | github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= 266 | github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= 267 | github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= 268 | github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= 269 | github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= 270 | github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= 271 | github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= 272 | github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= 273 | github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= 274 | github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= 275 | github.com/zclconf/go-cty v1.2.1/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= 276 | github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= 277 | github.com/zclconf/go-cty v1.8.2/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= 278 | github.com/zclconf/go-cty v1.14.4 h1:uXXczd9QDGsgu0i/QFR/hzI5NYCHLf6NQw/atrbnhq8= 279 | github.com/zclconf/go-cty v1.14.4/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= 280 | github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= 281 | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= 282 | go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= 283 | golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 284 | golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 285 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 286 | golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 287 | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 288 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 289 | golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 290 | golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= 291 | golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= 292 | golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= 293 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 294 | golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= 295 | golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= 296 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 297 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 298 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 299 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 300 | golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 301 | golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= 302 | golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= 303 | golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= 304 | golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 305 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 306 | golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 307 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 308 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 309 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 310 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 311 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 312 | golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 313 | golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 314 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 315 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 316 | golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 317 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 318 | golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= 319 | golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= 320 | golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= 321 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 322 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 323 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 324 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 325 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 326 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 327 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 328 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 329 | golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= 330 | golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 331 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 332 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 333 | golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 334 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 335 | golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 336 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 337 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 338 | golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 339 | golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 340 | golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 341 | golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 342 | golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 343 | golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 344 | golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 345 | golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 346 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 347 | golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 348 | golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 349 | golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 350 | golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= 351 | golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 352 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 353 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 354 | golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 355 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 356 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 357 | golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 358 | golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= 359 | golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= 360 | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 361 | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 362 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 363 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 364 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 365 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 366 | golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 367 | golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 368 | golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 369 | golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 370 | golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 371 | golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 372 | golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 373 | golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= 374 | golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= 375 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 376 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 377 | google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= 378 | google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= 379 | google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 380 | google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 381 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 382 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 383 | google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 384 | google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= 385 | google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 386 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 387 | google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 388 | google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 389 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 390 | google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 391 | google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 392 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 393 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 394 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= 395 | google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 396 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 397 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 398 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 399 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 400 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= 401 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= 402 | gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= 403 | gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= 404 | gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= 405 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 406 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 407 | gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 408 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 409 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 410 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 411 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 412 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 413 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 414 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 415 | honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 416 | honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 417 | rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= 418 | --------------------------------------------------------------------------------