├── .dockerignore
├── .editorconfig
├── .github
├── CODEOWNERS
├── CODE_OF_CONDUCT.md
├── SECURITY.md
├── assets
│ └── logo.svg
├── dependabot.yml
└── workflows
│ ├── codeql.yml
│ ├── go.yml
│ └── release.yml
├── .gitignore
├── .gitpod.yml
├── .golangci.yml
├── .goreleaser.yml
├── .vscode
├── extensions.json
└── settings.json
├── Dockerfile
├── LICENSE
├── README.md
├── Taskfile.yaml
├── api
└── get-latest.go
├── cmd
├── factory
│ └── default.go
└── instal
│ ├── help-topic.go
│ ├── help.go
│ └── root.go
├── core
├── checker
│ └── checker.go
├── installer
│ └── installer.go
└── options
│ └── opts.go
├── go.mod
├── go.sum
├── internal
└── tui
│ └── tui.go
├── ios
├── color.go
├── console.go
├── console_windows.go
├── iostreams.go
├── tty_size.go
└── tty_size_windows.go
├── main.go
├── scripts
├── bfs.ps1
├── date.go
├── gh-instal
│ ├── gh-ins.js
│ ├── package.json
│ ├── templates
│ │ └── gh-instal
│ └── yarn.lock
├── install.ps1
├── install.sh
└── tag.sh
└── tools
├── errors.go
└── text.go
/.dockerignore:
--------------------------------------------------------------------------------
1 | # build dirs
2 | dist
3 |
4 | # instal files
5 | *.exe
6 | *.exe~
7 |
8 | # dependency directories
9 | vendor
10 | node_modules
11 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | ; http://editorconfig.org/
2 |
3 | root = true
4 |
5 | [*]
6 | end_of_line = lf
7 | insert_final_newline = true
8 | charset = utf-8
9 | trim_trailing_whitespace = true
10 |
11 | [*.go]
12 | indent_style = tab
13 | indent_size = 4
14 |
15 | [*.{json,md}]
16 | indent_style = space
17 | indent_size = 2
18 |
--------------------------------------------------------------------------------
/.github/CODEOWNERS:
--------------------------------------------------------------------------------
1 | * @abdfnx
--------------------------------------------------------------------------------
/.github/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | We as members, contributors, and leaders pledge to make participation in our
6 | community a harassment-free experience for everyone, regardless of age, body
7 | size, visible or invisible disability, ethnicity, sex characteristics, gender
8 | identity and expression, level of experience, education, socio-economic status,
9 | nationality, personal appearance, race, religion, or sexual identity
10 | and orientation.
11 |
12 | We pledge to act and interact in ways that contribute to an open, welcoming,
13 | diverse, inclusive, and healthy community.
14 |
15 | ## Our Standards
16 |
17 | Examples of behavior that contributes to a positive environment for our
18 | community include:
19 |
20 | * Demonstrating empathy and kindness toward other people
21 | * Being respectful of differing opinions, viewpoints, and experiences
22 | * Giving and gracefully accepting constructive feedback
23 | * Accepting responsibility and apologizing to those affected by our mistakes,
24 | and learning from the experience
25 | * Focusing on what is best not just for us as individuals, but for the
26 | overall community
27 |
28 | Examples of unacceptable behavior include:
29 |
30 | * The use of sexualized language or imagery, and sexual attention or
31 | advances of any kind
32 | * Trolling, insulting or derogatory comments, and personal or political attacks
33 | * Public or private harassment
34 | * Publishing others' private information, such as a physical or email
35 | address, without their explicit permission
36 | * Other conduct which could reasonably be considered inappropriate in a
37 | professional setting
38 |
39 | ## Enforcement Responsibilities
40 |
41 | Community leaders are responsible for clarifying and enforcing our standards of
42 | acceptable behavior and will take appropriate and fair corrective action in
43 | response to any behavior that they deem inappropriate, threatening, offensive,
44 | or harmful.
45 |
46 | Community leaders have the right and responsibility to remove, edit, or reject
47 | comments, commits, code, wiki edits, issues, and other contributions that are
48 | not aligned to this Code of Conduct, and will communicate reasons for moderation
49 | decisions when appropriate.
50 |
51 | ## Scope
52 |
53 | This Code of Conduct applies within all community spaces, and also applies when
54 | an individual is officially representing the community in public spaces.
55 | Examples of representing our community include using an official e-mail address,
56 | posting via an official social media account, or acting as an appointed
57 | representative at an online or offline event.
58 |
59 | ## Enforcement
60 |
61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
62 | reported to the community leaders responsible for enforcement at
63 | abdfn@secman.dev.
64 | All complaints will be reviewed and investigated promptly and fairly.
65 |
66 | All community leaders are obligated to respect the privacy and security of the
67 | reporter of any incident.
68 |
69 | ## Enforcement Guidelines
70 |
71 | Community leaders will follow these Community Impact Guidelines in determining
72 | the consequences for any action they deem in violation of this Code of Conduct:
73 |
74 | ### 1. Correction
75 |
76 | **Community Impact**: Use of inappropriate language or other behavior deemed
77 | unprofessional or unwelcome in the community.
78 |
79 | **Consequence**: A private, written warning from community leaders, providing
80 | clarity around the nature of the violation and an explanation of why the
81 | behavior was inappropriate. A public apology may be requested.
82 |
83 | ### 2. Warning
84 |
85 | **Community Impact**: A violation through a single incident or series
86 | of actions.
87 |
88 | **Consequence**: A warning with consequences for continued behavior. No
89 | interaction with the people involved, including unsolicited interaction with
90 | those enforcing the Code of Conduct, for a specified period of time. This
91 | includes avoiding interactions in community spaces as well as external channels
92 | like social media. Violating these terms may lead to a temporary or
93 | permanent ban.
94 |
95 | ### 3. Temporary Ban
96 |
97 | **Community Impact**: A serious violation of community standards, including
98 | sustained inappropriate behavior.
99 |
100 | **Consequence**: A temporary ban from any sort of interaction or public
101 | communication with the community for a specified period of time. No public or
102 | private interaction with the people involved, including unsolicited interaction
103 | with those enforcing the Code of Conduct, is allowed during this period.
104 | Violating these terms may lead to a permanent ban.
105 |
106 | ### 4. Permanent Ban
107 |
108 | **Community Impact**: Demonstrating a pattern of violation of community
109 | standards, including sustained inappropriate behavior, harassment of an
110 | individual, or aggression toward or disparagement of classes of individuals.
111 |
112 | **Consequence**: A permanent ban from any sort of public interaction within
113 | the community.
114 |
115 | ## Attribution
116 |
117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118 | version 2.0, available at
119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
120 |
121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct
122 | enforcement ladder](https://github.com/mozilla/diversity).
123 |
124 | [homepage]: https://www.contributor-covenant.org
125 |
126 | For answers to common questions about this code of conduct, see the FAQ at
127 | https://www.contributor-covenant.org/faq. Translations are available at
128 | https://www.contributor-covenant.org/translations.
129 |
--------------------------------------------------------------------------------
/.github/SECURITY.md:
--------------------------------------------------------------------------------
1 | # Security Policy
2 |
3 | ## Supported Versions
4 |
5 | Use this section to tell people about which versions of your project are
6 | currently being supported with security updates.
7 |
8 | | Version | Supported |
9 | | ------- | ------------------ |
10 | | 0.1.x | :white_check_mark: |
11 | | < 0.1 | :x: |
12 |
13 | ## Reporting a Vulnerability
14 |
15 | Use this section to tell people how to report a vulnerability.
16 |
17 | Tell them where to go, how often they can expect to get an update on a
18 | reported vulnerability, what to expect if the vulnerability is accepted or
19 | declined, etc.
20 |
--------------------------------------------------------------------------------
/.github/assets/logo.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | ---
2 | version: 2
3 | updates:
4 | - package-ecosystem: "gomod"
5 | directory: "/"
6 | schedule:
7 | interval: "daily"
8 | reviewers:
9 | - abdfnx
10 | - package-ecosystem: npm
11 | directory: "/scripts/gh-instal"
12 | schedule:
13 | interval: "daily"
14 |
--------------------------------------------------------------------------------
/.github/workflows/codeql.yml:
--------------------------------------------------------------------------------
1 | name: "CodeQL"
2 |
3 | on:
4 | push:
5 | branches: [ main ]
6 | pull_request:
7 | branches: [ main ]
8 | schedule:
9 | - cron: "40 8 * * 0"
10 |
11 | jobs:
12 | analyze:
13 | name: Analyze
14 | runs-on: ubuntu-latest
15 | permissions:
16 | actions: read
17 | contents: read
18 | security-events: write
19 |
20 | strategy:
21 | fail-fast: false
22 | matrix:
23 | language: [ "go", "javascript" ]
24 |
25 | steps:
26 | - name: Checkout repository
27 | uses: actions/checkout@v2
28 |
29 | - name: Initialize CodeQL
30 | uses: github/codeql-action/init@v1
31 | with:
32 | languages: ${{ matrix.language }}
33 |
34 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
35 | # If this step fails, then you should remove it and run the build manually (see below)
36 | - name: Autobuild
37 | uses: github/codeql-action/autobuild@v1
38 |
39 | # ℹ️ Command-line programs to run using the OS shell.
40 | # 📚 https://git.io/JvXDl
41 |
42 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
43 | # and modify them (or add more) to build your code if your project
44 | # uses a compiled language
45 |
46 | - name: Perform CodeQL Analysis
47 | uses: github/codeql-action/analyze@v1
48 |
--------------------------------------------------------------------------------
/.github/workflows/go.yml:
--------------------------------------------------------------------------------
1 | name: Go
2 |
3 | on:
4 | push:
5 | branches: [ main ]
6 | pull_request:
7 | branches: [ main ]
8 |
9 | jobs:
10 | build:
11 | runs-on: ubuntu-latest
12 | steps:
13 | - uses: actions/checkout@v2
14 |
15 | - name: Set up Go
16 | uses: actions/setup-go@v2
17 | with:
18 | go-version: 1.17
19 |
20 | - name: Build
21 | run: |
22 | go run ./scripts/date.go >> date.txt
23 | go build -ldflags "-X main.version=$(git describe --abbrev=0 --tags) -X main.buildDate=$(cat date.txt)" -o tran
24 |
25 | - name: Test
26 | run: go test -v ./...
27 |
--------------------------------------------------------------------------------
/.github/workflows/release.yml:
--------------------------------------------------------------------------------
1 | name: Release
2 |
3 | on:
4 | push:
5 | tags:
6 | - '*'
7 |
8 | env:
9 | GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
10 | GITHUB_ACTIONS_NAME: "github-actions[bot]"
11 | GITHUB_ACTIONS_EMAIL: "41898282+github-actions[bot]@users.noreply.github.com"
12 |
13 | permissions: write-all
14 |
15 | jobs:
16 | build_instal:
17 | runs-on: ubuntu-latest
18 |
19 | steps:
20 | - uses: actions/checkout@v2
21 | with:
22 | persist-credentials: false
23 | fetch-depth: 0
24 |
25 | - name: Set up `Go`
26 | uses: actions/setup-go@v2
27 | with:
28 | go-version: 1.17
29 |
30 | - name: Setup `Node.js`
31 | uses: actions/setup-node@v2.5.0
32 | with:
33 | node-version: 16
34 |
35 | - name: Set up `GoReleaser`
36 | uses: goreleaser/goreleaser-action@v2
37 | with:
38 | install-only: true
39 |
40 | - name: Set up `Task`
41 | uses: arduino/setup-task@v1
42 |
43 | - name: Set up `Tag`
44 | id: ghtag
45 | run: echo ::set-output name=tag::${GITHUB_REF#refs/*/}
46 |
47 | - name: Set up `Date`
48 | run: go run ./scripts/date.go >> date.txt
49 |
50 | - name: Build
51 | run: BuildDate="$(cat date.txt)" goreleaser release --rm-dist --timeout 100m
52 |
53 | - name: Build `gh-instal`
54 | env:
55 | TAG: ${{ steps.ghtag.outputs.tag }}
56 | run: |
57 | DATE="$(cat date.txt)"
58 | gh repo clone abdfnx/gh-instal
59 | cd gh-instal
60 | ./release.sh $TAG $DATE
61 | cd ../scripts/gh-instal
62 | yarn
63 | cd ../..
64 | task ght
65 |
66 | - name: Commit files
67 | env:
68 | TAG: ${{ steps.ghtag.outputs.tag }}
69 | run: |
70 | cd ./scripts/gh-instal/tmp/gh-instal
71 | git config --local user.email "${{ env.GITHUB_ACTIONS_EMAIL }}"
72 | git config --local user.name "${{ env.GITHUB_ACTIONS_NAME }}"
73 | git diff --cached
74 | git add .
75 | git commit -m "instal ${TAG}"
76 |
77 | - name: Push changes
78 | uses: ad-m/github-push-action@master
79 | with:
80 | repository: "abdfnx/gh-instal"
81 | github_token: ${{ secrets.ACCESS_TOKEN }}
82 | directory: ./scripts/gh-instal/tmp/gh-instal
83 |
84 | - name: Login to Docker Hub
85 | uses: docker/login-action@v1
86 | with:
87 | username: ${{ secrets.DOCKER_ID }}
88 | password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
89 |
90 | - name: Build Tran Containers
91 | run: |
92 | task build
93 | task build-instal-container
94 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Binaries for programs and plugins
2 | *.exe
3 | *.exe~
4 | *.dll
5 | *.so
6 | *.dylib
7 | /instal
8 |
9 | # Test binary, built with `go test -c`
10 | *.test
11 |
12 | # Output of the go coverage tool, specifically when used with LiteIDE
13 | *.out
14 |
15 | # Dependency directories (remove the comment below to include it)
16 | vendor
17 | node_modules
18 |
19 | # Build Files
20 | date.txt
21 | tag.txt
22 |
--------------------------------------------------------------------------------
/.gitpod.yml:
--------------------------------------------------------------------------------
1 | tasks:
2 | - init: go get -d ./...
3 | command: |
4 | brew install go-task/tap/go-task
5 | curl -fsSL https://bit.ly/instal-cli | bash
6 |
--------------------------------------------------------------------------------
/.golangci.yml:
--------------------------------------------------------------------------------
1 | linters:
2 | enable:
3 | [ gofmt ]
4 |
5 | issues:
6 | max-issues-per-linter: 0
7 | max-same-issues: 0
8 |
--------------------------------------------------------------------------------
/.goreleaser.yml:
--------------------------------------------------------------------------------
1 | project_name: instal
2 |
3 | env:
4 | - CGO_ENABLED=0
5 |
6 | release:
7 | prerelease: auto
8 | draft: true
9 | name_template: "Instal 🛰️ v{{ .Version }}"
10 |
11 | before:
12 | hooks:
13 | - go mod tidy
14 |
15 | builds:
16 | - <<: &build_defaults
17 | binary: bin/instal
18 | main: ./
19 | ldflags:
20 | - -X main.version=v{{ .Version }}
21 | - -X main.buildDate={{ .Env.BuildDate }}
22 |
23 | id: macos
24 | goos: [ darwin ]
25 | goarch: [ amd64, arm64, arm ]
26 |
27 | - <<: *build_defaults
28 | id: linux
29 | goos: [ linux ]
30 | goarch: [ amd64, arm64, arm, 386 ]
31 |
32 | - <<: *build_defaults
33 | id: windows
34 | goos: [ windows ]
35 | goarch: [ amd64, arm64, arm, 386 ]
36 |
37 | - <<: *build_defaults
38 | id: freebsd
39 | goos: [ freebsd ]
40 | goarch: [ amd64, arm64, arm, 386 ]
41 |
42 | archives:
43 | - id: nix
44 | builds: [ macos, linux, freebsd ]
45 | <<: &archive_defaults
46 | name_template: "{{ .ProjectName }}_{{ .Os }}_v{{ .Version }}_{{ .Arch }}"
47 |
48 | wrap_in_directory: "true"
49 | replacements:
50 | darwin: macos
51 | format: zip
52 | files:
53 | - LICENSE
54 |
55 | - id: windows
56 | builds: [ windows ]
57 | <<: *archive_defaults
58 | wrap_in_directory: "false"
59 | format: zip
60 | files:
61 | - LICENSE
62 |
63 | nfpms:
64 | - license: MIT
65 | maintainer: abdfnx
66 | homepage: https://github.com/abdfnx/instal
67 | bindir: /usr
68 | file_name_template: "{{ .ProjectName }}_v{{ .Version }}_{{ .Arch }}"
69 | description: "🛰️ Install any binary app from a script URL."
70 | formats:
71 | - apk
72 | - deb
73 | - rpm
74 |
75 | brews:
76 | - goarm: 6
77 | tap:
78 | owner: abdfnx
79 | name: homebrew-tap
80 | homepage: "https://github.com/abdfnx/instal"
81 | description: "🛰️ Install any binary app from a script URL."
82 |
83 | checksum:
84 | name_template: "checksums.txt"
85 |
86 | snapshot:
87 | name_template: "{{ .Tag }}-next"
88 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": [
3 | "golang.go",
4 | "ms-azuretools.vscode-docker",
5 | "esbenp.prettier-vscode",
6 | "PKief.material-icon-theme",
7 | "aaron-bond.better-comments"
8 | ]
9 | }
10 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "search.exclude": {
3 | "vendor/**": true
4 | },
5 | "editor.formatOnSave": true,
6 | "editor.fontLigatures": true,
7 | "git.autofetch": true,
8 | "git.confirmSync": false,
9 | "editor.defaultFormatter": "esbenp.prettier-vscode",
10 | "[go]": {
11 | "editor.formatOnSave": true
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM alpine:latest
2 |
3 | RUN apk update && apk upgrade && apk add --no-cache ca-certificates
4 |
5 | COPY instal /usr/bin/instal
6 |
7 | ENTRYPOINT ["/usr/bin/instal"]
8 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Abdfn
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 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | > 🛰️ Install any binary app from a script URL.
10 |
11 | this cli app is an alternative to the **curl**, **wget** and **fetch** in unix, and **iwr** in windows.
12 |
13 | ## Installation
14 |
15 | ### Using script
16 |
17 | * Shell
18 |
19 | ```
20 | curl -fsSL https://bit.ly/instal-cli | bash
21 | ```
22 |
23 | * PowerShell
24 |
25 | ```
26 | iwr -useb https://bit.ly/instal-win | iex
27 | ```
28 |
29 | **then restart your powershell**
30 |
31 | ### Homebrew
32 |
33 | ```bash
34 | brew install abdfnx/tap/instal
35 | ```
36 |
37 | ### GitHub CLI
38 |
39 | ```bash
40 | gh extension install abdfnx/gh-instal
41 | ```
42 |
43 | ### Via Docker
44 |
45 | ```bash
46 | docker run -it instalcli/instal
47 | ```
48 |
49 | ## Usage
50 |
51 | * Open Instal UI
52 |
53 | ```bash
54 | instal
55 | ```
56 |
57 | * Install binary app from script URL and run it
58 |
59 | ```
60 | instal
61 | ```
62 |
63 | ## Flags
64 |
65 | ```
66 | --help Help for instal
67 | -H, --hidden hide the output
68 | -s, --shell string shell to use (Default: bash | powershell)
69 | ```
70 |
71 | ## Examples
72 |
73 | ```bash
74 | instal https://get.docker.com
75 |
76 | instal https://https://getmic.ro --shell sh
77 | ```
78 |
79 | ### License
80 |
81 | instal is licensed under the terms of [MIT](https://github.com/abdfnx/instal/blob/main/LICENSE) license.
82 |
--------------------------------------------------------------------------------
/Taskfile.yaml:
--------------------------------------------------------------------------------
1 | # https://taskfile.dev
2 |
3 | version: "3"
4 |
5 | vars:
6 | INSTAL_CONTAINER: instalcli/instal
7 |
8 | tasks:
9 | default:
10 | deps: [ build, ght ]
11 |
12 | set-tag-and-date:
13 | cmds:
14 | - if [ -f "date.txt" ]; then rm date.txt; fi
15 | - if [ -f "tag.txt" ]; then rm tag.txt; fi
16 | - go run ./scripts/date.go >> date.txt
17 | - git describe --abbrev=0 --tags >> tag.txt
18 |
19 | build:
20 | cmds:
21 | - task: set-tag-and-date
22 | - go mod tidy
23 | - go build -ldflags "-X main.version=$(cat tag.txt) -X main.buildDate=$(cat date.txt)" -o instal
24 |
25 | install:
26 | deps: [ build ]
27 | cmds:
28 | - sudo mv instal /usr/local/bin
29 |
30 | remove:
31 | cmds:
32 | - sudo rm -rf /usr/local/bin/instal
33 |
34 | instal-container:
35 | deps: [ just-build-instal-container, build-instal-container, build-instal-container-with-cache ]
36 |
37 | just-build-instal-container:
38 | cmds:
39 | - docker build -t "{{ .INSTAL_CONTAINER }}" .
40 |
41 | build-instal-container:
42 | deps: [ just-build-instal-container ]
43 | cmds:
44 | - docker push "{{ .INSTAL_CONTAINER }}"
45 |
46 | build-instal-container-with-cache:
47 | cmds:
48 | - docker pull "{{ .INSTAL_CONTAINER }}":latest
49 | - docker build -t "{{ .INSTAL_CONTAINER }}" --cache-from "{{ .INSTAL_CONTAINER }}":latest .
50 | - docker push "{{ .INSTAL_CONTAINER }}"
51 |
52 | check_node_moduels:
53 | dir: ./scripts/gh-instal
54 | cmds:
55 | - if ! [ -d "node_modules" ]; then yarn; fi
56 |
57 | ght:
58 | deps: [ build ]
59 | cmds:
60 | - task: check_node_moduels
61 | - node ./scripts/gh-instal/gh-ins.js
62 |
--------------------------------------------------------------------------------
/api/get-latest.go:
--------------------------------------------------------------------------------
1 | package api
2 |
3 | import (
4 | "fmt"
5 | "time"
6 | "net/http"
7 | "io/ioutil"
8 |
9 | "github.com/tidwall/gjson"
10 | "github.com/briandowns/spinner"
11 | httpClient "github.com/abdfnx/resto/client"
12 | )
13 |
14 | func GetLatest() string {
15 | url := "https://api.github.com/repos/abdfnx/instal/releases/latest"
16 |
17 | req, err := http.NewRequest("GET", url, nil)
18 |
19 | if err != nil {
20 | fmt.Errorf("Error creating request: %s", err.Error())
21 | }
22 |
23 | s := spinner.New(spinner.CharSets[11], 100*time.Millisecond)
24 | s.Suffix = " 🔍 Checking for updates..."
25 | s.Start()
26 |
27 | client := httpClient.HttpClient()
28 | res, err := client.Do(req)
29 |
30 | if err != nil {
31 | fmt.Printf("Error sending request: %s", err.Error())
32 | }
33 |
34 | defer res.Body.Close()
35 |
36 | b, err := ioutil.ReadAll(res.Body)
37 |
38 | if err != nil {
39 | fmt.Printf("Error reading response: %s", err.Error())
40 | }
41 |
42 | body := string(b)
43 |
44 | tag_name := gjson.Get(body, "tag_name")
45 |
46 | latestVersion := tag_name.String()
47 |
48 | s.Stop()
49 |
50 | return latestVersion
51 | }
52 |
--------------------------------------------------------------------------------
/cmd/factory/default.go:
--------------------------------------------------------------------------------
1 | package factory
2 |
3 | import (
4 | "github.com/abdfnx/instal/ios"
5 | )
6 |
7 | type Factory struct {
8 | IOStreams *ios.IOStreams
9 | }
10 |
11 | func New() *Factory {
12 | f := &Factory{}
13 |
14 | f.IOStreams = ioStreams(f)
15 |
16 | return f
17 | }
18 |
19 | func ioStreams(f *Factory) *ios.IOStreams {
20 | io := ios.System()
21 |
22 | return io
23 | }
24 |
--------------------------------------------------------------------------------
/cmd/instal/help-topic.go:
--------------------------------------------------------------------------------
1 | package instal
2 |
3 | import (
4 | "github.com/spf13/cobra"
5 | )
6 |
7 | var HelpTopics = map[string]map[string]string{}
8 |
9 | func NewHelpTopic(topic string) *cobra.Command {
10 | cmd := &cobra.Command{
11 | Use: topic,
12 | Short: HelpTopics[topic]["short"],
13 | Long: HelpTopics[topic]["long"],
14 | Hidden: true,
15 | Annotations: map[string]string{
16 | "markdown:generate": "true",
17 | "markdown:basename": "instal_help_" + topic,
18 | },
19 | }
20 |
21 | cmd.SetHelpFunc(helpTopicHelpFunc)
22 | cmd.SetUsageFunc(helpTopicUsageFunc)
23 |
24 | return cmd
25 | }
26 |
27 | func helpTopicHelpFunc(command *cobra.Command, args []string) {
28 | command.Print(command.Long)
29 | }
30 |
31 | func helpTopicUsageFunc(command *cobra.Command) error {
32 | command.Printf("Usage: instal help %s", command.Use)
33 | return nil
34 | }
35 |
--------------------------------------------------------------------------------
/cmd/instal/help.go:
--------------------------------------------------------------------------------
1 | package instal
2 |
3 | import (
4 | "fmt"
5 | "bytes"
6 | "strings"
7 |
8 | "github.com/spf13/cobra"
9 | "github.com/spf13/pflag"
10 | "github.com/abdfnx/instal/ios"
11 | "github.com/abdfnx/instal/tools"
12 | )
13 |
14 | func rootUsageFunc(command *cobra.Command) error {
15 | command.Printf("Usage: %s", command.UseLine())
16 |
17 | subcommands := command.Commands()
18 |
19 | if len(subcommands) > 0 {
20 | command.Print("\n\nCommands:\n")
21 | for _, c := range subcommands {
22 | if c.Hidden {
23 | continue
24 | }
25 |
26 | command.Printf(" %s\n", c.Name())
27 | }
28 |
29 | return nil
30 | }
31 |
32 | flagUsages := command.LocalFlags().FlagUsages()
33 |
34 | if flagUsages != "" {
35 | command.Println("\n\nFlags:")
36 | command.Print(tools.Indent(dedent(flagUsages), " "))
37 | }
38 |
39 | return nil
40 | }
41 |
42 | func rootFlagErrorFunc(cmd *cobra.Command, err error) error {
43 | if err == pflag.ErrHelp {
44 | return err
45 | }
46 |
47 | return &tools.FlagError{Err: err}
48 | }
49 |
50 | var hasFailed bool
51 |
52 | func HasFailed() bool {
53 | return hasFailed
54 | }
55 |
56 | func nestedSuggestFunc(command *cobra.Command, arg string) {
57 | command.Printf("unknown command %q for %q\n", arg, command.CommandPath())
58 |
59 | var candidates []string
60 | if arg == "help" {
61 | candidates = []string{"--help"}
62 | } else {
63 | if command.SuggestionsMinimumDistance <= 0 {
64 | command.SuggestionsMinimumDistance = 2
65 | }
66 |
67 | candidates = command.SuggestionsFor(arg)
68 | }
69 |
70 | if len(candidates) > 0 {
71 | command.Print("\nDid you mean this?\n")
72 |
73 | for _, c := range candidates {
74 | command.Printf("\t%s\n", c)
75 | }
76 | }
77 |
78 | command.Print("\n")
79 | _ = rootUsageFunc(command)
80 | }
81 |
82 | func isRootCmd(command *cobra.Command) bool {
83 | return command != nil && !command.HasParent()
84 | }
85 |
86 | func rootHelpFunc(cs *ios.ColorScheme, command *cobra.Command, args []string) {
87 | if isRootCmd(command.Parent()) && len(args) >= 2 && args[1] != "--help" && args[1] != "-h" {
88 | nestedSuggestFunc(command, args[1])
89 | hasFailed = true
90 | return
91 | }
92 |
93 | commands := []string{}
94 |
95 | for _, c := range command.Commands() {
96 | if c.Short == "" {
97 | continue
98 | }
99 | if c.Hidden {
100 | continue
101 | }
102 |
103 | s := rpad(c.Name()+":", c.NamePadding()) + c.Short
104 |
105 | commands = append(commands, s)
106 | }
107 |
108 | if len(commands) == 0 {
109 | commands = []string{}
110 | }
111 |
112 | type helpEntry struct {
113 | Title string
114 | Body string
115 | }
116 |
117 | helpEntries := []helpEntry{}
118 |
119 | if command.Long != "" {
120 | helpEntries = append(helpEntries, helpEntry{"", command.Long})
121 | } else if command.Short != "" {
122 | helpEntries = append(helpEntries, helpEntry{"", command.Short})
123 | }
124 |
125 | helpEntries = append(helpEntries, helpEntry{"USAGE", command.UseLine()})
126 |
127 | if len(commands) > 0 {
128 | helpEntries = append(helpEntries, helpEntry{"COMMANDS", strings.Join(commands, "\n")})
129 | }
130 |
131 | flagUsages := command.LocalFlags().FlagUsages()
132 |
133 | if flagUsages != "" {
134 | helpEntries = append(helpEntries, helpEntry{"FLAGS", dedent(flagUsages)})
135 | }
136 |
137 | if _, ok := command.Annotations["help:arguments"]; ok {
138 | helpEntries = append(helpEntries, helpEntry{"ARGUMENTS", command.Annotations["help:arguments"]})
139 | }
140 |
141 | if command.Example != "" {
142 | helpEntries = append(helpEntries, helpEntry{"EXAMPLES", command.Example})
143 | }
144 |
145 | helpEntries = append(helpEntries, helpEntry{"LEARN MORE", `
146 | Use 'instal --help' for more information about a command.`})
147 | if _, ok := command.Annotations["help:tellus"]; ok {
148 | helpEntries = append(helpEntries, helpEntry{"TELL US", command.Annotations["help:tellus"]})
149 | }
150 |
151 | out := command.OutOrStdout()
152 | for _, e := range helpEntries {
153 | if e.Title != "" {
154 | fmt.Fprintln(out, cs.Bold(e.Title))
155 | fmt.Fprintln(out, tools.Indent(strings.Trim(e.Body, "\r\n"), " "))
156 | } else {
157 | fmt.Fprintln(out, e.Body)
158 | }
159 |
160 | fmt.Fprintln(out)
161 | }
162 | }
163 |
164 | func rpad(s string, padding int) string {
165 | template := fmt.Sprintf("%%-%ds ", padding)
166 | return fmt.Sprintf(template, s)
167 | }
168 |
169 | func dedent(s string) string {
170 | lines := strings.Split(s, "\n")
171 | minIndent := -1
172 |
173 | for _, l := range lines {
174 | if len(l) == 0 {
175 | continue
176 | }
177 |
178 | indent := len(l) - len(strings.TrimLeft(l, " "))
179 |
180 | if minIndent == -1 || indent < minIndent {
181 | minIndent = indent
182 | }
183 | }
184 |
185 | if minIndent <= 0 {
186 | return s
187 | }
188 |
189 | var buf bytes.Buffer
190 |
191 | for _, l := range lines {
192 | fmt.Fprintln(&buf, strings.TrimPrefix(l, strings.Repeat(" ", minIndent)))
193 | }
194 |
195 | return strings.TrimSuffix(buf.String(), "\n")
196 | }
197 |
--------------------------------------------------------------------------------
/cmd/instal/root.go:
--------------------------------------------------------------------------------
1 | package instal
2 |
3 | import (
4 | "fmt"
5 | "runtime"
6 |
7 | "github.com/spf13/cobra"
8 | "github.com/MakeNowJust/heredoc"
9 | "github.com/abdfnx/instal/cmd/factory"
10 | "github.com/abdfnx/instal/core/options"
11 | "github.com/abdfnx/instal/internal/tui"
12 | "github.com/abdfnx/instal/core/installer"
13 | )
14 |
15 | // Execute start the CLI
16 | func Execute(f *factory.Factory, version string, buildDate string) *cobra.Command {
17 | const desc = `🛰️ Install any binary app from a script URL.`
18 |
19 | opts := options.InstalOptions{
20 | Shell: "",
21 | IsHidden: false,
22 | URL: "",
23 | }
24 |
25 | // Root command
26 | var rootCmd = &cobra.Command{
27 | Use: "instal [flags]",
28 | Short: desc,
29 | Long: desc,
30 | // instal args: if there is no args, it will execute tui
31 | Args: cobra.ArbitraryArgs,
32 | SilenceErrors: true,
33 | Example: heredoc.Doc(`
34 | # Open Resto UI
35 | instal
36 |
37 | # Install binary app from script URL and run it.
38 | instal
39 | `),
40 | Annotations: map[string]string{
41 | "help:tellus": heredoc.Doc(`
42 | Open an issue at https://github.com/abdfnx/instal/issues
43 | `),
44 | },
45 | RunE: func(cmd *cobra.Command, args []string) error {
46 | if len(args) > 0 {
47 | opts.URL = args[0]
48 | return installer.RunInstal(&opts, true, "", "", "")
49 | } else {
50 | tui.Instal()
51 | }
52 |
53 | return nil
54 | },
55 | }
56 |
57 | versionCmd := &cobra.Command{
58 | Use: "version",
59 | Aliases: []string{"ver"},
60 | Short: "Print the version of your instal binary.",
61 | Run: func(cmd *cobra.Command, args []string) {
62 | fmt.Println("instal version " + version + " " + buildDate)
63 | },
64 | }
65 |
66 | rootCmd.SetOut(f.IOStreams.Out)
67 | rootCmd.SetErr(f.IOStreams.ErrOut)
68 |
69 | cs := f.IOStreams.ColorScheme()
70 |
71 | helpHelper := func(command *cobra.Command, args []string) {
72 | rootHelpFunc(cs, command, args)
73 | }
74 |
75 | rootCmd.PersistentFlags().Bool("help", false, "Help for instal")
76 | rootCmd.SetHelpFunc(helpHelper)
77 | rootCmd.SetUsageFunc(rootUsageFunc)
78 | rootCmd.SetFlagErrorFunc(rootFlagErrorFunc)
79 |
80 | p := "bash"
81 |
82 | if runtime.GOOS == "windows" {
83 | p = "powershell"
84 | }
85 |
86 | rootCmd.Flags().StringVarP(&opts.Shell, "shell", "s", "", "shell to use (Default: " + p + ")")
87 | rootCmd.Flags().BoolVarP(&opts.IsHidden, "hidden", "H", false, "hide the output")
88 |
89 | rootCmd.AddCommand(versionCmd)
90 |
91 | return rootCmd
92 | }
93 |
--------------------------------------------------------------------------------
/core/checker/checker.go:
--------------------------------------------------------------------------------
1 | package checker
2 |
3 | import (
4 | "fmt"
5 | "strings"
6 |
7 | "github.com/mgutz/ansi"
8 | "github.com/abdfnx/looker"
9 | "github.com/abdfnx/instal/api"
10 | "github.com/abdfnx/instal/cmd/factory"
11 | )
12 |
13 | func Check(buildVersion string) {
14 | cmdFactory := factory.New()
15 | stderr := cmdFactory.IOStreams.ErrOut
16 |
17 | latestVersion := api.GetLatest()
18 | isFromHomebrewTap := isUnderHomebrew()
19 | isFromUsrBinDir := isUnderUsr()
20 | isFromGHCLI := isUnderGHCLI()
21 | isFromAppData := isUnderAppData()
22 |
23 | var command = func() string {
24 | if isFromHomebrewTap {
25 | return "brew upgrade instal"
26 | } else if isFromUsrBinDir || isFromAppData {
27 | return "instal https://bit.ly/instal-cli"
28 | } else if isFromGHCLI {
29 | return "gh extention upgrade instal"
30 | }
31 |
32 | return ""
33 | }
34 |
35 | if buildVersion != latestVersion {
36 | fmt.Fprintf(stderr, "%s %s → %s\n",
37 | ansi.Color("There's a new version of ", "yellow") + ansi.Color("instal", "cyan") + ansi.Color(" is avalaible:", "yellow"),
38 | ansi.Color(buildVersion, "cyan"),
39 | ansi.Color(latestVersion, "cyan"))
40 |
41 | if command() != "" {
42 | fmt.Fprintf(stderr, ansi.Color("To upgrade, run: %s\n", "yellow"), ansi.Color(command(), "black:white"))
43 | }
44 | }
45 | }
46 |
47 | var instalExe, _ = looker.LookPath("instal")
48 |
49 | func isUnderHomebrew() bool {
50 | return strings.Contains(instalExe, "brew")
51 | }
52 |
53 | func isUnderUsr() bool {
54 | return strings.Contains(instalExe, "usr")
55 | }
56 |
57 | func isUnderAppData() bool {
58 | return strings.Contains(instalExe, "AppData")
59 | }
60 |
61 | func isUnderGHCLI() bool {
62 | return strings.Contains(instalExe, "gh")
63 | }
64 |
--------------------------------------------------------------------------------
/core/installer/installer.go:
--------------------------------------------------------------------------------
1 | package installer
2 |
3 | import (
4 | "fmt"
5 | "time"
6 | "runtime"
7 | "net/http"
8 | "io/ioutil"
9 |
10 | "github.com/abdfnx/gosh"
11 | "github.com/briandowns/spinner"
12 | "github.com/charmbracelet/lipgloss"
13 | "github.com/abdfnx/instal/core/options"
14 | )
15 |
16 | func RunInstal(opts *options.InstalOptions, isCLI bool, url, shell, isHidden string) error {
17 | s := spinner.New(spinner.CharSets[11], 100*time.Millisecond)
18 | s.Suffix = " 🔗 Installing..."
19 | s.Start()
20 |
21 | term := ""
22 |
23 | if runtime.GOOS == "windows" {
24 | term = "powershell.exe"
25 | } else {
26 | term = "bash"
27 | }
28 |
29 | if isCLI {
30 | if opts.Shell == "" {
31 | opts.Shell = term
32 | }
33 | } else {
34 | opts.Shell = shell
35 | opts.URL = url
36 |
37 | if isHidden == "true" || isHidden == "y" || isHidden == "yes" {
38 | opts.IsHidden = true
39 | } else {
40 | opts.IsHidden = false
41 | }
42 | }
43 |
44 | res, err := http.Get(opts.URL)
45 |
46 | if err != nil {
47 | return err
48 | }
49 |
50 | defer res.Body.Close()
51 |
52 | body, berr := ioutil.ReadAll(res.Body)
53 |
54 | if berr != nil {
55 | return berr
56 | }
57 |
58 | err, out, errout := gosh.Exec(opts.Shell, string(body))
59 |
60 | if err != nil {
61 | if !isCLI {
62 | fmt.Println(lipgloss.NewStyle().Padding(0, 2).SetString(err.Error()).String())
63 | fmt.Println(lipgloss.NewStyle().Padding(0, 2).SetString(errout).String())
64 | } else {
65 | fmt.Println(err)
66 | fmt.Println(errout)
67 | }
68 | }
69 |
70 | s.Stop()
71 |
72 | if !opts.IsHidden {
73 | if !isCLI {
74 | fmt.Println(lipgloss.NewStyle().Padding(0, 2).SetString(out).String())
75 | } else {
76 | fmt.Println(out)
77 | }
78 | }
79 |
80 | return nil
81 | }
82 |
--------------------------------------------------------------------------------
/core/options/opts.go:
--------------------------------------------------------------------------------
1 | package options
2 |
3 | type InstalOptions struct {
4 | Shell string
5 | IsHidden bool
6 | URL string
7 | }
8 |
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/abdfnx/instal
2 |
3 | go 1.17
4 |
5 | require (
6 | github.com/AlecAivazis/survey/v2 v2.3.5
7 | github.com/MakeNowJust/heredoc v1.0.0
8 | github.com/abdfnx/gosh v0.3.8
9 | github.com/abdfnx/looker v0.1.0
10 | github.com/abdfnx/resto v0.1.6
11 | github.com/briandowns/spinner v1.18.1
12 | github.com/charmbracelet/bubbles v0.12.0
13 | github.com/charmbracelet/bubbletea v0.22.0
14 | github.com/charmbracelet/lipgloss v0.5.0
15 | github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
16 | github.com/mattn/go-colorable v0.1.12
17 | github.com/mattn/go-isatty v0.0.14
18 | github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d
19 | github.com/muesli/reflow v0.3.0
20 | github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739
21 | github.com/spf13/cobra v1.5.0
22 | github.com/spf13/pflag v1.0.5
23 | github.com/tidwall/gjson v1.14.1
24 | golang.org/x/sys v0.0.0-20220422013727-9388b58f7150
25 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211
26 | )
27 |
28 | require (
29 | github.com/atotto/clipboard v0.1.4 // indirect
30 | github.com/containerd/console v1.0.3 // indirect
31 | github.com/fatih/color v1.13.0 // indirect
32 | github.com/inconshreveable/mousetrap v1.0.0 // indirect
33 | github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
34 | github.com/mattn/go-runewidth v0.0.13 // indirect
35 | github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b // indirect
36 | github.com/muesli/cancelreader v0.2.1 // indirect
37 | github.com/rivo/uniseg v0.2.0 // indirect
38 | github.com/tidwall/match v1.1.1 // indirect
39 | github.com/tidwall/pretty v1.2.0 // indirect
40 | golang.org/x/text v0.3.7 // indirect
41 | )
42 |
--------------------------------------------------------------------------------
/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 v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
8 | cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
9 | cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
10 | cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
11 | cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
12 | cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
13 | cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
14 | cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
15 | cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
16 | cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
17 | cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
18 | cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
19 | cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
20 | cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
21 | cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
22 | cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
23 | cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
24 | cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
25 | cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
26 | cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
27 | cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
28 | cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM=
29 | cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
30 | cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
31 | cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
32 | cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
33 | cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
34 | cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
35 | cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
36 | cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
37 | cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
38 | cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY=
39 | cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
40 | cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
41 | cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
42 | cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
43 | cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
44 | cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
45 | cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
46 | cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
47 | cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
48 | dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
49 | github.com/AlecAivazis/survey/v2 v2.3.2/go.mod h1:TH2kPCDU3Kqq7pLbnCWwZXDBjnhZtmsCle5EiYDJ2fg=
50 | github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ=
51 | github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI=
52 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
53 | github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
54 | github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
55 | github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
56 | github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
57 | github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc=
58 | github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w=
59 | github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
60 | github.com/Timothee-Cardoso/tc-exe v1.0.1/go.mod h1:dq8JjfgZPLtVNCSxRckj9GPhjaCm7IifIyqmkUgwAiM=
61 | github.com/abdfnx/gosh v0.3.8 h1:K60mFTwvhXrwd5JtROBjhAWE0OJOisFMkLvLB59txLk=
62 | github.com/abdfnx/gosh v0.3.8/go.mod h1:bho3zdOB7bNUOZDeI5+CSjoiF+MHmzHWqHHDAQiCq1c=
63 | github.com/abdfnx/looker v0.1.0 h1:tMN7E0wKIgbydAPPQ1RkppJ1bGHn+B+y9PZy7mwa+3U=
64 | github.com/abdfnx/looker v0.1.0/go.mod h1:QVfPHnredPBUg4R+MtEkZbMBbqrgtoaj0JHO3KYkvyE=
65 | github.com/abdfnx/resto v0.1.6 h1:yOM9O9bpMP4lb2ox0U7/gcFXO78P5eUZBxWuKrfdrFA=
66 | github.com/abdfnx/resto v0.1.6/go.mod h1:7+/dYHN1Zw70GKAOtT+76LG9ZnMqA9NTbUFFgEt7rsk=
67 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
68 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
69 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
70 | github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
71 | github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
72 | github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
73 | github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
74 | github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
75 | github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
76 | github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
77 | github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
78 | github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
79 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
80 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
81 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
82 | github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
83 | github.com/briandowns/spinner v1.18.0/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ=
84 | github.com/briandowns/spinner v1.18.1 h1:yhQmQtM1zsqFsouh09Bk/jCjd50pC3EOGsh28gLVvwY=
85 | github.com/briandowns/spinner v1.18.1/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU=
86 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
87 | github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
88 | github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
89 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
90 | github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
91 | github.com/charmbracelet/bubbles v0.12.0 h1:fxb9U9yI60Hek3tcPmMTFya5NhvPrqpkpyMaNngFh7A=
92 | github.com/charmbracelet/bubbles v0.12.0/go.mod h1:bbeTiXwPww4M031aGi8UK2HT9RDWoiNibae+1yCMtcc=
93 | github.com/charmbracelet/bubbletea v0.21.0 h1:f3y+kanzgev5PA916qxmDybSHU3N804uOnKnhRPXTcI=
94 | github.com/charmbracelet/bubbletea v0.21.0/go.mod h1:GgmJMec61d08zXsOhqRC/AiOx4K4pmz+VIcRIm1FKr4=
95 | github.com/charmbracelet/bubbletea v0.22.0 h1:E1BTNSE3iIrq0G0X6TjGAmrQ32cGCbFDPcIuImikrUc=
96 | github.com/charmbracelet/bubbletea v0.22.0/go.mod h1:aoVIwlNlr5wbCB26KhxfrqAn0bMp4YpJcoOelbxApjs=
97 | github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao=
98 | github.com/charmbracelet/lipgloss v0.5.0 h1:lulQHuVeodSgDez+3rGiuxlPVXSnhth442DATR2/8t8=
99 | github.com/charmbracelet/lipgloss v0.5.0/go.mod h1:EZLha/HbzEt7cYqdFPovlqy5FZPj0xFhg5SaqxScmgs=
100 | github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
101 | github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
102 | github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
103 | github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
104 | github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
105 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
106 | github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
107 | github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
108 | github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
109 | github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
110 | github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
111 | github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
112 | github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
113 | github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
114 | github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
115 | github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
116 | github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw=
117 | github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
118 | github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
119 | github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
120 | github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
121 | github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
122 | github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
123 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
124 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
125 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
126 | github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
127 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
128 | github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
129 | github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
130 | github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
131 | github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
132 | github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
133 | github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
134 | github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ=
135 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
136 | github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws=
137 | github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
138 | github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
139 | github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
140 | github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
141 | github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
142 | github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E=
143 | github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg=
144 | github.com/gdamore/tcell/v2 v2.4.1-0.20210905002822-f057f0a857a1/go.mod h1:Az6Jt+M5idSED2YPGtwnfJV0kXohgdCBPmHGSYc1r04=
145 | github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
146 | github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
147 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
148 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
149 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
150 | github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
151 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
152 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
153 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
154 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
155 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
156 | github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
157 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
158 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
159 | github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
160 | github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
161 | github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
162 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
163 | github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
164 | github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
165 | github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
166 | github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
167 | github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
168 | github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
169 | github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
170 | github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
171 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
172 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
173 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
174 | github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
175 | github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
176 | github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
177 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
178 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
179 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
180 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
181 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
182 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
183 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
184 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
185 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
186 | github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
187 | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
188 | github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
189 | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
190 | github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
191 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
192 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
193 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
194 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
195 | github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
196 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
197 | github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
198 | github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
199 | github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
200 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
201 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
202 | github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
203 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
204 | github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
205 | github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
206 | github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
207 | github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
208 | github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
209 | github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
210 | github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
211 | github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
212 | github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
213 | github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
214 | github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
215 | github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
216 | github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
217 | github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
218 | github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
219 | github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
220 | github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
221 | github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
222 | github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
223 | github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
224 | github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
225 | github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
226 | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
227 | github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
228 | github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
229 | github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
230 | github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
231 | github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
232 | github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
233 | github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
234 | github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
235 | github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
236 | github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
237 | github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
238 | github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
239 | github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
240 | github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
241 | github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
242 | github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
243 | github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
244 | github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
245 | github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
246 | github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
247 | github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
248 | github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
249 | github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
250 | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
251 | github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
252 | github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
253 | github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
254 | github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
255 | github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=
256 | github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=
257 | github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
258 | github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
259 | github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=
260 | github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=
261 | github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A=
262 | github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68=
263 | github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
264 | github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
265 | github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
266 | github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
267 | github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
268 | github.com/jedib0t/go-pretty/v6 v6.2.4/go.mod h1:+nE9fyyHGil+PuISTCrp7avEdo6bqoMwqZnuiK2r2a0=
269 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
270 | github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
271 | github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
272 | github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
273 | github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
274 | github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
275 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
276 | github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
277 | github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
278 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
279 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
280 | github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
281 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
282 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
283 | github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
284 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
285 | github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
286 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
287 | github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
288 | github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
289 | github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
290 | github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w=
291 | github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
292 | github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
293 | github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
294 | github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
295 | github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
296 | github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
297 | github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
298 | github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
299 | github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
300 | github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
301 | github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
302 | github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
303 | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
304 | github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
305 | github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
306 | github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
307 | github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
308 | github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
309 | github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
310 | github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
311 | github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
312 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
313 | github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
314 | github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI=
315 | github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
316 | github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
317 | github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
318 | github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
319 | github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
320 | github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
321 | github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
322 | github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
323 | github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
324 | github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
325 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
326 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
327 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
328 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
329 | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
330 | github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b h1:1XF24mVaiu7u+CFywTdcDo2ie1pzzhwjt6RHqzpMU34=
331 | github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho=
332 | github.com/muesli/cancelreader v0.2.0/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
333 | github.com/muesli/cancelreader v0.2.1 h1:Xzd1B4U5bWQOuSKuN398MyynIGTNT89dxzpEDsalXZs=
334 | github.com/muesli/cancelreader v0.2.1/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
335 | github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68/go.mod h1:Xk+z4oIWdQqJzsxyjgl3P22oYZnHdZ8FFTHAQQt5BMQ=
336 | github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s=
337 | github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8=
338 | github.com/muesli/termenv v0.9.0/go.mod h1:R/LzAKf+suGs4IsO95y7+7DpFHO0KABgnZqtlyx2mBw=
339 | github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs=
340 | github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739 h1:QANkGiGr39l1EESqrE0gZw0/AJNYzIvoGLhIoVYtluI=
341 | github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs=
342 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
343 | github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
344 | github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
345 | github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
346 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
347 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
348 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
349 | github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
350 | github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
351 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
352 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
353 | github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
354 | github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
355 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
356 | github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
357 | github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
358 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
359 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
360 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
361 | github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
362 | github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
363 | github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
364 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
365 | github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
366 | github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
367 | github.com/rivo/tview v0.0.0-20211202162923-2a6de950f73b/go.mod h1:WIfMkQNY+oq/mWwtsjOYHIZBuwthioY2srOmljJkTnk=
368 | github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
369 | github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
370 | github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
371 | github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
372 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
373 | github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
374 | github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
375 | github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig=
376 | github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y=
377 | github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
378 | github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
379 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
380 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
381 | github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
382 | github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
383 | github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
384 | github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
385 | github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4=
386 | github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU=
387 | github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM=
388 | github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
389 | github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
390 | github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
391 | github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM=
392 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
393 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
394 | github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
395 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
396 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
397 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
398 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
399 | github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
400 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
401 | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
402 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
403 | github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
404 | github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
405 | github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo=
406 | github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
407 | github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
408 | github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
409 | github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
410 | github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
411 | github.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM=
412 | github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
413 | github.com/yosssi/gohtml v0.0.0-20201013000340-ee4748c638f4/go.mod h1:+ccdNT0xMY1dtc5XBxumbYfOUhmduiGudqaDgD2rVRE=
414 | github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
415 | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
416 | github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
417 | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
418 | github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
419 | github.com/zyedidia/micro v1.4.1/go.mod h1:/wcvhlXPvvvb6v176yUQE4gNzr+Erwz4pWfx7PU/cuE=
420 | go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
421 | go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
422 | go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs=
423 | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
424 | go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
425 | go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
426 | go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
427 | go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
428 | go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
429 | go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
430 | go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
431 | go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
432 | go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
433 | go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
434 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
435 | golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
436 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
437 | golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
438 | golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
439 | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
440 | golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
441 | golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
442 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
443 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
444 | golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
445 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
446 | golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
447 | golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
448 | golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
449 | golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
450 | golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
451 | golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
452 | golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
453 | golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
454 | golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
455 | golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
456 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
457 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
458 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
459 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
460 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
461 | golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
462 | golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
463 | golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
464 | golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
465 | golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
466 | golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
467 | golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
468 | golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
469 | golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
470 | golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
471 | golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
472 | golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
473 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
474 | golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
475 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
476 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
477 | golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
478 | golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
479 | golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
480 | golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
481 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
482 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
483 | golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
484 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
485 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
486 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
487 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
488 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
489 | golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
490 | golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
491 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
492 | golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
493 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
494 | golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
495 | golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
496 | golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
497 | golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
498 | golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
499 | golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
500 | golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
501 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
502 | golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
503 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
504 | golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
505 | golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
506 | golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
507 | golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
508 | golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
509 | golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
510 | golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
511 | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
512 | golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
513 | golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
514 | golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
515 | golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
516 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
517 | golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
518 | golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
519 | golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
520 | golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
521 | golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
522 | golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
523 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
524 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
525 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
526 | golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
527 | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
528 | golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
529 | golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
530 | golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
531 | golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
532 | golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
533 | golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
534 | golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
535 | golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
536 | golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
537 | golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
538 | golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
539 | golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
540 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
541 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
542 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
543 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
544 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
545 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
546 | golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
547 | golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
548 | golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
549 | golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
550 | golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
551 | golang.org/x/sys v0.0.0-20180816055513-1c9583448a9c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
552 | golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
553 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
554 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
555 | golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
556 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
557 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
558 | golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
559 | golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
560 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
561 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
562 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
563 | golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
564 | golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
565 | golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
566 | golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
567 | golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
568 | golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
569 | golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
570 | golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
571 | golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
572 | golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
573 | golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
574 | golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
575 | golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
576 | golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
577 | golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
578 | golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
579 | golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
580 | golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
581 | golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
582 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
583 | golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
584 | golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
585 | golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
586 | golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
587 | golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
588 | golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
589 | golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
590 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
591 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
592 | golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
593 | golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
594 | golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
595 | golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
596 | golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
597 | golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
598 | golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
599 | golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
600 | golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
601 | golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
602 | golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
603 | golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
604 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
605 | golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
606 | golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
607 | golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
608 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
609 | golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
610 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
611 | golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
612 | golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
613 | golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
614 | golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
615 | golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
616 | golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
617 | golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
618 | golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
619 | golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
620 | golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
621 | golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
622 | golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 h1:xHms4gcpe1YE7A3yIllJXP16CMAGuqwO2lX1mTyyRRc=
623 | golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
624 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
625 | golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
626 | golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
627 | golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY=
628 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
629 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
630 | golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
631 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
632 | golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
633 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
634 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
635 | golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
636 | golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
637 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
638 | golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
639 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
640 | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
641 | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
642 | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
643 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
644 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
645 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
646 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
647 | golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
648 | golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
649 | golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
650 | golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
651 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
652 | golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
653 | golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
654 | golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
655 | golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
656 | golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
657 | golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
658 | golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
659 | golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
660 | golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
661 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
662 | golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
663 | golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
664 | golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
665 | golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
666 | golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
667 | golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
668 | golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
669 | golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
670 | golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
671 | golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
672 | golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
673 | golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
674 | golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
675 | golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
676 | golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
677 | golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
678 | golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
679 | golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
680 | golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
681 | golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
682 | golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
683 | golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
684 | golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
685 | golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
686 | golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
687 | golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
688 | golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
689 | golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
690 | golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
691 | golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
692 | golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
693 | golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
694 | golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
695 | golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
696 | golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
697 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
698 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
699 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
700 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
701 | google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
702 | google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
703 | google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
704 | google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
705 | google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
706 | google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
707 | google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
708 | google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
709 | google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
710 | google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
711 | google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
712 | google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
713 | google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
714 | google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
715 | google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
716 | google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
717 | google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
718 | google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
719 | google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
720 | google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
721 | google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
722 | google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=
723 | google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=
724 | google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
725 | google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
726 | google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
727 | google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
728 | google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
729 | google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=
730 | google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU=
731 | google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=
732 | google.golang.org/api v0.62.0/go.mod h1:dKmwPCydfsad4qCH08MSdgWjfHOyfpd4VtDGgRFdavw=
733 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
734 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
735 | google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
736 | google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
737 | google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
738 | google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
739 | google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
740 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
741 | google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
742 | google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
743 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
744 | google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
745 | google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
746 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
747 | google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
748 | google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
749 | google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
750 | google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
751 | google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
752 | google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
753 | google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
754 | google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
755 | google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
756 | google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
757 | google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
758 | google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
759 | google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
760 | google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
761 | google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
762 | google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
763 | google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
764 | google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
765 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
766 | google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
767 | google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
768 | google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
769 | google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
770 | google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
771 | google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
772 | google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
773 | google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
774 | google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
775 | google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
776 | google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
777 | google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
778 | google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
779 | google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
780 | google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
781 | google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
782 | google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
783 | google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
784 | google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
785 | google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
786 | google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
787 | google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
788 | google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
789 | google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
790 | google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
791 | google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
792 | google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
793 | google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
794 | google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
795 | google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
796 | google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
797 | google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
798 | google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
799 | google.golang.org/genproto v0.0.0-20211129164237-f09f9a12af12/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
800 | google.golang.org/genproto v0.0.0-20211203200212-54befc351ae9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
801 | google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
802 | google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
803 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
804 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
805 | google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
806 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
807 | google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
808 | google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
809 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
810 | google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
811 | google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
812 | google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
813 | google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
814 | google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
815 | google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
816 | google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
817 | google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
818 | google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
819 | google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
820 | google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
821 | google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
822 | google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
823 | google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
824 | google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
825 | google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
826 | google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
827 | google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
828 | google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
829 | google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
830 | google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
831 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
832 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
833 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
834 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
835 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
836 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
837 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
838 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
839 | google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
840 | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
841 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
842 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
843 | google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
844 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
845 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
846 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
847 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
848 | gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
849 | gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
850 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
851 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
852 | gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
853 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
854 | gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
855 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
856 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
857 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
858 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
859 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
860 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
861 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
862 | honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
863 | honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
864 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
865 | honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
866 | honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
867 | honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
868 | rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
869 | rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
870 | rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
871 |
--------------------------------------------------------------------------------
/internal/tui/tui.go:
--------------------------------------------------------------------------------
1 | package tui
2 |
3 | import (
4 | "os"
5 | "fmt"
6 | "runtime"
7 | "strings"
8 |
9 | "github.com/charmbracelet/lipgloss"
10 | "github.com/abdfnx/instal/core/options"
11 | tea "github.com/charmbracelet/bubbletea"
12 | "github.com/abdfnx/instal/core/installer"
13 | "github.com/charmbracelet/bubbles/textinput"
14 | )
15 |
16 | var (
17 | focusedStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("205"))
18 | blurredStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("240"))
19 | cursorStyle = focusedStyle.Copy()
20 | noStyle = lipgloss.NewStyle()
21 |
22 | focusedButton = focusedStyle.Copy().Render("[ OK ]")
23 | blurredButton = fmt.Sprintf("[ %s ]", blurredStyle.Render("OK"))
24 | )
25 |
26 | type model struct {
27 | focusIndex int
28 | inputs []textinput.Model
29 | }
30 |
31 | func initialModel() model {
32 | m := model{
33 | inputs: make([]textinput.Model, 3),
34 | }
35 |
36 | p := "bash"
37 |
38 | if runtime.GOOS == "windows" {
39 | p = "powershell.exe"
40 | }
41 |
42 | var t textinput.Model
43 | for i := range m.inputs {
44 | t = textinput.New()
45 | t.CursorStyle = cursorStyle
46 | t.CharLimit = 32
47 |
48 | switch i {
49 | case 0:
50 | t.Placeholder = "URL"
51 | t.Focus()
52 | t.PromptStyle = focusedStyle
53 | t.TextStyle = focusedStyle
54 |
55 | case 1:
56 | t.Placeholder = "Shell to use (" + p + ")"
57 | t.CharLimit = 64
58 |
59 | case 2:
60 | t.Placeholder = "Is hidden (y/n)"
61 | t.CharLimit = 5
62 | }
63 |
64 | m.inputs[i] = t
65 | }
66 |
67 | return m
68 | }
69 |
70 | func (m model) Init() tea.Cmd {
71 | return textinput.Blink
72 | }
73 |
74 | func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
75 | switch msg := msg.(type) {
76 | case tea.KeyMsg:
77 | switch msg.String() {
78 | case "ctrl+c", "esc":
79 | return m, tea.Quit
80 |
81 | // Set focus to next input
82 | case "tab", "shift+tab", "enter", "up", "down":
83 | s := msg.String()
84 |
85 | if s == "enter" && m.focusIndex == len(m.inputs) {
86 | opts := options.InstalOptions{
87 | Shell: "",
88 | IsHidden: false,
89 | URL: "",
90 | }
91 |
92 | installer.RunInstal(&opts, false, m.inputs[0].Value(), m.inputs[1].Value(), m.inputs[2].Value())
93 |
94 | return m, tea.Quit
95 | }
96 |
97 | // Cycle indexes
98 | if s == "up" || s == "shift+tab" {
99 | m.focusIndex--
100 | } else {
101 | m.focusIndex++
102 | }
103 |
104 | if m.focusIndex > len(m.inputs) {
105 | m.focusIndex = 0
106 | } else if m.focusIndex < 0 {
107 | m.focusIndex = len(m.inputs)
108 | }
109 |
110 | cmds := make([]tea.Cmd, len(m.inputs))
111 |
112 | for i := 0; i <= len(m.inputs)-1; i++ {
113 | if i == m.focusIndex {
114 | // Set focused state
115 | cmds[i] = m.inputs[i].Focus()
116 | m.inputs[i].PromptStyle = focusedStyle
117 | m.inputs[i].TextStyle = focusedStyle
118 | continue
119 | }
120 |
121 | // Remove focused state
122 | m.inputs[i].Blur()
123 | m.inputs[i].PromptStyle = noStyle
124 | m.inputs[i].TextStyle = noStyle
125 | }
126 |
127 | return m, tea.Batch(cmds...)
128 | }
129 | }
130 |
131 | // Handle character input and blinking
132 | cmd := m.updateInputs(msg)
133 |
134 | return m, cmd
135 | }
136 |
137 | func (m *model) updateInputs(msg tea.Msg) tea.Cmd {
138 | var cmds = make([]tea.Cmd, len(m.inputs))
139 |
140 | // Only text inputs with Focus() set will respond, so it's safe to simply
141 | // update all of them here without any further logic.
142 | for i := range m.inputs {
143 | m.inputs[i], cmds[i] = m.inputs[i].Update(msg)
144 | }
145 |
146 | return tea.Batch(cmds...)
147 | }
148 |
149 | func (m model) View() string {
150 | var b strings.Builder
151 |
152 | logo := lipgloss.NewStyle().
153 | Foreground(lipgloss.Color("#fff")).
154 | Background(lipgloss.Color("#6957B0")).
155 | Padding(0, 1).
156 | SetString("Instal")
157 |
158 | paddingLogo := lipgloss.NewStyle().
159 | Padding(0, 2).
160 | SetString(logo.String())
161 |
162 | b.WriteString("\n" + paddingLogo.String() + "\n\n")
163 |
164 | for i := range m.inputs {
165 | b.WriteString(lipgloss.NewStyle().Padding(0, 2).SetString(m.inputs[i].View()).String() + "\n")
166 | }
167 |
168 | button := &blurredButton
169 |
170 | if m.focusIndex == len(m.inputs) {
171 | button = &focusedButton
172 | }
173 |
174 | fmt.Fprintf(&b, "\n%s\n\n", lipgloss.NewStyle().Padding(0, 2).SetString(*button).String())
175 |
176 | return b.String()
177 | }
178 |
179 | func Instal() {
180 | if err := tea.NewProgram(initialModel()).Start(); err != nil {
181 | fmt.Printf("could not start program: %s\n", err)
182 | os.Exit(1)
183 | }
184 | }
185 |
--------------------------------------------------------------------------------
/ios/color.go:
--------------------------------------------------------------------------------
1 | package ios
2 |
3 | import (
4 | "os"
5 | "fmt"
6 | "strings"
7 | "strconv"
8 |
9 | "github.com/mgutz/ansi"
10 | )
11 |
12 | var (
13 | magenta = ansi.ColorFunc("magenta")
14 | cyan = ansi.ColorFunc("cyan")
15 | red = ansi.ColorFunc("red")
16 | yellow = ansi.ColorFunc("yellow")
17 | blue = ansi.ColorFunc("blue")
18 | green = ansi.ColorFunc("green")
19 | gray = ansi.ColorFunc("black+h")
20 | bold = ansi.ColorFunc("default+b")
21 | cyanBold = ansi.ColorFunc("cyan+b")
22 |
23 | gray256 = func(t string) string {
24 | return fmt.Sprintf("\x1b[%d;5;%dm%s\x1b[m", 38, 242, t)
25 | }
26 | )
27 |
28 | func EnvColorDisabled() bool {
29 | return os.Getenv("NO_COLOR") != "" || os.Getenv("CLICOLOR") == "0"
30 | }
31 |
32 | func EnvColorForced() bool {
33 | return os.Getenv("CLICOLOR_FORCE") != "" && os.Getenv("CLICOLOR_FORCE") != "0"
34 | }
35 |
36 | func Is256ColorSupported() bool {
37 | return IsTrueColorSupported() ||
38 | strings.Contains(os.Getenv("TERM"), "256") ||
39 | strings.Contains(os.Getenv("COLORTERM"), "256")
40 | }
41 |
42 | func IsTrueColorSupported() bool {
43 | term := os.Getenv("TERM")
44 | colorterm := os.Getenv("COLORTERM")
45 |
46 | return strings.Contains(term, "24bit") ||
47 | strings.Contains(term, "truecolor") ||
48 | strings.Contains(colorterm, "24bit") ||
49 | strings.Contains(colorterm, "truecolor")
50 | }
51 |
52 | func NewColorScheme(enabled, is256enabled bool) *ColorScheme {
53 | return &ColorScheme{
54 | enabled: enabled,
55 | is256enabled: is256enabled,
56 | }
57 | }
58 |
59 | type ColorScheme struct {
60 | enabled bool
61 | is256enabled bool
62 | hasTrueColor bool
63 | }
64 |
65 | func (c *ColorScheme) Bold(t string) string {
66 | if !c.enabled {
67 | return t
68 | }
69 |
70 | return bold(t)
71 | }
72 |
73 | func (c *ColorScheme) Boldf(t string, args ...interface{}) string {
74 | return c.Bold(fmt.Sprintf(t, args...))
75 | }
76 |
77 | func (c *ColorScheme) Red(t string) string {
78 | if !c.enabled {
79 | return t
80 | }
81 |
82 | return red(t)
83 | }
84 |
85 | func (c *ColorScheme) Redf(t string, args ...interface{}) string {
86 | return c.Red(fmt.Sprintf(t, args...))
87 | }
88 |
89 | func (c *ColorScheme) Yellow(t string) string {
90 | if !c.enabled {
91 | return t
92 | }
93 |
94 | return yellow(t)
95 | }
96 |
97 | func (c *ColorScheme) Yellowf(t string, args ...interface{}) string {
98 | return c.Yellow(fmt.Sprintf(t, args...))
99 | }
100 |
101 | func (c *ColorScheme) Green(t string) string {
102 | if !c.enabled {
103 | return t
104 | }
105 |
106 | return green(t)
107 | }
108 |
109 | func (c *ColorScheme) Greenf(t string, args ...interface{}) string {
110 | return c.Green(fmt.Sprintf(t, args...))
111 | }
112 |
113 | func (c *ColorScheme) Gray(t string) string {
114 | if !c.enabled {
115 | return t
116 | }
117 |
118 | if c.is256enabled {
119 | return gray256(t)
120 | }
121 |
122 | return gray(t)
123 | }
124 |
125 | func (c *ColorScheme) Grayf(t string, args ...interface{}) string {
126 | return c.Gray(fmt.Sprintf(t, args...))
127 | }
128 |
129 | func (c *ColorScheme) Magenta(t string) string {
130 | if !c.enabled {
131 | return t
132 | }
133 |
134 | return magenta(t)
135 | }
136 |
137 | func (c *ColorScheme) Magentaf(t string, args ...interface{}) string {
138 | return c.Magenta(fmt.Sprintf(t, args...))
139 | }
140 |
141 | func (c *ColorScheme) Cyan(t string) string {
142 | if !c.enabled {
143 | return t
144 | }
145 |
146 | return cyan(t)
147 | }
148 |
149 | func (c *ColorScheme) Cyanf(t string, args ...interface{}) string {
150 | return c.Cyan(fmt.Sprintf(t, args...))
151 | }
152 |
153 | func (c *ColorScheme) CyanBold(t string) string {
154 | if !c.enabled {
155 | return t
156 | }
157 |
158 | return cyanBold(t)
159 | }
160 |
161 | func (c *ColorScheme) Blue(t string) string {
162 | if !c.enabled {
163 | return t
164 | }
165 |
166 | return blue(t)
167 | }
168 |
169 | func (c *ColorScheme) Bluef(t string, args ...interface{}) string {
170 | return c.Blue(fmt.Sprintf(t, args...))
171 | }
172 |
173 | func (c *ColorScheme) SuccessIcon() string {
174 | return c.SuccessIconWithColor(c.Green)
175 | }
176 |
177 | func (c *ColorScheme) SuccessIconWithColor(colo func(string) string) string {
178 | return colo("✓")
179 | }
180 |
181 | func (c *ColorScheme) WarningIcon() string {
182 | return c.Yellow("!")
183 | }
184 |
185 | func (c *ColorScheme) FailureIcon() string {
186 | return c.FailureIconWithColor(c.Red)
187 | }
188 |
189 | func (c *ColorScheme) FailureIconWithColor(colo func(string) string) string {
190 | return colo("X")
191 | }
192 |
193 | func (c *ColorScheme) ColorFromString(s string) func(string) string {
194 | s = strings.ToLower(s)
195 | var fn func(string) string
196 |
197 | switch s {
198 | case "bold":
199 | fn = c.Bold
200 | case "red":
201 | fn = c.Red
202 | case "yellow":
203 | fn = c.Yellow
204 | case "green":
205 | fn = c.Green
206 | case "gray":
207 | fn = c.Gray
208 | case "magenta":
209 | fn = c.Magenta
210 | case "cyan":
211 | fn = c.Cyan
212 | case "blue":
213 | fn = c.Blue
214 | default:
215 | fn = func(s string) string {
216 | return s
217 | }
218 | }
219 |
220 | return fn
221 | }
222 |
223 | func (c *ColorScheme) HexToRGB(hex string, x string) string {
224 | if !c.enabled || !c.hasTrueColor {
225 | return x
226 | }
227 |
228 | r, _ := strconv.ParseInt(hex[0:2], 16, 64)
229 | g, _ := strconv.ParseInt(hex[2:4], 16, 64)
230 | b, _ := strconv.ParseInt(hex[4:6], 16, 64)
231 |
232 | return fmt.Sprintf("\033[38;2;%d;%d;%dm%s\033[0m", r, g, b, x)
233 | }
234 |
--------------------------------------------------------------------------------
/ios/console.go:
--------------------------------------------------------------------------------
1 | // +build !windows
2 |
3 | package ios
4 |
5 | import (
6 | "os"
7 | "errors"
8 | )
9 |
10 | func (s *IOStreams) EnableVirtualTerminalProcessing() error {
11 | return nil
12 | }
13 |
14 | func enableVirtualTerminalProcessing(f *os.File) error {
15 | return errors.New("not implemented")
16 | }
17 |
--------------------------------------------------------------------------------
/ios/console_windows.go:
--------------------------------------------------------------------------------
1 | // +build windows
2 |
3 | package ios
4 |
5 | import (
6 | "os"
7 |
8 | "golang.org/x/sys/windows"
9 | )
10 |
11 | func (s *IOStreams) EnableVirtualTerminalProcessing() error {
12 | if !s.IsStdoutTTY() {
13 | return nil
14 | }
15 |
16 | f, ok := s.originalOut.(*os.File)
17 | if !ok {
18 | return nil
19 | }
20 |
21 | return enableVirtualTerminalProcessing(f)
22 | }
23 |
24 | func enableVirtualTerminalProcessing(f *os.File) error {
25 | stdout := windows.Handle(f.Fd())
26 |
27 | var originalMode uint32
28 | windows.GetConsoleMode(stdout, &originalMode)
29 |
30 | return windows.SetConsoleMode(stdout, originalMode|windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING)
31 | }
32 |
--------------------------------------------------------------------------------
/ios/iostreams.go:
--------------------------------------------------------------------------------
1 | package ios
2 |
3 | import (
4 | "io"
5 | "os"
6 | "fmt"
7 | "time"
8 | "bytes"
9 | "errors"
10 | "os/exec"
11 | "strconv"
12 | "strings"
13 | "io/ioutil"
14 |
15 | "golang.org/x/term"
16 | "github.com/google/shlex"
17 | "github.com/abdfnx/looker"
18 | "github.com/muesli/termenv"
19 | "github.com/mattn/go-isatty"
20 | "github.com/mattn/go-colorable"
21 | "github.com/briandowns/spinner"
22 | )
23 |
24 | const DefaultWidth = 80
25 |
26 | type IOStreams struct {
27 | In io.ReadCloser
28 | Out io.Writer
29 | ErrOut io.Writer
30 |
31 | // the original (non-colorable) output stream
32 | originalOut io.Writer
33 | colorEnabled bool
34 | is256enabled bool
35 | hasTrueColor bool
36 | terminalTheme string
37 |
38 | progressIndicatorEnabled bool
39 | progressIndicator *spinner.Spinner
40 |
41 | stdinTTYOverride bool
42 | stdinIsTTY bool
43 | stdoutTTYOverride bool
44 | stdoutIsTTY bool
45 | stderrTTYOverride bool
46 | stderrIsTTY bool
47 | termWidthOverride int
48 | ttySize func() (int, int, error)
49 |
50 | pagerCommand string
51 | pagerProcess *os.Process
52 |
53 | neverPrompt bool
54 |
55 | TempFileOverride *os.File
56 | }
57 |
58 | func (s *IOStreams) ColorEnabled() bool {
59 | return s.colorEnabled
60 | }
61 |
62 | func (s *IOStreams) ColorSupport256() bool {
63 | return s.is256enabled
64 | }
65 |
66 | func (s *IOStreams) HasTrueColor() bool {
67 | return s.hasTrueColor
68 | }
69 |
70 | func (s *IOStreams) DetectTerminalTheme() string {
71 | if !s.ColorEnabled() {
72 | s.terminalTheme = "none"
73 | return "none"
74 | }
75 |
76 | if s.pagerProcess != nil {
77 | s.terminalTheme = "none"
78 | return "none"
79 | }
80 |
81 | style := os.Getenv("GLAMOUR_STYLE")
82 | if style != "" && style != "auto" {
83 | s.terminalTheme = "none"
84 | return "none"
85 | }
86 |
87 | if termenv.HasDarkBackground() {
88 | s.terminalTheme = "dark"
89 | return "dark"
90 | }
91 |
92 | s.terminalTheme = "light"
93 | return "light"
94 | }
95 |
96 | func (s *IOStreams) TerminalTheme() string {
97 | if s.terminalTheme == "" {
98 | return "none"
99 | }
100 |
101 | return s.terminalTheme
102 | }
103 |
104 | func (s *IOStreams) SetColorEnabled(colorEnabled bool) {
105 | s.colorEnabled = colorEnabled
106 | }
107 |
108 | func (s *IOStreams) SetStdinTTY(isTTY bool) {
109 | s.stdinTTYOverride = true
110 | s.stdinIsTTY = isTTY
111 | }
112 |
113 | func (s *IOStreams) IsStdinTTY() bool {
114 | if s.stdinTTYOverride {
115 | return s.stdinIsTTY
116 | }
117 |
118 | if stdin, ok := s.In.(*os.File); ok {
119 | return isTerminal(stdin)
120 | }
121 |
122 | return false
123 | }
124 |
125 | func (s *IOStreams) SetStdoutTTY(isTTY bool) {
126 | s.stdoutTTYOverride = true
127 | s.stdoutIsTTY = isTTY
128 | }
129 |
130 | func (s *IOStreams) IsStdoutTTY() bool {
131 | if s.stdoutTTYOverride {
132 | return s.stdoutIsTTY
133 | }
134 |
135 | if stdout, ok := s.Out.(*os.File); ok {
136 | return isTerminal(stdout)
137 | }
138 |
139 | return false
140 | }
141 |
142 | func (s *IOStreams) SetStderrTTY(isTTY bool) {
143 | s.stderrTTYOverride = true
144 | s.stderrIsTTY = isTTY
145 | }
146 |
147 | func (s *IOStreams) IsStderrTTY() bool {
148 | if s.stderrTTYOverride {
149 | return s.stderrIsTTY
150 | }
151 |
152 | if stderr, ok := s.ErrOut.(*os.File); ok {
153 | return isTerminal(stderr)
154 | }
155 |
156 | return false
157 | }
158 |
159 | func (s *IOStreams) SetPager(cmd string) {
160 | s.pagerCommand = cmd
161 | }
162 |
163 | func (s *IOStreams) GetPager() string {
164 | return s.pagerCommand
165 | }
166 |
167 | func (s *IOStreams) StartPager() error {
168 | if s.pagerCommand == "" || s.pagerCommand == "cat" || !s.IsStdoutTTY() {
169 | return nil
170 | }
171 |
172 | pagerArgs, err := shlex.Split(s.pagerCommand)
173 |
174 | if err != nil {
175 | return err
176 | }
177 |
178 | pagerEnv := os.Environ()
179 |
180 | for i := len(pagerEnv) - 1; i >= 0; i-- {
181 | if strings.HasPrefix(pagerEnv[i], "PAGER=") {
182 | pagerEnv = append(pagerEnv[0:i], pagerEnv[i+1:]...)
183 | }
184 | }
185 |
186 | if _, ok := os.LookupEnv("LESS"); !ok {
187 | pagerEnv = append(pagerEnv, "LESS=FRX")
188 | }
189 |
190 | if _, ok := os.LookupEnv("LV"); !ok {
191 | pagerEnv = append(pagerEnv, "LV=-c")
192 | }
193 |
194 | pagerExe, err := looker.LookPath(pagerArgs[0])
195 |
196 | if err != nil {
197 | return err
198 | }
199 |
200 | pagerCmd := exec.Command(pagerExe, pagerArgs[1:]...)
201 | pagerCmd.Env = pagerEnv
202 | pagerCmd.Stdout = s.Out
203 | pagerCmd.Stderr = s.ErrOut
204 | pagedOut, err := pagerCmd.StdinPipe()
205 |
206 | if err != nil {
207 | return err
208 | }
209 |
210 | s.Out = pagedOut
211 | err = pagerCmd.Start()
212 | if err != nil {
213 | return err
214 | }
215 |
216 | s.pagerProcess = pagerCmd.Process
217 |
218 | return nil
219 | }
220 |
221 | func (s *IOStreams) StopPager() {
222 | if s.pagerProcess == nil {
223 | return
224 | }
225 |
226 | _ = s.Out.(io.ReadCloser).Close()
227 | _, _ = s.pagerProcess.Wait()
228 | s.pagerProcess = nil
229 | }
230 |
231 | func (s *IOStreams) CanPrompt() bool {
232 | if s.neverPrompt {
233 | return false
234 | }
235 |
236 | return s.IsStdinTTY() && s.IsStdoutTTY()
237 | }
238 |
239 | func (s *IOStreams) GetNeverPrompt() bool {
240 | return s.neverPrompt
241 | }
242 |
243 | func (s *IOStreams) SetNeverPrompt(v bool) {
244 | s.neverPrompt = v
245 | }
246 |
247 | func (s *IOStreams) StartProgressIndicator() {
248 | if !s.progressIndicatorEnabled {
249 | return
250 | }
251 |
252 | sp := spinner.New(spinner.CharSets[11], 400*time.Millisecond, spinner.WithWriter(s.ErrOut))
253 | sp.Start()
254 | s.progressIndicator = sp
255 | }
256 |
257 | func (s *IOStreams) StopProgressIndicator() {
258 | if s.progressIndicator == nil {
259 | return
260 | }
261 |
262 | s.progressIndicator.Stop()
263 | s.progressIndicator = nil
264 | }
265 |
266 | // TerminalWidth returns the width of the terminal that stdout is attached to.
267 | // TODO: investigate whether ProcessTerminalWidth could replace all this.
268 | func (s *IOStreams) TerminalWidth() int {
269 | if s.termWidthOverride > 0 {
270 | return s.termWidthOverride
271 | }
272 |
273 | defaultWidth := DefaultWidth
274 | out := s.Out
275 |
276 | if s.originalOut != nil {
277 | out = s.originalOut
278 | }
279 |
280 | if w, _, err := terminalSize(out); err == nil {
281 | return w
282 | }
283 |
284 | if isCygwinTerminal(out) {
285 | tputExe, err := looker.LookPath("tput")
286 | if err != nil {
287 | return defaultWidth
288 | }
289 |
290 | tputCmd := exec.Command(tputExe, "cols")
291 | tputCmd.Stdin = os.Stdin
292 |
293 | if out, err := tputCmd.Output(); err == nil {
294 | if w, err := strconv.Atoi(strings.TrimSpace(string(out))); err == nil {
295 | return w
296 | }
297 | }
298 | }
299 |
300 | return defaultWidth
301 | }
302 |
303 | // ProcessTerminalWidth returns the width of the terminal that the process is attached to.
304 | func (s *IOStreams) ProcessTerminalWidth() int {
305 | w, _, err := s.ttySize()
306 | if err != nil {
307 | return DefaultWidth
308 | }
309 |
310 | return w
311 | }
312 |
313 | func (s *IOStreams) ForceTerminal(spec string) {
314 | s.colorEnabled = !EnvColorDisabled()
315 | s.SetStdoutTTY(true)
316 |
317 | if w, err := strconv.Atoi(spec); err == nil {
318 | s.termWidthOverride = w
319 | return
320 | }
321 |
322 | ttyWidth, _, err := s.ttySize()
323 |
324 | if err != nil {
325 | return
326 | }
327 |
328 | s.termWidthOverride = ttyWidth
329 |
330 | if strings.HasSuffix(spec, "%") {
331 | if p, err := strconv.Atoi(spec[:len(spec)-1]); err == nil {
332 | s.termWidthOverride = int(float64(s.termWidthOverride) * (float64(p) / 100))
333 | }
334 | }
335 | }
336 |
337 | func (s *IOStreams) ColorScheme() *ColorScheme {
338 | return NewColorScheme(s.ColorEnabled(), s.ColorSupport256())
339 | }
340 |
341 | func (s *IOStreams) ReadUserFile(fn string) ([]byte, error) {
342 | var r io.ReadCloser
343 | if fn == "-" {
344 | r = s.In
345 | } else {
346 | var err error
347 | r, err = os.Open(fn)
348 | if err != nil {
349 | return nil, err
350 | }
351 | }
352 |
353 | defer r.Close()
354 |
355 | return ioutil.ReadAll(r)
356 | }
357 |
358 | func (s *IOStreams) TempFile(dir, pattern string) (*os.File, error) {
359 | if s.TempFileOverride != nil {
360 | return s.TempFileOverride, nil
361 | }
362 |
363 | return ioutil.TempFile(dir, pattern)
364 | }
365 |
366 | func System() *IOStreams {
367 | stdoutIsTTY := isTerminal(os.Stdout)
368 | stderrIsTTY := isTerminal(os.Stderr)
369 |
370 | assumeTrueColor := false
371 |
372 | if stdoutIsTTY {
373 | if err := enableVirtualTerminalProcessing(os.Stdout); err == nil {
374 | assumeTrueColor = true
375 | }
376 | }
377 |
378 | io := &IOStreams{
379 | In: os.Stdin,
380 | originalOut: os.Stdout,
381 | Out: colorable.NewColorable(os.Stdout),
382 | ErrOut: colorable.NewColorable(os.Stderr),
383 | colorEnabled: EnvColorForced() || (!EnvColorDisabled() && stdoutIsTTY),
384 | is256enabled: assumeTrueColor || Is256ColorSupported(),
385 | hasTrueColor: assumeTrueColor || IsTrueColorSupported(),
386 | ttySize: ttySize,
387 | }
388 |
389 | if stdoutIsTTY && stderrIsTTY {
390 | io.progressIndicatorEnabled = true
391 | }
392 |
393 | // prevent duplicate isTerminal queries now that we know the answer
394 | io.SetStdoutTTY(stdoutIsTTY)
395 | io.SetStderrTTY(stderrIsTTY)
396 |
397 | return io
398 | }
399 |
400 | func Test() (*IOStreams, *bytes.Buffer, *bytes.Buffer, *bytes.Buffer) {
401 | in := &bytes.Buffer{}
402 | out := &bytes.Buffer{}
403 | errOut := &bytes.Buffer{}
404 |
405 | return &IOStreams{
406 | In: ioutil.NopCloser(in),
407 | Out: out,
408 | ErrOut: errOut,
409 | ttySize: func() (int, int, error) {
410 | return -1, -1, errors.New("ttySize not implemented in tests")
411 | },
412 | }, in, out, errOut
413 | }
414 |
415 | func isTerminal(f *os.File) bool {
416 | return isatty.IsTerminal(f.Fd()) || isatty.IsCygwinTerminal(f.Fd())
417 | }
418 |
419 | func isCygwinTerminal(w io.Writer) bool {
420 | if f, isFile := w.(*os.File); isFile {
421 | return isatty.IsCygwinTerminal(f.Fd())
422 | }
423 |
424 | return false
425 | }
426 |
427 | // terminalSize measures the viewport of the terminal that the output stream is connected to
428 | func terminalSize(w io.Writer) (int, int, error) {
429 | if f, isFile := w.(*os.File); isFile {
430 | return term.GetSize(int(f.Fd()))
431 | }
432 |
433 | return 0, 0, fmt.Errorf("%v is not a file", w)
434 | }
435 |
--------------------------------------------------------------------------------
/ios/tty_size.go:
--------------------------------------------------------------------------------
1 | //go:build !windows
2 | // +build !windows
3 |
4 | package ios
5 |
6 | import (
7 | "os"
8 |
9 | "golang.org/x/term"
10 | )
11 |
12 | // ttySize measures the size of the controlling terminal for the current process
13 | func ttySize() (int, int, error) {
14 | f, err := os.Open("/dev/tty")
15 |
16 | if err != nil {
17 | return -1, -1, err
18 | }
19 |
20 | defer f.Close()
21 |
22 | return term.GetSize(int(f.Fd()))
23 | }
24 |
--------------------------------------------------------------------------------
/ios/tty_size_windows.go:
--------------------------------------------------------------------------------
1 | package ios
2 |
3 | import (
4 | "os"
5 |
6 | "golang.org/x/term"
7 | )
8 |
9 | func ttySize() (int, int, error) {
10 | f, err := os.Open("CONOUT$")
11 |
12 | if err != nil {
13 | return -1, -1, err
14 | }
15 |
16 | defer f.Close()
17 |
18 | return term.GetSize(int(f.Fd()))
19 | }
20 |
--------------------------------------------------------------------------------
/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "os"
5 | "fmt"
6 | "errors"
7 | "runtime"
8 |
9 | "github.com/mgutz/ansi"
10 | "github.com/spf13/cobra"
11 | "github.com/abdfnx/instal/tools"
12 | "github.com/abdfnx/instal/cmd/instal"
13 | "github.com/abdfnx/instal/cmd/factory"
14 | "github.com/abdfnx/instal/core/checker"
15 | "github.com/AlecAivazis/survey/v2/terminal"
16 | surveyCore "github.com/AlecAivazis/survey/v2/core"
17 | )
18 |
19 | var (
20 | version string
21 | buildDate string
22 | )
23 |
24 | type exitCode int
25 |
26 | const (
27 | exitOK exitCode = 0
28 | exitError exitCode = 1
29 | exitCancel exitCode = 2
30 | )
31 |
32 | func main() {
33 | code := mainRun()
34 | os.Exit(int(code))
35 | }
36 |
37 | func mainRun() exitCode {
38 | runtime.LockOSThread()
39 |
40 | cmdFactory := factory.New()
41 | hasDebug := os.Getenv("DEBUG") != ""
42 | stderr := cmdFactory.IOStreams.ErrOut
43 |
44 | if !cmdFactory.IOStreams.ColorEnabled() {
45 | surveyCore.DisableColor = true
46 | } else {
47 | surveyCore.TemplateFuncsWithColor["color"] = func(style string) string {
48 | switch style {
49 | case "white":
50 | if cmdFactory.IOStreams.ColorSupport256() {
51 | return fmt.Sprintf("\x1b[%d;5;%dm", 38, 242)
52 | }
53 |
54 | return ansi.ColorCode("default")
55 |
56 | default:
57 | return ansi.ColorCode(style)
58 | }
59 | }
60 | }
61 |
62 | if len(os.Args) > 1 && os.Args[1] != "" {
63 | cobra.MousetrapHelpText = ""
64 | }
65 |
66 | RootCmd := instal.Execute(cmdFactory, version, buildDate)
67 |
68 | if cmd, err := RootCmd.ExecuteC(); err != nil {
69 | if err == tools.SilentError {
70 | return exitError
71 | } else if tools.IsUserCancellation(err) {
72 | if errors.Is(err, terminal.InterruptErr) {
73 | fmt.Fprint(stderr, "\n")
74 | }
75 |
76 | return exitCancel
77 | }
78 |
79 | tools.PrintError(stderr, err, cmd, hasDebug)
80 |
81 | return exitError
82 | }
83 |
84 | if instal.HasFailed() {
85 | return exitError
86 | }
87 |
88 | if len(os.Args) > 1 && os.Args[1] != "instal" {
89 | checker.Check(version)
90 | }
91 |
92 | return exitOK
93 | }
94 |
--------------------------------------------------------------------------------
/scripts/bfs.ps1:
--------------------------------------------------------------------------------
1 | # Build From Source
2 | $loc = "$HOME\AppData\Local\instal"
3 |
4 | go run scripts/date.go >> date.txt
5 |
6 | $LATEST_VERSION=git describe --abbrev=0 --tags
7 | $DATE=cat date.txt
8 |
9 | # Build
10 | go mod tidy
11 | go build -o instal.exe -ldflags "-X main.version=$LATEST_VERSION -X main.versionDate=$DATE"
12 |
13 | # Setup
14 | $BIN = "$loc\bin"
15 | New-Item -ItemType "directory" -Path $BIN
16 | Move-Item instal.exe -Destination $BIN
17 | [System.Environment]::SetEnvironmentVariable("Path", $Env:Path + ";$BIN", [System.EnvironmentVariableTarget]::User)
18 |
19 | if (Test-Path -path $loc) {
20 | Write-Host "Instal was built successfully, refresh your powershell and then run 'instal --help'" -ForegroundColor DarkGreen
21 | } else {
22 | Write-Host "Build failed" -ForegroundColor Red
23 | }
24 |
--------------------------------------------------------------------------------
/scripts/date.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "time"
6 | )
7 |
8 | func main() {
9 | currentTime := time.Now()
10 |
11 | fmt.Println("(" + currentTime.Format("2006-01-02") + ")")
12 | }
13 |
--------------------------------------------------------------------------------
/scripts/gh-instal/gh-ins.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const path = require("path");
3 | const rm = require("rimraf");
4 | const mkdirp = require("mkdirp");
5 | const sh = require("shelljs");
6 |
7 | const VERSION_CMD = sh.exec("git describe --abbrev=0 --tags");
8 | const VERSION_DATE_CMD = sh.exec("go run ./scripts/date.go");
9 |
10 | const VERSION = VERSION_CMD.replace("\n", "").replace("\r", "");
11 | const VERSION_DATE = VERSION_DATE_CMD.replace("\n", "").replace("\r", "");
12 |
13 | const ROOT = __dirname;
14 | const TEMPLATES = path.join(ROOT, "templates");
15 |
16 | async function updateInstalExtension(ghInstalDir) {
17 | const templatePath = path.join(TEMPLATES, "gh-instal");
18 | const template = fs.readFileSync(templatePath).toString("utf-8");
19 |
20 | const templateReplaced = template
21 | .replace("CLI_VERSION", VERSION)
22 | .replace("CLI_VERSION_DATE", VERSION_DATE);
23 |
24 | fs.writeFileSync(path.join(ghInstalDir, "gh-instal"), templateReplaced);
25 | }
26 |
27 | async function updateExtension() {
28 | const tmp = path.join(__dirname, "tmp");
29 | const extensionDir = path.join(tmp, "gh-instal");
30 |
31 | mkdirp.sync(tmp);
32 | rm.sync(extensionDir);
33 |
34 | console.log(`cloning https://github.com/abdfnx/gh-instal to ${extensionDir}`);
35 |
36 | sh.exec(`git clone https://github.com/abdfnx/gh-instal.git ${extensionDir}`)
37 |
38 | console.log(`done cloning abdfnx/gh-instal to ${extensionDir}`);
39 |
40 | console.log("updating local git...");
41 |
42 | await updateInstalExtension(extensionDir);
43 | }
44 |
45 | updateExtension().catch((err) => {
46 | console.error(`error running scripts/gh-instal/gh-ins.js`, err);
47 | process.exit(1);
48 | });
49 |
--------------------------------------------------------------------------------
/scripts/gh-instal/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "gh-ins-brew",
3 | "version": "0.0.0",
4 | "description": "gh cli extension of tran",
5 | "author": "@abdfnx",
6 | "main": "gh-ins.js",
7 | "scripts": {
8 | "start": "node gh-ins.js"
9 | },
10 | "keywords": [
11 | "tran",
12 | "github"
13 | ],
14 | "dependencies": {
15 | "mkdirp": "^1.0.4",
16 | "rimraf": "^3.0.2",
17 | "shelljs": "^0.8.5"
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/scripts/gh-instal/templates/gh-instal:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | set -e
3 |
4 | repo="abdfnx/gh-instal"
5 | tag="CLI_VERSION"
6 | buildDate="CLI_VERSION_DATE"
7 |
8 | extensionPath="$(dirname "$0")"
9 | arch="$(uname -m)"
10 |
11 | exe=""
12 |
13 | if uname -a | grep Msys > /dev/null; then
14 | if [ $arch = "x86_64" ]; then
15 | exe="windows-x86_64"
16 | elif [ $arch = "i686" ]; then
17 | exe="windows-i386"
18 | elif [ $arch = "i386" ]; then
19 | exe="windows-i386"
20 | fi
21 | elif uname -a | grep Darwin > /dev/null; then
22 | if [ $arch = "x86_64" ]; then
23 | exe="darwin-x86_64"
24 | fi
25 | elif uname -a | grep Linux > /dev/null; then
26 | if [ $arch = "x86_64" ]; then
27 | exe="linux-x86_64"
28 | elif [ $arch = "i686" ]; then
29 | exe="linux-i38"
30 | elif [ $arch = "i386" ]; then
31 | exe="linux-i386"
32 | fi
33 | fi
34 |
35 | if [ "${exe}" == "" ]; then
36 | if [ "$(which go)" = "" ]; then
37 | echo "go must be installed to use this gh extension on this platform"
38 | exit 1
39 | fi
40 |
41 | exe="cmd.out"
42 |
43 | cd "${extensionPath}" > /dev/null
44 | go build -o "${exe}" -ldflags "-X main.version=${tag} -X main.buildDate=${buildDate}"
45 | cd - > /dev/null
46 | else
47 | if [[ ! -x "${extensionPath}/bin/${exe}" ]]; then
48 | mkdir -p "${extensionPath}/bin"
49 | rm -f "${extensionPath}/bin/*"
50 | gh release -R"${repo}" download "${tag}" -p "${exe}" --dir="${extensionPath}/bin"
51 | chmod +x "${extensionPath}/bin/${exe}"
52 | fi
53 | fi
54 |
55 | exec "${extensionPath}/bin/${exe}" "$@"
56 |
--------------------------------------------------------------------------------
/scripts/gh-instal/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | balanced-match@^1.0.0:
6 | version "1.0.2"
7 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
8 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
9 |
10 | brace-expansion@^1.1.7:
11 | version "1.1.11"
12 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
13 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
14 | dependencies:
15 | balanced-match "^1.0.0"
16 | concat-map "0.0.1"
17 |
18 | concat-map@0.0.1:
19 | version "0.0.1"
20 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
21 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
22 |
23 | fs.realpath@^1.0.0:
24 | version "1.0.0"
25 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
26 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
27 |
28 | function-bind@^1.1.1:
29 | version "1.1.1"
30 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
31 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
32 |
33 | glob@^7.0.0, glob@^7.1.3:
34 | version "7.2.0"
35 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
36 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
37 | dependencies:
38 | fs.realpath "^1.0.0"
39 | inflight "^1.0.4"
40 | inherits "2"
41 | minimatch "^3.0.4"
42 | once "^1.3.0"
43 | path-is-absolute "^1.0.0"
44 |
45 | has@^1.0.3:
46 | version "1.0.3"
47 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
48 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
49 | dependencies:
50 | function-bind "^1.1.1"
51 |
52 | inflight@^1.0.4:
53 | version "1.0.6"
54 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
55 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
56 | dependencies:
57 | once "^1.3.0"
58 | wrappy "1"
59 |
60 | inherits@2:
61 | version "2.0.4"
62 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
63 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
64 |
65 | interpret@^1.0.0:
66 | version "1.4.0"
67 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e"
68 | integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==
69 |
70 | is-core-module@^2.8.1:
71 | version "2.8.1"
72 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
73 | integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
74 | dependencies:
75 | has "^1.0.3"
76 |
77 | minimatch@^3.0.4:
78 | version "3.1.2"
79 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
80 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
81 | dependencies:
82 | brace-expansion "^1.1.7"
83 |
84 | mkdirp@^1.0.4:
85 | version "1.0.4"
86 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
87 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
88 |
89 | once@^1.3.0:
90 | version "1.4.0"
91 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
92 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
93 | dependencies:
94 | wrappy "1"
95 |
96 | path-is-absolute@^1.0.0:
97 | version "1.0.1"
98 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
99 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
100 |
101 | path-parse@^1.0.7:
102 | version "1.0.7"
103 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
104 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
105 |
106 | rechoir@^0.6.2:
107 | version "0.6.2"
108 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
109 | integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=
110 | dependencies:
111 | resolve "^1.1.6"
112 |
113 | resolve@^1.1.6:
114 | version "1.22.0"
115 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
116 | integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
117 | dependencies:
118 | is-core-module "^2.8.1"
119 | path-parse "^1.0.7"
120 | supports-preserve-symlinks-flag "^1.0.0"
121 |
122 | rimraf@^3.0.2:
123 | version "3.0.2"
124 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
125 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
126 | dependencies:
127 | glob "^7.1.3"
128 |
129 | shelljs@^0.8.5:
130 | version "0.8.5"
131 | resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c"
132 | integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==
133 | dependencies:
134 | glob "^7.0.0"
135 | interpret "^1.0.0"
136 | rechoir "^0.6.2"
137 |
138 | supports-preserve-symlinks-flag@^1.0.0:
139 | version "1.0.0"
140 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
141 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
142 |
143 | wrappy@1:
144 | version "1.0.2"
145 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
146 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
147 |
--------------------------------------------------------------------------------
/scripts/install.ps1:
--------------------------------------------------------------------------------
1 | # get latest release
2 | $release_url = "https://api.github.com/repos/abdfnx/instal/releases"
3 | $tag = (Invoke-WebRequest -Uri $release_url -UseBasicParsing | ConvertFrom-Json)[0].tag_name
4 | $loc = "$HOME\AppData\Local\instal"
5 | $url = ""
6 | $arch = $env:PROCESSOR_ARCHITECTURE
7 | $releases_api_url = "https://github.com/abdfnx/instal/releases/download/$tag/instal_windows_${tag}"
8 |
9 | if ($arch -eq "AMD64") {
10 | $url = "${releases_api_url}_amd64.zip"
11 | } elseif ($arch -eq "x86") {
12 | $url = "${releases_api_url}_386.zip"
13 | } elseif ($arch -eq "arm") {
14 | $url = "${releases_api_url}_arm.zip"
15 | } elseif ($arch -eq "arm64") {
16 | $url = "${releases_api_url}_arm64.zip"
17 | }
18 |
19 | if (Test-Path -path $loc) {
20 | Remove-Item $loc -Recurse -Force
21 | }
22 |
23 | Write-Host "Installing instal version $tag" -ForegroundColor DarkCyan
24 |
25 | Invoke-WebRequest $url -outfile instal_windows.zip
26 |
27 | Expand-Archive instal_windows.zip
28 |
29 | New-Item -ItemType "directory" -Path $loc
30 |
31 | Move-Item -Path instal_windows\bin -Destination $loc
32 |
33 | Remove-Item instal_windows* -Recurse -Force
34 |
35 | [System.Environment]::SetEnvironmentVariable("Path", $Env:Path + ";$loc\bin", [System.EnvironmentVariableTarget]::User)
36 |
37 | if (Test-Path -path $loc) {
38 | Write-Host "Thanks for installing Instal! Now Refresh your powershell" -ForegroundColor DarkGreen
39 | Write-Host "If this is your first time using the CLI, be sure to run 'instal --help' first." -ForegroundColor DarkGreen
40 | } else {
41 | Write-Host "Download failed" -ForegroundColor Red
42 | Write-Host "Please try again later" -ForegroundColor Red
43 | }
44 |
--------------------------------------------------------------------------------
/scripts/install.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | installPath=$1
4 | instalPath=""
5 |
6 | if [ "$installPath" != "" ]; then
7 | instalPath=$installPath
8 | else
9 | instalPath=/usr/local/bin
10 | fi
11 |
12 | UNAME=$(uname)
13 | ARCH=$(uname -m)
14 |
15 | rmOldFiles() {
16 | if [ -f $instalPath/instal ]; then
17 | sudo rm -rf $instalPath/instal*
18 | fi
19 | }
20 |
21 | v=$(curl --silent "https://api.github.com/repos/abdfnx/instal/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
22 |
23 | releases_api_url=https://github.com/abdfnx/instal/releases/download
24 |
25 | successInstall() {
26 | echo "🙏 Thanks for installing Instal! If this is your first time using the CLI, be sure to run `instal --help` first."
27 | }
28 |
29 | mainCheck() {
30 | echo "Installing instal version $v"
31 | name=""
32 |
33 | if [ "$UNAME" == "Linux" ]; then
34 | if [ $ARCH = "x86_64" ]; then
35 | name="instal_linux_${v}_amd64"
36 | elif [ $ARCH = "i686" ]; then
37 | name="instal_linux_${v}_386"
38 | elif [ $ARCH = "i386" ]; then
39 | name="instal_linux_${v}_386"
40 | elif [ $ARCH = "arm64" ]; then
41 | name="instal_linux_${v}_arm64"
42 | elif [ $ARCH = "arm" ]; then
43 | name="instal_linux_${v}_arm"
44 | fi
45 |
46 | instalURL=$releases_api_url/$v/$name.zip
47 |
48 | wget $instalURL
49 | sudo chmod 755 $name.zip
50 | unzip $name.zip
51 | rm $name.zip
52 |
53 | # instal
54 | sudo mv $name/bin/instal $instalPath
55 |
56 | rm -rf $name
57 |
58 | elif [ "$UNAME" == "Darwin" ]; then
59 | if [ $ARCH = "x86_64" ]; then
60 | name="instal_macos_${v}_amd64"
61 | elif [ $ARCH = "arm64" ]; then
62 | name="instal_macos_${v}_arm64"
63 | fi
64 |
65 | instalURL=$releases_api_url/$v/$name.zip
66 |
67 | wget $instalURL
68 | sudo chmod 755 $name.zip
69 | unzip $name.zip
70 | rm $name.zip
71 |
72 | # instal
73 | sudo mv $name/bin/instal $instalPath
74 |
75 | rm -rf $name
76 |
77 | elif [ "$UNAME" == "FreeBSD" ]; then
78 | if [ $ARCH = "x86_64" ]; then
79 | name="instal_freebsd_${v}_amd64"
80 | elif [ $ARCH = "i386" ]; then
81 | name="instal_freebsd_${v}_386"
82 | elif [ $ARCH = "i686" ]; then
83 | name="instal_freebsd_${v}_386"
84 | elif [ $ARCH = "arm64" ]; then
85 | name="instal_freebsd_${v}_arm64"
86 | elif [ $ARCH = "arm" ]; then
87 | name="instal_freebsd_${v}_arm"
88 | fi
89 |
90 | instalURL=$releases_api_url/$v/$name.zip
91 |
92 | wget $instalURL
93 | sudo chmod 755 $name.zip
94 | unzip $name.zip
95 | rm $name.zip
96 |
97 | # instal
98 | sudo mv $name/bin/instal $instalPath
99 |
100 | rm -rf $name
101 | fi
102 |
103 | # chmod
104 | sudo chmod 755 $instalPath/instal
105 | }
106 |
107 | rmOldFiles
108 | mainCheck
109 |
110 | if [ -x "$(command -v instal)" ]; then
111 | successInstall
112 | else
113 | echo "Download failed 😔"
114 | echo "Please try again."
115 | fi
116 |
--------------------------------------------------------------------------------
/scripts/tag.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | tag="${1}"
4 |
5 | while (($#)); do
6 | case "$2" in
7 |
8 | -a)
9 | git tag -a "${tag}" -m ""
10 | exit 0
11 | ;;
12 |
13 | -p)
14 | git push origin "${tag}"
15 | exit 0
16 | ;;
17 |
18 | -x)
19 | git tag -a "${tag}" -m ""
20 | git push origin "${tag}"
21 | exit 0
22 | ;;
23 |
24 | -d)
25 | git tag -d "${tag}"
26 | git push --delete origin "${tag}"
27 | exit 0
28 | ;;
29 |
30 | esac
31 | done
32 |
--------------------------------------------------------------------------------
/tools/errors.go:
--------------------------------------------------------------------------------
1 | package tools
2 |
3 | import (
4 | "io"
5 | "fmt"
6 | "net"
7 | "errors"
8 | "strings"
9 |
10 | "github.com/spf13/cobra"
11 | "github.com/AlecAivazis/survey/v2/terminal"
12 | )
13 |
14 | // FlagError is the kind of error raised in flag processing
15 | type FlagError struct {
16 | Err error
17 | }
18 |
19 | func (fe FlagError) Error() string {
20 | return fe.Err.Error()
21 | }
22 |
23 | func (fe FlagError) Unwrap() error {
24 | return fe.Err
25 | }
26 |
27 | // SilentError is an error that triggers exit code 1 without any error messaging
28 | var SilentError = errors.New("SilentError")
29 |
30 | // CancelError signals user-initiated cancellation
31 | var CancelError = errors.New("CancelError")
32 |
33 | func IsUserCancellation(err error) bool {
34 | return errors.Is(err, CancelError) || errors.Is(err, terminal.InterruptErr)
35 | }
36 |
37 | func MutuallyExclusive(message string, conditions ...bool) error {
38 | numTrue := 0
39 |
40 | for _, ok := range conditions {
41 | if ok {
42 | numTrue++
43 | }
44 | }
45 |
46 | if numTrue > 1 {
47 | return &FlagError{Err: errors.New(message)}
48 | }
49 |
50 | return nil
51 | }
52 |
53 | func PrintError(out io.Writer, err error, cmd *cobra.Command, debug bool) {
54 | var dnsError *net.DNSError
55 |
56 | if errors.As(err, &dnsError) {
57 | fmt.Fprintf(out, "error connecting to %s\n", dnsError.Name)
58 |
59 | if debug {
60 | fmt.Fprintln(out, dnsError)
61 | }
62 |
63 | return
64 | }
65 |
66 | fmt.Fprintln(out, err)
67 |
68 | var flagError *FlagError
69 | if errors.As(err, &flagError) || strings.HasPrefix(err.Error(), "unknown command ") {
70 | if !strings.HasSuffix(err.Error(), "\n") {
71 | fmt.Fprintln(out)
72 | }
73 |
74 | fmt.Fprintln(out, cmd.UsageString())
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/tools/text.go:
--------------------------------------------------------------------------------
1 | package tools
2 |
3 | import (
4 | "regexp"
5 | "strings"
6 |
7 | "github.com/muesli/reflow/ansi"
8 | "github.com/muesli/reflow/truncate"
9 | )
10 |
11 | var (
12 | ellipsis = "..."
13 | minWidthForEllipsis = len(ellipsis) + 2
14 | lineRE = regexp.MustCompile(`(?m)^`)
15 | ws = regexp.MustCompile(`\s+`)
16 | )
17 |
18 | func Indent(s, indent string) string {
19 | if len(strings.TrimSpace(s)) == 0 {
20 | return s
21 | }
22 |
23 | return lineRE.ReplaceAllLiteralString(s, indent)
24 | }
25 |
26 | func ReplaceExcessiveWhitespace(s string) string {
27 | return ws.ReplaceAllString(strings.TrimSpace(s), " ")
28 | }
29 |
30 | // DisplayWidth calculates what the rendered width of a string may be
31 | func DisplayWidth(s string) int {
32 | return ansi.PrintableRuneWidth(s)
33 | }
34 |
35 | // Truncate shortens a string to fit the maximum display width
36 | func Truncate(maxWidth int, s string) string {
37 | w := DisplayWidth(s)
38 | if w <= maxWidth {
39 | return s
40 | }
41 |
42 | tail := ""
43 | if maxWidth >= minWidthForEllipsis {
44 | tail = ellipsis
45 | }
46 |
47 | r := truncate.StringWithTail(s, uint(maxWidth), tail)
48 | if DisplayWidth(r) < maxWidth {
49 | r += " "
50 | }
51 |
52 | return r
53 | }
54 |
55 | // TruncateColumn replaces the first new line character with an ellipsis
56 | // and shortens a string to fit the maximum display width
57 | func TruncateColumn(maxWidth int, s string) string {
58 | if i := strings.IndexAny(s, "\r\n"); i >= 0 {
59 | s = s[:i] + ellipsis
60 | }
61 |
62 | return Truncate(maxWidth, s)
63 | }
64 |
--------------------------------------------------------------------------------