Showing preview only (1,517K chars total). Download the full file or copy to clipboard to get everything.
Repository: rwxrob/dot
Branch: main
Commit: d0d9eccb3834
Files: 488
Total size: 1.4 MB
Directory structure:
gitextract_e3a5rptn/
├── .bashrc
├── .dircolors
├── .dockerignore
├── .gitconfig
├── .github/
│ └── FUNDING.yml
├── .gitignore
├── .inputrc
├── .profile
├── .wezterm.lua
├── DCO
├── LICENSE
├── README.md
├── docker/
│ ├── README.md
│ ├── completion
│ └── setup
├── gh/
│ ├── config.yml
│ └── setup
├── git/
│ ├── .git-templates/
│ │ └── hooks/
│ │ └── pre-commit
│ └── setup
├── go.mod
├── go.sum
├── go.work
├── go.work.sum
├── iam/
│ ├── config.yaml
│ └── setup
├── install/
│ ├── README.md
│ ├── mac/
│ │ ├── gruvbox-dark.terminal
│ │ ├── install-keg
│ │ ├── install-most-stuff-with-brew
│ │ ├── install-neo
│ │ ├── install-pomo
│ │ ├── install-twurl
│ │ ├── install-vault
│ │ └── iterm2/
│ │ └── rwxrob.json
│ ├── ubuntu/
│ │ ├── fix-clone
│ │ ├── install-ansible
│ │ ├── install-avahi
│ │ ├── install-calico
│ │ ├── install-chrome
│ │ ├── install-conftest
│ │ ├── install-containerd
│ │ ├── install-csi-nfs
│ │ ├── install-discord
│ │ ├── install-docker
│ │ ├── install-docker-compose
│ │ ├── install-etcd
│ │ ├── install-firebase
│ │ ├── install-gh
│ │ ├── install-go
│ │ ├── install-goreleaser
│ │ ├── install-helm
│ │ ├── install-hyperfine
│ │ ├── install-istioctl
│ │ ├── install-k9s
│ │ ├── install-keg
│ │ ├── install-kind
│ │ ├── install-kompose
│ │ ├── install-kubeadm
│ │ ├── install-kubectl
│ │ ├── install-kubelet
│ │ ├── install-kubevip
│ │ ├── install-kvm
│ │ ├── install-minikube
│ │ ├── install-mkdocs
│ │ ├── install-mods
│ │ ├── install-most-stuff-with-apt
│ │ ├── install-neo
│ │ ├── install-ngrok
│ │ ├── install-obs-captions-plugin
│ │ ├── install-pandoc
│ │ ├── install-podman
│ │ ├── install-pomo
│ │ ├── install-talosctl
│ │ ├── install-terraform
│ │ ├── install-twurl
│ │ ├── install-vagrant
│ │ ├── install-vault
│ │ ├── install-yq
│ │ ├── run-kubeadm-init
│ │ └── setup-vault-server-for-k8s
│ └── windows/
│ ├── README.md
│ └── terminal/
│ └── settings.json
├── k9s/
│ ├── config.yml
│ ├── setup
│ └── skin.yml
├── lynx/
│ ├── README.md
│ ├── lynx.cfg
│ ├── lynx.lss
│ └── setup
├── obs/
│ ├── README.md
│ └── rtirl.md
├── podman/
│ ├── README.md
│ ├── completion
│ └── setup
├── scripts/
│ ├── 1to10
│ ├── 255color
│ ├── README.md
│ ├── _old/
│ │ ├── compexample
│ │ ├── gh
│ │ ├── kn
│ │ ├── log
│ │ └── sunrise
│ ├── ageof
│ ├── allfigl
│ ├── aln
│ ├── andthen
│ ├── anton
│ ├── ar
│ ├── asciisampler
│ ├── b
│ ├── back
│ ├── ban
│ ├── bandit
│ ├── banner
│ ├── bannerfish
│ ├── bannerlights
│ ├── bannerneo
│ ├── bashentrtest
│ ├── bashmatrix
│ ├── battery
│ ├── bing
│ ├── blankpane
│ ├── bug
│ ├── build
│ ├── buildadoc
│ ├── bullets
│ ├── cal
│ ├── calendar
│ ├── cast
│ ├── catc
│ ├── catscript
│ ├── cdpath
│ ├── changed
│ ├── chat
│ ├── cheat
│ ├── checkurls
│ ├── chsuffix
│ ├── cl
│ ├── clip
│ ├── close
│ ├── cmdhtitles
│ ├── colorstrip
│ ├── commandfrom
│ ├── comment
│ ├── commentthis
│ ├── confirm
│ ├── contexts
│ ├── countdown
│ ├── countincol
│ ├── countmin
│ ├── countmin.tdy
│ ├── countweeks
│ ├── covid
│ ├── coworking
│ ├── cozycoding
│ ├── crnd
│ ├── cronoji
│ ├── curllast
│ ├── currently
│ ├── d
│ ├── dancing
│ ├── dangerln
│ ├── datepath
│ ├── ddd
│ ├── defmain
│ ├── distro
│ ├── dockerclean
│ ├── document
│ ├── doh
│ ├── dprune
│ ├── dquote
│ ├── dstopall
│ ├── duck
│ ├── echon
│ ├── eject
│ ├── ending
│ ├── enhancement
│ ├── ex
│ ├── extract
│ ├── f
│ ├── faqoff
│ ├── figl
│ ├── fiocheck
│ ├── fishies
│ ├── fixapost
│ ├── fmttable
│ ├── frombase2
│ ├── funcsin
│ ├── ghtable
│ ├── gidof
│ ├── giveabout
│ ├── givediscord
│ ├── giveperl
│ ├── giver
│ ├── giveraw
│ ├── gl
│ ├── gmi
│ ├── gobadges
│ ├── goc
│ ├── goclean
│ ├── gocopyright
│ ├── godistbuild
│ ├── godocs
│ ├── goduckyourself
│ ├── goentrtest
│ ├── goerrgen
│ ├── goi
│ ├── goimethods
│ ├── gologtestoutput
│ ├── gomethods
│ ├── goodfirst
│ ├── google
│ ├── goprintasjson
│ ├── gor
│ ├── gosetget
│ ├── got
│ ├── gotestoutput
│ ├── gotests
│ ├── gott
│ ├── gpgcreate
│ ├── gpt
│ ├── grepall
│ ├── gstreamd
│ ├── haschanged
│ ├── hasissue
│ ├── hboostdates
│ ├── headerlist
│ ├── heightwidth
│ ├── helm-app-version-for-chart-version
│ ├── helm-chart-version-for-app-version
│ ├── hex2rgb
│ ├── hidecursor
│ ├── hlog
│ ├── hnow
│ ├── host
│ ├── hrule
│ ├── hsep
│ ├── htbtasks
│ ├── htitle
│ ├── humm
│ ├── inow
│ ├── ips
│ ├── isosec
│ ├── isosec2plain
│ ├── issue
│ ├── issues
│ ├── istext
│ ├── ix
│ ├── jsonesc
│ ├── justhelm
│ ├── k
│ ├── k8sapp
│ ├── k8sroot
│ ├── keyoff
│ ├── keyon
│ ├── kgetall
│ ├── kgp
│ ├── kn
│ ├── krap
│ ├── kubfree
│ ├── kurl
│ ├── kwait
│ ├── label
│ ├── labstream
│ ├── landscape
│ ├── lastbookmark
│ ├── lastdown
│ ├── lastpic
│ ├── lasturl
│ ├── latest
│ ├── lh
│ ├── listening
│ ├── livecal
│ ├── liveicon
│ ├── lorem
│ ├── lslinks
│ ├── lynx
│ ├── lynxa
│ ├── lynxar
│ ├── lynxlast
│ ├── m
│ ├── mark
│ ├── marquee
│ ├── md
│ ├── mdold
│ ├── mentor
│ ├── mimetype
│ ├── mk
│ ├── mkv2isosec
│ ├── mkv2mp4
│ ├── mkvlast
│ ├── mode2yaml
│ ├── monthstable
│ ├── mute
│ ├── muted
│ ├── mvlast
│ ├── mvlastpic
│ ├── mvmkv2isosec
│ ├── myip
│ ├── mytrace
│ ├── namespace
│ ├── netshoot
│ ├── newest
│ ├── newx
│ ├── nohup.out
│ ├── nopath
│ ├── now
│ ├── nowshort
│ ├── ns
│ ├── numweek
│ ├── off
│ ├── onchange
│ ├── opacity
│ ├── open
│ ├── openlast
│ ├── openlastvid
│ ├── origins
│ ├── outline1
│ ├── pae
│ ├── path
│ ├── pb
│ ├── pdf
│ ├── pdgit
│ ├── pdhas
│ ├── phone
│ ├── pkghas
│ ├── post
│ ├── powerzones
│ ├── ppae
│ ├── ppie
│ ├── ppp
│ ├── ppplast
│ ├── pre
│ ├── preview
│ ├── printfargs
│ ├── protonum
│ ├── pubkey
│ ├── push
│ ├── pwdname
│ ├── pylights
│ ├── qreview
│ ├── question
│ ├── quotes
│ ├── raid
│ ├── recording
│ ├── regrepos
│ ├── remotetags
│ ├── resolvtog
│ ├── rndcolor
│ ├── roll20
│ ├── rot13
│ ├── run
│ ├── rund
│ ├── rwxrob
│ ├── save
│ ├── savedot
│ ├── scan
│ ├── scentr
│ ├── sched
│ ├── screenkey
│ ├── searx
│ ├── sec2dur
│ ├── semver-sort
│ ├── sentencecase
│ ├── sgoget
│ ├── showcursor
│ ├── sing
│ ├── skeys
│ ├── snip
│ ├── song
│ ├── songnext
│ ├── ssection
│ ├── sshkey
│ ├── sshspeedtest
│ ├── starting
│ ├── startvms
│ ├── stripesc
│ ├── swag
│ ├── symlink
│ ├── sysderrors
│ ├── syserrors
│ ├── t
│ ├── tags
│ ├── tbanner
│ ├── tclip
│ ├── telln
│ ├── termcolors
│ ├── tf
│ ├── tmatrix
│ ├── tmuxin
│ ├── tmuxinplain
│ ├── tmuxlive
│ ├── tobase2
│ ├── toduck
│ ├── toemoji
│ ├── tohd
│ ├── tolower
│ ├── topdu
│ ├── topegntokfilter
│ ├── topic
│ ├── topics
│ ├── tot
│ ├── trapterm
│ ├── twitch-formats
│ ├── twitch-mock-app-token
│ ├── twitch-mock-clientid
│ ├── twitch-mock-clientsecret
│ ├── twitch-mock-users-logins
│ ├── twitch-view
│ ├── twitch.sh
│ ├── twitchcat
│ ├── twitchcat2yaml
│ ├── twitter
│ ├── txt
│ ├── uidof
│ ├── underconstruction
│ ├── untag
│ ├── uppera
│ ├── upre
│ ├── urlencode
│ ├── urls
│ ├── usageln
│ ├── v
│ ├── vic
│ ├── vidoffset
│ ├── vidoffsetsec
│ ├── vids
│ ├── vilast
│ ├── vimcheat
│ ├── vimpluginstall
│ ├── w
│ ├── watchcow
│ ├── watching
│ ├── wd
│ ├── weather
│ ├── wee
│ ├── what
│ ├── wiki
│ ├── win2nixpath
│ ├── wipe
│ ├── ws
│ ├── x
│ ├── x_cmds
│ ├── youtube-dl-audio
│ ├── yqdiff
│ ├── yt-transcribe
│ ├── ytfoot
│ ├── yyy
│ └── zet4mkv
├── setup
├── snippets/
│ ├── README.md
│ ├── bash/
│ │ ├── buffer
│ │ ├── completion
│ │ ├── curlgl
│ │ ├── filter
│ │ ├── hasout
│ │ ├── have
│ │ ├── jsonstr
│ │ ├── latestghrel
│ │ ├── sec2hour
│ │ ├── trim
│ │ └── winexes
│ ├── foo
│ ├── go/
│ │ └── hello
│ ├── last
│ ├── nameemail
│ └── text/
│ ├── ytama
│ ├── ytfoot
│ └── ytlive
├── tmux/
│ ├── .tmux-live.conf
│ ├── .tmux-plain.conf
│ ├── .tmux.conf
│ ├── README.md
│ └── setup
├── vim/
│ ├── README.md
│ ├── init.lua
│ ├── plug.vim
│ ├── setup
│ └── vimrc
├── vm/
│ ├── .gitignore
│ ├── Makefile
│ ├── README.md
│ ├── dot.vmx.src
│ ├── meta-data
│ ├── network-config
│ ├── original/
│ │ └── build
│ └── user-data
└── weechat/
└── setup
================================================
FILE CONTENTS
================================================
================================================
FILE: .bashrc
================================================
#!/bin/bash
# shellcheck disable=SC1090,SC1091
case $- in
*i*) ;; # interactive
*) return ;;
esac
# ---------------------- local utility functions ---------------------
_have() { type "$1" &>/dev/null; }
_source_if() { [[ -r "$1" ]] && source "$1"; }
# ----------------------- environment variables ----------------------
export LANG=en_US.UTF-8
export USER="${USER:-$(whoami)}"
export GITUSER="$USER"
export TZ=America/New_York
export REPOS="$HOME/Repos"
export GHREPOS="$REPOS/github.com/$GITUSER"
export DOTFILES="$GHREPOS/dot"
export HELP_BROWSER=w3m
export DESKTOP="$HOME/Desktop"
export DOCUMENTS="$HOME/Documents"
export DOWNLOADS="$HOME/Downloads"
export TEMPLATES="$HOME/Templates"
export SCRIPTS="$HOME/Scripts"
export PUBLIC="$HOME/Public"
export PRIVATE="$HOME/Private"
export PICTURES="$HOME/Pictures"
export MUSIC="$HOME/Music"
export VIDEOS="$HOME/Movies"
export PDFS="$HOME/usb/pdfs"
export VIRTUALMACHINES="$HOME/VirtualMachines"
export CLIP_DIR="$VIDEOS/clips"
export CLIP_DATA="$GHREPOS/clip/data"
export CLIP_VOLUME=0
export CLIP_SCREEN=0
export CLICOLOR=1
export HRULEWIDTH=73
export GOPATH="$HOME/.local/go"
export GOBIN="$HOME/.local/bin"
export GOPROXY=direct
export NVIM_SCREENKEY=1
export CGO_ENABLED=0
export PYTHONDONTWRITEBYTECODE=2
export LC_COLLATE=C
export CFLAGS="-Wall -Wextra -Werror -O0 -g -fsanitize=address -fno-omit-frame-pointer -finstrument-functions"
# gruvbox-material
export LS_COLORS="di=38;5;245:fi=38;5;223:ln=38;5;179:ex=38;5;108:*.txt=38;5;223"
export LESS="-FXR"
export LESS_TERMCAP_md=$'\e[1;33m' # start bold (yellow)
export LESS_TERMCAP_mb=$'\e[1;35m' # start blinking (magenta)
export LESS_TERMCAP_me=$'\e[0m' # end bold/blinking
export LESS_TERMCAP_so=$'\e[38;5;108;1m' # start standout (green bold)
export LESS_TERMCAP_se=$'\e[0m' # end standout
export LESS_TERMCAP_us=$'\e[4m' # start underline
export LESS_TERMCAP_ue=$'\e[0m' # end underline
export ANSIBLE_CONFIG="$HOME/.config/ansible/config.ini"
export ANSIBLE_INVENTORY="$HOME/.config/ansible/inventory.yaml"
export ANSIBLE_LOAD_CALLBACK_PLUGINS=1
#export ANSIBLE_STDOUT_CALLBACK=json
export K8SAPP_CLUSTER=dev
[[ -d /.vim/spell ]] && export VIMSPELL=("$HOME/.vim/spell/*.add")
# ----------------------------- PostgreSQL ----------------------------
export PGPASS=~/.pgpass
# export PGHOST=localhost
# export PGUSER=myuser
# export PGDATABASE=mydatabase
# -------------------------------- gpg -------------------------------
GPG_TTY=$(tty)
export GPG_TTY
# ------------------------------- pager ------------------------------
if [[ -x /usr/bin/lesspipe ]]; then
export LESSOPEN="| /usr/bin/lesspipe %s"
export LESSCLOSE="/usr/bin/lesspipe %s %s"
fi
# ----------------------------- dircolors ----------------------------
if _have dircolors; then
if [[ -r "$HOME/.dircolors" ]]; then
eval "$(dircolors -b "$HOME/.dircolors")"
else
eval "$(dircolors -b)"
fi
fi
# ------------------------------- path -------------------------------
pathappend() {
declare arg
for arg in "$@"; do
test -d "$arg" || continue
PATH=${PATH//":$arg:"/:}
PATH=${PATH/#"$arg:"/}
PATH=${PATH/%":$arg"/}
export PATH="${PATH:+"$PATH:"}$arg"
done
} && export -f pathappend
pathprepend() {
for arg in "$@"; do
test -d "$arg" || continue
PATH=${PATH//:"$arg:"/:}
PATH=${PATH/#"$arg:"/}
PATH=${PATH/%":$arg"/}
export PATH="$arg${PATH:+":${PATH}"}"
done
} && export -f pathprepend
# remember last arg will be first in path
pathprepend \
"$HOME/.local/bin" \
"$HOME/.local/go/bin" \
"$GHREPOS/cmd-"* \
/usr/local/go/bin \
/usr/local/opt/openjdk/bin \
/usr/local/bin \
/opt/homebrew/bin \
"$SCRIPTS"
pathappend \
/usr/local/opt/coreutils/libexec/gnubin \
'/mnt/c/Windows' \
'/mnt/c/Program Files (x86)/VMware/VMware Workstation' \
/mingw64/bin \
/usr/local/bin \
/usr/local/sbin \
/usr/local/games \
/usr/games \
/usr/sbin \
/usr/bin \
/snap/bin \
/sbin \
/bin
# ------------------------------ cdpath ------------------------------
export CDPATH=".:$GHREPOS:$DOTFILES:$REPOS:/media/$USER:$HOME"
# ------------------------ bash shell options ------------------------
# shopt is for BASHOPTS, set is for SHELLOPTS
shopt -s checkwinsize # enables $COLUMNS and $ROWS
shopt -s expand_aliases
shopt -s globstar
shopt -s dotglob
shopt -s extglob
# -------------------------- stty annoyances -------------------------
stty -ixon # disable control-s/control-q tty flow control
# ------------------------------ history -----------------------------
export HISTCONTROL=ignoreboth
export HISTSIZE=5000
export HISTFILESIZE=10000
set -o vi
shopt -s histappend
# --------------------------- smart prompt ---------------------------
# (keeping in bashrc for portability)
PROMPT_LONG=20
PROMPT_MAX=95
PROMPT_AT=@
__ps1() {
local P='$' dir="${PWD##*/}" B countme short long double \
r='\[\e[31m\]' h='\[\e[34m\]' \
u='\[\e[33m\]' p='\[\e[34m\]' w='\[\e[35m\]' \
b='\[\e[36m\]' x='\[\e[0m\]' \
g="\[\033[38;2;90;82;76m\]"
[[ $EUID == 0 ]] && P='#' && u=$r && p=$u # root
[[ $PWD = / ]] && dir=/
[[ $PWD = "$HOME" ]] && dir='~'
B=$(git branch --show-current 2>/dev/null)
[[ $dir = "$B" ]] && B=.
countme="$USER$PROMPT_AT$(hostname):$dir($B)\$ "
[[ $B == master || $B == main ]] && b="$r"
[[ -n "$B" ]] && B="$g($b$B$g)"
short="$u\u$g$PROMPT_AT$h\h$g:$w$dir$B$p$P$x "
long="${g}╔$u\u$g$PROMPT_AT$h\h$g:$w$dir$B\n${g}╚$p$P$x "
double="${g}╔$u\u$g$PROMPT_AT$h\h$g:$w$dir\n${g}║$B\n${g}╚$p$P$x "
if ((${#countme} > PROMPT_MAX)); then
PS1="$double"
elif ((${#countme} > PROMPT_LONG)); then
PS1="$long"
else
PS1="$short"
fi
if _have tmux && [[ -n "$TMUX" ]]; then
tmux rename-window "$(wd)"
fi
}
wd() {
dir="${PWD##*/}"
parent="${PWD%"/${dir}"}"
parent="${parent##*/}"
echo "$parent/$dir"
} && export wd
PROMPT_COMMAND="__ps1"
# ----------------------------- keyboard -----------------------------
# only works if you have X and are using graphic Linux desktop
_have setxkbmap && test -n "$DISPLAY" &&
setxkbmap -option caps:escape &>/dev/null
# ------------------------------ aliases -----------------------------
# (use exec scripts instead, which work from vim and subprocs)
unalias -a
alias todo='vi ~/.todo'
alias ip='ip -c'
alias '?'=gpt
alias '??'=duck
alias '???'=google
alias dot='cd $DOTFILES'
alias scripts='cd $SCRIPTS'
alias snippets='cd $SNIPPETS'
alias ls='ls -h --color=auto'
alias free='free -h'
alias tree='tree -a'
alias df='df -h'
alias chmox='chmod +x'
alias diff='diff --color'
alias sshh='sshpass -f $HOME/.sshpass ssh '
alias temp='cd $(mktemp -d)'
alias view='vi -R' # which is usually linked to vim
alias clear='printf "\e[H\e[2J"'
alias c='printf "\e[H\e[2J"'
alias env='env -u LESS_TERMCAP_mb -u LESS_TERMCAP_md -u LESS_TERMCAP_me -u LESS_TERMCAP_so -u LESS_TERMCAP_se -u LESS_TERMCAP_us -u LESS_TERMCAP_ue'
alias neo="neo -D -c gold"
alias more="less"
alias gitl="git log -n 5 --graph --decorate --oneline"
alias gp="git push"
alias gptags="git push origin --tags"
alias km="kimono"
alias s=wee
alias cur="vi ~/.currently"
set-editor() {
export EDITOR="$1"
export VISUAL="$1"
export GH_EDITOR="$1"
export GIT_EDITOR="$1"
alias vi="\$EDITOR"
}
_have "vim" && set-editor vi
_have "nvim" && set-editor nvim
# ----------------------------- functions ----------------------------
envx() {
local envfile="${1:-"$HOME/.env"}"
[[ ! -e "$envfile" ]] && echo "$envfile not found" && return 1
while IFS= read -r line; do
name=${line%%=*}
value=${line#*=}
[[ -z "${name}" || $name =~ ^# ]] && continue
export "$name"="$value"
done <"$envfile"
} && export -f envx
[[ -e "$HOME/.env" ]] && envx "$HOME/.env"
new-from() {
local template="$1"
local name="$2"
! _have gh && echo "gh command not found" && return 1
[[ -z "$name" ]] && echo "usage: $0 <name>" && return 1
[[ -z "$GHREPOS" ]] && echo "GHREPOS not set" && return 1
[[ ! -d "$GHREPOS" ]] && echo "Not found: $GHREPOS" && return 1
cd "$GHREPOS" || return 1
[[ -e "$name" ]] && echo "exists: $name" && return 1
gh repo create -p "$template" --public "$name"
gh repo clone "$name"
cd "$name" || return 1
} && export -f new-from
clone() {
local repo="$1" user
local repo="${repo#https://github.com/}"
local repo="${repo#git@github.com:}"
if [[ $repo =~ / ]]; then
user="${repo%%/*}"
else
user="$GITUSER"
[[ -z "$user" ]] && user="$USER"
fi
local name="${repo##*/}"
local userd="$REPOS/github.com/$user"
local path="$userd/$name"
[[ -d "$path" ]] && cd "$path" && return
mkdir -p "$userd"
cd "$userd"
echo gh repo clone "$user/$name" -- --recurse-submodule
gh repo clone "$user/$name" -- --recurse-submodule
cd "$name"
} && export -f clone
# ------------- source external dependencies / completion ------------
# for mac
if [[ "$OSTYPE" == "darwin"* ]]; then
brew_prefix="$(brew --prefix)"
if [[ -r "$brew_prefix/etc/profile.d/bash_completion.sh" ]]; then
source "$brew_prefix/etc/profile.d/bash_completion.sh"
fi
fi
owncomp=(
pdf zet keg kn yt gl auth pomo config live iam sshkey ws x clip
./build build b ./k8sapp k8sapp ./setup ./cmd run ./run
foo ./foo cmds ./cmds z bon openapi obs vault var sunrise multicall
kimono tag cm ytwee
)
for i in "${owncomp[@]}"; do complete -C "$i" "$i"; done
_have gh && . <(gh completion -s bash)
_have glow && . <(glow completion bash)
_have goreleaser && . <(goreleaser completion bash 2>/dev/null)
_have klogin && . <(klogin completion bash 2>/dev/null)
_have pandoc && . <(pandoc --bash-completion)
_have kubectl && . <(kubectl completion bash 2>/dev/null)
_have kubeadm && . <(kubeadm completion bash 2>/dev/null)
_have k && complete -o default -F __start_kubectl k
_have istioctl && . <(istioctl completion bash 2>/dev/null)
_have kind && . <(kind completion bash)
_have kompose && . <(kompose completion bash)
_have helm && . <(helm completion bash)
_have minikube && . <(minikube completion bash)
_have conftest && . <(conftest completion bash)
_have yq && . <(yq completion bash)
_have mk && complete -o default -F __start_minikube mk
_have podman && _source_if "$HOME/.local/share/podman/completion" # d
#_have ansible && . <(register-python-argcomplete3 ansible)
#_have ansible-config && . <(register-python-argcomplete3 ansible-config)
#_have ansible-console && . <(register-python-argcomplete3 ansible-console)
#_have ansible-doc && . <(register-python-argcomplete3 ansible-doc)
#_have ansible-galaxy && . <(register-python-argcomplete3 ansible-galaxy)
#_have ansible-inventory && . <(register-python-argcomplete3 ansible-inventory)
#_have ansible-playbook && . <(register-python-argcomplete3 ansible-playbook)
#_have ansible-pull && . <(register-python-argcomplete3 ansible-pull)
#_have ansible-vault && . <(register-python-argcomplete3 ansible-vault)
##_have ssh-agent && test -z "$SSH_AGENT_PID" && . <(ssh-agent)
# -------------------- personalized configuration --------------------
_source_if "$HOME/.bash_personal"
_source_if "$HOME/.bash_private"
_source_if "$HOME/.bash_work"
_have terraform && complete -C /usr/bin/terraform terraform
_have terraform && complete -C /usr/bin/terraform tf
# ------------------------- NVM trash ahead ------------------------
# (keep as is or nvm idiotic installer will re-add to bashrc next time)
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
export NAME=Rob
export PATH=$PATH:/Users/rwxrob/Repos/github.com/rwxrob/lab-sample
================================================
FILE: .dircolors
================================================
COLOR tty
TERM ansi
TERM color_xterm
TERM color-xterm
TERM con132x25
TERM con132x30
TERM con132x43
TERM con132x60
TERM con80x25
TERM con80x28
TERM con80x30
TERM con80x43
TERM con80x50
TERM con80x60
TERM cons25
TERM console
TERM cygwin
TERM dtterm
TERM Eterm
TERM eterm-color
TERM fbterm
TERM gnome
TERM gnome-256color
TERM jfbterm
TERM konsole
TERM konsole-256color
TERM kterm
TERM linux
TERM linux-c
TERM mach-color
TERM mlterm
TERM nxterm
TERM putty
TERM putty-256color
TERM rxvt
TERM rxvt-256color
TERM rxvt-cygwin
TERM rxvt-cygwin-native
TERM rxvt-unicode
TERM rxvt-unicode256
TERM rxvt-unicode-256color
TERM screen
TERM screen-16color
TERM screen-16color-bce
TERM screen-16color-s
TERM screen-16color-bce-s
TERM screen-256color
TERM screen-256color-bce
TERM screen-256color-s
TERM screen-256color-bce-s
TERM screen-bce
TERM screen-w
TERM screen.linux
TERM screen.xterm-new
TERM st
TERM st-meta
TERM st-256color
TERM st-meta-256color
TERM vt100
TERM xterm
TERM xterm-new
TERM xterm-16color
TERM xterm-256color
TERM xterm-88color
TERM xterm-color
TERM xterm-debian
TERM xterm-termite
EIGHTBIT 1
NORMAL 00
FILE 00
DIR 34
OTHER_WRITABLE 34;40
LINK 35
FIFO 30;44
SOCK 35;44
DOOR 35;44 # Solaris 2.5 and later
BLK 33;44
CHR 37;44
ORPHAN 05;37;41
MISSING 05;37;41
EXEC 31 # Unix
.cmd 31 # Win
.exe 31 # Win
.com 31 # Win
.bat 31 # Win
.reg 31 # Win
.app 31 # OSX
.txt 32
.org 32
.md 32
.mkd 32
.h 32
.c 32
.C 32
.cc 32
.cpp 32
.cxx 32
.objc 32
.sh 32
.bash 32
.csh 32
.zsh 32
.el 32
.vim 32
.java 32
.pl 32
.pm 32
.py 32
.rb 32
.hs 32
.php 32
.htm 32
.html 32
.shtml 32
.erb 32
.haml 32
.xml 32
.rdf 32
.css 32
.sass 32
.scss 32
.less 32
.js 32
.coffee 32
.man 32
.0 32
.1 32
.2 32
.3 32
.4 32
.5 32
.6 32
.7 32
.8 32
.9 32
.l 32
.n 32
.p 32
.pod 32
.tex 32
### Multimedia formats
# Image
.bmp 33
.cgm 33
.dl 33
.dvi 33
.emf 33
.eps 33
.gif 33
.jpeg 33
.jpg 33
.JPG 33
.mng 33
.pbm 33
.pcx 33
.pdf 33
.pgm 33
.png 33
.ppm 33
.pps 33
.ppsx 33
.ps 33
.svg 33
.svgz 33
.tga 33
.tif 33
.tiff 33
.xbm 33
.xcf 33
.xpm 33
.xwd 33
.xwd 33
.yuv 33
# Audio
.aac 33
.au 33
.flac 33
.mid 33
.midi 33
.mka 33
.mp3 33
.mpa 33
.mpeg 33
.mpg 33
.ogg 33
.ra 33
.wav 33
# Video
.anx 33
.asf 33
.avi 33
.axv 33
.flc 33
.fli 33
.flv 33
.gl 33
.m2v 33
.m4v 33
.mkv 33
.mov 33
.mp4 33
.mp4v 33
.mpeg 33
.mpg 33
.nuv 33
.ogm 33
.ogv 33
.ogx 33
.qt 33
.rm 33
.rmvb 33
.swf 33
.vob 33
.wmv 33
### Misc
# Binary document formats and multimedia source
.doc 31
.docx 31
.rtf 31
.dot 31
.dotx 31
.xls 31
.xlsx 31
.ppt 31
.pptx 31
.fla 31
.psd 31
# Archives, compressed
.7z 1;35
.apk 1;35
.arj 1;35
.bin 1;35
.bz 1;35
.bz2 1;35
.cab 1;35 # Win
.deb 1;35
.dmg 1;35 # OSX
.gem 1;35
.gz 1;35
.iso 1;35
.jar 1;35
.msi 1;35 # Win
.rar 1;35
.rpm 1;35
.tar 1;35
.tbz 1;35
.tbz2 1;35
.tgz 1;35
.tx 1;35
.war 1;35
.xpi 1;35
.xz 1;35
.z 1;35
.Z 1;35
.zip 1;35
# For testing
.ANSI-30-black 30
.ANSI-01;30-brblack 01;30
.ANSI-31-red 31
.ANSI-01;31-brred 01;31
.ANSI-32-green 32
.ANSI-01;32-brgreen 01;32
.ANSI-33-yellow 33
.ANSI-01;33-bryellow 01;33
.ANSI-34-blue 34
.ANSI-01;34-brblue 01;34
.ANSI-35-magenta 35
.ANSI-01;35-brmagenta 01;35
.ANSI-36-cyan 36
.ANSI-01;36-brcyan 01;36
.ANSI-37-white 37
.ANSI-01;37-brwhite 01;37
.log 01;32
*~ 01;32
*# 01;32
.bak 01;33
.BAK 01;33
.old 01;33
.OLD 01;33
.org_archive 01;33
.off 01;33
.OFF 01;33
.dist 01;33
.DIST 01;33
.orig 01;33
.ORIG 01;33
.swp 01;33
.swo 01;33
*,v 01;33
.gpg 34
.gpg 34
.pgp 34
.asc 34
.3des 34
.aes 34
.enc 34
================================================
FILE: .dockerignore
================================================
.
!Dockerfile
!install
================================================
FILE: .gitconfig
================================================
# This is Git's per-user configuration file.
[user]
# Please adapt and uncomment the following lines:
name = Rob Muhlestein
email = rob@rwx.gg
================================================
FILE: .github/FUNDING.yml
================================================
github: rwxrob
custom:
- https://linktr.ee/rwxrob
================================================
FILE: .gitignore
================================================
.DS_Store
================================================
FILE: .inputrc
================================================
set editing-mode vi
set enable-bracketed-paste on
set bell-style none
set keymap vi
================================================
FILE: .profile
================================================
# This file is only here because some brain-dead
# applications require it.
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
================================================
FILE: .wezterm.lua
================================================
local wezterm = require("wezterm")
return {
window_close_confirmation = 'NeverPrompt',
default_prog = {'/opt/homebrew/bin/bash','--login'},
color_scheme = 'Gruvbox Material (Gogh)',
font = wezterm.font('UbuntuMono Nerd Font'),
font_size = 34,
colors = {
cursor_bg = '#928374',
cursor_border = '#928374',
},
term = "xterm-256color",
window_decorations = "RESIZE",
hide_tab_bar_if_only_one_tab = true,
window_padding = {
left = 40,
right = 0,
top = 50,
bottom = 0,
},
}
================================================
FILE: DCO
================================================
Developer Certificate of Origin
Version 1.1
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
1 Letterman Drive
Suite D4700
San Francisco, CA, 94129
Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.
Developer's Certificate of Origin 1.1
By making a contribution to this project, I certify that:
(a) The contribution was created in whole or in part by me and I
have the right to submit it under the open source license
indicated in the file; or
(b) The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source
license and I have the right under that license to submit that
work with modifications, whether created in whole or in part
by me, under the same open source license (unless I am
permitted to submit under a different license), as indicated
in the file; or
(c) The contribution was provided directly to me by some other
person who certified (a), (b) or (c) and I have not modified
it.
(d) I understand and agree that this project and the contribution
are public and that a record of the contribution (including all
personal information I submit with it, including my sign-off) is
maintained indefinitely and may be redistributed consistent with
this project or the open source license(s) involved.
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2020 Rob Muhlestein
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================
# Dotfiles, scripts, and stuff
*You probably want [Beginner Boost container](https://github.com/rwxrob/boost) instead.*
Pilfer at your own peril. I'd love it if you mentioned me if you do, but yeah. [Stop by and chat sometime.](https://linktr.ee/rwxrob)
## Legal
Copyright 2024 Robert S. Muhlestein (<mailto:rob@rwx.gg>)
SPDX-License-Identifier: Apache-2.0
This license makes you safe to use anything in here pretty much anywhere—including at work. But you do it at your own peril.
================================================
FILE: docker/README.md
================================================
# Docker Completion
Add `d` to the `complete` line at the end.
================================================
FILE: docker/completion
================================================
#!/usr/bin/env bash
# shellcheck disable=SC2016,SC2119,SC2155,SC2206,SC2207
#
# Shellcheck ignore list:
# - SC2016: Expressions don't expand in single quotes, use double quotes for that.
# - SC2119: Use foo "$@" if function's $1 should mean script's $1.
# - SC2155: Declare and assign separately to avoid masking return values.
# - SC2206: Quote to prevent word splitting, or split robustly with mapfile or read -a.
# - SC2207: Prefer mapfile or read -a to split command output (or quote to avoid splitting).
#
# You can find more details for each warning at the following page:
# https://github.com/koalaman/shellcheck/wiki/<SCXXXX>
#
# bash completion file for core docker commands
#
# This script provides completion of:
# - commands and their options
# - container ids and names
# - image repos and tags
# - filepaths
#
# To enable the completions either:
# - place this file in /etc/bash_completion.d
# or
# - copy this file to e.g. ~/.docker-completion.sh and add the line
# below to your .bashrc after bash completion features are loaded
# . ~/.docker-completion.sh
#
# Configuration:
#
# For several commands, the amount of completions can be configured by
# setting environment variables.
#
# DOCKER_COMPLETION_SHOW_CONFIG_IDS
# DOCKER_COMPLETION_SHOW_CONTAINER_IDS
# DOCKER_COMPLETION_SHOW_NETWORK_IDS
# DOCKER_COMPLETION_SHOW_NODE_IDS
# DOCKER_COMPLETION_SHOW_PLUGIN_IDS
# DOCKER_COMPLETION_SHOW_SECRET_IDS
# DOCKER_COMPLETION_SHOW_SERVICE_IDS
# "no" - Show names only (default)
# "yes" - Show names and ids
#
# You can tailor completion for the "events", "history", "inspect", "run",
# "rmi" and "save" commands by settings the following environment
# variables:
#
# DOCKER_COMPLETION_SHOW_IMAGE_IDS
# "none" - Show names only (default)
# "non-intermediate" - Show names and ids, but omit intermediate image IDs
# "all" - Show names and ids, including intermediate image IDs
#
# DOCKER_COMPLETION_SHOW_TAGS
# "yes" - include tags in completion options (default)
# "no" - don't include tags in completion options
#
# Note:
# Currently, the completions will not work if the docker daemon is not
# bound to the default communication port/socket
# If the docker daemon is using a unix socket for communication your user
# must have access to the socket for the completions to function correctly
#
# Note for developers:
# Please arrange options sorted alphabetically by long name with the short
# options immediately following their corresponding long form.
# This order should be applied to lists, alternatives and code blocks.
__docker_previous_extglob_setting=$(shopt -p extglob)
shopt -s extglob
__docker_q() {
docker ${host:+--host "$host"} ${config:+--config "$config"} ${context:+--context "$context"} 2>/dev/null "$@"
}
# __docker_configs returns a list of configs. Additional options to
# `docker config ls` may be specified in order to filter the list, e.g.
# `__docker_configs --filter label=stage=production`.
# By default, only names are returned.
# Set DOCKER_COMPLETION_SHOW_CONFIG_IDS=yes to also complete IDs.
# An optional first option `--id|--name` may be used to limit the
# output to the IDs or names of matching items. This setting takes
# precedence over the environment setting.
__docker_configs() {
local format
if [ "$1" = "--id" ] ; then
format='{{.ID}}'
shift
elif [ "$1" = "--name" ] ; then
format='{{.Name}}'
shift
elif [ "$DOCKER_COMPLETION_SHOW_CONFIG_IDS" = yes ] ; then
format='{{.ID}} {{.Name}}'
else
format='{{.Name}}'
fi
__docker_q config ls --format "$format" "$@"
}
# __docker_complete_configs applies completion of configs based on the current value
# of `$cur` or the value of the optional first option `--cur`, if given.
__docker_complete_configs() {
local current="$cur"
if [ "$1" = "--cur" ] ; then
current="$2"
shift 2
fi
COMPREPLY=( $(compgen -W "$(__docker_configs "$@")" -- "$current") )
}
# __docker_containers returns a list of containers. Additional options to
# `docker ps` may be specified in order to filter the list, e.g.
# `__docker_containers --filter status=running`
# By default, only names are returned.
# Set DOCKER_COMPLETION_SHOW_CONTAINER_IDS=yes to also complete IDs.
# An optional first option `--id|--name` may be used to limit the
# output to the IDs or names of matching items. This setting takes
# precedence over the environment setting.
__docker_containers() {
local format
if [ "$1" = "--id" ] ; then
format='{{.ID}}'
shift
elif [ "$1" = "--name" ] ; then
format='{{.Names}}'
shift
elif [ "${DOCKER_COMPLETION_SHOW_CONTAINER_IDS}" = yes ] ; then
format='{{.ID}} {{.Names}}'
else
format='{{.Names}}'
fi
__docker_q ps --format "$format" "$@"
}
# __docker_complete_containers applies completion of containers based on the current
# value of `$cur` or the value of the optional first option `--cur`, if given.
# Additional filters may be appended, see `__docker_containers`.
__docker_complete_containers() {
local current="$cur"
if [ "$1" = "--cur" ] ; then
current="$2"
shift 2
fi
COMPREPLY=( $(compgen -W "$(__docker_containers "$@")" -- "$current") )
}
__docker_complete_containers_all() {
__docker_complete_containers "$@" --all
}
# shellcheck disable=SC2120
__docker_complete_containers_removable() {
__docker_complete_containers "$@" --filter status=created --filter status=exited
}
__docker_complete_containers_running() {
__docker_complete_containers "$@" --filter status=running
}
# shellcheck disable=SC2120
__docker_complete_containers_stoppable() {
__docker_complete_containers "$@" --filter status=running --filter status=paused
}
# shellcheck disable=SC2120
__docker_complete_containers_stopped() {
__docker_complete_containers "$@" --filter status=exited
}
# shellcheck disable=SC2120
__docker_complete_containers_unpauseable() {
__docker_complete_containers "$@" --filter status=paused
}
__docker_complete_container_names() {
local containers=( $(__docker_q ps -aq --no-trunc) )
local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") )
names=( "${names[@]#/}" ) # trim off the leading "/" from the container names
COMPREPLY=( $(compgen -W "${names[*]}" -- "$cur") )
}
__docker_complete_container_ids() {
local containers=( $(__docker_q ps -aq) )
COMPREPLY=( $(compgen -W "${containers[*]}" -- "$cur") )
}
# __docker_contexts returns a list of contexts without the special "default" context.
# Completions may be added with `--add`, e.g. `--add default`.
__docker_contexts() {
local add=()
while true ; do
case "$1" in
--add)
add+=("$2")
shift 2
;;
*)
break
;;
esac
done
__docker_q context ls -q
echo "${add[@]}"
}
__docker_complete_contexts() {
local contexts=( $(__docker_contexts "$@") )
COMPREPLY=( $(compgen -W "${contexts[*]}" -- "$cur") )
}
# __docker_images returns a list of images. For each image, up to three representations
# can be generated: the repository (e.g. busybox), repository:tag (e.g. busybox:latest)
# and the ID (e.g. sha256:ee22cbbd4ea3dff63c86ba60c7691287c321e93adfc1009604eb1dde7ec88645).
#
# The optional arguments `--repo`, `--tag` and `--id` select the representations that
# may be returned. Whether or not a particular representation is actually returned
# depends on the user's customization through several environment variables:
# - image IDs are only shown if DOCKER_COMPLETION_SHOW_IMAGE_IDS=all|non-intermediate.
# - tags can be excluded by setting DOCKER_COMPLETION_SHOW_TAGS=no.
# - repositories are always shown.
#
# In cases where an exact image specification is needed, `--force-tag` can be used.
# It ignores DOCKER_COMPLETION_SHOW_TAGS and only lists valid repository:tag combinations,
# avoiding repository names that would default to a potentially missing default tag.
#
# Additional arguments to `docker image ls` may be specified in order to filter the list,
# e.g. `__docker_images --filter dangling=true`.
#
__docker_images() {
local repo_format='{{.Repository}}'
local tag_format='{{.Repository}}:{{.Tag}}'
local id_format='{{.ID}}'
local all
local format
if [ "$DOCKER_COMPLETION_SHOW_IMAGE_IDS" = "all" ] ; then
all='--all'
fi
while true ; do
case "$1" in
--repo)
format+="$repo_format\n"
shift
;;
--tag)
if [ "${DOCKER_COMPLETION_SHOW_TAGS:-yes}" = "yes" ]; then
format+="$tag_format\n"
fi
shift
;;
--id)
if [[ $DOCKER_COMPLETION_SHOW_IMAGE_IDS =~ ^(all|non-intermediate)$ ]] ; then
format+="$id_format\n"
fi
shift
;;
--force-tag)
# like `--tag` but ignores environment setting
format+="$tag_format\n"
shift
;;
*)
break
;;
esac
done
__docker_q image ls --no-trunc --format "${format%\\n}" $all "$@" | grep -v '<none>$'
}
# __docker_complete_images applies completion of images based on the current value of `$cur` or
# the value of the optional first option `--cur`, if given.
# See __docker_images for customization of the returned items.
__docker_complete_images() {
local current="$cur"
if [ "$1" = "--cur" ] ; then
current="$2"
shift 2
fi
COMPREPLY=( $(compgen -W "$(__docker_images "$@")" -- "$current") )
__ltrim_colon_completions "$current"
}
# __docker_networks returns a list of all networks. Additional options to
# `docker network ls` may be specified in order to filter the list, e.g.
# `__docker_networks --filter type=custom`
# By default, only names are returned.
# Set DOCKER_COMPLETION_SHOW_NETWORK_IDS=yes to also complete IDs.
# An optional first option `--id|--name` may be used to limit the
# output to the IDs or names of matching items. This setting takes
# precedence over the environment setting.
__docker_networks() {
local format
if [ "$1" = "--id" ] ; then
format='{{.ID}}'
shift
elif [ "$1" = "--name" ] ; then
format='{{.Name}}'
shift
elif [ "${DOCKER_COMPLETION_SHOW_NETWORK_IDS}" = yes ] ; then
format='{{.ID}} {{.Name}}'
else
format='{{.Name}}'
fi
__docker_q network ls --format "$format" "$@"
}
# __docker_complete_networks applies completion of networks based on the current
# value of `$cur` or the value of the optional first option `--cur`, if given.
# Additional filters may be appended, see `__docker_networks`.
__docker_complete_networks() {
local current="$cur"
if [ "$1" = "--cur" ] ; then
current="$2"
shift 2
fi
COMPREPLY=( $(compgen -W "$(__docker_networks "$@")" -- "$current") )
}
__docker_complete_containers_in_network() {
local containers=($(__docker_q network inspect -f '{{range $i, $c := .Containers}}{{$i}} {{$c.Name}} {{end}}' "$1"))
COMPREPLY=( $(compgen -W "${containers[*]}" -- "$cur") )
}
# __docker_volumes returns a list of all volumes. Additional options to
# `docker volume ls` may be specified in order to filter the list, e.g.
# `__docker_volumes --filter dangling=true`
# Because volumes do not have IDs, this function does not distinguish between
# IDs and names.
__docker_volumes() {
__docker_q volume ls -q "$@"
}
# __docker_complete_volumes applies completion of volumes based on the current
# value of `$cur` or the value of the optional first option `--cur`, if given.
# Additional filters may be appended, see `__docker_volumes`.
__docker_complete_volumes() {
local current="$cur"
if [ "$1" = "--cur" ] ; then
current="$2"
shift 2
fi
COMPREPLY=( $(compgen -W "$(__docker_volumes "$@")" -- "$current") )
}
# __docker_plugins_bundled returns a list of all plugins of a given type.
# The type has to be specified with the mandatory option `--type`.
# Valid types are: Network, Volume, Authorization.
# Completions may be added or removed with `--add` and `--remove`
# This function only deals with plugins that come bundled with Docker.
# For plugins managed by `docker plugin`, see `__docker_plugins_installed`.
__docker_plugins_bundled() {
local type add=() remove=()
while true ; do
case "$1" in
--type)
type="$2"
shift 2
;;
--add)
add+=("$2")
shift 2
;;
--remove)
remove+=("$2")
shift 2
;;
*)
break
;;
esac
done
local plugins=($(__docker_q info --format "{{range \$i, \$p := .Plugins.$type}}{{.}} {{end}}"))
for del in "${remove[@]}" ; do
plugins=(${plugins[@]/$del/})
done
echo "${plugins[@]}" "${add[@]}"
}
# __docker_complete_plugins_bundled applies completion of plugins based on the current
# value of `$cur` or the value of the optional first option `--cur`, if given.
# The plugin type has to be specified with the next option `--type`.
# This function only deals with plugins that come bundled with Docker.
# For completion of plugins managed by `docker plugin`, see
# `__docker_complete_plugins_installed`.
__docker_complete_plugins_bundled() {
local current="$cur"
if [ "$1" = "--cur" ] ; then
current="$2"
shift 2
fi
COMPREPLY=( $(compgen -W "$(__docker_plugins_bundled "$@")" -- "$current") )
}
# __docker_plugins_installed returns a list of all plugins that were installed with
# the Docker plugin API.
# By default, only names are returned.
# Set DOCKER_COMPLETION_SHOW_PLUGIN_IDS=yes to also complete IDs.
# Additional options to `docker plugin ls` may be specified in order to filter the list,
# e.g. `__docker_plugins_installed --filter enabled=true`
# For built-in pugins, see `__docker_plugins_bundled`.
__docker_plugins_installed() {
local format
if [ "$DOCKER_COMPLETION_SHOW_PLUGIN_IDS" = yes ] ; then
format='{{.ID}} {{.Name}}'
else
format='{{.Name}}'
fi
__docker_q plugin ls --format "$format" "$@"
}
# __docker_complete_plugins_installed applies completion of plugins that were installed
# with the Docker plugin API, based on the current value of `$cur` or the value of
# the optional first option `--cur`, if given.
# Additional filters may be appended, see `__docker_plugins_installed`.
# For completion of built-in pugins, see `__docker_complete_plugins_bundled`.
__docker_complete_plugins_installed() {
local current="$cur"
if [ "$1" = "--cur" ] ; then
current="$2"
shift 2
fi
COMPREPLY=( $(compgen -W "$(__docker_plugins_installed "$@")" -- "$current") )
}
__docker_runtimes() {
__docker_q info | sed -n 's/^Runtimes: \(.*\)/\1/p'
}
__docker_complete_runtimes() {
COMPREPLY=( $(compgen -W "$(__docker_runtimes)" -- "$cur") )
}
# __docker_secrets returns a list of secrets. Additional options to
# `docker secret ls` may be specified in order to filter the list, e.g.
# `__docker_secrets --filter label=stage=production`
# By default, only names are returned.
# Set DOCKER_COMPLETION_SHOW_SECRET_IDS=yes to also complete IDs.
# An optional first option `--id|--name` may be used to limit the
# output to the IDs or names of matching items. This setting takes
# precedence over the environment setting.
__docker_secrets() {
local format
if [ "$1" = "--id" ] ; then
format='{{.ID}}'
shift
elif [ "$1" = "--name" ] ; then
format='{{.Name}}'
shift
elif [ "$DOCKER_COMPLETION_SHOW_SECRET_IDS" = yes ] ; then
format='{{.ID}} {{.Name}}'
else
format='{{.Name}}'
fi
__docker_q secret ls --format "$format" "$@"
}
# __docker_complete_secrets applies completion of secrets based on the current value
# of `$cur` or the value of the optional first option `--cur`, if given.
__docker_complete_secrets() {
local current="$cur"
if [ "$1" = "--cur" ] ; then
current="$2"
shift 2
fi
COMPREPLY=( $(compgen -W "$(__docker_secrets "$@")" -- "$current") )
}
# __docker_stacks returns a list of all stacks.
__docker_stacks() {
__docker_q stack ls | awk 'NR>1 {print $1}'
}
# __docker_complete_stacks applies completion of stacks based on the current value
# of `$cur` or the value of the optional first option `--cur`, if given.
__docker_complete_stacks() {
local current="$cur"
if [ "$1" = "--cur" ] ; then
current="$2"
shift 2
fi
COMPREPLY=( $(compgen -W "$(__docker_stacks "$@")" -- "$current") )
}
# __docker_nodes returns a list of all nodes. Additional options to
# `docker node ls` may be specified in order to filter the list, e.g.
# `__docker_nodes --filter role=manager`
# By default, only node names are returned.
# Set DOCKER_COMPLETION_SHOW_NODE_IDS=yes to also complete node IDs.
# An optional first option `--id|--name` may be used to limit the
# output to the IDs or names of matching items. This setting takes
# precedence over the environment setting.
# Completions may be added with `--add`, e.g. `--add self`.
__docker_nodes() {
local format
if [ "$DOCKER_COMPLETION_SHOW_NODE_IDS" = yes ] ; then
format='{{.ID}} {{.Hostname}}'
else
format='{{.Hostname}}'
fi
local add=()
while true ; do
case "$1" in
--id)
format='{{.ID}}'
shift
;;
--name)
format='{{.Hostname}}'
shift
;;
--add)
add+=("$2")
shift 2
;;
*)
break
;;
esac
done
echo "$(__docker_q node ls --format "$format" "$@")" "${add[@]}"
}
# __docker_complete_nodes applies completion of nodes based on the current
# value of `$cur` or the value of the optional first option `--cur`, if given.
# Additional filters may be appended, see `__docker_nodes`.
__docker_complete_nodes() {
local current="$cur"
if [ "$1" = "--cur" ] ; then
current="$2"
shift 2
fi
COMPREPLY=( $(compgen -W "$(__docker_nodes "$@")" -- "$current") )
}
# __docker_services returns a list of all services. Additional options to
# `docker service ls` may be specified in order to filter the list, e.g.
# `__docker_services --filter name=xxx`
# By default, only node names are returned.
# Set DOCKER_COMPLETION_SHOW_SERVICE_IDS=yes to also complete IDs.
# An optional first option `--id|--name` may be used to limit the
# output to the IDs or names of matching items. This setting takes
# precedence over the environment setting.
__docker_services() {
local format='{{.Name}}' # default: service name only
[ "${DOCKER_COMPLETION_SHOW_SERVICE_IDS}" = yes ] && format='{{.ID}} {{.Name}}' # ID & name
if [ "$1" = "--id" ] ; then
format='{{.ID}}' # IDs only
shift
elif [ "$1" = "--name" ] ; then
format='{{.Name}}' # names only
shift
fi
__docker_q service ls --quiet --format "$format" "$@"
}
# __docker_complete_services applies completion of services based on the current
# value of `$cur` or the value of the optional first option `--cur`, if given.
# Additional filters may be appended, see `__docker_services`.
__docker_complete_services() {
local current="$cur"
if [ "$1" = "--cur" ] ; then
current="$2"
shift 2
fi
COMPREPLY=( $(__docker_services "$@" --filter "name=$current") )
}
# __docker_tasks returns a list of all task IDs.
__docker_tasks() {
__docker_q service ps --format '{{.ID}}' ""
}
# __docker_complete_services_and_tasks applies completion of services and task IDs.
# shellcheck disable=SC2120
__docker_complete_services_and_tasks() {
COMPREPLY=( $(compgen -W "$(__docker_services "$@") $(__docker_tasks)" -- "$cur") )
}
# __docker_append_to_completions appends the word passed as an argument to every
# word in `$COMPREPLY`.
# Normally you do this with `compgen -S` while generating the completions.
# This function allows you to append a suffix later. It allows you to use
# the __docker_complete_XXX functions in cases where you need a suffix.
__docker_append_to_completions() {
COMPREPLY=( ${COMPREPLY[@]/%/"$1"} )
}
# __docker_fetch_info fetches information about the configured Docker server and updates
# several variables with the results.
# The result is cached for the duration of one invocation of bash completion.
__docker_fetch_info() {
if [ -z "$info_fetched" ] ; then
read -r client_experimental server_experimental server_os <<< "$(__docker_q version -f '{{.Client.Experimental}} {{.Server.Experimental}} {{.Server.Os}}')"
info_fetched=true
fi
}
# __docker_client_is_experimental tests whether the Docker cli is configured to support
# experimental features. If so, the function exits with 0 (true).
# Otherwise, or if the result cannot be determined, the exit value is 1 (false).
__docker_client_is_experimental() {
__docker_fetch_info
[ "$client_experimental" = "true" ]
}
# __docker_server_is_experimental tests whether the currently configured Docker
# server runs in experimental mode. If so, the function exits with 0 (true).
# Otherwise, or if the result cannot be determined, the exit value is 1 (false).
__docker_server_is_experimental() {
__docker_fetch_info
[ "$server_experimental" = "true" ]
}
# __docker_server_os_is tests whether the currently configured Docker server runs
# on the operating system passed in as the first argument.
# Known operating systems: linux, windows.
__docker_server_os_is() {
local expected_os="$1"
__docker_fetch_info
[ "$server_os" = "$expected_os" ]
}
# __docker_stack_orchestrator_is tests whether the client is configured to use
# the orchestrator that is passed in as the first argument.
__docker_stack_orchestrator_is() {
case "$1" in
kubernetes)
if [ -z "$stack_orchestrator_is_kubernetes" ] ; then
__docker_q stack ls --help | grep -qe --namespace
stack_orchestrator_is_kubernetes=$?
fi
return $stack_orchestrator_is_kubernetes
;;
swarm)
if [ -z "$stack_orchestrator_is_swarm" ] ; then
__docker_q stack deploy --help | grep -qe "with-registry-auth"
stack_orchestrator_is_swarm=$?
fi
return $stack_orchestrator_is_swarm
;;
*)
return 1
;;
esac
}
# __docker_pos_first_nonflag finds the position of the first word that is neither
# option nor an option's argument. If there are options that require arguments,
# you should pass a glob describing those options, e.g. "--option1|-o|--option2"
# Use this function to restrict completions to exact positions after the argument list.
__docker_pos_first_nonflag() {
local argument_flags=$1
local counter=$((${subcommand_pos:-${command_pos}} + 1))
while [ "$counter" -le "$cword" ]; do
if [ -n "$argument_flags" ] && eval "case '${words[$counter]}' in $argument_flags) true ;; *) false ;; esac"; then
(( counter++ ))
# eat "=" in case of --option=arg syntax
[ "${words[$counter]}" = "=" ] && (( counter++ ))
else
case "${words[$counter]}" in
-*)
;;
*)
break
;;
esac
fi
# Bash splits words at "=", retaining "=" as a word, examples:
# "--debug=false" => 3 words, "--log-opt syslog-facility=daemon" => 4 words
while [ "${words[$counter + 1]}" = "=" ] ; do
counter=$(( counter + 2))
done
(( counter++ ))
done
echo $counter
}
# __docker_map_key_of_current_option returns `key` if we are currently completing the
# value of a map option (`key=value`) which matches the extglob given as an argument.
# This function is needed for key-specific completions.
__docker_map_key_of_current_option() {
local glob="$1"
local key glob_pos
if [ "$cur" = "=" ] ; then # key= case
key="$prev"
glob_pos=$((cword - 2))
elif [[ $cur == *=* ]] ; then # key=value case (OSX)
key=${cur%=*}
glob_pos=$((cword - 1))
elif [ "$prev" = "=" ] ; then
key=${words[$cword - 2]} # key=value case
glob_pos=$((cword - 3))
else
return
fi
[ "${words[$glob_pos]}" = "=" ] && ((glob_pos--)) # --option=key=value syntax
[[ ${words[$glob_pos]} == @($glob) ]] && echo "$key"
}
# __docker_value_of_option returns the value of the first option matching `option_glob`.
# Valid values for `option_glob` are option names like `--log-level` and globs like
# `--log-level|-l`
# Only positions between the command and the current word are considered.
__docker_value_of_option() {
local option_extglob=$(__docker_to_extglob "$1")
local counter=$((command_pos + 1))
while [ "$counter" -lt "$cword" ]; do
case ${words[$counter]} in
$option_extglob )
echo "${words[$counter + 1]}"
break
;;
esac
(( counter++ ))
done
}
# __docker_to_alternatives transforms a multiline list of strings into a single line
# string with the words separated by `|`.
# This is used to prepare arguments to __docker_pos_first_nonflag().
__docker_to_alternatives() {
local parts=( $1 )
local IFS='|'
echo "${parts[*]}"
}
# __docker_to_extglob transforms a multiline list of options into an extglob pattern
# suitable for use in case statements.
__docker_to_extglob() {
local extglob=$( __docker_to_alternatives "$1" )
echo "@($extglob)"
}
# __docker_subcommands processes subcommands
# Locates the first occurrence of any of the subcommands contained in the
# first argument. In case of a match, calls the corresponding completion
# function and returns 0.
# If no match is found, 1 is returned. The calling function can then
# continue processing its completion.
#
# TODO if the preceding command has options that accept arguments and an
# argument is equal ot one of the subcommands, this is falsely detected as
# a match.
__docker_subcommands() {
local subcommands="$1"
local counter=$((command_pos + 1))
while [ "$counter" -lt "$cword" ]; do
case "${words[$counter]}" in
$(__docker_to_extglob "$subcommands") )
subcommand_pos=$counter
local subcommand=${words[$counter]}
local completions_func=_docker_${command}_${subcommand//-/_}
declare -F "$completions_func" >/dev/null && "$completions_func"
return 0
;;
esac
(( counter++ ))
done
return 1
}
# __docker_nospace suppresses trailing whitespace
__docker_nospace() {
# compopt is not available in ancient bash versions
type compopt &>/dev/null && compopt -o nospace
}
__docker_complete_resolved_hostname() {
command -v host >/dev/null 2>&1 || return
COMPREPLY=( $(host 2>/dev/null "${cur%:}" | awk '/has address/ {print $4}') )
}
# __docker_local_interfaces returns a list of the names and addresses of all
# local network interfaces.
# If `--ip-only` is passed as a first argument, only addresses are returned.
__docker_local_interfaces() {
command -v ip >/dev/null 2>&1 || return
local format
if [ "$1" = "--ip-only" ] ; then
format='\1'
shift
else
format='\1 \2'
fi
ip addr show scope global 2>/dev/null | sed -n "s| \+inet \([0-9.]\+\).* \([^ ]\+\)|$format|p"
}
# __docker_complete_local_interfaces applies completion of the names and addresses of all
# local network interfaces based on the current value of `$cur`.
# An additional value can be added to the possible completions with an `--add` argument.
__docker_complete_local_interfaces() {
local additional_interface
if [ "$1" = "--add" ] ; then
additional_interface="$2"
shift 2
fi
COMPREPLY=( $( compgen -W "$(__docker_local_interfaces "$@") $additional_interface" -- "$cur" ) )
}
# __docker_complete_local_ips applies completion of the addresses of all local network
# interfaces based on the current value of `$cur`.
__docker_complete_local_ips() {
__docker_complete_local_interfaces --ip-only
}
# __docker_complete_capabilities_addable completes Linux capabilities which are
# not granted by default and may be added.
# see https://docs.docker.com/engine/reference/run/#/runtime-privilege-and-linux-capabilities
__docker_complete_capabilities_addable() {
COMPREPLY=( $( compgen -W "
ALL
AUDIT_CONTROL
BLOCK_SUSPEND
DAC_READ_SEARCH
IPC_LOCK
IPC_OWNER
LEASE
LINUX_IMMUTABLE
MAC_ADMIN
MAC_OVERRIDE
NET_ADMIN
NET_BROADCAST
SYS_ADMIN
SYS_BOOT
SYSLOG
SYS_MODULE
SYS_NICE
SYS_PACCT
SYS_PTRACE
SYS_RAWIO
SYS_RESOURCE
SYS_TIME
SYS_TTY_CONFIG
WAKE_ALARM
" -- "$cur" ) )
}
# __docker_complete_capabilities_droppable completes Linux capability options which are
# allowed by default and can be dropped.
# see https://docs.docker.com/engine/reference/run/#/runtime-privilege-and-linux-capabilities
__docker_complete_capabilities_droppable() {
COMPREPLY=( $( compgen -W "
ALL
AUDIT_WRITE
CHOWN
DAC_OVERRIDE
FOWNER
FSETID
KILL
MKNOD
NET_BIND_SERVICE
NET_RAW
SETFCAP
SETGID
SETPCAP
SETUID
SYS_CHROOT
" -- "$cur" ) )
}
__docker_complete_detach_keys() {
case "$prev" in
--detach-keys)
case "$cur" in
*,)
COMPREPLY=( $( compgen -W "${cur}ctrl-" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "ctrl-" -- "$cur" ) )
;;
esac
__docker_nospace
return
;;
esac
return 1
}
__docker_complete_isolation() {
COMPREPLY=( $( compgen -W "default hyperv process" -- "$cur" ) )
}
__docker_complete_log_drivers() {
COMPREPLY=( $( compgen -W "
awslogs
etwlogs
fluentd
gcplogs
gelf
journald
json-file
local
logentries
none
splunk
syslog
" -- "$cur" ) )
}
__docker_complete_log_options() {
# see repository docker/docker.github.io/engine/admin/logging/
# really global options, defined in https://github.com/moby/moby/blob/master/daemon/logger/factory.go
local common_options1="max-buffer-size mode"
# common options defined in https://github.com/moby/moby/blob/master/daemon/logger/loginfo.go
# but not implemented in all log drivers
local common_options2="env env-regex labels"
# awslogs does not implement the $common_options2.
local awslogs_options="$common_options1 awslogs-create-group awslogs-credentials-endpoint awslogs-datetime-format awslogs-group awslogs-multiline-pattern awslogs-region awslogs-stream tag"
local fluentd_options="$common_options1 $common_options2 fluentd-address fluentd-async-connect fluentd-buffer-limit fluentd-retry-wait fluentd-max-retries fluentd-sub-second-precision tag"
local gcplogs_options="$common_options1 $common_options2 gcp-log-cmd gcp-meta-id gcp-meta-name gcp-meta-zone gcp-project"
local gelf_options="$common_options1 $common_options2 gelf-address gelf-compression-level gelf-compression-type gelf-tcp-max-reconnect gelf-tcp-reconnect-delay tag"
local journald_options="$common_options1 $common_options2 tag"
local json_file_options="$common_options1 $common_options2 compress max-file max-size"
local local_options="$common_options1 compress max-file max-size"
local logentries_options="$common_options1 $common_options2 line-only logentries-token tag"
local splunk_options="$common_options1 $common_options2 splunk-caname splunk-capath splunk-format splunk-gzip splunk-gzip-level splunk-index splunk-insecureskipverify splunk-source splunk-sourcetype splunk-token splunk-url splunk-verify-connection tag"
local syslog_options="$common_options1 $common_options2 syslog-address syslog-facility syslog-format syslog-tls-ca-cert syslog-tls-cert syslog-tls-key syslog-tls-skip-verify tag"
local all_options="$fluentd_options $gcplogs_options $gelf_options $journald_options $logentries_options $json_file_options $syslog_options $splunk_options"
case $(__docker_value_of_option --log-driver) in
'')
COMPREPLY=( $( compgen -W "$all_options" -S = -- "$cur" ) )
;;
awslogs)
COMPREPLY=( $( compgen -W "$awslogs_options" -S = -- "$cur" ) )
;;
fluentd)
COMPREPLY=( $( compgen -W "$fluentd_options" -S = -- "$cur" ) )
;;
gcplogs)
COMPREPLY=( $( compgen -W "$gcplogs_options" -S = -- "$cur" ) )
;;
gelf)
COMPREPLY=( $( compgen -W "$gelf_options" -S = -- "$cur" ) )
;;
journald)
COMPREPLY=( $( compgen -W "$journald_options" -S = -- "$cur" ) )
;;
json-file)
COMPREPLY=( $( compgen -W "$json_file_options" -S = -- "$cur" ) )
;;
local)
COMPREPLY=( $( compgen -W "$local_options" -S = -- "$cur" ) )
;;
logentries)
COMPREPLY=( $( compgen -W "$logentries_options" -S = -- "$cur" ) )
;;
syslog)
COMPREPLY=( $( compgen -W "$syslog_options" -S = -- "$cur" ) )
;;
splunk)
COMPREPLY=( $( compgen -W "$splunk_options" -S = -- "$cur" ) )
;;
*)
return
;;
esac
__docker_nospace
}
__docker_complete_log_driver_options() {
local key=$(__docker_map_key_of_current_option '--log-opt')
case "$key" in
awslogs-create-group)
COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
return
;;
awslogs-credentials-endpoint)
COMPREPLY=( $( compgen -W "/" -- "${cur##*=}" ) )
__docker_nospace
return
;;
compress|fluentd-async-connect)
COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
return
;;
fluentd-sub-second-precision)
COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
return
;;
gelf-address)
COMPREPLY=( $( compgen -W "tcp udp" -S "://" -- "${cur##*=}" ) )
__docker_nospace
return
;;
gelf-compression-level)
COMPREPLY=( $( compgen -W "1 2 3 4 5 6 7 8 9" -- "${cur##*=}" ) )
return
;;
gelf-compression-type)
COMPREPLY=( $( compgen -W "gzip none zlib" -- "${cur##*=}" ) )
return
;;
line-only)
COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
return
;;
mode)
COMPREPLY=( $( compgen -W "blocking non-blocking" -- "${cur##*=}" ) )
return
;;
syslog-address)
COMPREPLY=( $( compgen -W "tcp:// tcp+tls:// udp:// unix://" -- "${cur##*=}" ) )
__docker_nospace
__ltrim_colon_completions "${cur}"
return
;;
syslog-facility)
COMPREPLY=( $( compgen -W "
auth
authpriv
cron
daemon
ftp
kern
local0
local1
local2
local3
local4
local5
local6
local7
lpr
mail
news
syslog
user
uucp
" -- "${cur##*=}" ) )
return
;;
syslog-format)
COMPREPLY=( $( compgen -W "rfc3164 rfc5424 rfc5424micro" -- "${cur##*=}" ) )
return
;;
syslog-tls-ca-cert|syslog-tls-cert|syslog-tls-key)
_filedir
return
;;
syslog-tls-skip-verify)
COMPREPLY=( $( compgen -W "true" -- "${cur##*=}" ) )
return
;;
splunk-url)
COMPREPLY=( $( compgen -W "http:// https://" -- "${cur##*=}" ) )
__docker_nospace
__ltrim_colon_completions "${cur}"
return
;;
splunk-gzip|splunk-insecureskipverify|splunk-verify-connection)
COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
return
;;
splunk-format)
COMPREPLY=( $( compgen -W "inline json raw" -- "${cur##*=}" ) )
return
;;
esac
return 1
}
__docker_complete_log_levels() {
COMPREPLY=( $( compgen -W "debug info warn error fatal" -- "$cur" ) )
}
__docker_complete_restart() {
case "$prev" in
--restart)
case "$cur" in
on-failure:*)
;;
*)
COMPREPLY=( $( compgen -W "always no on-failure on-failure: unless-stopped" -- "$cur") )
;;
esac
return
;;
esac
return 1
}
# __docker_complete_signals returns a subset of the available signals that is most likely
# relevant in the context of docker containers
__docker_complete_signals() {
local signals=(
SIGCONT
SIGHUP
SIGINT
SIGKILL
SIGQUIT
SIGSTOP
SIGTERM
SIGUSR1
SIGUSR2
)
COMPREPLY=( $( compgen -W "${signals[*]} ${signals[*]#SIG}" -- "$( echo "$cur" | tr '[:lower:]' '[:upper:]')" ) )
}
__docker_complete_stack_orchestrator_options() {
case "$prev" in
--kubeconfig)
_filedir
return 0
;;
--namespace)
return 0
;;
--orchestrator)
COMPREPLY=( $( compgen -W "all kubernetes swarm" -- "$cur") )
return 0
;;
esac
return 1
}
__docker_complete_user_group() {
if [[ $cur == *:* ]] ; then
COMPREPLY=( $(compgen -g -- "${cur#*:}") )
else
COMPREPLY=( $(compgen -u -S : -- "$cur") )
__docker_nospace
fi
}
_docker_docker() {
# global options that may appear after the docker command
local boolean_options="
$global_boolean_options
--help
--version -v
"
case "$prev" in
--config)
_filedir -d
return
;;
--context|-c)
__docker_complete_contexts
return
;;
--log-level|-l)
__docker_complete_log_levels
return
;;
$(__docker_to_extglob "$global_options_with_args") )
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$boolean_options $global_options_with_args" -- "$cur" ) )
;;
*)
local counter=$( __docker_pos_first_nonflag "$(__docker_to_extglob "$global_options_with_args")" )
if [ "$cword" -eq "$counter" ]; then
__docker_client_is_experimental && commands+=(${experimental_client_commands[*]})
__docker_server_is_experimental && commands+=(${experimental_server_commands[*]})
COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) )
fi
;;
esac
}
_docker_attach() {
_docker_container_attach
}
_docker_build() {
_docker_image_build
}
_docker_builder() {
local subcommands="
build
prune
"
__docker_subcommands "$subcommands" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_docker_builder_build() {
_docker_image_build
}
_docker_builder_prune() {
case "$prev" in
--filter)
COMPREPLY=( $( compgen -S = -W "description id inuse parent private shared type until unused-for" -- "$cur" ) )
__docker_nospace
return
;;
--keep-storage)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--all -a --filter --force -f --help --keep-storage" -- "$cur" ) )
;;
esac
}
_docker_checkpoint() {
local subcommands="
create
ls
rm
"
local aliases="
list
remove
"
__docker_subcommands "$subcommands $aliases" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_docker_checkpoint_create() {
case "$prev" in
--checkpoint-dir)
_filedir -d
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--checkpoint-dir --help --leave-running" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--checkpoint-dir')
if [ "$cword" -eq "$counter" ]; then
__docker_complete_containers_running
fi
;;
esac
}
_docker_checkpoint_ls() {
case "$prev" in
--checkpoint-dir)
_filedir -d
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--checkpoint-dir --help" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--checkpoint-dir')
if [ "$cword" -eq "$counter" ]; then
__docker_complete_containers_all
fi
;;
esac
}
_docker_checkpoint_rm() {
case "$prev" in
--checkpoint-dir)
_filedir -d
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--checkpoint-dir --help" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--checkpoint-dir')
if [ "$cword" -eq "$counter" ]; then
__docker_complete_containers_all
elif [ "$cword" -eq "$((counter + 1))" ]; then
COMPREPLY=( $( compgen -W "$(__docker_q checkpoint ls "$prev" | sed 1d)" -- "$cur" ) )
fi
;;
esac
}
_docker_config() {
local subcommands="
create
inspect
ls
rm
"
local aliases="
list
remove
"
__docker_subcommands "$subcommands $aliases" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_docker_config_create() {
case "$prev" in
--label|-l)
return
;;
--template-driver)
COMPREPLY=( $( compgen -W "golang" -- "$cur" ) )
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help --label -l --template-driver" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--label|-l|--template-driver')
if [ "$cword" -eq "$((counter + 1))" ]; then
_filedir
fi
;;
esac
}
_docker_config_inspect() {
case "$prev" in
--format|-f)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--format -f --help --pretty" -- "$cur" ) )
;;
*)
__docker_complete_configs
;;
esac
}
_docker_config_list() {
_docker_config_ls
}
_docker_config_ls() {
local key=$(__docker_map_key_of_current_option '--filter|-f')
case "$key" in
id)
__docker_complete_configs --cur "${cur##*=}" --id
return
;;
name)
__docker_complete_configs --cur "${cur##*=}" --name
return
;;
esac
case "$prev" in
--filter|-f)
COMPREPLY=( $( compgen -S = -W "id label name" -- "$cur" ) )
__docker_nospace
return
;;
--format)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--format --filter -f --help --quiet -q" -- "$cur" ) )
;;
esac
}
_docker_config_remove() {
_docker_config_rm
}
_docker_config_rm() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
__docker_complete_configs
;;
esac
}
_docker_container() {
local subcommands="
attach
commit
cp
create
diff
exec
export
inspect
kill
logs
ls
pause
port
prune
rename
restart
rm
run
start
stats
stop
top
unpause
update
wait
"
local aliases="
list
ps
"
__docker_subcommands "$subcommands $aliases" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_docker_container_attach() {
__docker_complete_detach_keys && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--detach-keys --help --no-stdin --sig-proxy=false" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--detach-keys')
if [ "$cword" -eq "$counter" ]; then
__docker_complete_containers_running
fi
;;
esac
}
_docker_container_commit() {
case "$prev" in
--author|-a|--change|-c|--message|-m)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--author -a --change -c --help --message -m --pause=false -p=false" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--author|-a|--change|-c|--message|-m')
if [ "$cword" -eq "$counter" ]; then
__docker_complete_containers_all
return
elif [ "$cword" -eq "$((counter + 1))" ]; then
__docker_complete_images --repo --tag
return
fi
;;
esac
}
_docker_container_cp() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--archive -a --follow-link -L --help" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
case "$cur" in
*:)
return
;;
*)
# combined container and filename completion
_filedir
local files=( ${COMPREPLY[@]} )
__docker_complete_containers_all
COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
local containers=( ${COMPREPLY[@]} )
COMPREPLY=( $( compgen -W "${files[*]} ${containers[*]}" -- "$cur" ) )
if [[ "${COMPREPLY[*]}" = *: ]]; then
__docker_nospace
fi
return
;;
esac
fi
(( counter++ ))
if [ "$cword" -eq "$counter" ]; then
if [ -e "$prev" ]; then
__docker_complete_containers_all
COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
__docker_nospace
else
_filedir
fi
return
fi
;;
esac
}
_docker_container_create() {
_docker_container_run_and_create
}
_docker_container_diff() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_containers_all
fi
;;
esac
}
_docker_container_exec() {
__docker_complete_detach_keys && return
case "$prev" in
--env|-e)
# we do not append a "=" here because "-e VARNAME" is legal syntax, too
COMPREPLY=( $( compgen -e -- "$cur" ) )
__docker_nospace
return
;;
--user|-u)
__docker_complete_user_group
return
;;
--workdir|-w)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--detach -d --detach-keys --env -e --help --interactive -i --privileged -t --tty -u --user --workdir -w" -- "$cur" ) )
;;
*)
__docker_complete_containers_running
;;
esac
}
_docker_container_export() {
case "$prev" in
--output|-o)
_filedir
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help --output -o" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_containers_all
fi
;;
esac
}
_docker_container_inspect() {
_docker_inspect --type container
}
_docker_container_kill() {
case "$prev" in
--signal|-s)
__docker_complete_signals
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help --signal -s" -- "$cur" ) )
;;
*)
__docker_complete_containers_running
;;
esac
}
_docker_container_logs() {
case "$prev" in
--since|--tail|--until)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--details --follow -f --help --since --tail --timestamps -t --until" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--since|--tail|--until')
if [ "$cword" -eq "$counter" ]; then
__docker_complete_containers_all
fi
;;
esac
}
_docker_container_list() {
_docker_container_ls
}
_docker_container_ls() {
local key=$(__docker_map_key_of_current_option '--filter|-f')
case "$key" in
ancestor)
__docker_complete_images --cur "${cur##*=}" --repo --tag --id
return
;;
before)
__docker_complete_containers_all --cur "${cur##*=}"
return
;;
expose|publish)
return
;;
id)
__docker_complete_containers_all --cur "${cur##*=}" --id
return
;;
health)
COMPREPLY=( $( compgen -W "healthy starting none unhealthy" -- "${cur##*=}" ) )
return
;;
is-task)
COMPREPLY=( $( compgen -W "true false" -- "${cur##*=}" ) )
return
;;
name)
__docker_complete_containers_all --cur "${cur##*=}" --name
return
;;
network)
__docker_complete_networks --cur "${cur##*=}"
return
;;
since)
__docker_complete_containers_all --cur "${cur##*=}"
return
;;
status)
COMPREPLY=( $( compgen -W "created dead exited paused restarting running removing" -- "${cur##*=}" ) )
return
;;
volume)
__docker_complete_volumes --cur "${cur##*=}"
return
;;
esac
case "$prev" in
--filter|-f)
COMPREPLY=( $( compgen -S = -W "ancestor before exited expose health id is-task label name network publish since status volume" -- "$cur" ) )
__docker_nospace
return
;;
--format|--last|-n)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--all -a --filter -f --format --help --last -n --latest -l --no-trunc --quiet -q --size -s" -- "$cur" ) )
;;
esac
}
_docker_container_pause() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
__docker_complete_containers_running
;;
esac
}
_docker_container_port() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_containers_all
fi
;;
esac
}
_docker_container_prune() {
case "$prev" in
--filter)
COMPREPLY=( $( compgen -W "label label! until" -S = -- "$cur" ) )
__docker_nospace
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--force -f --filter --help" -- "$cur" ) )
;;
esac
}
_docker_container_ps() {
_docker_container_ls
}
_docker_container_rename() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_containers_all
fi
;;
esac
}
_docker_container_restart() {
case "$prev" in
--time|-t)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) )
;;
*)
__docker_complete_containers_all
;;
esac
}
_docker_container_rm() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--force -f --help --link -l --volumes -v" -- "$cur" ) )
;;
*)
for arg in "${COMP_WORDS[@]}"; do
case "$arg" in
--force|-f)
__docker_complete_containers_all
return
;;
esac
done
__docker_complete_containers_removable
;;
esac
}
_docker_container_run() {
_docker_container_run_and_create
}
# _docker_container_run_and_create is the combined completion for `_docker_container_run`
# and `_docker_container_create`
_docker_container_run_and_create() {
local options_with_args="
--add-host
--attach -a
--blkio-weight
--blkio-weight-device
--cap-add
--cap-drop
--cgroup-parent
--cidfile
--cpu-period
--cpu-quota
--cpu-rt-period
--cpu-rt-runtime
--cpuset-cpus
--cpus
--cpuset-mems
--cpu-shares -c
--device
--device-cgroup-rule
--device-read-bps
--device-read-iops
--device-write-bps
--device-write-iops
--dns
--dns-option
--dns-search
--domainname
--entrypoint
--env -e
--env-file
--expose
--group-add
--health-cmd
--health-interval
--health-retries
--health-start-period
--health-timeout
--hostname -h
--ip
--ip6
--ipc
--kernel-memory
--label-file
--label -l
--link
--link-local-ip
--log-driver
--log-opt
--mac-address
--memory -m
--memory-swap
--memory-swappiness
--memory-reservation
--mount
--name
--network
--network-alias
--oom-score-adj
--pid
--pids-limit
--publish -p
--restart
--runtime
--security-opt
--shm-size
--stop-signal
--stop-timeout
--storage-opt
--tmpfs
--sysctl
--ulimit
--user -u
--userns
--uts
--volume-driver
--volumes-from
--volume -v
--workdir -w
"
__docker_server_os_is windows && options_with_args+="
--cpu-count
--cpu-percent
--io-maxbandwidth
--io-maxiops
--isolation
"
__docker_server_is_experimental && options_with_args+="
--platform
"
local boolean_options="
--disable-content-trust=false
--help
--init
--interactive -i
--no-healthcheck
--oom-kill-disable
--privileged
--publish-all -P
--read-only
--tty -t
"
if [ "$command" = "run" ] || [ "$subcommand" = "run" ] ; then
options_with_args="$options_with_args
--detach-keys
"
boolean_options="$boolean_options
--detach -d
--rm
--sig-proxy=false
"
__docker_complete_detach_keys && return
fi
local all_options="$options_with_args $boolean_options"
__docker_complete_log_driver_options && return
__docker_complete_restart && return
local key=$(__docker_map_key_of_current_option '--security-opt')
case "$key" in
label)
[[ $cur == *: ]] && return
COMPREPLY=( $( compgen -W "user: role: type: level: disable" -- "${cur##*=}") )
if [ "${COMPREPLY[*]}" != "disable" ] ; then
__docker_nospace
fi
return
;;
seccomp)
local cur=${cur##*=}
_filedir
COMPREPLY+=( $( compgen -W "unconfined" -- "$cur" ) )
return
;;
esac
case "$prev" in
--add-host)
case "$cur" in
*:)
__docker_complete_resolved_hostname
return
;;
esac
;;
--attach|-a)
COMPREPLY=( $( compgen -W 'stdin stdout stderr' -- "$cur" ) )
return
;;
--cap-add)
__docker_complete_capabilities_addable
return
;;
--cap-drop)
__docker_complete_capabilities_droppable
return
;;
--cidfile|--env-file|--label-file)
_filedir
return
;;
--device|--tmpfs|--volume|-v)
case "$cur" in
*:*)
# TODO somehow do _filedir for stuff inside the image, if it's already specified (which is also somewhat difficult to determine)
;;
'')
COMPREPLY=( $( compgen -W '/' -- "$cur" ) )
__docker_nospace
;;
/*)
_filedir
__docker_nospace
;;
esac
return
;;
--env|-e)
# we do not append a "=" here because "-e VARNAME" is legal syntax, too
COMPREPLY=( $( compgen -e -- "$cur" ) )
__docker_nospace
return
;;
--ipc)
case "$cur" in
*:*)
cur="${cur#*:}"
__docker_complete_containers_running
;;
*)
COMPREPLY=( $( compgen -W 'none host private shareable container:' -- "$cur" ) )
if [ "${COMPREPLY[*]}" = "container:" ]; then
__docker_nospace
fi
;;
esac
return
;;
--isolation)
if __docker_server_os_is windows ; then
__docker_complete_isolation
return
fi
;;
--link)
case "$cur" in
*:*)
;;
*)
__docker_complete_containers_running
COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
__docker_nospace
;;
esac
return
;;
--log-driver)
__docker_complete_log_drivers
return
;;
--log-opt)
__docker_complete_log_options
return
;;
--network)
case "$cur" in
container:*)
__docker_complete_containers_all --cur "${cur#*:}"
;;
*)
COMPREPLY=( $( compgen -W "$(__docker_plugins_bundled --type Network) $(__docker_networks) container:" -- "$cur") )
if [ "${COMPREPLY[*]}" = "container:" ] ; then
__docker_nospace
fi
;;
esac
return
;;
--pid)
case "$cur" in
*:*)
__docker_complete_containers_running --cur "${cur#*:}"
;;
*)
COMPREPLY=( $( compgen -W 'host container:' -- "$cur" ) )
if [ "${COMPREPLY[*]}" = "container:" ]; then
__docker_nospace
fi
;;
esac
return
;;
--runtime)
__docker_complete_runtimes
return
;;
--security-opt)
COMPREPLY=( $( compgen -W "apparmor= label= no-new-privileges seccomp= systempaths=unconfined" -- "$cur") )
if [[ ${COMPREPLY[*]} = *= ]] ; then
__docker_nospace
fi
return
;;
--stop-signal)
__docker_complete_signals
return
;;
--storage-opt)
COMPREPLY=( $( compgen -W "size" -S = -- "$cur") )
__docker_nospace
return
;;
--user|-u)
__docker_complete_user_group
return
;;
--userns)
COMPREPLY=( $( compgen -W "host" -- "$cur" ) )
return
;;
--volume-driver)
__docker_complete_plugins_bundled --type Volume
return
;;
--volumes-from)
__docker_complete_containers_all
return
;;
$(__docker_to_extglob "$options_with_args") )
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
local counter=$( __docker_pos_first_nonflag "$( __docker_to_alternatives "$options_with_args" )" )
if [ "$cword" -eq "$counter" ]; then
__docker_complete_images --repo --tag --id
fi
;;
esac
}
_docker_container_start() {
__docker_complete_detach_keys && return
case "$prev" in
--checkpoint)
if __docker_server_is_experimental ; then
return
fi
;;
--checkpoint-dir)
if __docker_server_is_experimental ; then
_filedir -d
return
fi
;;
esac
case "$cur" in
-*)
local options="--attach -a --detach-keys --help --interactive -i"
__docker_server_is_experimental && options+=" --checkpoint --checkpoint-dir"
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
;;
*)
__docker_complete_containers_stopped
;;
esac
}
_docker_container_stats() {
case "$prev" in
--format)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--all -a --format --help --no-stream --no-trunc" -- "$cur" ) )
;;
*)
__docker_complete_containers_running
;;
esac
}
_docker_container_stop() {
case "$prev" in
--time|-t)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help --time -t" -- "$cur" ) )
;;
*)
__docker_complete_containers_stoppable
;;
esac
}
_docker_container_top() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_containers_running
fi
;;
esac
}
_docker_container_unpause() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_containers_unpauseable
fi
;;
esac
}
_docker_container_update() {
local options_with_args="
--blkio-weight
--cpu-period
--cpu-quota
--cpu-rt-period
--cpu-rt-runtime
--cpus
--cpuset-cpus
--cpuset-mems
--cpu-shares -c
--kernel-memory
--memory -m
--memory-reservation
--memory-swap
--pids-limit
--restart
"
local boolean_options="
--help
"
local all_options="$options_with_args $boolean_options"
__docker_complete_restart && return
case "$prev" in
$(__docker_to_extglob "$options_with_args") )
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
__docker_complete_containers_all
;;
esac
}
_docker_container_wait() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
__docker_complete_containers_all
;;
esac
}
_docker_context() {
local subcommands="
create
export
import
inspect
ls
rm
update
use
"
local aliases="
list
remove
"
__docker_subcommands "$subcommands $aliases" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_docker_context_create() {
case "$prev" in
--default-stack-orchestrator)
COMPREPLY=( $( compgen -W "all kubernetes swarm" -- "$cur" ) )
return
;;
--description|--docker|--kubernetes)
return
;;
--from)
__docker_complete_contexts
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--default-stack-orchestrator --description --docker --from --help --kubernetes" -- "$cur" ) )
;;
esac
}
_docker_context_export() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help --kubeconfig" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_contexts
elif [ "$cword" -eq "$((counter + 1))" ]; then
_filedir
fi
;;
esac
}
_docker_context_import() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
:
elif [ "$cword" -eq "$((counter + 1))" ]; then
_filedir
fi
;;
esac
}
_docker_context_inspect() {
case "$prev" in
--format|-f)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) )
;;
*)
__docker_complete_contexts
;;
esac
}
_docker_context_list() {
_docker_context_ls
}
_docker_context_ls() {
case "$prev" in
--format|-f)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--format -f --help --quiet -q" -- "$cur" ) )
;;
esac
}
_docker_context_remove() {
_docker_context_rm
}
_docker_context_rm() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
;;
*)
__docker_complete_contexts
;;
esac
}
_docker_context_update() {
case "$prev" in
--default-stack-orchestrator)
COMPREPLY=( $( compgen -W "all kubernetes swarm" -- "$cur" ) )
return
;;
--description|--docker|--kubernetes)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--default-stack-orchestrator --description --docker --help --kubernetes" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_contexts
fi
;;
esac
}
_docker_context_use() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_contexts --add default
fi
;;
esac
}
_docker_commit() {
_docker_container_commit
}
_docker_cp() {
_docker_container_cp
}
_docker_create() {
_docker_container_create
}
_docker_daemon() {
local boolean_options="
$global_boolean_options
--experimental
--help
--icc=false
--init
--ip-forward=false
--ip-masq=false
--iptables=false
--ipv6
--live-restore
--no-new-privileges
--raw-logs
--selinux-enabled
--userland-proxy=false
--version -v
"
local options_with_args="
$global_options_with_args
--add-runtime
--allow-nondistributable-artifacts
--api-cors-header
--authorization-plugin
--bip
--bridge -b
--cgroup-parent
--cluster-advertise
--cluster-store
--cluster-store-opt
--config-file
--containerd
--cpu-rt-period
--cpu-rt-runtime
--data-root
--default-address-pool
--default-gateway
--default-gateway-v6
--default-runtime
--default-shm-size
--default-ulimit
--dns
--dns-search
--dns-opt
--exec-opt
--exec-root
--fixed-cidr
--fixed-cidr-v6
--group -G
--init-path
--insecure-registry
--ip
--label
--log-driver
--log-opt
--max-concurrent-downloads
--max-concurrent-uploads
--metrics-addr
--mtu
--network-control-plane-mtu
--node-generic-resource
--oom-score-adjust
--pidfile -p
--registry-mirror
--seccomp-profile
--shutdown-timeout
--storage-driver -s
--storage-opt
--swarm-default-advertise-addr
--userland-proxy-path
--userns-remap
"
__docker_complete_log_driver_options && return
key=$(__docker_map_key_of_current_option '--cluster-store-opt')
case "$key" in
kv.*file)
cur=${cur##*=}
_filedir
return
;;
esac
local key=$(__docker_map_key_of_current_option '--storage-opt')
case "$key" in
dm.blkdiscard|dm.override_udev_sync_check|dm.use_deferred_removal|dm.use_deferred_deletion)
COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
return
;;
dm.directlvm_device|dm.thinpooldev)
cur=${cur##*=}
_filedir
return
;;
dm.fs)
COMPREPLY=( $( compgen -W "ext4 xfs" -- "${cur##*=}" ) )
return
;;
dm.libdm_log_level)
COMPREPLY=( $( compgen -W "2 3 4 5 6 7" -- "${cur##*=}" ) )
return
;;
esac
case "$prev" in
--authorization-plugin)
__docker_complete_plugins_bundled --type Authorization
return
;;
--cluster-store)
COMPREPLY=( $( compgen -W "consul etcd zk" -S "://" -- "$cur" ) )
__docker_nospace
return
;;
--cluster-store-opt)
COMPREPLY=( $( compgen -W "discovery.heartbeat discovery.ttl kv.cacertfile kv.certfile kv.keyfile kv.path" -S = -- "$cur" ) )
__docker_nospace
return
;;
--config-file|--containerd|--init-path|--pidfile|-p|--tlscacert|--tlscert|--tlskey|--userland-proxy-path)
_filedir
return
;;
--exec-root|--data-root)
_filedir -d
return
;;
--log-driver)
__docker_complete_log_drivers
return
;;
--storage-driver|-s)
COMPREPLY=( $( compgen -W "aufs btrfs overlay2 vfs zfs" -- "$(echo "$cur" | tr '[:upper:]' '[:lower:]')" ) )
return
;;
--storage-opt)
local btrfs_options="btrfs.min_space"
local overlay2_options="overlay2.size"
local zfs_options="zfs.fsname"
local all_options="$btrfs_options $overlay2_options $zfs_options"
case $(__docker_value_of_option '--storage-driver|-s') in
'')
COMPREPLY=( $( compgen -W "$all_options" -S = -- "$cur" ) )
;;
btrfs)
COMPREPLY=( $( compgen -W "$btrfs_options" -S = -- "$cur" ) )
;;
overlay2)
COMPREPLY=( $( compgen -W "$overlay2_options" -S = -- "$cur" ) )
;;
zfs)
COMPREPLY=( $( compgen -W "$zfs_options" -S = -- "$cur" ) )
;;
*)
return
;;
esac
__docker_nospace
return
;;
--log-level|-l)
__docker_complete_log_levels
return
;;
--log-opt)
__docker_complete_log_options
return
;;
--metrics-addr)
__docker_complete_local_ips
__docker_append_to_completions ":"
__docker_nospace
return
;;
--seccomp-profile)
_filedir json
return
;;
--swarm-default-advertise-addr)
__docker_complete_local_interfaces
return
;;
--userns-remap)
__docker_complete_user_group
return
;;
$(__docker_to_extglob "$options_with_args") )
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$boolean_options $options_with_args" -- "$cur" ) )
;;
esac
}
_docker_deploy() {
__docker_server_is_experimental && _docker_stack_deploy
}
_docker_diff() {
_docker_container_diff
}
_docker_engine() {
local subcommands="
activate
check
update
"
__docker_subcommands "$subcommands" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_docker_engine_activate() {
case "$prev" in
--containerd|--engine-image|--format|--license|--registry-prefix|--version)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--containerd --display-only --engine-image --format --help --license --quiet --registry-prefix --version" -- "$cur" ) )
;;
esac
}
_docker_engine_check() {
case "$prev" in
--containerd|--engine-image|--format|--registry-prefix)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--containerd --downgrades --engine-image --format --help --pre-releases --quiet -q --registry-prefix --upgrades" -- "$cur" ) )
;;
esac
}
_docker_engine_update() {
case "$prev" in
--containerd|--engine-image|--registry-prefix|--version)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--containerd --engine-image --help --registry-prefix --version" -- "$cur" ) )
;;
esac
}
_docker_events() {
_docker_system_events
}
_docker_exec() {
_docker_container_exec
}
_docker_export() {
_docker_container_export
}
_docker_help() {
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
fi
}
_docker_history() {
_docker_image_history
}
_docker_image() {
local subcommands="
build
history
import
inspect
load
ls
prune
pull
push
rm
save
tag
"
local aliases="
images
list
remove
rmi
"
__docker_subcommands "$subcommands $aliases" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_docker_image_build() {
local options_with_args="
--add-host
--build-arg
--cache-from
--cgroup-parent
--cpuset-cpus
--cpuset-mems
--cpu-shares -c
--cpu-period
--cpu-quota
--file -f
--iidfile
--label
--memory -m
--memory-swap
--network
--shm-size
--tag -t
--target
--ulimit
"
__docker_server_os_is windows && options_with_args+="
--isolation
"
local boolean_options="
--disable-content-trust=false
--force-rm
--help
--no-cache
--pull
--quiet -q
--rm
"
if __docker_server_is_experimental ; then
options_with_args+="
--platform
"
boolean_options+="
--squash
"
fi
if [ "$DOCKER_BUILDKIT" = "1" ] ; then
options_with_args+="
--output -o
--platform
--progress
--secret
--ssh
"
else
boolean_options+="
--compress
"
if __docker_server_is_experimental ; then
boolean_options+="
--stream
"
fi
fi
local all_options="$options_with_args $boolean_options"
case "$prev" in
--add-host)
case "$cur" in
*:)
__docker_complete_resolved_hostname
return
;;
esac
;;
--build-arg)
COMPREPLY=( $( compgen -e -- "$cur" ) )
__docker_nospace
return
;;
--cache-from)
__docker_complete_images --repo --tag --id
return
;;
--file|-f|--iidfile)
_filedir
return
;;
--isolation)
if __docker_server_os_is windows ; then
__docker_complete_isolation
return
fi
;;
--network)
case "$cur" in
container:*)
__docker_complete_containers_all --cur "${cur#*:}"
;;
*)
COMPREPLY=( $( compgen -W "$(__docker_plugins_bundled --type Network) $(__docker_networks) container:" -- "$cur") )
if [ "${COMPREPLY[*]}" = "container:" ] ; then
__docker_nospace
fi
;;
esac
return
;;
--progress)
COMPREPLY=( $( compgen -W "auto plain tty" -- "$cur" ) )
return
;;
--tag|-t)
__docker_complete_images --repo --tag
return
;;
--target)
local context_pos=$( __docker_pos_first_nonflag "$( __docker_to_alternatives "$options_with_args" )" )
local context="${words[$context_pos]}"
context="${context:-.}"
local file="$( __docker_value_of_option '--file|f' )"
local default_file="${context%/}/Dockerfile"
local dockerfile="${file:-$default_file}"
local targets="$( sed -n 's/^FROM .\+ AS \(.\+\)/\1/p' "$dockerfile" 2>/dev/null )"
COMPREPLY=( $( compgen -W "$targets" -- "$cur" ) )
return
;;
$(__docker_to_extglob "$options_with_args") )
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
local counter=$( __docker_pos_first_nonflag "$( __docker_to_alternatives "$options_with_args" )" )
if [ "$cword" -eq "$counter" ]; then
_filedir -d
fi
;;
esac
}
_docker_image_history() {
case "$prev" in
--format)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--format --help --human=false -H=false --no-trunc --quiet -q" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--format')
if [ "$cword" -eq "$counter" ]; then
__docker_complete_images --force-tag --id
fi
;;
esac
}
_docker_image_images() {
_docker_image_ls
}
_docker_image_import() {
case "$prev" in
--change|-c|--message|-m|--platform)
return
;;
esac
case "$cur" in
-*)
local options="--change -c --help --message -m"
__docker_server_is_experimental && options+=" --platform"
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--change|-c|--message|-m')
if [ "$cword" -eq "$counter" ]; then
_filedir
return
elif [ "$cword" -eq "$((counter + 1))" ]; then
__docker_complete_images --repo --tag
return
fi
;;
esac
}
_docker_image_inspect() {
_docker_inspect --type image
}
_docker_image_load() {
case "$prev" in
--input|-i|"<")
_filedir
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help --input -i --quiet -q" -- "$cur" ) )
;;
esac
}
_docker_image_list() {
_docker_image_ls
}
_docker_image_ls() {
local key=$(__docker_map_key_of_current_option '--filter|-f')
case "$key" in
before|since)
__docker_complete_images --cur "${cur##*=}" --force-tag --id
return
;;
dangling)
COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
return
;;
label)
return
;;
reference)
__docker_complete_images --cur "${cur##*=}" --repo --tag
return
;;
esac
case "$prev" in
--filter|-f)
COMPREPLY=( $( compgen -S = -W "before dangling label reference since" -- "$cur" ) )
__docker_nospace
return
;;
--format)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--all -a --digests --filter -f --format --help --no-trunc --quiet -q" -- "$cur" ) )
;;
=)
return
;;
*)
__docker_complete_images --repo --tag
;;
esac
}
_docker_image_prune() {
case "$prev" in
--filter)
COMPREPLY=( $( compgen -W "label label! until" -S = -- "$cur" ) )
__docker_nospace
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--all -a --force -f --filter --help" -- "$cur" ) )
;;
esac
}
_docker_image_pull() {
case "$prev" in
--platform)
return
;;
esac
case "$cur" in
-*)
local options="--all-tags -a --disable-content-trust=false --help --quiet -q"
__docker_server_is_experimental && options+=" --platform"
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag --platform)
if [ "$cword" -eq "$counter" ]; then
for arg in "${COMP_WORDS[@]}"; do
case "$arg" in
--all-tags|-a)
__docker_complete_images --repo
return
;;
esac
done
__docker_complete_images --repo --tag
fi
;;
esac
}
_docker_image_push() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--disable-content-trust=false --help" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_images --repo --tag
fi
;;
esac
}
_docker_image_remove() {
_docker_image_rm
}
_docker_image_rm() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--force -f --help --no-prune" -- "$cur" ) )
;;
*)
__docker_complete_images --force-tag --id
;;
esac
}
_docker_image_rmi() {
_docker_image_rm
}
_docker_image_save() {
case "$prev" in
--output|-o|">")
_filedir
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help --output -o" -- "$cur" ) )
;;
*)
__docker_complete_images --repo --tag --id
;;
esac
}
_docker_image_tag() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_images --force-tag --id
return
elif [ "$cword" -eq "$((counter + 1))" ]; then
__docker_complete_images --repo --tag
return
fi
;;
esac
}
_docker_images() {
_docker_image_ls
}
_docker_import() {
_docker_image_import
}
_docker_info() {
_docker_system_info
}
_docker_inspect() {
local preselected_type
local type
if [ "$1" = "--type" ] ; then
preselected_type=yes
type="$2"
else
type=$(__docker_value_of_option --type)
fi
case "$prev" in
--format|-f)
return
;;
--type)
if [ -z "$preselected_type" ] ; then
COMPREPLY=( $( compgen -W "container image network node plugin secret service volume" -- "$cur" ) )
return
fi
;;
esac
case "$cur" in
-*)
local options="--format -f --help --size -s"
if [ -z "$preselected_type" ] ; then
options+=" --type"
fi
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
;;
*)
case "$type" in
'')
COMPREPLY=( $( compgen -W "
$(__docker_containers --all)
$(__docker_images --force-tag --id)
$(__docker_networks)
$(__docker_nodes)
$(__docker_plugins_installed)
$(__docker_secrets)
$(__docker_services)
$(__docker_volumes)
" -- "$cur" ) )
__ltrim_colon_completions "$cur"
;;
container)
__docker_complete_containers_all
;;
image)
__docker_complete_images --force-tag --id
;;
network)
__docker_complete_networks
;;
node)
__docker_complete_nodes
;;
plugin)
__docker_complete_plugins_installed
;;
secret)
__docker_complete_secrets
;;
service)
__docker_complete_services
;;
volume)
__docker_complete_volumes
;;
esac
esac
}
_docker_kill() {
_docker_container_kill
}
_docker_load() {
_docker_image_load
}
_docker_login() {
case "$prev" in
--password|-p|--username|-u)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help --password -p --password-stdin --username -u" -- "$cur" ) )
;;
esac
}
_docker_logout() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
esac
}
_docker_logs() {
_docker_container_logs
}
_docker_network_connect() {
local options_with_args="
--alias
--ip
--ip6
--link
--link-local-ip
"
local boolean_options="
--help
"
case "$prev" in
--link)
case "$cur" in
*:*)
;;
*)
__docker_complete_containers_running
COMPREPLY=( $( compgen -W "${COMPREPLY[*]}" -S ':' ) )
__docker_nospace
;;
esac
return
;;
$(__docker_to_extglob "$options_with_args") )
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$boolean_options $options_with_args" -- "$cur" ) )
;;
*)
local counter=$( __docker_pos_first_nonflag "$( __docker_to_alternatives "$options_with_args" )" )
if [ "$cword" -eq "$counter" ]; then
__docker_complete_networks
elif [ "$cword" -eq "$((counter + 1))" ]; then
__docker_complete_containers_all
fi
;;
esac
}
_docker_network_create() {
case "$prev" in
--aux-address|--gateway|--ip-range|--ipam-opt|--ipv6|--opt|-o|--subnet)
return
;;
--config-from)
__docker_complete_networks
return
;;
--driver|-d)
# remove drivers that allow one instance only, add drivers missing in `docker info`
__docker_complete_plugins_bundled --type Network --remove host --remove null --add macvlan
return
;;
--ipam-driver)
COMPREPLY=( $( compgen -W "default" -- "$cur" ) )
return
;;
--label)
return
;;
--scope)
COMPREPLY=( $( compgen -W "local swarm" -- "$cur" ) )
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--attachable --aux-address --config-from --config-only --driver -d --gateway --help --ingress --internal --ip-range --ipam-driver --ipam-opt --ipv6 --label --opt -o --scope --subnet" -- "$cur" ) )
;;
esac
}
_docker_network_disconnect() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_networks
elif [ "$cword" -eq "$((counter + 1))" ]; then
__docker_complete_containers_in_network "$prev"
fi
;;
esac
}
_docker_network_inspect() {
case "$prev" in
--format|-f)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--format -f --help --verbose" -- "$cur" ) )
;;
*)
__docker_complete_networks
esac
}
_docker_network_ls() {
local key=$(__docker_map_key_of_current_option '--filter|-f')
case "$key" in
dangling)
COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
return
;;
driver)
__docker_complete_plugins_bundled --cur "${cur##*=}" --type Network --add macvlan
return
;;
id)
__docker_complete_networks --cur "${cur##*=}" --id
return
;;
name)
__docker_complete_networks --cur "${cur##*=}" --name
return
;;
scope)
COMPREPLY=( $( compgen -W "global local swarm" -- "${cur##*=}" ) )
return
;;
type)
COMPREPLY=( $( compgen -W "builtin custom" -- "${cur##*=}" ) )
return
;;
esac
case "$prev" in
--filter|-f)
COMPREPLY=( $( compgen -S = -W "dangling driver id label name scope type" -- "$cur" ) )
__docker_nospace
return
;;
--format)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--filter -f --format --help --no-trunc --quiet -q" -- "$cur" ) )
;;
esac
}
_docker_network_prune() {
case "$prev" in
--filter)
COMPREPLY=( $( compgen -W "label label! until" -S = -- "$cur" ) )
__docker_nospace
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--force -f --filter --help" -- "$cur" ) )
;;
esac
}
_docker_network_rm() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
__docker_complete_networks --filter type=custom
esac
}
_docker_network() {
local subcommands="
connect
create
disconnect
inspect
ls
prune
rm
"
local aliases="
list
remove
"
__docker_subcommands "$subcommands $aliases" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_docker_service() {
local subcommands="
create
inspect
logs
ls
rm
rollback
scale
ps
update
"
local aliases="
list
remove
"
__docker_subcommands "$subcommands $aliases" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_docker_service_create() {
_docker_service_update_and_create
}
_docker_service_inspect() {
case "$prev" in
--format|-f)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--format -f --help --pretty" -- "$cur" ) )
;;
*)
__docker_complete_services
esac
}
_docker_service_logs() {
case "$prev" in
--since|--tail)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--details --follow -f --help --no-resolve --no-task-ids --no-trunc --raw --since --tail --timestamps -t" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--since|--tail')
if [ "$cword" -eq "$counter" ]; then
__docker_complete_services_and_tasks
fi
;;
esac
}
_docker_service_list() {
_docker_service_ls
}
_docker_service_ls() {
local key=$(__docker_map_key_of_current_option '--filter|-f')
case "$key" in
id)
__docker_complete_services --cur "${cur##*=}" --id
return
;;
mode)
COMPREPLY=( $( compgen -W "global replicated" -- "${cur##*=}" ) )
return
;;
name)
__docker_complete_services --cur "${cur##*=}" --name
return
;;
esac
case "$prev" in
--filter|-f)
COMPREPLY=( $( compgen -W "id label mode name" -S = -- "$cur" ) )
__docker_nospace
return
;;
--format)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--filter -f --format --help --quiet -q" -- "$cur" ) )
;;
esac
}
_docker_service_remove() {
_docker_service_rm
}
_docker_service_rm() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
__docker_complete_services
esac
}
_docker_service_rollback() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--detach -d --help --quit -q" -- "$cur" ) )
;;
*)
local counter=$( __docker_pos_first_nonflag )
if [ "$cword" -eq "$counter" ]; then
__docker_complete_services
fi
;;
esac
}
_docker_service_scale() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--detach -d --help" -- "$cur" ) )
;;
*)
__docker_complete_services
__docker_append_to_completions "="
__docker_nospace
;;
esac
}
_docker_service_ps() {
local key=$(__docker_map_key_of_current_option '--filter|-f')
case "$key" in
desired-state)
COMPREPLY=( $( compgen -W "accepted running shutdown" -- "${cur##*=}" ) )
return
;;
name)
__docker_complete_services --cur "${cur##*=}" --name
return
;;
node)
__docker_complete_nodes --cur "${cur##*=}" --add self
return
;;
esac
case "$prev" in
--filter|-f)
COMPREPLY=( $( compgen -W "desired-state id name node" -S = -- "$cur" ) )
__docker_nospace
return
;;
--format)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--filter -f --format --help --no-resolve --no-trunc --quiet -q" -- "$cur" ) )
;;
*)
__docker_complete_services
;;
esac
}
_docker_service_update() {
_docker_service_update_and_create
}
# _docker_service_update_and_create is the combined completion for `docker service create`
# and `docker service update`
_docker_service_update_and_create() {
local options_with_args="
--endpoint-mode
--entrypoint
--health-cmd
--health-interval
--health-retries
--health-start-period
--health-timeout
--hostname
--isolation
--limit-cpu
--limit-memory
--log-driver
--log-opt
--replicas
--replicas-max-per-node
--reserve-cpu
--reserve-memory
--restart-condition
--restart-delay
--restart-max-attempts
--restart-window
--rollback-delay
--rollback-failure-action
--rollback-max-failure-ratio
--rollback-monitor
--rollback-order
--rollback-parallelism
--stop-grace-period
--stop-signal
--update-delay
--update-failure-action
--update-max-failure-ratio
--update-monitor
--update-order
--update-parallelism
--user -u
--workdir -w
"
__docker_server_os_is windows && options_with_args+="
--credential-spec
"
local boolean_options="
--detach -d
--help
--init
--no-healthcheck
--no-resolve-image
--read-only
--tty -t
--with-registry-auth
"
__docker_complete_log_driver_options && return
if [ "$subcommand" = "create" ] ; then
options_with_args="$options_with_args
--config
--constraint
--container-label
--dns
--dns-option
--dns-search
--env -e
--env-file
--generic-resource
--group
--host
--label -l
--mode
--mount
--name
--network
--placement-pref
--publish -p
--secret
--sysctl
"
case "$prev" in
--env-file)
_filedir
return
;;
--mode)
COMPREPLY=( $( compgen -W "global replicated" -- "$cur" ) )
return
;;
esac
fi
if [ "$subcommand" = "update" ] ; then
options_with_args="$options_with_args
--args
--config-add
--config-rm
--constraint-add
--constraint-rm
--container-label-add
--container-label-rm
--dns-add
--dns-option-add
--dns-option-rm
--dns-rm
--dns-search-add
--dns-search-rm
--env-add
--env-rm
--generic-resource-add
--generic-resource-rm
--group-add
--group-rm
--host-add
--host-rm
--image
--label-add
--label-rm
--mount-add
--mount-rm
--network-add
--network-rm
--placement-pref-add
--placement-pref-rm
--publish-add
--publish-rm
--rollback
--secret-add
--secret-rm
--sysctl-add
--sysctl-rm
"
boolean_options="$boolean_options
--force
"
case "$prev" in
--env-rm)
COMPREPLY=( $( compgen -e -- "$cur" ) )
return
;;
--image)
__docker_complete_images --repo --tag --id
return
;;
esac
fi
local strategy=$(__docker_map_key_of_current_option '--placement-pref|--placement-pref-add|--placement-pref-rm')
case "$strategy" in
spread)
COMPREPLY=( $( compgen -W "engine.labels node.labels" -S . -- "${cur##*=}" ) )
__docker_nospace
return
;;
esac
case "$prev" in
--config|--config-add|--config-rm)
__docker_complete_configs
return
;;
--endpoint-mode)
COMPREPLY=( $( compgen -W "dnsrr vip" -- "$cur" ) )
return
;;
--env|-e|--env-add)
# we do not append a "=" here because "-e VARNAME" is legal systax, too
COMPREPLY=( $( compgen -e -- "$cur" ) )
__docker_nospace
return
;;
--group|--group-add|--group-rm)
COMPREPLY=( $(compgen -g -- "$cur") )
return
;;
--host|--host-add|--host-rm)
case "$cur" in
*:)
__docker_complete_resolved_hostname
return
;;
esac
;;
--isolation)
__docker_complete_isolation
return
;;
--log-driver)
__docker_complete_log_drivers
return
;;
--log-opt)
__docker_complete_log_options
return
;;
--network|--network-add|--network-rm)
__docker_complete_networks
return
;;
--placement-pref|--placement-pref-add|--placement-pref-rm)
COMPREPLY=( $( compgen -W "spread" -S = -- "$cur" ) )
__docker_nospace
return
;;
--restart-condition)
COMPREPLY=( $( compgen -W "any none on-failure" -- "$cur" ) )
return
;;
--rollback-failure-action)
COMPREPLY=( $( compgen -W "continue pause" -- "$cur" ) )
return
;;
--secret|--secret-add|--secret-rm)
__docker_complete_secrets
return
;;
--stop-signal)
__docker_complete_signals
return
;;
--update-failure-action)
COMPREPLY=( $( compgen -W "continue pause rollback" -- "$cur" ) )
return
;;
--update-order|--rollback-order)
COMPREPLY=( $( compgen -W "start-first stop-first" -- "$cur" ) )
return
;;
--user|-u)
__docker_complete_user_group
return
;;
$(__docker_to_extglob "$options_with_args") )
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$boolean_options $options_with_args" -- "$cur" ) )
;;
*)
local counter=$( __docker_pos_first_nonflag "$( __docker_to_alternatives "$options_with_args" )" )
if [ "$subcommand" = "update" ] ; then
if [ "$cword" -eq "$counter" ]; then
__docker_complete_services
fi
else
if [ "$cword" -eq "$counter" ]; then
__docker_complete_images --repo --tag --id
fi
fi
;;
esac
}
_docker_swarm() {
local subcommands="
ca
init
join
join-token
leave
unlock
unlock-key
update
"
__docker_subcommands "$subcommands" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_docker_swarm_ca() {
case "$prev" in
--ca-cert|--ca-key)
_filedir
return
;;
--cert-expiry|--external-ca)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--ca-cert --ca-key --cert-expiry --detach -d --external-ca --help --quiet -q --rotate" -- "$cur" ) )
;;
esac
}
_docker_swarm_init() {
case "$prev" in
--advertise-addr)
if [[ $cur == *: ]] ; then
COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) )
else
__docker_complete_local_interfaces
__docker_nospace
fi
return
;;
--availability)
COMPREPLY=( $( compgen -W "active drain pause" -- "$cur" ) )
return
;;
--cert-expiry|--data-path-port|--default-addr-pool|--default-addr-pool-mask-length|--dispatcher-heartbeat|--external-ca|--max-snapshots|--snapshot-interval|--task-history-limit )
return
;;
--data-path-addr)
__docker_complete_local_interfaces
return
;;
--listen-addr)
if [[ $cur == *: ]] ; then
COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) )
else
__docker_complete_local_interfaces --add 0.0.0.0
__docker_nospace
fi
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--advertise-addr --autolock --availability --cert-expiry --data-path-addr --data-path-port --default-addr-pool --default-addr-pool-mask-length --dispatcher-heartbeat --external-ca --force-new-cluster --help --listen-addr --max-snapshots --snapshot-interval --task-history-limit " -- "$cur" ) )
;;
esac
}
_docker_swarm_join() {
case "$prev" in
--advertise-addr)
if [[ $cur == *: ]] ; then
COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) )
else
__docker_complete_local_interfaces
__docker_nospace
fi
return
;;
--availability)
COMPREPLY=( $( compgen -W "active drain pause" -- "$cur" ) )
return
;;
--data-path-addr)
__docker_complete_local_interfaces
return
;;
--listen-addr)
if [[ $cur == *: ]] ; then
COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) )
else
__docker_complete_local_interfaces --add 0.0.0.0
__docker_nospace
fi
return
;;
--token)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--advertise-addr --availability --data-path-addr --help --listen-addr --token" -- "$cur" ) )
;;
*:)
COMPREPLY=( $( compgen -W "2377" -- "${cur##*:}" ) )
;;
esac
}
_docker_swarm_join_token() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help --quiet -q --rotate" -- "$cur" ) )
;;
*)
local counter=$( __docker_pos_first_nonflag )
if [ "$cword" -eq "$counter" ]; then
COMPREPLY=( $( compgen -W "manager worker" -- "$cur" ) )
fi
;;
esac
}
_docker_swarm_leave() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
;;
esac
}
_docker_swarm_unlock() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
esac
}
_docker_swarm_unlock_key() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help --quiet -q --rotate" -- "$cur" ) )
;;
esac
}
_docker_swarm_update() {
case "$prev" in
--cert-expiry|--dispatcher-heartbeat|--external-ca|--max-snapshots|--snapshot-interval|--task-history-limit)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--autolock --cert-expiry --dispatcher-heartbeat --external-ca --help --max-snapshots --snapshot-interval --task-history-limit" -- "$cur" ) )
;;
esac
}
_docker_manifest() {
local subcommands="
annotate
create
inspect
push
"
__docker_subcommands "$subcommands" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_docker_manifest_annotate() {
case "$prev" in
--arch)
COMPREPLY=( $( compgen -W "
386
amd64
arm
arm64
mips64
mips64le
ppc64le
s390x" -- "$cur" ) )
return
;;
--os)
COMPREPLY=( $( compgen -W "
darwin
dragonfly
freebsd
linux
netbsd
openbsd
plan9
solaris
windows" -- "$cur" ) )
return
;;
--os-features|--variant)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--arch --help --os --os-features --variant" -- "$cur" ) )
;;
*)
local counter=$( __docker_pos_first_nonflag "--arch|--os|--os-features|--variant" )
if [ "$cword" -eq "$counter" ] || [ "$cword" -eq "$((counter + 1))" ]; then
__docker_complete_images --force-tag --id
fi
;;
esac
}
_docker_manifest_create() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--amend -a --help --insecure" -- "$cur" ) )
;;
*)
__docker_complete_images --force-tag --id
;;
esac
}
_docker_manifest_inspect() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help --insecure --verbose -v" -- "$cur" ) )
;;
*)
local counter=$( __docker_pos_first_nonflag )
if [ "$cword" -eq "$counter" ] || [ "$cword" -eq "$((counter + 1))" ]; then
__docker_complete_images --force-tag --id
fi
;;
esac
}
_docker_manifest_push() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help --insecure --purge -p" -- "$cur" ) )
;;
*)
local counter=$( __docker_pos_first_nonflag )
if [ "$cword" -eq "$counter" ]; then
__docker_complete_images --force-tag --id
fi
;;
esac
}
_docker_node() {
local subcommands="
demote
inspect
ls
promote
rm
ps
update
"
local aliases="
list
remove
"
__docker_subcommands "$subcommands $aliases" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_docker_node_demote() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
__docker_complete_nodes --filter role=manager
esac
}
_docker_node_inspect() {
case "$prev" in
--format|-f)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--format -f --help --pretty" -- "$cur" ) )
;;
*)
__docker_complete_nodes --add self
esac
}
_docker_node_list() {
_docker_node_ls
}
_docker_node_ls() {
local key=$(__docker_map_key_of_current_option '--filter|-f')
case "$key" in
id)
__docker_complete_nodes --cur "${cur##*=}" --id
return
;;
membership)
COMPREPLY=( $( compgen -W "accepted pending" -- "${cur##*=}" ) )
return
;;
name)
__docker_complete_nodes --cur "${cur##*=}" --name
return
;;
role)
COMPREPLY=( $( compgen -W "manager worker" -- "${cur##*=}" ) )
return
;;
esac
case "$prev" in
--filter|-f)
COMPREPLY=( $( compgen -W "id label membership name role" -S = -- "$cur" ) )
__docker_nospace
return
;;
--format)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--filter -f --format --help --quiet -q" -- "$cur" ) )
;;
esac
}
_docker_node_promote() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
__docker_complete_nodes --filter role=worker
esac
}
_docker_node_remove() {
_docker_node_rm
}
_docker_node_rm() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
;;
*)
__docker_complete_nodes
esac
}
_docker_node_ps() {
local key=$(__docker_map_key_of_current_option '--filter|-f')
case "$key" in
desired-state)
COMPREPLY=( $( compgen -W "accepted running shutdown" -- "${cur##*=}" ) )
return
;;
name)
__docker_complete_services --cur "${cur##*=}" --name
return
;;
esac
case "$prev" in
--filter|-f)
COMPREPLY=( $( compgen -W "desired-state id label name" -S = -- "$cur" ) )
__docker_nospace
return
;;
--format)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--filter -f --format --help --no-resolve --no-trunc --quiet -q" -- "$cur" ) )
;;
*)
__docker_complete_nodes --add self
;;
esac
}
_docker_node_update() {
case "$prev" in
--availability)
COMPREPLY=( $( compgen -W "active drain pause" -- "$cur" ) )
return
;;
--role)
COMPREPLY=( $( compgen -W "manager worker" -- "$cur" ) )
return
;;
--label-add|--label-rm)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--availability --help --label-add --label-rm --role" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--availability|--label-add|--label-rm|--role')
if [ "$cword" -eq "$counter" ]; then
__docker_complete_nodes
fi
;;
esac
}
_docker_pause() {
_docker_container_pause
}
_docker_plugin() {
local subcommands="
create
disable
enable
inspect
install
ls
push
rm
set
upgrade
"
local aliases="
list
remove
"
__docker_subcommands "$subcommands $aliases" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_docker_plugin_create() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--compress --help" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
# reponame
return
elif [ "$cword" -eq "$((counter + 1))" ]; then
_filedir -d
fi
;;
esac
}
_docker_plugin_disable() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_plugins_installed --filter enabled=true
fi
;;
esac
}
_docker_plugin_enable() {
case "$prev" in
--timeout)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help --timeout" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--timeout')
if [ "$cword" -eq "$counter" ]; then
__docker_complete_plugins_installed --filter enabled=false
fi
;;
esac
}
_docker_plugin_inspect() {
case "$prev" in
--format|f)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) )
;;
*)
__docker_complete_plugins_installed
;;
esac
}
_docker_plugin_install() {
case "$prev" in
--alias)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--alias --disable --disable-content-trust=false --grant-all-permissions --help" -- "$cur" ) )
;;
esac
}
_docker_plugin_list() {
_docker_plugin_ls
}
_docker_plugin_ls() {
local key=$(__docker_map_key_of_current_option '--filter|-f')
case "$key" in
capability)
COMPREPLY=( $( compgen -W "authz ipamdriver logdriver metricscollector networkdriver volumedriver" -- "${cur##*=}" ) )
return
;;
enabled)
COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
return
;;
esac
case "$prev" in
--filter|-f)
COMPREPLY=( $( compgen -S = -W "capability enabled" -- "$cur" ) )
__docker_nospace
return
;;
--format)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--filter -f --format --help --no-trunc --quiet -q" -- "$cur" ) )
;;
esac
}
_docker_plugin_push() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_plugins_installed
fi
;;
esac
}
_docker_plugin_remove() {
_docker_plugin_rm
}
_docker_plugin_rm() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
;;
*)
__docker_complete_plugins_installed
;;
esac
}
_docker_plugin_set() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_plugins_installed
fi
;;
esac
}
_docker_plugin_upgrade() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--disable-content-trust --grant-all-permissions --help --skip-remote-check" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_plugins_installed
__ltrim_colon_completions "$cur"
elif [ "$cword" -eq "$((counter + 1))" ]; then
local plugin_images="$(__docker_plugins_installed)"
COMPREPLY=( $(compgen -S : -W "${plugin_images%:*}" -- "$cur") )
__docker_nospace
fi
;;
esac
}
_docker_port() {
_docker_container_port
}
_docker_ps() {
_docker_container_ls
}
_docker_pull() {
_docker_image_pull
}
_docker_push() {
_docker_image_push
}
_docker_rename() {
_docker_container_rename
}
_docker_restart() {
_docker_container_restart
}
_docker_rm() {
_docker_container_rm
}
_docker_rmi() {
_docker_image_rm
}
_docker_run() {
_docker_container_run
}
_docker_save() {
_docker_image_save
}
_docker_secret() {
local subcommands="
create
inspect
ls
rm
"
local aliases="
list
remove
"
__docker_subcommands "$subcommands $aliases" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_docker_secret_create() {
case "$prev" in
--driver|-d|--label|-l)
return
;;
--template-driver)
COMPREPLY=( $( compgen -W "golang" -- "$cur" ) )
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--driver -d --help --label -l --template-driver" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--driver|-d|--label|-l|--template-driver')
if [ "$cword" -eq "$((counter + 1))" ]; then
_filedir
fi
;;
esac
}
_docker_secret_inspect() {
case "$prev" in
--format|-f)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--format -f --help --pretty" -- "$cur" ) )
;;
*)
__docker_complete_secrets
;;
esac
}
_docker_secret_list() {
_docker_secret_ls
}
_docker_secret_ls() {
local key=$(__docker_map_key_of_current_option '--filter|-f')
case "$key" in
id)
__docker_complete_secrets --cur "${cur##*=}" --id
return
;;
name)
__docker_complete_secrets --cur "${cur##*=}" --name
return
;;
esac
case "$prev" in
--filter|-f)
COMPREPLY=( $( compgen -S = -W "id label name" -- "$cur" ) )
__docker_nospace
return
;;
--format)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--format --filter -f --help --quiet -q" -- "$cur" ) )
;;
esac
}
_docker_secret_remove() {
_docker_secret_rm
}
_docker_secret_rm() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
__docker_complete_secrets
;;
esac
}
_docker_search() {
local key=$(__docker_map_key_of_current_option '--filter|-f')
case "$key" in
is-automated)
COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
return
;;
is-official)
COMPREPLY=( $( compgen -W "false true" -- "${cur##*=}" ) )
return
;;
esac
case "$prev" in
--filter|-f)
COMPREPLY=( $( compgen -S = -W "is-automated is-official stars" -- "$cur" ) )
__docker_nospace
return
;;
--format|--limit)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--filter -f --format --help --limit --no-trunc" -- "$cur" ) )
;;
esac
}
_docker_stack() {
local subcommands="
deploy
ls
ps
rm
services
"
local aliases="
down
list
remove
up
"
__docker_complete_stack_orchestrator_options && return
__docker_subcommands "$subcommands $aliases" && return
case "$cur" in
-*)
local options="--help --orchestrator"
__docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig"
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_docker_stack_deploy() {
__docker_complete_stack_orchestrator_options && return
case "$prev" in
--bundle-file)
_filedir dab
return
;;
--compose-file|-c)
_filedir yml
return
;;
--resolve-image)
COMPREPLY=( $( compgen -W "always changed never" -- "$cur" ) )
return
;;
esac
case "$cur" in
-*)
local options="--compose-file -c --help --orchestrator"
__docker_server_is_experimental && __docker_stack_orchestrator_is swarm && options+=" --bundle-file"
__docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig --namespace"
__docker_stack_orchestrator_is swarm && options+=" --prune --resolve-image --with-registry-auth"
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--bundle-file|--compose-file|-c|--kubeconfig|--namespace|--orchestrator|--resolve-image')
if [ "$cword" -eq "$counter" ]; then
__docker_complete_stacks
fi
;;
esac
}
_docker_stack_down() {
_docker_stack_rm
}
_docker_stack_list() {
_docker_stack_ls
}
_docker_stack_ls() {
__docker_complete_stack_orchestrator_options && return
case "$prev" in
--format)
return
;;
esac
case "$cur" in
-*)
local options="--format --help --orchestrator"
__docker_stack_orchestrator_is kubernetes && options+=" --all-namespaces --kubeconfig --namespace"
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
;;
esac
}
_docker_stack_ps() {
local key=$(__docker_map_key_of_current_option '--filter|-f')
case "$key" in
desired-state)
COMPREPLY=( $( compgen -W "accepted running shutdown" -- "${cur##*=}" ) )
return
;;
id)
__docker_complete_stacks --cur "${cur##*=}" --id
return
;;
name)
__docker_complete_stacks --cur "${cur##*=}" --name
return
;;
esac
__docker_complete_stack_orchestrator_options && return
case "$prev" in
--filter|-f)
COMPREPLY=( $( compgen -S = -W "id name desired-state" -- "$cur" ) )
__docker_nospace
return
;;
--format)
return
;;
esac
case "$cur" in
-*)
local options="--filter -f --format --help --no-resolve --no-trunc --orchestrator --quiet -q"
__docker_stack_orchestrator_is kubernetes && options+=" --all-namespaces --kubeconfig --namespace"
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--all-namespaces|--filter|-f|--format|--kubeconfig|--namespace')
if [ "$cword" -eq "$counter" ]; then
__docker_complete_stacks
fi
;;
esac
}
_docker_stack_remove() {
_docker_stack_rm
}
_docker_stack_rm() {
__docker_complete_stack_orchestrator_options && return
case "$cur" in
-*)
local options="--help --orchestrator"
__docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig --namespace"
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
;;
*)
__docker_complete_stacks
;;
esac
}
_docker_stack_services() {
local key=$(__docker_map_key_of_current_option '--filter|-f')
case "$key" in
id)
__docker_complete_services --cur "${cur##*=}" --id
return
;;
label)
return
;;
name)
__docker_complete_services --cur "${cur##*=}" --name
return
;;
esac
__docker_complete_stack_orchestrator_options && return
case "$prev" in
--filter|-f)
COMPREPLY=( $( compgen -S = -W "id label name" -- "$cur" ) )
__docker_nospace
return
;;
--format)
return
;;
esac
case "$cur" in
-*)
local options="--filter -f --format --help --orchestrator --quiet -q"
__docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig --namespace"
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag '--filter|-f|--format|--kubeconfig|--namespace|--orchestrator')
if [ "$cword" -eq "$counter" ]; then
__docker_complete_stacks
fi
;;
esac
}
_docker_stack_up() {
_docker_stack_deploy
}
_docker_start() {
_docker_container_start
}
_docker_stats() {
_docker_container_stats
}
_docker_stop() {
_docker_container_stop
}
_docker_system() {
local subcommands="
df
events
info
prune
"
__docker_subcommands "$subcommands" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_docker_system_df() {
case "$prev" in
--format)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--format --help --verbose -v" -- "$cur" ) )
;;
esac
}
_docker_system_events() {
local key=$(__docker_map_key_of_current_option '-f|--filter')
case "$key" in
container)
__docker_complete_containers_all --cur "${cur##*=}"
return
;;
daemon)
local name=$(__docker_q info | sed -n 's/^\(ID\|Name\): //p')
COMPREPLY=( $( compgen -W "$name" -- "${cur##*=}" ) )
return
;;
event)
COMPREPLY=( $( compgen -W "
attach
commit
connect
copy
create
delete
destroy
detach
die
disable
disconnect
enable
exec_create
exec_detach
exec_die
exec_start
export
health_status
import
install
kill
load
mount
oom
pause
pull
push
reload
remove
rename
resize
restart
save
start
stop
tag
top
unmount
unpause
untag
update
" -- "${cur##*=}" ) )
return
;;
image)
__docker_complete_images --cur "${cur##*=}" --repo --tag
return
;;
network)
__docker_complete_networks --cur "${cur##*=}"
return
;;
node)
__docker_complete_nodes --cur "${cur##*=}"
return
;;
scope)
COMPREPLY=( $( compgen -W "local swarm" -- "${cur##*=}" ) )
return
;;
type)
COMPREPLY=( $( compgen -W "config container daemon image network node plugin secret service volume" -- "${cur##*=}" ) )
return
;;
volume)
__docker_complete_volumes --cur "${cur##*=}"
return
;;
esac
case "$prev" in
--filter|-f)
COMPREPLY=( $( compgen -S = -W "container daemon event image label network node scope type volume" -- "$cur" ) )
__docker_nospace
return
;;
--since|--until)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--filter -f --help --since --until --format" -- "$cur" ) )
;;
esac
}
_docker_system_info() {
case "$prev" in
--format|-f)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) )
;;
esac
}
_docker_system_prune() {
case "$prev" in
--filter)
COMPREPLY=( $( compgen -W "label label! until" -S = -- "$cur" ) )
__docker_nospace
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--all -a --force -f --filter --help --volumes" -- "$cur" ) )
;;
esac
}
_docker_tag() {
_docker_image_tag
}
_docker_trust() {
local subcommands="
inspect
revoke
sign
"
__docker_subcommands "$subcommands" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_docker_trust_inspect() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help --pretty" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_images --repo --tag
fi
;;
esac
}
_docker_trust_revoke() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help --yes -y" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_images --repo --tag
fi
;;
esac
}
_docker_trust_sign() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help --local" -- "$cur" ) )
;;
*)
local counter=$(__docker_pos_first_nonflag)
if [ "$cword" -eq "$counter" ]; then
__docker_complete_images --force-tag --id
fi
;;
esac
}
_docker_unpause() {
_docker_container_unpause
}
_docker_update() {
_docker_container_update
}
_docker_top() {
_docker_container_top
}
_docker_version() {
__docker_complete_stack_orchestrator_options && return
case "$prev" in
--format|-f)
return
;;
esac
case "$cur" in
-*)
local options="--format -f --help"
__docker_stack_orchestrator_is kubernetes && options+=" --kubeconfig"
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
;;
esac
}
_docker_volume_create() {
case "$prev" in
--driver|-d)
__docker_complete_plugins_bundled --type Volume
return
;;
--label|--opt|-o)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--driver -d --help --label --opt -o" -- "$cur" ) )
;;
esac
}
_docker_volume_inspect() {
case "$prev" in
--format|-f)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--format -f --help" -- "$cur" ) )
;;
*)
__docker_complete_volumes
;;
esac
}
_docker_volume_list() {
_docker_volume_ls
}
_docker_volume_ls() {
local key=$(__docker_map_key_of_current_option '--filter|-f')
case "$key" in
dangling)
COMPREPLY=( $( compgen -W "true false" -- "${cur##*=}" ) )
return
;;
driver)
__docker_complete_plugins_bundled --cur "${cur##*=}" --type Volume
return
;;
name)
__docker_complete_volumes --cur "${cur##*=}"
return
;;
esac
case "$prev" in
--filter|-f)
COMPREPLY=( $( compgen -S = -W "dangling driver label name" -- "$cur" ) )
__docker_nospace
return
;;
--format)
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--filter -f --format --help --quiet -q" -- "$cur" ) )
;;
esac
}
_docker_volume_prune() {
case "$prev" in
--filter)
COMPREPLY=( $( compgen -W "label label!" -S = -- "$cur" ) )
__docker_nospace
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--filter --force -f --help" -- "$cur" ) )
;;
esac
}
_docker_volume_remove() {
_docker_volume_rm
}
_docker_volume_rm() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--force -f --help" -- "$cur" ) )
;;
*)
__docker_complete_volumes
;;
esac
}
_docker_volume() {
local subcommands="
create
inspect
ls
prune
rm
"
local aliases="
list
remove
"
__docker_subcommands "$subcommands $aliases" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_docker_wait() {
_docker_container_wait
}
_docker() {
local previous_extglob_setting=$(shopt -p extglob)
shopt -s extglob
local management_commands=(
builder
config
container
context
engine
image
network
node
plugin
secret
service
stack
swarm
system
trust
volume
)
local top_level_commands=(
build
login
logout
run
search
version
)
local legacy_commands=(
attach
commit
cp
create
diff
events
exec
export
history
images
import
info
inspect
kill
load
logs
pause
port
ps
pull
push
rename
restart
rm
rmi
save
start
stats
stop
tag
top
unpause
update
wait
)
local experimental_client_commands=(
manifest
)
local experimental_server_commands=(
checkpoint
deploy
)
local commands=(${management_commands[*]} ${top_level_commands[*]})
[ -z "$DOCKER_HIDE_LEGACY_COMMANDS" ] && commands+=(${legacy_commands[*]})
# These options are valid as global options for all client commands
# and valid as command options for `docker daemon`
local global_boolean_options="
--debug -D
--tls
--tlsverify
"
local global_options_with_args="
--config
--context -c
--host -H
--log-level -l
--tlscacert
--tlscert
--tlskey
"
# variables to cache server info, populated on demand for performance reasons
local info_fetched server_experimental server_os
# variables to cache client info, populated on demand for performance reasons
local client_experimental stack_orchestrator_is_kubernetes stack_orchestrator_is_swarm
local host config context
COMPREPLY=()
local cur prev words cword
_get_comp_words_by_ref -n : cur prev words cword
local command='docker' command_pos=0 subcommand_pos
local counter=1
while [ "$counter" -lt "$cword" ]; do
case "${words[$counter]}" in
docker)
return 0
;;
# save host so that completion can use custom daemon
--host|-H)
(( counter++ ))
host="${words[$counter]}"
;;
# save config so that completion can use custom configuration directories
--config)
(( counter++ ))
config="${words[$counter]}"
;;
# save context so that completion can use custom daemon
--context|-c)
(( counter++ ))
context="${words[$counter]}"
;;
$(__docker_to_extglob "$global_options_with_args") )
(( counter++ ))
;;
-*)
;;
=)
(( counter++ ))
;;
*)
command="${words[$counter]}"
command_pos=$counter
break
;;
esac
(( counter++ ))
done
local binary="${words[0]}"
if [[ $binary == ?(*/)dockerd ]] ; then
# for the dockerd binary, we reuse completion of `docker daemon`.
# dockerd does not have subcommands and global options.
command=daemon
command_pos=0
fi
local completions_func=_docker_${command//-/_}
declare -F $completions_func >/dev/null && $completions_func
eval "$previous_extglob_setting"
return 0
}
eval "$__docker_previous_extglob_setting"
unset __docker_previous_extglob_setting
complete -F _docker d docker docker.exe dockerd dockerd.exe
================================================
FILE: docker/setup
================================================
#!/bin/sh
mkdir -p ~/.local/share/docker
ln -fs "$PWD/completion" ~/.local/share/docker/completion
================================================
FILE: gh/config.yml
================================================
git_protocol: ssh
editor: vim
prompt: enabled
pager: less
aliases:
co: pr checkout
del: |
!gh api -X DELETE "repos/$GITUSER/$1"
priv: |
!gh api -X PATCH "repos/$GITUSER/$1" -f private="true" | jq .private
pub: |
!gh api -X PATCH "repos/$GITUSER/$1" -f private="false" | jq .private
status: |
!gh api graphql -f emoji="${1%% *}" -f msg="${1#* }" -f query='mutation ($msg: String!, $emoji: String) {changeUserStatus(input:{message:$msg,emoji:$emoji}) {status { message, emoji }}}'
repos: |
!gh api --paginate graphql -f owner="$1" -f query='
query($owner: String!, $per_page: Int = 100, $endCursor: String) {
repositoryOwner(login: $owner) {
repositories(first: $per_page, after: $endCursor, ownerAffiliations: OWNER) {
nodes { nameWithOwner }
pageInfo { hasNextPage endCursor }
}
}
}
' | jq -r '.data.repositoryOwner.repositories.nodes[].nameWithOwner' | sort
orgs: |
!gh api --paginate graphql -f query='
query {
viewer {
id
name
organizations(first: 100) {
nodes {
id
name
}
}
}
} ' | jq -r '.data.viewer.organizations[][] | .id + " " + .name'
defmain: |
!gh api -X PATCH "repos/$1" -f default_branch="main" | jq .default_branch
version: "1"
================================================
FILE: gh/setup
================================================
#!/bin/sh
mkdir -p ~/.config/gh 2>/dev/null
ln -fs "$PWD/config.yml" "$HOME/.config/gh/config.yml"
ls -l ~/.config/gh
echo 'You might need to do gh auth --with-token $(auth token github)'
================================================
FILE: git/.git-templates/hooks/pre-commit
================================================
#!/bin/sh
# branch="$(git branch --show-current)"
# if test "${branch}" = "master" -o "${branch}" = "main"; then
# echo "Cowardly refusing to commit on ${branch} branch."
# echo "You can delete this pre-hook or do it right."
# exit 1
# fi
================================================
FILE: git/setup
================================================
#!/bin/sh
rm -rf "$HOME/.git-templates"
ln -sf "$PWD/.git-templates" "$HOME/.git-templates"
================================================
FILE: go.mod
================================================
module github.com/rwxrob/dot
go 1.18
require (
github.com/rwxrob/bonzai v0.20.10
github.com/rwxrob/choose v0.2.1
github.com/rwxrob/fs v0.20.2
)
require (
github.com/rogpeppe/go-internal v1.11.0 // indirect
github.com/rwxrob/compcmd v0.3.0 // indirect
github.com/rwxrob/fn v0.4.0 // indirect
github.com/rwxrob/pegn v0.2.1 // indirect
github.com/rwxrob/structs v0.6.0 // indirect
github.com/rwxrob/term v0.2.9 // indirect
github.com/rwxrob/to v0.12.1 // indirect
golang.org/x/crypto v0.11.0 // indirect
golang.org/x/sys v0.10.0 // indirect
golang.org/x/term v0.10.0 // indirect
)
================================================
FILE: go.sum
================================================
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/rwxrob/bonzai v0.20.10 h1:MC77uTOENkQA2Zt/r98teSgP/bHuGw04s5k1ECAKgq0=
github.com/rwxrob/bonzai v0.20.10/go.mod h1:QmLf6NXoVtTf3pY7eYR4+k9daz2bdRiiq5ArFckAW3E=
github.com/rwxrob/choose v0.2.1 h1:iuN6NkiOwER6QpSzEVTTp+ZOb33PGFIC3Y1OK6D6Quc=
github.com/rwxrob/choose v0.2.1/go.mod h1:mhuV7pY/62p1sZCvCGVET5GuF+Z126hKxqnzSUOO0EU=
github.com/rwxrob/compcmd v0.3.0 h1:AlJNItb7+Yk17qmH5E7TJFyBXhna/rS3NeQAgjqbFls=
github.com/rwxrob/compcmd v0.3.0/go.mod h1:XOHl6bS2Uen6Wx2mxtbtUhT8Sbz1IhnaE55xPkhTBD4=
github.com/rwxrob/fn v0.4.0 h1:lUZEkELSFAlPhzrkNhgB/xoTkz9tv5op4g0QfggSZFg=
github.com/rwxrob/fn v0.4.0/go.mod h1:omPqOqEB+dDna09z5pi5YFxq4IZqDvv3wFPUCES5LvY=
github.com/rwxrob/fs v0.20.2 h1:TYUgr7wZYhyMgCINygQOa4Cf1zJahZ8qmZX1KsIJyH4=
github.com/rwxrob/fs v0.20.2/go.mod h1:iSQeNjy6YY1UCfL0LBwzKH6qZLRnVG9InZYvMnJX8wA=
github.com/rwxrob/pegn v0.2.1 h1:roE+SkNl66SLJkeEHowuds+0lUOjSlTHE8IDJuZZUNs=
github.com/rwxrob/pegn v0.2.1/go.mod h1:TyD3XS8ddVucs2gwMr1VhB2HbHiruzj6Ub67RZGTfMA=
github.com/rwxrob/structs v0.6.0 h1:t8JVd/Pee1OGaXgT6QYmGed470C9vOw6scdH8Cr5LPg=
github.com/rwxrob/structs v0.6.0/go.mod h1:txMfzPfEiIDNM5bwhzUqxr/1QQ3ekOuj3KLT8Nt1fA0=
github.com/rwxrob/term v0.2.9 h1:lXcrmKMbMQ5Etfm+tjAbHsx2v2yHnZSvzOfS/LGDBXc=
github.com/rwxrob/term v0.2.9/go.mod h1:ptzymk+QUaT54SiRzh6ITMW65qGsJDAdSZIysq17iO8=
github.com/rwxrob/to v0.12.1 h1:2x1SgNK2ixE7FhbDFK2fzlx3Y3qPIBcSFm/jivUzOQM=
github.com/rwxrob/to v0.12.1/go.mod h1:8+uSoxMWfTSY/KU57db87hWGZGsiVW0uSDZd7NAgInI=
golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c=
golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
================================================
FILE: go.work
================================================
go 1.18
use .
================================================
FILE: go.work.sum
================================================
github.com/rwxrob/json v0.7.0 h1:zj9/Wh2QgCfc8YqMzk8i1pC3CY3CH87zC3JlxYBf5QY=
github.com/rwxrob/json v0.7.0/go.mod h1:BYaPIp+4cI64f7jdqkaVAjqU/HSIiwkqPNDr9tTUvRQ=
github.com/rwxrob/scan v0.11.0 h1:VCl8/mxpLDvYl6g4BgCBoz4Lq00Yri6OkuEMIrwAnVw=
github.com/rwxrob/scan v0.11.0/go.mod h1:sDIllL5+Ppk33AHkhhdrkPLP0EheWQPoNotKMhUfCIg=
golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs=
golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
================================================
FILE: iam/config.yaml
================================================
cat.509670=Science & Technology
cat.29595=Dota 2
cat.509658=Just Chatting
cat.115977=The Witcher 3: Wild Hunt
cat.1469308723=Software and Game Development
cat.16676=Team Fortress 2
cat.493575=SHENZHEN I/O
cat.272263131=Animals, Aquariums, and Zoos
cat.509671=Fitness & Health
cat.26936=Music
cat.509660=Art
cat.515214=Politics
cat.417752=Talk Shows & Podcasts
cat.498592=I'm Only Sleeping
cat.509672=Travel & Outdoors
cat.509673=Makers & Crafting
tag.linux=15f4833a-1691-4cc1-a4a5-020d130ac94d
tag.ama=67259b26-ff83-444e-9d3c-faab390df16f
tag.coworking=0739209c-9ef5-4ae0-997c-ccbeb864ca61
tag.business=c38aeb6e-e8c7-452a-88e1-a3ed62c2e846
tag.cooperative=63e83904-a70b-4709-b963-a37a105d9932
tag.programming=a51f1e4e-257b-4bd0-90c7-189c3efbf917
tag.educational=cea7bc0c-75a5-4446-8743-6db031b71550
tag.writing=81975ba3-5c53-41f8-b614-ce5b3193955a
tag.editing=325a32c7-7b8e-48f8-b4fa-10875f18bb6d
tag.cozy=adc4a830-07f5-457b-95e5-5ab6cc1f9af3
tag.skateboarding=fd6df368-7e76-4868-b9e9-b4f7cecc2f35
tag.cycling=d5713b1e-c796-4bdc-88e2-93c49ce31136
tag.animation=e3a6b378-232b-4ec2-9a82-86b72851e09a
tag.evil=0cef8341-8c67-481f-95a8-325932a6699c
tag.good=ee1daaae-116a-44d6-9f40-09322caf3181
tag.endurance=3379ff9c-3c15-4bef-bfb8-2085cd196062
tag.engineering=dff0aca6-52fe-4cc4-a93a-194852b522f0
tag.backseating=96b6073f-450d-4248-8ed4-988e28f3f759
tag.balance=8315b8d6-9837-4218-9bc1-3c0a3e5bb41d
tag.100=e659959d-392f-44c5-83a5-fb959cdbaccc
tag.achievements=27937cec-5cfc-4f56-b1d3-f6e1d67735e2
tag.acoustic=eea4d45b-52e0-4a16-b0df-64f4c55bc716
tag.behindscenes=26befb18-4ddc-41c1-8d39-ffeada297428
tag.bodypositive=150f13a5-b1ce-4e85-a61f-7cfed2e2e08c
tag.chatty=afc8211a-8eee-48b8-9e18-212f22f657db
tag.chill=81e9d348-82e5-4c4f-a140-d2b3779b912d
tag.explore=a4fac2cc-7cd4-44a6-b620-178182389a5b
tag.filming=812a0088-22a9-4944-bb27-af0fa37b6085
tag.firstplay=d0976a7e-26a7-4a48-9225-c522808540f2
tag.gamedev=f588bd74-e496-4d11-9169-3597f38a5d25
tag.softdev=6f86127d-6051-4a38-94bb-f7b475dde109
tag.webdev=c23ce252-cf78-4b98-8c11-8769801aaf3a
tag.graphicdesign=0930677c-dd75-424d-9190-b779f3d1c136
tag.hiking=2a824c85-8c64-4a62-9532-84a50633c6fc
tag.interviews=c833db83-32d0-4026-b3df-637ccf7899fa
tag.play=8ba227ca-073c-46a7-b3cc-193e52c5ab4d
tag.playwith=ac763b17-7bea-4632-9eb4-d106689ff409
tag.leveling=6433db3e-37a7-4590-915a-7c0949a4ac89
tag.vlogging=7a3d677a-1e09-4391-b520-1fccc0e7d6ca
tag.magic=1b70fcca-0579-446a-90d1-075c9ce62309
tag.meditation=59b9c259-62c3-4a1a-89d4-4a6f1070deb9
tag.mindfulness=9801169b-afa4-4785-890e-53911955e4d7
tag.mealprep=3ce58361-f147-441d-a7c9-e98e3e916a39
tag.movement=73645e21-02ae-4f39-bfb1-8dac623927ef
tag.musictalk=85d2fb8f-7257-4e08-8065-6161fa3029fa
tag.musicevents=c5247b10-deec-4d7a-84a5-db6a75cb5908
tag.news=77017b7b-6b98-4f0d-bd39-3ba96b66ec7a
tag.outdoors=89e105c9-2c45-42a9-a5f0-fc1ea6e7ba8b
tag.practice=04b4aaaa-c410-4c2e-9beb-da3896fc7d22
tag.reading=bd6fc011-575a-43f0-8418-9f912a295362
tag.retro=e027fb8b-219e-4959-8240-a4a082be0316
tag.robotics=56257f86-a66c-4ce8-af6d-89e9b1f13fed
tag.safespace=3575df89-da01-4fc1-939c-b5465093ed04
tag.spirituality=63f8ee17-1678-41ee-906a-8c55c3ce81df
tag.strength=07a1b526-3725-4ba5-8c53-efaad4941fb9
tag.surfing=8e44481a-4bc4-4155-b362-9bb499c15d3e
tag.tradart=5ec52c4f-a055-404c-82fe-ea98c74c7fe6
tag.travel=a6ff589a-33e5-4caf-8286-29dea98fc2e2
tag.tutorial=dc709206-c072-4340-a706-694578574c7e
tag.twitchcon=f317a85e-495e-4aee-a0d2-0720bd00a6ce
tag.usa=79713d37-6d2e-4953-b55b-8f47bb9caf72
tag.vectorart=f0ab2b07-14ed-4429-8ea3-3d7d400a50cd
tag.viewerlevels=fec05015-e841-4cff-a53c-8aa1336cf863
tag.warmingup=2920fbf2-293e-4753-8ec7-b69dba5392d0
tag.wargame=dbe20395-0e44-4156-92de-4a77f6cdccf0
tag.worldbuild=218c5e0e-e3a9-4fab-9ad5-994717d226fd
tag.easy=1eea2343-ca8e-4606-ab21-5c64e129f6db
tag.hard=ba2c968b-867a-49ce-aebc-3d978a204f4a
tag.beginners=ad18ee82-c0b2-46d4-b4f9-d45994443bd7
tag.casuals=cc8d5abb-39c9-4942-a1ee-e1558512119e
tag.allbosses=860f0dc1-5d6b-4504-a3e2-eca15a1cb816
tag.epic=df262ff6-74d1-415b-942c-d584d44426c4
mode.away.emoji=🐟
mode.away.name=away
mode.away.status=fishies and music
mode.away.flags=music|visual
mode.away.category=272263131
mode.away.tags=linux,animation
mode.break.emoji=💤
mode.break.name=break
mode.break.status=taking a break (< 30 minutes)
mode.break.flags=music | visual
mode.break.category=same
mode.break.tags=
mode.yoga.emoji=🧘
mode.yoga.name=yoga
mode.yoga.status=ashtanga yoga asana (mysore style)
mode.yoga.flags=cam | mic | music | chat | focused
mode.yoga.category=509671
mode.yoga.tags=
mode.run.emoji=🏃
mode.run.name=run
mode.run.status=out running
mode.run.flags=cam | mic | chat | ama | out
mode.run.category=509658
mode.run.tags=
mode.skate.emoji=🛹
mode.skate.name=skate
mode.skate.status=out long-boarding
mode.skate.flags=cam | mic | chat | ama | out
mode.skate.category=509658
mode.skate.tags=
mode.bike.emoji=🚴
mode.bike.name=bike
mode.bike.status=out cycling
mode.bike.flags=cam | mic | chat | ama | out
mode.bike.category=509658
mode.bike.tags=
mode.work.emoji=🏢
mode.work.name=work
mode.work.status=kubernetes coworking
mode.work.flags=cam | mic | chat | focused | music | muted
mode.work.category=null
mode.work.tags=co-working
mode.code.emoji=💢
mode.code.name=code
mode.code.status=bash, go, c, or web
mode.code.flags=cam | mic | chat | topical | music
mode.code.category=null
mode.code.tags=programming
mode.hack.emoji=🥷
mode.hack.name=hack
mode.hack.status=hacking to learn
mode.hack.flags=cam | mic | chat | ama | music
mode.hack.category=null
mode.hack.tags=
mode.write.emoji=⌨️
mode.write.name=write
mode.write.status=writing
mode.write.flags=cam | mic | chat | focused | topical | music
mode.write.category=509658
mode.write.tags=
mode.rant.emoji=🤬
mode.rant.name=rant
mode.rant.status=ranting
mode.rant.flags=cam | mic | chat | focused | topical | music
mode.rant.category=509658
mode.rant.tags=evil
mode.clean.emoji=😐
mode.clean.name=clean
mode.clean.status=cleaning lab/studio
mode.clean.flags=cam | mic | chat | music | ama
mode.clean.category=509658
mode.clean.tags=
mode.dota2.emoji=⚔️
mode.dota2.name=dota2
mode.dota2.status=crystal, legion, chant, np, *ama chat*
mode.dota2.flags=
mode.dota2.category=null
mode.dota2.tags=
mode.witcher3.emoji=🐺
mode.witcher3.name=witcher3
mode.witcher3.status=cat school, triss line, *ama chat*
mode.witcher3.flags=
mode.witcher3.category=null
mode.witcher3.tags=
mode.shenzen.emoji=🔢
mode.shenzen.name=shenzen
mode.shenzen.status=learning assembly-ish, *ama chat*
mode.shenzen.flags=
mode.shenzen.category=null
mode.shenzen.tags=
mode.tf2.emoji=🏹
mode.tf2.name=tf2
mode.tf2.status=bow sniper, engie, pyro, *ama chat*
mode.tf2.flags=
mode.tf2.category=null
mode.tf2.tags=
mode.learn.emoji=🤯
mode.learn.name=learn
mode.learn.status=colearning, *topic chat* to help
mode.learn.flags=
mode.learn.category=null
mode.learn.tags=
mode.party.emoji=🎉
mode.party.name=party
mode.party.status=music, dancing, drinking, *ama chat*
mode.party.flags=
mode.party.category=509658
mode.party.tags=
mode.jaunt.emoji=🌤️
mode.jaunt.name=jaunt
mode.jaunt.status=walk/talk, tours, adventures, *ama chat*
mode.jaunt.flags=
mode.jaunt.category=509658
mode.jaunt.tags=
mode.art.emoji=🎨
mode.art.name=art
mode.art.status=galleries, crawls, interviews, *topic chat*
mode.art.flags=
mode.art.category=509660
mode.art.tags=
mode.music.emoji=🎵
mode.music.name=music
mode.music.status=live music, pubs, *ama chat*
mode.music.flags=
mode.music.category=26936
mode.music.tags=
mode.course.emoji=⚡
mode.course.name=course
mode.course.status=instructional content, *topic chat*
mode.course.flags=
mode.course.category=null
mode.course.tags=
mode.morning.emoji=☕
mode.morning.name=morning
mode.morning.status=cozy, wake-up, plan, news, *ama chat*
mode.morning.flags=
mode.morning.category=509658
mode.morning.tags=
mode.talk.emoji=☎️
mode.talk.name=talk
mode.talk.status=invited guests in discord, *topic ama*
mode.talk.flags=
mode.talk.category=417752
mode.talk.tags=
mode.hang.emoji=🍻
mode.hang.name=hang
mode.hang.status=discord lobby, members only, *ama chat*
mode.hang.flags=
mode.hang.category=509658
mode.hang.tags=
mode.record.emoji=🎬
mode.record.name=record
mode.record.status=make specific youtube videos, *no chat*
mode.record.flags=
mode.record.category=null
mode.record.tags=
================================================
FILE: iam/setup
================================================
#!/bin/bash
mkdir -p ~/.config/iam
ln -fs "$PWD/config.yaml" ~/.config/iam/config.yaml
================================================
FILE: install/README.md
================================================
# Install Scripts
Here are some installer scripts I've collected and use to build my
workspace images, vms, and such. I often use this as a cheaters way to get common scripts onto Kubernetes nodes and such (in addition to Kubespray, etc.)
Note that I have decided to stream from Mac exclusively these days if for no other reason that the amazing presenter mode. For this reason terminal stuff that is fun is mostly only in my `install/mac` directory (`neo`, `fishies`, `clip`).
================================================
FILE: install/mac/gruvbox-dark.terminal
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ANSIBlackColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS
AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHR4lVSRudWxs1Q0ODxAR
EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s
b3JTcGFjZVYkY2xhc3NPECUwLjM2ODYyNzQ1MSAwLjM2ODYyNzQ1MSAwLjM2ODYyNzQ1
MSAxTxAnMC4yOTYyMzg5NTg4IDAuMjk2MjM4OTU4OCAwLjI5NjIzODk1ODgAEAGAAoAF
0xgZERobHFROU0lEVU5TSUNDEAeAA4AETxEMSAAADEhMaW5vAhAAAG1udHJSR0IgWFla
IAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gAB
AAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIE
AAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAA
cGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1l
YXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMA
AAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBD
b21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNS
R0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAA
AAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAA
AAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAA
AAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVm
YXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0y
LjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAA
AAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVD
NjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGlu
IElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+
ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAA
AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAA
BAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIA
dwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2
APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoB
oQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6
AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oD
lgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wTh
BPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoG
ewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghG
CFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQK
agqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzA
DNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14P
eg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJk
EoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsV
vRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlF
GWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4d
Rx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1
IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcm
JyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysC
KzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUw
bDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9
Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8
JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJy
QrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1J
Y0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1Bx
ULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BY
L1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AF
YFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9o
lmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6
cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6
pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQd
hICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+O
Zo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4
mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj
5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8W
r4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7
LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dB
x7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bU
SdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE
4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTv
QO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p
/br+S/7c/23//9IfICEiWiRjbGFzc25hbWVYJGNsYXNzZXNcTlNDb2xvclNwYWNloiMk
XE5TQ29sb3JTcGFjZVhOU09iamVjdNIfICYnV05TQ29sb3KiJiQACAARABoAJAApADIA
NwBJAEwAUQBTAFoAYABrAHgAfgCLAKAApwDPAPkA+wD9AP8BBgELAREBEwEVARcNYw1o
DXMNfA2JDYwNmQ2iDacNrwAAAAAAAAIBAAAAAAAAACgAAAAAAAAAAAAAAAAAAA2y
</data>
<key>ANSIBlueColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS
AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHR4lVSRudWxs1Q0ODxAR
EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s
b3JTcGFjZVYkY2xhc3NPECgwLjI3MDU4ODIzNTMgMC41MjE1Njg2Mjc1IDAuNTMzMzMz
MzMzMyAxTxAlMC4yMTY5Mzk3MTc1IDAuNDUwMDkzNjI3IDAuNDU4NjcxNjg5ABABgAKA
BdMYGREaGxxUTlNJRFVOU0lDQxAHgAOABE8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZ
WiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYA
AQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAAC
BAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAA
AHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRt
ZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJD
AAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQg
Q29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJz
UkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAA
AAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAA
AAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAA
AAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERl
ZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYt
Mi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElF
QzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBp
biBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk
/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAA
AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAA
AAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQBy
AHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA
9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGa
AaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnEC
egKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOK
A5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME
4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZq
BnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDII
RghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpU
CmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcM
wAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9e
D3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUS
ZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWb
Fb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZ
RRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0e
HUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUgh
dSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3
JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8r
Ais2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1
MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1
/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvo
PCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBC
ckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kd
SWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQ
cVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfg
WC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7Ng
BWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/
aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBx
OnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pG
eqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qE
HYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/
jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyY
uJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2
o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGv
Fq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1
uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPH
Qce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG
1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3h
ROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO60
70DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9
Kf26/kv+3P9t///SHyAhIlokY2xhc3NuYW1lWCRjbGFzc2VzXE5TQ29sb3JTcGFjZaIj
JFxOU0NvbG9yU3BhY2VYTlNPYmplY3TSHyAmJ1dOU0NvbG9yoiYkAAgAEQAaACQAKQAy
ADcASQBMAFEAUwBaAGAAawB4AH4AiwCgAKcA0gD6APwA/gEAAQcBDAESARQBFgEYDWQN
aQ10DX0Nig2NDZoNow2oDbAAAAAAAAACAQAAAAAAAAAoAAAAAAAAAAAAAAAAAAANsw==
</data>
<key>ANSIBrightBlackColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS
AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHR4lVSRudWxs1Q0ODxAR
EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s
b3JTcGFjZVYkY2xhc3NPECgwLjU3MjU0OTAxOTYgMC41MTM3MjU0OTAyIDAuNDU0OTAx
OTYwOCAxTxAmMC40OTg4OTQ5MDAxIDAuNDM5MzU2MDI5IDAuMzc5NjIzNzcwNwAQAYAC
gAXTGBkRGhscVE5TSURVTlNJQ0MQB4ADgARPEQxIAAAMSExpbm8CEAAAbW50clJHQiBY
WVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbW
AAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAA
AgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQA
AABwZG1kZAAAAsQAAACIdnVlZAAAA0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAU
bWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRS
QwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJk
IENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAS
c1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAA
AAAAAABYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAA
AAAAACSgAAAPhAAAts9kZXNjAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAA
AAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBE
ZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2
LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAGRlc2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJ
RUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24g
aW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAAT
pP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMA
AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAA
AAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0A
cgB3AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDw
APYA+wEBAQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIB
mgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJx
AnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34D
igOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATT
BOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkG
agZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgy
CEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0K
VApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgyn
DMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EP
Xg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJF
EmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgV
mxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkg
GUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUd
Hh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFI
IXUhoSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl
9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrP
KwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4w
NTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXC
Nf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o7
6DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIw
QnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJ
HUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAn
UHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX
4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+z
YAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+lo
P2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDg
cTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6
RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6
hB2EgITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN
/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhM
mLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowaj
dqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6h
rxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6
tbsuu6e8IbybvRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbD
x0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TT
xtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC9
4UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7iju
tO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY
/Sn9uv5L/tz/bf//0h8gISJaJGNsYXNzbmFtZVgkY2xhc3Nlc1xOU0NvbG9yU3BhY2Wi
IyRcTlNDb2xvclNwYWNlWE5TT2JqZWN00h8gJidXTlNDb2xvcqImJAAIABEAGgAkACkA
MgA3AEkATABRAFMAWgBgAGsAeAB+AIsAoACnANIA+wD9AP8BAQEIAQ0BEwEVARcBGQ1l
DWoNdQ1+DYsNjg2bDaQNqQ2xAAAAAAAAAgEAAAAAAAAAKAAAAAAAAAAAAAAAAAAADbQ=
</data>
<key>ANSIBrightBlueColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS
AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHR4lVSRudWxs1Q0ODxAR
EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s
b3JTcGFjZVYkY2xhc3NPECgwLjUxMzcyNTQ5MDIgMC42NDcwNTg4MjM1IDAuNTk2MDc4
NDMxNCAxTxAlMC40NDI4OTIwMTUgMC41ODUzNTc2MDY0IDAuNTI1Mzc1MjQ3ABABgAKA
BdMYGREaGxxUTlNJRFVOU0lDQxAHgAOABE8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZ
WiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYA
AQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAAC
BAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAA
AHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRt
ZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJD
AAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQg
Q29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJz
UkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAA
AAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAA
AAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAA
AAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERl
ZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYt
Mi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElF
QzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBp
biBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk
/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAA
AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAA
AAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQBy
AHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA
9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGa
AaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnEC
egKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOK
A5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME
4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZq
BnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDII
RghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpU
CmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcM
wAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9e
D3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUS
ZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWb
Fb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZ
RRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0e
HUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUgh
dSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3
JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8r
Ais2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1
MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1
/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvo
PCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBC
ckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kd
SWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQ
cVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfg
WC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7Ng
BWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/
aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBx
OnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pG
eqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qE
HYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/
jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyY
uJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2
o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGv
Fq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1
uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPH
Qce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG
1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3h
ROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO60
70DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9
Kf26/kv+3P9t///SHyAhIlokY2xhc3NuYW1lWCRjbGFzc2VzXE5TQ29sb3JTcGFjZaIj
JFxOU0NvbG9yU3BhY2VYTlNPYmplY3TSHyAmJ1dOU0NvbG9yoiYkAAgAEQAaACQAKQAy
ADcASQBMAFEAUwBaAGAAawB4AH4AiwCgAKcA0gD6APwA/gEAAQcBDAESARQBFgEYDWQN
aQ10DX0Nig2NDZoNow2oDbAAAAAAAAACAQAAAAAAAAAoAAAAAAAAAAAAAAAAAAANsw==
</data>
<key>ANSIBrightCyanColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS
AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHR4lVSRudWxs1Q0ODxAR
EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s
b3JTcGFjZVYkY2xhc3NPECgwLjU1Njg2Mjc0NTEgMC43NTI5NDExNzY1IDAuNDg2Mjc0
NTA5OCAxTxAnMC40OTA3MTgzMDUxIDAuNzEyNTkwODEzNiAwLjQxMTQzMTM3MjIAEAGA
AoAF0xgZERobHFROU0lEVU5TSUNDEAeAA4AETxEMSAAADEhMaW5vAhAAAG1udHJSR0Ig
WFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD2
1gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQA
AAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJU
AAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAA
FG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJU
UkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2Fy
ZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAA
EnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAA
AAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAA
AAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAA
AAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEg
RGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2
Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAA
AAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4g
SUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9u
IGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAA
E6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFz
AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAA
AAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABt
AHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA
8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGS
AZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcC
cQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+
A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE
0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZ
BmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8I
MghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9
ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4M
pwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9B
D14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYS
RRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4
FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZ
IBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1
HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwh
SCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXH
JfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsq
zysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+
MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1
wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuq
O+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5C
MEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjX
SR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91Q
J1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeS
V+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ff
s2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fp
aD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw
4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnn
ekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eD
uoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Y
jf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CY
TJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMG
o3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2u
oa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7
urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbG
w8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE
08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4Dbg
veFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o
7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8
mP0p/br+S/7c/23//9IfICEiWiRjbGFzc25hbWVYJGNsYXNzZXNcTlNDb2xvclNwYWNl
oiMkXE5TQ29sb3JTcGFjZVhOU09iamVjdNIfICYnV05TQ29sb3KiJiQACAARABoAJAAp
ADIANwBJAEwAUQBTAFoAYABrAHgAfgCLAKAApwDSAPwA/gEAAQIBCQEOARQBFgEYARoN
Zg1rDXYNfw2MDY8NnA2lDaoNsgAAAAAAAAIBAAAAAAAAACgAAAAAAAAAAAAAAAAAAA21
</data>
<key>ANSIBrightGreenColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS
AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHR4lVSRudWxs1Q0ODxAR
EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s
b3JTcGFjZVYkY2xhc3NPECgwLjcyMTU2ODYyNzUgMC43MzMzMzMzMzMzIDAuMTQ5MDE5
NjA3OCAxTxAnMC42NjU3NDY5ODY5IDAuNjkwNjM2MzM2OCAwLjExNjYxMTkyNzcAEAGA
AoAF0xgZERobHFROU0lEVU5TSUNDEAeAA4AETxEMSAAADEhMaW5vAhAAAG1udHJSR0Ig
WFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD2
1gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQA
AAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJU
AAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAA
FG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJU
UkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2Fy
ZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAA
EnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAA
AAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAA
AAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAA
AAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEg
RGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2
Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAA
AAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4g
SUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9u
IGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAA
E6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFz
AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAA
AAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABt
AHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA
8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGS
AZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcC
cQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+
A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE
0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZ
BmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8I
MghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9
ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4M
pwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9B
D14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYS
RRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4
FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZ
IBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1
HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwh
SCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXH
JfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsq
zysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+
MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1
wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuq
O+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5C
MEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjX
SR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91Q
J1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeS
V+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ff
s2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fp
aD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw
4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnn
ekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eD
uoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Y
jf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CY
TJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMG
o3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2u
oa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7
urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbG
w8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE
08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4Dbg
veFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o
7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8
mP0p/br+S/7c/23//9IfICEiWiRjbGFzc25hbWVYJGNsYXNzZXNcTlNDb2xvclNwYWNl
oiMkXE5TQ29sb3JTcGFjZVhOU09iamVjdNIfICYnV05TQ29sb3KiJiQACAARABoAJAAp
ADIANwBJAEwAUQBTAFoAYABrAHgAfgCLAKAApwDSAPwA/gEAAQIBCQEOARQBFgEYARoN
Zg1rDXYNfw2MDY8NnA2lDaoNsgAAAAAAAAIBAAAAAAAAACgAAAAAAAAAAAAAAAAAAA21
</data>
<key>ANSIBrightMagentaColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS
AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXGxwjVSRudWxs1Q0ODxAR
EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s
b3JTcGFjZVYkY2xhc3NPECcwLjgzMTM3MjU0OSAwLjUyOTQxMTc2NDcgMC42MTE3NjQ3
MDU5IDFPECcwLjc4NTYyNDYyMzMgMC40NDI5MDk4MzY4IDAuNTQyNzM3NDI0NAAQAYAC
gAXSGBEZGlVOU0lDQ4ADgARPEQxIAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJ
AAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1I
UCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR
Y3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZ
WgAAAhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAA
AsQAAACIdnVlZAAAA0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwA
AAAkdGVjaAAABDAAAAAMclRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgM
dGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkA
AGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2
MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABYWVog
AAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAP
hAAAts9kZXNjAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJ
RUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJH
QiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZh
dWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRl
c2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y
LjEAAAAAAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5
NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDP
FAAD7cwABBMLAANcngAAAAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAA
AAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUA
CgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCG
AIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcB
DQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5
AcEByQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgC
ogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6
A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0F
HAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQav
BsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghuCIII
lgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAqu
CsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0N
Jg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/P
D+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS
4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYm
FkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ
3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3D
HeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsi
JyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3
JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r
0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zES
MUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq42
6TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzj
PSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpD
fUPARANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3
Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBR
m1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1ka
WWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxh
T2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2ma
afFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwckty
pnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vC
fCF8gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeF
q4YOhnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+e
kAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfya
aJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4
pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw
6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8Ibyb
vRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJ
Osm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR
1lXW2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvj
Y+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl
8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/
bf//0h0eHyBaJGNsYXNzbmFtZVgkY2xhc3Nlc1xOU0NvbG9yU3BhY2WiISJcTlNDb2xv
clNwYWNlWE5TT2JqZWN00h0eJCVXTlNDb2xvcqIkIgAIABEAGgAkACkAMgA3AEkATABR
AFMAWgBgAGsAeAB+AIsAoACnANEA+wD9AP8BAQEGAQwBDgEQDVwNYQ1sDXUNgg2FDZIN
mw2gDagAAAAAAAACAQAAAAAAAAAmAAAAAAAAAAAAAAAAAAANqw==
</data>
<key>ANSIBrightRedColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGBwpYJHZlcnNpb25ZJGFyY2hpdmVyVCR0b3BYJG9iamVjdHMS
AAGGoF8QD05TS2V5ZWRBcmNoaXZlctEICVRyb290gAGmCwwXHR4lVSRudWxs1Q0ODxAR
EhMUFRZcTlNDb21wb25lbnRzVU5TUkdCXE5TQ29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29s
b3JTcGFjZVYkY2xhc3NPECgwLjk4NDMxMzcyNTUgMC4yODYyNzQ1MDk4IDAuMjAzOTIx
NTY4NiAxTxAnMC45Njc0NTIwNDkzIDAuMTg4ODIzNDkxMyAwLjE1NzYzNTQ5NTEAEAGA
AoAF0xgZERobHFROU0lEVU5TSUNDEAeAA4AETxEMSAAADEhMaW5vAhAAAG1udHJSR0Ig
WFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD2
1gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQA
AAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJU
AAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAA
FG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJU
UkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2Fy
ZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAA
EnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EA
gitextract_e3a5rptn/
├── .bashrc
├── .dircolors
├── .dockerignore
├── .gitconfig
├── .github/
│ └── FUNDING.yml
├── .gitignore
├── .inputrc
├── .profile
├── .wezterm.lua
├── DCO
├── LICENSE
├── README.md
├── docker/
│ ├── README.md
│ ├── completion
│ └── setup
├── gh/
│ ├── config.yml
│ └── setup
├── git/
│ ├── .git-templates/
│ │ └── hooks/
│ │ └── pre-commit
│ └── setup
├── go.mod
├── go.sum
├── go.work
├── go.work.sum
├── iam/
│ ├── config.yaml
│ └── setup
├── install/
│ ├── README.md
│ ├── mac/
│ │ ├── gruvbox-dark.terminal
│ │ ├── install-keg
│ │ ├── install-most-stuff-with-brew
│ │ ├── install-neo
│ │ ├── install-pomo
│ │ ├── install-twurl
│ │ ├── install-vault
│ │ └── iterm2/
│ │ └── rwxrob.json
│ ├── ubuntu/
│ │ ├── fix-clone
│ │ ├── install-ansible
│ │ ├── install-avahi
│ │ ├── install-calico
│ │ ├── install-chrome
│ │ ├── install-conftest
│ │ ├── install-containerd
│ │ ├── install-csi-nfs
│ │ ├── install-discord
│ │ ├── install-docker
│ │ ├── install-docker-compose
│ │ ├── install-etcd
│ │ ├── install-firebase
│ │ ├── install-gh
│ │ ├── install-go
│ │ ├── install-goreleaser
│ │ ├── install-helm
│ │ ├── install-hyperfine
│ │ ├── install-istioctl
│ │ ├── install-k9s
│ │ ├── install-keg
│ │ ├── install-kind
│ │ ├── install-kompose
│ │ ├── install-kubeadm
│ │ ├── install-kubectl
│ │ ├── install-kubelet
│ │ ├── install-kubevip
│ │ ├── install-kvm
│ │ ├── install-minikube
│ │ ├── install-mkdocs
│ │ ├── install-mods
│ │ ├── install-most-stuff-with-apt
│ │ ├── install-neo
│ │ ├── install-ngrok
│ │ ├── install-obs-captions-plugin
│ │ ├── install-pandoc
│ │ ├── install-podman
│ │ ├── install-pomo
│ │ ├── install-talosctl
│ │ ├── install-terraform
│ │ ├── install-twurl
│ │ ├── install-vagrant
│ │ ├── install-vault
│ │ ├── install-yq
│ │ ├── run-kubeadm-init
│ │ └── setup-vault-server-for-k8s
│ └── windows/
│ ├── README.md
│ └── terminal/
│ └── settings.json
├── k9s/
│ ├── config.yml
│ ├── setup
│ └── skin.yml
├── lynx/
│ ├── README.md
│ ├── lynx.cfg
│ ├── lynx.lss
│ └── setup
├── obs/
│ ├── README.md
│ └── rtirl.md
├── podman/
│ ├── README.md
│ ├── completion
│ └── setup
├── scripts/
│ ├── 1to10
│ ├── 255color
│ ├── README.md
│ ├── _old/
│ │ ├── compexample
│ │ ├── gh
│ │ ├── kn
│ │ ├── log
│ │ └── sunrise
│ ├── ageof
│ ├── allfigl
│ ├── aln
│ ├── andthen
│ ├── anton
│ ├── ar
│ ├── asciisampler
│ ├── b
│ ├── back
│ ├── ban
│ ├── bandit
│ ├── banner
│ ├── bannerfish
│ ├── bannerlights
│ ├── bannerneo
│ ├── bashentrtest
│ ├── bashmatrix
│ ├── battery
│ ├── bing
│ ├── blankpane
│ ├── bug
│ ├── build
│ ├── buildadoc
│ ├── bullets
│ ├── cal
│ ├── calendar
│ ├── cast
│ ├── catc
│ ├── catscript
│ ├── cdpath
│ ├── changed
│ ├── chat
│ ├── cheat
│ ├── checkurls
│ ├── chsuffix
│ ├── cl
│ ├── clip
│ ├── close
│ ├── cmdhtitles
│ ├── colorstrip
│ ├── commandfrom
│ ├── comment
│ ├── commentthis
│ ├── confirm
│ ├── contexts
│ ├── countdown
│ ├── countincol
│ ├── countmin
│ ├── countmin.tdy
│ ├── countweeks
│ ├── covid
│ ├── coworking
│ ├── cozycoding
│ ├── crnd
│ ├── cronoji
│ ├── curllast
│ ├── currently
│ ├── d
│ ├── dancing
│ ├── dangerln
│ ├── datepath
│ ├── ddd
│ ├── defmain
│ ├── distro
│ ├── dockerclean
│ ├── document
│ ├── doh
│ ├── dprune
│ ├── dquote
│ ├── dstopall
│ ├── duck
│ ├── echon
│ ├── eject
│ ├── ending
│ ├── enhancement
│ ├── ex
│ ├── extract
│ ├── f
│ ├── faqoff
│ ├── figl
│ ├── fiocheck
│ ├── fishies
│ ├── fixapost
│ ├── fmttable
│ ├── frombase2
│ ├── funcsin
│ ├── ghtable
│ ├── gidof
│ ├── giveabout
│ ├── givediscord
│ ├── giveperl
│ ├── giver
│ ├── giveraw
│ ├── gl
│ ├── gmi
│ ├── gobadges
│ ├── goc
│ ├── goclean
│ ├── gocopyright
│ ├── godistbuild
│ ├── godocs
│ ├── goduckyourself
│ ├── goentrtest
│ ├── goerrgen
│ ├── goi
│ ├── goimethods
│ ├── gologtestoutput
│ ├── gomethods
│ ├── goodfirst
│ ├── google
│ ├── goprintasjson
│ ├── gor
│ ├── gosetget
│ ├── got
│ ├── gotestoutput
│ ├── gotests
│ ├── gott
│ ├── gpgcreate
│ ├── gpt
│ ├── grepall
│ ├── gstreamd
│ ├── haschanged
│ ├── hasissue
│ ├── hboostdates
│ ├── headerlist
│ ├── heightwidth
│ ├── helm-app-version-for-chart-version
│ ├── helm-chart-version-for-app-version
│ ├── hex2rgb
│ ├── hidecursor
│ ├── hlog
│ ├── hnow
│ ├── host
│ ├── hrule
│ ├── hsep
│ ├── htbtasks
│ ├── htitle
│ ├── humm
│ ├── inow
│ ├── ips
│ ├── isosec
│ ├── isosec2plain
│ ├── issue
│ ├── issues
│ ├── istext
│ ├── ix
│ ├── jsonesc
│ ├── justhelm
│ ├── k
│ ├── k8sapp
│ ├── k8sroot
│ ├── keyoff
│ ├── keyon
│ ├── kgetall
│ ├── kgp
│ ├── kn
│ ├── krap
│ ├── kubfree
│ ├── kurl
│ ├── kwait
│ ├── label
│ ├── labstream
│ ├── landscape
│ ├── lastbookmark
│ ├── lastdown
│ ├── lastpic
│ ├── lasturl
│ ├── latest
│ ├── lh
│ ├── listening
│ ├── livecal
│ ├── liveicon
│ ├── lorem
│ ├── lslinks
│ ├── lynx
│ ├── lynxa
│ ├── lynxar
│ ├── lynxlast
│ ├── m
│ ├── mark
│ ├── marquee
│ ├── md
│ ├── mdold
│ ├── mentor
│ ├── mimetype
│ ├── mk
│ ├── mkv2isosec
│ ├── mkv2mp4
│ ├── mkvlast
│ ├── mode2yaml
│ ├── monthstable
│ ├── mute
│ ├── muted
│ ├── mvlast
│ ├── mvlastpic
│ ├── mvmkv2isosec
│ ├── myip
│ ├── mytrace
│ ├── namespace
│ ├── netshoot
│ ├── newest
│ ├── newx
│ ├── nohup.out
│ ├── nopath
│ ├── now
│ ├── nowshort
│ ├── ns
│ ├── numweek
│ ├── off
│ ├── onchange
│ ├── opacity
│ ├── open
│ ├── openlast
│ ├── openlastvid
│ ├── origins
│ ├── outline1
│ ├── pae
│ ├── path
│ ├── pb
│ ├── pdf
│ ├── pdgit
│ ├── pdhas
│ ├── phone
│ ├── pkghas
│ ├── post
│ ├── powerzones
│ ├── ppae
│ ├── ppie
│ ├── ppp
│ ├── ppplast
│ ├── pre
│ ├── preview
│ ├── printfargs
│ ├── protonum
│ ├── pubkey
│ ├── push
│ ├── pwdname
│ ├── pylights
│ ├── qreview
│ ├── question
│ ├── quotes
│ ├── raid
│ ├── recording
│ ├── regrepos
│ ├── remotetags
│ ├── resolvtog
│ ├── rndcolor
│ ├── roll20
│ ├── rot13
│ ├── run
│ ├── rund
│ ├── rwxrob
│ ├── save
│ ├── savedot
│ ├── scan
│ ├── scentr
│ ├── sched
│ ├── screenkey
│ ├── searx
│ ├── sec2dur
│ ├── semver-sort
│ ├── sentencecase
│ ├── sgoget
│ ├── showcursor
│ ├── sing
│ ├── skeys
│ ├── snip
│ ├── song
│ ├── songnext
│ ├── ssection
│ ├── sshkey
│ ├── sshspeedtest
│ ├── starting
│ ├── startvms
│ ├── stripesc
│ ├── swag
│ ├── symlink
│ ├── sysderrors
│ ├── syserrors
│ ├── t
│ ├── tags
│ ├── tbanner
│ ├── tclip
│ ├── telln
│ ├── termcolors
│ ├── tf
│ ├── tmatrix
│ ├── tmuxin
│ ├── tmuxinplain
│ ├── tmuxlive
│ ├── tobase2
│ ├── toduck
│ ├── toemoji
│ ├── tohd
│ ├── tolower
│ ├── topdu
│ ├── topegntokfilter
│ ├── topic
│ ├── topics
│ ├── tot
│ ├── trapterm
│ ├── twitch-formats
│ ├── twitch-mock-app-token
│ ├── twitch-mock-clientid
│ ├── twitch-mock-clientsecret
│ ├── twitch-mock-users-logins
│ ├── twitch-view
│ ├── twitch.sh
│ ├── twitchcat
│ ├── twitchcat2yaml
│ ├── twitter
│ ├── txt
│ ├── uidof
│ ├── underconstruction
│ ├── untag
│ ├── uppera
│ ├── upre
│ ├── urlencode
│ ├── urls
│ ├── usageln
│ ├── v
│ ├── vic
│ ├── vidoffset
│ ├── vidoffsetsec
│ ├── vids
│ ├── vilast
│ ├── vimcheat
│ ├── vimpluginstall
│ ├── w
│ ├── watchcow
│ ├── watching
│ ├── wd
│ ├── weather
│ ├── wee
│ ├── what
│ ├── wiki
│ ├── win2nixpath
│ ├── wipe
│ ├── ws
│ ├── x
│ ├── x_cmds
│ ├── youtube-dl-audio
│ ├── yqdiff
│ ├── yt-transcribe
│ ├── ytfoot
│ ├── yyy
│ └── zet4mkv
├── setup
├── snippets/
│ ├── README.md
│ ├── bash/
│ │ ├── buffer
│ │ ├── completion
│ │ ├── curlgl
│ │ ├── filter
│ │ ├── hasout
│ │ ├── have
│ │ ├── jsonstr
│ │ ├── latestghrel
│ │ ├── sec2hour
│ │ ├── trim
│ │ └── winexes
│ ├── foo
│ ├── go/
│ │ └── hello
│ ├── last
│ ├── nameemail
│ └── text/
│ ├── ytama
│ ├── ytfoot
│ └── ytlive
├── tmux/
│ ├── .tmux-live.conf
│ ├── .tmux-plain.conf
│ ├── .tmux.conf
│ ├── README.md
│ └── setup
├── vim/
│ ├── README.md
│ ├── init.lua
│ ├── plug.vim
│ ├── setup
│ └── vimrc
├── vm/
│ ├── .gitignore
│ ├── Makefile
│ ├── README.md
│ ├── dot.vmx.src
│ ├── meta-data
│ ├── network-config
│ ├── original/
│ │ └── build
│ └── user-data
└── weechat/
└── setup
Condensed preview — 488 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,567K chars).
[
{
"path": ".bashrc",
"chars": 11586,
"preview": "#!/bin/bash\n# shellcheck disable=SC1090,SC1091\n\ncase $- in\n*i*) ;; # interactive\n*) return ;;\nesac\n\n# ------------------"
},
{
"path": ".dircolors",
"chars": 3494,
"preview": "COLOR tty\nTERM ansi\nTERM color_xterm\nTERM color-xterm\nTERM con132x25\nTERM con132x30\nTERM con132x43\nTERM con132x60\nTERM c"
},
{
"path": ".dockerignore",
"chars": 23,
"preview": ".\n!Dockerfile\n!install\n"
},
{
"path": ".gitconfig",
"chars": 143,
"preview": "# This is Git's per-user configuration file.\n[user]\n# Please adapt and uncomment the following lines:\nname = Rob Muhlest"
},
{
"path": ".github/FUNDING.yml",
"chars": 50,
"preview": "github: rwxrob\ncustom:\n- https://linktr.ee/rwxrob\n"
},
{
"path": ".gitignore",
"chars": 10,
"preview": ".DS_Store\n"
},
{
"path": ".inputrc",
"chars": 84,
"preview": "set editing-mode vi\nset enable-bracketed-paste on\nset bell-style none\nset keymap vi\n"
},
{
"path": ".profile",
"chars": 216,
"preview": "# This file is only here because some brain-dead\n# applications require it.\n\nif [ -n \"$BASH_VERSION\" ]; then\n # inclu"
},
{
"path": ".wezterm.lua",
"chars": 517,
"preview": "local wezterm = require(\"wezterm\")\nreturn {\n window_close_confirmation = 'NeverPrompt',\n default_prog = {'/opt/homebre"
},
{
"path": "DCO",
"chars": 1420,
"preview": "Developer Certificate of Origin\nVersion 1.1\n\nCopyright (C) 2004, 2006 The Linux Foundation and its contributors.\n1 Lette"
},
{
"path": "LICENSE",
"chars": 11344,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 489,
"preview": "# Dotfiles, scripts, and stuff\n\n*You probably want [Beginner Boost container](https://github.com/rwxrob/boost) instead.*"
},
{
"path": "docker/README.md",
"chars": 64,
"preview": "# Docker Completion\n\nAdd `d` to the `complete` line at the end.\n"
},
{
"path": "docker/completion",
"chars": 116284,
"preview": "#!/usr/bin/env bash\n# shellcheck disable=SC2016,SC2119,SC2155,SC2206,SC2207\n#\n# Shellcheck ignore list:\n# - SC2016: Exp"
},
{
"path": "docker/setup",
"chars": 99,
"preview": "#!/bin/sh\nmkdir -p ~/.local/share/docker\nln -fs \"$PWD/completion\" ~/.local/share/docker/completion\n"
},
{
"path": "gh/config.yml",
"chars": 1500,
"preview": "git_protocol: ssh\neditor: vim\nprompt: enabled\npager: less\naliases:\n co: pr checkout\n del: |\n !gh api -X DEL"
},
{
"path": "gh/setup",
"chars": 188,
"preview": "#!/bin/sh\nmkdir -p ~/.config/gh 2>/dev/null\nln -fs \"$PWD/config.yml\" \"$HOME/.config/gh/config.yml\"\nls -l ~/.config/gh\nec"
},
{
"path": "git/.git-templates/hooks/pre-commit",
"chars": 245,
"preview": "#!/bin/sh\n# branch=\"$(git branch --show-current)\"\n# if test \"${branch}\" = \"master\" -o \"${branch}\" = \"main\"; then\n# ech"
},
{
"path": "git/setup",
"chars": 92,
"preview": "#!/bin/sh\nrm -rf \"$HOME/.git-templates\"\nln -sf \"$PWD/.git-templates\" \"$HOME/.git-templates\"\n"
},
{
"path": "go.mod",
"chars": 594,
"preview": "module github.com/rwxrob/dot\n\ngo 1.18\n\nrequire (\n\tgithub.com/rwxrob/bonzai v0.20.10\n\tgithub.com/rwxrob/choose v0.2.1\n\tgi"
},
{
"path": "go.sum",
"chars": 2133,
"preview": "github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=\ngithub.com/rogpeppe/go-internal "
},
{
"path": "go.work",
"chars": 15,
"preview": "go 1.18\n\nuse .\n"
},
{
"path": "go.work.sum",
"chars": 944,
"preview": "github.com/rwxrob/json v0.7.0 h1:zj9/Wh2QgCfc8YqMzk8i1pC3CY3CH87zC3JlxYBf5QY=\ngithub.com/rwxrob/json v0.7.0/go.mod h1:BY"
},
{
"path": "iam/config.yaml",
"chars": 8273,
"preview": "cat.509670=Science & Technology\ncat.29595=Dota 2\ncat.509658=Just Chatting\ncat.115977=The Witcher 3: Wild Hunt\ncat.146930"
},
{
"path": "iam/setup",
"chars": 87,
"preview": "#!/bin/bash\nmkdir -p ~/.config/iam\nln -fs \"$PWD/config.yaml\" ~/.config/iam/config.yaml\n"
},
{
"path": "install/README.md",
"chars": 481,
"preview": "# Install Scripts\n\nHere are some installer scripts I've collected and use to build my\nworkspace images, vms, and such. I"
},
{
"path": "install/mac/gruvbox-dark.terminal",
"chars": 105456,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "install/mac/install-keg",
"chars": 305,
"preview": "#!/bin/bash\nset -e\n\nmkdir -p ~/.local/bin || true\ntmpfile=$(mktemp)\nlatest=$(curl -sSL \"https://api.github.com/repos/rwx"
},
{
"path": "install/mac/install-most-stuff-with-brew",
"chars": 620,
"preview": "#!/bin/sh\n\nexec brew install coreutils binutils diffutils ed findutils gawk gnu-indent gnu-sed gnu-tar gnu-which gnutls "
},
{
"path": "install/mac/install-neo",
"chars": 310,
"preview": "#!/bin/bash\n\nlatest=$(curl -sSL \"https://api.github.com/repos/st3w/neo/releases/latest\" | jq -r .name)\ngh release downlo"
},
{
"path": "install/mac/install-pomo",
"chars": 62,
"preview": "#!/bin/sh\n\ngo install github.com/rwxrob/pomo/cmd/pomo@latest\n\n"
},
{
"path": "install/mac/install-twurl",
"chars": 35,
"preview": "#!/bin/bash\nsudo gem install twurl\n"
},
{
"path": "install/mac/install-vault",
"chars": 69,
"preview": "#!/bin/bash\n\nbrew tap hashicorp/tap\nbrew install hashicorp/tap/vault\n"
},
{
"path": "install/mac/iterm2/rwxrob.json",
"chars": 10293,
"preview": "{\n \"Use Non-ASCII Font\" : false,\n \"Tags\" : [\n\n ],\n \"Ansi 12 Color\" : {\n \"Red Component\" : 0.51372551918029785,\n "
},
{
"path": "install/ubuntu/fix-clone",
"chars": 756,
"preview": "#!/bin/bash\n\n[[ ! $# == 1 ]] && echo \"usage: $0 NEWHOSTNAME\" && exit 0\nhostname=$1\n\nset_hostname() {\n\tsudo hostnamectl s"
},
{
"path": "install/ubuntu/install-ansible",
"chars": 173,
"preview": "#!/bin/sh\n\nsudo add-apt-repository --yes --update ppa:ansible/ansible\nsudo apt install ansible\nsudo apt install python3-"
},
{
"path": "install/ubuntu/install-avahi",
"chars": 146,
"preview": "#!/bin/sh\n\nsudo apt-get update\nsudo apt-get install avahi-daemon avahi-utils\nsudo systemctl enable avahi-daemon\nsudo sys"
},
{
"path": "install/ubuntu/install-calico",
"chars": 312,
"preview": "#!/bin/bash\nset -e\n\n_install_calico() {\n\tlatest_url=\"https://api.github.com/repos/projectcalico/calico/releases/latest\"\n"
},
{
"path": "install/ubuntu/install-chrome",
"chars": 149,
"preview": "#!/bin/sh\nwget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb\nsudo apt install ./google-chrom"
},
{
"path": "install/ubuntu/install-conftest",
"chars": 443,
"preview": "#!/usr/bin/env bash\nset -e\n\nuser=\"open-policy-agent\"\nrepo=\"conftest\"\n\nos=$(uname -s)\narch=$(uname -m)\nlatest=$(curl -sSL"
},
{
"path": "install/ubuntu/install-containerd",
"chars": 2770,
"preview": "#!/bin/bash\nset -e\n\nOS=$(uname -s)\nARCH=$(uname -m)\n[[ \"$ARCH\" == x86_64 ]] && ARCH=amd64\n\n_install_containerd() {\n\tlate"
},
{
"path": "install/ubuntu/install-csi-nfs",
"chars": 1483,
"preview": "#!/bin/bash\n\nset -euo pipefail\n\nserver=192.168.1.31\nshare=/srv/nfs/k8s\n\n################################################"
},
{
"path": "install/ubuntu/install-discord",
"chars": 250,
"preview": "#!/bin/sh\nset -e\n\nfile=\"discord.deb\"\nurl=\"https://discord.com/api/download?platform=linux&format=deb\"\n\ndir=\"$(mktemp -d)"
},
{
"path": "install/ubuntu/install-docker",
"chars": 91,
"preview": "#!/bin/bash\nclone docker/docker-install\n./install.sh\ndockerd-rootless-setuptool.sh install\n"
},
{
"path": "install/ubuntu/install-docker-compose",
"chars": 359,
"preview": "#!/bin/bash\n\nuser=\"docker\"\nrepo=\"compose\"\nos=$(uname -s)\narch=$(uname -m)\nlatest=$(curl -sSL \"https://api.github.com/rep"
},
{
"path": "install/ubuntu/install-etcd",
"chars": 804,
"preview": "#!/usr/bin/env bash\nset -e\n\necho \"Are you absolutely sure you want to install the *latest* etcd\"\necho \"(which may not be"
},
{
"path": "install/ubuntu/install-firebase",
"chars": 77,
"preview": "#!/bin/sh\n\n# yeah, they fucking suck\ncurl -sL https://firebase.tools | bash\n\n"
},
{
"path": "install/ubuntu/install-gh",
"chars": 413,
"preview": "#!/bin/sh\n\ncurl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | \\\n sudo dd of=/etc/apt/trusted.gp"
},
{
"path": "install/ubuntu/install-go",
"chars": 1554,
"preview": "#!/usr/bin/env bash\n\n# Installs the latest Go release into $TARGETDIR (default: ~/.local)\n# without requiring root acces"
},
{
"path": "install/ubuntu/install-goreleaser",
"chars": 63,
"preview": "#!/bin/sh\n\ngo install github.com/goreleaser/goreleaser@latest\n\n"
},
{
"path": "install/ubuntu/install-helm",
"chars": 532,
"preview": "#!/bin/sh\nset -e\n\n# If you like packages ...\n# curl https://baltocdn.com/helm/signing.asc | sudo apt-key add -\n# sudo ap"
},
{
"path": "install/ubuntu/install-hyperfine",
"chars": 315,
"preview": "#!/bin/sh\nset -e\nlatest=\"https://api.github.com/repos/sharkdp/hyperfine/releases/latest\"\nver=$(curl -sS \"$latest\" | jq -"
},
{
"path": "install/ubuntu/install-istioctl",
"chars": 264,
"preview": "#!/bin/sh\nset -e\n\ncleanup () {\n rm -rf ./istio-*\n}\ntrap cleanup EXIT\n\ncurl -L https://istio.io/downloadIstio | sh -\nmkd"
},
{
"path": "install/ubuntu/install-k9s",
"chars": 275,
"preview": "#!/bin/sh\n\nversion=0.27.4\nfile=/tmp/k9s.tar.gz\nurl=\"https://github.com/derailed/k9s/releases/download/v${version}/k9s_Li"
},
{
"path": "install/ubuntu/install-keg",
"chars": 495,
"preview": "#!/bin/sh\nset -e\n\nuser=rwxrob\nname=keg\ntarget=~/.local/bin\n\narch=$(uname -m)\n[ \"$arch\" = x86_64 ] && arch=amd64\n\nlatest="
},
{
"path": "install/ubuntu/install-kind",
"chars": 58,
"preview": "#!/usr/bin/bash\nexec go install sigs.k8s.io/kind@latest\n\n\n"
},
{
"path": "install/ubuntu/install-kompose",
"chars": 220,
"preview": "#!/usr/bin/bash\ntarget=\"$GOBIN/kompose\"\n#exec go install github.com/kubernetes/kompose@latest\ncurl -sSL https://github.c"
},
{
"path": "install/ubuntu/install-kubeadm",
"chars": 961,
"preview": "#!/bin/sh\nset -e\n\ninstall_pkg() {\n\tVERSION=$(curl -L -s https://dl.k8s.io/release/stable.txt)\n\tVERSION=${VERSION%.*}\n\n\tp"
},
{
"path": "install/ubuntu/install-kubectl",
"chars": 560,
"preview": "#!/bin/sh\nset -e\n\nVERSION=$(curl -L -s https://dl.k8s.io/release/stable.txt)\nVERSION=${VERSION%.*}\n\nprintf \"Installing v"
},
{
"path": "install/ubuntu/install-kubelet",
"chars": 596,
"preview": "#!/bin/sh\nset -e\n\nVERSION=$(curl -L -s https://dl.k8s.io/release/stable.txt)\nVERSION=${VERSION%.*}\n\nprintf \"Installing v"
},
{
"path": "install/ubuntu/install-kubevip",
"chars": 1270,
"preview": "#!/bin/bash\nset -e\n\ndeclare vip interface range_global\n\nvip=192.168.1.200\nrange_global=192.168.1.201-192.168.1.254\n\nget_"
},
{
"path": "install/ubuntu/install-kvm",
"chars": 95,
"preview": "#!/bin/sh\nsudo apt update\nsudo apt install qemu-kvm bridge-utils virt-manager libosinfo-bin -y\n"
},
{
"path": "install/ubuntu/install-minikube",
"chars": 211,
"preview": "#!/usr/bin/bash\n\ncurl -Lo minikube \\\n https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \\\n "
},
{
"path": "install/ubuntu/install-mkdocs",
"chars": 242,
"preview": "#!/bin/sh\n\nif [ -z \"$(which pip3)\" ]; then\n echo \"Warning, doesn't look like you have pip3 installed.\"\n\texit 1\nfi\n\npip"
},
{
"path": "install/ubuntu/install-mods",
"chars": 443,
"preview": "#!/bin/sh\nset -e\n\nuser=charmbracelet\nrepo=mods\n\narch=$(uname -m)\n[ \"$arch\" = x86_64 ] && arch=amd64\n\nlatest=\"https://api"
},
{
"path": "install/ubuntu/install-most-stuff-with-apt",
"chars": 389,
"preview": "#!/bin/sh\n\nsudo apt-install update\nsudo apt-get -y install nmap jq pcregrep lynx make uidmap ruby python-is-python3 libc"
},
{
"path": "install/ubuntu/install-neo",
"chars": 360,
"preview": "#!/bin/sh\n\nsudo apt install autoconf build-essential ncurses-base libncurses-dev\n\n[ -z \"$(command -v gh)\" ] && echo \"gh "
},
{
"path": "install/ubuntu/install-ngrok",
"chars": 181,
"preview": "#!/bin/bash\nset -x\n\ncurl -SsLO \"https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-amd64.tgz\"\nmkdir -p ~/.local/"
},
{
"path": "install/ubuntu/install-obs-captions-plugin",
"chars": 804,
"preview": "#!/bin/bash\nset -e\n\nobs=$(command -v obs)\n\n[[ -z \"$obs\" ]] && echo \"OBS not found\" && exit 1\n\nver=$($obs -V)\n[[ $ver =~ "
},
{
"path": "install/ubuntu/install-pandoc",
"chars": 262,
"preview": "#!/bin/sh\nset -e\nloc=$(curl -o /dev/null -sIw \"%{redirect_url}\" \\\n 'https://github.com/jgm/pandoc/releases/latest')"
},
{
"path": "install/ubuntu/install-podman",
"chars": 292,
"preview": "#!/bin/sh\n\nsudo apt-get install -y podman\nsudo wget https://github.com/containers/gvisor-tap-vsock/releases/download/v0."
},
{
"path": "install/ubuntu/install-pomo",
"chars": 62,
"preview": "#!/bin/sh\n\ngo install github.com/rwxrob/pomo/cmd/pomo@latest\n\n"
},
{
"path": "install/ubuntu/install-talosctl",
"chars": 188,
"preview": "#!/bin/bash\ndir=\"$HOME/.local/bin\"\nmkdir -p \"$dir\"\ncurl -L https://github.com/talos-systems/talos/releases/latest/downlo"
},
{
"path": "install/ubuntu/install-terraform",
"chars": 263,
"preview": "#!/bin/bash\n\nver=1.1.3\n\n[[ -z \"$GOBIN\" ]] && echo \"GOBIN not set\" && exit 1\n\ndir=$(mktemp -d)\ncd \"$dir\"\necho \"Now workin"
},
{
"path": "install/ubuntu/install-twurl",
"chars": 35,
"preview": "#!/bin/bash\nsudo gem install twurl\n"
},
{
"path": "install/ubuntu/install-vagrant",
"chars": 405,
"preview": "#!/bin/bash\ndocker pull vagrantlibvirt/vagrant-libvirt:latest\necho ' \nNow add the following function to your ~/.bashrc:\n"
},
{
"path": "install/ubuntu/install-vault",
"chars": 399,
"preview": "#!/bin/bash\n\ncurl -fsSL https://apt.releases.hashicorp.com/gpg \\\n\t| sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/hashico"
},
{
"path": "install/ubuntu/install-yq",
"chars": 347,
"preview": "#!/bin/sh\n\nurl=\"https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64\"\ndir=$(mktemp -d)\n\ncleanup () {\n"
},
{
"path": "install/ubuntu/run-kubeadm-init",
"chars": 238,
"preview": "#!/bin/bash\n\nset -e\n\nif [[ ! -f /etc/kubernetes/manifests/kube-vip.yaml ]];then\n\techo \"First install-kubevip\"\n\texit 1\nfi"
},
{
"path": "install/ubuntu/setup-vault-server-for-k8s",
"chars": 570,
"preview": "#!/bin/bash\nset -e\n\n#black=$'\\e[30m'\nred=$'\\e[31m'\n#green=$'\\e[32m'\n#yellow=$'\\e[33m'\n#blue=$'\\e[34m'\nmag=$'\\e[35m'\n#cya"
},
{
"path": "install/windows/README.md",
"chars": 139,
"preview": "# Windows Only Stuff\n\nStuff that gets installed directly into Windows (not WSL2). This\nincluded PowerShell and Choclatey"
},
{
"path": "install/windows/terminal/settings.json",
"chars": 9688,
"preview": "{\n \"$help\": \"https://aka.ms/terminal-documentation\",\n \"$schema\": \"https://aka.ms/terminal-profiles-schema\",\n \"a"
},
{
"path": "k9s/config.yml",
"chars": 992,
"preview": "k9s:\n refreshRate: 2\n maxConnRetry: 5\n enableMouse: false\n headless: false\n logoless: false\n crumbsless: false\n r"
},
{
"path": "k9s/setup",
"chars": 246,
"preview": "#!/bin/sh\n\nif [ -z \"$(which k9s)\" ]; then\n echo \"Warning, doesn't look like you have k9s installed.\"\n\texit 1\nfi\n\nif [ -"
},
{
"path": "k9s/skin.yml",
"chars": 2174,
"preview": "# K9s Gruvbox Dark Skin Contributed by [@indiebrain](https://github.com/indiebrain)\nforeground: &foreground \"#ebdbb2\"\n#b"
},
{
"path": "lynx/README.md",
"chars": 649,
"preview": "# Lynx Text Browser FTW!\n\n*New and Improved! You can now test this as a [container]:*\n\n```\ndocker run -it --rm rwxrob/ly"
},
{
"path": "lynx/lynx.cfg",
"chars": 162425,
"preview": "# $LynxId: lynx.cfg,v 1.302 2018/07/08 15:22:44 tom Exp $\n# lynx.cfg file.\n# The default placement for this file is /usr"
},
{
"path": "lynx/lynx.lss",
"chars": 3619,
"preview": "# Setting the normal and default types lets us keep (almost) the same colors\n# whether the terminal's default colors are"
},
{
"path": "lynx/setup",
"chars": 393,
"preview": "#!/bin/sh\n\n# WARNING: This setup requires a custom form of lynx (a shell script in\n# scripts) be installed as well as ly"
},
{
"path": "obs/README.md",
"chars": 93,
"preview": "# OBS Configuration\n\nNotes about how I configure my OBS for live streaming mostly to Twitch.\n"
},
{
"path": "obs/rtirl.md",
"chars": 671,
"preview": "# RTIRL overlays\n\n## Common custom CSS\n\n```css\n@import url('https://fonts.googleapis.com/css2?family=Bangers&display=swa"
},
{
"path": "podman/README.md",
"chars": 64,
"preview": "# Podman Completion\n\nAdd `d` to the `complete` line at the end.\n"
},
{
"path": "podman/completion",
"chars": 651312,
"preview": "# bash completion for podman -*- shell-script -*-\n\n__podman_debug()\n{\n if [[ -n ${BASH_"
},
{
"path": "podman/setup",
"chars": 99,
"preview": "#!/bin/sh\nmkdir -p ~/.local/share/podman\nln -fs \"$PWD/completion\" ~/.local/share/podman/completion\n"
},
{
"path": "scripts/1to10",
"chars": 54,
"preview": "#!/bin/bash\nfor i in {1..10}; do echo $i. thing; done\n"
},
{
"path": "scripts/255color",
"chars": 75,
"preview": "#!/usr/bin/env bash\nfor i in {0..255}; do\n printf \"\\e[38;5;${i}m$i \"\ndone\n"
},
{
"path": "scripts/README.md",
"chars": 1239,
"preview": "# Scripts\n\nPilfer at your own peril. You'll find a bit of everything, but mostly\njust bash and perl. If that's not your "
},
{
"path": "scripts/_old/compexample",
"chars": 17660,
"preview": "#!/bin/bash\n#\n# Knowledge Management Utility\n#\n# Please maintain the style as described in Google's Shell Style Guide\n#\n"
},
{
"path": "scripts/_old/gh",
"chars": 982,
"preview": "#!/bin/bash\n\ndeclare subcommand=\"$1\"; shift\ndeclare -r gold=$'\\033[38;2;250;130;10m'\ndeclare -r cyan=$'\\033[38;2;0;255;2"
},
{
"path": "scripts/_old/kn",
"chars": 17729,
"preview": "#!/bin/bash\n#\n# README.World Knowledge Management Utility\n#\n# Please maintain the style as described in Google's Shell S"
},
{
"path": "scripts/_old/log",
"chars": 564,
"preview": "#!/bin/bash\n\n# Opens the default log file with vim. Accepts the\n# standard `date` offset. Prompts to commit.\n\nrelpath=$("
},
{
"path": "scripts/_old/sunrise",
"chars": 499,
"preview": "#!/usr/bin/env bash\n\np=3.14\ni=0\n\nreset () {\n /usr/bin/reset\n printf \"\\033[H\\033[2J\\033[0m\"\n exit\n}\n\ntrap \"setterm --c"
},
{
"path": "scripts/ageof",
"chars": 298,
"preview": "#!/usr/bin/env bash\n\n# Outputs the seconds since the thing identified by the first argument\n# was last modified (not cre"
},
{
"path": "scripts/allfigl",
"chars": 156,
"preview": "#!/bin/sh\nfontsd=\"$REPOS/github.com/rwxrob/fonts/figlet\"\nfor font in \"$fontsd\"/*.flf; do\n echo \"FONT: $font\"\n figlet -"
},
{
"path": "scripts/aln",
"chars": 1188,
"preview": "#!/usr/bin/bash\nshopt -s extglob\n\n# (ripped from deyloop)\n\n# Aligns input lines so that the occurrence of given characte"
},
{
"path": "scripts/andthen",
"chars": 29,
"preview": "#!/bin/sh\n\nexec clip andthen\n"
},
{
"path": "scripts/anton",
"chars": 60,
"preview": "#!/bin/sh\nexec VBoxManage.exe startvm --type headless anton\n"
},
{
"path": "scripts/ar",
"chars": 42,
"preview": "#!/usr/bin/env bash\nexec chat \"!ar $1 $2\"\n"
},
{
"path": "scripts/asciisampler",
"chars": 191,
"preview": "#!/bin/sh\nexec tmux \\\n splitw -h \\;\\\n send fishies ENTER \\;\\\n selectp -t 1 \\;\\\n splitw \\;\\\n send tmatrix ENTER \\;\\\n"
},
{
"path": "scripts/b",
"chars": 28,
"preview": "#!/bin/sh\nexec ./build \"$@\"\n"
},
{
"path": "scripts/back",
"chars": 256,
"preview": "#!/usr/bin/env bash\nwhat=\"$*\"\nif [[ -z \"${what}\" ]]; then\n\twhat=\"in a bit\"\nelif [[ $what =~ ^([0-9]+) ]]; then\n\twhat=\"at"
},
{
"path": "scripts/ban",
"chars": 271,
"preview": "#!/bin/sh\n\n# Uses Weechat to ban a target on Twitch.\n\nif [ -z \"$TWITCH_USER\" ]; then\n echo '$TWITCH_USER environment va"
},
{
"path": "scripts/bandit",
"chars": 138,
"preview": "#!/bin/sh\n#exec w3m https://overthewire.org/wargames/bandit/bandit$1.html\nexec lynx https://overthewire.org/wargames/ban"
},
{
"path": "scripts/banner",
"chars": 352,
"preview": "#!/usr/bin/env bash\n\nclear=$'\\033[2J'\ncuroff=$'\\033[?25h'\ncuron=$'\\033[?25h'\ntop=$'\\033[H'\n\ntrap 'echo \"${curon}\"; echo "
},
{
"path": "scripts/bannerfish",
"chars": 231,
"preview": "#!/usr/bin/env bash\nwhat=\"$*\"\nif [ -z \"${what}\" ]; then\n read -r -p \"Text: \" what\nfi\ncols=$(tput lines)\ntmux split-wind"
},
{
"path": "scripts/bannerlights",
"chars": 228,
"preview": "#!/usr/bin/env bash\nwhat=\"$*\"\nif [ -z \"${what}\" ]; then\n read -p \"Text: \" what\nfi\ncols=$(tput lines)\npomo stop\ntmux spl"
},
{
"path": "scripts/bannerneo",
"chars": 225,
"preview": "#!/usr/bin/env bash\nwhat=\"$*\"\nif [ -z \"${what}\" ]; then\n read -p \"Text: \" what\nfi\nlines=$(tput lines)\npomo stop\ntmux sp"
},
{
"path": "scripts/bashentrtest",
"chars": 65,
"preview": "#!/usr/bin/env bash\nentr bash -c \"clear; shellcheck $1\" <<< \"$1\"\n"
},
{
"path": "scripts/bashmatrix",
"chars": 1709,
"preview": "#!/usr/bin/env bash\n\n# Courtesy of @bvierra and company (long ago, pre-cPanel)\n\n### Customization:\nblue=\"\\033[0;34m\"\nbri"
},
{
"path": "scripts/battery",
"chars": 117,
"preview": "#!/usr/bin/perl\nprint grep {/state|to\\ full|percentage/}\n `upower -i /org/freedesktop/UPower/devices/battery_BAT0`;\n"
},
{
"path": "scripts/bing",
"chars": 116,
"preview": "#!/bin/sh\nurl=\"https://www.bing.com/search?q=$(urlencode \"$*\")\"\nchat \"$url\"\nexec lynx \"www.bing.com/search?q=$url\"\n\n"
},
{
"path": "scripts/blankpane",
"chars": 61,
"preview": "#!/bin/sh\n\nhidecursor\nwhile true; do\n clear\n sleep 10\ndone\n"
},
{
"path": "scripts/bug",
"chars": 59,
"preview": "#!/bin/bash\n\nexec gh issue create --label bug --title \"$*\"\n"
},
{
"path": "scripts/build",
"chars": 94,
"preview": "#!/bin/sh\ntest -x ./build && exec ./build \"$@\"\ntest -r docs/index.adoc && exec buildadoc \"$@\"\n"
},
{
"path": "scripts/buildadoc",
"chars": 1519,
"preview": "#!/usr/bin/perl\n\n# total the hours from the main index.adoc page\nopen my $fh, '<', './docs/index.adoc' or die \"Could not"
},
{
"path": "scripts/bullets",
"chars": 41,
"preview": "#!/bin/sh\nexec pae '$_=join \" • \", @F' \n\n"
},
{
"path": "scripts/cal",
"chars": 26,
"preview": "#!/bin/sh\nexec ncal -C -3\n"
},
{
"path": "scripts/calendar",
"chars": 44,
"preview": "#!/usr/bin/env bash\nzet edit 20220112151926\n"
},
{
"path": "scripts/cast",
"chars": 45,
"preview": "#!/usr/bin/env bash\nexec zet cast.start \"$@\"\n"
},
{
"path": "scripts/catc",
"chars": 33,
"preview": "#!/bin/sh\nexec cat $(which \"$1\")\n"
},
{
"path": "scripts/catscript",
"chars": 28,
"preview": "#!/bin/sh\ncat $(which \"$1\")\n"
},
{
"path": "scripts/cdpath",
"chars": 47,
"preview": "#!/usr/bin/env bash\necho -e \"${CDPATH//:/\\\\n}\"\n"
},
{
"path": "scripts/changed",
"chars": 506,
"preview": "#!/usr/bin/env bash\n\n## Returns the full path to any changed files in the current directory\n## or any subdirectories rec"
},
{
"path": "scripts/chat",
"chars": 229,
"preview": "#!/bin/sh\n\nbuf=\"$*\"\n\nif test -n \"$buf\"; then\n #echo \"*$buf\" >$WEECHAT_FIFO\n tmux -L live send -t 2 \"$buf\" Enter\n exit"
},
{
"path": "scripts/cheat",
"chars": 133,
"preview": "#!/bin/sh\n\ncheat() {\n where=\"$1\"\n if [ $# -ge 1 ]; then\n shift\n fi\n IFS=+ curl -sS \"http://cht.sh/$where/ $*\"\n}\n\n"
},
{
"path": "scripts/checkurls",
"chars": 551,
"preview": "#!/usr/bin/env bash\n\ndeclare target=\"$1\"\ndeclare red=$'\\033[38;2;255;0;0m'\ndeclare grey=$'\\033[38;2;100;100;100m'\ndeclar"
},
{
"path": "scripts/chsuffix",
"chars": 636,
"preview": "#!/usr/bin/env bash\n\n# Changes the suffixes from the first argument to the second argument for\n# all files specified aft"
},
{
"path": "scripts/cl",
"chars": 33,
"preview": "#!/bin/sh\nexec wee /buffer clear\n"
},
{
"path": "scripts/clip",
"chars": 8604,
"preview": "#!/usr/bin/env bash\n# shellcheck disable=SC2016\nset -e\n\n# Copyright 2021 Rob Muhlestein <rob@rwx.gg>\n# Released under Ap"
},
{
"path": "scripts/close",
"chars": 35,
"preview": "#!/bin/sh\nexec gh issue close \"$@\"\n"
},
{
"path": "scripts/cmdhtitles",
"chars": 72,
"preview": "#!/usr/bin/env perl -pn\n/var (\\S*Cmd)/ and print( `htitle $1` . \"\\n\" );\n"
},
{
"path": "scripts/colorstrip",
"chars": 2077,
"preview": "#!/usr/bin/env bash\n# This file was originally taken from iterm2 https://github.com/gnachman/iTerm2/blob/master/tests/24"
},
{
"path": "scripts/commandfrom",
"chars": 115,
"preview": "#!/usr/bin/env bash\nwhile IFS= read -r line;do\n key=${line%%=*}\n echo \"x.$key() { x.config $key \\\"\\$@\\\"; }\"\ndone\n"
},
{
"path": "scripts/comment",
"chars": 37,
"preview": "#!/bin/sh\nexec gh issue comment \"$@\"\n"
},
{
"path": "scripts/commentthis",
"chars": 327,
"preview": "#!/bin/bash\n\nbuf='create a comment for this function wrapped at 72 and include the function immediately after with no bl"
},
{
"path": "scripts/confirm",
"chars": 130,
"preview": "#!/usr/bin/env bash\n\nconfirm () {\n declare yn\n read -p \" [y/N] \" yn\n [[ ${yn,,} =~ y(es)? ]] && return 0\n return 1\n}"
},
{
"path": "scripts/contexts",
"chars": 47,
"preview": "#!/usr/bin/env bash\nexec k config get-contexts\n"
},
{
"path": "scripts/countdown",
"chars": 195,
"preview": "#!/usr/bin/env bash\n\ntime=\"$*\"\n[[ -z \"$time\" ]] && echo \"usage: $0 TIME (see date -d)\" && exit 1\nstart=$(date \"+%s\" -d \""
},
{
"path": "scripts/countincol",
"chars": 135,
"preview": "#!/usr/bin/env bash\ndeclare -i total\nwhile IFS= read -r line; do\n num=${line#* }\n num=${num%% *}\n ((total+=num))\ndone"
},
{
"path": "scripts/countmin",
"chars": 279,
"preview": "#!/usr/bin/perl -p\n\n($minutes) = /(\\d+)m/;\n$total += $minutes;\n\nEND {\n print \"TOTAL MINUTES: $total\\n\";\n}\n\n__END__\nmi"
},
{
"path": "scripts/countmin.tdy",
"chars": 215,
"preview": "#!/usr/bin/perl -T\nuse strict;\nuse warnings;\n\n__END__\nmin=0\n\nwhile IFS= read -r line; do\n\techo \"$line\"\n\tif [[ $line =~ \\"
},
{
"path": "scripts/countweeks",
"chars": 186,
"preview": "#!/usr/bin/env bash\n\nweeks=0\n\nwhile IFS= read -r line; do\n echo \"$line\"\n if [[ $line =~ \\(([0-9]+)\\ weeks?\\) ]]; then\n"
},
{
"path": "scripts/covid",
"chars": 161,
"preview": "#!/bin/sh\n\n# Reports the corona virus stats in a terminal friendly format taking an\n# optional argument that is the regi"
},
{
"path": "scripts/coworking",
"chars": 182,
"preview": "#!/usr/bin/env bash\n\ntrap \"setterm --cursor on; clear; exit; trap -- - SIGINT SIGTERM\" SIGTERM SIGINT\nclear\nzet view dis"
},
{
"path": "scripts/cozycoding",
"chars": 78,
"preview": "#!/bin/sh\nt 'Cozy Coding #linux #vim #tmux #shell #golang #k8s #sre #devops'\n\n"
},
{
"path": "scripts/crnd",
"chars": 119,
"preview": "#!/usr/bin/env bash\nred=$[RANDOM%255]\ngreen=$[RANDOM%255]\nblue=$[RANDOM%255]\necho -en \"\\033[38;2;$red;$green;${blue}m\"\n"
},
{
"path": "scripts/cronoji",
"chars": 389,
"preview": "#!/usr/bin/bash\n\nreadonly -a clocks=(\n 🕛 🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚\n 🕧 🕜 🕝 🕞 🕟 🕠 🕡 🕢 🕣 🕤 🕥 🕦\n)\n\ncronji() {\n local time hou"
},
{
"path": "scripts/curllast",
"chars": 138,
"preview": "#!/usr/bin/env bash\n\ndeclare path=$(mktemp)\nif [[ $1 != \"\" ]]; then\n path=\"$1\"\nfi\n\ncurl $(twitch lasturl) -o \"${path}\" "
},
{
"path": "scripts/currently",
"chars": 103,
"preview": "#!/usr/bin/env bash\nnew=\"$*\"\ntest -z \"$new\" && head -1 ~/.currently && exit\necho \"$new\" > ~/.currently\n"
},
{
"path": "scripts/d",
"chars": 27,
"preview": "#!/bin/sh\nexec docker \"$@\"\n"
},
{
"path": "scripts/dancing",
"chars": 98,
"preview": "#!/bin/sh\nwhat=\"$*\"\nif [ -z \"$what\" ]; then\n what=\"pause for dancing\"\nfi\nexec bannerfish \"$what\"\n"
},
{
"path": "scripts/dangerln",
"chars": 28,
"preview": "#!/bin/sh\ndanger \"$@\"; echo\n"
},
{
"path": "scripts/datepath",
"chars": 223,
"preview": "#!/bin/sh\n\n# Prints the current date as a path for use when creating content within\n# a directory file structure that mo"
},
{
"path": "scripts/ddd",
"chars": 90,
"preview": "#!/usr/bin/env bash\n> /tmp/buf\nwhile IFS= read -r line;do\n echo \"$line\" >> /tmp/buf\ndone\n"
},
{
"path": "scripts/defmain",
"chars": 840,
"preview": "#!/bin/sh\n\n# Uses a custom gh defmain alias to rename simple repos with no open PRs\n# from master to main. USE AT YOUR O"
},
{
"path": "scripts/distro",
"chars": 325,
"preview": "#!/usr/bin/env bash\n\n# Will detect one of the following OS family and distro combinations:\n#\n# linux\n# debian\n# ubun"
},
{
"path": "scripts/dockerclean",
"chars": 129,
"preview": "#!/usr/bin/env bash\n\nall=$(sudo docker ps -aq)\nif [[ -z $all ]];then\n echo \"No containers found.\"\n exit\nfi\nsudo docker"
},
{
"path": "scripts/document",
"chars": 76,
"preview": "#!/usr/bin/env bash\n#!/bin/bash\n\nexec gh issue create --label documentation\n"
},
{
"path": "scripts/doh",
"chars": 1369,
"preview": "#!/bin/sh\n\ndoh () {\n cat <<'EOM'\n\n _ ,___,-'\",-=-. \n __,-- _ _,-'_)_ (\"\"`'-._\\ `. \u001b[3"
},
{
"path": "scripts/dprune",
"chars": 49,
"preview": "#!/usr/bin/env bash\nexec docker system prune -af\n"
},
{
"path": "scripts/dquote",
"chars": 70,
"preview": "#!/usr/bin/env bash\n\nwhile read -r line; do \n echo \"\\\"$line\\\",\"\ndone\n"
},
{
"path": "scripts/dstopall",
"chars": 75,
"preview": "#!/usr/bin/env bash\nexec docker container stop $(docker container list -q)\n"
},
{
"path": "scripts/duck",
"chars": 302,
"preview": "#!/bin/sh\n#exec w3m \"duckduckgo.com/lite?kd=-1&kp=-1&q=$*\"\ntmux rename-window \"$*\"\nurl=\"https://lite.duckduckgo.com/lite"
},
{
"path": "scripts/echon",
"chars": 111,
"preview": "#!/usr/bin/env bash\n\nechon () {\n declare i\n for ((i=0; i<${2:-1}; i++)); do echo -n \"$1\"; done\n}\n\nechon \"$@\"\n"
},
{
"path": "scripts/eject",
"chars": 199,
"preview": "#!/bin/sh\n\npath=/media/$USER\nfirst=$(ls -1 $path | head -1)\nmpoint=$path/$first\n[ -z \"$first\" ] && tell 'Nothing to ejec"
},
{
"path": "scripts/ending",
"chars": 77,
"preview": "#!/usr/bin/env bash\necho '(ending)' > ~/.break\nexec bannerfish \"ending soon\"\n"
},
{
"path": "scripts/enhancement",
"chars": 87,
"preview": "#!/usr/bin/env bash\n#!/bin/bash\n\nexec gh issue create --label enhancement --title \"$*\"\n"
},
{
"path": "scripts/ex",
"chars": 653,
"preview": "#!/usr/bin/env bash\n\nex () {\n file=$1\n [ -z \"$file\" ] && echo 'ex <compressed>' && return 1\n [ ! -f \"$file\" ] && echo"
},
{
"path": "scripts/extract",
"chars": 0,
"preview": ""
},
{
"path": "scripts/f",
"chars": 716,
"preview": "#!/usr/bin/env perl\nuse strict;\nuse warnings;\n\nmy $input = shift;\nmy $delim = shift || '\\s+';\nmy @nums;\n\nif ($input) {\n "
},
{
"path": "scripts/faqoff",
"chars": 25,
"preview": "#!/bin/sh\nexec giver faq\n"
},
{
"path": "scripts/figl",
"chars": 475,
"preview": "#!/usr/bin/env bash\n\n# Set the figlet default font, font directory, and centering as well as\n# defaults to passing it to"
},
{
"path": "scripts/fiocheck",
"chars": 144,
"preview": "#!/bin/bash\n\nsudo fio --name=randread --ioengine=libaio --iodepth=16 --rw=randread --bs=4k --size=1G --numjobs=4 --runti"
},
{
"path": "scripts/fishies",
"chars": 28358,
"preview": "#!/usr/bin/env perl\n\n#`which keyoff` and `keyoff`;\n\nsub handle {\n\texit(0);\n}\n\n$SIG{\"TERM\"} = \\&handle;\n$SIG{\"INT\"} = \\&h"
},
{
"path": "scripts/fixapost",
"chars": 70,
"preview": "#!/usr/bin/env bash\n# shellcheck disable=SC1111\nexec tr \"’“”\" \"'\\\"\\\"\"\n"
},
{
"path": "scripts/fmttable",
"chars": 7518,
"preview": "#!/usr/bin/env bash\n\n# Originally written by https://github.com/deyloop/dot\n\n# Formats Markdown tables so that they are "
},
{
"path": "scripts/frombase2",
"chars": 61,
"preview": "#!/usr/bin/bash\nexec basenc -d -w 0 --base2lsbf < /dev/stdin\n"
},
{
"path": "scripts/funcsin",
"chars": 123,
"preview": "#!/bin/sh\n\n#TODO rewrite without subprocs\n\negrep '^[-_[:alpha:]]+ ?\\(' $1 | while read line; do\n echo ${line%%[ (]*}\ndo"
},
{
"path": "scripts/ghtable",
"chars": 81,
"preview": "#!/usr/bin/perl -F\\|\nuse v5.14;\n<STDIN>;\nchomp;\nsay;\nsay '|:-:' x ($#F+1) . '|';\n"
},
{
"path": "scripts/gidof",
"chars": 41,
"preview": "#!/bin/sh\nexec stat --printf \"%g\\n\" \"$1\"\n"
},
{
"path": "scripts/giveabout",
"chars": 53,
"preview": "#!/usr/bin/bash\nchat https://twitch.tv/rwxrob/about\n\n"
},
{
"path": "scripts/givediscord",
"chars": 52,
"preview": "#!/usr/bin/env bash\nchat https://discord.gg/9wydZXY\n"
},
{
"path": "scripts/giveperl",
"chars": 27,
"preview": "#!/bin/sh\ngive pae pie map\n"
},
{
"path": "scripts/giver",
"chars": 142,
"preview": "#!/bin/sh\n\nif [ \"${string#*/}\" != \"$string\" ]; then\n url=\"https://github.com/$1\" \nelse\n url=\"https://github.com/rwxrob"
},
{
"path": "scripts/giveraw",
"chars": 540,
"preview": "#!/usr/bin/env bash\n\n# Get the repository remote URL\nremote_url=$(git remote get-url origin)\n\n# Convert SSH (git@) URL t"
},
{
"path": "scripts/gl",
"chars": 1983,
"preview": "#!/usr/bin/bash\n\nNAME='Rob Muhlestein'\nUSER=rwxrob\nEMAIL='rwx@robs.io'\nTOKEN=$(auth token gitlab)\n\ndelete () {\n local"
},
{
"path": "scripts/gmi",
"chars": 60,
"preview": "#!/bin/bash\n\ngo mod init \"github${PWD#*github}\"\ngo mod tidy\n"
},
{
"path": "scripts/gobadges",
"chars": 515,
"preview": "#!/usr/bin/env bash\n\nurl=\"$1\"\n\nif [[ -e go.mod ]];then\n url=$(head -1 go.mod)\n url=${url#* }\nfi\n\necho \"
About this extraction
This page contains the full source code of the rwxrob/dot GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 488 files (1.4 MB), approximately 435.2k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.