From cffe5b3233dd0c96cf607d5852b8cafb24abe2cc Mon Sep 17 00:00:00 2001 From: Soundwave Date: Thu, 20 Oct 2022 08:52:18 +0800 Subject: [PATCH] Sub: Re migrate notes Body: ==== End ==== --- .gitignore | 332 + README.md | 9 +- article/adb.md | 20 + article/conda/conda.md | 70 + article/dev/php.md | 26 + article/dotnet/Multi-programing.md | 94 + article/git/git.md | 101 + article/golang/module.md | 13 + article/golang/vim-go.md | 10 + article/graphviz/dot-example.md | 54 + article/graphviz/hashmap/hashmap.c | 18 + article/graphviz/hashmap/hashmap.dot | 13 + article/graphviz/structs_html.dot | 28 + article/graphviz/structs_record.dot | 9 + article/ipv4.txt | 3916 ++++++ article/ipv6.txt | 1030 ++ article/jupyter/jupyter_config.md | 42 + article/mermaid.md | 54 + article/mitmproxy.md | 21 + article/mysql/backup.md | 33 + article/mysql/mariadb.md | 37 + article/os/linux/apifox.md | 17 + .../os/linux/archlinux/Installation-MBR.md | 176 + article/os/linux/archlinux/debtap.md | 143 + article/os/linux/centos/install-tools.md | 104 + article/os/linux/chattr.md | 10 + article/os/linux/crontab.md | 11 + article/os/linux/cuda.md | 19 + article/os/linux/file.md | 18 + article/os/linux/handshake.md | 21 + article/os/linux/kali.md | 34 + article/os/linux/postman.md | 22 + article/os/linux/scp.md | 29 + article/os/linux/tpp.md | 38 + article/os/linux/xfce4.md | 6 + article/os/mac/MacOS.md | 96 + article/os/mac/brew.md | 40 + article/os/win10/wsl.md | 43 + article/tex/cone.tex | 42 + article/wireshark/wirshark.md | 17 + config/alacritty/alacritty.yml | 908 ++ config/aria2/aria2.conf | 96 + config/aria2/aria2.md | 5 + config/browser/OmegaOptions.bak | 1 + config/browser/swithyomega.json | 62 + config/browser/tabliss.json | 63 + config/browser/vim-vixen.json | 235 + config/browser/vimium-c.json | 101 + config/cisco/cisco_client.md | 14 + config/cisco/vpnagentd.service | 14 + config/docker/config.sh | 12 + config/fcitx/config-rime.sh | 6 + config/fcitx/get-fcitx.sh | 14 + config/fcitx5/conf/cached_layouts | 3515 +++++ config/fcitx5/conf/classicui.conf | 29 + config/fcitx5/conf/notifications.conf | 3 + config/fcitx5/conf/rime.conf | 12 + config/fcitx5/config | 69 + config/fcitx5/profile | 23 + config/git/commit-template.txt | 58 + config/git/default.gitconfig | 54 + config/golang/dlv/config.yml | 25 + config/golang/get-go-env.sh | 31 + config/i3/Install.md | 36 + config/i3/config | 247 + config/i3/config.sh | 9 + config/ide/create-idea.sh | 29 + config/ide/create-postman.sh | 14 + config/ide/create-pycharm.sh | 30 + config/ide/idea.vmoptions | 23 + config/ide/jetbrains-idea-ce.desktop | 10 + config/ide/pycharm.md | 15 + config/ide/pycharm.vmoptions | 19 + config/kde/konsole/Ezio.profile | 39 + config/kde/konsole/Solarized Dark.colorscheme | 99 + config/kde/konsole/default.keytab | 100 + config/kde/konsole/restore.sh | 11 + config/kitty/base.conf | 2312 ++++ config/kitty/config.sh | 23 + config/kitty/kitty.conf.bak | 2294 ++++ config/kitty/linux.conf | 8 + config/kitty/macos.conf | 8 + config/maven/settings-aliyun.xml | 68 + config/mysql/mariadb.service | 175 + config/mysql/my.cnf | 36 + config/mysql/my56.cnf | 41 + config/mysql/my57-dev.cnf | 64 + config/mysql/mycli | 3 + config/mysql/myclirc | 189 + config/nodejs/get_nodejs.sh | 14 + config/nodejs/npm.md | 25 + config/nushell/config.nu | 578 + config/nushell/env.nu | 566 + config/nushell/oh-my.nu | 568 + config/nvim.v1/coc-settings.json | 9 + config/nvim.v1/init-gitee.vim | 682 + config/nvim.v1/init.vim | 564 + config/nvim.v1/lua/ale.lua | 3 + config/nvim.v1/lua/complete.lua | 181 + config/nvim.v1/lua/fugitive.lua | 9 + config/nvim.v1/lua/indentline.lua | 54 + config/nvim.v1/lua/leaderf.lua | 40 + config/nvim.v1/lua/nerdcomment.lua | 9 + config/nvim.v1/lua/nerdtree.lua | 46 + config/nvim.v1/lua/plug.lua | 98 + config/nvim.v1/lua/startify.lua | 34 + config/nvim.v1/lua/util.lua | 18 + config/nvim/init.lua | 31 + config/nvim/lua/neo/alpha.lua | 66 + config/nvim/lua/neo/alphascreen.lua | 567 + config/nvim/lua/neo/autopairs.lua | 33 + config/nvim/lua/neo/bufferline.lua | 9 + config/nvim/lua/neo/cmp.lua | 213 + config/nvim/lua/neo/comment.lua | 18 + config/nvim/lua/neo/go.lua | 13 + config/nvim/lua/neo/hop.lua | 12 + config/nvim/lua/neo/indentline.lua | 87 + config/nvim/lua/neo/lspconf.lua | 141 + config/nvim/lua/neo/lspmason.lua | 34 + config/nvim/lua/neo/lspsaga.lua | 203 + config/nvim/lua/neo/lualine.lua | 50 + config/nvim/lua/neo/markdown.lua | 21 + config/nvim/lua/neo/nvimtree.lua | 45 + config/nvim/lua/neo/option.lua | 101 + config/nvim/lua/neo/pkg.lua | 265 + config/nvim/lua/neo/python.lua | 31 + config/nvim/lua/neo/telescope.lua | 65 + config/nvim/lua/neo/theme.lua | 46 + config/nvim/lua/neo/treesitter.lua | 49 + config/nvim/lua/neo/trouble.lua | 6 + config/os/linux/backup.md | 15 + config/os/linux/change_dirnames.sh | 32 + config/os/linux/home.bash | 140 + config/os/linux/init.bash | 210 + config/os/linux/manjaro/Manjaro.md | 172 + config/os/linux/manjaro/cuda-conf.sh | 8 + .../os/linux/manjaro/install-pacman-items.sh | 8 + config/os/linux/manjaro/prepare-yay.sh | 22 + .../linux/manjaro/yay-add-essential-items.sh | 10 + .../os/linux/manjaro/yay-add-optimal-items.sh | 7 + config/os/linux/systemd.md | 7 + config/os/linux/xfce.xinitrc | 66 + config/os/mac/brew_cleanup.sh | 13 + config/os/mac/get_brew.sh | 3 + config/os/mac/install-brew.sh | 651 + config/os/mac/install-dev-items.sh | 8 + config/os/mac/iterm2.json | 799 ++ config/os/mac/restore_brew_source.sh | 15 + config/os/mac/use_tsinghua_brew.sh | 27 + config/pgsql/create.sql | 103 + config/pgsql/pg14.conf | 9 + config/pgsql/pgcli.config | 212 + config/pgsql/postgresql.service | 45 + config/pgsql/start-pg.sh | 7 + config/polybar/config | 426 + config/polybar/launch.sh | 9 + config/python/config-yapf.sh | 7 + config/python/lspkgs.sh | 4 + config/python/matplotlib/mac.matplotlibrc | 4 + config/python/matplotlib/win.matplotlibrc | 4 + config/python/requirements-paddle.txt | 27 + config/python/set-source.sh | 3 + config/python/style | 333 + config/ranger/commands.py | 137 + config/ranger/plugins/__init__.py | 1 + config/ranger/plugins/devicons.py | 324 + config/ranger/plugins/devicons_linemode.py | 18 + config/ranger/rc-sample.conf | 725 ++ config/ranger/rc.conf | 630 + config/ranger/rc.conf.old | 630 + config/ranger/rfile.conf | 258 + config/ranger/scope.sh | 273 + config/redis/redis.conf | 1052 ++ config/rust/cargo.toml | 23 + config/ssh/change-mod.sh | 6 + config/ssh/ssh_config | 41 + config/termux/motd | 6 + config/termux/termux.properties | 4 + config/tmux/compile.md | 44 + config/tmux/get_ohmytmux.sh | 4 + config/tmux/tmux.conf | 1531 +++ config/tmux/tmux.conf.local | 329 + config/tmux/tmux_v1.9.conf | 102 + config/tmux/tmux_v2.3.conf | 1196 ++ config/tools/pycodestyle | 3 + config/tools/resolv.conf.head | 2 + config/vim/_vimperatorrc | 21 + config/vim/basic.vim | 70 + config/vim/coc_config.vim | 446 + config/vim/compile.md | 61 + config/vim/compile.sh | 51 + config/vim/get_shfmt.sh | 9 + config/vim/idea.vim | 76 + config/vim/install_nerd_fonts_mac.md | 6 + config/vim/reset-repo.sh | 16 + config/vim/wsl.vim | 439 + config/vim/ycm_config.vim | 303 + config/vs/solarized-dark.vssettings | 480 + config/vs/vs.vim | 48 + config/win10/flypy.reg | 11 + config/win10/notepad3/SolarizedDark.ini | 592 + config/win10/notepad3/replace-notepad.bat | 13 + config/win10/notepad3/restore-notepad.bat | 11 + .../terminal/Microsoft.Powershell_profile.ps1 | 1060 ++ config/win10/terminal/bak.ps1 | 187 + config/win10/terminal/get_wifi_info.bat | 1 + config/win10/terminal/profiles.json | 514 + config/win10/terminal/profiles_bak.json | 135 + config/win10/terminal/settings.json | 590 + config/win10/wsl/arch.md | 11 + config/win10/wsl/init.sh | 23 + config/win10/wsl/wsl.conf | 5 + .../xfconf/xfce-perchannel-xml/displays.xml | 35 + .../xfce-perchannel-xml/keyboard-layout.xml | 11 + .../xfconf/xfce-perchannel-xml/keyboards.xml | 8 + .../xfconf/xfce-perchannel-xml/pointers.xml | 25 + .../xfconf/xfce-perchannel-xml/thunar.xml | 39 + .../xfce-perchannel-xml/xfce4-appfinder.xml | 46 + .../xfce-perchannel-xml/xfce4-desktop.xml | 41 + .../xfce4-keyboard-shortcuts.xml | 200 + .../xfce-perchannel-xml/xfce4-mixer.xml | 6 + .../xfce-perchannel-xml/xfce4-notifyd.xml | 24 + .../xfce-perchannel-xml/xfce4-panel.xml | 112 + .../xfce4-power-manager.xml | 10 + .../xfce-perchannel-xml/xfce4-session.xml | 29 + .../xfce4-settings-editor.xml | 9 + .../xfce4-settings-manager.xml | 10 + .../xfconf/xfce-perchannel-xml/xfwm4.xml | 91 + .../xfconf/xfce-perchannel-xml/xsettings.xml | 48 + config/zsh/bracket.zsh-theme | 37 + config/zsh/get-zsh-gitcode.sh | 11 + config/zsh/get-zsh-gitee.sh | 16 + config/zsh/get-zsh.sh | 18 + config/zsh/init.zsh | 235 + config/zsh/ohmyzsh.md | 36 + config/zsh/wsl.zsh | 130 + config/zsh/yst.zsh-theme | 74 + snippet/cpp/boost/lex.cpp | 12 + snippet/cpp/fork/test_fork.c | 33 + snippet/cpp/malloc.md | 24 + snippet/cpp/shm/map_normfile_init.c | 39 + snippet/cpp/shm/map_normfile_read.c | 24 + snippet/cpp/shm/relate_process.c | 46 + snippet/cpp/test_array.c | 21 + snippet/cpp/test_malloc.c | 19 + snippet/cpp/test_mmap.c | 39 + snippet/cpp/test_pid.c | 12 + snippet/cpp/test_static.c | 20 + snippet/js/base64.js | 236 + snippet/js/md5.js | 256 + snippet/octave/cannon.m | 163 + snippet/python/aeskey.py | 37 + snippet/python/aeskey_v2.py | 35 + snippet/python/ascii.py | 61 + snippet/python/attr.py | 33 + snippet/python/auto_job.py | 7 + snippet/python/base64.py | 22 + snippet/python/bid/bid.py | 99 + snippet/python/bid/bid2.py | 84 + snippet/python/bid/bid3.py | 59 + snippet/python/bid/bid4.py | 94 + snippet/python/bid/bid5.py | 88 + snippet/python/csv2pg.py | 73 + snippet/python/csv_to_sql.py | 73 + snippet/python/data_clk.py | 46 + snippet/python/deco2.py | 27 + snippet/python/decorator.py | 28 + snippet/python/disk_monitor.py | 16 + snippet/python/dwen.py | 370 + snippet/python/env.py | 13 + snippet/python/heart.py | 3 + snippet/python/idle.py | 75 + snippet/python/kindle.py | 54 + snippet/python/logid.py | 58 + snippet/python/password.py | 32 + snippet/python/pi.py | 37 + snippet/python/uniq.py | 32 + snippet/python/util/SimpleHTTPServer.py | 309 + .../python/util/SimpleHTTPServerWithUpload.py | 296 + snippet/python/util/obj_dict.py | 20 + snippet/python/weien.py | 124 + snippet/python/window.py | 0 snippet/shell/api.sh | 13 + snippet/shell/env.sh | 9 + snippet/shell/example.bat | 13 + snippet/shell/gen.sh | 18 + snippet/shell/mysql-bak.sh | 24 + snippet/shell/neofetch | 10572 ++++++++++++++++ snippet/shell/print-colors.sh | 10 + snippet/shell/print-uniq-rows.sh | 16 + snippet/shell/protect.sh | 3 + snippet/shell/rename-git-commit.sh | 24 + snippet/shell/rename.ps1 | 7 + snippet/shell/rm-dotnet.sh | 40 + snippet/shell/rm-mac-crash.sh | 11 + snippet/shell/rm-vscode-java-files.sh | 27 + snippet/shell/test.txt | 11 + 297 files changed, 54943 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 article/adb.md create mode 100644 article/conda/conda.md create mode 100644 article/dev/php.md create mode 100644 article/dotnet/Multi-programing.md create mode 100644 article/git/git.md create mode 100644 article/golang/module.md create mode 100644 article/golang/vim-go.md create mode 100644 article/graphviz/dot-example.md create mode 100644 article/graphviz/hashmap/hashmap.c create mode 100644 article/graphviz/hashmap/hashmap.dot create mode 100644 article/graphviz/structs_html.dot create mode 100644 article/graphviz/structs_record.dot create mode 100644 article/ipv4.txt create mode 100644 article/ipv6.txt create mode 100644 article/jupyter/jupyter_config.md create mode 100644 article/mermaid.md create mode 100644 article/mitmproxy.md create mode 100644 article/mysql/backup.md create mode 100644 article/mysql/mariadb.md create mode 100644 article/os/linux/apifox.md create mode 100644 article/os/linux/archlinux/Installation-MBR.md create mode 100644 article/os/linux/archlinux/debtap.md create mode 100644 article/os/linux/centos/install-tools.md create mode 100644 article/os/linux/chattr.md create mode 100644 article/os/linux/crontab.md create mode 100644 article/os/linux/cuda.md create mode 100644 article/os/linux/file.md create mode 100644 article/os/linux/handshake.md create mode 100644 article/os/linux/kali.md create mode 100644 article/os/linux/postman.md create mode 100644 article/os/linux/scp.md create mode 100644 article/os/linux/tpp.md create mode 100644 article/os/linux/xfce4.md create mode 100644 article/os/mac/MacOS.md create mode 100644 article/os/mac/brew.md create mode 100644 article/os/win10/wsl.md create mode 100644 article/tex/cone.tex create mode 100644 article/wireshark/wirshark.md create mode 100644 config/alacritty/alacritty.yml create mode 100644 config/aria2/aria2.conf create mode 100644 config/aria2/aria2.md create mode 100644 config/browser/OmegaOptions.bak create mode 100644 config/browser/swithyomega.json create mode 100644 config/browser/tabliss.json create mode 100644 config/browser/vim-vixen.json create mode 100644 config/browser/vimium-c.json create mode 100644 config/cisco/cisco_client.md create mode 100644 config/cisco/vpnagentd.service create mode 100644 config/docker/config.sh create mode 100644 config/fcitx/config-rime.sh create mode 100644 config/fcitx/get-fcitx.sh create mode 100644 config/fcitx5/conf/cached_layouts create mode 100644 config/fcitx5/conf/classicui.conf create mode 100644 config/fcitx5/conf/notifications.conf create mode 100644 config/fcitx5/conf/rime.conf create mode 100644 config/fcitx5/config create mode 100644 config/fcitx5/profile create mode 100644 config/git/commit-template.txt create mode 100644 config/git/default.gitconfig create mode 100644 config/golang/dlv/config.yml create mode 100644 config/golang/get-go-env.sh create mode 100644 config/i3/Install.md create mode 100644 config/i3/config create mode 100644 config/i3/config.sh create mode 100755 config/ide/create-idea.sh create mode 100755 config/ide/create-postman.sh create mode 100755 config/ide/create-pycharm.sh create mode 100644 config/ide/idea.vmoptions create mode 100644 config/ide/jetbrains-idea-ce.desktop create mode 100644 config/ide/pycharm.md create mode 100644 config/ide/pycharm.vmoptions create mode 100644 config/kde/konsole/Ezio.profile create mode 100644 config/kde/konsole/Solarized Dark.colorscheme create mode 100644 config/kde/konsole/default.keytab create mode 100755 config/kde/konsole/restore.sh create mode 100644 config/kitty/base.conf create mode 100755 config/kitty/config.sh create mode 100644 config/kitty/kitty.conf.bak create mode 100644 config/kitty/linux.conf create mode 100644 config/kitty/macos.conf create mode 100644 config/maven/settings-aliyun.xml create mode 100644 config/mysql/mariadb.service create mode 100644 config/mysql/my.cnf create mode 100644 config/mysql/my56.cnf create mode 100644 config/mysql/my57-dev.cnf create mode 100755 config/mysql/mycli create mode 100644 config/mysql/myclirc create mode 100644 config/nodejs/get_nodejs.sh create mode 100644 config/nodejs/npm.md create mode 100644 config/nushell/config.nu create mode 100644 config/nushell/env.nu create mode 100644 config/nushell/oh-my.nu create mode 100644 config/nvim.v1/coc-settings.json create mode 100644 config/nvim.v1/init-gitee.vim create mode 100644 config/nvim.v1/init.vim create mode 100644 config/nvim.v1/lua/ale.lua create mode 100644 config/nvim.v1/lua/complete.lua create mode 100644 config/nvim.v1/lua/fugitive.lua create mode 100644 config/nvim.v1/lua/indentline.lua create mode 100644 config/nvim.v1/lua/leaderf.lua create mode 100644 config/nvim.v1/lua/nerdcomment.lua create mode 100644 config/nvim.v1/lua/nerdtree.lua create mode 100644 config/nvim.v1/lua/plug.lua create mode 100644 config/nvim.v1/lua/startify.lua create mode 100644 config/nvim.v1/lua/util.lua create mode 100644 config/nvim/init.lua create mode 100644 config/nvim/lua/neo/alpha.lua create mode 100644 config/nvim/lua/neo/alphascreen.lua create mode 100644 config/nvim/lua/neo/autopairs.lua create mode 100644 config/nvim/lua/neo/bufferline.lua create mode 100644 config/nvim/lua/neo/cmp.lua create mode 100644 config/nvim/lua/neo/comment.lua create mode 100644 config/nvim/lua/neo/go.lua create mode 100644 config/nvim/lua/neo/hop.lua create mode 100644 config/nvim/lua/neo/indentline.lua create mode 100644 config/nvim/lua/neo/lspconf.lua create mode 100644 config/nvim/lua/neo/lspmason.lua create mode 100644 config/nvim/lua/neo/lspsaga.lua create mode 100644 config/nvim/lua/neo/lualine.lua create mode 100644 config/nvim/lua/neo/markdown.lua create mode 100644 config/nvim/lua/neo/nvimtree.lua create mode 100644 config/nvim/lua/neo/option.lua create mode 100644 config/nvim/lua/neo/pkg.lua create mode 100644 config/nvim/lua/neo/python.lua create mode 100644 config/nvim/lua/neo/telescope.lua create mode 100644 config/nvim/lua/neo/theme.lua create mode 100644 config/nvim/lua/neo/treesitter.lua create mode 100644 config/nvim/lua/neo/trouble.lua create mode 100644 config/os/linux/backup.md create mode 100644 config/os/linux/change_dirnames.sh create mode 100644 config/os/linux/home.bash create mode 100644 config/os/linux/init.bash create mode 100644 config/os/linux/manjaro/Manjaro.md create mode 100644 config/os/linux/manjaro/cuda-conf.sh create mode 100644 config/os/linux/manjaro/install-pacman-items.sh create mode 100644 config/os/linux/manjaro/prepare-yay.sh create mode 100644 config/os/linux/manjaro/yay-add-essential-items.sh create mode 100644 config/os/linux/manjaro/yay-add-optimal-items.sh create mode 100644 config/os/linux/systemd.md create mode 100644 config/os/linux/xfce.xinitrc create mode 100644 config/os/mac/brew_cleanup.sh create mode 100644 config/os/mac/get_brew.sh create mode 100644 config/os/mac/install-brew.sh create mode 100644 config/os/mac/install-dev-items.sh create mode 100644 config/os/mac/iterm2.json create mode 100644 config/os/mac/restore_brew_source.sh create mode 100644 config/os/mac/use_tsinghua_brew.sh create mode 100644 config/pgsql/create.sql create mode 100644 config/pgsql/pg14.conf create mode 100644 config/pgsql/pgcli.config create mode 100644 config/pgsql/postgresql.service create mode 100755 config/pgsql/start-pg.sh create mode 100644 config/polybar/config create mode 100644 config/polybar/launch.sh create mode 100644 config/python/config-yapf.sh create mode 100644 config/python/lspkgs.sh create mode 100644 config/python/matplotlib/mac.matplotlibrc create mode 100644 config/python/matplotlib/win.matplotlibrc create mode 100644 config/python/requirements-paddle.txt create mode 100644 config/python/set-source.sh create mode 100644 config/python/style create mode 100644 config/ranger/commands.py create mode 100644 config/ranger/plugins/__init__.py create mode 100644 config/ranger/plugins/devicons.py create mode 100644 config/ranger/plugins/devicons_linemode.py create mode 100644 config/ranger/rc-sample.conf create mode 100644 config/ranger/rc.conf create mode 100644 config/ranger/rc.conf.old create mode 100644 config/ranger/rfile.conf create mode 100755 config/ranger/scope.sh create mode 100644 config/redis/redis.conf create mode 100644 config/rust/cargo.toml create mode 100644 config/ssh/change-mod.sh create mode 100644 config/ssh/ssh_config create mode 100644 config/termux/motd create mode 100644 config/termux/termux.properties create mode 100644 config/tmux/compile.md create mode 100644 config/tmux/get_ohmytmux.sh create mode 100644 config/tmux/tmux.conf create mode 100644 config/tmux/tmux.conf.local create mode 100644 config/tmux/tmux_v1.9.conf create mode 100644 config/tmux/tmux_v2.3.conf create mode 100644 config/tools/pycodestyle create mode 100644 config/tools/resolv.conf.head create mode 100644 config/vim/_vimperatorrc create mode 100644 config/vim/basic.vim create mode 100644 config/vim/coc_config.vim create mode 100644 config/vim/compile.md create mode 100644 config/vim/compile.sh create mode 100644 config/vim/get_shfmt.sh create mode 100644 config/vim/idea.vim create mode 100644 config/vim/install_nerd_fonts_mac.md create mode 100644 config/vim/reset-repo.sh create mode 100644 config/vim/wsl.vim create mode 100644 config/vim/ycm_config.vim create mode 100644 config/vs/solarized-dark.vssettings create mode 100644 config/vs/vs.vim create mode 100644 config/win10/flypy.reg create mode 100644 config/win10/notepad3/SolarizedDark.ini create mode 100644 config/win10/notepad3/replace-notepad.bat create mode 100644 config/win10/notepad3/restore-notepad.bat create mode 100644 config/win10/terminal/Microsoft.Powershell_profile.ps1 create mode 100644 config/win10/terminal/bak.ps1 create mode 100644 config/win10/terminal/get_wifi_info.bat create mode 100644 config/win10/terminal/profiles.json create mode 100644 config/win10/terminal/profiles_bak.json create mode 100644 config/win10/terminal/settings.json create mode 100644 config/win10/wsl/arch.md create mode 100644 config/win10/wsl/init.sh create mode 100644 config/win10/wsl/wsl.conf create mode 100644 config/xfce4/xfconf/xfce-perchannel-xml/displays.xml create mode 100644 config/xfce4/xfconf/xfce-perchannel-xml/keyboard-layout.xml create mode 100644 config/xfce4/xfconf/xfce-perchannel-xml/keyboards.xml create mode 100644 config/xfce4/xfconf/xfce-perchannel-xml/pointers.xml create mode 100644 config/xfce4/xfconf/xfce-perchannel-xml/thunar.xml create mode 100644 config/xfce4/xfconf/xfce-perchannel-xml/xfce4-appfinder.xml create mode 100644 config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml create mode 100644 config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml create mode 100644 config/xfce4/xfconf/xfce-perchannel-xml/xfce4-mixer.xml create mode 100644 config/xfce4/xfconf/xfce-perchannel-xml/xfce4-notifyd.xml create mode 100644 config/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml create mode 100644 config/xfce4/xfconf/xfce-perchannel-xml/xfce4-power-manager.xml create mode 100644 config/xfce4/xfconf/xfce-perchannel-xml/xfce4-session.xml create mode 100644 config/xfce4/xfconf/xfce-perchannel-xml/xfce4-settings-editor.xml create mode 100644 config/xfce4/xfconf/xfce-perchannel-xml/xfce4-settings-manager.xml create mode 100644 config/xfce4/xfconf/xfce-perchannel-xml/xfwm4.xml create mode 100644 config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml create mode 100644 config/zsh/bracket.zsh-theme create mode 100755 config/zsh/get-zsh-gitcode.sh create mode 100755 config/zsh/get-zsh-gitee.sh create mode 100644 config/zsh/get-zsh.sh create mode 100644 config/zsh/init.zsh create mode 100644 config/zsh/ohmyzsh.md create mode 100644 config/zsh/wsl.zsh create mode 100644 config/zsh/yst.zsh-theme create mode 100644 snippet/cpp/boost/lex.cpp create mode 100644 snippet/cpp/fork/test_fork.c create mode 100644 snippet/cpp/malloc.md create mode 100644 snippet/cpp/shm/map_normfile_init.c create mode 100644 snippet/cpp/shm/map_normfile_read.c create mode 100644 snippet/cpp/shm/relate_process.c create mode 100644 snippet/cpp/test_array.c create mode 100644 snippet/cpp/test_malloc.c create mode 100644 snippet/cpp/test_mmap.c create mode 100644 snippet/cpp/test_pid.c create mode 100644 snippet/cpp/test_static.c create mode 100644 snippet/js/base64.js create mode 100644 snippet/js/md5.js create mode 100644 snippet/octave/cannon.m create mode 100644 snippet/python/aeskey.py create mode 100644 snippet/python/aeskey_v2.py create mode 100644 snippet/python/ascii.py create mode 100644 snippet/python/attr.py create mode 100644 snippet/python/auto_job.py create mode 100644 snippet/python/base64.py create mode 100644 snippet/python/bid/bid.py create mode 100644 snippet/python/bid/bid2.py create mode 100644 snippet/python/bid/bid3.py create mode 100644 snippet/python/bid/bid4.py create mode 100644 snippet/python/bid/bid5.py create mode 100644 snippet/python/csv2pg.py create mode 100644 snippet/python/csv_to_sql.py create mode 100644 snippet/python/data_clk.py create mode 100644 snippet/python/deco2.py create mode 100644 snippet/python/decorator.py create mode 100644 snippet/python/disk_monitor.py create mode 100644 snippet/python/dwen.py create mode 100644 snippet/python/env.py create mode 100644 snippet/python/heart.py create mode 100644 snippet/python/idle.py create mode 100644 snippet/python/kindle.py create mode 100644 snippet/python/logid.py create mode 100644 snippet/python/password.py create mode 100644 snippet/python/pi.py create mode 100644 snippet/python/uniq.py create mode 100644 snippet/python/util/SimpleHTTPServer.py create mode 100644 snippet/python/util/SimpleHTTPServerWithUpload.py create mode 100644 snippet/python/util/obj_dict.py create mode 100644 snippet/python/weien.py create mode 100644 snippet/python/window.py create mode 100644 snippet/shell/api.sh create mode 100644 snippet/shell/env.sh create mode 100644 snippet/shell/example.bat create mode 100644 snippet/shell/gen.sh create mode 100755 snippet/shell/mysql-bak.sh create mode 100755 snippet/shell/neofetch create mode 100644 snippet/shell/print-colors.sh create mode 100644 snippet/shell/print-uniq-rows.sh create mode 100755 snippet/shell/protect.sh create mode 100644 snippet/shell/rename-git-commit.sh create mode 100644 snippet/shell/rename.ps1 create mode 100755 snippet/shell/rm-dotnet.sh create mode 100644 snippet/shell/rm-mac-crash.sh create mode 100644 snippet/shell/rm-vscode-java-files.sh create mode 100644 snippet/shell/test.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8c30de6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,332 @@ +*~ +pkg/* +*.html +*.exe +_book +*.epub +*.pdf +.DS_Store +.vscode/ +.idea/ +.git +.ipynb_checkpoints +**/*.out +*.so +*.swp +*.swo + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +*.vim/ + +**/.ropeproject/** + +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc +*.fmt +*.fot +*.cb +*.cb2 +.*.lb + +## Intermediate documents: +*.dvi +*.xdv +*-converted-to.* +# these rules might exclude image files for figures etc. +# *.ps +# *.eps +# *.pdf + +## Generated if empty string is given at "Please type another file name for output:" +.pdf + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bcf +*.blg +*-blx.aux +*-blx.bib +*.run.xml + +## Build tool auxiliary files: +*.fdb_latexmk +*.synctex +*.synctex(busy) +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync + +## Build tool directories for auxiliary files +# latexrun +latex.out/ + +## Auxiliary and intermediate files from other packages: +# algorithms +*.alg +*.loa + +# achemso +acs-*.bib + +# amsthm +*.thm + +# beamer +*.nav +*.pre +*.snm +*.vrb + +# changes +*.soc + +# comment +*.cut + +# cprotect +*.cpt + +# elsarticle (documentclass of Elsevier journals) +*.spl + +# endnotes +*.ent + +# fixme +*.lox + +# feynmf/feynmp +*.mf +*.mp +*.t[1-9] +*.t[1-9][0-9] +*.tfm + +#(r)(e)ledmac/(r)(e)ledpar +*.end +*.?end +*.[1-9] +*.[1-9][0-9] +*.[1-9][0-9][0-9] +*.[1-9]R +*.[1-9][0-9]R +*.[1-9][0-9][0-9]R +*.eledsec[1-9] +*.eledsec[1-9]R +*.eledsec[1-9][0-9] +*.eledsec[1-9][0-9]R +*.eledsec[1-9][0-9][0-9] +*.eledsec[1-9][0-9][0-9]R + +# glossaries +*.acn +*.acr +*.glg +*.glo +*.gls +*.glsdefs +*.lzo +*.lzs + +# uncomment this for glossaries-extra (will ignore makeindex's style files!) +# *.ist + +# gnuplottex +*-gnuplottex-* + +# gregoriotex +*.gaux +*.gtex + +# htlatex +*.4ct +*.4tc +*.idv +*.lg +*.trc +*.xref + +# hyperref +*.brf + +# knitr +*-concordance.tex +# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files +# *.tikz +*-tikzDictionary + +# listings +*.lol + +# luatexja-ruby +*.ltjruby + +# makeidx +*.idx +*.ilg +*.ind + +# minitoc +*.maf +*.mlf +*.mlt +*.mtc[0-9]* +*.slf[0-9]* +*.slt[0-9]* +*.stc[0-9]* + +# minted +_minted* +*.pyg + +# morewrites +*.mw + +# nomencl +*.nlg +*.nlo +*.nls + +# pax +*.pax + +# pdfpcnotes +*.pdfpc + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# scrwfile +*.wrt + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# pdfcomment +*.upa +*.upb + +# pythontex +*.pytxcode +pythontex-files-*/ + +# tcolorbox +*.listing + +# thmtools +*.loe + +# TikZ & PGF +*.dpth +*.md5 +*.auxlock + +# todonotes +*.tdo + +# vhistory +*.hst +*.ver + +# easy-todo +*.lod + +# xcolor +*.xcp + +# xmpincl +*.xmpi + +# xindy +*.xdy + +# xypic precompiled matrices and outlines +*.xyc +*.xyd + +# endfloat +*.ttt +*.fff + +# Latexian +TSWLatexianTemp* + +## Editors: +# WinEdt +*.bak +*.sav + +# Texpad +.texpadtmp + +# LyX +*.lyx~ + +# Kile +*.backup + +# gummi +.*.swp + +# KBibTeX +*~[0-9]* + +# TeXnicCenter +*.tps + +# auto folder when using emacs and auctex +./auto/* +*.el + +# expex forward references with \gathertags +*-tags.tex + +# standalone packages +*.sta + +# Makeindex log files +*.lpz + +# xwatermark package +*.xwm + +# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib +# option is specified. Footnotes are the stored in a file with suffix Notes.bib. +# Uncomment the next line to have this generated file ignored. +#*Notes.bib diff --git a/README.md b/README.md index 6a9ea45..66f940b 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,9 @@ -# notes +# Notes +This project mainly stores config files for development, such as vim, zsh, tmux and so on. + +Here are the contents: + +1. config: Configuration files of Linux, MacOS, and Windows. +2. snippet: Some snippets. +3. article: Knowledge and experience summary. diff --git a/article/adb.md b/article/adb.md new file mode 100644 index 0000000..720a59a --- /dev/null +++ b/article/adb.md @@ -0,0 +1,20 @@ +# adb 使用小结 + +## 查看设备 + +```bash +adb devices +``` + +## 查看设备安装的应用列表 + +```bash +adb shell pm list packages +``` + +## 卸载设备上的 app + +```bash +adb shell pm uninstall --user 0 com.xxx.xxx +``` + diff --git a/article/conda/conda.md b/article/conda/conda.md new file mode 100644 index 0000000..48eca8e --- /dev/null +++ b/article/conda/conda.md @@ -0,0 +1,70 @@ +# conda usage + +## Update conda + +```bash +conda update --all +``` + +clean unused pkgs after update + +```bash +conda clean -p +``` + +## Python virtual envs + +### Create env with specified Python version + +```bash +conda create -n $name python=3.x +``` + +Create env from yaml file + +```bash +conda env create -f environment.yml +``` + +Export env to yaml file + +```bash +conda env export > env.yml +``` + +### List conda virtual envs + +```bash +conda env list +``` + +### Activation and Deactivation + +```bash +source activate $name +source deactivate +``` + +### Install Python packages + +```bash +conda install -n $name $pkg1 $pkg2 ... +``` + +Install Python packages from requirements + +```bash +conda install --yes --file requirements.txt +``` + +### Remove Python packages + +```bash +conda remove --name $name $pkg1 $pkg2 ... +``` + +### Remove virtual env + +```bash +conda remove -n $name --all +``` diff --git a/article/dev/php.md b/article/dev/php.md new file mode 100644 index 0000000..2dab1c0 --- /dev/null +++ b/article/dev/php.md @@ -0,0 +1,26 @@ +# php notes + +## Install php on centos 6 + +First of all, you need to enable Remi and EPEL yum repositories on your system. Use the following command to install EPEL repository on your CentOS and Red Hat 7/6 systems + +Use this command to install epel-release yum repository + +```bash +yum install epel-release +``` + +and now execute one of the following commands as per your operating system version to install Remi repository. + +```bash +rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm +``` + +Your system is prepared for the PHP installation from yum repositories. Use one of the following commands to install PHP 7.3 or PHP 7.2 or PHP 7.1 on your system based on your requirements. + +```bash +yum --enablerepo=remi-php73 install php +yum --enablerepo=remi-php72 install php +yum --enablerepo=remi-php71 install php +``` + diff --git a/article/dotnet/Multi-programing.md b/article/dotnet/Multi-programing.md new file mode 100644 index 0000000..47f15e7 --- /dev/null +++ b/article/dotnet/Multi-programing.md @@ -0,0 +1,94 @@ +# dotnet 调用算法方案 + +## 1. Python 开发算法内核 + +### 1.1 跨服务调用 + +#### 方案说明 + +将 Python 算法封装为服务,提供 HTTP 接口,dotnet 作为客户端调用服务。 + +#### 优点 & 缺点 + +优点 + +- 客户机不需要有较高的配置,也不需要安装 Python 环境,服务端可采用 Linux,配置 cuda 等 GPU 计算环境,服务端一直处于热部署状态,性能较好; +- 通过联网对客户有更好的控制; +- 软件架构分为客户端和服务端,开发成本低,各端定位问题比较简单; +- 保密性好 + +缺点 + +- 架构较复杂,需要客户端联网才能使用; +- 需要考虑服务端成本; + +### 1.2 封装为动态链接库 + +#### 方案说明 + +将 Python 功能封装为 dll 提供给 C# 调用 + +#### 优点 & 缺点 + +优点 + +- 客户端不需要联网,使用比较方便 +- Python 开发成本较低 + +缺点 + +- Python 自带包里的方法封装为 dll 是可行的,但对于依赖大量通过 pip 安装的包来说,是否可行需要调研,相较于上一个方案,开发成本较高; +- 客户端软件+硬件安装较复杂,需要安装 Python 环境,甚至需要安装 cuda 驱动、配置 GPU 计算环境; + +### 1.3 不封装或者封装为可执行文件 + +#### 方案说明 + +使用 Python 开发算法内核,将源文件放在 C# 工程中,客户端配置好 Python(or Anaconda) 环境,直接调用 Python 解释器执行脚本,或者将脚本封装为 exe 调用,参考 https://github.com/Nuitka/Nuitka 将 Python 源码编译为 exe 文件。 + +#### 优点 & 缺点 + +优点 + +- 开发成本低 + +缺点 + +- 保密性不好,客户端有可能查看到算法源代码(待定,目前调研 Blender 是用 Nuitka 封装的) + +## 2 C++/C# 开发算法内核 + +#### 方案说明 + +使用 C++/C# 开发算法内核,并封装为 dll 提供给 C# 调用。已知一个 C++ 可用的分类代码库:https://github.com/dsteinberg/libcluster + +#### 优点 & 缺点 + +优点 + +- 运行效率高 +- 难以被反编译 + +缺点 + +- 开发成本较高 +- C++ GPU 编程需调研 + +## 3 Matlab 提供算法 + +#### 方案说明 + +使用 Matlab 开发算法内核,封装为 dll 提供给 C# 调用。 + +#### 优点 & 缺点 + +优点 + +- 运行效率高 +- 难以被反编译 +- 开发成本可控 + +缺点 + +- GPU 开发需要调研 +- 使用 Matlab 可能需要授权 diff --git a/article/git/git.md b/article/git/git.md new file mode 100644 index 0000000..dd7a7ff --- /dev/null +++ b/article/git/git.md @@ -0,0 +1,101 @@ +# git 配置 + +## 账号配置 + +### 配置密钥 + +按邮箱生成密钥 + +```bash +ssh-keygen -t rsa -f ~/.ssh/id_rsa_your_custom_name -C "your email" +``` + +添加密钥 + +```bash +ssh-add ~/.ssh/id_rsa_your_custom_name +``` + +编辑 `~/.ssh/config` 文件,添加如下内容: + +```text +Host github.com + HostName github.com + User Your_Custom_name + IdentityFile ~/.ssh/id_rsa_your_custom_name +``` + +### 配置单用户 + +cd 到项目的根目录,查看 git 配置: + +```bash +git config --list +``` + +看一下 `user.name` 和 `user.email` 是否和希望上传的账号匹配,否则使用如下命令进行修改: + +```bash +git config user.email "your@email.com" +git config user.name "your name" +``` + +### 配置多用户 + +File `~/.ssh/config` is also very useful when you have to work with multiple git accounts. + +```config +Host github.com + HostName github.com + User git + IdentityFile ~/.ssh/github + +Host github_as_alice + HostName github.com + User git + IdentityFile ~/.ssh/github_alice + +Host github_as_bob + HostName github.com + User git + IdentityFile ~/.ssh/github_bob +``` + +Default `github.com` will work by default. + +For alice: replace 'git@github.com' with 'git@github\_as\_alice' when you use `git clone` or `git remote add origin`. + +For bob: replace 'git@github.com' with 'git@github\_as\_bob' when you use `git clone` or `git remote add origin`. + +## 跨平台提交代码配置 + +在 windows 系统中设置 + +```bash +git config --global core.autocrlf input +git config --global core.safecrlf true +git config --global core.eol lf +``` + +## 设置编辑器 + +```bash +git config --global core.editor vim +git config --global merge.tool vimdiff +``` + +## 编译高版本 git + +```bash +yum -y install zlib-devel curl-devel openssl-devel perl cpio expat-devel gettext-devel openssl zlib autoconf tk perl-ExtUtils-MakeMaker +``` + +下面的命令将 git 安装到 `/usr/local/bin/` 中,可以自行设置 `--prefix` 项 + +```bash +cd /path/to/git/source +./configure --prefix=/usr/local +make +make install +``` + diff --git a/article/golang/module.md b/article/golang/module.md new file mode 100644 index 0000000..642c033 --- /dev/null +++ b/article/golang/module.md @@ -0,0 +1,13 @@ +# module usage + +## init a package + +```bash +go mod init +``` + +## remove unused packages + +```bash +go mod tidy +``` diff --git a/article/golang/vim-go.md b/article/golang/vim-go.md new file mode 100644 index 0000000..e8f65cb --- /dev/null +++ b/article/golang/vim-go.md @@ -0,0 +1,10 @@ +# Vim-go Usage + +## vim-go: : packages.Load error + +Type the commands bellow: + +```bash +go clean -cache +``` + diff --git a/article/graphviz/dot-example.md b/article/graphviz/dot-example.md new file mode 100644 index 0000000..1865c73 --- /dev/null +++ b/article/graphviz/dot-example.md @@ -0,0 +1,54 @@ +# Graphviz markdown doc example + +## basic dot example + +```graphviz +digraph example { + node [shape="diamond"] + edge [style="dashed"] + + a[style="filled", color="green"] + b + c + d + + a -> b + b -> d + c -> d[color="red"] +} +``` + +## struct example + +> Not supporting so well + +```graphviz +digraph structs { + node [shape=plaintext] + struct1 [label=< + + +
leftmid dleright
>]; + struct2 [label=< + + +
onetwo
>]; + struct3 [label=< + + + + + + + + + + + + + +
hello
world
bgh
cde
f
>]; + struct1:f1 -> struct2:f0; + struct1:f2 -> struct3:here; +} +``` diff --git a/article/graphviz/hashmap/hashmap.c b/article/graphviz/hashmap/hashmap.c new file mode 100644 index 0000000..143a10f --- /dev/null +++ b/article/graphviz/hashmap/hashmap.c @@ -0,0 +1,18 @@ +typedef struct st_hash_type { + int (*compare) (); + int (*hash) (); +} st_hash_type; + +typedef struct st_table_entry { + unsigned int hash; + char *key; + char *record; + st_table_entry *next; +} st_table_entry; + +typedef struct st_table { + struct st_hash_type *type; + int num_bins; /* slot count */ + int num_entries; /* total number of entries */ + struct st_table_entry **bins; /* slot */ +} st_table; diff --git a/article/graphviz/hashmap/hashmap.dot b/article/graphviz/hashmap/hashmap.dot new file mode 100644 index 0000000..52cc812 --- /dev/null +++ b/article/graphviz/hashmap/hashmap.dot @@ -0,0 +1,13 @@ +digraph hashmap { + rankdir = TB + node[color="skyblue", shape="record"] + edge[color="crimson"] + + st_hash_type[label="{st_hash_type|(*compare)|(*hash)}"] + st_table_entry[label="{st_table_entry|hash|key|record|next}"] + st_table[label="{st_table|type|num_bins|num_entries|bins}"] + + st_table:bins -> st_table_entry:head + st_table:type -> st_hash_type:head + st_table_entry:next -> st_table_entry:head[style="dashed", color="forestgreen"] +} \ No newline at end of file diff --git a/article/graphviz/structs_html.dot b/article/graphviz/structs_html.dot new file mode 100644 index 0000000..e8eb130 --- /dev/null +++ b/article/graphviz/structs_html.dot @@ -0,0 +1,28 @@ +digraph structs { + node [shape=plaintext] + struct1 [label=< + + +
leftmid dleright
>]; + struct2 [label=< + + +
onetwo
>]; + struct3 [label=< + + + + + + + + + + + + + +
hello
world
bgh
cde
f
>]; + struct1:f1 -> struct2:f0; + struct1:f2 -> struct3:here; +} \ No newline at end of file diff --git a/article/graphviz/structs_record.dot b/article/graphviz/structs_record.dot new file mode 100644 index 0000000..6959bc7 --- /dev/null +++ b/article/graphviz/structs_record.dot @@ -0,0 +1,9 @@ +digraph structs { + rankdir=TB + node [shape="record"] + struct1 [label=" left | middle | right"] + struct2 [label=" one | two"] + struct3 [label="hello\nworld | {b | {c | d | e} | f} | g | h"] + struct1:f1 -> struct2:f0 + struct1:f2 -> struct3:here +} diff --git a/article/ipv4.txt b/article/ipv4.txt new file mode 100644 index 0000000..93058c7 --- /dev/null +++ b/article/ipv4.txt @@ -0,0 +1,3916 @@ + ######################## +# 中国大陆_IP地址段_IPv4 +# 数据来自于: https://bgp.space/ +# 数据生成时间:2021-06-25 00:29:53 +# 数据共计条数:3905 +######################## + +######### BEGIN ######### +1.1.8.0/24 +1.2.4.0/24 +1.8.1.0/24 +1.8.8.0/24 +1.12.0.0/14 +1.24.0.0/13 +1.45.0.0/16 +1.48.0.0/14 +1.56.0.0/13 +1.68.0.0/14 +1.80.0.0/13 +1.88.0.0/14 +1.92.0.0/20 +1.93.0.0/16 +1.94.0.0/15 +1.116.0.0/15 +1.118.0.0/23 +1.118.2.0/24 +1.118.32.0/24 +1.119.0.0/17 +1.119.128.0/18 +1.119.192.0/21 +1.119.200.0/22 +1.119.204.0/24 +1.180.0.0/14 +1.184.0.0/15 +1.188.0.0/14 +1.192.0.0/13 +1.202.0.0/15 +1.204.0.0/14 +2.58.230.0/24 +5.10.136.0/22 +5.10.140.0/24 +5.10.142.0/23 +5.154.132.0/23 +5.154.136.0/22 +5.154.140.0/23 +5.154.144.0/22 +5.154.158.0/23 +8.25.82.0/24 +8.38.121.0/24 +8.45.52.0/24 +8.45.176.0/24 +8.48.85.0/24 +8.129.0.0/16 +8.130.0.0/15 +8.132.0.0/14 +8.136.0.0/16 +8.140.0.0/14 +8.144.0.0/14 +14.16.0.0/12 +14.102.156.0/24 +14.102.159.0/24 +14.104.0.0/13 +14.112.0.0/12 +14.134.0.0/15 +14.144.0.0/12 +14.204.0.0/15 +14.208.0.0/12 +23.225.91.0/24 +27.0.128.0/24 +27.0.130.0/23 +27.0.160.0/21 +27.0.204.0/22 +27.0.208.0/21 +27.8.0.0/13 +27.16.0.0/12 +27.36.0.0/14 +27.40.0.0/13 +27.50.128.0/17 +27.54.192.0/18 +27.98.224.0/19 +27.106.128.0/18 +27.106.204.0/22 +27.109.124.0/22 +27.112.0.0/21 +27.112.80.0/23 +27.112.82.0/24 +27.112.84.0/22 +27.115.0.0/17 +27.128.0.0/15 +27.144.0.0/16 +27.148.0.0/14 +27.152.0.0/13 +27.184.0.0/13 +27.192.0.0/11 +27.224.0.0/14 +36.1.0.0/16 +36.4.0.0/14 +36.16.0.0/12 +36.32.0.0/14 +36.36.0.0/16 +36.40.0.0/13 +36.48.0.0/15 +36.51.248.0/24 +36.51.252.0/23 +36.51.254.0/24 +36.56.0.0/13 +36.96.0.0/12 +36.112.0.0/16 +36.113.0.0/17 +36.113.128.0/18 +36.113.192.0/19 +36.113.224.0/20 +36.113.240.0/21 +36.113.248.0/23 +36.113.251.0/24 +36.113.252.0/23 +36.113.254.0/24 +36.114.0.0/16 +36.128.0.0/10 +36.192.0.0/11 +36.248.0.0/14 +36.255.164.0/24 +38.64.76.0/22 +38.64.92.0/24 +38.84.76.0/22 +38.126.117.0/24 +39.64.0.0/11 +39.96.0.0/13 +39.104.0.0/14 +39.108.0.0/16 +39.128.0.0/10 +40.72.0.0/15 +40.125.128.0/17 +40.126.64.0/18 +42.4.0.0/14 +42.48.0.0/15 +42.51.0.0/16 +42.52.0.0/14 +42.56.0.0/14 +42.62.0.0/17 +42.63.0.0/16 +42.80.0.0/15 +42.83.128.0/22 +42.83.132.0/23 +42.83.134.0/24 +42.83.136.0/23 +42.83.144.0/22 +42.83.176.0/21 +42.83.184.0/22 +42.83.188.0/23 +42.83.190.0/24 +42.83.200.0/23 +42.83.255.0/24 +42.84.0.0/14 +42.88.0.0/13 +42.96.128.0/17 +42.97.0.0/16 +42.99.0.0/18 +42.100.0.0/14 +42.120.0.0/15 +42.122.0.0/16 +42.123.64.0/18 +42.156.128.0/17 +42.157.0.0/21 +42.157.8.0/22 +42.157.12.0/23 +42.157.128.0/21 +42.157.160.0/19 +42.157.192.0/21 +42.158.0.0/15 +42.176.0.0/13 +42.184.0.0/15 +42.186.0.0/16 +42.187.120.0/22 +42.187.128.0/17 +42.192.0.0/15 +42.194.12.0/24 +42.194.128.0/17 +42.201.32.0/19 +42.201.64.0/22 +42.201.68.0/24 +42.202.0.0/15 +42.204.1.0/24 +42.224.0.0/12 +42.240.128.0/17 +42.242.0.0/15 +42.244.0.0/14 +42.248.0.0/15 +43.16.0.0/12 +43.128.0.0/14 +43.132.0.0/21 +43.132.68.0/24 +43.132.96.0/19 +43.132.128.0/17 +43.133.0.0/17 +43.133.128.0/19 +43.224.12.0/22 +43.224.24.0/22 +43.224.52.0/23 +43.224.56.0/22 +43.224.72.0/22 +43.224.80.0/22 +43.224.149.0/24 +43.224.150.0/23 +43.224.160.0/24 +43.224.162.0/23 +43.224.208.0/22 +43.225.84.0/23 +43.225.87.0/24 +43.225.120.0/22 +43.225.180.0/22 +43.225.209.0/24 +43.225.216.0/22 +43.226.32.0/20 +43.226.49.0/24 +43.226.50.0/23 +43.226.53.0/24 +43.226.54.0/24 +43.226.64.0/21 +43.226.72.0/22 +43.226.76.0/23 +43.226.116.0/22 +43.226.120.0/22 +43.226.144.0/20 +43.226.160.0/21 +43.226.236.0/22 +43.227.64.0/22 +43.227.68.0/24 +43.227.104.0/22 +43.227.140.0/22 +43.227.152.0/21 +43.227.160.0/20 +43.227.176.0/21 +43.227.192.0/19 +43.227.252.0/22 +43.228.0.0/19 +43.228.36.0/22 +43.228.40.0/21 +43.228.48.0/20 +43.228.64.0/21 +43.228.76.0/22 +43.228.116.0/22 +43.229.48.0/22 +43.229.154.0/23 +43.229.185.0/24 +43.229.186.0/23 +43.229.216.0/22 +43.230.10.0/23 +43.230.72.0/22 +43.230.136.0/22 +43.230.181.0/24 +43.230.182.0/24 +43.230.188.0/23 +43.230.190.0/24 +43.230.220.0/22 +43.230.224.0/23 +43.231.32.0/20 +43.231.80.0/20 +43.231.96.0/20 +43.231.144.0/20 +43.231.160.0/21 +43.231.168.0/22 +43.231.172.0/23 +43.231.174.0/24 +43.231.185.0/24 +43.239.120.0/22 +43.240.0.0/22 +43.240.56.0/22 +43.240.72.0/22 +43.240.124.0/22 +43.240.128.0/22 +43.240.136.0/22 +43.240.144.0/22 +43.240.156.0/22 +43.240.192.0/21 +43.240.200.0/23 +43.240.204.0/22 +43.240.216.0/22 +43.240.244.0/22 +43.240.248.0/21 +43.241.0.0/21 +43.241.8.0/22 +43.241.16.0/22 +43.241.48.0/22 +43.241.76.0/22 +43.241.88.0/21 +43.241.180.0/22 +43.241.208.0/20 +43.241.224.0/20 +43.242.64.0/22 +43.242.72.0/22 +43.242.84.0/22 +43.242.152.0/21 +43.242.164.0/22 +43.242.180.0/22 +43.242.192.0/21 +43.242.252.0/22 +43.243.4.0/22 +43.243.12.0/22 +43.243.16.0/22 +43.243.24.0/22 +43.243.88.0/22 +43.243.128.0/22 +43.243.136.0/22 +43.243.148.0/22 +43.243.156.0/22 +43.243.228.0/22 +43.243.232.0/22 +43.243.244.0/22 +43.246.228.0/23 +43.247.4.0/24 +43.247.8.0/22 +43.247.76.0/22 +43.247.88.0/22 +43.247.96.0/21 +43.247.176.0/20 +43.247.196.0/22 +43.247.240.0/22 +43.248.20.0/22 +43.248.48.0/22 +43.248.76.0/22 +43.248.96.0/21 +43.248.112.0/21 +43.248.128.0/20 +43.248.184.0/21 +43.248.192.0/20 +43.248.244.0/22 +43.249.80.0/22 +43.249.136.0/22 +43.249.144.0/22 +43.249.192.0/22 +43.249.236.0/22 +43.250.4.0/22 +43.250.32.0/22 +43.250.112.0/22 +43.250.144.0/22 +43.250.168.0/22 +43.250.200.0/22 +43.250.236.0/22 +43.250.244.0/22 +43.251.36.0/22 +43.251.100.0/22 +43.251.244.0/22 +43.252.48.0/24 +43.252.208.0/22 +43.254.0.0/22 +43.254.8.0/22 +43.254.24.0/22 +43.254.44.0/22 +43.254.52.0/22 +43.254.64.0/22 +43.254.88.0/22 +43.254.100.0/22 +43.254.104.0/23 +43.254.106.0/24 +43.254.116.0/22 +43.254.128.0/22 +43.254.136.0/22 +43.254.144.0/20 +43.254.168.0/22 +43.254.192.0/22 +43.254.200.0/22 +43.254.220.0/22 +43.254.224.0/20 +43.254.240.0/22 +43.254.248.0/22 +43.255.0.0/21 +43.255.37.0/24 +43.255.38.0/23 +43.255.68.0/22 +43.255.84.0/22 +43.255.96.0/22 +43.255.116.0/22 +43.255.168.0/23 +43.255.170.0/24 +43.255.192.0/22 +43.255.212.0/22 +43.255.224.0/21 +44.159.64.0/24 +44.159.66.0/23 +45.9.11.0/24 +45.10.1.0/24 +45.40.192.0/18 +45.65.20.0/22 +45.65.24.0/21 +45.67.138.0/24 +45.113.20.0/22 +45.113.24.0/21 +45.113.40.0/22 +45.113.68.0/22 +45.113.192.0/22 +45.113.200.0/22 +45.113.240.0/23 +45.113.252.0/22 +45.114.40.0/22 +45.114.102.0/23 +45.114.124.0/22 +45.115.44.0/22 +45.115.144.0/22 +45.115.164.0/22 +45.115.200.0/22 +45.115.244.0/22 +45.116.32.0/22 +45.116.52.0/22 +45.116.100.0/22 +45.116.140.0/22 +45.116.152.0/22 +45.116.208.0/22 +45.117.8.0/22 +45.119.60.0/22 +45.119.64.0/21 +45.119.104.0/22 +45.119.116.0/22 +45.120.100.0/22 +45.120.164.0/22 +45.120.241.0/24 +45.120.243.0/24 +45.121.52.0/24 +45.121.55.0/24 +45.121.212.0/22 +45.122.0.0/22 +45.123.193.0/24 +45.123.194.0/24 +45.124.20.0/22 +45.124.68.0/22 +45.124.80.0/22 +45.124.124.0/22 +45.125.44.0/22 +45.125.56.0/22 +45.126.112.0/22 +45.126.120.0/22 +45.127.128.0/22 +45.127.144.0/21 +45.130.152.0/22 +45.135.49.0/24 +45.142.124.0/22 +45.147.6.0/24 +45.154.196.0/22 +45.158.33.0/24 +45.192.178.0/23 +45.195.1.0/24 +45.195.4.0/22 +45.195.162.0/24 +45.200.0.0/22 +45.200.4.0/23 +45.200.6.0/24 +45.200.110.0/24 +45.200.122.0/23 +45.200.124.0/22 +45.202.8.0/23 +45.207.22.0/23 +45.207.145.0/24 +45.207.158.0/24 +45.248.8.0/22 +45.248.132.0/22 +45.248.204.0/22 +45.248.236.0/22 +45.249.88.0/24 +45.249.212.0/22 +45.250.28.0/22 +45.250.32.0/21 +45.250.40.0/22 +45.251.8.0/22 +45.251.20.0/22 +45.251.52.0/22 +45.251.88.0/21 +45.251.96.0/21 +45.252.0.0/22 +45.252.104.0/22 +45.253.24.0/22 +45.253.64.0/22 +45.253.96.0/20 +45.253.112.0/21 +45.253.132.0/22 +45.253.136.0/21 +45.253.144.0/20 +45.253.160.0/19 +45.253.192.0/19 +45.253.224.0/20 +45.253.240.0/22 +45.254.20.0/22 +45.254.48.0/23 +45.254.64.0/20 +46.8.176.0/24 +46.8.194.0/24 +46.8.197.0/24 +47.89.64.0/24 +47.89.66.0/24 +47.89.91.0/24 +47.89.119.0/24 +47.89.121.0/24 +47.92.0.0/14 +47.96.0.0/12 +47.112.0.0/13 +47.120.0.0/15 +47.122.0.0/19 +47.241.82.0/23 +47.246.0.0/22 +47.246.4.0/24 +47.246.6.0/23 +47.246.8.0/24 +47.246.10.0/23 +47.246.12.0/22 +47.246.16.0/22 +47.246.20.0/24 +47.246.22.0/23 +47.246.24.0/23 +47.246.26.0/24 +47.246.28.0/22 +47.246.36.0/22 +47.246.41.0/24 +47.246.42.0/23 +47.246.44.0/23 +47.246.46.0/24 +47.246.48.0/23 +47.246.50.0/24 +47.246.52.0/23 +47.246.57.0/24 +47.246.58.0/23 +47.246.60.0/22 +49.4.0.0/18 +49.4.64.0/19 +49.4.96.0/21 +49.4.104.0/22 +49.4.108.0/23 +49.4.110.0/24 +49.4.112.0/20 +49.4.128.0/18 +49.5.0.0/20 +49.7.0.0/16 +49.51.0.0/19 +49.51.32.0/20 +49.51.48.0/21 +49.51.62.0/23 +49.51.64.0/19 +49.51.96.0/21 +49.51.104.0/22 +49.51.108.0/23 +49.51.128.0/18 +49.51.192.0/20 +49.51.224.0/23 +49.51.228.0/22 +49.51.232.0/21 +49.51.240.0/20 +49.52.0.0/14 +49.64.0.0/11 +49.112.0.0/13 +49.120.0.0/14 +49.140.0.0/15 +49.208.0.0/14 +49.221.26.0/23 +49.221.64.0/19 +49.221.128.0/19 +49.232.0.0/14 +49.239.192.0/18 +52.80.0.0/15 +52.82.0.0/17 +52.82.128.0/24 +52.82.136.0/24 +52.82.153.0/24 +52.82.154.0/23 +52.82.156.0/24 +52.82.160.0/21 +52.82.168.0/24 +52.82.172.0/22 +52.82.176.0/21 +52.82.187.0/24 +52.82.188.0/23 +52.82.190.0/24 +52.82.192.0/18 +52.83.0.0/16 +52.130.0.0/15 +54.222.0.0/19 +54.222.32.0/21 +54.222.45.0/24 +54.222.48.0/23 +54.222.50.0/24 +54.222.52.0/22 +54.222.57.0/24 +54.222.59.0/24 +54.222.60.0/22 +54.222.71.0/24 +54.222.72.0/21 +54.222.128.0/17 +54.223.0.0/16 +58.16.0.0/13 +58.24.0.0/15 +58.30.0.0/15 +58.32.0.0/11 +58.66.0.0/15 +58.68.230.0/23 +58.68.234.0/23 +58.68.236.0/22 +58.68.240.0/23 +58.68.244.0/22 +58.68.254.0/23 +58.82.0.0/17 +58.83.0.0/16 +58.84.5.0/24 +58.87.64.0/18 +58.99.128.0/17 +58.100.0.0/15 +58.116.0.0/14 +58.128.0.0/13 +58.144.0.0/16 +58.154.0.0/15 +58.192.0.0/11 +58.240.0.0/12 +59.32.0.0/13 +59.40.0.0/15 +59.42.0.0/16 +59.44.0.0/14 +59.48.0.0/12 +59.64.0.0/12 +59.80.0.0/16 +59.81.8.0/23 +59.81.12.0/23 +59.81.16.0/23 +59.81.20.0/23 +59.81.24.0/23 +59.81.36.0/23 +59.81.40.0/23 +59.81.46.0/24 +59.81.64.0/23 +59.81.68.0/23 +59.81.72.0/23 +59.81.76.0/22 +59.81.80.0/22 +59.81.86.0/23 +59.81.88.0/23 +59.81.92.0/22 +59.81.98.0/23 +59.81.100.0/22 +59.81.104.0/22 +59.82.0.0/18 +59.82.64.0/19 +59.82.96.0/22 +59.83.192.0/19 +59.83.224.0/21 +59.83.232.0/22 +59.107.0.0/17 +59.108.0.0/14 +59.151.0.0/17 +59.152.32.0/22 +59.152.36.0/24 +59.152.38.0/23 +59.153.4.0/22 +59.153.32.0/22 +59.153.73.0/24 +59.153.74.0/24 +59.153.92.0/22 +59.153.116.0/22 +59.153.168.0/23 +59.172.0.0/14 +59.191.0.0/17 +59.252.0.0/16 +60.0.0.0/11 +60.55.0.0/16 +60.63.0.0/16 +60.160.0.0/11 +60.194.0.0/15 +60.205.0.0/16 +60.206.0.0/15 +60.208.0.0/12 +60.232.128.0/17 +60.235.0.0/16 +60.245.128.0/17 +60.247.0.0/16 +60.252.0.0/16 +60.253.128.0/17 +60.255.0.0/16 +61.4.82.0/23 +61.4.176.0/20 +61.28.0.0/17 +61.29.128.0/18 +61.29.243.0/24 +61.45.131.0/24 +61.47.128.0/18 +61.48.0.0/13 +61.87.192.0/18 +61.128.0.0/10 +61.232.0.0/14 +61.236.0.0/15 +61.240.0.0/17 +61.240.128.0/18 +61.240.192.0/19 +61.240.224.0/20 +61.240.240.0/21 +61.241.0.0/17 +61.241.128.0/18 +61.241.192.0/19 +61.242.0.0/16 +61.243.0.0/18 +61.243.96.0/20 +61.243.112.0/21 +61.243.124.0/22 +61.243.128.0/18 +61.243.192.0/19 +62.234.0.0/16 +63.140.0.0/24 +63.140.3.0/24 +63.140.4.0/22 +63.140.8.0/23 +63.140.13.0/24 +63.140.14.0/24 +63.217.81.0/24 +63.217.87.0/24 +63.243.252.0/24 +66.102.240.0/21 +66.102.248.0/22 +66.102.252.0/24 +66.102.254.0/23 +68.79.0.0/18 +69.163.102.0/23 +69.163.104.0/24 +69.163.106.0/23 +69.163.108.0/24 +69.194.171.0/24 +69.230.192.0/18 +69.231.128.0/18 +69.234.192.0/18 +69.235.128.0/18 +71.131.192.0/18 +71.132.0.0/18 +77.83.242.0/24 +78.138.12.0/22 +79.133.176.0/23 +81.68.0.0/14 +81.173.16.0/21 +82.156.0.0/15 +85.208.155.0/24 +85.237.205.0/24 +87.254.207.0/24 +93.183.14.0/24 +93.183.18.0/24 +94.140.12.0/23 +94.191.0.0/17 +94.199.102.0/24 +101.1.0.0/22 +101.2.172.0/22 +101.4.0.0/14 +101.16.0.0/12 +101.32.0.0/16 +101.33.0.0/21 +101.33.8.0/22 +101.33.14.0/23 +101.33.17.0/24 +101.33.18.0/23 +101.33.26.0/23 +101.33.30.0/23 +101.33.32.0/19 +101.33.64.0/18 +101.33.128.0/17 +101.34.0.0/15 +101.36.0.0/18 +101.36.64.0/20 +101.36.128.0/17 +101.37.0.0/16 +101.38.0.0/15 +101.40.0.0/14 +101.49.128.0/21 +101.49.136.0/22 +101.50.56.0/22 +101.52.0.0/16 +101.53.100.0/22 +101.54.0.0/21 +101.64.0.0/13 +101.72.0.0/14 +101.76.0.0/15 +101.78.0.0/22 +101.80.0.0/12 +101.96.10.0/23 +101.96.128.0/20 +101.104.144.0/20 +101.104.160.0/20 +101.106.0.0/19 +101.124.0.0/16 +101.125.0.0/22 +101.125.4.0/23 +101.125.6.0/24 +101.125.130.0/24 +101.125.250.0/23 +101.125.252.0/22 +101.128.0.0/22 +101.129.0.0/16 +101.132.0.0/15 +101.144.0.0/12 +101.197.0.0/16 +101.198.0.0/17 +101.198.128.0/18 +101.198.192.0/19 +101.199.32.0/19 +101.199.96.0/21 +101.199.112.0/23 +101.199.114.0/24 +101.199.125.0/24 +101.199.128.0/23 +101.199.196.0/22 +101.199.254.0/23 +101.200.0.0/15 +101.203.172.0/22 +101.204.0.0/14 +101.224.0.0/13 +101.234.76.0/22 +101.236.0.0/16 +101.237.0.0/19 +101.240.0.0/14 +101.246.172.0/22 +101.246.176.0/20 +101.247.50.0/23 +101.248.0.0/15 +101.251.0.0/22 +101.251.80.0/20 +101.251.128.0/19 +101.251.160.0/21 +101.251.192.0/18 +101.252.0.0/15 +101.254.0.0/16 +103.1.8.0/23 +103.1.168.0/22 +103.2.108.0/22 +103.2.204.0/22 +103.2.208.0/22 +103.3.96.0/22 +103.3.112.0/22 +103.3.120.0/21 +103.3.128.0/22 +103.3.136.0/21 +103.3.152.0/21 +103.4.56.0/22 +103.5.52.0/24 +103.5.54.0/23 +103.5.168.0/22 +103.5.192.0/22 +103.6.220.0/22 +103.7.28.0/22 +103.7.212.0/22 +103.8.8.0/22 +103.8.32.0/24 +103.8.34.0/23 +103.8.52.0/22 +103.8.204.0/22 +103.8.220.0/22 +103.9.8.0/22 +103.9.248.0/21 +103.10.0.0/22 +103.10.84.0/22 +103.12.184.0/22 +103.12.232.0/22 +103.13.12.0/23 +103.13.244.0/22 +103.14.78.0/24 +103.14.132.0/23 +103.14.136.0/22 +103.15.4.0/22 +103.15.96.0/22 +103.16.124.0/22 +103.17.40.0/22 +103.17.116.0/22 +103.18.208.0/22 +103.18.224.0/22 +103.19.46.0/23 +103.19.64.0/22 +103.19.232.0/22 +103.20.32.0/22 +103.20.112.0/22 +103.20.128.0/22 +103.20.192.0/22 +103.20.248.0/22 +103.21.116.0/22 +103.21.140.0/22 +103.21.176.0/22 +103.22.188.0/22 +103.22.228.0/22 +103.22.252.0/22 +103.23.8.0/22 +103.23.160.0/22 +103.24.92.0/22 +103.24.116.0/22 +103.24.176.0/22 +103.24.228.0/22 +103.25.20.0/22 +103.25.24.0/22 +103.25.36.0/22 +103.25.64.0/23 +103.25.148.0/23 +103.25.156.0/24 +103.26.0.0/22 +103.26.64.0/22 +103.26.76.0/22 +103.27.4.0/22 +103.27.24.0/22 +103.27.78.0/23 +103.27.176.0/22 +103.27.208.0/22 +103.27.240.0/22 +103.28.8.0/22 +103.28.204.0/22 +103.28.212.0/22 +103.29.16.0/22 +103.29.136.0/22 +103.30.4.0/22 +103.30.148.0/22 +103.31.48.0/21 +103.31.72.0/24 +103.31.200.0/22 +103.31.236.0/22 +103.35.105.0/24 +103.35.220.0/23 +103.36.28.0/22 +103.36.96.0/22 +103.36.132.0/22 +103.36.136.0/22 +103.36.168.0/23 +103.36.172.0/22 +103.36.192.0/20 +103.36.208.0/22 +103.36.221.0/24 +103.36.224.0/20 +103.36.240.0/21 +103.37.12.0/22 +103.37.44.0/22 +103.37.72.0/22 +103.37.100.0/22 +103.37.136.0/21 +103.37.144.0/20 +103.37.160.0/21 +103.38.40.0/22 +103.38.76.0/22 +103.38.116.0/22 +103.38.224.0/22 +103.38.232.0/22 +103.38.252.0/23 +103.39.88.0/22 +103.39.104.0/22 +103.39.204.0/22 +103.39.208.0/20 +103.39.224.0/21 +103.39.232.0/22 +103.40.12.0/22 +103.40.162.0/24 +103.40.192.0/22 +103.40.232.0/22 +103.40.240.0/20 +103.41.16.0/22 +103.41.164.0/22 +103.42.8.0/22 +103.42.76.0/22 +103.43.100.0/22 +103.43.172.0/22 +103.43.184.0/22 +103.44.56.0/22 +103.44.80.0/22 +103.44.144.0/22 +103.44.168.0/22 +103.44.176.0/22 +103.44.236.0/22 +103.44.240.0/20 +103.45.1.0/24 +103.45.2.0/23 +103.45.4.0/22 +103.45.8.0/21 +103.45.16.0/20 +103.45.32.0/19 +103.45.72.0/21 +103.45.97.0/24 +103.45.98.0/23 +103.45.100.0/22 +103.45.104.0/21 +103.45.112.0/20 +103.45.128.0/21 +103.45.138.0/23 +103.45.140.0/22 +103.45.144.0/20 +103.45.160.0/22 +103.45.172.0/22 +103.45.176.0/20 +103.45.248.0/22 +103.46.12.0/22 +103.46.16.0/20 +103.46.32.0/19 +103.46.64.0/18 +103.46.128.0/21 +103.46.136.0/22 +103.47.48.0/22 +103.47.80.0/22 +103.47.123.0/24 +103.48.168.0/22 +103.48.232.0/23 +103.49.12.0/22 +103.49.60.0/23 +103.49.62.0/24 +103.49.108.0/22 +103.49.180.0/22 +103.49.196.0/23 +103.49.198.0/24 +103.50.0.0/22 +103.50.8.0/24 +103.50.10.0/24 +103.50.36.0/22 +103.50.255.0/24 +103.52.172.0/22 +103.52.176.0/22 +103.52.196.0/22 +103.52.216.0/22 +103.53.124.0/22 +103.53.204.0/22 +103.53.208.0/22 +103.54.48.0/22 +103.54.52.0/23 +103.54.54.0/24 +103.55.152.0/22 +103.55.172.0/22 +103.55.228.0/22 +103.56.20.0/22 +103.56.32.0/22 +103.56.60.0/22 +103.56.76.0/22 +103.56.152.0/22 +103.56.184.0/22 +103.57.12.0/22 +103.59.112.0/21 +103.59.121.0/24 +103.59.122.0/24 +103.59.124.0/22 +103.59.148.0/22 +103.60.164.0/22 +103.60.228.0/23 +103.61.60.0/22 +103.61.104.0/23 +103.61.143.0/24 +103.61.153.0/24 +103.61.154.0/23 +103.62.52.0/22 +103.62.88.0/22 +103.64.24.0/21 +103.64.140.0/22 +103.64.144.0/22 +103.64.152.0/21 +103.64.208.0/21 +103.65.8.0/22 +103.66.32.0/22 +103.68.128.0/22 +103.69.16.0/22 +103.69.116.0/22 +103.70.220.0/22 +103.71.68.0/22 +103.71.120.0/21 +103.71.128.0/22 +103.71.196.0/22 +103.71.200.0/22 +103.71.232.0/22 +103.72.12.0/22 +103.72.16.0/20 +103.72.32.0/20 +103.72.48.0/21 +103.72.112.0/23 +103.72.123.0/24 +103.72.128.0/21 +103.72.172.0/24 +103.73.48.0/22 +103.73.116.0/22 +103.73.136.0/21 +103.73.204.0/22 +103.73.254.0/23 +103.74.24.0/21 +103.74.32.0/20 +103.74.48.0/22 +103.75.104.0/22 +103.75.152.0/22 +103.76.60.0/22 +103.76.92.0/22 +103.76.220.0/22 +103.76.224.0/22 +103.77.28.0/22 +103.77.72.0/22 +103.77.92.0/22 +103.77.132.0/22 +103.78.64.0/22 +103.78.126.0/23 +103.78.228.0/22 +103.79.24.0/22 +103.79.200.0/22 +103.81.4.0/22 +103.81.48.0/22 +103.81.123.0/24 +103.81.148.0/22 +103.81.168.0/22 +103.81.184.0/22 +103.81.200.0/22 +103.82.52.0/22 +103.82.224.0/22 +103.83.44.0/22 +103.83.72.0/22 +103.83.120.0/22 +103.84.136.0/22 +103.85.84.0/22 +103.85.144.0/22 +103.85.164.0/22 +103.85.168.0/21 +103.85.176.0/22 +103.85.224.0/22 +103.87.180.0/22 +103.88.20.0/22 +103.88.32.0/21 +103.88.64.0/22 +103.89.184.0/21 +103.89.192.0/19 +103.89.224.0/21 +103.90.80.0/22 +103.90.92.0/22 +103.90.100.0/22 +103.90.152.0/22 +103.90.173.0/24 +103.90.176.0/22 +103.90.188.0/22 +103.91.176.0/22 +103.91.208.0/22 +103.91.219.0/24 +103.92.132.0/22 +103.93.76.0/22 +103.93.180.0/22 +103.94.12.0/22 +103.94.20.0/23 +103.94.200.0/22 +103.95.64.0/21 +103.95.207.0/24 +103.95.220.0/23 +103.95.222.0/24 +103.95.252.0/22 +103.96.214.0/23 +103.97.60.0/24 +103.97.62.0/23 +103.97.82.0/24 +103.98.44.0/23 +103.98.125.0/24 +103.98.127.0/24 +103.98.164.0/22 +103.98.168.0/22 +103.98.220.0/22 +103.98.248.0/21 +103.99.40.0/23 +103.99.152.0/22 +103.100.64.0/22 +103.101.124.0/23 +103.101.153.0/24 +103.101.180.0/22 +103.102.4.0/23 +103.102.7.0/24 +103.102.192.0/21 +103.102.200.0/22 +103.103.12.0/24 +103.104.199.0/24 +103.105.12.0/22 +103.105.60.0/22 +103.105.200.0/22 +103.107.8.0/24 +103.107.110.0/24 +103.107.188.0/22 +103.107.192.0/24 +103.107.195.0/24 +103.107.216.0/22 +103.108.160.0/24 +103.108.244.0/24 +103.109.20.0/22 +103.110.92.0/22 +103.110.132.0/22 +103.110.136.0/22 +103.110.156.0/22 +103.111.64.0/24 +103.113.4.0/22 +103.113.92.0/22 +103.114.28.0/22 +103.114.100.0/22 +103.114.156.0/22 +103.114.212.0/22 +103.114.236.0/22 +103.115.120.0/22 +103.115.248.0/22 +103.116.72.0/24 +103.116.74.0/23 +103.116.76.0/22 +103.116.92.0/24 +103.116.120.0/22 +103.117.16.0/22 +103.117.136.0/22 +103.117.220.0/22 +103.117.248.0/22 +103.118.40.0/22 +103.118.52.0/22 +103.118.60.0/22 +103.119.104.0/22 +103.119.224.0/22 +103.120.72.0/22 +103.120.196.0/22 +103.120.224.0/22 +103.121.52.0/24 +103.121.92.0/22 +103.121.164.0/23 +103.121.166.0/24 +103.121.250.0/24 +103.121.252.0/22 +103.122.48.0/22 +103.122.192.0/24 +103.122.243.0/24 +103.123.88.0/24 +103.123.90.0/23 +103.126.1.0/24 +103.126.2.0/23 +103.126.18.0/23 +103.126.124.0/22 +103.126.241.0/24 +103.129.198.0/24 +103.130.160.0/23 +103.131.152.0/23 +103.131.168.0/22 +103.131.176.0/22 +103.132.188.0/22 +103.132.212.0/23 +103.132.234.0/23 +103.133.176.0/22 +103.134.140.0/23 +103.135.80.0/23 +103.135.100.0/22 +103.135.160.0/23 +103.135.162.0/24 +103.135.236.0/24 +103.137.60.0/24 +103.138.134.0/24 +103.138.156.0/23 +103.138.246.0/24 +103.139.172.0/23 +103.139.212.0/23 +103.140.8.0/24 +103.140.14.0/23 +103.140.152.0/23 +103.140.228.0/23 +103.141.10.0/23 +103.142.96.0/23 +103.142.154.0/23 +103.142.190.0/23 +103.142.220.0/23 +103.142.234.0/23 +103.143.16.0/22 +103.143.228.0/23 +103.144.52.0/23 +103.144.66.0/23 +103.144.70.0/24 +103.144.108.0/24 +103.144.158.0/23 +103.145.38.0/23 +103.145.90.0/23 +103.145.92.0/23 +103.146.164.0/23 +103.146.252.0/23 +103.147.124.0/24 +103.149.6.0/24 +103.149.181.0/24 +103.149.210.0/23 +103.149.242.0/24 +103.150.164.0/23 +103.150.173.0/24 +103.150.181.0/24 +103.150.210.0/23 +103.150.212.0/24 +103.150.225.0/24 +103.151.142.0/23 +103.151.148.0/22 +103.151.216.0/23 +103.152.28.0/23 +103.152.56.0/23 +103.152.76.0/23 +103.152.132.0/23 +103.152.170.0/23 +103.152.186.0/23 +103.153.36.0/23 +103.153.100.0/23 +103.153.138.0/23 +103.154.30.0/23 +103.154.41.0/24 +103.154.162.0/23 +103.155.76.0/23 +103.155.110.0/23 +103.155.120.0/23 +103.156.68.0/23 +103.157.138.0/23 +103.157.254.0/24 +103.159.80.0/24 +103.161.220.0/23 +103.161.254.0/23 +103.162.10.0/23 +103.163.32.0/24 +103.164.226.0/23 +103.166.174.0/23 +103.166.230.0/24 +103.166.246.0/24 +103.192.4.0/23 +103.192.132.0/22 +103.192.188.0/22 +103.192.212.0/22 +103.192.252.0/22 +103.193.188.0/22 +103.193.192.0/22 +103.195.136.0/22 +103.196.22.0/24 +103.196.64.0/22 +103.196.88.0/21 +103.197.228.0/22 +103.198.64.0/22 +103.198.124.0/22 +103.198.180.0/23 +103.202.92.0/22 +103.202.96.0/20 +103.202.112.0/22 +103.202.120.0/21 +103.202.128.0/20 +103.202.144.0/22 +103.203.56.0/22 +103.203.96.0/22 +103.203.140.0/23 +103.203.216.0/22 +103.204.72.0/22 +103.205.4.0/22 +103.205.40.0/24 +103.205.52.0/22 +103.205.120.0/24 +103.205.136.0/24 +103.205.139.0/24 +103.205.192.0/22 +103.205.252.0/22 +103.207.68.0/23 +103.207.184.0/23 +103.207.186.0/24 +103.207.228.0/22 +103.208.12.0/22 +103.208.40.0/21 +103.208.48.0/22 +103.209.232.0/23 +103.209.234.0/24 +103.210.160.0/22 +103.210.169.0/24 +103.210.170.0/23 +103.211.44.0/22 +103.211.96.0/22 +103.211.220.0/22 +103.212.0.0/22 +103.212.12.0/22 +103.212.228.0/22 +103.213.96.0/22 +103.213.132.0/22 +103.214.48.0/22 +103.215.32.0/21 +103.215.44.0/22 +103.215.48.0/22 +103.215.104.0/22 +103.215.140.0/22 +103.216.4.0/22 +103.216.152.0/22 +103.217.168.0/22 +103.217.255.0/24 +103.218.216.0/22 +103.219.24.0/21 +103.219.32.0/21 +103.219.64.0/23 +103.219.176.0/22 +103.219.184.0/22 +103.219.195.0/24 +103.220.52.0/22 +103.220.56.0/21 +103.220.64.0/22 +103.220.124.0/22 +103.220.128.0/19 +103.220.160.0/21 +103.220.240.0/22 +103.221.88.0/22 +103.221.140.0/22 +103.222.32.0/24 +103.222.40.0/22 +103.222.144.0/23 +103.222.176.0/21 +103.222.188.0/22 +103.222.216.0/22 +103.223.132.0/22 +103.224.220.0/22 +103.224.228.0/23 +103.224.232.0/22 +103.225.199.0/24 +103.226.152.0/22 +103.226.180.0/24 +103.227.76.0/22 +103.227.80.0/22 +103.227.120.0/22 +103.227.136.0/22 +103.227.228.0/22 +103.228.12.0/22 +103.228.136.0/22 +103.228.160.0/22 +103.228.204.0/23 +103.228.228.0/22 +103.229.148.0/22 +103.229.212.0/22 +103.229.216.0/21 +103.229.236.0/22 +103.230.200.0/22 +103.230.212.0/22 +103.230.236.0/22 +103.231.16.0/24 +103.231.64.0/21 +103.231.144.0/23 +103.231.146.0/24 +103.232.144.0/22 +103.233.4.0/22 +103.233.52.0/22 +103.233.104.0/22 +103.233.128.0/22 +103.233.136.0/24 +103.233.138.0/24 +103.234.20.0/22 +103.234.53.0/24 +103.234.54.0/24 +103.234.56.0/22 +103.234.96.0/22 +103.234.128.0/22 +103.235.17.0/24 +103.235.44.0/22 +103.235.85.0/24 +103.235.87.0/24 +103.235.136.0/22 +103.235.144.0/24 +103.235.200.0/22 +103.235.220.0/22 +103.235.224.0/19 +103.236.120.0/22 +103.236.220.0/22 +103.236.240.0/20 +103.237.0.0/20 +103.237.100.0/23 +103.237.103.0/24 +103.237.248.0/21 +103.238.0.0/21 +103.238.16.0/22 +103.238.96.0/23 +103.238.98.0/24 +103.238.132.0/22 +103.238.144.0/22 +103.238.160.0/22 +103.238.180.0/22 +103.238.184.0/23 +103.238.188.0/22 +103.238.204.0/22 +103.238.252.0/22 +103.239.28.0/22 +103.239.68.0/22 +103.239.100.0/22 +103.239.152.0/22 +103.239.176.0/22 +103.239.204.0/22 +103.239.224.0/22 +103.239.244.0/22 +103.240.16.0/22 +103.240.36.0/22 +103.240.84.0/22 +103.240.124.0/22 +103.240.244.0/22 +103.241.92.0/22 +103.242.128.0/23 +103.242.130.0/24 +103.242.168.0/23 +103.242.170.0/24 +103.242.172.0/22 +103.242.200.0/22 +103.242.212.0/22 +103.243.136.0/22 +103.243.252.0/22 +103.244.59.0/24 +103.244.64.0/22 +103.244.80.0/22 +103.244.148.0/22 +103.244.164.0/22 +103.244.232.0/22 +103.245.80.0/22 +103.245.128.0/22 +103.246.8.0/22 +103.246.152.0/22 +103.247.168.0/22 +103.247.176.0/22 +103.247.212.0/24 +103.248.102.0/23 +103.248.124.0/22 +103.248.152.0/22 +103.249.12.0/22 +103.249.52.0/22 +103.249.107.0/24 +103.249.136.0/24 +103.249.192.0/22 +103.249.244.0/22 +103.249.252.0/22 +103.250.32.0/22 +103.250.192.0/22 +103.250.216.0/22 +103.250.248.0/22 +103.251.32.0/22 +103.251.84.0/22 +103.251.96.0/22 +103.251.124.0/22 +103.251.160.0/22 +103.251.204.0/22 +103.251.240.0/22 +103.252.36.0/22 +103.252.172.0/22 +103.252.204.0/22 +103.252.208.0/22 +103.252.232.0/22 +103.252.248.0/22 +103.253.60.0/22 +103.253.204.0/22 +103.253.224.0/22 +103.253.232.0/22 +103.254.67.0/24 +103.254.68.0/22 +103.254.76.0/22 +103.254.112.0/22 +103.254.188.0/22 +103.254.196.0/24 +103.254.220.0/22 +103.255.68.0/22 +103.255.88.0/21 +103.255.140.0/22 +103.255.200.0/22 +104.192.108.0/23 +104.192.110.0/24 +104.193.88.0/23 +104.193.90.0/24 +104.251.226.0/24 +104.251.229.0/24 +104.251.231.0/24 +106.0.4.0/22 +106.2.16.0/20 +106.2.32.0/19 +106.2.64.0/18 +106.2.128.0/17 +106.3.16.0/20 +106.3.32.0/20 +106.3.61.0/24 +106.3.64.0/24 +106.3.96.0/22 +106.3.128.0/19 +106.3.192.0/20 +106.3.208.0/21 +106.3.224.0/20 +106.3.240.0/21 +106.4.0.0/14 +106.8.0.0/15 +106.11.0.0/16 +106.12.0.0/17 +106.12.128.0/18 +106.12.192.0/19 +106.12.224.0/20 +106.12.240.0/21 +106.12.250.0/23 +106.12.252.0/23 +106.12.254.0/24 +106.13.0.0/16 +106.14.0.0/15 +106.16.0.0/14 +106.32.0.0/12 +106.48.0.0/21 +106.48.16.0/21 +106.48.49.0/24 +106.48.52.0/23 +106.50.0.0/16 +106.52.0.0/14 +106.56.0.0/14 +106.60.0.0/15 +106.62.0.0/16 +106.74.0.0/16 +106.75.0.0/17 +106.75.128.0/18 +106.75.208.0/20 +106.75.224.0/19 +106.80.0.0/13 +106.88.0.0/14 +106.92.0.0/16 +106.108.0.0/14 +106.112.0.0/12 +106.193.255.0/24 +106.224.0.0/14 +106.228.0.0/15 +106.230.0.0/16 +109.244.0.0/16 +110.6.0.0/15 +110.16.0.0/14 +110.40.0.0/21 +110.40.8.0/23 +110.40.10.0/24 +110.40.12.0/22 +110.40.16.0/22 +110.40.128.0/17 +110.42.0.0/15 +110.44.12.0/22 +110.51.0.0/16 +110.52.0.0/15 +110.56.0.0/13 +110.64.0.0/15 +110.72.0.0/15 +110.75.0.0/16 +110.76.0.0/18 +110.76.156.0/22 +110.76.184.0/22 +110.76.192.0/18 +110.77.0.0/17 +110.80.0.0/13 +110.88.0.0/14 +110.96.0.0/11 +110.152.0.0/14 +110.156.0.0/15 +110.164.37.0/24 +110.165.32.0/24 +110.165.35.0/24 +110.165.36.0/23 +110.165.41.0/24 +110.165.44.0/24 +110.165.48.0/23 +110.165.54.0/24 +110.165.59.0/24 +110.165.60.0/24 +110.166.0.0/15 +110.172.192.0/20 +110.172.211.0/24 +110.172.213.0/24 +110.172.214.0/23 +110.172.217.0/24 +110.172.221.0/24 +110.173.32.0/20 +110.173.192.0/19 +110.176.0.0/12 +110.192.0.0/11 +110.228.0.0/14 +110.232.32.0/19 +110.236.0.0/15 +110.240.0.0/12 +111.0.0.0/10 +111.67.192.0/20 +111.72.0.0/13 +111.85.0.0/16 +111.112.0.0/14 +111.116.0.0/15 +111.118.200.0/21 +111.119.144.0/21 +111.120.0.0/14 +111.124.0.0/16 +111.126.0.0/15 +111.128.0.0/11 +111.160.0.0/13 +111.170.0.0/16 +111.172.0.0/14 +111.176.0.0/13 +111.186.0.0/15 +111.192.0.0/12 +111.212.0.0/14 +111.221.28.0/24 +111.221.128.0/17 +111.222.0.0/16 +111.223.12.0/22 +111.223.240.0/22 +111.224.0.0/14 +111.229.0.0/16 +111.230.0.0/15 +111.235.156.0/22 +111.235.160.0/22 +111.235.164.0/23 +111.235.168.0/22 +111.235.172.0/23 +111.235.174.0/24 +111.235.178.0/24 +111.235.180.0/23 +111.235.182.0/24 +112.0.0.0/10 +112.64.0.0/14 +112.73.64.0/18 +112.74.0.0/16 +112.80.0.0/12 +112.96.0.0/13 +112.109.128.0/17 +112.111.0.0/16 +112.112.0.0/14 +112.116.0.0/15 +112.122.0.0/15 +112.124.0.0/14 +112.128.0.0/14 +112.132.0.0/16 +112.192.0.0/14 +112.224.0.0/11 +113.0.0.0/13 +113.8.0.0/15 +113.12.0.0/14 +113.16.0.0/15 +113.18.0.0/16 +113.21.232.0/22 +113.21.236.0/23 +113.24.0.0/14 +113.31.16.0/20 +113.31.32.0/20 +113.31.80.0/21 +113.31.88.0/22 +113.31.92.0/23 +113.31.96.0/19 +113.31.128.0/21 +113.31.136.0/22 +113.31.144.0/20 +113.31.160.0/19 +113.31.192.0/18 +113.46.0.0/15 +113.50.0.0/20 +113.50.32.0/24 +113.50.48.0/20 +113.50.64.0/21 +113.54.0.0/15 +113.56.0.0/15 +113.58.0.0/16 +113.59.0.0/17 +113.59.224.0/22 +113.62.0.0/15 +113.64.0.0/10 +113.128.0.0/15 +113.130.96.0/20 +113.130.112.0/21 +113.132.0.0/14 +113.136.0.0/13 +113.194.0.0/15 +113.197.101.0/24 +113.197.103.0/24 +113.197.104.0/23 +113.200.0.0/15 +113.204.0.0/14 +113.208.96.0/20 +113.208.112.0/21 +113.208.128.0/22 +113.208.136.0/21 +113.209.0.0/16 +113.212.0.0/18 +113.213.0.0/18 +113.213.64.0/19 +113.213.96.0/20 +113.214.0.0/15 +113.218.0.0/15 +113.220.0.0/14 +113.224.0.0/12 +113.240.0.0/13 +113.248.0.0/14 +114.28.68.0/22 +114.28.72.0/21 +114.28.128.0/18 +114.28.192.0/23 +114.28.224.0/22 +114.28.228.0/23 +114.28.236.0/22 +114.28.248.0/21 +114.55.0.0/16 +114.60.0.0/14 +114.64.0.0/15 +114.66.0.0/18 +114.66.64.0/23 +114.66.80.0/23 +114.66.236.0/22 +114.66.240.0/20 +114.67.0.0/16 +114.80.0.0/12 +114.96.0.0/13 +114.104.0.0/14 +114.110.96.0/22 +114.111.0.0/23 +114.111.16.0/20 +114.112.23.0/24 +114.112.32.0/19 +114.112.64.0/19 +114.112.96.0/21 +114.112.104.0/22 +114.112.124.0/22 +114.112.128.0/24 +114.112.132.0/22 +114.112.136.0/21 +114.112.144.0/20 +114.112.160.0/20 +114.112.180.0/24 +114.112.192.0/21 +114.112.234.0/23 +114.113.16.0/20 +114.113.32.0/19 +114.113.64.0/18 +114.113.144.0/20 +114.113.160.0/19 +114.113.196.0/22 +114.113.200.0/22 +114.113.216.0/21 +114.113.224.0/20 +114.113.247.0/24 +114.113.248.0/23 +114.113.250.0/24 +114.114.112.0/21 +114.115.0.0/16 +114.116.0.0/15 +114.118.0.0/17 +114.119.0.0/17 +114.119.204.0/22 +114.132.0.0/16 +114.135.0.0/16 +114.138.0.0/15 +114.141.128.0/18 +114.196.0.0/15 +114.212.0.0/14 +114.216.0.0/13 +114.224.0.0/11 +115.24.0.0/14 +115.28.0.0/15 +115.31.64.0/22 +115.33.0.0/16 +115.44.0.0/14 +115.48.0.0/12 +115.84.0.0/18 +115.85.192.0/18 +115.106.0.0/15 +115.120.0.0/16 +115.124.16.0/20 +115.148.0.0/14 +115.152.0.0/13 +115.168.0.0/14 +115.173.0.0/19 +115.174.0.0/18 +115.174.64.0/19 +115.182.0.0/15 +115.192.0.0/11 +115.224.0.0/12 +116.0.81.0/24 +116.0.89.0/24 +116.1.0.0/16 +116.2.0.0/15 +116.4.0.0/14 +116.8.0.0/14 +116.13.0.0/16 +116.16.0.0/12 +116.52.0.0/14 +116.56.0.0/15 +116.58.208.0/20 +116.62.0.0/15 +116.66.32.0/24 +116.66.34.0/24 +116.66.36.0/22 +116.66.48.0/21 +116.66.97.0/24 +116.66.98.0/23 +116.66.120.0/22 +116.69.0.0/16 +116.70.0.0/17 +116.76.0.0/15 +116.78.0.0/16 +116.85.0.0/16 +116.90.80.0/20 +116.95.0.0/16 +116.112.0.0/14 +116.116.0.0/15 +116.128.0.0/17 +116.128.128.0/18 +116.128.200.0/21 +116.128.208.0/20 +116.128.224.0/19 +116.129.0.0/16 +116.130.0.0/15 +116.132.0.0/15 +116.135.0.0/16 +116.136.0.0/14 +116.140.0.0/17 +116.140.128.0/18 +116.141.0.0/16 +116.147.0.0/16 +116.148.0.0/15 +116.153.0.0/16 +116.154.0.0/15 +116.162.0.0/16 +116.163.0.0/18 +116.167.0.0/16 +116.168.0.0/15 +116.171.0.0/16 +116.172.64.0/18 +116.172.128.0/17 +116.174.0.0/15 +116.176.0.0/14 +116.181.0.0/16 +116.182.0.0/16 +116.192.0.0/16 +116.193.16.0/23 +116.193.18.0/24 +116.193.32.0/19 +116.196.16.0/20 +116.196.32.0/19 +116.196.64.0/18 +116.196.176.0/21 +116.198.0.0/18 +116.198.144.0/20 +116.198.160.0/20 +116.198.176.0/21 +116.198.192.0/18 +116.199.0.0/17 +116.204.132.0/22 +116.205.125.0/24 +116.205.126.0/24 +116.205.128.0/17 +116.207.0.0/16 +116.208.0.0/14 +116.213.44.0/22 +116.213.64.0/18 +116.213.128.0/17 +116.214.32.0/19 +116.214.128.0/22 +116.214.132.0/24 +116.216.0.0/16 +116.218.0.0/16 +116.224.0.0/12 +116.242.0.0/16 +116.246.0.0/15 +116.248.0.0/15 +116.252.0.0/15 +116.255.128.0/17 +117.8.0.0/13 +117.21.0.0/16 +117.22.0.0/15 +117.24.0.0/13 +117.32.0.0/13 +117.40.0.0/14 +117.44.0.0/15 +117.48.0.0/17 +117.48.128.0/19 +117.48.160.0/20 +117.48.192.0/19 +117.48.224.0/20 +117.50.0.0/16 +117.51.0.0/17 +117.51.128.0/19 +117.57.0.0/16 +117.59.0.0/16 +117.60.0.0/14 +117.64.0.0/13 +117.72.248.0/22 +117.72.255.0/24 +117.73.0.0/20 +117.73.16.0/21 +117.73.252.0/22 +117.74.64.0/20 +117.74.128.0/20 +117.78.0.0/18 +117.79.80.0/20 +117.79.128.0/19 +117.79.160.0/21 +117.79.224.0/20 +117.79.241.0/24 +117.79.242.0/24 +117.80.0.0/12 +117.100.0.0/15 +117.106.0.0/15 +117.112.0.0/13 +117.121.0.0/17 +117.121.128.0/18 +117.122.128.0/17 +117.124.0.0/14 +117.128.0.0/10 +118.24.0.0/15 +118.26.0.0/19 +118.26.32.0/22 +118.26.64.0/21 +118.26.72.0/22 +118.26.96.0/21 +118.26.112.0/21 +118.26.120.0/24 +118.26.126.0/23 +118.26.128.0/22 +118.26.136.0/22 +118.26.160.0/20 +118.26.192.0/18 +118.30.0.0/15 +118.64.0.0/22 +118.72.0.0/13 +118.80.0.0/15 +118.84.0.0/15 +118.88.32.0/19 +118.88.64.0/18 +118.88.128.0/17 +118.89.0.0/16 +118.102.16.0/20 +118.112.0.0/13 +118.120.0.0/14 +118.124.0.0/15 +118.126.1.0/24 +118.126.2.0/23 +118.126.4.0/23 +118.126.8.0/23 +118.126.10.0/24 +118.126.12.0/22 +118.126.16.0/23 +118.126.18.0/24 +118.126.32.0/19 +118.126.64.0/18 +118.126.128.0/17 +118.132.0.0/14 +118.143.198.0/23 +118.143.215.0/24 +118.144.0.0/16 +118.145.0.0/19 +118.172.22.0/24 +118.178.0.0/16 +118.180.0.0/14 +118.184.6.0/24 +118.184.8.0/22 +118.184.44.0/24 +118.184.72.0/23 +118.184.75.0/24 +118.184.88.0/24 +118.184.100.0/22 +118.184.111.0/24 +118.184.112.0/20 +118.184.128.0/17 +118.186.0.0/15 +118.188.18.0/23 +118.188.20.0/22 +118.188.24.0/23 +118.190.0.0/16 +118.191.0.0/21 +118.191.8.0/22 +118.191.12.0/24 +118.191.128.0/22 +118.191.152.0/24 +118.191.192.0/23 +118.191.208.0/24 +118.191.216.0/24 +118.191.223.0/24 +118.191.224.0/24 +118.191.240.0/23 +118.191.248.0/21 +118.192.0.0/16 +118.193.96.0/19 +118.193.136.0/24 +118.193.141.0/24 +118.193.142.0/23 +118.193.146.0/23 +118.193.148.0/24 +118.193.156.0/22 +118.194.32.0/19 +118.194.128.0/21 +118.194.164.0/22 +118.194.172.0/22 +118.194.192.0/23 +118.194.198.0/24 +118.194.200.0/21 +118.194.240.0/21 +118.195.0.0/16 +118.199.0.0/16 +118.202.0.0/15 +118.212.0.0/15 +118.215.192.0/19 +118.228.0.0/15 +118.230.0.0/16 +118.239.0.0/16 +118.242.0.0/22 +118.242.16.0/22 +118.242.24.0/22 +118.242.32.0/21 +118.242.40.0/22 +118.242.96.0/23 +118.242.208.0/24 +118.242.236.0/22 +118.242.240.0/21 +118.244.0.0/16 +118.247.0.0/16 +118.248.0.0/13 +119.0.0.0/15 +119.2.0.0/19 +119.2.128.0/22 +119.2.132.0/24 +119.3.0.0/16 +119.4.0.0/14 +119.10.112.0/21 +119.15.136.0/21 +119.18.192.0/20 +119.18.208.0/21 +119.18.224.0/22 +119.18.231.0/24 +119.18.232.0/24 +119.18.234.0/24 +119.18.236.0/23 +119.18.239.0/24 +119.20.0.0/15 +119.23.0.0/16 +119.27.64.0/18 +119.27.160.0/19 +119.28.0.0/15 +119.31.192.0/19 +119.32.0.0/15 +119.34.0.0/17 +119.36.0.0/16 +119.37.0.0/23 +119.37.2.0/24 +119.37.12.0/24 +119.37.192.0/21 +119.38.0.0/21 +119.38.128.0/18 +119.38.192.0/19 +119.39.0.0/16 +119.40.0.0/19 +119.40.32.0/21 +119.40.52.0/24 +119.40.55.0/24 +119.40.64.0/20 +119.40.128.0/17 +119.41.0.0/16 +119.42.0.0/19 +119.42.136.0/21 +119.42.224.0/19 +119.44.0.0/18 +119.44.192.0/18 +119.45.0.0/16 +119.48.0.0/13 +119.57.0.0/16 +119.58.0.0/16 +119.59.128.0/18 +119.60.0.0/15 +119.62.0.0/16 +119.75.208.0/20 +119.78.0.0/15 +119.80.32.0/20 +119.80.48.0/21 +119.80.160.0/19 +119.80.192.0/21 +119.80.200.0/22 +119.80.240.0/22 +119.84.0.0/14 +119.88.128.0/17 +119.90.0.0/17 +119.90.128.0/18 +119.90.224.0/19 +119.91.0.0/16 +119.96.0.0/13 +119.108.0.0/15 +119.112.0.0/12 +119.128.0.0/12 +119.144.0.0/14 +119.148.160.0/23 +119.148.162.0/24 +119.161.12.0/24 +119.161.14.0/23 +119.161.128.0/22 +119.161.136.0/21 +119.161.144.0/22 +119.161.148.0/23 +119.161.151.0/24 +119.161.152.0/21 +119.161.168.0/22 +119.161.180.0/22 +119.162.0.0/15 +119.164.0.0/14 +119.176.0.0/12 +119.233.128.0/17 +119.235.128.0/22 +119.235.136.0/23 +119.235.138.0/24 +119.235.143.0/24 +119.235.144.0/22 +119.235.148.0/23 +119.235.151.0/24 +119.235.160.0/22 +119.235.164.0/23 +119.235.184.0/22 +119.248.0.0/14 +119.253.0.0/16 +119.254.0.0/16 +119.255.0.0/18 +119.255.128.0/17 +120.0.0.0/12 +120.24.0.0/14 +120.31.0.0/16 +120.32.0.0/12 +120.48.0.0/17 +120.48.192.0/18 +120.52.0.0/15 +120.55.0.0/16 +120.65.0.0/16 +120.68.0.0/14 +120.72.32.0/19 +120.72.160.0/24 +120.72.162.0/23 +120.72.164.0/24 +120.72.166.0/23 +120.72.168.0/24 +120.72.170.0/23 +120.72.172.0/23 +120.72.174.0/24 +120.72.177.0/24 +120.72.178.0/24 +120.72.180.0/24 +120.72.182.0/23 +120.72.184.0/22 +120.72.188.0/23 +120.72.190.0/24 +120.76.0.0/14 +120.80.0.0/13 +120.88.8.0/21 +120.88.56.0/23 +120.90.0.0/15 +120.92.0.0/16 +120.94.0.0/15 +120.128.0.0/21 +120.131.0.0/20 +120.131.80.0/21 +120.131.124.0/22 +120.132.0.0/14 +120.136.20.0/23 +120.136.22.0/24 +120.136.128.0/21 +120.136.140.0/22 +120.136.144.0/20 +120.136.160.0/19 +120.192.0.0/10 +121.0.16.0/20 +121.4.0.0/15 +121.8.0.0/13 +121.16.0.0/12 +121.32.0.0/14 +121.36.0.0/15 +121.38.0.0/24 +121.40.0.0/14 +121.46.0.0/20 +121.46.128.0/21 +121.46.140.0/22 +121.46.144.0/20 +121.46.192.0/21 +121.46.200.0/22 +121.46.224.0/20 +121.46.244.0/22 +121.46.248.0/22 +121.46.252.0/23 +121.46.254.0/24 +121.47.0.0/16 +121.48.0.0/15 +121.51.0.0/16 +121.52.160.0/19 +121.52.208.0/20 +121.52.224.0/19 +121.55.0.0/18 +121.56.0.0/15 +121.58.0.0/17 +121.58.156.0/22 +121.59.0.0/20 +121.59.17.0/24 +121.59.30.0/24 +121.59.33.0/24 +121.59.34.0/23 +121.60.0.0/14 +121.69.0.0/16 +121.76.0.0/15 +121.79.128.0/20 +121.79.144.0/22 +121.89.0.0/16 +121.101.208.0/20 +121.192.0.0/13 +121.201.0.0/16 +121.204.0.0/14 +121.224.0.0/12 +121.248.0.0/14 +121.255.0.0/16 +122.0.64.0/18 +122.4.0.0/14 +122.9.0.0/16 +122.10.0.0/17 +122.10.133.0/24 +122.10.136.0/23 +122.10.171.0/24 +122.10.173.0/24 +122.10.174.0/23 +122.10.176.0/22 +122.10.180.0/23 +122.10.183.0/24 +122.10.184.0/23 +122.10.190.0/23 +122.10.195.0/24 +122.10.228.0/22 +122.10.232.0/21 +122.10.240.0/22 +122.11.32.0/19 +122.13.0.0/16 +122.14.0.0/18 +122.14.140.0/24 +122.14.155.0/24 +122.14.156.0/22 +122.14.162.0/23 +122.14.164.0/23 +122.14.166.0/24 +122.14.168.0/22 +122.14.191.0/24 +122.14.192.0/18 +122.48.0.0/16 +122.49.0.0/18 +122.51.0.0/16 +122.64.0.0/11 +122.96.0.0/15 +122.102.0.0/20 +122.102.64.0/20 +122.102.94.0/23 +122.112.0.0/18 +122.112.64.0/19 +122.112.100.0/24 +122.112.103.0/24 +122.112.104.0/24 +122.112.109.0/24 +122.112.110.0/24 +122.112.112.0/24 +122.112.119.0/24 +122.112.120.0/24 +122.112.126.0/23 +122.112.128.0/17 +122.114.0.0/16 +122.115.0.0/20 +122.115.32.0/19 +122.115.224.0/20 +122.119.0.0/16 +122.136.0.0/13 +122.144.128.0/17 +122.152.192.0/18 +122.156.0.0/14 +122.188.0.0/14 +122.192.0.0/14 +122.200.64.0/18 +122.204.0.0/14 +122.224.0.0/12 +122.240.0.0/13 +122.248.48.0/21 +122.248.56.0/22 +123.4.0.0/14 +123.8.0.0/13 +123.49.241.0/24 +123.49.246.0/24 +123.52.0.0/14 +123.56.0.0/15 +123.58.0.0/18 +123.58.64.0/22 +123.58.68.0/23 +123.58.96.0/19 +123.58.128.0/18 +123.58.224.0/19 +123.59.0.0/16 +123.60.0.0/17 +123.60.208.0/20 +123.60.224.0/19 +123.61.0.0/16 +123.64.0.0/12 +123.80.0.0/13 +123.88.140.0/22 +123.88.180.0/22 +123.88.184.0/21 +123.89.148.0/22 +123.90.0.0/15 +123.92.0.0/14 +123.96.0.0/15 +123.99.192.0/18 +123.101.0.0/16 +123.103.0.0/20 +123.103.16.0/21 +123.103.24.0/22 +123.103.28.0/23 +123.103.30.0/24 +123.103.32.0/19 +123.103.64.0/18 +123.108.208.0/22 +123.108.212.0/23 +123.108.220.0/22 +123.112.0.0/12 +123.128.0.0/13 +123.137.0.0/16 +123.138.0.0/15 +123.144.0.0/12 +123.160.0.0/12 +123.176.60.0/22 +123.177.0.0/16 +123.178.0.0/15 +123.180.0.0/14 +123.184.0.0/13 +123.196.0.0/16 +123.199.128.0/20 +123.206.0.0/15 +123.232.0.0/14 +123.244.0.0/14 +123.253.108.0/23 +123.253.110.0/24 +124.6.64.0/18 +124.14.0.0/20 +124.14.16.0/21 +124.14.64.0/18 +124.14.224.0/19 +124.15.176.0/22 +124.16.0.0/15 +124.22.0.0/15 +124.28.192.0/18 +124.29.0.0/17 +124.31.0.0/16 +124.40.112.0/20 +124.40.128.0/18 +124.42.0.0/16 +124.47.0.0/18 +124.64.0.0/15 +124.66.0.0/17 +124.67.0.0/16 +124.68.128.0/18 +124.68.251.0/24 +124.68.252.0/22 +124.70.0.0/16 +124.71.0.0/17 +124.71.128.0/18 +124.71.192.0/19 +124.71.224.0/20 +124.71.251.0/24 +124.71.254.0/23 +124.72.0.0/13 +124.88.0.0/13 +124.108.20.0/24 +124.108.22.0/23 +124.112.0.0/13 +124.126.0.0/15 +124.128.0.0/13 +124.151.0.0/16 +124.152.0.0/16 +124.156.0.0/16 +124.160.0.0/13 +124.172.0.0/15 +124.192.0.0/15 +124.196.0.0/20 +124.196.16.0/22 +124.196.20.0/24 +124.196.22.0/23 +124.196.24.0/21 +124.196.36.0/23 +124.196.38.0/24 +124.196.40.0/22 +124.196.48.0/22 +124.196.52.0/24 +124.196.56.0/22 +124.196.72.0/24 +124.196.74.0/24 +124.196.76.0/23 +124.196.78.0/24 +124.200.0.0/16 +124.202.0.0/16 +124.203.192.0/18 +124.204.0.0/14 +124.224.0.0/12 +124.240.0.0/17 +124.240.128.0/18 +124.243.192.0/18 +124.248.0.0/22 +124.248.32.0/20 +124.248.48.0/21 +124.248.64.0/18 +124.249.0.0/17 +124.250.0.0/15 +124.254.0.0/18 +125.32.0.0/12 +125.58.128.0/17 +125.61.128.0/19 +125.62.0.0/18 +125.64.0.0/11 +125.96.32.0/19 +125.96.170.0/23 +125.96.172.0/23 +125.96.176.0/20 +125.96.204.0/23 +125.96.240.0/21 +125.97.0.0/16 +125.98.7.0/24 +125.98.122.0/23 +125.98.128.0/17 +125.104.0.0/13 +125.112.0.0/12 +125.171.0.0/16 +125.208.0.0/19 +125.208.32.0/20 +125.208.63.0/24 +125.210.0.0/15 +125.213.32.0/20 +125.214.96.0/19 +125.215.0.0/18 +125.216.0.0/13 +125.254.128.0/17 +128.108.0.0/16 +129.28.0.0/16 +129.204.0.0/16 +129.211.0.0/16 +129.223.254.0/24 +129.226.0.0/16 +131.221.80.0/22 +132.232.0.0/16 +132.237.134.0/24 +134.172.0.0/17 +134.172.128.0/18 +134.175.0.0/16 +137.59.88.0/22 +139.5.60.0/22 +139.9.0.0/17 +139.9.128.0/18 +139.9.192.0/19 +139.9.224.0/20 +139.9.240.0/21 +139.9.248.0/22 +139.129.0.0/16 +139.148.0.0/16 +139.155.0.0/16 +139.159.0.0/19 +139.159.32.0/20 +139.159.96.0/20 +139.159.112.0/22 +139.159.132.0/22 +139.159.136.0/21 +139.159.144.0/20 +139.159.160.0/22 +139.159.164.0/23 +139.159.168.0/21 +139.159.176.0/20 +139.159.192.0/18 +139.170.0.0/16 +139.186.0.0/16 +139.189.0.0/16 +139.196.0.0/16 +139.198.0.0/15 +139.200.0.0/13 +139.208.0.0/13 +139.217.0.0/16 +139.219.0.0/16 +139.220.128.0/17 +139.224.0.0/16 +139.226.0.0/15 +140.75.0.0/16 +140.143.0.0/16 +140.179.0.0/16 +140.205.0.0/16 +140.206.0.0/15 +140.210.0.0/19 +140.210.64.0/18 +140.224.0.0/16 +140.237.0.0/16 +140.240.0.0/16 +140.242.223.0/24 +140.242.224.0/24 +140.243.0.0/16 +140.246.0.0/16 +140.249.0.0/16 +140.250.0.0/16 +140.255.0.0/16 +144.0.0.0/16 +144.7.0.0/17 +144.12.0.0/16 +144.36.146.0/23 +144.48.64.0/21 +144.48.188.0/22 +144.48.208.0/21 +144.48.220.0/22 +144.48.252.0/22 +144.52.0.0/16 +144.123.0.0/16 +144.255.0.0/16 +145.14.64.0/23 +145.14.67.0/24 +145.14.69.0/24 +145.14.71.0/24 +145.14.72.0/22 +145.14.79.0/24 +145.14.81.0/24 +145.14.82.0/24 +145.14.84.0/24 +145.14.86.0/24 +145.14.88.0/24 +145.14.90.0/24 +145.14.92.0/24 +146.56.192.0/18 +146.196.56.0/22 +146.196.68.0/22 +146.196.112.0/22 +146.222.79.0/24 +146.222.81.0/24 +146.222.94.0/24 +147.78.132.0/22 +148.70.0.0/16 +150.107.0.0/23 +150.107.2.0/24 +150.109.0.0/16 +150.129.40.0/24 +150.129.42.0/23 +150.129.136.0/22 +150.129.192.0/22 +150.129.219.0/24 +150.129.252.0/22 +150.138.0.0/15 +150.158.0.0/16 +150.223.0.0/16 +150.242.8.0/23 +150.242.56.0/22 +150.242.80.0/22 +150.242.96.0/22 +150.242.120.0/24 +150.242.122.0/23 +150.242.156.0/23 +150.242.159.0/24 +150.242.168.0/22 +150.242.184.0/22 +150.242.232.0/21 +150.242.248.0/22 +150.255.0.0/16 +152.104.128.0/17 +152.136.0.0/16 +153.0.0.0/16 +153.3.0.0/16 +153.34.0.0/15 +153.36.0.0/15 +153.99.0.0/16 +153.101.0.0/16 +153.118.0.0/15 +154.8.128.0/17 +154.18.162.0/24 +154.72.40.0/21 +154.83.28.0/24 +154.85.14.0/23 +154.85.32.0/19 +154.88.3.0/24 +154.91.32.0/23 +154.194.2.0/23 +154.198.1.0/24 +154.198.2.0/23 +154.201.7.0/24 +154.201.21.0/24 +154.203.5.0/24 +154.203.6.0/23 +154.203.8.0/24 +154.204.22.0/24 +154.205.0.0/24 +154.205.6.0/23 +154.205.8.0/22 +154.209.24.0/22 +154.209.28.0/24 +154.209.31.0/24 +154.209.224.0/23 +154.209.251.0/24 +154.211.16.0/22 +154.211.32.0/21 +154.211.40.0/22 +154.211.44.0/24 +154.211.46.0/23 +154.213.4.0/23 +154.223.154.0/24 +154.223.184.0/22 +154.223.191.0/24 +156.96.105.0/24 +156.96.106.0/24 +156.96.148.0/24 +156.107.160.0/24 +156.107.170.0/24 +156.107.178.0/23 +156.107.180.0/23 +156.226.8.0/23 +156.226.10.0/24 +156.229.1.0/24 +156.230.9.0/24 +156.230.11.0/24 +156.230.12.0/23 +156.230.15.0/24 +156.236.117.0/24 +156.236.118.0/24 +156.236.122.0/24 +156.240.57.0/24 +156.240.63.0/24 +156.240.72.0/22 +156.240.88.0/22 +156.240.112.0/21 +156.242.1.0/24 +156.242.4.0/24 +156.242.6.0/24 +156.242.8.0/24 +156.247.0.0/24 +156.247.29.0/24 +156.249.2.0/23 +156.249.20.0/22 +156.252.22.0/24 +156.253.32.0/20 +156.254.49.0/24 +156.254.63.0/24 +157.0.0.0/16 +157.18.0.0/16 +157.61.0.0/16 +157.119.0.0/22 +157.119.28.0/22 +157.119.172.0/22 +157.122.0.0/16 +157.148.0.0/16 +157.156.0.0/16 +157.255.0.0/16 +159.27.0.0/16 +159.75.0.0/16 +159.226.0.0/16 +160.19.208.0/21 +160.83.110.0/24 +160.116.45.0/24 +160.181.160.0/19 +160.202.60.0/22 +160.202.168.0/22 +160.202.212.0/22 +161.163.0.0/21 +161.163.28.0/23 +161.189.0.0/16 +161.207.0.0/16 +162.14.0.0/16 +162.62.0.0/16 +162.105.0.0/16 +163.0.0.0/16 +163.47.4.0/22 +163.53.8.0/22 +163.53.16.0/23 +163.53.18.0/24 +163.53.36.0/22 +163.53.40.0/21 +163.53.56.0/21 +163.53.88.0/21 +163.53.100.0/22 +163.53.104.0/22 +163.53.112.0/20 +163.53.168.0/21 +163.53.244.0/22 +163.125.0.0/16 +163.142.0.0/16 +163.177.0.0/16 +163.179.0.0/16 +163.181.0.0/21 +163.181.8.0/22 +163.181.12.0/24 +163.181.15.0/24 +163.181.16.0/22 +163.181.20.0/24 +163.181.22.0/23 +163.181.25.0/24 +163.181.26.0/24 +163.181.28.0/24 +163.181.32.0/22 +163.181.36.0/24 +163.181.38.0/23 +163.181.42.0/23 +163.181.49.0/24 +163.181.50.0/24 +163.181.52.0/24 +163.181.57.0/24 +163.181.61.0/24 +163.181.62.0/24 +163.181.64.0/24 +163.197.0.0/20 +163.204.0.0/16 +163.228.0.0/16 +163.244.246.0/24 +166.111.0.0/16 +167.139.0.0/16 +167.189.0.0/16 +167.220.244.0/22 +168.159.144.0/21 +168.159.152.0/22 +168.159.156.0/23 +168.159.158.0/24 +168.160.0.0/17 +168.160.152.0/24 +168.160.158.0/23 +168.160.160.0/21 +168.160.168.0/24 +168.160.224.0/19 +170.106.0.0/16 +170.225.224.0/23 +170.252.152.0/21 +171.8.0.0/13 +171.34.0.0/15 +171.36.0.0/14 +171.40.0.0/14 +171.44.0.0/16 +171.80.0.0/12 +171.104.0.0/13 +171.112.0.0/12 +171.208.0.0/12 +172.81.192.0/18 +172.247.96.0/24 +175.0.0.0/12 +175.16.0.0/13 +175.24.0.0/15 +175.27.0.0/16 +175.30.0.0/15 +175.42.0.0/15 +175.44.0.0/16 +175.46.0.0/15 +175.48.0.0/12 +175.64.0.0/11 +175.102.0.0/19 +175.102.32.0/22 +175.102.54.0/23 +175.102.128.0/21 +175.102.160.0/19 +175.102.192.0/22 +175.102.196.0/24 +175.106.128.0/17 +175.146.0.0/15 +175.148.0.0/14 +175.152.0.0/14 +175.160.0.0/12 +175.184.128.0/18 +175.185.0.0/16 +175.186.0.0/15 +175.188.188.0/22 +175.190.24.0/21 +175.190.126.0/23 +176.126.128.0/23 +176.126.131.0/24 +176.126.132.0/24 +176.126.134.0/23 +180.76.0.0/14 +180.84.0.0/15 +180.86.0.0/16 +180.88.96.0/19 +180.88.128.0/18 +180.89.56.0/22 +180.89.60.0/23 +180.89.64.0/19 +180.91.192.0/20 +180.95.128.0/17 +180.96.0.0/11 +180.129.128.0/17 +180.130.0.0/16 +180.136.0.0/13 +180.149.128.0/19 +180.150.176.0/20 +180.152.0.0/13 +180.160.0.0/12 +180.178.252.0/22 +180.184.0.0/21 +180.184.64.0/20 +180.186.0.0/16 +180.188.16.0/20 +180.188.32.0/20 +180.200.252.0/22 +180.201.0.0/16 +180.202.0.0/15 +180.208.0.0/15 +180.210.212.0/22 +180.212.0.0/15 +180.235.64.0/21 +180.235.72.0/23 +182.18.0.0/18 +182.18.64.0/19 +182.32.0.0/12 +182.48.96.0/20 +182.48.112.0/21 +182.48.120.0/24 +182.48.125.0/24 +182.50.0.0/22 +182.50.112.0/20 +182.51.0.0/24 +182.54.0.0/17 +182.61.0.0/17 +182.61.128.0/18 +182.61.192.0/22 +182.61.200.0/21 +182.61.216.0/21 +182.61.224.0/19 +182.80.0.0/13 +182.88.0.0/14 +182.92.0.0/16 +182.96.0.0/11 +182.128.0.0/12 +182.144.0.0/13 +182.157.0.0/16 +182.174.0.0/15 +182.200.0.0/13 +182.236.128.0/17 +182.240.0.0/13 +182.254.0.0/16 +182.255.33.0/24 +183.0.0.0/10 +183.64.0.0/13 +183.78.180.0/22 +183.81.180.0/22 +183.84.0.0/15 +183.91.40.0/21 +183.91.48.0/21 +183.91.56.0/24 +183.91.58.0/24 +183.91.60.0/23 +183.91.63.0/24 +183.91.144.0/20 +183.92.0.0/14 +183.128.0.0/11 +183.160.0.0/13 +183.168.0.0/15 +183.170.0.0/16 +183.172.0.0/14 +183.184.0.0/13 +183.192.0.0/10 +185.10.104.0/24 +185.75.172.0/23 +185.75.174.0/24 +185.145.244.0/24 +185.172.166.0/24 +185.174.60.0/24 +185.185.250.0/24 +185.188.5.0/24 +185.192.56.0/23 +185.192.59.0/24 +185.216.118.0/24 +185.216.248.0/22 +185.243.41.0/24 +185.255.152.0/23 +188.131.128.0/17 +192.55.46.0/24 +192.55.68.0/22 +192.102.204.0/22 +192.140.208.0/21 +192.144.128.0/17 +192.155.176.0/20 +192.162.152.0/23 +192.163.11.0/24 +192.232.97.0/24 +193.20.64.0/22 +193.105.177.0/24 +193.105.207.0/24 +193.112.0.0/16 +193.118.33.0/24 +194.15.39.0/24 +194.56.226.0/24 +194.119.13.0/24 +194.119.15.0/24 +194.138.202.0/23 +194.138.245.0/24 +194.156.157.0/24 +198.175.100.0/22 +198.176.53.0/24 +198.208.17.0/24 +198.208.19.0/24 +199.182.239.0/24 +199.244.144.0/24 +202.4.128.0/19 +202.4.252.0/22 +202.5.23.0/24 +202.8.120.0/22 +202.10.74.0/23 +202.10.76.0/22 +202.14.235.0/24 +202.14.236.0/23 +202.14.238.0/24 +202.38.2.0/23 +202.38.8.0/21 +202.38.64.0/18 +202.38.128.0/23 +202.38.132.0/23 +202.38.134.0/24 +202.38.140.0/23 +202.38.147.0/24 +202.38.152.0/23 +202.38.161.0/24 +202.38.164.0/22 +202.38.184.0/21 +202.38.192.0/18 +202.41.152.0/21 +202.41.241.0/24 +202.41.242.0/23 +202.41.244.0/22 +202.41.248.0/21 +202.43.144.0/20 +202.46.32.0/21 +202.46.40.0/23 +202.46.42.0/24 +202.46.44.0/22 +202.46.48.0/20 +202.55.0.0/19 +202.58.105.0/24 +202.59.213.0/24 +202.59.214.0/23 +202.60.112.0/20 +202.60.132.0/22 +202.61.88.0/22 +202.62.112.0/22 +202.63.160.0/20 +202.67.3.0/24 +202.69.16.0/20 +202.70.0.0/19 +202.73.128.0/22 +202.75.208.0/20 +202.75.252.0/22 +202.80.192.0/22 +202.84.17.0/24 +202.85.208.0/20 +202.89.96.0/24 +202.89.232.0/21 +202.90.20.0/22 +202.90.96.0/20 +202.91.176.0/21 +202.91.184.0/23 +202.91.186.0/24 +202.91.188.0/24 +202.91.190.0/23 +202.91.224.0/20 +202.91.240.0/21 +202.91.248.0/22 +202.93.252.0/22 +202.94.1.0/24 +202.95.0.0/19 +202.96.0.0/16 +202.97.0.0/18 +202.97.80.0/20 +202.97.96.0/19 +202.97.128.0/17 +202.98.0.0/15 +202.100.0.0/14 +202.104.0.0/13 +202.112.0.0/13 +202.120.0.0/15 +202.122.7.0/24 +202.122.32.0/21 +202.122.112.0/21 +202.122.128.0/24 +202.123.96.0/24 +202.123.98.0/24 +202.123.106.0/23 +202.123.108.0/24 +202.123.110.0/23 +202.123.120.0/22 +202.125.176.0/20 +202.127.0.0/21 +202.127.12.0/22 +202.127.16.0/20 +202.127.40.0/21 +202.127.48.0/23 +202.127.112.0/20 +202.127.144.0/20 +202.127.200.0/21 +202.127.208.0/23 +202.127.216.0/21 +202.127.224.0/19 +202.130.0.0/19 +202.130.224.0/19 +202.136.48.0/20 +202.136.208.0/21 +202.136.216.0/23 +202.136.218.0/24 +202.136.220.0/24 +202.136.222.0/23 +202.136.255.0/24 +202.141.160.0/19 +202.143.16.0/23 +202.143.100.0/22 +202.144.196.0/22 +202.148.96.0/19 +202.149.224.0/19 +202.150.16.0/20 +202.152.176.0/20 +202.158.160.0/19 +202.164.25.0/24 +202.165.208.0/20 +202.168.160.0/19 +202.170.128.0/19 +202.170.217.0/24 +202.170.218.0/23 +202.170.220.0/22 +202.173.8.0/21 +202.173.224.0/19 +202.179.240.0/20 +202.180.128.0/19 +202.181.28.0/24 +202.189.0.0/18 +202.192.0.0/12 +203.0.104.0/21 +203.2.64.0/21 +203.2.112.0/21 +203.2.160.0/21 +203.3.80.0/21 +203.3.112.0/21 +203.6.224.0/20 +203.8.24.0/23 +203.8.27.0/24 +203.8.28.0/22 +203.12.91.0/24 +203.12.93.0/24 +203.12.95.0/24 +203.12.200.0/22 +203.12.204.0/23 +203.13.80.0/23 +203.15.0.0/20 +203.18.50.0/24 +203.20.136.0/23 +203.20.138.0/24 +203.25.48.0/24 +203.25.208.0/20 +203.32.48.0/23 +203.32.68.0/23 +203.32.84.0/23 +203.32.186.0/23 +203.32.204.0/23 +203.33.145.0/24 +203.33.156.0/24 +203.33.158.0/23 +203.33.174.0/24 +203.33.202.0/23 +203.33.206.0/23 +203.33.214.0/23 +203.33.224.0/23 +203.33.243.0/24 +203.34.4.0/24 +203.34.21.0/24 +203.34.27.0/24 +203.34.39.0/24 +203.34.48.0/23 +203.34.54.0/24 +203.34.56.0/23 +203.34.67.0/24 +203.34.69.0/24 +203.34.76.0/24 +203.34.92.0/24 +203.34.106.0/24 +203.34.113.0/24 +203.34.147.0/24 +203.34.150.0/24 +203.34.152.0/23 +203.34.161.0/24 +203.34.162.0/24 +203.34.187.0/24 +203.34.232.0/24 +203.34.240.0/24 +203.34.242.0/24 +203.34.245.0/24 +203.34.251.0/24 +203.55.2.0/23 +203.55.4.0/24 +203.55.10.0/24 +203.55.13.0/24 +203.55.22.0/24 +203.55.30.0/24 +203.55.93.0/24 +203.55.101.0/24 +203.55.109.0/24 +203.55.110.0/24 +203.55.116.0/23 +203.55.119.0/24 +203.55.128.0/23 +203.55.146.0/23 +203.55.192.0/24 +203.55.218.0/23 +203.56.4.0/24 +203.56.24.0/24 +203.56.38.0/24 +203.56.40.0/24 +203.56.46.0/24 +203.56.68.0/23 +203.56.82.0/23 +203.56.84.0/23 +203.56.95.0/24 +203.56.169.0/24 +203.56.172.0/23 +203.56.175.0/24 +203.56.183.0/24 +203.56.185.0/24 +203.56.187.0/24 +203.56.192.0/24 +203.56.198.0/24 +203.56.201.0/24 +203.56.208.0/23 +203.56.210.0/24 +203.56.214.0/24 +203.56.216.0/24 +203.56.227.0/24 +203.56.228.0/24 +203.56.232.0/24 +203.56.240.0/24 +203.56.252.0/24 +203.56.254.0/24 +203.57.5.0/24 +203.57.6.0/24 +203.57.12.0/23 +203.57.28.0/24 +203.57.39.0/24 +203.57.46.0/24 +203.57.58.0/24 +203.57.61.0/24 +203.57.66.0/24 +203.57.69.0/24 +203.57.70.0/23 +203.57.73.0/24 +203.57.90.0/24 +203.57.101.0/24 +203.57.109.0/24 +203.57.123.0/24 +203.57.157.0/24 +203.57.200.0/24 +203.57.202.0/24 +203.57.206.0/24 +203.57.222.0/24 +203.57.224.0/20 +203.57.246.0/23 +203.57.249.0/24 +203.57.253.0/24 +203.57.254.0/23 +203.62.2.0/24 +203.62.131.0/24 +203.62.139.0/24 +203.65.240.0/22 +203.76.208.0/21 +203.76.216.0/22 +203.76.240.0/22 +203.78.48.0/20 +203.79.0.0/20 +203.80.4.0/23 +203.80.32.0/20 +203.80.57.0/24 +203.80.144.0/20 +203.81.16.0/20 +203.82.0.0/23 +203.83.56.0/21 +203.83.224.0/20 +203.86.0.0/18 +203.86.64.0/19 +203.86.254.0/23 +203.88.32.0/19 +203.88.192.0/19 +203.89.8.0/23 +203.89.100.0/22 +203.90.12.0/22 +203.90.128.0/18 +203.90.192.0/19 +203.91.32.0/19 +203.91.120.0/21 +203.93.0.0/18 +203.93.64.0/19 +203.93.96.0/20 +203.93.117.0/24 +203.93.120.0/21 +203.93.128.0/19 +203.93.160.0/20 +203.93.208.0/20 +203.93.224.0/19 +203.94.0.0/19 +203.95.0.0/21 +203.95.96.0/22 +203.95.104.0/21 +203.95.208.0/22 +203.99.20.0/24 +203.99.22.0/23 +203.99.24.0/21 +203.100.50.0/23 +203.100.52.0/24 +203.100.54.0/24 +203.100.80.0/21 +203.100.92.0/22 +203.100.96.0/19 +203.100.192.0/20 +203.104.32.0/20 +203.107.0.0/23 +203.107.6.0/24 +203.107.20.0/22 +203.107.32.0/19 +203.110.160.0/19 +203.110.208.0/20 +203.110.232.0/23 +203.114.244.0/22 +203.118.248.0/22 +203.119.25.0/24 +203.119.26.0/23 +203.119.28.0/22 +203.119.33.0/24 +203.119.80.0/23 +203.119.83.0/24 +203.119.85.0/24 +203.119.114.0/23 +203.119.128.0/19 +203.119.160.0/24 +203.119.168.0/21 +203.119.176.0/20 +203.119.192.0/18 +203.128.96.0/19 +203.129.8.0/21 +203.130.32.0/22 +203.130.40.0/21 +203.132.32.0/19 +203.134.240.0/21 +203.135.96.0/19 +203.148.0.0/18 +203.148.64.0/20 +203.148.86.0/23 +203.152.64.0/19 +203.156.192.0/18 +203.158.16.0/21 +203.160.104.0/22 +203.160.109.0/24 +203.160.110.0/23 +203.160.192.0/19 +203.161.192.0/19 +203.166.160.0/22 +203.166.165.0/24 +203.166.166.0/24 +203.166.168.0/24 +203.166.172.0/24 +203.166.176.0/23 +203.166.180.0/24 +203.166.186.0/23 +203.166.188.0/23 +203.166.191.0/24 +203.168.0.0/19 +203.170.58.0/23 +203.171.224.0/20 +203.174.4.0/24 +203.174.7.0/24 +203.174.112.0/20 +203.175.128.0/19 +203.175.192.0/18 +203.176.64.0/19 +203.176.168.0/23 +203.176.170.0/24 +203.187.160.0/19 +203.189.0.0/23 +203.189.6.0/23 +203.189.192.0/19 +203.189.240.0/22 +203.191.0.0/23 +203.191.20.0/24 +203.191.22.0/24 +203.191.25.0/24 +203.191.30.0/24 +203.191.144.0/21 +203.192.1.0/24 +203.192.2.0/23 +203.192.4.0/22 +203.192.8.0/21 +203.192.16.0/24 +203.192.24.0/23 +203.193.224.0/19 +203.194.120.0/21 +203.195.64.0/19 +203.195.112.0/21 +203.195.128.0/17 +203.196.0.0/21 +203.196.8.0/23 +203.202.236.0/23 +203.205.64.0/19 +203.205.128.0/19 +203.205.188.0/24 +203.205.191.0/24 +203.205.193.0/24 +203.205.194.0/23 +203.205.196.0/23 +203.205.218.0/23 +203.205.220.0/22 +203.205.224.0/24 +203.205.232.0/21 +203.205.240.0/24 +203.205.242.0/24 +203.205.244.0/23 +203.205.248.0/21 +203.207.64.0/19 +203.207.96.0/21 +203.207.104.0/22 +203.207.112.0/20 +203.207.128.0/18 +203.207.192.0/21 +203.207.200.0/22 +203.207.208.0/20 +203.207.224.0/19 +203.208.0.0/20 +203.208.32.0/19 +203.208.157.0/24 +203.208.170.0/24 +203.209.224.0/19 +203.212.0.0/20 +203.212.80.0/23 +203.215.232.0/23 +203.215.235.0/24 +203.215.236.0/24 +203.223.21.0/24 +203.223.23.0/24 +204.55.160.0/24 +204.114.176.0/23 +206.161.216.0/23 +206.161.218.0/24 +207.226.136.0/23 +207.226.138.0/24 +207.226.153.0/24 +207.226.154.0/24 +210.2.4.0/24 +210.5.0.0/19 +210.5.56.0/21 +210.5.128.0/19 +210.7.60.0/22 +210.12.0.0/16 +210.13.0.0/17 +210.13.192.0/21 +210.13.200.0/22 +210.13.204.0/24 +210.13.207.0/24 +210.13.208.0/20 +210.13.224.0/24 +210.13.230.0/23 +210.13.232.0/24 +210.13.236.0/23 +210.13.238.0/24 +210.13.240.0/20 +210.14.64.0/19 +210.14.112.0/20 +210.14.128.0/19 +210.14.192.0/23 +210.14.240.0/21 +210.15.0.0/17 +210.16.180.0/24 +210.16.185.0/24 +210.16.186.0/23 +210.16.188.0/22 +210.21.0.0/17 +210.21.191.0/24 +210.21.192.0/18 +210.22.0.0/19 +210.22.32.0/22 +210.22.48.0/20 +210.22.64.0/18 +210.22.128.0/17 +210.25.0.0/16 +210.26.0.0/15 +210.28.0.0/14 +210.32.0.0/12 +210.48.136.0/21 +210.51.0.0/16 +210.52.0.0/15 +210.56.192.0/19 +210.72.0.0/17 +210.72.128.0/18 +210.72.192.0/19 +210.72.224.0/20 +210.72.240.0/21 +210.73.0.0/16 +210.74.0.0/19 +210.74.35.0/24 +210.74.36.0/23 +210.74.38.0/24 +210.74.40.0/22 +210.74.44.0/23 +210.74.47.0/24 +210.74.64.0/23 +210.74.107.0/24 +210.74.108.0/23 +210.74.128.0/18 +210.74.224.0/19 +210.75.0.0/18 +210.75.88.0/24 +210.75.96.0/19 +210.75.192.0/18 +210.76.0.0/17 +210.76.160.0/19 +210.76.192.0/19 +210.77.0.0/18 +210.77.64.0/19 +210.77.128.0/19 +210.77.160.0/20 +210.77.176.0/22 +210.77.180.0/23 +210.77.183.0/24 +210.77.184.0/24 +210.77.189.0/24 +210.77.190.0/23 +210.77.192.0/18 +210.78.48.0/20 +210.78.128.0/24 +210.78.133.0/24 +210.78.134.0/23 +210.78.136.0/22 +210.78.144.0/23 +210.78.147.0/24 +210.78.168.0/24 +210.79.60.0/23 +210.79.224.0/19 +210.82.0.0/15 +210.87.128.0/18 +210.171.232.0/21 +210.180.74.0/23 +210.185.192.0/18 +210.192.96.0/19 +211.56.92.0/22 +211.64.0.0/13 +211.80.0.0/13 +211.88.0.0/15 +211.90.0.0/17 +211.90.216.0/21 +211.90.224.0/19 +211.91.0.0/18 +211.91.64.0/19 +211.91.96.0/20 +211.91.120.0/21 +211.91.128.0/19 +211.91.160.0/20 +211.91.176.0/21 +211.91.216.0/21 +211.91.224.0/19 +211.92.0.0/17 +211.92.128.0/18 +211.92.192.0/19 +211.92.224.0/20 +211.92.244.0/22 +211.93.0.0/17 +211.93.128.0/18 +211.93.192.0/21 +211.93.204.0/22 +211.93.224.0/19 +211.94.64.0/18 +211.94.128.0/17 +211.95.0.0/17 +211.95.128.0/19 +211.95.192.0/18 +211.96.0.0/16 +211.97.0.0/17 +211.97.128.0/19 +211.97.160.0/21 +211.97.192.0/18 +211.98.0.0/15 +211.100.0.0/18 +211.100.64.0/19 +211.100.96.0/21 +211.100.192.0/20 +211.100.224.0/19 +211.101.0.0/18 +211.102.80.0/20 +211.102.128.0/18 +211.102.192.0/23 +211.102.208.0/20 +211.102.240.0/20 +211.103.0.0/16 +211.106.132.0/24 +211.136.0.0/13 +211.144.4.0/23 +211.144.6.0/24 +211.144.9.0/24 +211.144.10.0/24 +211.144.12.0/22 +211.144.16.0/24 +211.144.18.0/23 +211.144.20.0/24 +211.144.22.0/24 +211.144.24.0/23 +211.144.27.0/24 +211.144.28.0/22 +211.144.32.0/19 +211.144.64.0/18 +211.144.128.0/19 +211.144.160.0/20 +211.144.192.0/18 +211.145.0.0/18 +211.145.64.0/20 +211.146.0.0/16 +211.147.0.0/18 +211.147.64.0/19 +211.147.128.0/18 +211.147.208.0/20 +211.147.224.0/19 +211.148.0.0/16 +211.149.128.0/17 +211.150.0.0/15 +211.152.0.0/17 +211.152.128.0/22 +211.152.132.0/23 +211.152.138.0/23 +211.152.144.0/23 +211.152.148.0/23 +211.152.152.0/22 +211.152.156.0/24 +211.152.158.0/23 +211.152.160.0/19 +211.152.192.0/22 +211.152.196.0/23 +211.152.208.0/20 +211.153.0.0/16 +211.154.0.0/19 +211.154.52.0/22 +211.154.64.0/18 +211.154.128.0/17 +211.155.0.0/18 +211.155.80.0/20 +211.155.116.0/22 +211.155.120.0/21 +211.155.128.0/19 +211.155.160.0/20 +211.155.176.0/22 +211.155.184.0/21 +211.155.224.0/21 +211.155.232.0/22 +211.155.236.0/24 +211.155.240.0/20 +211.156.0.0/19 +211.156.32.0/20 +211.156.128.0/19 +211.156.176.0/20 +211.156.192.0/20 +211.156.208.0/21 +211.156.216.0/22 +211.156.220.0/23 +211.156.223.0/24 +211.157.0.0/19 +211.157.96.0/19 +211.157.128.0/17 +211.158.0.0/16 +211.159.0.0/18 +211.159.64.0/20 +211.159.96.0/19 +211.159.128.0/17 +211.160.0.0/16 +211.161.0.0/20 +211.161.20.0/22 +211.161.24.0/22 +211.161.32.0/20 +211.161.52.0/22 +211.161.56.0/21 +211.161.80.0/20 +211.161.96.0/21 +211.161.128.0/20 +211.161.192.0/21 +211.161.200.0/22 +211.161.207.0/24 +211.161.209.0/24 +211.161.210.0/24 +211.161.220.0/22 +211.161.224.0/24 +211.161.250.0/24 +211.161.254.0/24 +211.162.0.0/21 +211.162.32.0/21 +211.162.64.0/20 +211.162.112.0/20 +211.162.192.0/22 +211.162.200.0/22 +211.162.236.0/22 +211.162.240.0/20 +211.165.0.0/16 +211.166.0.0/16 +211.167.64.0/18 +211.167.128.0/19 +211.167.176.0/20 +211.167.192.0/18 +212.64.0.0/17 +212.129.128.0/17 +213.255.200.0/22 +216.228.126.0/24 +218.0.0.0/11 +218.56.0.0/13 +218.64.0.0/11 +218.96.0.0/24 +218.96.64.0/22 +218.96.104.0/22 +218.96.108.0/23 +218.96.241.0/24 +218.96.255.0/24 +218.97.0.0/17 +218.97.160.0/19 +218.97.192.0/19 +218.97.240.0/20 +218.98.0.0/18 +218.98.96.0/21 +218.98.104.0/22 +218.98.108.0/23 +218.98.111.0/24 +218.98.112.0/20 +218.99.0.0/19 +218.100.88.0/21 +218.104.0.0/15 +218.106.0.0/16 +218.107.0.0/18 +218.107.128.0/17 +218.108.0.0/15 +218.185.240.0/21 +218.192.0.0/12 +218.240.0.0/18 +218.240.128.0/17 +218.241.0.0/19 +218.241.64.0/19 +218.241.96.0/20 +218.241.112.0/24 +218.241.115.0/24 +218.241.116.0/22 +218.241.120.0/21 +218.241.128.0/17 +218.242.0.0/16 +218.244.0.0/19 +218.244.44.0/22 +218.244.49.0/24 +218.244.50.0/23 +218.244.52.0/23 +218.244.55.0/24 +218.244.56.0/23 +218.244.58.0/24 +218.244.60.0/22 +218.244.96.0/19 +218.244.128.0/18 +218.244.192.0/20 +218.244.224.0/19 +218.245.0.0/18 +218.246.0.0/19 +218.246.32.0/22 +218.246.59.0/24 +218.246.64.0/18 +218.246.160.0/19 +218.246.192.0/19 +218.247.0.0/18 +218.247.128.0/17 +218.249.0.0/16 +219.72.0.0/16 +219.82.0.0/16 +219.83.132.0/22 +219.83.160.0/19 +219.128.0.0/12 +219.144.0.0/14 +219.148.0.0/15 +219.150.0.0/16 +219.151.0.0/18 +219.151.128.0/17 +219.152.0.0/14 +219.156.0.0/15 +219.158.0.0/19 +219.158.32.0/20 +219.158.59.0/24 +219.158.60.0/22 +219.158.96.0/19 +219.158.128.0/17 +219.159.0.0/16 +219.216.0.0/13 +219.224.0.0/13 +219.232.0.0/17 +219.232.160.0/19 +219.232.192.0/18 +219.233.0.0/16 +219.234.0.0/21 +219.234.64.0/18 +219.234.128.0/17 +219.235.0.0/17 +219.235.128.0/19 +219.235.192.0/18 +219.236.0.0/14 +219.242.0.0/15 +219.244.0.0/14 +220.101.192.0/18 +220.112.0.0/18 +220.112.192.0/18 +220.113.0.0/18 +220.113.128.0/21 +220.113.136.0/22 +220.113.144.0/20 +220.113.160.0/20 +220.113.180.0/22 +220.113.184.0/22 +220.113.224.0/19 +220.114.64.0/21 +220.114.248.0/22 +220.115.8.0/21 +220.115.16.0/20 +220.115.228.0/22 +220.115.232.0/21 +220.115.240.0/21 +220.152.128.0/17 +220.160.0.0/12 +220.176.0.0/14 +220.180.0.0/15 +220.182.0.0/18 +220.184.0.0/13 +220.192.0.0/17 +220.192.128.0/19 +220.192.160.0/20 +220.192.176.0/21 +220.192.184.0/22 +220.192.192.0/18 +220.193.0.0/17 +220.194.0.0/15 +220.196.0.0/16 +220.197.0.0/17 +220.197.160.0/19 +220.197.192.0/18 +220.198.0.0/15 +220.200.0.0/17 +220.200.128.0/20 +220.200.148.0/22 +220.200.152.0/21 +220.200.160.0/19 +220.200.192.0/18 +220.201.0.0/16 +220.202.0.0/16 +220.203.32.0/19 +220.203.216.0/23 +220.205.0.0/16 +220.206.192.0/22 +220.207.0.0/22 +220.207.80.0/20 +220.207.176.0/22 +220.207.184.0/22 +220.207.254.0/23 +220.231.0.0/18 +220.231.65.0/24 +220.231.128.0/17 +220.232.64.0/18 +220.234.0.0/16 +220.243.128.0/18 +220.243.247.0/24 +220.248.0.0/16 +220.249.0.0/17 +220.249.128.0/18 +220.249.192.0/19 +220.249.240.0/20 +220.250.0.0/17 +221.0.0.0/13 +221.8.0.0/14 +221.12.0.0/17 +221.12.128.0/18 +221.13.0.0/16 +221.14.0.0/15 +221.122.0.0/16 +221.123.128.0/17 +221.129.16.0/21 +221.129.64.0/20 +221.129.80.0/21 +221.129.230.0/23 +221.129.240.0/20 +221.130.0.0/15 +221.133.224.0/19 +221.136.0.0/15 +221.172.0.0/14 +221.176.0.0/13 +221.192.0.0/14 +221.196.0.0/15 +221.198.0.0/16 +221.199.0.0/17 +221.199.128.0/18 +221.199.192.0/20 +221.199.224.0/19 +221.200.0.0/13 +221.208.0.0/12 +221.224.0.0/12 +222.16.0.0/12 +222.32.0.0/11 +222.64.0.0/11 +222.125.0.0/16 +222.126.128.0/19 +222.126.160.0/21 +222.126.168.0/22 +222.126.172.0/23 +222.126.174.0/24 +222.126.178.0/23 +222.126.182.0/23 +222.126.184.0/21 +222.126.192.0/21 +222.126.204.0/22 +222.126.208.0/22 +222.126.212.0/23 +222.126.216.0/22 +222.126.220.0/24 +222.126.222.0/23 +222.126.224.0/19 +222.128.0.0/12 +222.160.0.0/14 +222.168.0.0/13 +222.176.0.0/12 +222.192.0.0/11 +222.240.0.0/13 +222.248.0.0/15 +223.0.0.0/12 +223.20.0.0/15 +223.27.184.0/22 +223.64.0.0/10 +223.128.0.0/15 +223.144.0.0/12 +223.160.1.0/24 +223.166.0.0/15 +223.192.0.0/15 +223.198.0.0/15 +223.202.0.0/23 +223.202.16.0/22 +223.202.20.0/23 +223.202.24.0/22 +223.202.56.0/21 +223.202.66.0/23 +223.202.72.0/23 +223.202.108.0/22 +223.202.130.0/23 +223.202.132.0/22 +223.202.192.0/21 +223.202.200.0/23 +223.202.208.0/20 +223.203.0.0/22 +223.203.8.0/23 +223.203.96.0/23 +223.203.100.0/23 +223.203.130.0/23 +223.203.192.0/23 +223.203.200.0/23 +223.203.208.0/23 +223.203.216.0/22 +223.203.222.0/23 +223.210.0.0/19 +223.210.48.0/22 +223.212.0.0/14 +223.220.0.0/15 +223.223.176.0/20 +223.223.192.0/20 +223.240.0.0/13 +223.248.0.0/14 +223.252.128.0/19 +223.252.178.0/23 +223.252.180.0/22 +223.252.186.0/23 +223.252.188.0/22 +223.252.192.0/18 +223.255.0.0/17 +223.255.236.0/22 +223.255.252.0/23 +######### END ######### + +© 2021 BGP.space diff --git a/article/ipv6.txt b/article/ipv6.txt new file mode 100644 index 0000000..66e3708 --- /dev/null +++ b/article/ipv6.txt @@ -0,0 +1,1030 @@ + ######################## +# 中国大陆_IP地址段_IPv6 +# 数据来自于: https://bgp.space/ +# 数据生成时间:2021-06-25 00:29:53 +# 数据共计条数:1019 +######################## + +######### BEGIN ######### +2001:250::/30 +2001:254::/31 +2001:256:100::/48 +2001:7fa:5::/48 +2001:da8::/32 +2001:dc7::/32 +2001:dd8:1::/48 +2001:dd8:5::/48 +2001:dd9::/48 +2001:df0:2e00::/48 +2001:df1:a100::/48 +2001:df1:bd80::/48 +2001:df3:b380::/48 +2001:df5:7800::/48 +2001:df6:9f80::/48 +2001:df6:f400::/48 +2400:3200::/32 +2400:5280:f800::/38 +2400:5400:10::/48 +2400:6600::/32 +2400:7100::/32 +2400:7fc0::/40 +2400:7fc0:220::/44 +2400:7fc0:240::/44 +2400:7fc0:2c0::/44 +2400:7fc0:4000::/40 +2400:7fc0:8000::/36 +2400:8200::/32 +2400:89c0:1010::/44 +2400:89c0:1020::/43 +2400:89c0:1050::/46 +2400:89c0:1091::/48 +2400:89c0:1130::/44 +2400:89c0:2100::/48 +2400:89c0:2200::/48 +2400:89c0:3010::/44 +2400:89c0:6000::/48 +2400:89c0:6100::/48 +2400:9340::/32 +2400:9380:8001::/48 +2400:9380:8003::/48 +2400:9380:8020::/47 +2400:9380:8030::/48 +2400:9380:8040::/48 +2400:9380:8140::/48 +2400:9380:8201::/48 +2400:9380:8221::/48 +2400:9380:8301::/48 +2400:9380:9000::/47 +2400:9380:9002::/48 +2400:9380:9005::/48 +2400:9380:9006::/47 +2400:9380:9009::/48 +2400:9380:900a::/48 +2400:9380:9020::/47 +2400:9380:9030::/47 +2400:9380:9040::/47 +2400:9380:9050::/47 +2400:9380:9060::/47 +2400:9380:9070::/47 +2400:9380:9080::/47 +2400:9380:90a0::/47 +2400:9380:90b0::/45 +2400:9380:9100::/47 +2400:9380:9121::/48 +2400:9380:9200::/47 +2400:9380:9202::/48 +2400:9380:9205::/48 +2400:9380:9206::/48 +2400:9380:9220::/47 +2400:9380:9230::/47 +2400:9380:9240::/47 +2400:9380:9250::/47 +2400:9380:9252::/48 +2400:9380:9260::/47 +2400:9380:9270::/47 +2400:9380:9272::/48 +2400:9380:9280::/47 +2400:9380:9282::/48 +2400:9380:92a0::/47 +2400:9380:92b0::/45 +2400:9600:8800::/48 +2400:a040::/32 +2400:a980::/29 +2400:ae00:1981::/48 +2400:b200::/32 +2400:b600::/32 +2400:be00::/48 +2400:da00::/32 +2400:dd00::/28 +2400:ebc0::/32 +2400:ee00:ffff::/48 +2400:f7c0::/32 +2400:fe00::/32 +2401:800::/32 +2401:1740::/39 +2401:1740:1000::/48 +2401:1740:2000::/48 +2401:1d40::/32 +2401:2e00::/32 +2401:33c0::/32 +2401:3480::/36 +2401:3480:2000::/35 +2401:3800::/32 +2401:7e00::/32 +2401:8d00::/46 +2401:8d00:4::/48 +2401:8d00:6::/47 +2401:8d00:8::/46 +2401:8d00:c::/48 +2401:8d00:f::/48 +2401:8d00:10::/48 +2401:a140:2::/48 +2401:b180::/32 +2401:b400::/45 +2401:b400:8::/47 +2401:b400:10::/47 +2401:b400:13::/48 +2401:b400:16::/47 +2401:b400:18::/47 +2401:b400:20::/48 +2401:be00::/32 +2401:cb80::/32 +2401:cc00::/32 +2401:ce00::/32 +2401:d180::/46 +2401:d180:10::/47 +2401:d180:2120::/48 +2401:de00::/32 +2401:ec00::/32 +2401:fa00:40::/43 +2402:840:d000::/46 +2402:1440::/32 +2402:2000::/32 +2402:28c0:fffa::/48 +2402:2b40:8000::/36 +2402:2b40:a000::/36 +2402:33c0::/32 +2402:3c00::/32 +2402:3f80:1400::/40 +2402:4b80::/32 +2402:4e00::/32 +2402:5ec0::/32 +2402:6e80::/32 +2402:6f40::/47 +2402:7d80::/32 +2402:8bc0::/32 +2402:8cc0::/40 +2402:8cc0:200::/40 +2402:93c0::/48 +2402:93c0:20::/48 +2402:93c0:100::/48 +2402:9f80::/32 +2402:b8c0::/32 +2402:b940::/40 +2402:b940:200::/39 +2402:d340::/32 +2402:db40::/33 +2402:dfc0::/44 +2402:dfc0:40::/43 +2402:e380:15::/48 +2402:e380:100::/40 +2402:e380:302::/48 +2402:e380:306::/48 +2402:e380:308::/48 +2402:e380:30a::/48 +2402:e380:312::/48 +2402:e480::/32 +2402:e740::/32 +2402:e7c0::/32 +2402:e880::/32 +2402:ef40::/32 +2402:f000::/32 +2402:f740:1000::/36 +2402:f740:2000::/36 +2403:c80::/32 +2403:1b80::/48 +2403:1ec0:1200::/48 +2403:1ec0:1610::/48 +2403:2040::/32 +2403:27c0::/32 +2403:2940:1::/48 +2403:2b40::/32 +2403:3140::/32 +2403:4240::/32 +2403:4280::/47 +2403:4b40::/32 +2403:5c80::/48 +2403:5e40::/32 +2403:6380:14::/46 +2403:6380:20::/43 +2403:6380:40::/46 +2403:6a00::/32 +2403:7580::/32 +2403:8080::/32 +2403:8880::/32 +2403:8c00::/32 +2403:9b00::/32 +2403:a100::/48 +2403:a140:10::/48 +2403:a140:100::/40 +2403:a200::/32 +2403:a880::/32 +2403:ac00::/32 +2403:b080::/32 +2403:b400::/32 +2403:c980::/32 +2403:d400::/32 +2403:e7c0:1::/48 +2403:ffc0:1100::/40 +2403:ffc0:1200::/39 +2404:bc0:1::/48 +2404:bc0:4010::/44 +2404:bc0:4110::/44 +2404:bc0:4210::/44 +2404:bc0:4f10::/44 +2404:1c80::/32 +2404:2280:106::/47 +2404:2280:10d::/48 +2404:2280:113::/48 +2404:2280:124::/47 +2404:2280:12e::/48 +2404:2280:147::/48 +2404:2280:1be::/48 +2404:6380::/48 +2404:6380:1000::/48 +2404:6380:8001::/48 +2404:7180:a000::/48 +2404:7180:a010::/48 +2404:7180:a021::/48 +2404:7180:a022::/48 +2404:7180:aa00::/48 +2404:7180:aa10::/48 +2404:7180:b001::/48 +2404:7180:b002::/48 +2404:7180:b010::/48 +2404:7180:b021::/48 +2404:7180:b022::/48 +2404:7180:c001::/48 +2404:7180:c002::/48 +2404:7180:c011::/48 +2404:7180:c012::/48 +2404:7180:f000::/48 +2404:7180:f010::/48 +2404:7240::/33 +2404:7600::/32 +2404:7940::/32 +2404:7ac0:660::/44 +2404:c2c0::/40 +2404:c2c0:240::/44 +2404:c2c0:280::/44 +2404:c2c0:2c0::/44 +2404:c2c0:4000::/40 +2404:c2c0:8000::/36 +2404:c300::/32 +2404:d480::/32 +2404:d7c0:2::/48 +2404:de80::/39 +2404:de80:400::/40 +2404:e280::/47 +2404:e8c0::/32 +2404:ea80:400:2116::/64 +2404:ea80:600:623::/64 +2404:ea80:600:734::/64 +2404:ea80:600:734a::/63 +2404:ea80:600:734c::/64 +2404:ea80:700:100::/63 +2404:ea80:700:113::/64 +2404:ea80:700:695::/64 +2404:ea80:700:696::/63 +2404:ea80:700:696a::/64 +2404:eb40:1::/48 +2404:eb40:2::/47 +2404:eb40:100::/48 +2404:f4c0:1000::/40 +2404:f4c0:1100::/47 +2404:f4c0:5000::/36 +2404:f4c0:e010::/44 +2404:f4c0:ea00::/40 +2404:f4c0:f000::/44 +2404:f4c0:f102::/48 +2404:f4c0:f200::/47 +2404:f4c0:f202::/48 +2404:f4c0:f54e::/48 +2404:f4c0:f601::/48 +2404:f4c0:f602::/47 +2404:f4c0:f607::/48 +2404:f4c0:f608::/47 +2404:f4c0:f60b::/48 +2404:f4c0:f60c::/48 +2404:f4c0:f60f::/48 +2404:f4c0:f900::/47 +2404:f4c0:f90e::/47 +2404:f4c0:fa01::/48 +2404:f4c0:fac0::/44 +2404:f4c0:fb00::/48 +2404:f4c0:fc80::/44 +2404:f4c0:feff::/48 +2404:f4c0:ff00::/47 +2404:f4c0:fff0::/48 +2405:6c0:1::/48 +2405:6c0:2::/48 +2405:6c0:4::/48 +2405:f40:7f40::/48 +2405:f40:7f4a::/48 +2405:f40:7f4f::/48 +2405:f40:7fe2::/48 +2405:f40:7fe4::/48 +2405:f40:7fec::/48 +2405:1480:1000::/48 +2405:1480:2000::/48 +2405:3140:11::/48 +2405:3140:31::/48 +2405:3140:3a::/48 +2405:57c0::/48 +2405:68c0:21::/48 +2405:6940::/48 +2405:6f00::/32 +2405:7040:6000::/47 +2405:84c0:8d00::/40 +2405:84c0:9000::/44 +2405:84c0:9700::/44 +2405:84c0:9800::/44 +2405:84c0:9890::/44 +2405:84c0:99f0::/44 +2405:84c0:9c00::/40 +2405:84c0:fa00::/40 +2405:84c0:ff10::/47 +2405:84c0:ff13::/48 +2405:84c0:ff17::/48 +2405:84c0:ff19::/48 +2405:84c0:ff25::/48 +2405:84c0:ff70::/44 +2405:a3c0::/32 +2405:a900:ffee::/48 +2405:a900:fffe::/48 +2405:d900::/32 +2405:e000::/32 +2405:f3c0::/44 +2405:f3c0:1000::/36 +2405:f580::/32 +2406:280::/32 +2406:840:7::/48 +2406:840:10::/45 +2406:840:20::/48 +2406:840:44::/47 +2406:840:80::/47 +2406:840:100::/47 +2406:840:110::/48 +2406:840:2a0::/48 +2406:840:380::/48 +2406:840:3c0::/48 +2406:840:400::/48 +2406:840:800::/42 +2406:840:840::/48 +2406:840:860::/48 +2406:840:880::/48 +2406:840:c00::/48 +2406:840:c80::/48 +2406:840:1010::/48 +2406:840:1860::/48 +2406:840:4000::/48 +2406:840:5000::/47 +2406:840:5800::/47 +2406:840:5860::/47 +2406:840:5880::/47 +2406:840:8000::/36 +2406:840:ac10::/44 +2406:840:c0a8::/48 +2406:840:e030::/44 +2406:840:e080::/44 +2406:840:e140::/48 +2406:840:e145::/48 +2406:840:e14a::/48 +2406:840:e14d::/48 +2406:840:e180::/44 +2406:840:e800::/48 +2406:840:eb80::/43 +2406:840:f200::/44 +2406:840:f380::/44 +2406:840:f400::/44 +2406:840:f440::/47 +2406:840:fcc0::/44 +2406:840:fd00::/46 +2406:840:fd06::/47 +2406:840:fd0b::/48 +2406:840:fd0c::/48 +2406:840:fe00::/44 +2406:2000:a0::/48 +2406:2700::/32 +2406:3340::/32 +2406:3d80::/32 +2406:4500::/32 +2406:8500::/32 +2406:9dc0:6668::/48 +2406:b640::/40 +2406:cf00::/48 +2406:cf00:1000::/43 +2406:e500::/33 +2406:e580::/32 +2406:e780::/32 +2407:2440:1::/48 +2407:5380::/32 +2407:8b80::/32 +2407:9f00::/32 +2407:ad80::/32 +2407:ae80::/32 +2407:b380::/32 +2407:ba80::/32 +2407:bc00::/32 +2407:c080::/35 +2407:c080:7000::/47 +2407:c080:7800::/44 +2408:4000::/22 +2408:8000::/48 +2408:8000:2::/47 +2408:8000:1000::/36 +2408:8000:2000::/35 +2408:8000:4000::/34 +2408:8000:8000::/33 +2408:8001::/32 +2408:8020::/30 +2408:8024::/31 +2408:8026::/32 +2408:802a:8000::/33 +2408:802c::/32 +2408:8034::/32 +2408:803e::/32 +2408:8056::/32 +2408:805c::/30 +2408:8060::/33 +2408:80c2::/33 +2408:80c5::/33 +2408:80ca::/33 +2408:80ca:8000::/34 +2408:80da::/33 +2408:80da:8000::/34 +2408:80e0:4000::/34 +2408:80e0:8000::/33 +2408:80e2::/33 +2408:80e3:8000::/33 +2408:80e9:4000::/34 +2408:80ea:4000::/34 +2408:80ea:8000::/33 +2408:80f0:4000::/34 +2408:80f0:8000::/33 +2408:80f1::/42 +2408:80f1:40::/43 +2408:80f1:70::/44 +2408:80f1:80::/41 +2408:80f1:100::/43 +2408:80f1:120::/44 +2408:80f1:160::/43 +2408:80f1:180::/43 +2408:80f1:1b0::/44 +2408:80f1:1c0::/43 +2408:80f1:1e0::/44 +2408:80f1:200::/40 +2408:80f5:4000::/34 +2408:80f9:4000::/34 +2408:80fa:4000::/34 +2408:80fa:8000::/33 +2408:8120:1::/48 +2408:8120:2::/48 +2408:8120:7000::/36 +2408:8140:2000::/48 +2408:815f:e000::/35 +2408:81a3:c800::/48 +2408:81a3:ca66::/48 +2408:8206::/31 +2408:8208::/29 +2408:8210::/30 +2408:8214::/31 +2408:821a::/31 +2408:8220::/31 +2408:8226::/32 +2408:822a::/32 +2408:822e::/31 +2408:8230::/29 +2408:8238::/31 +2408:823c::/31 +2408:8240::/32 +2408:8244::/30 +2408:8248::/30 +2408:824c::/32 +2408:824e::/31 +2408:8250::/29 +2408:8258::/30 +2408:825c::/31 +2408:8260::/32 +2408:8262::/31 +2408:8264::/31 +2408:8266::/32 +2408:826a::/32 +2408:826c::/30 +2408:8270::/32 +2408:8274::/30 +2408:8278::/31 +2408:827a::/32 +2408:8306::/31 +2408:8308::/30 +2408:8310::/30 +2408:832e::/31 +2408:8330::/30 +2408:8340::/32 +2408:8344::/30 +2408:8348::/30 +2408:834e::/31 +2408:8350::/29 +2408:8358::/30 +2408:8360::/30 +2408:8364::/31 +2408:836c::/30 +2408:8374::/30 +2408:8378::/31 +2408:837a::/32 +2408:8406::/40 +2408:8406:100::/41 +2408:8406:c00::/40 +2408:8406:d00::/41 +2408:8406:1800::/40 +2408:8406:1900::/41 +2408:8406:2400::/40 +2408:8406:2500::/41 +2408:8406:3000::/40 +2408:8406:3100::/41 +2408:8406:3c00::/40 +2408:8406:3d00::/41 +2408:8406:4800::/40 +2408:8406:4900::/41 +2408:8406:5400::/40 +2408:8406:5500::/41 +2408:8406:6000::/40 +2408:8406:6100::/41 +2408:8406:6c00::/40 +2408:8406:6d00::/41 +2408:8406:7800::/40 +2408:8406:7900::/41 +2408:8406:8400::/40 +2408:8406:8500::/41 +2408:8406:9000::/40 +2408:8406:9100::/41 +2408:8406:9c00::/40 +2408:8406:9d00::/41 +2408:8406:a800::/40 +2408:8406:a900::/41 +2408:8406:b400::/40 +2408:8406:b500::/41 +2408:8409::/41 +2408:8409:80::/42 +2408:8409:c00::/41 +2408:8409:c80::/42 +2408:8409:1800::/41 +2408:8409:1880::/42 +2408:8409:2400::/41 +2408:8409:2480::/42 +2408:8409:3000::/41 +2408:8409:3080::/42 +2408:8409:3c00::/41 +2408:8409:3c80::/42 +2408:8409:4800::/41 +2408:8409:4880::/42 +2408:8409:5400::/41 +2408:8409:5480::/42 +2408:8409:6000::/41 +2408:8409:6080::/42 +2408:8409:6c00::/41 +2408:8409:6c80::/42 +2408:8409:7800::/41 +2408:8409:7880::/42 +2408:8409:8400::/41 +2408:8409:8480::/42 +2408:8409:9000::/41 +2408:8409:9080::/42 +2408:8409:9c00::/41 +2408:8409:9c80::/42 +2408:8409:a800::/41 +2408:8409:a880::/42 +2408:8409:b400::/41 +2408:8409:b480::/42 +2408:840c::/40 +2408:840c:200::/40 +2408:840c:400::/40 +2408:840c:600::/40 +2408:840c:d00::/40 +2408:840c:f00::/40 +2408:840c:1100::/40 +2408:840c:1300::/40 +2408:840c:1a00::/40 +2408:840c:1c00::/40 +2408:840c:1e00::/40 +2408:840c:2000::/40 +2408:840c:2700::/40 +2408:840c:2900::/40 +2408:840c:2b00::/40 +2408:840c:2d00::/40 +2408:840c:3400::/40 +2408:840c:3600::/40 +2408:840c:3800::/40 +2408:840c:3a00::/40 +2408:840c:4e00::/40 +2408:840c:5000::/40 +2408:840c:5200::/40 +2408:840c:5400::/40 +2408:840c:5b00::/40 +2408:840c:5d00::/40 +2408:840c:5f00::/40 +2408:840c:6100::/40 +2408:840c:6800::/40 +2408:840c:6a00::/40 +2408:840c:6c00::/40 +2408:840c:6e00::/40 +2408:840c:7500::/40 +2408:840c:7700::/40 +2408:840c:7900::/40 +2408:840c:7b00::/40 +2408:840c:8200::/40 +2408:840c:8400::/40 +2408:840c:8600::/40 +2408:840c:8800::/40 +2408:840c:8f00::/40 +2408:840c:9100::/40 +2408:840c:9300::/40 +2408:840c:9500::/40 +2408:840c:9c00::/40 +2408:840c:9e00::/40 +2408:840c:a000::/40 +2408:840c:a200::/40 +2408:840c:a900::/40 +2408:840c:ab00::/40 +2408:840c:ad00::/40 +2408:840c:af00::/40 +2408:840c:b600::/40 +2408:840c:b800::/40 +2408:840c:ba00::/40 +2408:840c:bc00::/40 +2408:840c:c300::/40 +2408:840c:c500::/40 +2408:840c:c700::/40 +2408:840c:c900::/40 +2408:840c:d000::/40 +2408:840c:d200::/40 +2408:840c:d400::/40 +2408:840c:d600::/40 +2408:840c:dd00::/40 +2408:840c:de00::/39 +2408:840c:e000::/40 +2408:840d::/42 +2408:840d:200::/42 +2408:840d:d00::/42 +2408:840d:f00::/42 +2408:840d:1a00::/42 +2408:840d:1c00::/42 +2408:840d:2700::/42 +2408:840d:2900::/42 +2408:840d:3400::/42 +2408:840d:3600::/42 +2408:840d:4e00::/42 +2408:840d:5000::/42 +2408:840d:5b00::/42 +2408:840d:5d00::/42 +2408:840d:6800::/42 +2408:840d:6a00::/42 +2408:840d:7500::/42 +2408:840d:7700::/42 +2408:840d:8200::/42 +2408:840d:8400::/42 +2408:840d:8f00::/42 +2408:840d:9100::/42 +2408:840d:9c00::/42 +2408:840d:9e00::/42 +2408:840d:a900::/42 +2408:840d:ab00::/42 +2408:840d:b600::/42 +2408:840d:b800::/42 +2408:840d:c300::/42 +2408:840d:c500::/42 +2408:840d:d000::/42 +2408:840d:d200::/42 +2408:840d:dd00::/42 +2408:840d:de00::/42 +2408:840e:dd00::/40 +2408:840e:de00::/39 +2408:840e:e000::/40 +2408:8410::/30 +2408:8414::/31 +2408:8417::/32 +2408:8418::/32 +2408:841a::/31 +2408:841c::/31 +2408:841e::/32 +2408:8420::/31 +2408:8426::/31 +2408:842a::/31 +2408:842c::/32 +2408:842e::/32 +2408:8431::/32 +2408:8434::/30 +2408:8438::/31 +2408:843c::/30 +2408:8440::/32 +2408:8444::/30 +2408:8448::/32 +2408:844b::/32 +2408:844c::/30 +2408:8452::/31 +2408:8456::/31 +2408:8458::/30 +2408:8460::/30 +2408:8464::/31 +2408:8466::/32 +2408:8469::/32 +2408:846a::/31 +2408:846c::/30 +2408:8470::/31 +2408:8474::/30 +2408:8478::/31 +2408:84e1::/32 +2408:84e2::/31 +2408:84e4::/30 +2408:84e9::/32 +2408:84eb::/32 +2408:84ec::/30 +2408:84f0::/28 +2408:856c::/31 +2408:8606::/31 +2408:8608::/29 +2408:8610::/30 +2408:8614::/31 +2408:861a::/31 +2408:8620::/31 +2408:8624::/31 +2408:8626::/32 +2408:862a::/32 +2408:862e::/31 +2408:8630::/29 +2408:8638::/31 +2408:863c::/31 +2408:8640::/32 +2408:8642::/32 +2408:8644::/30 +2408:8648::/31 +2408:864c::/32 +2408:864e::/31 +2408:8650::/30 +2408:8656::/31 +2408:8658::/30 +2408:865c::/31 +2408:8660::/32 +2408:8662::/31 +2408:8664::/31 +2408:8666::/32 +2408:866a::/32 +2408:866c::/30 +2408:8670::/32 +2408:8674::/31 +2408:8676::/32 +2408:8678::/31 +2408:867a::/32 +2408:8706::/31 +2408:8708::/29 +2408:8710::/30 +2408:8719::/32 +2408:871a::/32 +2408:8720::/30 +2408:8726::/32 +2408:872b::/32 +2408:872f::/32 +2408:8730::/30 +2408:8734::/31 +2408:8736::/32 +2408:8738::/32 +2408:873c::/31 +2408:8740::/32 +2408:8742::/32 +2408:8744::/30 +2408:8748::/29 +2408:8752::/32 +2408:8756::/31 +2408:8758::/30 +2408:875c::/32 +2408:8760::/32 +2408:8762::/31 +2408:8764::/31 +2408:8766::/32 +2408:8768::/32 +2408:876a::/32 +2408:876c::/30 +2408:8770::/32 +2408:8772::/31 +2408:8774::/32 +2408:8776::/31 +2408:8778::/31 +2408:877a::/32 +2408:877c::/30 +2408:8806::/42 +2408:880c::/30 +2408:8810::/29 +2408:8818::/31 +2408:882c::/32 +2408:883a::/32 +2408:8856::/31 +2408:8858::/30 +2408:8862::/31 +2408:8864::/31 +2408:8866::/32 +2408:886e::/31 +2408:8872::/32 +2408:8878::/31 +2408:887e::/32 +2408:890c::/31 +2408:8912::/31 +2408:8914::/30 +2408:891c::/32 +2408:8920::/32 +2408:8924::/32 +2408:892c::/32 +2408:8936::/32 +2408:893a::/32 +2408:8948::/32 +2408:894c::/32 +2408:894e::/32 +2408:8956::/31 +2408:8958::/30 +2408:8962::/31 +2408:8964::/31 +2408:8966::/32 +2408:896c::/32 +2408:896e::/31 +2408:8978::/30 +2408:897e::/32 +2408:8a00:c000::/36 +2408:8a00:d000::/37 +2408:8a00:e000::/35 +2408:8a01::/36 +2408:8a04:e000::/40 +2408:8a06::/47 +2408:8a06:100::/47 +2408:8a07:6000::/38 +2408:8a07:6400::/40 +2408:8a21:4000::/35 +2408:8a22:9200::/39 +2408:8a22:9400::/38 +2408:8a22:9800::/40 +2408:8a22:9a00::/39 +2408:8a22:9c00::/38 +2408:8a22:a000::/37 +2408:8a23:4000::/34 +2408:8a24:4000::/34 +2408:8a26:c000::/35 +2408:8a27:4000::/35 +2409:8000::/20 +240a:2000::/29 +240a:400b::/33 +240a:4082:c000::/35 +240a:408a:c000::/35 +240a:4092:c000::/35 +240a:409a:c000::/35 +240a:40a2:c000::/35 +240a:40aa:c000::/35 +240a:414c::/31 +240a:41cc::/31 +240a:a000::/20 +240a:c000::/20 +240c::/28 +240c:4000::/22 +240c:c000::/20 +240d:4000::/21 +240d:c000:1000::/36 +240d:c000:2000::/35 +240d:c010::/47 +240d:c010:12::/48 +240d:c010:18::/46 +240d:c010:20::/44 +240d:c040::/44 +240e::/20 +2602:fed2:7312::/48 +2602:feda:182::/47 +2602:feda:1b2::/48 +2602:feda:1bf::/48 +2602:feda:1d0::/46 +2602:feda:1d4::/48 +2602:feda:2d0::/47 +2602:feda:2f0::/48 +2602:feda:ae7::/48 +2602:feda:af3::/48 +2602:feda:bf0::/44 +2602:feda:d20::/48 +2602:feda:d30::/44 +2602:feda:d80::/48 +2602:feda:d82::/48 +2605:9d80:8001::/48 +2605:9d80:8011::/48 +2605:9d80:8021::/48 +2605:9d80:8031::/48 +2605:9d80:8041::/48 +2605:9d80:8081::/48 +2605:9d80:9003::/48 +2605:9d80:9013::/48 +2605:9d80:9023::/48 +2605:9d80:9033::/48 +2605:9d80:9042::/48 +2605:9d80:9052::/48 +2605:9d80:9061::/48 +2605:9d80:9071::/48 +2605:9d80:9092::/48 +2804:1e48::/32 +2a04:f580:8000::/48 +2a04:f580:8010::/47 +2a04:f580:8090::/48 +2a04:f580:80a0::/48 +2a04:f580:8200::/48 +2a04:f580:8210::/47 +2a04:f580:8290::/48 +2a04:f580:9000::/47 +2a04:f580:9002::/48 +2a04:f580:9010::/48 +2a04:f580:9012::/47 +2a04:f580:9020::/48 +2a04:f580:9030::/48 +2a04:f580:9040::/48 +2a04:f580:9050::/48 +2a04:f580:9060::/48 +2a04:f580:9070::/48 +2a04:f580:9080::/48 +2a04:f580:9090::/48 +2a04:f580:9200::/47 +2a04:f580:9202::/48 +2a04:f580:9210::/48 +2a04:f580:9212::/47 +2a04:f580:9220::/48 +2a04:f580:9230::/48 +2a04:f580:9240::/48 +2a04:f580:9250::/48 +2a04:f580:9260::/48 +2a04:f580:9270::/48 +2a04:f580:9280::/48 +2a04:f580:9290::/48 +2a05:1082:e000::/40 +2a05:1084:9000::/36 +2a05:1087::/32 +2a07:1c44:7010::/47 +2a07:1c44:7012::/48 +2a07:1c44:7014::/48 +2a07:1c44:8400::/40 +2a07:1c44:9600::/40 +2a07:59c1:30c0::/43 +2a09:4bc7:d020::/44 +2a09:b280:ff81::/48 +2a0a:2842:15::/48 +2a0a:2842:16::/48 +2a0a:2842:aa00::/46 +2a0a:2842:af00::/46 +2a0a:2846::/36 +2a0b:2542::/48 +2a0b:4340:530::/44 +2a0b:4340:540::/44 +2a0c:4a01:c10::/44 +2a0c:4a01:c20::/43 +2a0c:4a01:c40::/44 +2a0c:b641:130::/44 +2a0c:b641:24f::/48 +2a0c:b641:571::/48 +2a0c:b641:572::/48 +2a0d:2583::/32 +2a0d:2584::/32 +2a0d:2682::/32 +2a0e:97c0:330::/48 +2a0e:aa01:1fff::/48 +2a0e:aa06::/40 +2a0e:aa06:450::/44 +2a0e:aa06:490::/44 +2a0e:aa07:e01b::/48 +2a0e:aa07:e01f::/48 +2a0e:aa07:f000::/48 +2a0e:aa07:f004::/47 +2a0e:aa07:f0b0::/48 +2a0e:b107:16::/48 +2a0e:b107:1d6::/47 +2a0e:b107:1d9::/48 +2a0e:b107:1dd::/48 +2a0e:b107:1de::/47 +2a0e:b107:6d0::/44 +2a0e:b107:bd0::/48 +2a0e:b107:c10::/47 +2a0e:b107:c30::/44 +2a0e:b107:da0::/44 +2a0e:b107:dce::/48 +2a0e:b107:e70::/44 +2a0e:b107:ea2::/48 +2a0e:b107:f08::/45 +2a0e:b107:11b0::/44 +2a0e:b107:11c0::/44 +2a0e:b107:12c0::/44 +2a0e:b107:13a0::/44 +2a0e:b107:1420::/43 +2a0e:b107:1460::/44 +2a0e:b107:14a0::/44 +2a0f:5707:ac01::/48 +2a0f:7980::/44 +2a0f:9400:8000::/48 +2a10:1cc7:10::/48 +2a10:2f00:12a::/48 +2a10:2f00:15a::/48 +2a10:2f00:15c::/48 +2a10:cc44:105::/48 +2a10:cc44:109::/48 +2a10:cc44:10c::/48 +2c0f:f7a8:8010::/47 +2c0f:f7a8:8050::/48 +2c0f:f7a8:805f::/48 +2c0f:f7a8:8150::/48 +2c0f:f7a8:815f::/48 +2c0f:f7a8:8210::/47 +2c0f:f7a8:9010::/47 +2c0f:f7a8:9020::/48 +2c0f:f7a8:9041::/48 +2c0f:f7a8:9210::/47 +2c0f:f7a8:9220::/48 +######### END ######### + +© 2021 BGP.space diff --git a/article/jupyter/jupyter_config.md b/article/jupyter/jupyter_config.md new file mode 100644 index 0000000..0cd8e81 --- /dev/null +++ b/article/jupyter/jupyter_config.md @@ -0,0 +1,42 @@ +# Deploy jupyter notebook on server + +## Configuration + +Generate jupyter config file using + +```bash +jupyter notebook --generate-config +``` + +if root is needed, then + +```bash +jupyter notebook --generate-config --allow-config +``` + +Generate password in `jupyter_notebook_config.json` + +```python +In [1]: from notebook.auth import passwd +In [2]: passwd() +Enter password: +Verify password: +Out[2]: 'sha1:bfd19efa9f26:95beb6e644bf1c0472def724538f6458efa9976f' +``` + +Modify `jupyter_notebook_config.py` + +```python +c.NotebookApp.ip='*' +c.NotebookApp.password = u'sha:xxxxxx' +c.NotebookApp.open_browser = False +c.NotebookApp.port =8888 +``` + +Install gophernotes + +```bash +go get -u github.com/gopherdata/gophernotes +mkdir -p ~/.local/share/jupyter/kernels/gophernotes +cp $GOPATH/src/github.com/gopherdata/gophernotes/kernel/* ~/.local/share/jupyter/kernels/gophernotes +``` \ No newline at end of file diff --git a/article/mermaid.md b/article/mermaid.md new file mode 100644 index 0000000..9e41086 --- /dev/null +++ b/article/mermaid.md @@ -0,0 +1,54 @@ +# Markdown documents using mermaid + +## Flowchart + +```mermaid +graph TD; + A-->B; + A-->C; + B-->D; + C-->D; +``` + +## Sequence Diagram + +```mermaid +sequenceDiagram + Alice->>Bob: Hello Bob, how are you? + alt is sick + Bob->>Alice: Not so good :( + else is well + Bob->>Alice: Feeling fresh like a daisy + end + opt Extra response + Bob->>Alice: Thanks for asking + end +``` + +## Class Diagram + +```mermaid +classDiagram + Animal <|-- Duck + Animal <|-- Fish + Animal <|-- Zebra + + Animal : +int age + Animal : +String gender + Animal: +isMammal() + Animal: +mate() + + class Duck { + +String beakColor + +swim() + +quack() + } + class Fish { + -int sizeInFeet + -canEat() + } + class Zebra { + +bool is_wild + +run() + } +``` diff --git a/article/mitmproxy.md b/article/mitmproxy.md new file mode 100644 index 0000000..0b1ed06 --- /dev/null +++ b/article/mitmproxy.md @@ -0,0 +1,21 @@ +# mitmproxy + +## Installation + +```bash +yay -S mitmproxy +``` + +## Usage + +### Preparation + +Activate mitmproxy and listen to port: + +```bash +mitmproxy -p 8888 +``` + +Set your wifi connection to manual proxy, IP address can be found using `ip address` or `ifconfig`, and set port to 8888. + +Then open your browser and locate to `mitm.it` and choose cert. For example, I choose Android. diff --git a/article/mysql/backup.md b/article/mysql/backup.md new file mode 100644 index 0000000..f77d524 --- /dev/null +++ b/article/mysql/backup.md @@ -0,0 +1,33 @@ +# Mysql Config + +## Backup and recover + +### Backup + +Backup all databases schema with data: + +```bash +mysqldump -uroot -p123456 -h localhost -P 3306 --all-databases --default-character-set=utf8 --single-transaction > all.sql +``` + +Bakcup specified database + +### Restore Databases + +```bash +mysql -uroot -p123456 < all.sql +``` + +## User Config + +### Creation + +```bash +create user 'work'@'%' identified by '123456'; +``` + +### Grant privileges + +```bash +grant all on *.* to 'work'@'%'; +``` \ No newline at end of file diff --git a/article/mysql/mariadb.md b/article/mysql/mariadb.md new file mode 100644 index 0000000..bf00d82 --- /dev/null +++ b/article/mysql/mariadb.md @@ -0,0 +1,37 @@ +# Mariadb Memo + +## Initialize Mariadb + +Basic user and dir config, using: + +```bash +mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql +``` + +## Security Configuration + +```bash +mysql_secure_installation +``` + +Mariadb can login as system user root without password. Usually root can only be allowed to login from localhost. + +## Create Operation Users + +Create a user with CRUD access: + +```bash +create user demo_rw@'%' IDENTIFIED by 'your password'; +``` + +Then grant access: + +```bash +grant select, insert, update, delete on `demo`.* to 'demo_rw'@'%'; +``` + +And refresh privilages: + +```bash +flush privileges; +``` diff --git a/article/os/linux/apifox.md b/article/os/linux/apifox.md new file mode 100644 index 0000000..2803fe3 --- /dev/null +++ b/article/os/linux/apifox.md @@ -0,0 +1,17 @@ +# apifox + +## Create desktop icon + + +```bash +cat > ~/.local/share/applications/Apifox.desktop <> /mnt/etc/fstab +``` + +检查生成的文件是否正确: + +```bash +cat /mnt/etc/fstab +``` + +## 5.2 配置系统 + +```bash +arch-chroot /mnt +``` + +如果系统出现问题,只要插入 U 盘启动,然后将系统根分区挂载到 `/mnt` 下,再通过命令即可进行修复。 + +### 设置时区 + +```bash +ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +hwclock --systohc +``` + +### 安装必须的软件包 + +```bash +pacman -S vim dialog wpa_supplicant ntfs-3g networkmanager +``` + +### 设置 locale + +```bash +vim /etc/locale.gen +``` + +设置 `en_US.UTF-8` 然后执行 `locale-gen`。 + +```bash +echo "LANG=en_US.UTF-8" >> /etc/locale.conf +echo $hostname >> /etc/hostname +``` + +### 设置 hosts + +编辑 `/etc/hosts`,加入 + +```text +127.0.0.1 localhost +::1 localhost +``` + +### 设置 root 密码 + +```bash +passwd +``` + +### 安装 intel-ucode + +非 intel CPU 跳过 + +```bash +pacman -S intel-ucode +``` + +### 配置 boot + +```bash +pacman -S os-prober ntfs-3g grub +``` + +部署 grub: + +```bash +grub-install --target=i386-pc /dev/sdx +``` + +生成配置文件: + +```bash +grub-mkconfig -o /boot/grub/grub.cfg +``` + +### 重启 + +```bash +exit +reboot +``` diff --git a/article/os/linux/archlinux/debtap.md b/article/os/linux/archlinux/debtap.md new file mode 100644 index 0000000..d857f87 --- /dev/null +++ b/article/os/linux/archlinux/debtap.md @@ -0,0 +1,143 @@ +# Debtap – Convert DEB Packages Into Arch Linux Packages + +For this purpose, we are going to use an utility called “Debtap”. It stands DEB To Arch (Linux) Package. Debtap is available in AUR, so you can install it using the AUR helper tools such as Yay. + +To unstall debtap using pacaur, run: + +```bash +$ yay -S debtap +``` + +And, make sure your Arch system should have bash, binutils, pkgfile and fakeroot packages installed. + +After installing Debtap and all above mentioned dependencies, run the following command to create/update pkgfile and debtap database. + +```bash +$ sudo debtap -u +``` + +Sample output would be: + +```bash +==> Synchronizing pkgfile database... +:: Updating 6 repos... + download complete: archlinuxfr [ 151.7 KiB 67.5K/s 5 remaining] + download complete: multilib [ 319.5 KiB 36.2K/s 4 remaining] + download complete: core [ 707.7 KiB 49.5K/s 3 remaining] + download complete: testing [ 1716.3 KiB 58.2K/s 2 remaining] + download complete: extra [ 7.4 MiB 109K/s 1 remaining] + download complete: community [ 16.9 MiB 131K/s 0 remaining] +:: download complete in 131.47s < 27.1 MiB 211K/s 6 files > +:: waiting for 1 process to finish repacking repos... +==> Synchronizing debtap database... + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed +100 34.1M 100 34.1M 0 0 206k 0 0:02:49 0:02:49 --:--:-- 180k + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed +100 814k 100 814k 0 0 101k 0 0:00:08 0:00:08 --:--:-- 113k + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed +100 120k 100 120k 0 0 61575 0 0:00:02 0:00:02 --:--:-- 52381 + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed +100 35.4M 100 35.4M 0 0 175k 0 0:03:27 0:03:27 --:--:-- 257k +==> Downloading latest virtual packages list... + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed +100 149 0 149 0 0 49 0 --:--:-- 0:00:03 --:--:-- 44 +100 11890 0 11890 0 0 2378 0 --:--:-- 0:00:05 --:--:-- 8456 +==> Downloading latest AUR packages list... + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed +100 264k 0 264k 0 0 30128 0 --:--:-- 0:00:09 --:--:-- 74410 +==> Generating base group packages list... +==> All steps successfully completed! +``` + +You must run the above command at least once. + +Now, it’s time for package conversion. + +To convert any DEB package, say Quadrapassel, to Arch Linux package using debtap, do: + +```bash +$ debtap quadrapassel_3.22.0-1.1_arm64.deb +``` + +The above command will convert the given .deb file into a Arch Linux package. You will be asked to enter the name of the package maintainer and license. Just enter them and hit ENTER key to start the conversion process. + +The package conversion will take from a few seconds to several minutes depending upon your CPU speed. Grab a cup of coffee. + +Sample output would be: + +```bash +==> Extracting package data... +==> Fixing possible directories structure differencies... +==> Generating .PKGINFO file... + +:: Enter Packager name: +quadrapassel + +:: Enter package license (you can enter multiple licenses comma separated): +GPL + +*** Creation of .PKGINFO file in progress. It may take a few minutes, please wait... + +Warning: These dependencies (depend = fields) could not be translated into Arch Linux packages names: +gsettings-backend + +==> Checking and generating .INSTALL file (if necessary)... + +:: If you want to edit .PKGINFO and .INSTALL files (in this order), press (1) For vi (2) For nano (3) For default editor (4) For a custom editor or any other key to continue: + +==> Generating .MTREE file... + +==> Creating final package... +==> Package successfully created! +==> Removing leftover files... +``` + +Note: Quadrapassel package is already available in the Arch Linux official repositories. I used it just for demonstration purpose. + +If you don’t want to answer any questions during package conversion, use -q flag to bypass all questions, except for editing metadata file(s). + +```bash +$ debtap -q quadrapassel_3.22.0-1.1_arm64.deb +``` + +To bypass all questions (not recommended though), use -Q flag. + +```bash +$ debtap -Q quadrapassel_3.22.0-1.1_arm64.deb +``` + +Once the conversion is done, you can install the newly converted package using “pacman” in your Arch system as shown below. + +```bash +$ sudo pacman -U +``` + +To display the help section, use *-h* flag: + +```bash +$ debtap -h +Syntax: debtap [options] package_filename + +Options: + + -h --h -help --help Prints this help message + -u --u -update --update Update debtap database + -q --q -quiet --quiet Bypass all questions, except for editing metadata file(s) + -Q --Q -Quiet --Quiet Bypass all questions (not recommended) + -s --s -pseudo --pseudo Create a pseudo-64-bit package from a 32-bit .deb package + -w --w -wipeout --wipeout Wipeout versions from all dependencies, conflicts etc. + -p --p -pkgbuild --pkgbuild Additionally generate a PKGBUILD file + -P --P -Pkgbuild --Pkgbuild Generate a PKGBUILD file only +``` + +And, that’s all for now folks. Hope this utility helps. If you find our guides useful, please spend a moment to share them on your social, professional networks and support OSTechNix! + +More good stuffs to come. Stay tuned! + +Cheers! diff --git a/article/os/linux/centos/install-tools.md b/article/os/linux/centos/install-tools.md new file mode 100644 index 0000000..20c852c --- /dev/null +++ b/article/os/linux/centos/install-tools.md @@ -0,0 +1,104 @@ +# Install some useful tool on CentOS 6u3 + +## Compile and install tmux v2.3 + +```bash +if [[ $(fs --version) =~ "afs" ]] && fs whereis "$HOME/..local" ; then + NCURSES_OPTION=" --enable-symlinks" +else + NCURSES_OPTION="" +fi + + +./configure CFLAGS="-I$HOME/.local/include -I$HOME/.local/include/ncurses" LDFLAGS="-L$HOME/.local/lib -L$HOME/.local/include/ncurses -L$HOME/.local/include" CPPFLAGS="-I$HOME/.local/include -I$HOME/.local/include/ncurses" LDFLAGS="-static -L$HOME/.local/include -L$HOME/.local/include/ncurses -L$HOME/.local/lib" --prefix=$HOME/.local +make +make install +``` + +## Compile vim 8.1 + +### Based on system Python + +```bash +./configure \ + --disable-nls \ + --enable-cscope \ + --enable-gui=no \ + --enable-multibyte \ + --prefix=$HOME/.local/vim \ + --with-features=huge \ + --enable-python3interp=yes \ + --with-python3-config-dir=$HOME/.local/python-3.7/lib/python3.7/config-3.7m-x86_64-linux-gnu \ + --enable-perlinterp=yes \ + --enable-luainterp=yes \ + --enable-rubyinterp=yes \ + --with-tlib=ncurses \ + --without-x +``` + +### Base on Anaconda Python + +```bash +./configure --enable-terminal --enable-gui=auto \ + --with-features=huge \ + --enable-multibyte \ + --enable-cscope --enable-terminal --enable-gui=auto \ + --prefix=$HOME/.local \ + --enable-python3interp \ + --with-python3-config-dir=$HOME/.local/anaconda3/lib/python3.6/config \ + --includedir=$HOME/.local/anaconda3/include \ + LDFLAGS=" -L$HOME/.local/anaconda3/lib -L$HOME/.local/anaconda3/lib/python3.6/config-3.6m-x86_64-linux-gnu" + +make +make install +``` + +如果 `make install` 显示写入 `/usr/local` 目录无权限,进入 `vim-$(version)/src` 文件夹,编辑 Makefile 文件,修改 prefix 路径为 `$HOME/.local` 即可。 安装完成后,vim 的位置是 `$HOME/.local/bin/vim`。 + +### Base on Anaconda Python 3.8 + +```bash +VIM_CODE=$HOME/download/vim-8.2.2767 +CONF=$VIM_CODE/configure +$CONF \ + --enable-terminal \ + --enable-gui=no \ + --with-features=huge \ + --enable-multibyte \ + --enable-cscope=yes \ + --prefix=$HOME/.local/vim \ + --enable-python3interp=yes \ + --with-python3-config-dir="$HOME/.local/anaconda3/lib/python3.8/config-3.8-x86_64-linux-gnu" \ + --includedir="$HOME/.local/anaconda3/include" \ + LDFLAGS=" -L/usr/lib -L/usr/local/lib -L/usr/lib64 -L$HOME/.local/anaconda3/lib -L$HOME/.local/anaconda3/lib/python3.8/config-3.8-x86_64-linux-gnu" + # --with-tlib=ncurses \ +``` + +## Compile git version 2.27 + +### Install reliance + +root is required! + +```bash +yum -y install zlib-devel curl-devel openssl-devel perl cpio expat-devel gettext-devel openssl zlib autoconf tk perl-ExtUtils-MakeMaker +``` + +### Compile git + +```bash +cd /path/to/git/source +./configure --prefix=/usr +make +make install +``` + +## Compile Redis + +```bash +$ wget http://download.redis.io/releases/redis-5.0.7.tar.gz +$ tar xzf redis-5.0.7.tar.gz +$ cd redis-5.0.7 +$ make +# make install +``` diff --git a/article/os/linux/chattr.md b/article/os/linux/chattr.md new file mode 100644 index 0000000..651cc53 --- /dev/null +++ b/article/os/linux/chattr.md @@ -0,0 +1,10 @@ +# Protect Specified Folder on Linux + +## chattr + +Just type the following command to protect your folder or file `$path` from being removed by command `rm` or `sudo rm -rf`. + +```bash +chattr -R +i $path +``` + diff --git a/article/os/linux/crontab.md b/article/os/linux/crontab.md new file mode 100644 index 0000000..f74833f --- /dev/null +++ b/article/os/linux/crontab.md @@ -0,0 +1,11 @@ +# crontab usage + +## Get yesterday + +`%` 需要做转义 + +``` +0 9 * * * python2.6 $HOME/.local/cron/disk_monitor.py +9 0 * * * curl "http://localhost:8000/sync?query_date=$(date -d 'yesterday' +\%Y-\%m-\%d)" +``` + diff --git a/article/os/linux/cuda.md b/article/os/linux/cuda.md new file mode 100644 index 0000000..89d1f29 --- /dev/null +++ b/article/os/linux/cuda.md @@ -0,0 +1,19 @@ +# Cuda Config + +## Nvidia Driver Installation + +Open settings and install selected nvidia driver, then install essential packages required by cuda. + +> PS: Here I'm using linux54 with nvidia driver version 450xx + +```bash +yay -S linux54-nvidia-450xx nvidia-450xx-utils opencl-nvidia-450xx lib32-nvidia-450xx-utils +``` + +## Cuda Installation + +```bash +yay -S cuda +``` + +Run `nvidia-smi` to check nvidia driver. diff --git a/article/os/linux/file.md b/article/os/linux/file.md new file mode 100644 index 0000000..62c613e --- /dev/null +++ b/article/os/linux/file.md @@ -0,0 +1,18 @@ +# Linux + +## 匿名映射 + +使用映射区完成文件的读写十分方便,父子进程间通信也容易,但缺陷是每次创建映射区一定要依赖一个文件才能实现。通常为了创建映射区要 open 一个 temp 文件,创建好了再进行 unlink、close,这样比较麻烦,可以直接使用匿名映射来替代。Linux 系统提供了创建匿名映射区的方法,无需依赖文件即可创建映射区,同样需要借助标志位参数 flags 来指定。使用 `MAP_ANONYMOUS`(or `MAP_ANON`) 如: + +```c +int *p = mmap(NULL, 4, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); +``` + +4 是举例表明该位置表大小,可依据实际需要填写。 + +需要注意的是 `MAP_ANONYMOUS` 是 Linux 操作系统特有的宏,在类 Unix 系统中如果没有该宏的定义,可使用如下两步完成匿名映射区的建立: + +```c +fd = open("/dev/zero", O_RDWR); +p = mmap(NULL, 4, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); +``` diff --git a/article/os/linux/handshake.md b/article/os/linux/handshake.md new file mode 100644 index 0000000..35f9896 --- /dev/null +++ b/article/os/linux/handshake.md @@ -0,0 +1,21 @@ +# Detect wlans + +```bash +airmon-ng +``` + +Start monitor mode + +```bash +airmon-ng start wlan1 +ifconfig +airodump-ng wlan1mon +airodump-ng -w /path/to/save/files/ -c 1 --bssid WL:AN:MAC wlan1mon +aireplay-ng -0 10 -a WLAN:MAC -c DEVICE:MAC wlan1mon +``` + +Stop monitor mode + +```bash +airmon-ng stop wlan1mon +``` diff --git a/article/os/linux/kali.md b/article/os/linux/kali.md new file mode 100644 index 0000000..0b8ac72 --- /dev/null +++ b/article/os/linux/kali.md @@ -0,0 +1,34 @@ +# Kali Config + +## openvpn config + +```bash +sudo apt install openresolv +``` + +## add user + +```bash +useradd -m username +passwd username +usermod -a -G sudo username +chsh -s /bin/zsh username +``` + +## change group name + +```bash +groupmod -n admin $old_name +``` + +## add sudo group + +```bash +groupadd sudo +``` + +## add user to group + +```bash +usermod -aG sudo ${USER} +``` diff --git a/article/os/linux/postman.md b/article/os/linux/postman.md new file mode 100644 index 0000000..8bfdfc8 --- /dev/null +++ b/article/os/linux/postman.md @@ -0,0 +1,22 @@ +# Install Postman app on Linux based on Debian + +```bash +sudo tar -xzf postman.tar.gz -C /opt +rm postman.tar.gz +sudo ln -s /opt/Postman/Postman /usr/bin/postman +``` + +Create a desktop file for launcher + +```bash +cat > ~/.local/share/applications/postman.desktop <.jdk +``` + +Remove plugins + +```bash +sudo rm -rf /Library/PreferencePanes/JavaControlPanel.prefPane +sudo rm -rf /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin +sudo rm -rf /Library/LaunchAgents/com.oracle.java.Java-Updater.plist +sudo rm -rf /Library/PrivilegedHelperTools/com.oracle.java.JavaUpdateHelper +sudo rm -rf /Library/LaunchDaemons/com.oracle.java.Helper-Tool.plist +sudo rm -rf /Library/Preferences/com.oracle.java.Helper-Tool.plist +``` + diff --git a/article/os/mac/brew.md b/article/os/mac/brew.md new file mode 100644 index 0000000..99880e4 --- /dev/null +++ b/article/os/mac/brew.md @@ -0,0 +1,40 @@ +# MAC 配置 brew + +## 更改 brew 源为中科院镜像 + +```bash +git clone git://mirrors.ustc.edu.cn/homebrew-core.git/ /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core --depth=1 +``` + +## 把 homebrew-core 的镜像地址设为中科院的国内镜像 + +```bash +cd "$(brew --repo)" +git remote set-url origin https://mirrors.ustc.edu.cn/brew.git +cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core" +git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git +``` + +## 更改为清华镜像 + +```bash +cd "$(brew --repo)" +git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git +cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core" +git remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git +``` + +## 恢复为 github + +```bash +cd "$(brew --repo)" +git remote set-url origin https://github.com/Homebrew/brew +cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core" +git remote set-url origin https://github.com/Homebrew/homebrew-core +``` + +更换为国内源 + +```bash +/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" +``` diff --git a/article/os/win10/wsl.md b/article/os/win10/wsl.md new file mode 100644 index 0000000..18d7a63 --- /dev/null +++ b/article/os/win10/wsl.md @@ -0,0 +1,43 @@ +# 修复 WSL 子系统文件权限 + +## 创建 wsl.conf 文件 + +```sh +$ vim /etc/wsl.conf +``` + +写入 + +```text +[automount] +enabled = true +# root = /mnt/ +options = "metadata,umask=22,fmask=11" +# mountFsTab = false +``` + +## 配置 bashrc 或者 zshrc + +```sh +if [ "$(umask)" = "0000" ]; then + umask 0022 +fi +``` + +> 参考[文章](https://www.turek.dev/post/fix-wsl-file-permissions/) + +## 备份和恢复 + +### 备份 + +打开 powershell + +```ps +wsl --export Debian debian.tar +``` + +### 恢复 + +```ps +wsl --import Debian debian.tar +``` diff --git a/article/tex/cone.tex b/article/tex/cone.tex new file mode 100644 index 0000000..079151b --- /dev/null +++ b/article/tex/cone.tex @@ -0,0 +1,42 @@ +% A cone in 3D +% Author: Marco Daniel +\documentclass{article} +\usepackage{tikz} +%%%< +\usepackage{verbatim} +\usepackage[active,tightpage]{preview} +\PreviewEnvironment{tikzpicture} +\setlength\PreviewBorder{5pt}% +%%%> +\begin{comment} +:Title: A Cone in 3D +:Tags: 2D,geometry,mathematics +:Author: Marco Daniel +:Slug: cone + +\end{comment} +\usepackage{tikz-3dplot} +\begin{document} + +\tdplotsetmaincoords{70}{0} +\begin{tikzpicture}[tdplot_main_coords] +\def\RI{2} +\def\RII{1.25} + +\draw[thick] (\RI,0) + \foreach \x in {0,300,240,180} { -- (\x:\RI) node at (\x:\RI) (R1-\x) {} }; +\draw[dashed,thick] (R1-0.center) + \foreach \x in {60,120,180} { -- (\x:\RI) node at (\x:\RI) (R1-\x) {} }; +\path[fill=gray!30] (\RI,0) + \foreach \x in {0,60,120,180,240,300} { -- (\x:\RI)}; + +\begin{scope}[yshift=2cm] +\draw[thick,fill=gray!30,opacity=0.2] (\RII,0) + \foreach \x in {0,60,120,180,240,300,360} { -- (\x:\RII) node at (\x:\RII) (R2-\x) {}}; +\end{scope} + +\foreach \x in {0,180,240,300} { \draw (R1-\x.center)--(R2-\x.center); }; +\foreach \x in {60,120} { \draw[dashed] (R1-\x.center)--(R2-\x.center); }; +\end{tikzpicture} + +\end{document} \ No newline at end of file diff --git a/article/wireshark/wirshark.md b/article/wireshark/wirshark.md new file mode 100644 index 0000000..c6e9322 --- /dev/null +++ b/article/wireshark/wirshark.md @@ -0,0 +1,17 @@ +# Wireshark installation + +```bash +yay -S wireshark-gtk +``` + +## add user to group + +```bash +gpasswd -a $(whoami) wireshark +``` + +exec wireshark without relogin + +```bash +newgrp wireshark +``` diff --git a/config/alacritty/alacritty.yml b/config/alacritty/alacritty.yml new file mode 100644 index 0000000..3f60cc5 --- /dev/null +++ b/config/alacritty/alacritty.yml @@ -0,0 +1,908 @@ +# Configuration for Alacritty, the GPU enhanced terminal emulator. + +# Import additional configuration files +# +# Imports are loaded in order, skipping all missing files, with the importing +# file being loaded last. If a field is already present in a previous import, it +# will be replaced. +# +# All imports must either be absolute paths starting with `/`, or paths relative +# to the user's home directory starting with `~/`. +#import: +# - /path/to/alacritty.yml + +# Any items in the `env` entry below will be added as +# environment variables. Some entries may override variables +# set by alacritty itself. +#env: + # TERM variable + # + # This value is used to set the `$TERM` environment variable for + # each instance of Alacritty. If it is not present, alacritty will + # check the local terminfo database and use `alacritty` if it is + # available, otherwise `xterm-256color` is used. + #TERM: alacritty + +window: + # Window dimensions (changes require restart) + # + # Number of lines/columns (not pixels) in the terminal. The number of columns + # must be at least `2`, while using a value of `0` for columns and lines will + # fall back to the window manager's recommended size. + dimensions: + columns: 0 + lines: 0 + + # Window position (changes require restart) + # + # Specified in number of pixels. + # If the position is not set, the window manager will handle the placement. + #position: + # x: 0 + # y: 0 + + # Window padding (changes require restart) + # + # Blank space added around the window in pixels. This padding is scaled + # by DPI and the specified value is always added at both opposing sides. + #padding: + # x: 0 + # y: 0 + + # Spread additional padding evenly around the terminal content. + #dynamic_padding: false + + # Window decorations + # + # Values for `decorations`: + # - full: Borders and title bar + # - none: Neither borders nor title bar + # + # Values for `decorations` (macOS only): + # - transparent: Title bar, transparent background and title bar buttons + # - buttonless: Title bar, transparent background and no title bar buttons + decorations: none + + # Background opacity + # + # Window opacity as a floating point number from `0.0` to `1.0`. + # The value `0.0` is completely transparent and `1.0` is opaque. + #opacity: 1.0 + + # Startup Mode (changes require restart) + # + # Values for `startup_mode`: + # - Windowed + # - Maximized + # - Fullscreen + # + # Values for `startup_mode` (macOS only): + # - SimpleFullscreen + startup_mode: Maximized + + # Window title + #title: Alacritty + + # Allow terminal applications to change Alacritty's window title. + dynamic_title: true + + # Window class (Linux/BSD only): + #class: + # Application instance name + #instance: Alacritty + # General application class + #general: Alacritty + + # GTK theme variant (Linux/BSD only) + # + # Override the variant of the GTK theme. Commonly supported values are `dark` + # and `light`. Set this to `None` to use the default theme variant. + #gtk_theme_variant: None + +#scrolling: + # Maximum number of lines in the scrollback buffer. + # Specifying '0' will disable scrolling. + history: 10000 + + # Scrolling distance multiplier. + multiplier: 3 + +# Font configuration +font: + # Normal (roman) font face + normal: + # Font family + # + # Default: + # - (macOS) Menlo + # - (Linux/BSD) monospace + # - (Windows) Consolas + family: "MesloLGL Nerd Font" + + # The `style` can be specified to pick a specific face. + #style: Regular + + # Bold font face + bold: + # Font family + # + # If the bold family is not specified, it will fall back to the + # value specified for the normal font. + #family: monospace + family: "MesloLGL Nerd Font" + + # The `style` can be specified to pick a specific face. + #style: Bold + + # Italic font face + italic: + # Font family + # + # If the italic family is not specified, it will fall back to the + # value specified for the normal font. + #family: monospace + family: "MesloLGL Nerd Font" + + # The `style` can be specified to pick a specific face. + #style: Italic + + # Bold italic font face + bold_italic: + # Font family + # + # If the bold italic family is not specified, it will fall back to the + # value specified for the normal font. + #family: monospace + family: "MesloLGL Nerd Font" + + # The `style` can be specified to pick a specific face. + #style: Bold Italic + + # Point size + size: 12.0 + + # Offset is the extra space around each character. `offset.y` can be thought + # of as modifying the line spacing, and `offset.x` as modifying the letter + # spacing. + #offset: + # x: 0 + # y: 0 + + # Glyph offset determines the locations of the glyphs within their cells with + # the default being at the bottom. Increasing `x` moves the glyph to the + # right, increasing `y` moves the glyph upward. + #glyph_offset: + # x: 0 + # y: 0 + + # Thin stroke font rendering (macOS only) + # + # Thin strokes are suitable for retina displays, but for non-retina screens + # it is recommended to set `use_thin_strokes` to `false`. + #use_thin_strokes: true + +# If `true`, bold text is drawn using the bright color variants. +#draw_bold_text_with_bright_colors: false + +# Colors (Tomorrow Night) +#colors: + # Default colors + #primary: + # background: '#1d1f21' + # foreground: '#c5c8c6' + + # Bright and dim foreground colors + # + # The dimmed foreground color is calculated automatically if it is not + # present. If the bright foreground color is not set, or + # `draw_bold_text_with_bright_colors` is `false`, the normal foreground + # color will be used. + #dim_foreground: '#828482' + #bright_foreground: '#eaeaea' + + # Cursor colors + # + # Colors which should be used to draw the terminal cursor. + # + # Allowed values are CellForeground/CellBackground, which reference the + # affected cell, or hexadecimal colors like #ff00ff. + #cursor: + # text: CellBackground + # cursor: CellForeground + + # Vi mode cursor colors + # + # Colors for the cursor when the vi mode is active. + # + # Allowed values are CellForeground/CellBackground, which reference the + # affected cell, or hexadecimal colors like #ff00ff. + #vi_mode_cursor: + # text: CellBackground + # cursor: CellForeground + + # Search colors + # + # Colors used for the search bar and match highlighting. + #search: + # Allowed values are CellForeground/CellBackground, which reference the + # affected cell, or hexadecimal colors like #ff00ff. + #matches: + # foreground: '#000000' + # background: '#ffffff' + #focused_match: + # foreground: '#ffffff' + # background: '#000000' + + #bar: + # background: '#c5c8c6' + # foreground: '#1d1f21' + + # Keyboard regex hints + #hints: + # First character in the hint label + # + # Allowed values are CellForeground/CellBackground, which reference the + # affected cell, or hexadecimal colors like #ff00ff. + #start: + # foreground: '#1d1f21' + # background: '#e9ff5e' + + # All characters after the first one in the hint label + # + # Allowed values are CellForeground/CellBackground, which reference the + # affected cell, or hexadecimal colors like #ff00ff. + #end: + # foreground: '#e9ff5e' + # background: '#1d1f21' + + # Line indicator + # + # Color used for the indicator displaying the position in history during + # search and vi mode. + # + # By default, these will use the opposing primary color. + #line_indicator: + # foreground: None + # background: None + + # Selection colors + # + # Colors which should be used to draw the selection area. + # + # Allowed values are CellForeground/CellBackground, which reference the + # affected cell, or hexadecimal colors like #ff00ff. + #selection: + # text: CellBackground + # background: CellForeground + + # Normal colors + #normal: + # black: '#1d1f21' + # red: '#cc6666' + # green: '#b5bd68' + # yellow: '#f0c674' + # blue: '#81a2be' + # magenta: '#b294bb' + # cyan: '#8abeb7' + # white: '#c5c8c6' + + # Bright colors + #bright: + # black: '#666666' + # red: '#d54e53' + # green: '#b9ca4a' + # yellow: '#e7c547' + # blue: '#7aa6da' + # magenta: '#c397d8' + # cyan: '#70c0b1' + # white: '#eaeaea' + + # Dim colors + # + # If the dim colors are not set, they will be calculated automatically based + # on the `normal` colors. + #dim: + # black: '#131415' + # red: '#864343' + # green: '#777c44' + # yellow: '#9e824c' + # blue: '#556a7d' + # magenta: '#75617b' + # cyan: '#5b7d78' + # white: '#828482' + + # Indexed Colors + # + # The indexed colors include all colors from 16 to 256. + # When these are not set, they're filled with sensible defaults. + # + # Example: + # `- { index: 16, color: '#ff00ff' }` + # + #indexed_colors: [] + + # Transparent cell backgrounds + # + # Whether or not `window.opacity` applies to all cell backgrounds or only to + # the default background. When set to `true` all cells will be transparent + # regardless of their background color. + #transparent_background_colors: false + +# Colors (Solarized Dark) +colors: + # Default colors + primary: + background: '#002b36' # base03 + foreground: '#839496' # base0 + + # Cursor colors + cursor: + text: '#002b36' # base03 + cursor: '#839496' # base0 + + # Normal colors + normal: + black: '#073642' # base02 + red: '#dc322f' # red + green: '#859900' # green + yellow: '#b58900' # yellow + blue: '#268bd2' # blue + magenta: '#d33682' # magenta + cyan: '#2aa198' # cyan + white: '#eee8d5' # base2 + + # Bright colors + bright: + black: '#002b36' # base03 + red: '#cb4b16' # orange + green: '#586e75' # base01 + yellow: '#657b83' # base00 + blue: '#839496' # base0 + magenta: '#6c71c4' # violet + cyan: '#93a1a1' # base1 + white: '#fdf6e3' # base3 + +# Bell +# +# The bell is rung every time the BEL control character is received. +bell: + # Visual Bell Animation + # + # Animation effect for flashing the screen when the visual bell is rung. + # + # Values for `animation`: + # - Ease + # - EaseOut + # - EaseOutSine + # - EaseOutQuad + # - EaseOutCubic + # - EaseOutQuart + # - EaseOutQuint + # - EaseOutExpo + # - EaseOutCirc + # - Linear + animation: EaseOutExpo + + # Duration of the visual bell flash in milliseconds. A `duration` of `0` will + # disable the visual bell animation. + duration: 0 + + # Visual bell animation color. + #color: '#ffffff' + + # Bell Command + # + # This program is executed whenever the bell is rung. + # + # When set to `command: None`, no command will be executed. + # + # Example: + # command: + # program: notify-send + # args: ["Hello, World!"] + # + #command: None + +selection: + # This string contains all characters that are used as separators for + # "semantic words" in Alacritty. + semantic_escape_chars: ",│`|:\"' ()[]{}<>\t" + + # When set to `true`, selected text will be copied to the primary clipboard. + save_to_clipboard: true + +cursor: + # Cursor style + style: + # Cursor shape + # + # Values for `shape`: + # - ▇ Block + # - _ Underline + # - | Beam + shape: Block + + # Cursor blinking state + # + # Values for `blinking`: + # - Never: Prevent the cursor from ever blinking + # - Off: Disable blinking by default + # - On: Enable blinking by default + # - Always: Force the cursor to always blink + blinking: Off + + # Vi mode cursor style + # + # If the vi mode cursor style is `None` or not specified, it will fall back to + # the style of the active value of the normal cursor. + # + # See `cursor.style` for available options. + #vi_mode_style: None + + # Cursor blinking interval in milliseconds. + #blink_interval: 750 + + # If this is `true`, the cursor will be rendered as a hollow box when the + # window is not focused. + #unfocused_hollow: true + + # Thickness of the cursor relative to the cell width as floating point number + # from `0.0` to `1.0`. + #thickness: 0.15 + +# Live config reload (changes require restart) +#live_config_reload: true + +# Shell +# +# You can set `shell.program` to the path of your favorite shell, e.g. +# `/bin/fish`. Entries in `shell.args` are passed unmodified as arguments to the +# shell. +# +# Default: +# - (macOS) /bin/bash --login +# - (Linux/BSD) user login shell +# - (Windows) powershell +#shell: +# program: /bin/bash +# args: +# - --login + +# Startup directory +# +# Directory the shell is started in. If this is unset, or `None`, the working +# directory of the parent process will be used. +#working_directory: None + +# Send ESC (\x1b) before characters when alt is pressed. +#alt_send_esc: true + +# Offer IPC using `alacritty msg` (unix only) +#ipc_socket: true + +mouse: + # Click settings + # + # The `double_click` and `triple_click` settings control the time + # alacritty should wait for accepting multiple clicks as one double + # or triple click. + double_click: { threshold: 300 } + triple_click: { threshold: 300 } + + # If this is `true`, the cursor is temporarily hidden when typing. + hide_when_typing: false + +# Regex hints +# +# Terminal hints can be used to find text in the visible part of the terminal +# and pipe it to other applications. +#hints: + # Keys used for the hint labels. + #alphabet: "jfkdls;ahgurieowpq" + + # List with all available hints + # + # Each hint must have a `regex` and either an `action` or a `command` field. + # The fields `mouse`, `binding` and `post_processing` are optional. + # + # The fields `command`, `binding.key`, `binding.mods`, `binding.mode` and + # `mouse.mods` accept the same values as they do in the `key_bindings` section. + # + # The `mouse.enabled` field controls if the hint should be underlined while + # the mouse with all `mouse.mods` keys held or the vi mode cursor is above it. + # + # If the `post_processing` field is set to `true`, heuristics will be used to + # shorten the match if there are characters likely not to be part of the hint + # (e.g. a trailing `.`). This is most useful for URIs. + # + # Values for `action`: + # - Copy + # Copy the hint's text to the clipboard. + # - Paste + # Paste the hint's text to the terminal or search. + # - Select + # Select the hint's text. + # - MoveViModeCursor + # Move the vi mode cursor to the beginning of the hint. + #enabled: + # - regex: "(ipfs:|ipns:|magnet:|mailto:|gemini:|gopher:|https:|http:|news:|file:|git:|ssh:|ftp:)\ + # [^\u0000-\u001F\u007F-\u009F<>\"\\s{-}\\^⟨⟩`]+" + # command: xdg-open + # post_processing: true + # mouse: + # enabled: true + # mods: None + # binding: + # key: U + # mods: Control|Shift + +# Mouse bindings +# +# Mouse bindings are specified as a list of objects, much like the key +# bindings further below. +# +# To trigger mouse bindings when an application running within Alacritty +# captures the mouse, the `Shift` modifier is automatically added as a +# requirement. +# +# Each mouse binding will specify a: +# +# - `mouse`: +# +# - Middle +# - Left +# - Right +# - Numeric identifier such as `5` +# +# - `action` (see key bindings for actions not exclusive to mouse mode) +# +# - Mouse exclusive actions: +# +# - ExpandSelection +# Expand the selection to the current mouse cursor location. +# +# And optionally: +# +# - `mods` (see key bindings) +#mouse_bindings: +# - { mouse: Right, action: ExpandSelection } +# - { mouse: Right, mods: Control, action: ExpandSelection } +# - { mouse: Middle, mode: ~Vi, action: PasteSelection } + +# Key bindings +# +# Key bindings are specified as a list of objects. For example, this is the +# default paste binding: +# +# `- { key: V, mods: Control|Shift, action: Paste }` +# +# Each key binding will specify a: +# +# - `key`: Identifier of the key pressed +# +# - A-Z +# - F1-F24 +# - Key0-Key9 +# +# A full list with available key codes can be found here: +# https://docs.rs/glutin/*/glutin/event/enum.VirtualKeyCode.html#variants +# +# Instead of using the name of the keys, the `key` field also supports using +# the scancode of the desired key. Scancodes have to be specified as a +# decimal number. This command will allow you to display the hex scancodes +# for certain keys: +# +# `showkey --scancodes`. +# +# Then exactly one of: +# +# - `chars`: Send a byte sequence to the running application +# +# The `chars` field writes the specified string to the terminal. This makes +# it possible to pass escape sequences. To find escape codes for bindings +# like `PageUp` (`"\x1b[5~"`), you can run the command `showkey -a` outside +# of tmux. Note that applications use terminfo to map escape sequences back +# to keys. It is therefore required to update the terminfo when changing an +# escape sequence. +# +# - `action`: Execute a predefined action +# +# - ToggleViMode +# - SearchForward +# Start searching toward the right of the search origin. +# - SearchBackward +# Start searching toward the left of the search origin. +# - Copy +# - Paste +# - IncreaseFontSize +# - DecreaseFontSize +# - ResetFontSize +# - ScrollPageUp +# - ScrollPageDown +# - ScrollHalfPageUp +# - ScrollHalfPageDown +# - ScrollLineUp +# - ScrollLineDown +# - ScrollToTop +# - ScrollToBottom +# - ClearHistory +# Remove the terminal's scrollback history. +# - Hide +# Hide the Alacritty window. +# - Minimize +# Minimize the Alacritty window. +# - Quit +# Quit Alacritty. +# - ToggleFullscreen +# - SpawnNewInstance +# Spawn a new instance of Alacritty. +# - CreateNewWindow +# Create a new Alacritty window from the current process. +# - ClearLogNotice +# Clear Alacritty's UI warning and error notice. +# - ClearSelection +# Remove the active selection. +# - ReceiveChar +# - None +# +# - Vi mode exclusive actions: +# +# - Open +# Perform the action of the first matching hint under the vi mode cursor +# with `mouse.enabled` set to `true`. +# - ToggleNormalSelection +# - ToggleLineSelection +# - ToggleBlockSelection +# - ToggleSemanticSelection +# Toggle semantic selection based on `selection.semantic_escape_chars`. +# +# - Vi mode exclusive cursor motion actions: +# +# - Up +# One line up. +# - Down +# One line down. +# - Left +# One character left. +# - Right +# One character right. +# - First +# First column, or beginning of the line when already at the first column. +# - Last +# Last column, or beginning of the line when already at the last column. +# - FirstOccupied +# First non-empty cell in this terminal row, or first non-empty cell of +# the line when already at the first cell of the row. +# - High +# Top of the screen. +# - Middle +# Center of the screen. +# - Low +# Bottom of the screen. +# - SemanticLeft +# Start of the previous semantically separated word. +# - SemanticRight +# Start of the next semantically separated word. +# - SemanticLeftEnd +# End of the previous semantically separated word. +# - SemanticRightEnd +# End of the next semantically separated word. +# - WordLeft +# Start of the previous whitespace separated word. +# - WordRight +# Start of the next whitespace separated word. +# - WordLeftEnd +# End of the previous whitespace separated word. +# - WordRightEnd +# End of the next whitespace separated word. +# - Bracket +# Character matching the bracket at the cursor's location. +# - SearchNext +# Beginning of the next match. +# - SearchPrevious +# Beginning of the previous match. +# - SearchStart +# Start of the match to the left of the vi mode cursor. +# - SearchEnd +# End of the match to the right of the vi mode cursor. +# +# - Search mode exclusive actions: +# - SearchFocusNext +# Move the focus to the next search match. +# - SearchFocusPrevious +# Move the focus to the previous search match. +# - SearchConfirm +# - SearchCancel +# - SearchClear +# Reset the search regex. +# - SearchDeleteWord +# Delete the last word in the search regex. +# - SearchHistoryPrevious +# Go to the previous regex in the search history. +# - SearchHistoryNext +# Go to the next regex in the search history. +# +# - macOS exclusive actions: +# - ToggleSimpleFullscreen +# Enter fullscreen without occupying another space. +# +# - Linux/BSD exclusive actions: +# +# - CopySelection +# Copy from the selection buffer. +# - PasteSelection +# Paste from the selection buffer. +# +# - `command`: Fork and execute a specified command plus arguments +# +# The `command` field must be a map containing a `program` string and an +# `args` array of command line parameter strings. For example: +# `{ program: "alacritty", args: ["-e", "vttest"] }` +# +# And optionally: +# +# - `mods`: Key modifiers to filter binding actions +# +# - Command +# - Control +# - Option +# - Super +# - Shift +# - Alt +# +# Multiple `mods` can be combined using `|` like this: +# `mods: Control|Shift`. +# Whitespace and capitalization are relevant and must match the example. +# +# - `mode`: Indicate a binding for only specific terminal reported modes +# +# This is mainly used to send applications the correct escape sequences +# when in different modes. +# +# - AppCursor +# - AppKeypad +# - Search +# - Alt +# - Vi +# +# A `~` operator can be used before a mode to apply the binding whenever +# the mode is *not* active, e.g. `~Alt`. +# +# Bindings are always filled by default, but will be replaced when a new +# binding with the same triggers is defined. To unset a default binding, it can +# be mapped to the `ReceiveChar` action. Alternatively, you can use `None` for +# a no-op if you do not wish to receive input characters for that binding. +# +# If the same trigger is assigned to multiple actions, all of them are executed +# in the order they were defined in. +#key_bindings: + #- { key: Paste, action: Paste } + #- { key: Copy, action: Copy } + #- { key: L, mods: Control, action: ClearLogNotice } + #- { key: L, mods: Control, mode: ~Vi|~Search, chars: "\x0c" } + #- { key: PageUp, mods: Shift, mode: ~Alt, action: ScrollPageUp, } + #- { key: PageDown, mods: Shift, mode: ~Alt, action: ScrollPageDown } + #- { key: Home, mods: Shift, mode: ~Alt, action: ScrollToTop, } + #- { key: End, mods: Shift, mode: ~Alt, action: ScrollToBottom } + + # Vi Mode + #- { key: Space, mods: Shift|Control, mode: ~Search, action: ToggleViMode } + #- { key: Space, mods: Shift|Control, mode: Vi|~Search, action: ScrollToBottom } + #- { key: Escape, mode: Vi|~Search, action: ClearSelection } + #- { key: I, mode: Vi|~Search, action: ToggleViMode } + #- { key: I, mode: Vi|~Search, action: ScrollToBottom } + #- { key: C, mods: Control, mode: Vi|~Search, action: ToggleViMode } + #- { key: Y, mods: Control, mode: Vi|~Search, action: ScrollLineUp } + #- { key: E, mods: Control, mode: Vi|~Search, action: ScrollLineDown } + #- { key: G, mode: Vi|~Search, action: ScrollToTop } + #- { key: G, mods: Shift, mode: Vi|~Search, action: ScrollToBottom } + #- { key: B, mods: Control, mode: Vi|~Search, action: ScrollPageUp } + #- { key: F, mods: Control, mode: Vi|~Search, action: ScrollPageDown } + #- { key: U, mods: Control, mode: Vi|~Search, action: ScrollHalfPageUp } + #- { key: D, mods: Control, mode: Vi|~Search, action: ScrollHalfPageDown } + #- { key: Y, mode: Vi|~Search, action: Copy } + #- { key: Y, mode: Vi|~Search, action: ClearSelection } + #- { key: Copy, mode: Vi|~Search, action: ClearSelection } + #- { key: V, mode: Vi|~Search, action: ToggleNormalSelection } + #- { key: V, mods: Shift, mode: Vi|~Search, action: ToggleLineSelection } + #- { key: V, mods: Control, mode: Vi|~Search, action: ToggleBlockSelection } + #- { key: V, mods: Alt, mode: Vi|~Search, action: ToggleSemanticSelection } + #- { key: Return, mode: Vi|~Search, action: Open } + #- { key: K, mode: Vi|~Search, action: Up } + #- { key: J, mode: Vi|~Search, action: Down } + #- { key: H, mode: Vi|~Search, action: Left } + #- { key: L, mode: Vi|~Search, action: Right } + #- { key: Up, mode: Vi|~Search, action: Up } + #- { key: Down, mode: Vi|~Search, action: Down } + #- { key: Left, mode: Vi|~Search, action: Left } + #- { key: Right, mode: Vi|~Search, action: Right } + #- { key: Key0, mode: Vi|~Search, action: First } + #- { key: Key4, mods: Shift, mode: Vi|~Search, action: Last } + #- { key: Key6, mods: Shift, mode: Vi|~Search, action: FirstOccupied } + #- { key: H, mods: Shift, mode: Vi|~Search, action: High } + #- { key: M, mods: Shift, mode: Vi|~Search, action: Middle } + #- { key: L, mods: Shift, mode: Vi|~Search, action: Low } + #- { key: B, mode: Vi|~Search, action: SemanticLeft } + #- { key: W, mode: Vi|~Search, action: SemanticRight } + #- { key: E, mode: Vi|~Search, action: SemanticRightEnd } + #- { key: B, mods: Shift, mode: Vi|~Search, action: WordLeft } + #- { key: W, mods: Shift, mode: Vi|~Search, action: WordRight } + #- { key: E, mods: Shift, mode: Vi|~Search, action: WordRightEnd } + #- { key: Key5, mods: Shift, mode: Vi|~Search, action: Bracket } + #- { key: Slash, mode: Vi|~Search, action: SearchForward } + #- { key: Slash, mods: Shift, mode: Vi|~Search, action: SearchBackward } + #- { key: N, mode: Vi|~Search, action: SearchNext } + #- { key: N, mods: Shift, mode: Vi|~Search, action: SearchPrevious } + + # Search Mode + #- { key: Return, mode: Search|Vi, action: SearchConfirm } + #- { key: Escape, mode: Search, action: SearchCancel } + #- { key: C, mods: Control, mode: Search, action: SearchCancel } + #- { key: U, mods: Control, mode: Search, action: SearchClear } + #- { key: W, mods: Control, mode: Search, action: SearchDeleteWord } + #- { key: P, mods: Control, mode: Search, action: SearchHistoryPrevious } + #- { key: N, mods: Control, mode: Search, action: SearchHistoryNext } + #- { key: Up, mode: Search, action: SearchHistoryPrevious } + #- { key: Down, mode: Search, action: SearchHistoryNext } + #- { key: Return, mode: Search|~Vi, action: SearchFocusNext } + #- { key: Return, mods: Shift, mode: Search|~Vi, action: SearchFocusPrevious } + + # (Windows, Linux, and BSD only) + #- { key: V, mods: Control|Shift, mode: ~Vi, action: Paste } + #- { key: C, mods: Control|Shift, action: Copy } + #- { key: F, mods: Control|Shift, mode: ~Search, action: SearchForward } + #- { key: B, mods: Control|Shift, mode: ~Search, action: SearchBackward } + #- { key: C, mods: Control|Shift, mode: Vi|~Search, action: ClearSelection } + #- { key: Insert, mods: Shift, action: PasteSelection } + #- { key: Key0, mods: Control, action: ResetFontSize } + #- { key: Equals, mods: Control, action: IncreaseFontSize } + #- { key: Plus, mods: Control, action: IncreaseFontSize } + #- { key: NumpadAdd, mods: Control, action: IncreaseFontSize } + #- { key: Minus, mods: Control, action: DecreaseFontSize } + #- { key: NumpadSubtract, mods: Control, action: DecreaseFontSize } + + # (Windows only) + #- { key: Return, mods: Alt, action: ToggleFullscreen } + + # (macOS only) + #- { key: K, mods: Command, mode: ~Vi|~Search, chars: "\x0c" } + #- { key: K, mods: Command, mode: ~Vi|~Search, action: ClearHistory } + #- { key: Key0, mods: Command, action: ResetFontSize } + #- { key: Equals, mods: Command, action: IncreaseFontSize } + #- { key: Plus, mods: Command, action: IncreaseFontSize } + #- { key: NumpadAdd, mods: Command, action: IncreaseFontSize } + #- { key: Minus, mods: Command, action: DecreaseFontSize } + #- { key: NumpadSubtract, mods: Command, action: DecreaseFontSize } + #- { key: V, mods: Command, action: Paste } + #- { key: C, mods: Command, action: Copy } + #- { key: C, mods: Command, mode: Vi|~Search, action: ClearSelection } + #- { key: H, mods: Command, action: Hide } + #- { key: H, mods: Command|Alt, action: HideOtherApplications } + #- { key: M, mods: Command, action: Minimize } + #- { key: Q, mods: Command, action: Quit } + #- { key: W, mods: Command, action: Quit } + #- { key: N, mods: Command, action: SpawnNewInstance } + #- { key: F, mods: Command|Control, action: ToggleFullscreen } + #- { key: F, mods: Command, mode: ~Search, action: SearchForward } + #- { key: B, mods: Command, mode: ~Search, action: SearchBackward } + +#debug: + # Display the time it takes to redraw each frame. + #render_timer: false + + # Keep the log file after quitting Alacritty. + #persistent_logging: false + + # Log level + # + # Values for `log_level`: + # - Off + # - Error + # - Warn + # - Info + # - Debug + # - Trace + #log_level: Warn + + # Print all received window events. + #print_events: false diff --git a/config/aria2/aria2.conf b/config/aria2/aria2.conf new file mode 100644 index 0000000..aec6d88 --- /dev/null +++ b/config/aria2/aria2.conf @@ -0,0 +1,96 @@ +## `#`开头为注释内容, 选项都有相应的注释说明, 根据需要修改 ## +## 被注释的选项填写的是默认值, 建议在需要修改时再取消注释 ## +## 如果出现`Initializing EpollEventPoll failed.`之类的 +## 错误提示, 可以取消event-poll选项的注释 ## + +## 文件保存相关 ## + +# 文件的保存路径(可使用绝对路径或相对路径), 默认: 当前启动位置 +dir="~/Downloads" +# 启用磁盘缓存, 0为禁用缓存, 需1.16以上版本, 默认:16M +disk-cache=32M +# 文件预分配方式, 能有效降低磁盘碎片, 默认:prealloc +# 预分配所需时间: none < falloc ? trunc < prealloc +# falloc和trunc则需要文件系统和内核支持, NTFS建议使用falloc, EXT3/4建议trunc +file-allocation=falloc +# 断点续传 +continue=true + +## 下载连接相关 ## + +# 最大同时下载任务数, 运行时可修改, 默认:5 +max-concurrent-downloads=1 +# 同一服务器连接数, 添加时可指定, 默认:1 +max-connection-per-server=5 +# 最小文件分片大小, 添加时可指定, 取值范围1M -1024M, 默认:20M +# 假定size=10M, 文件为20MiB 则使用两个来源下载; 文件为15MiB 则使用一个来源下载 +min-split-size=10M +# 单个任务最大线程数, 添加时可指定, 默认:5 +split=5 +# 整体下载速度限制, 运行时可修改, 默认:0 +# max-overall-download-limit=0 +# 单个任务下载速度限制, 默认:0 +# max-download-limit=0 +# 整体上传速度限制, 运行时可修改, 默认:0 +# max-overall-upload-limit=0 +# 单个任务上传速度限制, 默认:0 +# max-upload-limit=0 +# 禁用IPv6, 默认:false +disable-ipv6=false + +## 进度保存相关 ## + +# 从会话文件中读取下载任务 +input-file=aria2.session +# 在Aria2退出时保存`错误/未完成`的下载任务到会话文件 +save-session=aria2.session +# 定时保存会话, 0为退出时才保存, 需1.16.1以上版本, 默认:0 +save-session-interval=60 + +## RPC相关设置 ## + +# 启用RPC, 默认:false +enable-rpc=true +# 允许所有来源, 默认:false +rpc-allow-origin-all=true +# 允许非外部访问, 默认:false +rpc-listen-all=true +# 事件轮询方式, 取值:[epoll, kqueue, port, poll, select], 不同系统默认值不同 +# event-poll=select +# RPC监听端口, 端口被占用时可以修改, 默认:6800 +# rpc-listen-port=6800 + +## BT/PT下载相关 ## + +# 当下载的是一个种子(以.torrent结尾)时, 自动开始BT任务, 默认:true +# follow-torrent=true +# BT监听端口, 当端口被屏蔽时使用, 默认:6881-6999 +# listen-port=51413 +# 单个种子最大连接数, 默认:55 +# bt-max-peers=55 +# 打开DHT功能, PT需要禁用, 默认:true +enable-dht=false +# 打开IPv6 DHT功能, PT需要禁用 +# enable-dht6=false +# DHT网络监听端口, 默认:6881-6999 +# dht-listen-port=6881-6999 +# 本地节点查找, PT需要禁用, 默认:false +# bt-enable-lpd=false +# 种子交换, PT需要禁用, 默认:true +enable-peer-exchange=false +# 每个种子限速, 对少种的PT很有用, 默认:50K +# bt-request-peer-speed-limit=50K +# 客户端伪装, PT需要 +peer-id-prefix=-TR2770- +user-agent=Transmission/2.77 +# 当种子的分享率达到这个数时, 自动停止做种, 0为一直做种, 默认:1.0 +seed-ratio=0 +# 强制保存会话, 话即使任务已经完成, 默认:false +# 较新的版本开启后会在任务完成后依然保留.aria2文件 +# force-save=false +# BT校验相关, 默认:true +# bt-hash-check-seed=true +# 继续之前的BT任务时, 无需再次校验, 默认:false +bt-seed-unverified=true +# 保存磁力链接元数据为种子文件(.torrent文件), 默认:false +bt-save-metadata=true diff --git a/config/aria2/aria2.md b/config/aria2/aria2.md new file mode 100644 index 0000000..e49a6e6 --- /dev/null +++ b/config/aria2/aria2.md @@ -0,0 +1,5 @@ +# aria2 usage + +1. Modify download path; +2. Copy aria2/aria2.conf to download path; +3. Use `aria2c --conf-path=$path $url` to download files; diff --git a/config/browser/OmegaOptions.bak b/config/browser/OmegaOptions.bak new file mode 100644 index 0000000..ca0e028 --- /dev/null +++ b/config/browser/OmegaOptions.bak @@ -0,0 +1 @@ +{"+auto switch":{"color":"#99dd99","defaultProfileName":"direct","name":"auto switch","profileType":"SwitchProfile","rules":[{"condition":{"conditionType":"HostWildcardCondition","pattern":"internal.example.com"},"profileName":"direct"},{"condition":{"conditionType":"HostWildcardCondition","pattern":"*.example.com"},"profileName":"proxy"}]},"+proxy":{"bypassList":[{"conditionType":"BypassCondition","pattern":"127.0.0.1"},{"conditionType":"BypassCondition","pattern":"::1"},{"conditionType":"BypassCondition","pattern":"localhost"}],"color":"#99ccee","fallbackProxy":{"host":"proxy.example.com","port":8080,"scheme":"http"},"name":"proxy","profileType":"FixedProfile"},"-addConditionsToBottom":false,"-confirmDeletion":true,"-downloadInterval":1440,"-enableQuickSwitch":false,"-quickSwitchProfiles":[],"-refreshOnProfileChange":true,"-revertProxyChanges":true,"-showExternalProfile":true,"-showInspectMenu":true,"-startupProfileName":"","schemaVersion":2,"-monitorWebRequests":true,"+work":{"profileType":"PacProfile","name":"work","pacScript":"// Proxy Auto-Config file generated by BP&IT\r\nvar autoproxy_host = {\r\n \"kakao.com\": 1,\r\n \"dnsmos.azurewebsites.net\": 1,\r\n \"app.box.com\": 1,\r\n \"idmsac.corp.apple.com\": 1,\r\n \"quantumai.google\": 1,\r\n \"etherscan.io\": 1,\r\n \"ethereum.org\": 1,\r\n \"admob.com\": 1,\r\n \"github.blog\": 1,\r\n \"browser.sentry-cdn.com\": 1,\r\n \"waze.com\": 1,\r\n \"gather.town\": 1,\r\n \"docusign.com\": 1,\r\n \"docusign.net\": 1,\r\n \"www.admob.com\": 1,\r\n \"qnx.com\": 1,\r\n \"fontawesome.com\": 1,\r\n \"githubusercontent.com\": 1,\r\n \"2020.emnlp.org\": 1,\r\n \"listennotes.com\": 1,\r\n \"neurips.cc\": 1,\r\n \"kornferry.com\": 1,\r\n \"amazon.co.jp\": 1,\r\n \"rakuten.co.jp\": 1,\r\n \"skyprod.akadns.net\": 1,\r\n \"onedrive.com\": 1,\r\n \"onedrive.live.com\": 1,\r\n \"libreswan.org\": 1,\r\n \"64.media.tumblr.com\": 1,\r\n \"rapids.ai\": 1,\r\n \"rapidai.com\": 1,\r\n \"38.media.tumblr.com\": 1,\r\n \"www.whatsapp.com\": 1,\r\n \"openvidu.io\": 1,\r\n \"www.itu.int\": 1,\r\n \"webrtc.org\": 1,\r\n \"reactnavigation.org\": 1,\r\n \"npmjs.com\": 1,\r\n \"ant.design\": 1,\r\n \"vldb2020.org\": 1,\r\n \"quilljs.com\": 1,\r\n \"github.io\": 1,\r\n \"angular.io\": 1,\r\n \"kubernetes.io\": 1,\r\n \"www.theguardian.com\": 1,\r\n \"venturebeat.com\": 1,\r\n \"www.rfi.fr\": 1,\r\n \"www.lemonde.fr\": 1,\r\n \"www.lefigaro.fr\": 1,\r\n \"www.lesechos.fr\": 1,\r\n \"www.dw.com\": 1,\r\n \"www.rcinet.ca\": 1,\r\n \"www.theglobeandmail.com\": 1,\r\n \"www.rfa.org\": 1,\r\n \"www.voanews.com\": 1,\r\n \"elpais.com\": 1,\r\n \"www.elmundo.es\": 1,\r\n \"www.thestandnews.com\": 1,\r\n \"theinitium.com\": 1,\r\n \"hk.appledaily.com\": 1,\r\n \"tw.appledaily.com\": 1,\r\n \"www.ltn.com.tw\": 1,\r\n \"www.setn.com\": 1,\r\n \"hk01.com\": 1,\r\n \"dwnews.com\": 1,\r\n \"dwnews.net\": 1,\r\n \"go.dev\": 1,\r\n \"go.etcd.io\": 1,\r\n \"opensource.google\": 1,\r\n \"readthedocs.io\": 1,\r\n \"app.grammarly.com\": 1,\r\n \"s3.amazonaws.com\": 1,\r\n \"blob.core.windows.net\": 1,\r\n \"jestjs.io\": 1,\r\n \"icomoon.io\": 1,\r\n \"www.capitaliq.com\": 1,\r\n \"blog.google\": 1,\r\n \"research.google\": 1,\r\n \"hk-pan.baidu.com\": 1,\r\n \"hk-d.pcs.baidu.com\": 1,\r\n \"hk-pcs.baidu.com\": 1,\r\n \"hk-data.baidupcs.com\": 1,\r\n \"hk-data.pcs.baidu.com\": 1,\r\n \"hk-s0.baidu.com\": 1,\r\n \"dubox.com\": 1,\r\n \"duboxcdn.com\": 1,\r\n \"video.ibm.com\": 1,\r\n \"esa.int\": 1,\r\n \"overleaf.com\": 1,\r\n \"spdk.io\": 1,\r\n \"dribbble.com\": 1,\r\n \"arxiv.org\": 1,\r\n \"python.org\": 1,\r\n \"pytorch.org\": 1,\r\n \"4shared.com\": 1,\r\n \"abc.xyz\": 1,\r\n \"android.com\": 1,\r\n \"api.ai\": 1,\r\n \"apigee.com\": 1,\r\n \"appspot.com\": 1,\r\n \"arablionz.com\": 1,\r\n \"archive.org\": 1,\r\n \"atscaleconference.com\": 1,\r\n \"auth0.com\": 1,\r\n \"baidu.jp\": 1,\r\n \"bbc.com\": 1,\r\n \"bbci.co.uk\": 1,\r\n \"bbc.co.uk\": 1,\r\n \"bdr130.net\": 1,\r\n \"bigbluebutton.org\": 1,\r\n \"bit.ly\": 1,\r\n \"blogger.com\": 1,\r\n \"bloglines.com\": 1,\r\n \"blogspot.com\": 1,\r\n \"blogblog.com\": 1,\r\n \"blog.llvm.org\": 1,\r\n \"bloomberg.com\": 1,\r\n \"boardbook.org\": 1,\r\n \"businessweek.com\": 1,\r\n \"behance.net\": 1,\r\n \"sketchrepo.com\": 1,\r\n \"psdrepo.com\": 1,\r\n \"oculus.com\": 1,\r\n \"cari.com.my\": 1,\r\n \"cdn.mdn.mozilla.net\": 1,\r\n \"cdn.sstatic.net\": 1,\r\n \"chrome.com\": 1,\r\n \"chromium.org\": 1,\r\n \"cloud.databricks.com\": 1,\r\n \"cloudfront.net\": 1,\r\n \"code.google.com\": 1,\r\n \"conduit.com\": 1,\r\n \"console.sj.91.com\": 1,\r\n \"computershare.com\": 1,\r\n \"computershare.com.hk\": 1,\r\n \"citrix.com\": 1,\r\n \"dailymotion.com\": 1,\r\n \"ddth.com\": 1,\r\n \"demandbase.com\": 1,\r\n \"developer.mozilla.org\": 1,\r\n \"dev.twitch.tv\": 1,\r\n \"dialogflow.com\": 1,\r\n \"diziport.com\": 1,\r\n \"discuss.pytorch.org\": 1,\r\n \"dlitall.com\": 1,\r\n \"docs.webix.com\": 1,\r\n \"docker.com\": 1,\r\n \"docker.io\": 1,\r\n \"doubleclick.net\": 1,\r\n \"downloadkong.org\": 1,\r\n \"dropbox.com\": 1,\r\n \"ebiz.gov.in\": 1,\r\n \"edgar-online.com\": 1,\r\n \"ekolay.net\": 1,\r\n \"elastic.co\": 1,\r\n \"excite.co.jp\": 1,\r\n \"f8.com\": 1,\r\n \"fbf8.com\": 1,\r\n \"facebook.com\": 1,\r\n \"facebook.net\": 1,\r\n \"facebook.design\": 1,\r\n \"facegen.com\": 1,\r\n \"accountkit.com\": 1,\r\n \"fastly.net\": 1,\r\n \"fb.com\": 1,\r\n \"fbcdn.net\": 1,\r\n \"fbsbx.com\": 1,\r\n \"feeling.sourceforge.net\": 1,\r\n \"fiddle.jshell.net\": 1,\r\n \"filesonic.com\": 1,\r\n \"filestube.com\": 1,\r\n \"filgoal.com\": 1,\r\n \"fizy.com\": 1,\r\n \"flickr.com\": 1,\r\n \"firebaseio.com\": 1,\r\n \"flagstar.com\": 1,\r\n \"fonts.gstatic.com\": 1,\r\n \"formisimo.com\": 1,\r\n \"freebase.com\": 1,\r\n \"fumi23.com\": 1,\r\n \"funnelenvy.com\": 1,\r\n \"gcr.io\": 1,\r\n \"getgalileo.io\": 1,\r\n \"getkong.org\": 1,\r\n \"gezginler.net\": 1,\r\n \"ggpht.com\": 1,\r\n \"gluebenchmark.com\": 1,\r\n \"globo.com\": 1,\r\n \"gmail.com\": 1,\r\n \"gluon-cv.mxnet.io\": 1,\r\n \"golang.org\": 1,\r\n \"godoc.org\": 1,\r\n \"g.co\": 1,\r\n \"goo.gl\": 1,\r\n \"google.ca\": 1,\r\n \"google.de\": 1,\r\n \"google.fr\": 1,\r\n \"google.it\": 1,\r\n \"google.nl\": 1,\r\n \"google.co.jp\": 1,\r\n \"google.co.th\": 1,\r\n \"google.co.id\": 1,\r\n \"google.co.kr\": 1,\r\n \"google.co.uk\": 1,\r\n \"google.com\": 1,\r\n \"google.com.au\": 1,\r\n \"google.com.br\": 1,\r\n \"google.com.hk\": 1,\r\n \"google.com.tr\": 1,\r\n \"google.com.tw\": 1,\r\n \"google.com.my\": 1,\r\n \"google-analytics.com\": 1,\r\n \"googleblog.com\": 1,\r\n \"googleapis.com\": 1,\r\n \"googlecode.com\": 1,\r\n \"googleadservices.com\": 1,\r\n \"googlesource.com\": 1,\r\n \"googlesyndication.com\": 1,\r\n \"googletageservices.com\": 1,\r\n \"googletagmanager.com\": 1,\r\n \"googleusercontent.com\": 1,\r\n \"googlevideo.com\": 1,\r\n \"googletagservices.com\": 1,\r\n \"goonline.vn\": 1,\r\n \"gitbooks.io\": 1,\r\n \"gist.github.com\": 1,\r\n \"github-cloud.s3.amazonaws.com\": 1,\r\n \"github-com.s3.amazonaws.com\": 1,\r\n \"github.com\": 1,\r\n \"githubassets.com\": 1,\r\n \"gstatic.com\": 1,\r\n \"hadoopsphere.com\": 1,\r\n \"hellotxt.com\": 1,\r\n \"hg.olat.org\": 1,\r\n \"hhvm.com\": 1,\r\n \"hotfile.com\": 1,\r\n \"https.cdn.softlayer.net\": 1,\r\n \"hulu.com\": 1,\r\n \"hurriyet.com.tr\": 1,\r\n \"id.openrice.com\": 1,\r\n \"images-na.ssl-images-amazon.com\": 1,\r\n \"imageshack.us\": 1,\r\n \"imdb.com\": 1,\r\n \"imply.io\": 1,\r\n \"impress.co.jp\": 1,\r\n \"indowebster.com\": 1,\r\n \"instagram.com\": 1,\r\n \"cdninstagram.com\": 1,\r\n \"instagramstatic-a.akamaihd.net\": 1,\r\n \"instagramimages-a.akamaihd.net\": 1,\r\n \"immd.gov.hk\": 1,\r\n \"ird.gov.hk\": 1,\r\n \"izlesene.com\": 1,\r\n \"jeddahbikers.com\": 1,\r\n \"jobstreet.com.my\": 1,\r\n \"jquery.com\": 1,\r\n \"jsfiddle.net\": 1,\r\n \"jsoftj.com\": 1,\r\n \"justsystems.com\": 1,\r\n \"k8s.io\": 1,\r\n \"kaskus.us\": 1,\r\n \"kublr.com\": 1,\r\n \"kw.com\": 1,\r\n \"rocksdb.org\": 1,\r\n \"logdevice.io\": 1,\r\n \"ngc.nvidia.com\": 1,\r\n \"kooora.com\": 1,\r\n \"l0.awsstatic.com\": 1,\r\n \"l1.awsstatic.com\": 1,\r\n \"lamchame.com\": 1,\r\n \"lelong.com.my\": 1,\r\n \"lineclear.com\": 1,\r\n \"line.me\": 1,\r\n \"line-scdn.net\": 1,\r\n \"lowyat.net\": 1,\r\n \"lwn.net\": 1,\r\n \"lycos.com\": 1,\r\n \"maktoob.yahoo.com\": 1,\r\n \"malaysiakini.com\": 1,\r\n \"masrawy.com\": 1,\r\n \"mawaly.com\": 1,\r\n \"mazika2day.com\": 1,\r\n \"medium.com\": 1,\r\n \"metacafe.com\": 1,\r\n \"milliyet.com.tr\": 1,\r\n \"mit.edu\": 1,\r\n \"mixi.jp\": 1,\r\n \"moborobo.com\": 1,\r\n \"moheet.com\": 1,\r\n \"mudah.com.my\": 1,\r\n \"my.comscore.com\": 1,\r\n \"my.syncplicity.com\": 1,\r\n \"xml.syncplicity.com\": 1,\r\n \"myegy.com\": 1,\r\n \"mynet.com\": 1,\r\n \"nhacso.net\": 1,\r\n \"nytimes.com\": 1,\r\n \"nyt.com\": 1,\r\n \"objc.io\": 1,\r\n \"olat.org\": 1,\r\n \"onelogin.com\": 1,\r\n \"opencast.jira.com\": 1,\r\n \"opencastproject.org\": 1,\r\n \"openresty.org\": 1,\r\n \"orkut.com\": 1,\r\n \"orkut.com.br\": 1,\r\n \"oktacdn.com\": 1,\r\n \"packagecontrol.io\": 1,\r\n \"php.net\": 1,\r\n \"pge.com\": 1,\r\n \"tiqcdn.com\": 1,\r\n \"rawgit.com\": 1,\r\n \"casalemedia.com\": 1,\r\n \"optimizely.com\": 1,\r\n \"pingidentity.com\": 1,\r\n \"pinterest.com\": 1,\r\n \"pinimg.com\": 1,\r\n \"pixnet.net\": 1,\r\n \"plurk.com\": 1,\r\n \"plus.google.com\": 1,\r\n \"polleverywhere-css-tests.s3.amazonaws.com\": 1,\r\n \"pypi.python.org\": 1,\r\n \"popin.cc\": 1,\r\n \"quartznet.sourceforge.net\": 1,\r\n \"quartz-scheduler.org\": 1,\r\n \"quoracdn.net\": 1,\r\n \"quora.com\": 1,\r\n \"quoracdn.net\": 1,\r\n \"quantcount.com\": 1,\r\n \"randomserver.com\": 1,\r\n \"rapidshare.com\": 1,\r\n \"raw.githubusercontent.com\": 1,\r\n \"reddit.com\": 1,\r\n \"redditmedia.com\": 1,\r\n \"redis.io\": 1,\r\n \"redd.it\": 1,\r\n \"redditstatic.com\": 1,\r\n \"reuters.com\": 1,\r\n \"reutersmedia.net\": 1,\r\n \"rstudio.com\": 1,\r\n \"rubiconproject.com\": 1,\r\n \"s0.awsstatic.com\": 1,\r\n \"sahibinden.com\": 1,\r\n \"sakaiproject.org\": 1,\r\n \"schema.org\": 1,\r\n \"scmp.com\": 1,\r\n \"scribd.com\": 1,\r\n \"shl.com\": 1,\r\n \"shutterstock.com\": 1,\r\n \"socrative.com\": 1,\r\n \"socrative-production-static-web.s3.amazonaws.com\": 1,\r\n \"shorouknews.com\": 1,\r\n \"slack.com\": 1,\r\n \"slideshare.net\": 1,\r\n \"sm3na.com\": 1,\r\n \"sketchappsources.com\": 1,\r\n \"source.sakaiproject.org\": 1,\r\n \"socialblade.com\": 1,\r\n \"spring.io\": 1,\r\n \"sptechs.com\": 1,\r\n \"stafaband.info\": 1,\r\n \"startupgrind.com\": 1,\r\n \"svbconnect.com\": 1,\r\n \"symantec.com\": 1,\r\n \"symantecliveupdate.com\": 1,\r\n \"sensortower.com\": 1,\r\n \"stackoverflow.com\": 1,\r\n \"realtor.com\": 1,\r\n \"moveaws.com\": 1,\r\n \"zillow.com\": 1,\r\n \"zillowstatic.com\": 1,\r\n \"trulia.com\": 1,\r\n \"trulia-cdn.com\": 1,\r\n \"t.co\": 1,\r\n \"tailieu.vn\": 1,\r\n \"te3p.com\": 1,\r\n \"techcrunch.com\": 1,\r\n \"technorati.com\": 1,\r\n \"tedata.net\": 1,\r\n \"tensorflow.org\": 1,\r\n \"telegram.org\": 1,\r\n \"terra.com.br\": 1,\r\n \"tfhub.dev\": 1,\r\n \"thecvf.com\": 1,\r\n \"themalaysianinsider.com\": 1,\r\n \"thinkwithgoogle.com\": 1,\r\n \"time.com\": 1,\r\n \"timestamp.comodoca.com\": 1,\r\n \"timestamp.globalsign.com\": 1,\r\n \"timsah.com\": 1,\r\n \"tinhte.vn\": 1,\r\n \"tmc.tippingpoint.com\": 1,\r\n \"topshareware.com\": 1,\r\n \"trekaklik.com\": 1,\r\n \"truongton.net\": 1,\r\n \"turan.org\": 1,\r\n \"twimg.com\": 1,\r\n \"twitter.com\": 1,\r\n \"unikey.org\": 1,\r\n \"user-images.githubusercontent.com\": 1,\r\n \"uol.com.br\": 1,\r\n \"ustream.tv\": 1,\r\n \"vatanim.com.tr\": 1,\r\n \"vector.co.jp\": 1,\r\n \"vietgle.vn\": 1,\r\n \"vimeo.com\": 1,\r\n \"virustotal.com\": 1,\r\n \"vnexpress.net\": 1,\r\n \"vn-zoom.com\": 1,\r\n \"vodafone.com.eg\": 1,\r\n \"waymo.com\": 1,\r\n \"webtretho.com\": 1,\r\n \"wikimedia.org\": 1,\r\n \"wikipedia.org\": 1,\r\n \"windowsupdate.com\": 1,\r\n \"withgoogle.com\": 1,\r\n \"wipo.int\": 1,\r\n \"wordpress.com\": 1,\r\n \"wordpress.org\": 1,\r\n \"www.gov.hk\": 1,\r\n \"wp.com\": 1,\r\n \"wretch.cc\": 1,\r\n \"ws.tippingpoint.com\": 1,\r\n \"wsj.com\": 1,\r\n \"wsj.net\": 1,\r\n \"yahoo.co.jp\": 1,\r\n \"yahoo.com\": 1,\r\n \"yallakora.com\": 1,\r\n \"ycombinator.com\": 1,\r\n \"yoo7.com\": 1,\r\n \"youm7.com\": 1,\r\n \"youtube.com\": 1,\r\n \"youtu.be\": 1,\r\n \"ytimg.com\": 1,\r\n \"yume.vn\": 1,\r\n \"zamalekfans.com\": 1,\r\n \"ziddu.com\": 1,\r\n \"zing.vn\": 1,\r\n \"zoom.us\": 1,\r\n \"dmv.ca.gov\": 1,\r\n \"cpuc.ca.gov\": 1,\r\n \"i.stack.imgur.com\": 1,\r\n \"testing.googleblog.com\": 1,\r\n \"zoho.com\": 1,\r\n \"www.tiktok.com\": 1,\r\n \"artstation.com\": 1,\r\n \"terabox.com\": 1,\r\n \"teraboxcdn.com\": 1,\r\n \"www.ibm.com\": 1,\r\n \"ads.snapchat.com\": 1,\r\n \"translate.googleapis.com\": 1,\r\n \"www.armorize.com\": 1,\r\n \"nextjs.org\": 1,\r\n \"octave-online.net\": 1,\r\n \"figma.com\": 1,\r\n \"ietf.org\": 1,\r\n \"istio.io\": 1,\r\n \"bulletin.com\": 1,\r\n \"googleplay.com\": 1,\r\n \"cafe.naver.com\": 1,\r\n \"blog.naver.com\": 1,\r\n \"dnsmos-2.azurewebsites.net\": 1,\r\n \"meetanyway.com\": 1,\r\n \"database.mmsp-kn.de\": 1,\r\n \"ads.google.com\": 1,\r\n \"min.io\": 1,\r\n \"ftchinese.com\": 1,\r\n \"ft.com\": 1,\r\n \"gumroad.com\": 1,\r\n \"translate.googleusercontent.com\": 1,\r\n \"fuchsia.dev\": 1,\r\n \"www.bbb.org\": 1,\r\n \"www.twitch.tv\": 1,\r\n \"www.noon.com\": 1,\r\n \"discord.com\": 1,\r\n \"collector.githubapp.com\": 1,\r\n \"substack.com\": 1,\r\n \"recaptcha.net\": 1,\r\n \"deviantart.com\": 1,\r\n \"linkedin.com\": 1,\r\n \"boost.org\": 1,\r\n \"cppreference.com\": 1,\r\n \"duckduckgo.com\": 1,\r\n \"pinterest.jp\": 1,\r\n \"skia.org\": 1,\r\n \"v8.dev\": 1,\r\n \"bloomberg.net\": 1,\r\n \"steamcommunity.com\": 1,\r\n \"aps.com\": 1,\r\n \"bargain.mycard520.com.tw\": 1,\r\n \"ghcr.io\": 1,\r\n \"pixiv.net\": 1,\r\n \"osti.gov\": 1,\r\n \"scihub.copernicus.eu\": 1,\r\n \"io.google\": 1,\r\n \"unity3d\": 1,\r\n \"economist\": 1,\r\n \"api.semrush.com\": 1,\r\n \"amazonaws\": 1,\r\n \"steem.com\": 1,\r\n \"signup.steemit\": 1,\r\n \"brave.com\": 1,\r\n \"comtrade.un.org\": 1,\r\n \"www.behance.net\": 1\r\n};\r\nfunction FindProxyForURL(url, host) {\r\n var lastPos;\r\n do {\r\n if (autoproxy_host.hasOwnProperty(host)) {\r\n return '\\x50\\x52\\x4f\\x58\\x59 \\x61\\x67\\x65\\x6e\\x74\\x2e\\x62\\x61\\x69\\x64\\x75\\x2e\\x63\\x6f\\x6d\\x3a\\x38\\x31\\x31\\x38';\r\n }\r\n lastPos = host.indexOf('.') + 1;\r\n host = host.slice(lastPos);\r\n } while (lastPos >= 1);\r\n return 'DIRECT';\r\n}\r\n","color":"#fdff99","revision":"1815fd02746","pacUrl":"http://pac.internal.baidu.com/bdnew.pac","lastUpdate":"2022-06-14T01:05:15.705Z"}} \ No newline at end of file diff --git a/config/browser/swithyomega.json b/config/browser/swithyomega.json new file mode 100644 index 0000000..b453007 --- /dev/null +++ b/config/browser/swithyomega.json @@ -0,0 +1,62 @@ +{ + "+auto switch": { + "color": "#99dd99", + "defaultProfileName": "direct", + "name": "auto switch", + "profileType": "SwitchProfile", + "rules": [{ + "condition": { + "conditionType": "HostWildcardCondition", + "pattern": "internal.example.com" + }, + "profileName": "direct" + }, { + "condition": { + "conditionType": "HostWildcardCondition", + "pattern": "*.example.com" + }, + "profileName": "proxy" + }] + }, + "+proxy": { + "bypassList": [{ + "conditionType": "BypassCondition", + "pattern": "127.0.0.1" + }, { + "conditionType": "BypassCondition", + "pattern": "::1" + }, { + "conditionType": "BypassCondition", + "pattern": "localhost" + }], + "color": "#99ccee", + "fallbackProxy": { + "host": "proxy.example.com", + "port": 8080, + "scheme": "http" + }, + "name": "proxy", + "profileType": "FixedProfile" + }, + "-addConditionsToBottom": false, + "-confirmDeletion": true, + "-downloadInterval": 1440, + "-enableQuickSwitch": false, + "-quickSwitchProfiles": [], + "-refreshOnProfileChange": true, + "-revertProxyChanges": true, + "-showExternalProfile": true, + "-showInspectMenu": true, + "-startupProfileName": "", + "schemaVersion": 2, + "-monitorWebRequests": true, + "+work": { + "profileType": "PacProfile", + "name": "work", + "pacScript": "// Proxy Auto-Config file generated by BP&IT\r\nvar autoproxy_host = {\r\n \"kakao.com\": 1,\r\n \"dnsmos.azurewebsites.net\": 1,\r\n \"app.box.com\": 1,\r\n \"idmsac.corp.apple.com\": 1,\r\n \"quantumai.google\": 1,\r\n \"etherscan.io\": 1,\r\n \"ethereum.org\": 1,\r\n \"admob.com\": 1,\r\n \"github.blog\": 1,\r\n \"browser.sentry-cdn.com\": 1,\r\n \"waze.com\": 1,\r\n \"gather.town\": 1,\r\n \"docusign.com\": 1,\r\n \"docusign.net\": 1,\r\n \"www.admob.com\": 1,\r\n \"qnx.com\": 1,\r\n \"fontawesome.com\": 1,\r\n \"githubusercontent.com\": 1,\r\n \"2020.emnlp.org\": 1,\r\n \"listennotes.com\": 1,\r\n \"neurips.cc\": 1,\r\n \"kornferry.com\": 1,\r\n \"amazon.co.jp\": 1,\r\n \"rakuten.co.jp\": 1,\r\n \"skyprod.akadns.net\": 1,\r\n \"onedrive.com\": 1,\r\n \"onedrive.live.com\": 1,\r\n \"libreswan.org\": 1,\r\n \"64.media.tumblr.com\": 1,\r\n \"rapids.ai\": 1,\r\n \"rapidai.com\": 1,\r\n \"38.media.tumblr.com\": 1,\r\n \"www.whatsapp.com\": 1,\r\n \"openvidu.io\": 1,\r\n \"www.itu.int\": 1,\r\n \"webrtc.org\": 1,\r\n \"reactnavigation.org\": 1,\r\n \"npmjs.com\": 1,\r\n \"ant.design\": 1,\r\n \"vldb2020.org\": 1,\r\n \"quilljs.com\": 1,\r\n \"github.io\": 1,\r\n \"angular.io\": 1,\r\n \"kubernetes.io\": 1,\r\n \"www.theguardian.com\": 1,\r\n \"venturebeat.com\": 1,\r\n \"www.rfi.fr\": 1,\r\n \"www.lemonde.fr\": 1,\r\n \"www.lefigaro.fr\": 1,\r\n \"www.lesechos.fr\": 1,\r\n \"www.dw.com\": 1,\r\n \"www.rcinet.ca\": 1,\r\n \"www.theglobeandmail.com\": 1,\r\n \"www.rfa.org\": 1,\r\n \"www.voanews.com\": 1,\r\n \"elpais.com\": 1,\r\n \"www.elmundo.es\": 1,\r\n \"www.thestandnews.com\": 1,\r\n \"theinitium.com\": 1,\r\n \"hk.appledaily.com\": 1,\r\n \"tw.appledaily.com\": 1,\r\n \"www.ltn.com.tw\": 1,\r\n \"www.setn.com\": 1,\r\n \"hk01.com\": 1,\r\n \"dwnews.com\": 1,\r\n \"dwnews.net\": 1,\r\n \"go.dev\": 1,\r\n \"go.etcd.io\": 1,\r\n \"opensource.google\": 1,\r\n \"readthedocs.io\": 1,\r\n \"app.grammarly.com\": 1,\r\n \"s3.amazonaws.com\": 1,\r\n \"blob.core.windows.net\": 1,\r\n \"jestjs.io\": 1,\r\n \"icomoon.io\": 1,\r\n \"www.capitaliq.com\": 1,\r\n \"blog.google\": 1,\r\n \"research.google\": 1,\r\n \"hk-pan.baidu.com\": 1,\r\n \"hk-d.pcs.baidu.com\": 1,\r\n \"hk-pcs.baidu.com\": 1,\r\n \"hk-data.baidupcs.com\": 1,\r\n \"hk-data.pcs.baidu.com\": 1,\r\n \"hk-s0.baidu.com\": 1,\r\n \"dubox.com\": 1,\r\n \"duboxcdn.com\": 1,\r\n \"video.ibm.com\": 1,\r\n \"esa.int\": 1,\r\n \"overleaf.com\": 1,\r\n \"spdk.io\": 1,\r\n \"dribbble.com\": 1,\r\n \"arxiv.org\": 1,\r\n \"python.org\": 1,\r\n \"pytorch.org\": 1,\r\n \"4shared.com\": 1,\r\n \"abc.xyz\": 1,\r\n \"android.com\": 1,\r\n \"api.ai\": 1,\r\n \"apigee.com\": 1,\r\n \"appspot.com\": 1,\r\n \"arablionz.com\": 1,\r\n \"archive.org\": 1,\r\n \"atscaleconference.com\": 1,\r\n \"auth0.com\": 1,\r\n \"baidu.jp\": 1,\r\n \"bbc.com\": 1,\r\n \"bbci.co.uk\": 1,\r\n \"bbc.co.uk\": 1,\r\n \"bdr130.net\": 1,\r\n \"bigbluebutton.org\": 1,\r\n \"bit.ly\": 1,\r\n \"blogger.com\": 1,\r\n \"bloglines.com\": 1,\r\n \"blogspot.com\": 1,\r\n \"blogblog.com\": 1,\r\n \"blog.llvm.org\": 1,\r\n \"bloomberg.com\": 1,\r\n \"boardbook.org\": 1,\r\n \"businessweek.com\": 1,\r\n \"behance.net\": 1,\r\n \"sketchrepo.com\": 1,\r\n \"psdrepo.com\": 1,\r\n \"oculus.com\": 1,\r\n \"cari.com.my\": 1,\r\n \"cdn.mdn.mozilla.net\": 1,\r\n \"cdn.sstatic.net\": 1,\r\n \"chrome.com\": 1,\r\n \"chromium.org\": 1,\r\n \"cloud.databricks.com\": 1,\r\n \"cloudfront.net\": 1,\r\n \"code.google.com\": 1,\r\n \"conduit.com\": 1,\r\n \"console.sj.91.com\": 1,\r\n \"computershare.com\": 1,\r\n \"computershare.com.hk\": 1,\r\n \"citrix.com\": 1,\r\n \"dailymotion.com\": 1,\r\n \"ddth.com\": 1,\r\n \"demandbase.com\": 1,\r\n \"developer.mozilla.org\": 1,\r\n \"dev.twitch.tv\": 1,\r\n \"dialogflow.com\": 1,\r\n \"diziport.com\": 1,\r\n \"discuss.pytorch.org\": 1,\r\n \"dlitall.com\": 1,\r\n \"docs.webix.com\": 1,\r\n \"docker.com\": 1,\r\n \"docker.io\": 1,\r\n \"doubleclick.net\": 1,\r\n \"downloadkong.org\": 1,\r\n \"dropbox.com\": 1,\r\n \"ebiz.gov.in\": 1,\r\n \"edgar-online.com\": 1,\r\n \"ekolay.net\": 1,\r\n \"elastic.co\": 1,\r\n \"excite.co.jp\": 1,\r\n \"f8.com\": 1,\r\n \"fbf8.com\": 1,\r\n \"facebook.com\": 1,\r\n \"facebook.net\": 1,\r\n \"facebook.design\": 1,\r\n \"facegen.com\": 1,\r\n \"accountkit.com\": 1,\r\n \"fastly.net\": 1,\r\n \"fb.com\": 1,\r\n \"fbcdn.net\": 1,\r\n \"fbsbx.com\": 1,\r\n \"feeling.sourceforge.net\": 1,\r\n \"fiddle.jshell.net\": 1,\r\n \"filesonic.com\": 1,\r\n \"filestube.com\": 1,\r\n \"filgoal.com\": 1,\r\n \"fizy.com\": 1,\r\n \"flickr.com\": 1,\r\n \"firebaseio.com\": 1,\r\n \"flagstar.com\": 1,\r\n \"fonts.gstatic.com\": 1,\r\n \"formisimo.com\": 1,\r\n \"freebase.com\": 1,\r\n \"fumi23.com\": 1,\r\n \"funnelenvy.com\": 1,\r\n \"gcr.io\": 1,\r\n \"getgalileo.io\": 1,\r\n \"getkong.org\": 1,\r\n \"gezginler.net\": 1,\r\n \"ggpht.com\": 1,\r\n \"gluebenchmark.com\": 1,\r\n \"globo.com\": 1,\r\n \"gmail.com\": 1,\r\n \"gluon-cv.mxnet.io\": 1,\r\n \"golang.org\": 1,\r\n \"godoc.org\": 1,\r\n \"g.co\": 1,\r\n \"goo.gl\": 1,\r\n \"google.ca\": 1,\r\n \"google.de\": 1,\r\n \"google.fr\": 1,\r\n \"google.it\": 1,\r\n \"google.nl\": 1,\r\n \"google.co.jp\": 1,\r\n \"google.co.th\": 1,\r\n \"google.co.id\": 1,\r\n \"google.co.kr\": 1,\r\n \"google.co.uk\": 1,\r\n \"google.com\": 1,\r\n \"google.com.au\": 1,\r\n \"google.com.br\": 1,\r\n \"google.com.hk\": 1,\r\n \"google.com.tr\": 1,\r\n \"google.com.tw\": 1,\r\n \"google.com.my\": 1,\r\n \"google-analytics.com\": 1,\r\n \"googleblog.com\": 1,\r\n \"googleapis.com\": 1,\r\n \"googlecode.com\": 1,\r\n \"googleadservices.com\": 1,\r\n \"googlesource.com\": 1,\r\n \"googlesyndication.com\": 1,\r\n \"googletageservices.com\": 1,\r\n \"googletagmanager.com\": 1,\r\n \"googleusercontent.com\": 1,\r\n \"googlevideo.com\": 1,\r\n \"googletagservices.com\": 1,\r\n \"goonline.vn\": 1,\r\n \"gitbooks.io\": 1,\r\n \"gist.github.com\": 1,\r\n \"github-cloud.s3.amazonaws.com\": 1,\r\n \"github-com.s3.amazonaws.com\": 1,\r\n \"github.com\": 1,\r\n \"githubassets.com\": 1,\r\n \"gstatic.com\": 1,\r\n \"hadoopsphere.com\": 1,\r\n \"hellotxt.com\": 1,\r\n \"hg.olat.org\": 1,\r\n \"hhvm.com\": 1,\r\n \"hotfile.com\": 1,\r\n \"https.cdn.softlayer.net\": 1,\r\n \"hulu.com\": 1,\r\n \"hurriyet.com.tr\": 1,\r\n \"id.openrice.com\": 1,\r\n \"images-na.ssl-images-amazon.com\": 1,\r\n \"imageshack.us\": 1,\r\n \"imdb.com\": 1,\r\n \"imply.io\": 1,\r\n \"impress.co.jp\": 1,\r\n \"indowebster.com\": 1,\r\n \"instagram.com\": 1,\r\n \"cdninstagram.com\": 1,\r\n \"instagramstatic-a.akamaihd.net\": 1,\r\n \"instagramimages-a.akamaihd.net\": 1,\r\n \"immd.gov.hk\": 1,\r\n \"ird.gov.hk\": 1,\r\n \"izlesene.com\": 1,\r\n \"jeddahbikers.com\": 1,\r\n \"jobstreet.com.my\": 1,\r\n \"jquery.com\": 1,\r\n \"jsfiddle.net\": 1,\r\n \"jsoftj.com\": 1,\r\n \"justsystems.com\": 1,\r\n \"k8s.io\": 1,\r\n \"kaskus.us\": 1,\r\n \"kublr.com\": 1,\r\n \"kw.com\": 1,\r\n \"rocksdb.org\": 1,\r\n \"logdevice.io\": 1,\r\n \"ngc.nvidia.com\": 1,\r\n \"kooora.com\": 1,\r\n \"l0.awsstatic.com\": 1,\r\n \"l1.awsstatic.com\": 1,\r\n \"lamchame.com\": 1,\r\n \"lelong.com.my\": 1,\r\n \"lineclear.com\": 1,\r\n \"line.me\": 1,\r\n \"line-scdn.net\": 1,\r\n \"lowyat.net\": 1,\r\n \"lwn.net\": 1,\r\n \"lycos.com\": 1,\r\n \"maktoob.yahoo.com\": 1,\r\n \"malaysiakini.com\": 1,\r\n \"masrawy.com\": 1,\r\n \"mawaly.com\": 1,\r\n \"mazika2day.com\": 1,\r\n \"medium.com\": 1,\r\n \"metacafe.com\": 1,\r\n \"milliyet.com.tr\": 1,\r\n \"mit.edu\": 1,\r\n \"mixi.jp\": 1,\r\n \"moborobo.com\": 1,\r\n \"moheet.com\": 1,\r\n \"mudah.com.my\": 1,\r\n \"my.comscore.com\": 1,\r\n \"my.syncplicity.com\": 1,\r\n \"xml.syncplicity.com\": 1,\r\n \"myegy.com\": 1,\r\n \"mynet.com\": 1,\r\n \"nhacso.net\": 1,\r\n \"nytimes.com\": 1,\r\n \"nyt.com\": 1,\r\n \"objc.io\": 1,\r\n \"olat.org\": 1,\r\n \"onelogin.com\": 1,\r\n \"opencast.jira.com\": 1,\r\n \"opencastproject.org\": 1,\r\n \"openresty.org\": 1,\r\n \"orkut.com\": 1,\r\n \"orkut.com.br\": 1,\r\n \"oktacdn.com\": 1,\r\n \"packagecontrol.io\": 1,\r\n \"php.net\": 1,\r\n \"pge.com\": 1,\r\n \"tiqcdn.com\": 1,\r\n \"rawgit.com\": 1,\r\n \"casalemedia.com\": 1,\r\n \"optimizely.com\": 1,\r\n \"pingidentity.com\": 1,\r\n \"pinterest.com\": 1,\r\n \"pinimg.com\": 1,\r\n \"pixnet.net\": 1,\r\n \"plurk.com\": 1,\r\n \"plus.google.com\": 1,\r\n \"polleverywhere-css-tests.s3.amazonaws.com\": 1,\r\n \"pypi.python.org\": 1,\r\n \"popin.cc\": 1,\r\n \"quartznet.sourceforge.net\": 1,\r\n \"quartz-scheduler.org\": 1,\r\n \"quoracdn.net\": 1,\r\n \"quora.com\": 1,\r\n \"quoracdn.net\": 1,\r\n \"quantcount.com\": 1,\r\n \"randomserver.com\": 1,\r\n \"rapidshare.com\": 1,\r\n \"raw.githubusercontent.com\": 1,\r\n \"reddit.com\": 1,\r\n \"redditmedia.com\": 1,\r\n \"redis.io\": 1,\r\n \"redd.it\": 1,\r\n \"redditstatic.com\": 1,\r\n \"reuters.com\": 1,\r\n \"reutersmedia.net\": 1,\r\n \"rstudio.com\": 1,\r\n \"rubiconproject.com\": 1,\r\n \"s0.awsstatic.com\": 1,\r\n \"sahibinden.com\": 1,\r\n \"sakaiproject.org\": 1,\r\n \"schema.org\": 1,\r\n \"scmp.com\": 1,\r\n \"scribd.com\": 1,\r\n \"shl.com\": 1,\r\n \"shutterstock.com\": 1,\r\n \"socrative.com\": 1,\r\n \"socrative-production-static-web.s3.amazonaws.com\": 1,\r\n \"shorouknews.com\": 1,\r\n \"slack.com\": 1,\r\n \"slideshare.net\": 1,\r\n \"sm3na.com\": 1,\r\n \"sketchappsources.com\": 1,\r\n \"source.sakaiproject.org\": 1,\r\n \"socialblade.com\": 1,\r\n \"spring.io\": 1,\r\n \"sptechs.com\": 1,\r\n \"stafaband.info\": 1,\r\n \"startupgrind.com\": 1,\r\n \"svbconnect.com\": 1,\r\n \"symantec.com\": 1,\r\n \"symantecliveupdate.com\": 1,\r\n \"sensortower.com\": 1,\r\n \"stackoverflow.com\": 1,\r\n \"realtor.com\": 1,\r\n \"moveaws.com\": 1,\r\n \"zillow.com\": 1,\r\n \"zillowstatic.com\": 1,\r\n \"trulia.com\": 1,\r\n \"trulia-cdn.com\": 1,\r\n \"t.co\": 1,\r\n \"tailieu.vn\": 1,\r\n \"te3p.com\": 1,\r\n \"techcrunch.com\": 1,\r\n \"technorati.com\": 1,\r\n \"tedata.net\": 1,\r\n \"tensorflow.org\": 1,\r\n \"telegram.org\": 1,\r\n \"terra.com.br\": 1,\r\n \"tfhub.dev\": 1,\r\n \"thecvf.com\": 1,\r\n \"themalaysianinsider.com\": 1,\r\n \"thinkwithgoogle.com\": 1,\r\n \"time.com\": 1,\r\n \"timestamp.comodoca.com\": 1,\r\n \"timestamp.globalsign.com\": 1,\r\n \"timsah.com\": 1,\r\n \"tinhte.vn\": 1,\r\n \"tmc.tippingpoint.com\": 1,\r\n \"topshareware.com\": 1,\r\n \"trekaklik.com\": 1,\r\n \"truongton.net\": 1,\r\n \"turan.org\": 1,\r\n \"twimg.com\": 1,\r\n \"twitter.com\": 1,\r\n \"unikey.org\": 1,\r\n \"user-images.githubusercontent.com\": 1,\r\n \"uol.com.br\": 1,\r\n \"ustream.tv\": 1,\r\n \"vatanim.com.tr\": 1,\r\n \"vector.co.jp\": 1,\r\n \"vietgle.vn\": 1,\r\n \"vimeo.com\": 1,\r\n \"virustotal.com\": 1,\r\n \"vnexpress.net\": 1,\r\n \"vn-zoom.com\": 1,\r\n \"vodafone.com.eg\": 1,\r\n \"waymo.com\": 1,\r\n \"webtretho.com\": 1,\r\n \"wikimedia.org\": 1,\r\n \"wikipedia.org\": 1,\r\n \"windowsupdate.com\": 1,\r\n \"withgoogle.com\": 1,\r\n \"wipo.int\": 1,\r\n \"wordpress.com\": 1,\r\n \"wordpress.org\": 1,\r\n \"www.gov.hk\": 1,\r\n \"wp.com\": 1,\r\n \"wretch.cc\": 1,\r\n \"ws.tippingpoint.com\": 1,\r\n \"wsj.com\": 1,\r\n \"wsj.net\": 1,\r\n \"yahoo.co.jp\": 1,\r\n \"yahoo.com\": 1,\r\n \"yallakora.com\": 1,\r\n \"ycombinator.com\": 1,\r\n \"yoo7.com\": 1,\r\n \"youm7.com\": 1,\r\n \"youtube.com\": 1,\r\n \"youtu.be\": 1,\r\n \"ytimg.com\": 1,\r\n \"yume.vn\": 1,\r\n \"zamalekfans.com\": 1,\r\n \"ziddu.com\": 1,\r\n \"zing.vn\": 1,\r\n \"zoom.us\": 1,\r\n \"dmv.ca.gov\": 1,\r\n \"cpuc.ca.gov\": 1,\r\n \"i.stack.imgur.com\": 1,\r\n \"testing.googleblog.com\": 1,\r\n \"zoho.com\": 1,\r\n \"www.tiktok.com\": 1,\r\n \"artstation.com\": 1,\r\n \"terabox.com\": 1,\r\n \"teraboxcdn.com\": 1,\r\n \"www.ibm.com\": 1,\r\n \"ads.snapchat.com\": 1,\r\n \"translate.googleapis.com\": 1,\r\n \"www.armorize.com\": 1,\r\n \"nextjs.org\": 1,\r\n \"octave-online.net\": 1,\r\n \"figma.com\": 1,\r\n \"ietf.org\": 1,\r\n \"istio.io\": 1,\r\n \"bulletin.com\": 1,\r\n \"googleplay.com\": 1,\r\n \"cafe.naver.com\": 1,\r\n \"blog.naver.com\": 1,\r\n \"dnsmos-2.azurewebsites.net\": 1,\r\n \"meetanyway.com\": 1,\r\n \"database.mmsp-kn.de\": 1,\r\n \"ads.google.com\": 1,\r\n \"min.io\": 1,\r\n \"ftchinese.com\": 1,\r\n \"ft.com\": 1,\r\n \"gumroad.com\": 1,\r\n \"translate.googleusercontent.com\": 1,\r\n \"fuchsia.dev\": 1,\r\n \"www.bbb.org\": 1,\r\n \"www.twitch.tv\": 1,\r\n \"www.noon.com\": 1,\r\n \"discord.com\": 1,\r\n \"collector.githubapp.com\": 1,\r\n \"substack.com\": 1,\r\n \"recaptcha.net\": 1,\r\n \"deviantart.com\": 1,\r\n \"linkedin.com\": 1,\r\n \"boost.org\": 1,\r\n \"cppreference.com\": 1,\r\n \"duckduckgo.com\": 1,\r\n \"pinterest.jp\": 1,\r\n \"skia.org\": 1,\r\n \"v8.dev\": 1,\r\n \"bloomberg.net\": 1,\r\n \"steamcommunity.com\": 1,\r\n \"aps.com\": 1,\r\n \"bargain.mycard520.com.tw\": 1,\r\n \"ghcr.io\": 1,\r\n \"pixiv.net\": 1,\r\n \"osti.gov\": 1,\r\n \"scihub.copernicus.eu\": 1,\r\n \"io.google\": 1,\r\n \"unity3d\": 1,\r\n \"economist\": 1,\r\n \"api.semrush.com\": 1,\r\n \"amazonaws\": 1,\r\n \"steem.com\": 1,\r\n \"signup.steemit\": 1,\r\n \"brave.com\": 1,\r\n \"comtrade.un.org\": 1,\r\n \"www.behance.net\": 1\r\n};\r\nfunction FindProxyForURL(url, host) {\r\n var lastPos;\r\n do {\r\n if (autoproxy_host.hasOwnProperty(host)) {\r\n return '\\x50\\x52\\x4f\\x58\\x59 \\x61\\x67\\x65\\x6e\\x74\\x2e\\x62\\x61\\x69\\x64\\x75\\x2e\\x63\\x6f\\x6d\\x3a\\x38\\x31\\x31\\x38';\r\n }\r\n lastPos = host.indexOf('.') + 1;\r\n host = host.slice(lastPos);\r\n } while (lastPos >= 1);\r\n return 'DIRECT';\r\n}\r\n", + "color": "#fdff99", + "revision": "1815fd02746", + "pacUrl": "http://pac.internal.baidu.com/bdnew.pac", + "lastUpdate": "2022-06-14T01:05:15.705Z" + } +} diff --git a/config/browser/tabliss.json b/config/browser/tabliss.json new file mode 100644 index 0000000..df0c5cb --- /dev/null +++ b/config/browser/tabliss.json @@ -0,0 +1,63 @@ +{ + "backgrounds": [{ + "id": "f9557eb3-0562-4e68-a342-5bc0b1d898c0", + "key": "background/unsplash", + "active": true, + "display": { + "luminosity": 0, + "blur": 0 + } + }], + "widgets": [{ + "id": "500aa99d-b545-43da-b2a8-15207e16f1d1", + "key": "widget/time", + "active": true, + "display": { + "position": "middleCentre" + } + }, { + "id": "fbaadb83-bd3f-44df-9e19-218619f63ee7", + "key": "widget/search", + "active": true, + "display": { + "position": "middleCentre", + "fontSize": 38 + } + }], + "data": { + "bc5e264c-6377-47c8-b26f-d966227c72c0": { + "expand": false, + "nsfw": false, + "tag": "pattern" + }, + "bd54b819-160e-4974-85a2-00910953dc3d": { + "by": "official", + "collections": "", + "featured": false, + "search": "", + "timeout": 86400 + }, + "f9557eb3-0562-4e68-a342-5bc0b1d898c0": { + "by": "official", + "collections": "", + "featured": false, + "search": "", + "timeout": 86400 + }, + "500aa99d-b545-43da-b2a8-15207e16f1d1": { + "mode": "digital", + "hour12": false, + "showDate": false, + "showMinutes": true, + "showSeconds": true, + "showDayPeriod": true, + "timeZone": "Asia/Shanghai" + } + }, + "locale": "en", + "timeZone": "Asia/Shanghai", + "_persist": { + "version": -1, + "rehydrated": true + } +} \ No newline at end of file diff --git a/config/browser/vim-vixen.json b/config/browser/vim-vixen.json new file mode 100644 index 0000000..5394db4 --- /dev/null +++ b/config/browser/vim-vixen.json @@ -0,0 +1,235 @@ +{ + "keymaps": { + "0": { + "type": "scroll.home" + }, + ":": { + "type": "command.show" + }, + "o": { + "type": "command.show.open", + "alter": false + }, + "O": { + "type": "command.show.open", + "alter": true + }, + "t": { + "type": "command.show.tabopen", + "alter": false + }, + "T": { + "type": "command.show.tabopen", + "alter": true + }, + "w": { + "type": "command.show.winopen", + "alter": false + }, + "W": { + "type": "command.show.winopen", + "alter": true + }, + "b": { + "type": "command.show.buffer" + }, + "a": { + "type": "command.show.addbookmark", + "alter": true + }, + "k": { + "type": "scroll.vertically", + "count": -1 + }, + "j": { + "type": "scroll.vertically", + "count": 1 + }, + "h": { + "type": "scroll.horizonally", + "count": -1 + }, + "l": { + "type": "scroll.horizonally", + "count": 1 + }, + "": { + "type": "scroll.pages", + "count": -0.5 + }, + "": { + "type": "scroll.pages", + "count": 0.5 + }, + "": { + "type": "scroll.pages", + "count": -1 + }, + "": { + "type": "scroll.pages", + "count": 1 + }, + "gg": { + "type": "scroll.top" + }, + "G": { + "type": "scroll.bottom" + }, + "$": { + "type": "scroll.end" + }, + "d": { + "type": "tabs.close", + "select": "right" + }, + "D": { + "type": "tabs.close", + "select": "left" + }, + "x$": { + "type": "tabs.close.right" + }, + "!d": { + "type": "tabs.close.force" + }, + "u": { + "type": "tabs.reopen" + }, + "K": { + "type": "tabs.prev" + }, + "J": { + "type": "tabs.next" + }, + "gT": { + "type": "tabs.prev" + }, + "gt": { + "type": "tabs.next" + }, + "g0": { + "type": "tabs.first" + }, + "g$": { + "type": "tabs.last" + }, + "": { + "type": "tabs.prevsel" + }, + "r": { + "type": "tabs.reload", + "cache": false + }, + "R": { + "type": "tabs.reload", + "cache": true + }, + "zp": { + "type": "tabs.pin.toggle" + }, + "zd": { + "type": "tabs.duplicate" + }, + "zi": { + "type": "zoom.in" + }, + "zo": { + "type": "zoom.out" + }, + "zz": { + "type": "zoom.neutral" + }, + "f": { + "type": "follow.start", + "newTab": false, + "background": true + }, + "F": { + "type": "follow.start", + "newTab": true, + "background": false + }, + "m": { + "type": "mark.set.prefix" + }, + "'": { + "type": "mark.jump.prefix" + }, + "H": { + "type": "navigate.history.prev" + }, + "L": { + "type": "navigate.history.next" + }, + "[[": { + "type": "navigate.link.prev" + }, + "]]": { + "type": "navigate.link.next" + }, + "gu": { + "type": "navigate.parent" + }, + "gU": { + "type": "navigate.root" + }, + "gi": { + "type": "focus.input" + }, + "gf": { + "type": "page.source" + }, + "gh": { + "type": "page.home", + "newTab": false + }, + "gH": { + "type": "page.home", + "newTab": true + }, + "y": { + "type": "urls.yank" + }, + "p": { + "type": "urls.paste", + "newTab": false + }, + "P": { + "type": "urls.paste", + "newTab": true + }, + "/": { + "type": "find.start" + }, + "n": { + "type": "find.next" + }, + "N": { + "type": "find.prev" + }, + ".": { + "type": "repeat.last" + }, + "": { + "type": "addon.toggle.enabled" + } + }, + "search": { + "default": "google", + "engines": { + "google": "https://google.com/search?q={}", + "yahoo": "https://search.yahoo.com/search?p={}", + "bing": "https://www.bing.com/search?q={}", + "duckduckgo": "https://duckduckgo.com/?q={}", + "twitter": "https://twitter.com/search?q={}", + "wikipedia": "https://en.wikipedia.org/w/index.php?search={}" + } + }, + "properties": { + "hintchars": "abcdefghijklmnopqrstuvwxyz", + "smoothscroll": false, + "complete": "sbh", + "colorscheme": "system" + }, + "blacklist": [] +} diff --git a/config/browser/vimium-c.json b/config/browser/vimium-c.json new file mode 100644 index 0000000..eabea68 --- /dev/null +++ b/config/browser/vimium-c.json @@ -0,0 +1,101 @@ +{ + "name": "Vimium C", + "@time": "2022/6/14 20:36:57", + "time": 1655210217471, + "environment": { + "extension": "1.98.2", + "platform": "win", + "firefox": 101 + }, + "exclusionRules": [ + { + "pattern": ":https://mail.google.com/", + "passKeys": "" + } + ], + "ignoreKeyboardLayout": 1, + "keyMappings": [ + "#!no-check", + "map b Vomnibar.activateBookmarksInNewTab", + "map B Vomnibar.activateBookmarks", + "map ct captureTab", + "map d removeTab", + "map D closeTabsOnRight", + "map f LinkHints.activateOpenInNewTab", + "map F LinkHints.activate", + "map scrollPageDown", + "map scrollPageUp", + "map o Vomnibar.activateInNewTab", + "map O Vomnibar.activate", + "map p openCopiedUrlInNewTab", + "map P openCopiedUrlInCurrentTab", + "map r reload", + "map sc sortTabs createTime", + "map sr sortTabs recency", + "map u restoreTab", + "map yf copyWindowInfo", + "map yt copyCurrentTitle", + "map yy copyCurrentUrl", + "map zd duplicateTab", + "map zp togglePinTab", + "map zi zoomIn", + "map zo zoomOut", + "map zz zoomReset" + ], + "linkHintCharacters": "abcdefghijklmnopqrstuvwxyz", + "searchEngines": [ + "ba|baidu|Baidu|百度: https://www.baidu.com/s?ie=utf-8&wd=%s \\", + " blank=https://www.baidu.com/ 百度", + "b|bi: https://www.bing.com/search?q=$s", + "b|bi|bing|Bing|必应: https://cn.bing.com/search?q=%s \\", + " blank=https://cn.bing.com/ 必应", + "g|go|gg|google|Google|谷歌: https://www.google.com/search?q=%s\\", + " www.google.com re=/^(?:\\.[a-z]{2,4})?\\/search\\b.*?[#&?]q=([^#&]*)/i\\", + " blank=https://www.google.com/ Google", + "br|brave: https://search.brave.com/search?q=%s Brave", + "d|dd|ddg|duckduckgo: https://duckduckgo.com/?q=%s DuckDuckGo", + "ec|ecosia: https://www.ecosia.org/search?q=%s Ecosia", + "qw|qwant: https://www.qwant.com/?q=%s Qwant", + "ya|yd|yandex: https://yandex.com/search/?text=%s Yandex", + "yh|yahoo: https://search.yahoo.com/search?p=%s Yahoo", + "maru|mailru|mail.ru: https://go.mail.ru/search?q=%s Mail.ru", + "", + "b.m|bm|map|b.map|bmap|地图|百度地图: \\", + " https://api.map.baidu.com/geocoder?output=html&address=%s&src=vimium-c\\", + " blank=https://map.baidu.com/", + "gd|gaode|高德地图: https://www.gaode.com/search?query=%s \\", + " blank=https://www.gaode.com", + "g.m|gm|g.map|gmap: https://www.google.com/maps?q=%s \\", + " blank=https://www.google.com/maps 谷歌地图", + "bili|bilibili|bz|Bili: https://search.bilibili.com/all?keyword=%s \\", + " blank=https://www.bilibili.com/ 哔哩哔哩", + "y|yt: https://www.youtube.com/results?search_query=%s \\", + " blank=https://www.youtube.com/ YouTube", + "", + "w|wiki: https://www.wikipedia.org/w/index.php?search=%s Wikipedia", + "b.x|b.xs|bx|bxs|bxueshu: https://xueshu.baidu.com/s?ie=utf-8&wd=%s \\", + " blank=https://xueshu.baidu.com/ 百度学术", + "gs|g.s|gscholar|g.x|gx|gxs: https://scholar.google.com/scholar?q=$s \\", + " scholar.google.com re=/^(?:\\.[a-z]{2,4})?\\/scholar\\b.*?[#&?]q=([^#&]*)/i\\", + " blank=https://scholar.google.com/ 谷歌学术", + "", + "t|tb|taobao|ali|淘宝: https://s.taobao.com/search?ie=utf8&q=%s \\", + " blank=https://www.taobao.com/ 淘宝", + "j|jd|jingdong|京东: https://search.jd.com/Search?enc=utf-8&keyword=%s\\", + " blank=https://jd.com/ 京东", + "az|amazon: https://www.amazon.com/s?k=%s \\", + " blank=https://www.amazon.com/ 亚马逊", + "", + "\\:i: vimium://sed/s/^//,lower\\ $S re= Lower case", + "v.m|math: vimium://math\\ $S re= 计算器", + "v.p: vimium://parse\\ $S re= Redo Search", + "gh|github: https://github.com/search?q=$s \\", + " blank=https://github.com/ GitHub 仓库", + "ge|gitee: https://search.gitee.com/?type=repository&q=$s \\", + " blank=https://gitee.com/ Gitee 仓库", + "js\\:|Js: javascript:\\ $S; JavaScript", + "" + ], + "searchUrl": "https://cn.bing.com/search?q=$s Bing", + "vimSync": false +} diff --git a/config/cisco/cisco_client.md b/config/cisco/cisco_client.md new file mode 100644 index 0000000..af9f2ec --- /dev/null +++ b/config/cisco/cisco_client.md @@ -0,0 +1,14 @@ +# Linux Cisco client Installation + +## Systemd config + +place vpnagend.service to `/usr/lib/systemd/system/` + +## Replacement + +Cisco client can be replaced by `openconnect`. Just install it with pacman(or aur helper) if your linux distribution is based on Archlinux. + +```bash +yay -S openconnect +``` + diff --git a/config/cisco/vpnagentd.service b/config/cisco/vpnagentd.service new file mode 100644 index 0000000..da20eec --- /dev/null +++ b/config/cisco/vpnagentd.service @@ -0,0 +1,14 @@ +[Unit] +Description=Cisco VPN Service +Wants=NetworkManager.service +After=NetworkManager.service + +[Service] +Type=forking +ExecStart=/opt/cisco/anyconnect/bin/vpnagentd +PIDFile=/var/run/vpnagentd.pid +ExecReload=/usr/bin/kill -HUP $MAINPID + +[Install] +WantedBy=multi-user.target + diff --git a/config/docker/config.sh b/config/docker/config.sh new file mode 100644 index 0000000..7f330ff --- /dev/null +++ b/config/docker/config.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +group=docker + +# create group docker if not exists +egrep "^$group" /etc/group >&/dev/null +if [ $? -ne 0 ]; then + groupadd $group +fi + +# add user to group docker +sudo usermod -aG ${group} ${USER} diff --git a/config/fcitx/config-rime.sh b/config/fcitx/config-rime.sh new file mode 100644 index 0000000..9f4911d --- /dev/null +++ b/config/fcitx/config-rime.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +cp -f ~/Projects/notes/config/rime/default.custom.yaml ~/.config/fcitx/rime/ +cp -f ~/Projects/notes/config/rime/double_pinyin.custom.yaml ~/.config/fcitx/rime/ +cp -f ~/Projects/notes/config/rime/double_pinyin_flypy.schema.yaml ~/.config/fcitx/rime/ +cp -rf ~/Projects/notes/config/rime/opencc ~/.config/fcitx/rime/ diff --git a/config/fcitx/get-fcitx.sh b/config/fcitx/get-fcitx.sh new file mode 100644 index 0000000..2ab687e --- /dev/null +++ b/config/fcitx/get-fcitx.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +yay -S fcitx fcitx-gtk2 fcitx-gtk3 fcitx-configtool fcitx-rime + +conf_file=$HOME/.xprofile + +if [ -f $conf_file ]; then + echo "$conf_file exists! Now it is moved to $HOME/.xprofile_bak" + mv $conf_file $HOME/.xprofile_bak +fi + +echo 'export GTK_IM_MODULE=fcitx' >>$conf_file +echo 'export QT_IM_MODULE=fcitx' >>$conf_file +echo 'export XMODIFIERS=@im=fcitx' >>$conf_file diff --git a/config/fcitx5/conf/cached_layouts b/config/fcitx5/conf/cached_layouts new file mode 100644 index 0000000..452b34f --- /dev/null +++ b/config/fcitx5/conf/cached_layouts @@ -0,0 +1,3515 @@ +[keyboard-apl] +Description="Keyboard - APL" +Language=en +Label=apl + +[keyboard-apl-dyalog] +Description="Keyboard - APL - APL symbols (Dyalog APL)" +Language=en +Label=dlg + +[keyboard-apl-sax] +Description="Keyboard - APL - APL symbols (SAX, Sharp APL for Unix)" +Language=en +Label=sax + +[keyboard-apl-unified] +Description="Keyboard - APL - APL symbols (unified)" +Language=en +Label=ufd + +[keyboard-apl-apl2] +Description="Keyboard - APL - APL symbols (IBM APL2)" +Language=en +Label=apl2 + +[keyboard-apl-aplplusII] +Description="Keyboard - APL - APL symbols (Manugistics APL*PLUS II)" +Language=en +Label=aplII + +[keyboard-apl-aplx] +Description="Keyboard - APL - APL symbols (APLX unified)" +Language=en +Label=aplx + +[keyboard-jv] +Description="Keyboard - Indonesian (Javanese)" +Language= +Label=jv + +[keyboard-tz] +Description="Keyboard - Swahili (Tanzania)" +Language=sw +Label=sw + +[keyboard-brai] +Description="Keyboard - Braille" +Language= +Label=brl + +[keyboard-brai-left_hand] +Description="Keyboard - Braille - Braille (left-handed)" +Language= +Label=brai + +[keyboard-brai-left_hand_invert] +Description="Keyboard - Braille - Braille (left-handed inverted thumb)" +Language= +Label=brai + +[keyboard-brai-right_hand] +Description="Keyboard - Braille - Braille (right-handed)" +Language= +Label=brai + +[keyboard-brai-right_hand_invert] +Description="Keyboard - Braille - Braille (right-handed inverted thumb)" +Language= +Label=brai + +[keyboard-et] +Description="Keyboard - Amharic" +Language=am +Label=am + +[keyboard-tm] +Description="Keyboard - Turkmen" +Language=tk +Label=tk + +[keyboard-tm-alt] +Description="Keyboard - Turkmen - Turkmen (Alt-Q)" +Language=tk +Label=tm + +[keyboard-np] +Description="Keyboard - Nepali" +Language=ne +Label=ne + +[keyboard-epo] +Description="Keyboard - Esperanto" +Language=eo +Label=eo + +[keyboard-epo-legacy] +Description="Keyboard - Esperanto - Esperanto (legacy)" +Language=eo +Label=epo + +[keyboard-eu] +Description="Keyboard - EurKEY (US)" +Language=ca +Label=eu + +[keyboard-za] +Description="Keyboard - English (South Africa)" +Language=en +Label=en + +[keyboard-bw] +Description="Keyboard - Tswana" +Language=tn +Label=tn + +[keyboard-kr] +Description="Keyboard - Korean" +Language=ko +Label=ko + +[keyboard-kr-kr104] +Description="Keyboard - Korean - Korean (101/104-key compatible)" +Language=ko +Label=kr + +[keyboard-kr-sun_type6] +Description="Keyboard - Korean - Korean (Sun Type 6/7)" +Language=ko +Label=kr + +[keyboard-gb] +Description="Keyboard - English (UK)" +Language=en +Label=en + +[keyboard-gb-extd] +Description="Keyboard - English (UK) - English (UK, extended, Windows)" +Language=en +Label=gb + +[keyboard-gb-intl] +Description="Keyboard - English (UK) - English (UK, intl., with dead keys)" +Language=en +Label=gb + +[keyboard-gb-dvorak] +Description="Keyboard - English (UK) - English (UK, Dvorak)" +Language=en +Label=gb + +[keyboard-gb-dvorakukp] +Description="Keyboard - English (UK) - English (UK, Dvorak, with UK punctuation)" +Language=en +Label=gb + +[keyboard-gb-mac] +Description="Keyboard - English (UK) - English (UK, Macintosh)" +Language=en +Label=gb + +[keyboard-gb-mac_intl] +Description="Keyboard - English (UK) - English (UK, Macintosh, intl.)" +Language=en +Label=gb + +[keyboard-gb-colemak] +Description="Keyboard - English (UK) - English (UK, Colemak)" +Language=en +Label=gb + +[keyboard-gb-colemak_dh] +Description="Keyboard - English (UK) - English (UK, Colemak-DH)" +Language=en +Label=gb + +[keyboard-gb-pl] +Description="Keyboard - English (UK) - Polish (British keyboard)" +Language=pl +Label=pl + +[keyboard-gb-sun_type6] +Description="Keyboard - English (UK) - English (UK, Sun Type 6/7)" +Language=en +Label=gb + +[keyboard-gb-hyena] +Description="Keyboard - English (UK) - English (UK, Hyena Layer5)" +Language=en +Label=gb + +[keyboard-gb-hyena-intl] +Description="Keyboard - English (UK) - English (UK, intl., with dead keys, Hyena Layer5)" +Language=en +Label=gb + +[keyboard-gb-miniguru] +Description="Keyboard - English (UK) - English (UK, MiniGuru Layer5)" +Language=en +Label=gb + +[keyboard-gb-miniguru-intl] +Description="Keyboard - English (UK) - English (UK, intl., with dead keys, MiniGuru Layer5)" +Language=en +Label=gb + +[keyboard-gb-yoda] +Description="Keyboard - English (UK) - English (UK, TEX Yoda Layer5)" +Language=en +Label=gb + +[keyboard-gb-yoda-intl] +Description="Keyboard - English (UK) - English (UK, intl., with dead keys, TEX Yoda Layer5)" +Language=en +Label=gb + +[keyboard-ua] +Description="Keyboard - Ukrainian" +Language=uk +Label=uk + +[keyboard-ua-phonetic] +Description="Keyboard - Ukrainian - Ukrainian (phonetic)" +Language=uk +Label=ua + +[keyboard-ua-typewriter] +Description="Keyboard - Ukrainian - Ukrainian (typewriter)" +Language=uk +Label=ua + +[keyboard-ua-winkeys] +Description="Keyboard - Ukrainian - Ukrainian (Windows)" +Language=uk +Label=ua + +[keyboard-ua-legacy] +Description="Keyboard - Ukrainian - Ukrainian (legacy)" +Language=uk +Label=ua + +[keyboard-ua-rstu] +Description="Keyboard - Ukrainian - Ukrainian (standard RSTU)" +Language=uk +Label=ua + +[keyboard-ua-rstu_ru] +Description="Keyboard - Ukrainian - Russian (Ukraine, standard RSTU)" +Language=uk +Label=ua + +[keyboard-ua-homophonic] +Description="Keyboard - Ukrainian - Ukrainian (homophonic)" +Language=uk +Label=ua + +[keyboard-ua-sun_type6] +Description="Keyboard - Ukrainian - Ukrainian (Sun Type 6/7)" +Language=uk +Label=ua + +[keyboard-th] +Description="Keyboard - Thai" +Language=th +Label=th + +[keyboard-th-tis] +Description="Keyboard - Thai - Thai (TIS-820.2538)" +Language=th +Label=th + +[keyboard-th-pat] +Description="Keyboard - Thai - Thai (Pattachote)" +Language=th +Label=th + +[keyboard-mv] +Description="Keyboard - Dhivehi" +Language=dv +Label=dv + +[keyboard-nec_vndr/jp] +Description="Keyboard - Japanese (PC-98)" +Language=ja +Label=ja + +[keyboard-tj] +Description="Keyboard - Tajik" +Language=tg +Label=tg + +[keyboard-tj-legacy] +Description="Keyboard - Tajik - Tajik (legacy)" +Language=tg +Label=tj + +[keyboard-sk] +Description="Keyboard - Slovak" +Language=sk +Label=sk + +[keyboard-sk-bksl] +Description="Keyboard - Slovak - Slovak (extended backslash)" +Language=sk +Label=sk + +[keyboard-sk-qwerty] +Description="Keyboard - Slovak - Slovak (QWERTY)" +Language=sk +Label=sk + +[keyboard-sk-qwerty_bksl] +Description="Keyboard - Slovak - Slovak (QWERTY, extended backslash)" +Language=sk +Label=sk + +[keyboard-sk-acc] +Description="Keyboard - Slovak - Slovak (ACC layout, only accented letters)" +Language=sk +Label=sk + +[keyboard-sk-sun_type6] +Description="Keyboard - Slovak - Slovak (Sun Type 6/7)" +Language=sk +Label=sk + +[keyboard-ru] +Description="Keyboard - Russian" +Language=ru +Label=ru + +[keyboard-ru-phonetic] +Description="Keyboard - Russian - Russian (phonetic)" +Language=ru +Label=ru + +[keyboard-ru-phonetic_winkeys] +Description="Keyboard - Russian - Russian (phonetic, Windows)" +Language=ru +Label=ru + +[keyboard-ru-phonetic_YAZHERTY] +Description="Keyboard - Russian - Russian (phonetic, YAZHERTY)" +Language=ru +Label=ru + +[keyboard-ru-typewriter] +Description="Keyboard - Russian - Russian (typewriter)" +Language=ru +Label=ru + +[keyboard-ru-legacy] +Description="Keyboard - Russian - Russian (legacy)" +Language=ru +Label=ru + +[keyboard-ru-typewriter-legacy] +Description="Keyboard - Russian - Russian (typewriter, legacy)" +Language=ru +Label=ru + +[keyboard-ru-tt] +Description="Keyboard - Russian - Tatar" +Language=tt +Label=ru + +[keyboard-ru-os_legacy] +Description="Keyboard - Russian - Ossetian (legacy)" +Language=os +Label=ru + +[keyboard-ru-os_winkeys] +Description="Keyboard - Russian - Ossetian (Windows)" +Language=os +Label=ru + +[keyboard-ru-cv] +Description="Keyboard - Russian - Chuvash" +Language=cv +Label=ru + +[keyboard-ru-cv_latin] +Description="Keyboard - Russian - Chuvash (Latin)" +Language=cv +Label=ru + +[keyboard-ru-udm] +Description="Keyboard - Russian - Udmurt" +Language=udm +Label=ru + +[keyboard-ru-kom] +Description="Keyboard - Russian - Komi" +Language=kv +Label=ru + +[keyboard-ru-sah] +Description="Keyboard - Russian - Yakut" +Language=sah +Label=ru + +[keyboard-ru-xal] +Description="Keyboard - Russian - Kalmyk" +Language=xal +Label=ru + +[keyboard-ru-dos] +Description="Keyboard - Russian - Russian (DOS)" +Language=ru +Label=ru + +[keyboard-ru-mac] +Description="Keyboard - Russian - Russian (Macintosh)" +Language=ru +Label=ru + +[keyboard-ru-srp] +Description="Keyboard - Russian - Serbian (Russia)" +Language=ru +Label=ru + +[keyboard-ru-bak] +Description="Keyboard - Russian - Bashkirian" +Language=ba +Label=ru + +[keyboard-ru-chm] +Description="Keyboard - Russian - Mari" +Language=chm +Label=ru + +[keyboard-ru-phonetic_azerty] +Description="Keyboard - Russian - Russian (phonetic, AZERTY)" +Language=ru +Label=ru + +[keyboard-ru-phonetic_dvorak] +Description="Keyboard - Russian - Russian (phonetic, Dvorak)" +Language=ru +Label=ru + +[keyboard-ru-phonetic_fr] +Description="Keyboard - Russian - Russian (phonetic, French)" +Language=ru +Label=ru + +[keyboard-ru-chu] +Description="Keyboard - Russian - Church Slavonic" +Language=cu +Label=ru + +[keyboard-ru-ruu] +Description="Keyboard - Russian - Russian (with Ukrainian-Belorussian layout)" +Language=ru +Label=ru + +[keyboard-ru-rulemak] +Description="Keyboard - Russian - Russian (Rulemak, phonetic Colemak)" +Language=ru +Label=ru + +[keyboard-ru-phonetic_mac] +Description="Keyboard - Russian - Russian (phonetic Macintosh)" +Language=ru +Label=ru + +[keyboard-ru-sun_type6] +Description="Keyboard - Russian - Russian (Sun Type 6/7)" +Language=ru +Label=ru + +[keyboard-ru-unipunct] +Description="Keyboard - Russian - Russian (with US punctuation)" +Language=ru +Label=ru + +[keyboard-ru-prxn] +Description="Keyboard - Russian - Russian (Polyglot and Reactionary)" +Language=ru +Label=ru + +[keyboard-trans] +Description="Keyboard - International Phonetic Alphabet" +Language= +Label=trans + +[keyboard-ir] +Description="Keyboard - Persian" +Language=fa +Label=fa + +[keyboard-ir-pes_keypad] +Description="Keyboard - Persian - Persian (with Persian keypad)" +Language=fa +Label=ir + +[keyboard-ir-ku] +Description="Keyboard - Persian - Kurdish (Iran, Latin Q)" +Language=ku +Label=ku + +[keyboard-ir-ku_f] +Description="Keyboard - Persian - Kurdish (Iran, F)" +Language=ku +Label=ku + +[keyboard-ir-ku_alt] +Description="Keyboard - Persian - Kurdish (Iran, Latin Alt-Q)" +Language=ku +Label=ku + +[keyboard-ir-ku_ara] +Description="Keyboard - Persian - Kurdish (Iran, Arabic-Latin)" +Language=ku +Label=ku + +[keyboard-ir-ave] +Description="Keyboard - Persian - Avestan" +Language=ae +Label=ir + +[keyboard-ng] +Description="Keyboard - English (Nigeria)" +Language=en +Label=en + +[keyboard-ng-igbo] +Description="Keyboard - English (Nigeria) - Igbo" +Language=ig +Label=ig + +[keyboard-ng-yoruba] +Description="Keyboard - English (Nigeria) - Yoruba" +Language=yo +Label=yo + +[keyboard-ng-hausa] +Description="Keyboard - English (Nigeria) - Hausa (Nigeria)" +Language=ha +Label=ha + +[keyboard-is] +Description="Keyboard - Icelandic" +Language=is +Label=is + +[keyboard-is-mac_legacy] +Description="Keyboard - Icelandic - Icelandic (Macintosh, legacy)" +Language=is +Label=is + +[keyboard-is-mac] +Description="Keyboard - Icelandic - Icelandic (Macintosh)" +Language=is +Label=is + +[keyboard-is-dvorak] +Description="Keyboard - Icelandic - Icelandic (Dvorak)" +Language=is +Label=is + +[keyboard-es] +Description="Keyboard - Spanish" +Language=es +Label=es + +[keyboard-es-nodeadkeys] +Description="Keyboard - Spanish - Spanish (no dead keys)" +Language=es +Label=es + +[keyboard-es-winkeys] +Description="Keyboard - Spanish - Spanish (Windows)" +Language=es +Label=es + +[keyboard-es-deadtilde] +Description="Keyboard - Spanish - Spanish (dead tilde)" +Language=es +Label=es + +[keyboard-es-dvorak] +Description="Keyboard - Spanish - Spanish (Dvorak)" +Language=es +Label=es + +[keyboard-es-ast] +Description="Keyboard - Spanish - Asturian (Spain, with bottom-dot H and L)" +Language=ast +Label=ast + +[keyboard-es-cat] +Description="Keyboard - Spanish - Catalan (Spain, with middle-dot L)" +Language=ca +Label=ca + +[keyboard-es-mac] +Description="Keyboard - Spanish - Spanish (Macintosh)" +Language=es +Label=es + +[keyboard-es-sun_type6] +Description="Keyboard - Spanish - Spanish (Sun Type 6/7)" +Language=es +Label=es + +[keyboard-ee] +Description="Keyboard - Estonian" +Language=et +Label=et + +[keyboard-ee-nodeadkeys] +Description="Keyboard - Estonian - Estonian (no dead keys)" +Language=et +Label=ee + +[keyboard-ee-dvorak] +Description="Keyboard - Estonian - Estonian (Dvorak)" +Language=et +Label=ee + +[keyboard-ee-us] +Description="Keyboard - Estonian - Estonian (US)" +Language=et +Label=ee + +[keyboard-ee-sun_type6] +Description="Keyboard - Estonian - Estonian (Sun Type 6/7)" +Language=et +Label=ee + +[keyboard-nl] +Description="Keyboard - Dutch" +Language=nl +Label=nl + +[keyboard-nl-mac] +Description="Keyboard - Dutch - Dutch (Macintosh)" +Language=nl +Label=nl + +[keyboard-nl-std] +Description="Keyboard - Dutch - Dutch (standard)" +Language=nl +Label=nl + +[keyboard-nl-sun_type6] +Description="Keyboard - Dutch - Dutch (Sun Type 6/7)" +Language=nl +Label=nl + +[keyboard-cz] +Description="Keyboard - Czech" +Language=cs +Label=cs + +[keyboard-cz-bksl] +Description="Keyboard - Czech - key)" +Language=cs +Label=cz + +[keyboard-cz-qwerty] +Description="Keyboard - Czech - Czech (QWERTY)" +Language=cs +Label=cz + +[keyboard-cz-qwerty_bksl] +Description="Keyboard - Czech - Czech (QWERTY, extended backslash)" +Language=cs +Label=cz + +[keyboard-cz-qwerty-mac] +Description="Keyboard - Czech - Czech (QWERTY, Macintosh)" +Language=cs +Label=cz + +[keyboard-cz-ucw] +Description="Keyboard - Czech - Czech (UCW, only accented letters)" +Language=cs +Label=cz + +[keyboard-cz-dvorak-ucw] +Description="Keyboard - Czech - Czech (US, Dvorak, UCW support)" +Language=cs +Label=cz + +[keyboard-cz-rus] +Description="Keyboard - Czech - Russian (Czech, phonetic)" +Language=ru +Label=ru + +[keyboard-cz-sun_type6] +Description="Keyboard - Czech - Czech (Sun Type 6/7)" +Language=cs +Label=cz + +[keyboard-cz-prog] +Description="Keyboard - Czech - Czech (programming)" +Language=cs +Label=cz + +[keyboard-cz-typo] +Description="Keyboard - Czech - Czech (typographic)" +Language=cs +Label=cz + +[keyboard-cz-coder] +Description="Keyboard - Czech - Czech (coder)" +Language=cs +Label=cz + +[keyboard-cz-prog_typo] +Description="Keyboard - Czech - Czech (programming, typographic)" +Language=cs +Label=cz + +[keyboard-se] +Description="Keyboard - Swedish" +Language=sv +Label=sv + +[keyboard-se-nodeadkeys] +Description="Keyboard - Swedish - Swedish (no dead keys)" +Language=sv +Label=se + +[keyboard-se-dvorak] +Description="Keyboard - Swedish - Swedish (Dvorak)" +Language=sv +Label=se + +[keyboard-se-rus] +Description="Keyboard - Swedish - Russian (Sweden, phonetic)" +Language=ru +Label=ru + +[keyboard-se-rus_nodeadkeys] +Description="Keyboard - Swedish - Russian (Sweden, phonetic, no dead keys)" +Language=ru +Label=ru + +[keyboard-se-smi] +Description="Keyboard - Swedish - Northern Saami (Sweden)" +Language=se +Label=se + +[keyboard-se-mac] +Description="Keyboard - Swedish - Swedish (Macintosh)" +Language=sv +Label=se + +[keyboard-se-svdvorak] +Description="Keyboard - Swedish - Swedish (Svdvorak)" +Language=sv +Label=se + +[keyboard-se-us_dvorak] +Description="Keyboard - Swedish - Swedish (Dvorak, intl.)" +Language=sv +Label=se + +[keyboard-se-us] +Description="Keyboard - Swedish - Swedish (US)" +Language=sv +Label=se + +[keyboard-se-swl] +Description="Keyboard - Swedish - Swedish Sign Language" +Language=swl +Label=se + +[keyboard-se-dvorak_a5] +Description="Keyboard - Swedish - Swedish (Dvorak A5)" +Language=sv +Label=se + +[keyboard-se-sun_type6] +Description="Keyboard - Swedish - Swedish (Sun Type 6/7)" +Language=sv +Label=se + +[keyboard-se-ovd] +Description="Keyboard - Swedish - Elfdalian (Swedish, with combining ogonek)" +Language= +Label=se + +[keyboard-bg] +Description="Keyboard - Bulgarian" +Language=bg +Label=bg + +[keyboard-bg-phonetic] +Description="Keyboard - Bulgarian - Bulgarian (traditional phonetic)" +Language=bg +Label=bg + +[keyboard-bg-bas_phonetic] +Description="Keyboard - Bulgarian - Bulgarian (new phonetic)" +Language=bg +Label=bg + +[keyboard-bg-bekl] +Description="Keyboard - Bulgarian - Bulgarian (enhanced)" +Language=bg +Label=bg + +[keyboard-md] +Description="Keyboard - Moldavian" +Language=ro +Label=md + +[keyboard-md-gag] +Description="Keyboard - Moldavian - Moldavian (Gagauz)" +Language=gag +Label=gag + +[keyboard-ke] +Description="Keyboard - Swahili (Kenya)" +Language=sw +Label=sw + +[keyboard-ke-kik] +Description="Keyboard - Swahili (Kenya) - Kikuyu" +Language=ki +Label=ki + +[keyboard-us] +Description="Keyboard - English (US)" +Language=en +Label=en + +[keyboard-us-chr] +Description="Keyboard - English (US) - Cherokee" +Language=chr +Label=chr + +[keyboard-us-haw] +Description="Keyboard - English (US) - Hawaiian" +Language=haw +Label=haw + +[keyboard-us-euro] +Description="Keyboard - English (US) - English (US, euro on 5)" +Language=en +Label=us + +[keyboard-us-intl] +Description="Keyboard - English (US) - English (US, intl., with dead keys)" +Language=en +Label=us + +[keyboard-us-alt-intl] +Description="Keyboard - English (US) - English (US, alt. intl.)" +Language=en +Label=us + +[keyboard-us-colemak] +Description="Keyboard - English (US) - English (Colemak)" +Language=en +Label=us + +[keyboard-us-colemak_dh] +Description="Keyboard - English (US) - English (Colemak-DH)" +Language=en +Label=us + +[keyboard-us-dvorak] +Description="Keyboard - English (US) - English (Dvorak)" +Language=en +Label=us + +[keyboard-us-dvorak-intl] +Description="Keyboard - English (US) - English (Dvorak, intl., with dead keys)" +Language=en +Label=us + +[keyboard-us-dvorak-alt-intl] +Description="Keyboard - English (US) - English (Dvorak, alt. intl.)" +Language=en +Label=us + +[keyboard-us-dvorak-l] +Description="Keyboard - English (US) - English (Dvorak, left-handed)" +Language=en +Label=us + +[keyboard-us-dvorak-r] +Description="Keyboard - English (US) - English (Dvorak, right-handed)" +Language=en +Label=us + +[keyboard-us-dvorak-classic] +Description="Keyboard - English (US) - English (classic Dvorak)" +Language=en +Label=us + +[keyboard-us-dvp] +Description="Keyboard - English (US) - English (programmer Dvorak)" +Language=en +Label=us + +[keyboard-us-symbolic] +Description="Keyboard - English (US) - English (US, Symbolic)" +Language=en +Label=us + +[keyboard-us-rus] +Description="Keyboard - English (US) - Russian (US, phonetic)" +Language=ru +Label=ru + +[keyboard-us-mac] +Description="Keyboard - English (US) - English (Macintosh)" +Language=en +Label=us + +[keyboard-us-altgr-intl] +Description="Keyboard - English (US) - English (intl., with AltGr dead keys)" +Language=en +Label=us + +[keyboard-us-olpc2] +Description="Keyboard - English (US) - English (the divide/multiply toggle the layout)" +Language=en +Label=us + +[keyboard-us-hbs] +Description="Keyboard - English (US) - Serbo-Croatian (US)" +Language=en +Label=us + +[keyboard-us-norman] +Description="Keyboard - English (US) - English (Norman)" +Language=en +Label=us + +[keyboard-us-workman] +Description="Keyboard - English (US) - English (Workman)" +Language=en +Label=us + +[keyboard-us-workman-intl] +Description="Keyboard - English (US) - English (Workman, intl., with dead keys)" +Language=en +Label=us + +[keyboard-us-intl-unicode] +Description="Keyboard - English (US) - English (US, intl., AltGr Unicode combining)" +Language=en +Label=us + +[keyboard-us-alt-intl-unicode] +Description="Keyboard - English (US) - English (US, intl., AltGr Unicode combining, alt.)" +Language=en +Label=us + +[keyboard-us-ats] +Description="Keyboard - English (US) - Atsina" +Language=en +Label=us + +[keyboard-us-crd] +Description="Keyboard - English (US) - Coeur d'Alene Salish" +Language=crd +Label=us + +[keyboard-us-cz_sk_de] +Description="Keyboard - English (US) - Czech Slovak and German (US)" +Language=en +Label=us + +[keyboard-us-drix] +Description="Keyboard - English (US) - English (Drix)" +Language=en +Label=us + +[keyboard-us-de_se_fi] +Description="Keyboard - English (US) - German, Swedish and Finnish (US)" +Language=en +Label=us + +[keyboard-us-ibm238l] +Description="Keyboard - English (US) - English (US, IBM Arabic 238_L)" +Language=en +Label=us + +[keyboard-us-sun_type6] +Description="Keyboard - English (US) - English (US, Sun Type 6/7)" +Language=en +Label=us + +[keyboard-us-carpalx] +Description="Keyboard - English (US) - English (Carpalx)" +Language=en +Label=us + +[keyboard-us-carpalx-intl] +Description="Keyboard - English (US) - English (Carpalx, intl., with dead keys)" +Language=en +Label=us + +[keyboard-us-carpalx-altgr-intl] +Description="Keyboard - English (US) - English (Carpalx, intl., with AltGr dead keys)" +Language=en +Label=us + +[keyboard-us-carpalx-full] +Description="Keyboard - English (US) - English (Carpalx, full optimization)" +Language=en +Label=us + +[keyboard-us-carpalx-full-intl] +Description="Keyboard - English (US) - English (Carpalx, full optimization, intl., with dead keys)" +Language=en +Label=us + +[keyboard-us-carpalx-full-altgr-intl] +Description="Keyboard - English (US) - English (Carpalx, full optimization, intl., with AltGr dead keys)" +Language=en +Label=us + +[keyboard-us-3l] +Description="Keyboard - English (US) - English (3l)" +Language=en +Label=us + +[keyboard-us-3l-cros] +Description="Keyboard - English (US) - English (3l, Chromebook)" +Language=en +Label=us + +[keyboard-us-3l-emacs] +Description="Keyboard - English (US) - English (3l, emacs)" +Language=en +Label=us + +[keyboard-us-scn] +Description="Keyboard - English (US) - Sicilian (US keyboard)" +Language=en +Label=us + +[keyboard-us-hyena] +Description="Keyboard - English (US) - English (US, Hyena Layer5)" +Language=en +Label=us + +[keyboard-us-hyena-alt-intl] +Description="Keyboard - English (US) - English (US, alt. intl., with dead keys, Hyena Layer5)" +Language=en +Label=us + +[keyboard-us-hyena-intl-unicode] +Description="Keyboard - English (US) - English (US, intl., AltGr Unicode combining, Hyena Layer5)" +Language=en +Label=us + +[keyboard-us-hyena-carpalx] +Description="Keyboard - English (US) - English (Carpalx, full optimization, Hyena Layer5)" +Language=en +Label=us + +[keyboard-us-hyena-carpalx-intl] +Description="Keyboard - English (US) - English (Carpalx, full optimization, intl., with dead keys, Hyena Layer5)" +Language=en +Label=us + +[keyboard-us-hyena-carpalx-altgr-intl] +Description="Keyboard - English (US) - English (Carpalx, full optimization, intl., with AltGr dead keys, Hyena Layer5)" +Language=en +Label=us + +[keyboard-us-miniguru] +Description="Keyboard - English (US) - English (US, MiniGuru Layer5)" +Language=en +Label=us + +[keyboard-us-miniguru-alt-intl] +Description="Keyboard - English (US) - English (US, alt. intl., with dead keys, MiniGuru Layer5)" +Language=en +Label=us + +[keyboard-us-miniguru-intl-unicode] +Description="Keyboard - English (US) - English (US, intl., AltGr Unicode combining, MiniGuru Layer5)" +Language=en +Label=us + +[keyboard-us-yoda] +Description="Keyboard - English (US) - English (US, TEX Yoda Layer5)" +Language=en +Label=us + +[keyboard-us-yoda-alt-intl] +Description="Keyboard - English (US) - English (US, alt. intl., with dead keys, TEX Yoda Layer5)" +Language=en +Label=us + +[keyboard-us-yoda-intl-unicode] +Description="Keyboard - English (US) - English (US, intl., AltGr Unicode combining, TEX Yoda Layer5)" +Language=en +Label=us + +[keyboard-ge] +Description="Keyboard - Georgian" +Language=ka +Label=ka + +[keyboard-ge-ergonomic] +Description="Keyboard - Georgian - Georgian (ergonomic)" +Language=ka +Label=ge + +[keyboard-ge-mess] +Description="Keyboard - Georgian - Georgian (MESS)" +Language=ka +Label=ge + +[keyboard-ge-ru] +Description="Keyboard - Georgian - Russian (Georgia)" +Language=ru +Label=ru + +[keyboard-ge-os] +Description="Keyboard - Georgian - Ossetian (Georgia)" +Language=os +Label=ge + +[keyboard-hr] +Description="Keyboard - Croatian" +Language=hr +Label=hr + +[keyboard-hr-alternatequotes] +Description="Keyboard - Croatian - Croatian (with guillemets)" +Language=hr +Label=hr + +[keyboard-hr-unicode] +Description="Keyboard - Croatian - Croatian (with Croatian digraphs)" +Language=hr +Label=hr + +[keyboard-hr-unicodeus] +Description="Keyboard - Croatian - Croatian (US, with Croatian digraphs)" +Language=hr +Label=hr + +[keyboard-hr-us] +Description="Keyboard - Croatian - Croatian (US)" +Language=hr +Label=hr + +[keyboard-sy] +Description="Keyboard - Arabic (Syria)" +Language=syr +Label=ar + +[keyboard-sy-syc] +Description="Keyboard - Arabic (Syria) - Syriac" +Language=syr +Label=syc + +[keyboard-sy-syc_phonetic] +Description="Keyboard - Arabic (Syria) - Syriac (phonetic)" +Language=syr +Label=syc + +[keyboard-sy-ku] +Description="Keyboard - Arabic (Syria) - Kurdish (Syria, Latin Q)" +Language=ku +Label=ku + +[keyboard-sy-ku_f] +Description="Keyboard - Arabic (Syria) - Kurdish (Syria, F)" +Language=ku +Label=ku + +[keyboard-sy-ku_alt] +Description="Keyboard - Arabic (Syria) - Kurdish (Syria, Latin Alt-Q)" +Language=ku +Label=ku + +[keyboard-ma] +Description="Keyboard - Arabic (Morocco)" +Language= +Label=ar + +[keyboard-ma-french] +Description="Keyboard - Arabic (Morocco) - French (Morocco)" +Language=fr +Label=fr + +[keyboard-ma-tifinagh] +Description="Keyboard - Arabic (Morocco) - Berber (Morocco, Tifinagh)" +Language= +Label=ber + +[keyboard-ma-tifinagh-alt] +Description="Keyboard - Arabic (Morocco) - Berber (Morocco, Tifinagh alt.)" +Language= +Label=ber + +[keyboard-ma-tifinagh-alt-phonetic] +Description="Keyboard - Arabic (Morocco) - Berber (Morocco, Tifinagh phonetic, alt.)" +Language= +Label=ber + +[keyboard-ma-tifinagh-extended] +Description="Keyboard - Arabic (Morocco) - Berber (Morocco, Tifinagh extended)" +Language= +Label=ber + +[keyboard-ma-tifinagh-phonetic] +Description="Keyboard - Arabic (Morocco) - Berber (Morocco, Tifinagh phonetic)" +Language= +Label=ber + +[keyboard-ma-tifinagh-extended-phonetic] +Description="Keyboard - Arabic (Morocco) - Berber (Morocco, Tifinagh extended phonetic)" +Language= +Label=ber + +[keyboard-af] +Description="Keyboard - Afghani" +Language= +Label=fa + +[keyboard-af-ps] +Description="Keyboard - Afghani - Pashto" +Language=ps +Label=ps + +[keyboard-af-uz] +Description="Keyboard - Afghani - Uzbek (Afghanistan)" +Language=uz +Label=uz + +[keyboard-af-olpc-ps] +Description="Keyboard - Afghani - Pashto (Afghanistan, OLPC)" +Language=ps +Label=ps + +[keyboard-af-fa-olpc] +Description="Keyboard - Afghani - Persian (Afghanistan, Dari OLPC)" +Language= +Label=fa + +[keyboard-af-uz-olpc] +Description="Keyboard - Afghani - Uzbek (Afghanistan, OLPC)" +Language=uz +Label=uz + +[keyboard-dz] +Description="Keyboard - Berber (Algeria, Latin)" +Language= +Label=kab + +[keyboard-dz-azerty-deadkeys] +Description="Keyboard - Berber (Algeria, Latin) - Kabyle (azerty layout, dead keys)" +Language=kab +Label=kab + +[keyboard-dz-qwerty-gb-deadkeys] +Description="Keyboard - Berber (Algeria, Latin) - Kabyle (qwerty-gb layout, dead keys)" +Language=kab +Label=kab + +[keyboard-dz-qwerty-us-deadkeys] +Description="Keyboard - Berber (Algeria, Latin) - Kabyle (qwerty-us layout, dead keys)" +Language=kab +Label=kab + +[keyboard-dz-ber] +Description="Keyboard - Berber (Algeria, Latin) - Berber (Algeria, Tifinagh)" +Language=kab +Label=kab + +[keyboard-dz-ar] +Description="Keyboard - Berber (Algeria, Latin) - Arabic (Algeria)" +Language=ar +Label=ar + +[keyboard-mn] +Description="Keyboard - Mongolian" +Language=mn +Label=mn + +[keyboard-pk] +Description="Keyboard - Urdu (Pakistan)" +Language=ur +Label=ur + +[keyboard-pk-urd-crulp] +Description="Keyboard - Urdu (Pakistan) - Urdu (Pakistan, CRULP)" +Language=ur +Label=pk + +[keyboard-pk-urd-nla] +Description="Keyboard - Urdu (Pakistan) - Urdu (Pakistan, NLA)" +Language=ur +Label=pk + +[keyboard-pk-ara] +Description="Keyboard - Urdu (Pakistan) - Arabic (Pakistan)" +Language=ar +Label=ar + +[keyboard-pk-snd] +Description="Keyboard - Urdu (Pakistan) - Sindhi" +Language=sd +Label=sd + +[keyboard-au] +Description="Keyboard - English (Australian)" +Language=en +Label=en + +[keyboard-ml] +Description="Keyboard - Bambara" +Language=bm +Label=bm + +[keyboard-ml-fr-oss] +Description="Keyboard - Bambara - French (Mali, alt.)" +Language=fr +Label=fr + +[keyboard-ml-us-mac] +Description="Keyboard - Bambara - English (Mali, US, Macintosh)" +Language=en +Label=en + +[keyboard-ml-us-intl] +Description="Keyboard - Bambara - English (Mali, US, intl.)" +Language=en +Label=en + +[keyboard-vn] +Description="Keyboard - Vietnamese" +Language=vi +Label=vi + +[keyboard-vn-us] +Description="Keyboard - Vietnamese - Vietnamese (US)" +Language=vi +Label=vn + +[keyboard-vn-fr] +Description="Keyboard - Vietnamese - Vietnamese (French)" +Language=vi +Label=vn + +[keyboard-vn-aderty] +Description="Keyboard - Vietnamese - Vietnamese (AÐERTY)" +Language=vi +Label=vn + +[keyboard-vn-qderty] +Description="Keyboard - Vietnamese - Vietnamese (QĐERTY)" +Language=vi +Label=vn + +[keyboard-ara] +Description="Keyboard - Arabic" +Language=ar +Label=ar + +[keyboard-ara-azerty] +Description="Keyboard - Arabic - Arabic (AZERTY)" +Language=ar +Label=ara + +[keyboard-ara-azerty_digits] +Description="Keyboard - Arabic - Arabic (AZERTY, Eastern Arabic numerals)" +Language=ar +Label=ara + +[keyboard-ara-digits] +Description="Keyboard - Arabic - Arabic (Eastern Arabic numerals)" +Language=ar +Label=ara + +[keyboard-ara-qwerty] +Description="Keyboard - Arabic - Arabic (QWERTY)" +Language=ar +Label=ara + +[keyboard-ara-qwerty_digits] +Description="Keyboard - Arabic - Arabic (QWERTY, Eastern Arabic numerals)" +Language=ar +Label=ara + +[keyboard-ara-buckwalter] +Description="Keyboard - Arabic - Arabic (Buckwalter)" +Language=ar +Label=ara + +[keyboard-ara-olpc] +Description="Keyboard - Arabic - Arabic (OLPC)" +Language=ar +Label=ara + +[keyboard-ara-mac] +Description="Keyboard - Arabic - Arabic (Macintosh)" +Language=ar +Label=ara + +[keyboard-ara-sun_type6] +Description="Keyboard - Arabic - Arabic (Sun Type 6/7)" +Language=ar +Label=ara + +[keyboard-ara-basic_ext] +Description="Keyboard - Arabic - Arabic (Arabic numerals, extensions in the 4th level)" +Language=ar +Label=ara + +[keyboard-ara-basic_ext_digits] +Description="Keyboard - Arabic - h level)" +Language=ar +Label=ara + +[keyboard-ara-uga] +Description="Keyboard - Arabic - Ugaritic instead of Arabic" +Language=ar +Label=ara + +[keyboard-ie] +Description="Keyboard - Irish" +Language=en +Label=ie + +[keyboard-ie-CloGaelach] +Description="Keyboard - Irish - CloGaelach" +Language=ga +Label=ie + +[keyboard-ie-UnicodeExpert] +Description="Keyboard - Irish - Irish (UnicodeExpert)" +Language=en +Label=ie + +[keyboard-ie-ogam] +Description="Keyboard - Irish - Ogham" +Language=sga +Label=ie + +[keyboard-ie-ogam_is434] +Description="Keyboard - Irish - Ogham (IS434)" +Language=sga +Label=ie + +[keyboard-cm] +Description="Keyboard - English (Cameroon)" +Language=en +Label=cm + +[keyboard-cm-french] +Description="Keyboard - English (Cameroon) - French (Cameroon)" +Language=fr +Label=cm + +[keyboard-cm-qwerty] +Description="Keyboard - English (Cameroon) - Cameroon Multilingual (QWERTY, intl.)" +Language=en +Label=cm + +[keyboard-cm-azerty] +Description="Keyboard - English (Cameroon) - Cameroon (AZERTY, intl.)" +Language=fr +Label=cm + +[keyboard-cm-dvorak] +Description="Keyboard - English (Cameroon) - Cameroon (Dvorak, intl.)" +Language=en +Label=cm + +[keyboard-cm-mmuock] +Description="Keyboard - English (Cameroon) - Mmuock" +Language=en +Label=cm + +[keyboard-kg] +Description="Keyboard - Kyrgyz" +Language=ky +Label=ki + +[keyboard-kg-phonetic] +Description="Keyboard - Kyrgyz - Kyrgyz (phonetic)" +Language=ky +Label=kg + +[keyboard-ph] +Description="Keyboard - Filipino" +Language=fil +Label=ph + +[keyboard-ph-qwerty-bay] +Description="Keyboard - Filipino - (QWERTY, Baybayin)" +Language=bik +Label=ph + +[keyboard-ph-capewell-dvorak] +Description="Keyboard - Filipino - Filipino (Capewell-Dvorak, Latin)" +Language=fil +Label=ph + +[keyboard-ph-capewell-dvorak-bay] +Description="Keyboard - Filipino - Filipino (Capewell-Dvorak, Baybayin)" +Language=fil +Label=ph + +[keyboard-ph-capewell-qwerf2k6] +Description="Keyboard - Filipino - Filipino (Capewell-QWERF 2006, Latin)" +Language=fil +Label=ph + +[keyboard-ph-capewell-qwerf2k6-bay] +Description="Keyboard - Filipino - Filipino (Capewell-QWERF 2006, Baybayin)" +Language=fil +Label=ph + +[keyboard-ph-colemak] +Description="Keyboard - Filipino - Filipino (Colemak, Latin)" +Language=fil +Label=ph + +[keyboard-ph-colemak-bay] +Description="Keyboard - Filipino - Filipino (Colemak, Baybayin)" +Language=fil +Label=ph + +[keyboard-ph-dvorak] +Description="Keyboard - Filipino - Filipino (Dvorak, Latin)" +Language=fil +Label=ph + +[keyboard-ph-dvorak-bay] +Description="Keyboard - Filipino - Filipino (Dvorak, Baybayin)" +Language=fil +Label=ph + +[keyboard-bd] +Description="Keyboard - Bangla" +Language=bn +Label=bn + +[keyboard-bd-probhat] +Description="Keyboard - Bangla - Bangla (Probhat)" +Language=bn +Label=bd + +[keyboard-lk] +Description="Keyboard - Sinhala (phonetic)" +Language=si +Label=si + +[keyboard-lk-tam_unicode] +Description="Keyboard - Sinhala (phonetic) - Tamil (Sri Lanka, TamilNet '99)" +Language=ta +Label=ta + +[keyboard-lk-tam_TAB] +Description="Keyboard - Sinhala (phonetic) - Tamil (Sri Lanka, TamilNet '99, TAB encoding)" +Language=ta +Label=lk + +[keyboard-lk-us] +Description="Keyboard - Sinhala (phonetic) - Sinhala (US)" +Language=si +Label=us + +[keyboard-al] +Description="Keyboard - Albanian" +Language=sq +Label=sq + +[keyboard-al-plisi] +Description="Keyboard - Albanian - Albanian (Plisi)" +Language=sq +Label=al + +[keyboard-al-veqilharxhi] +Description="Keyboard - Albanian - Albanian (Veqilharxhi)" +Language=sq +Label=al + +[keyboard-tw] +Description="Keyboard - Taiwanese" +Language= +Label=zh + +[keyboard-tw-indigenous] +Description="Keyboard - Taiwanese - Taiwanese (indigenous)" +Language=tay +Label=tw + +[keyboard-tw-saisiyat] +Description="Keyboard - Taiwanese - Saisiyat (Taiwan)" +Language=xsy +Label=xsy + +[keyboard-rs] +Description="Keyboard - Serbian" +Language=sr +Label=sr + +[keyboard-rs-yz] +Description="Keyboard - Serbian - Serbian (Cyrillic, ZE and ZHE swapped)" +Language=sr +Label=rs + +[keyboard-rs-latin] +Description="Keyboard - Serbian - Serbian (Latin)" +Language=sr +Label=rs + +[keyboard-rs-latinunicode] +Description="Keyboard - Serbian - Serbian (Latin, Unicode)" +Language=sr +Label=rs + +[keyboard-rs-latinyz] +Description="Keyboard - Serbian - Serbian (Latin, QWERTY)" +Language=sr +Label=rs + +[keyboard-rs-latinunicodeyz] +Description="Keyboard - Serbian - Serbian (Latin, Unicode, QWERTY)" +Language=sr +Label=rs + +[keyboard-rs-alternatequotes] +Description="Keyboard - Serbian - Serbian (Cyrillic, with guillemets)" +Language=sr +Label=rs + +[keyboard-rs-latinalternatequotes] +Description="Keyboard - Serbian - Serbian (Latin, with guillemets)" +Language=sr +Label=rs + +[keyboard-rs-rue] +Description="Keyboard - Serbian - Pannonian Rusyn" +Language=rue +Label=rs + +[keyboard-rs-combiningkeys] +Description="Keyboard - Serbian - Serbian (combining accents instead of dead keys)" +Language=sr +Label=rs + +[keyboard-dk] +Description="Keyboard - Danish" +Language=da +Label=da + +[keyboard-dk-nodeadkeys] +Description="Keyboard - Danish - Danish (no dead keys)" +Language=da +Label=dk + +[keyboard-dk-winkeys] +Description="Keyboard - Danish - Danish (Windows)" +Language=da +Label=dk + +[keyboard-dk-mac] +Description="Keyboard - Danish - Danish (Macintosh)" +Language=da +Label=dk + +[keyboard-dk-mac_nodeadkeys] +Description="Keyboard - Danish - Danish (Macintosh, no dead keys)" +Language=da +Label=dk + +[keyboard-dk-dvorak] +Description="Keyboard - Danish - Danish (Dvorak)" +Language=da +Label=dk + +[keyboard-dk-sun_type6] +Description="Keyboard - Danish - Danish (Sun Type 6/7)" +Language=da +Label=dk + +[keyboard-bt] +Description="Keyboard - Dzongkha" +Language=dz +Label=dz + +[keyboard-la] +Description="Keyboard - Lao" +Language=lo +Label=lo + +[keyboard-la-stea] +Description="Keyboard - Lao - Lao (STEA)" +Language=lo +Label=la + +[keyboard-mm] +Description="Keyboard - Burmese" +Language=my +Label=my + +[keyboard-mm-zawgyi] +Description="Keyboard - Burmese - Burmese Zawgyi" +Language=my +Label=zg + +[keyboard-si] +Description="Keyboard - Slovenian" +Language=sl +Label=sl + +[keyboard-si-alternatequotes] +Description="Keyboard - Slovenian - Slovenian (with guillemets)" +Language=sl +Label=si + +[keyboard-si-us] +Description="Keyboard - Slovenian - Slovenian (US)" +Language=sl +Label=si + +[keyboard-am] +Description="Keyboard - Armenian" +Language=hy +Label=hy + +[keyboard-am-phonetic] +Description="Keyboard - Armenian - Armenian (phonetic)" +Language=hy +Label=am + +[keyboard-am-phonetic-alt] +Description="Keyboard - Armenian - Armenian (alt. phonetic)" +Language=hy +Label=am + +[keyboard-am-eastern] +Description="Keyboard - Armenian - Armenian (eastern)" +Language=hy +Label=am + +[keyboard-am-western] +Description="Keyboard - Armenian - Armenian (western)" +Language=hy +Label=am + +[keyboard-am-eastern-alt] +Description="Keyboard - Armenian - Armenian (alt. eastern)" +Language=hy +Label=am + +[keyboard-am-olpc-phonetic] +Description="Keyboard - Armenian - Armenian (OLPC, phonetic)" +Language=hy +Label=am + +[keyboard-by] +Description="Keyboard - Belarusian" +Language=be +Label=by + +[keyboard-by-legacy] +Description="Keyboard - Belarusian - Belarusian (legacy)" +Language=be +Label=by + +[keyboard-by-latin] +Description="Keyboard - Belarusian - Belarusian (Latin)" +Language=be +Label=by + +[keyboard-by-ru] +Description="Keyboard - Belarusian - Russian (Belarus)" +Language=be +Label=by + +[keyboard-by-intl] +Description="Keyboard - Belarusian - Belarusian (intl.)" +Language=be +Label=by + +[keyboard-br] +Description="Keyboard - Portuguese (Brazil)" +Language=pt +Label=pt + +[keyboard-br-nodeadkeys] +Description="Keyboard - Portuguese (Brazil) - Portuguese (Brazil, no dead keys)" +Language=pt +Label=br + +[keyboard-br-dvorak] +Description="Keyboard - Portuguese (Brazil) - Portuguese (Brazil, Dvorak)" +Language=pt +Label=br + +[keyboard-br-nativo] +Description="Keyboard - Portuguese (Brazil) - Portuguese (Brazil, Nativo)" +Language=pt +Label=br + +[keyboard-br-nativo-us] +Description="Keyboard - Portuguese (Brazil) - Portuguese (Brazil, Nativo for US keyboards)" +Language=pt +Label=br + +[keyboard-br-nativo-epo] +Description="Keyboard - Portuguese (Brazil) - Esperanto (Brazil, Nativo)" +Language=eo +Label=br + +[keyboard-br-thinkpad] +Description="Keyboard - Portuguese (Brazil) - Portuguese (Brazil, IBM/Lenovo ThinkPad)" +Language=pt +Label=br + +[keyboard-br-sun_type6] +Description="Keyboard - Portuguese (Brazil) - Portuguese (Brazil, Sun Type 6/7)" +Language=pt +Label=br + +[keyboard-in] +Description="Keyboard - Indian" +Language= +Label=in + +[keyboard-in-ben] +Description="Keyboard - Indian - Bangla (India)" +Language=bn +Label=bn + +[keyboard-in-ben_probhat] +Description="Keyboard - Indian - Bangla (India, Probhat)" +Language=bn +Label=bn + +[keyboard-in-ben_baishakhi] +Description="Keyboard - Indian - Bangla (India, Baishakhi)" +Language=bn +Label=in + +[keyboard-in-ben_bornona] +Description="Keyboard - Indian - Bangla (India, Bornona)" +Language=bn +Label=in + +[keyboard-in-ben_gitanjali] +Description="Keyboard - Indian - Bangla (India, Gitanjali)" +Language=bn +Label=in + +[keyboard-in-ben_inscript] +Description="Keyboard - Indian - Bangla (India, Baishakhi Inscript)" +Language=bn +Label=in + +[keyboard-in-eeyek] +Description="Keyboard - Indian - Manipuri (Eeyek)" +Language=mni +Label=in + +[keyboard-in-guj] +Description="Keyboard - Indian - Gujarati" +Language=gu +Label=gu + +[keyboard-in-guru] +Description="Keyboard - Indian - Punjabi (Gurmukhi)" +Language=pa +Label=pa + +[keyboard-in-jhelum] +Description="Keyboard - Indian - Punjabi (Gurmukhi Jhelum)" +Language=pa +Label=pa + +[keyboard-in-kan] +Description="Keyboard - Indian - Kannada" +Language=kn +Label=kn + +[keyboard-in-kan-kagapa] +Description="Keyboard - Indian - Kannada (KaGaPa, phonetic)" +Language=kn +Label=kn + +[keyboard-in-mal] +Description="Keyboard - Indian - Malayalam" +Language=ml +Label=ml + +[keyboard-in-mal_lalitha] +Description="Keyboard - Indian - Malayalam (Lalitha)" +Language=ml +Label=ml + +[keyboard-in-mal_enhanced] +Description="Keyboard - Indian - Malayalam (enhanced Inscript, with rupee)" +Language=ml +Label=ml + +[keyboard-in-ori] +Description="Keyboard - Indian - Oriya" +Language=or +Label=or + +[keyboard-in-olck] +Description="Keyboard - Indian - Ol Chiki" +Language=sat +Label=sat + +[keyboard-in-tam_tamilnet] +Description="Keyboard - Indian - Tamil (TamilNet '99)" +Language=ta +Label=ta + +[keyboard-in-tam_tamilnet_with_tam_nums] +Description="Keyboard - Indian - Tamil (TamilNet '99 with Tamil numerals)" +Language=ta +Label=ta + +[keyboard-in-tam_tamilnet_TAB] +Description="Keyboard - Indian - Tamil (TamilNet '99, TAB encoding)" +Language=ta +Label=ta + +[keyboard-in-tam_tamilnet_TSCII] +Description="Keyboard - Indian - Tamil (TamilNet '99, TSCII encoding)" +Language=ta +Label=ta + +[keyboard-in-tam] +Description="Keyboard - Indian - Tamil (Inscript)" +Language=ta +Label=ta + +[keyboard-in-tel] +Description="Keyboard - Indian - Telugu" +Language=te +Label=te + +[keyboard-in-tel-kagapa] +Description="Keyboard - Indian - Telugu (KaGaPa, phonetic)" +Language=te +Label=te + +[keyboard-in-tel-sarala] +Description="Keyboard - Indian - Telugu (Sarala)" +Language=te +Label=te + +[keyboard-in-urd-phonetic] +Description="Keyboard - Indian - Urdu (phonetic)" +Language=ur +Label=ur + +[keyboard-in-urd-phonetic3] +Description="Keyboard - Indian - Urdu (alt. phonetic)" +Language=ur +Label=ur + +[keyboard-in-urd-winkeys] +Description="Keyboard - Indian - Urdu (Windows)" +Language=ur +Label=ur + +[keyboard-in-bolnagri] +Description="Keyboard - Indian - Hindi (Bolnagri)" +Language=hi +Label=hi + +[keyboard-in-hin-wx] +Description="Keyboard - Indian - Hindi (Wx)" +Language=hi +Label=hi + +[keyboard-in-hin-kagapa] +Description="Keyboard - Indian - Hindi (KaGaPa, phonetic)" +Language=hi +Label=hi + +[keyboard-in-san-kagapa] +Description="Keyboard - Indian - Sanskrit (KaGaPa, phonetic)" +Language=sa +Label=sa + +[keyboard-in-mar-kagapa] +Description="Keyboard - Indian - aGaPa, phonetic)" +Language=mr +Label=mr + +[keyboard-in-eng] +Description="Keyboard - Indian - English (India, with rupee)" +Language=en +Label=en + +[keyboard-in-iipa] +Description="Keyboard - Indian - Indic IPA" +Language= +Label=in + +[keyboard-in-marathi] +Description="Keyboard - Indian - Marathi (enhanced Inscript)" +Language=mr +Label=in + +[keyboard-in-modi-kagapa] +Description="Keyboard - Indian - Modi (KaGaPa phonetic)" +Language=mr +Label=mr + +[keyboard-in-san-misc] +Description="Keyboard - Indian - Sanskrit symbols" +Language=sa +Label=sas + +[keyboard-be] +Description="Keyboard - Belgian" +Language=de +Label=be + +[keyboard-be-oss] +Description="Keyboard - Belgian - Belgian (alt.)" +Language=de +Label=be + +[keyboard-be-oss_latin9] +Description="Keyboard - Belgian - Belgian (Latin-9 only, alt.)" +Language=de +Label=be + +[keyboard-be-iso-alternate] +Description="Keyboard - Belgian - Belgian (ISO, alt.)" +Language=de +Label=be + +[keyboard-be-nodeadkeys] +Description="Keyboard - Belgian - Belgian (no dead keys)" +Language=de +Label=be + +[keyboard-be-wang] +Description="Keyboard - Belgian - Belgian (Wang 724 AZERTY)" +Language=de +Label=be + +[keyboard-be-sun_type6] +Description="Keyboard - Belgian - Belgian (Sun Type 6/7)" +Language=de +Label=be + +[keyboard-eg] +Description="Keyboard - Coptic" +Language=cop +Label=eg + +[keyboard-cd] +Description="Keyboard - French (Democratic Republic of the Congo)" +Language=fr +Label=fr + +[keyboard-ba] +Description="Keyboard - Bosnian" +Language=bs +Label=bs + +[keyboard-ba-alternatequotes] +Description="Keyboard - Bosnian - Bosnian (with guillemets)" +Language=bs +Label=ba + +[keyboard-ba-unicode] +Description="Keyboard - Bosnian - Bosnian (with Bosnian digraphs)" +Language=bs +Label=ba + +[keyboard-ba-unicodeus] +Description="Keyboard - Bosnian - Bosnian (US, with Bosnian digraphs)" +Language=bs +Label=ba + +[keyboard-ba-us] +Description="Keyboard - Bosnian - Bosnian (US)" +Language=bs +Label=ba + +[keyboard-lv] +Description="Keyboard - Latvian" +Language=lv +Label=lv + +[keyboard-lv-apostrophe] +Description="Keyboard - Latvian - Latvian (apostrophe)" +Language=lv +Label=lv + +[keyboard-lv-tilde] +Description="Keyboard - Latvian - Latvian (tilde)" +Language=lv +Label=lv + +[keyboard-lv-fkey] +Description="Keyboard - Latvian - Latvian (F)" +Language=lv +Label=lv + +[keyboard-lv-modern] +Description="Keyboard - Latvian - Latvian (modern)" +Language=lv +Label=lv + +[keyboard-lv-ergonomic] +Description="Keyboard - Latvian - Latvian (ergonomic, ŪGJRMV)" +Language=lv +Label=lv + +[keyboard-lv-adapted] +Description="Keyboard - Latvian - Latvian (adapted)" +Language=lv +Label=lv + +[keyboard-lv-dvorak] +Description="Keyboard - Latvian - Latvian (Dvorak)" +Language=lv +Label=lv + +[keyboard-lv-ykeydvorak] +Description="Keyboard - Latvian - Latvian (Dvorak, with Y)" +Language=lv +Label=lv + +[keyboard-lv-minuskeydvorak] +Description="Keyboard - Latvian - Latvian (Dvorak, with minus)" +Language=lv +Label=lv + +[keyboard-lv-dvorakprogr] +Description="Keyboard - Latvian - Latvian (programmer Dvorak)" +Language=lv +Label=lv + +[keyboard-lv-ykeydvorakprogr] +Description="Keyboard - Latvian - Latvian (programmer Dvorak, with Y)" +Language=lv +Label=lv + +[keyboard-lv-minuskeydvorakprogr] +Description="Keyboard - Latvian - Latvian (programmer Dvorak, with minus)" +Language=lv +Label=lv + +[keyboard-lv-colemak] +Description="Keyboard - Latvian - Latvian (Colemak)" +Language=lv +Label=lv + +[keyboard-lv-apostrophecolemak] +Description="Keyboard - Latvian - Latvian (Colemak, with apostrophe)" +Language=lv +Label=lv + +[keyboard-lv-sun_type6] +Description="Keyboard - Latvian - Latvian (Sun Type 6/7)" +Language=lv +Label=lv + +[keyboard-me] +Description="Keyboard - Montenegrin" +Language=sr +Label=sr + +[keyboard-me-cyrillic] +Description="Keyboard - Montenegrin - Montenegrin (Cyrillic)" +Language=sr +Label=me + +[keyboard-me-cyrillicyz] +Description="Keyboard - Montenegrin - Montenegrin (Cyrillic, ZE and ZHE swapped)" +Language=sr +Label=me + +[keyboard-me-latinunicode] +Description="Keyboard - Montenegrin - Montenegrin (Latin, Unicode)" +Language=sr +Label=me + +[keyboard-me-latinyz] +Description="Keyboard - Montenegrin - Montenegrin (Latin, QWERTY)" +Language=sr +Label=me + +[keyboard-me-latinunicodeyz] +Description="Keyboard - Montenegrin - Montenegrin (Latin, Unicode, QWERTY)" +Language=sr +Label=me + +[keyboard-me-cyrillicalternatequotes] +Description="Keyboard - Montenegrin - Montenegrin (Cyrillic, with guillemets)" +Language=sr +Label=me + +[keyboard-me-latinalternatequotes] +Description="Keyboard - Montenegrin - Montenegrin (Latin, with guillemets)" +Language=sr +Label=me + +[keyboard-at] +Description="Keyboard - German (Austria)" +Language=de +Label=de + +[keyboard-at-nodeadkeys] +Description="Keyboard - German (Austria) - German (Austria, no dead keys)" +Language=de +Label=at + +[keyboard-at-mac] +Description="Keyboard - German (Austria) - German (Austria, Macintosh)" +Language=de +Label=at + +[keyboard-ch] +Description="Keyboard - German (Switzerland)" +Language=de +Label=de + +[keyboard-ch-legacy] +Description="Keyboard - German (Switzerland) - German (Switzerland, legacy)" +Language=de +Label=ch + +[keyboard-ch-de_nodeadkeys] +Description="Keyboard - German (Switzerland) - German (Switzerland, no dead keys)" +Language=de +Label=de + +[keyboard-ch-fr] +Description="Keyboard - German (Switzerland) - French (Switzerland)" +Language=fr +Label=fr + +[keyboard-ch-fr_nodeadkeys] +Description="Keyboard - German (Switzerland) - French (Switzerland, no dead keys)" +Language=fr +Label=fr + +[keyboard-ch-fr_mac] +Description="Keyboard - German (Switzerland) - French (Switzerland, Macintosh)" +Language=fr +Label=fr + +[keyboard-ch-de_mac] +Description="Keyboard - German (Switzerland) - German (Switzerland, Macintosh)" +Language=de +Label=de + +[keyboard-ch-sun_type6_de] +Description="Keyboard - German (Switzerland) - German (Switzerland, Sun Type 6/7)" +Language=de +Label=ch + +[keyboard-ch-sun_type6_fr] +Description="Keyboard - German (Switzerland) - French (Switzerland, Sun Type 6/7)" +Language=de +Label=ch + +[keyboard-kz] +Description="Keyboard - Kazakh" +Language=kk +Label=kk + +[keyboard-kz-ruskaz] +Description="Keyboard - Kazakh - Russian (Kazakhstan, with Kazakh)" +Language=ru +Label=ru + +[keyboard-kz-kazrus] +Description="Keyboard - Kazakh - Kazakh (with Russian)" +Language=kk +Label=kz + +[keyboard-kz-ext] +Description="Keyboard - Kazakh - Kazakh (extended)" +Language=kk +Label=kz + +[keyboard-kz-latin] +Description="Keyboard - Kazakh - Kazakh (Latin)" +Language=kk +Label=kz + +[keyboard-iq] +Description="Keyboard - Iraqi" +Language=ar +Label=ar + +[keyboard-iq-ku] +Description="Keyboard - Iraqi - Kurdish (Iraq, Latin Q)" +Language=ku +Label=ku + +[keyboard-iq-ku_f] +Description="Keyboard - Iraqi - Kurdish (Iraq, F)" +Language=ku +Label=ku + +[keyboard-iq-ku_alt] +Description="Keyboard - Iraqi - Kurdish (Iraq, Latin Alt-Q)" +Language=ku +Label=ku + +[keyboard-iq-ku_ara] +Description="Keyboard - Iraqi - Kurdish (Iraq, Arabic-Latin)" +Language=ku +Label=ku + +[keyboard-fo] +Description="Keyboard - Faroese" +Language=fo +Label=fo + +[keyboard-fo-nodeadkeys] +Description="Keyboard - Faroese - Faroese (no dead keys)" +Language=fo +Label=fo + +[keyboard-mk] +Description="Keyboard - Macedonian" +Language=mk +Label=mk + +[keyboard-mk-nodeadkeys] +Description="Keyboard - Macedonian - Macedonian (no dead keys)" +Language=mk +Label=mk + +[keyboard-cn] +Description="Keyboard - Chinese" +Language=zh +Label=zh + +[keyboard-cn-mon_trad] +Description="Keyboard - Chinese - Mongolian (Bichig)" +Language=mvf +Label=cn + +[keyboard-cn-mon_trad_todo] +Description="Keyboard - Chinese - Mongolian (Todo)" +Language=mvf +Label=cn + +[keyboard-cn-mon_trad_xibe] +Description="Keyboard - Chinese - Mongolian (Xibe)" +Language=sjo +Label=cn + +[keyboard-cn-mon_trad_manchu] +Description="Keyboard - Chinese - Mongolian (Manchu)" +Language=mnc +Label=cn + +[keyboard-cn-mon_trad_galik] +Description="Keyboard - Chinese - Mongolian (Galik)" +Language=mvf +Label=cn + +[keyboard-cn-mon_todo_galik] +Description="Keyboard - Chinese - Mongolian (Todo Galik)" +Language=mvf +Label=cn + +[keyboard-cn-mon_manchu_galik] +Description="Keyboard - Chinese - Mongolian (Manchu Galik)" +Language=mnc +Label=cn + +[keyboard-cn-tib] +Description="Keyboard - Chinese - Tibetan" +Language=bo +Label=cn + +[keyboard-cn-tib_asciinum] +Description="Keyboard - Chinese - Tibetan (with ASCII numerals)" +Language=bo +Label=cn + +[keyboard-cn-ug] +Description="Keyboard - Chinese - Uyghur" +Language=ug +Label=ug + +[keyboard-cn-altgr-pinyin] +Description="Keyboard - Chinese - Hanyu Pinyin (with AltGr dead keys)" +Language=zh +Label=cn + +[keyboard-ca] +Description="Keyboard - French (Canada)" +Language=fr +Label=fr + +[keyboard-ca-fr-dvorak] +Description="Keyboard - French (Canada) - French (Canada, Dvorak)" +Language=fr +Label=fr + +[keyboard-ca-fr-legacy] +Description="Keyboard - French (Canada) - French (Canada, legacy)" +Language=fr +Label=fr + +[keyboard-ca-multix] +Description="Keyboard - French (Canada) - Canadian (intl.)" +Language=fr +Label=ca + +[keyboard-ca-multi] +Description="Keyboard - French (Canada) - Canadian (intl., 1st part)" +Language=fr +Label=ca + +[keyboard-ca-multi-2gr] +Description="Keyboard - French (Canada) - Canadian (intl., 2nd part)" +Language=fr +Label=ca + +[keyboard-ca-ike] +Description="Keyboard - French (Canada) - Inuktitut" +Language=iu +Label=ike + +[keyboard-ca-eng] +Description="Keyboard - French (Canada) - English (Canada)" +Language=en +Label=en + +[keyboard-ca-kut] +Description="Keyboard - French (Canada) - Kutenai" +Language=fr +Label=kut + +[keyboard-ca-shs] +Description="Keyboard - French (Canada) - Secwepemctsin" +Language=fr +Label=shs + +[keyboard-ca-sun_type6] +Description="Keyboard - French (Canada) - Multilingual (Canada, Sun Type 6/7)" +Language=fr +Label=ca + +[keyboard-gh] +Description="Keyboard - English (Ghana)" +Language=en +Label=en + +[keyboard-gh-generic] +Description="Keyboard - English (Ghana) - English (Ghana, multilingual)" +Language=en +Label=gh + +[keyboard-gh-akan] +Description="Keyboard - English (Ghana) - Akan" +Language=ak +Label=ak + +[keyboard-gh-ewe] +Description="Keyboard - English (Ghana) - Ewe" +Language=ee +Label=ee + +[keyboard-gh-fula] +Description="Keyboard - English (Ghana) - Fula" +Language=ff +Label=ff + +[keyboard-gh-ga] +Description="Keyboard - English (Ghana) - Ga" +Language=gaa +Label=gaa + +[keyboard-gh-hausa] +Description="Keyboard - English (Ghana) - Hausa (Ghana)" +Language=ha +Label=ha + +[keyboard-gh-avn] +Description="Keyboard - English (Ghana) - Avatime" +Language=avn +Label=avn + +[keyboard-gh-gillbt] +Description="Keyboard - English (Ghana) - English (Ghana, GILLBT)" +Language=en +Label=gh + +[keyboard-fr] +Description="Keyboard - French" +Language=fr +Label=fr + +[keyboard-fr-nodeadkeys] +Description="Keyboard - French - French (no dead keys)" +Language=fr +Label=fr + +[keyboard-fr-oss] +Description="Keyboard - French - French (alt.)" +Language=fr +Label=fr + +[keyboard-fr-oss_latin9] +Description="Keyboard - French - French (alt., Latin-9 only)" +Language=fr +Label=fr + +[keyboard-fr-oss_nodeadkeys] +Description="Keyboard - French - French (alt., no dead keys)" +Language=fr +Label=fr + +[keyboard-fr-latin9] +Description="Keyboard - French - French (legacy, alt.)" +Language=fr +Label=fr + +[keyboard-fr-latin9_nodeadkeys] +Description="Keyboard - French - French (legacy, alt., no dead keys)" +Language=fr +Label=fr + +[keyboard-fr-bepo] +Description="Keyboard - French - French (BEPO)" +Language=fr +Label=fr + +[keyboard-fr-bepo_latin9] +Description="Keyboard - French - French (BEPO, Latin-9 only)" +Language=fr +Label=fr + +[keyboard-fr-bepo_afnor] +Description="Keyboard - French - French (BEPO, AFNOR)" +Language=fr +Label=fr + +[keyboard-fr-dvorak] +Description="Keyboard - French - French (Dvorak)" +Language=fr +Label=fr + +[keyboard-fr-mac] +Description="Keyboard - French - French (Macintosh)" +Language=fr +Label=fr + +[keyboard-fr-azerty] +Description="Keyboard - French - French (AZERTY)" +Language=fr +Label=fr + +[keyboard-fr-afnor] +Description="Keyboard - French - French (AZERTY, AFNOR)" +Language=fr +Label=fr + +[keyboard-fr-bre] +Description="Keyboard - French - French (Breton)" +Language=fr +Label=fr + +[keyboard-fr-oci] +Description="Keyboard - French - Occitan" +Language=oc +Label=fr + +[keyboard-fr-geo] +Description="Keyboard - French - Georgian (France, AZERTY Tskapo)" +Language=ka +Label=fr + +[keyboard-fr-us] +Description="Keyboard - French - French (US)" +Language=fr +Label=fr + +[keyboard-fr-sun_type6] +Description="Keyboard - French - French (Sun Type 6/7)" +Language=fr +Label=fr + +[keyboard-fr-us-alt] +Description="Keyboard - French - French (US with dead keys, alt.)" +Language=fr +Label=fr + +[keyboard-fr-us-azerty] +Description="Keyboard - French - French (US, AZERTY)" +Language=fr +Label=fr + +[keyboard-gn] +Description="Keyboard - N'Ko (azerty)" +Language=nqo +Label=gn + +[keyboard-uz] +Description="Keyboard - Uzbek" +Language=uz +Label=uz + +[keyboard-uz-latin] +Description="Keyboard - Uzbek - Uzbek (Latin)" +Language=uz +Label=uz + +[keyboard-fi] +Description="Keyboard - Finnish" +Language=fi +Label=fi + +[keyboard-fi-winkeys] +Description="Keyboard - Finnish - Finnish (Windows)" +Language=fi +Label=fi + +[keyboard-fi-classic] +Description="Keyboard - Finnish - Finnish (classic)" +Language=fi +Label=fi + +[keyboard-fi-nodeadkeys] +Description="Keyboard - Finnish - Finnish (classic, no dead keys)" +Language=fi +Label=fi + +[keyboard-fi-smi] +Description="Keyboard - Finnish - Northern Saami (Finland)" +Language=se +Label=fi + +[keyboard-fi-mac] +Description="Keyboard - Finnish - Finnish (Macintosh)" +Language=fi +Label=fi + +[keyboard-fi-sun_type6] +Description="Keyboard - Finnish - un Type 6/7)" +Language=fi +Label=fi + +[keyboard-fi-das] +Description="Keyboard - Finnish - Finnish (DAS)" +Language=fi +Label=fi + +[keyboard-fi-fidvorak] +Description="Keyboard - Finnish - Finnish (Dvorak)" +Language=fi +Label=fi + +[keyboard-lt] +Description="Keyboard - Lithuanian" +Language=lt +Label=lt + +[keyboard-lt-std] +Description="Keyboard - Lithuanian - Lithuanian (standard)" +Language=lt +Label=lt + +[keyboard-lt-us] +Description="Keyboard - Lithuanian - Lithuanian (US)" +Language=lt +Label=lt + +[keyboard-lt-ibm] +Description="Keyboard - Lithuanian - Lithuanian (IBM LST 1205-92)" +Language=lt +Label=lt + +[keyboard-lt-lekp] +Description="Keyboard - Lithuanian - Lithuanian (LEKP)" +Language=lt +Label=lt + +[keyboard-lt-lekpa] +Description="Keyboard - Lithuanian - Lithuanian (LEKPa)" +Language=lt +Label=lt + +[keyboard-lt-sgs] +Description="Keyboard - Lithuanian - Samogitian" +Language=sgs +Label=lt + +[keyboard-lt-ratise] +Description="Keyboard - Lithuanian - Lithuanian (Ratise)" +Language=lt +Label=lt + +[keyboard-lt-us_dvorak] +Description="Keyboard - Lithuanian - Lithuanian (Dvorak)" +Language=lt +Label=lt + +[keyboard-lt-sun_type6] +Description="Keyboard - Lithuanian - Lithuanian (Sun Type 6/7)" +Language=lt +Label=lt + +[keyboard-my] +Description="Keyboard - Malay (Jawi, Arabic Keyboard)" +Language=id +Label=ms + +[keyboard-my-phonetic] +Description="Keyboard - Malay (Jawi, Arabic Keyboard) - Malay (Jawi, phonetic)" +Language=id +Label=my + +[keyboard-pt] +Description="Keyboard - Portuguese" +Language=pt +Label=pt + +[keyboard-pt-nodeadkeys] +Description="Keyboard - Portuguese - Portuguese (no dead keys)" +Language=pt +Label=pt + +[keyboard-pt-mac] +Description="Keyboard - Portuguese - Portuguese (Macintosh)" +Language=pt +Label=pt + +[keyboard-pt-mac_nodeadkeys] +Description="Keyboard - Portuguese - Portuguese (Macintosh, no dead keys)" +Language=pt +Label=pt + +[keyboard-pt-nativo] +Description="Keyboard - Portuguese - Portuguese (Nativo)" +Language=pt +Label=pt + +[keyboard-pt-nativo-us] +Description="Keyboard - Portuguese - Portuguese (Nativo for US keyboards)" +Language=pt +Label=pt + +[keyboard-pt-nativo-epo] +Description="Keyboard - Portuguese - Esperanto (Portugal, Nativo)" +Language=eo +Label=pt + +[keyboard-pt-sun_type6] +Description="Keyboard - Portuguese - Portuguese (Sun Type 6/7)" +Language=pt +Label=pt + +[keyboard-pt-colemak] +Description="Keyboard - Portuguese - Portuguese (Colemak)" +Language=pt +Label=pt + +[keyboard-id] +Description="Keyboard - Indonesian (Arab Melayu, phonetic)" +Language=id +Label=id + +[keyboard-id-phoneticx] +Description="Keyboard - Indonesian (Arab Melayu, phonetic) - Indonesian (Arab Melayu, extended phonetic)" +Language=id +Label=id + +[keyboard-de] +Description="Keyboard - German" +Language=de +Label=de + +[keyboard-de-deadacute] +Description="Keyboard - German - German (dead acute)" +Language=de +Label=de + +[keyboard-de-deadgraveacute] +Description="Keyboard - German - German (dead grave acute)" +Language=de +Label=de + +[keyboard-de-nodeadkeys] +Description="Keyboard - German - German (no dead keys)" +Language=de +Label=de + +[keyboard-de-e1] +Description="Keyboard - German - German (E1)" +Language=de +Label=de + +[keyboard-de-e2] +Description="Keyboard - German - German (E2)" +Language=de +Label=de + +[keyboard-de-T3] +Description="Keyboard - German - German (T3)" +Language=de +Label=de + +[keyboard-de-us] +Description="Keyboard - German - German (US)" +Language=de +Label=de + +[keyboard-de-ro] +Description="Keyboard - German - Romanian (Germany)" +Language=ro +Label=de + +[keyboard-de-ro_nodeadkeys] +Description="Keyboard - German - Romanian (Germany, no dead keys)" +Language=ro +Label=de + +[keyboard-de-dvorak] +Description="Keyboard - German - German (Dvorak)" +Language=de +Label=de + +[keyboard-de-neo] +Description="Keyboard - German - German (Neo 2)" +Language=de +Label=de + +[keyboard-de-mac] +Description="Keyboard - German - German (Macintosh)" +Language=de +Label=de + +[keyboard-de-mac_nodeadkeys] +Description="Keyboard - German - German (Macintosh, no dead keys)" +Language=de +Label=de + +[keyboard-de-dsb] +Description="Keyboard - German - Lower Sorbian" +Language=dsb +Label=de + +[keyboard-de-dsb_qwertz] +Description="Keyboard - German - Lower Sorbian (QWERTZ)" +Language=dsb +Label=de + +[keyboard-de-qwerty] +Description="Keyboard - German - German (QWERTY)" +Language=de +Label=de + +[keyboard-de-tr] +Description="Keyboard - German - Turkish (Germany)" +Language= +Label=de + +[keyboard-de-ru] +Description="Keyboard - German - Russian (Germany, phonetic)" +Language=ru +Label=ru + +[keyboard-de-deadtilde] +Description="Keyboard - German - German (dead tilde)" +Language=de +Label=de + +[keyboard-de-hu] +Description="Keyboard - German - German (with Hungarian letters, no dead keys)" +Language=de +Label=de + +[keyboard-de-pl] +Description="Keyboard - German - Polish (Germany, no dead keys)" +Language=de +Label=de + +[keyboard-de-sun_type6] +Description="Keyboard - German - German (Sun Type 6/7)" +Language=de +Label=de + +[keyboard-de-adnw] +Description="Keyboard - German - German (Aus der Neo-Welt)" +Language=de +Label=de + +[keyboard-de-koy] +Description="Keyboard - German - German (KOY)" +Language=de +Label=de + +[keyboard-de-bone] +Description="Keyboard - German - German (Bone)" +Language=de +Label=de + +[keyboard-de-bone_eszett_home] +Description="Keyboard - German - German (Bone, eszett in the home row)" +Language=de +Label=de + +[keyboard-de-neo_qwertz] +Description="Keyboard - German - German (Neo, QWERTZ)" +Language=de +Label=de + +[keyboard-de-neo_qwerty] +Description="Keyboard - German - German (Neo, QWERTY)" +Language=de +Label=de + +[keyboard-de-ru-recom] +Description="Keyboard - German - Russian (Germany, recommended)" +Language=ru +Label=ru + +[keyboard-de-ru-translit] +Description="Keyboard - German - Russian (Germany, transliteration)" +Language=ru +Label=ru + +[keyboard-de-lld] +Description="Keyboard - German - German (Ladin)" +Language=de +Label=de_lld + +[keyboard-gr] +Description="Keyboard - Greek" +Language=el +Label=gr + +[keyboard-gr-simple] +Description="Keyboard - Greek - Greek (simple)" +Language=el +Label=gr + +[keyboard-gr-extended] +Description="Keyboard - Greek - Greek (extended)" +Language=el +Label=gr + +[keyboard-gr-nodeadkeys] +Description="Keyboard - Greek - Greek (no dead keys)" +Language=el +Label=gr + +[keyboard-gr-polytonic] +Description="Keyboard - Greek - Greek (polytonic)" +Language=el +Label=gr + +[keyboard-gr-sun_type6] +Description="Keyboard - Greek - Greek (Sun Type 6/7)" +Language=el +Label=gr + +[keyboard-gr-colemak] +Description="Keyboard - Greek - Greek (Colemak)" +Language=el +Label=gr + +[keyboard-tg] +Description="Keyboard - French (Togo)" +Language=fr +Label=fr-tg + +[keyboard-mao] +Description="Keyboard - Maori" +Language=mi +Label=mi + +[keyboard-sn] +Description="Keyboard - Wolof" +Language=wo +Label=wo + +[keyboard-kh] +Description="Keyboard - Khmer (Cambodia)" +Language=km +Label=km + +[keyboard-az] +Description="Keyboard - Azerbaijani" +Language=az +Label=az + +[keyboard-az-cyrillic] +Description="Keyboard - Azerbaijani - Azerbaijani (Cyrillic)" +Language=az +Label=az + +[keyboard-hu] +Description="Keyboard - Hungarian" +Language=hu +Label=hu + +[keyboard-hu-standard] +Description="Keyboard - Hungarian - Hungarian (standard)" +Language=hu +Label=hu + +[keyboard-hu-nodeadkeys] +Description="Keyboard - Hungarian - Hungarian (no dead keys)" +Language=hu +Label=hu + +[keyboard-hu-qwerty] +Description="Keyboard - Hungarian - Hungarian (QWERTY)" +Language=hu +Label=hu + +[keyboard-hu-101_qwertz_comma_dead] +Description="Keyboard - Hungarian - Hungarian (QWERTZ, 101-key, comma, dead keys)" +Language=hu +Label=hu + +[keyboard-hu-101_qwertz_comma_nodead] +Description="Keyboard - Hungarian - Hungarian (QWERTZ, 101-key, comma, no dead keys)" +Language=hu +Label=hu + +[keyboard-hu-101_qwertz_dot_dead] +Description="Keyboard - Hungarian - Hungarian (QWERTZ, 101-key, dot, dead keys)" +Language=hu +Label=hu + +[keyboard-hu-101_qwertz_dot_nodead] +Description="Keyboard - Hungarian - Hungarian (QWERTZ, 101-key, dot, no dead keys)" +Language=hu +Label=hu + +[keyboard-hu-101_qwerty_comma_dead] +Description="Keyboard - Hungarian - Hungarian (QWERTY, 101-key, comma, dead keys)" +Language=hu +Label=hu + +[keyboard-hu-101_qwerty_comma_nodead] +Description="Keyboard - Hungarian - Hungarian (QWERTY, 101-key, comma, no dead keys)" +Language=hu +Label=hu + +[keyboard-hu-101_qwerty_dot_dead] +Description="Keyboard - Hungarian - Hungarian (QWERTY, 101-key, dot, dead keys)" +Language=hu +Label=hu + +[keyboard-hu-101_qwerty_dot_nodead] +Description="Keyboard - Hungarian - Hungarian (QWERTY, 101-key, dot, no dead keys)" +Language=hu +Label=hu + +[keyboard-hu-102_qwertz_comma_dead] +Description="Keyboard - Hungarian - Hungarian (QWERTZ, 102-key, comma, dead keys)" +Language=hu +Label=hu + +[keyboard-hu-102_qwertz_comma_nodead] +Description="Keyboard - Hungarian - Hungarian (QWERTZ, 102-key, comma, no dead keys)" +Language=hu +Label=hu + +[keyboard-hu-102_qwertz_dot_dead] +Description="Keyboard - Hungarian - Hungarian (QWERTZ, 102-key, dot, dead keys)" +Language=hu +Label=hu + +[keyboard-hu-102_qwertz_dot_nodead] +Description="Keyboard - Hungarian - Hungarian (QWERTZ, 102-key, dot, no dead keys)" +Language=hu +Label=hu + +[keyboard-hu-102_qwerty_comma_dead] +Description="Keyboard - Hungarian - Hungarian (QWERTY, 102-key, comma, dead keys)" +Language=hu +Label=hu + +[keyboard-hu-102_qwerty_comma_nodead] +Description="Keyboard - Hungarian - Hungarian (QWERTY, 102-key, comma, no dead keys)" +Language=hu +Label=hu + +[keyboard-hu-102_qwerty_dot_dead] +Description="Keyboard - Hungarian - Hungarian (QWERTY, 102-key, dot, dead keys)" +Language=hu +Label=hu + +[keyboard-hu-102_qwerty_dot_nodead] +Description="Keyboard - Hungarian - Hungarian (QWERTY, 102-key, dot, no dead keys)" +Language=hu +Label=hu + +[keyboard-hu-oldhun] +Description="Keyboard - Hungarian - Old Hungarian" +Language=hu +Label=oldhun + +[keyboard-hu-oldhunlig] +Description="Keyboard - Hungarian - Old Hungarian (for ligatures)" +Language=hu +Label=oldhun(lig) + +[keyboard-tr] +Description="Keyboard - Turkish" +Language=tr +Label=tr + +[keyboard-tr-f] +Description="Keyboard - Turkish - Turkish (F)" +Language=tr +Label=tr + +[keyboard-tr-alt] +Description="Keyboard - Turkish - Turkish (Alt-Q)" +Language=tr +Label=tr + +[keyboard-tr-ku] +Description="Keyboard - Turkish - Kurdish (Turkey, Latin Q)" +Language=ku +Label=ku + +[keyboard-tr-ku_f] +Description="Keyboard - Turkish - Kurdish (Turkey, F)" +Language=ku +Label=ku + +[keyboard-tr-ku_alt] +Description="Keyboard - Turkish - Kurdish (Turkey, Latin Alt-Q)" +Language=ku +Label=ku + +[keyboard-tr-intl] +Description="Keyboard - Turkish - Turkish (intl., with dead keys)" +Language=tr +Label=tr + +[keyboard-tr-crh] +Description="Keyboard - Turkish - Crimean Tatar (Turkish Q)" +Language=crh +Label=crh + +[keyboard-tr-crh_f] +Description="Keyboard - Turkish - Crimean Tatar (Turkish F)" +Language=crh +Label=crh + +[keyboard-tr-crh_alt] +Description="Keyboard - Turkish - t-Q)" +Language=crh +Label=crh + +[keyboard-tr-sun_type6] +Description="Keyboard - Turkish - Turkish (Sun Type 6/7)" +Language=tr +Label=tr + +[keyboard-tr-otk] +Description="Keyboard - Turkish - Old Turkic" +Language=tr +Label=tr + +[keyboard-il] +Description="Keyboard - Hebrew" +Language=he +Label=he + +[keyboard-il-lyx] +Description="Keyboard - Hebrew - Hebrew (lyx)" +Language=he +Label=il + +[keyboard-il-phonetic] +Description="Keyboard - Hebrew - Hebrew (phonetic)" +Language=he +Label=il + +[keyboard-il-biblical] +Description="Keyboard - Hebrew - Hebrew (Biblical, Tiro)" +Language=he +Label=il + +[keyboard-il-biblicalSIL] +Description="Keyboard - Hebrew - Hebrew (Biblical, SIL phonetic)" +Language=he +Label=il + +[keyboard-it] +Description="Keyboard - Italian" +Language=it +Label=it + +[keyboard-it-nodeadkeys] +Description="Keyboard - Italian - Italian (no dead keys)" +Language=it +Label=it + +[keyboard-it-winkeys] +Description="Keyboard - Italian - Italian (Windows)" +Language=it +Label=it + +[keyboard-it-mac] +Description="Keyboard - Italian - Italian (Macintosh)" +Language=it +Label=it + +[keyboard-it-us] +Description="Keyboard - Italian - Italian (US)" +Language=it +Label=it + +[keyboard-it-geo] +Description="Keyboard - Italian - Georgian (Italy)" +Language=ka +Label=it + +[keyboard-it-ibm] +Description="Keyboard - Italian - Italian (IBM 142)" +Language=it +Label=it + +[keyboard-it-intl] +Description="Keyboard - Italian - Italian (intl., with dead keys)" +Language=it +Label=it + +[keyboard-it-scn] +Description="Keyboard - Italian - Sicilian" +Language=it +Label=it + +[keyboard-it-fur] +Description="Keyboard - Italian - Friulian (Italy)" +Language=fur +Label=it + +[keyboard-it-sun_type6] +Description="Keyboard - Italian - Italian (Sun Type 6/7)" +Language=it +Label=it + +[keyboard-it-lld] +Description="Keyboard - Italian - Italian (Ladin)" +Language=lld +Label=it_lld + +[keyboard-it-dvorak] +Description="Keyboard - Italian - Italian (Dvorak)" +Language=it +Label=it + +[keyboard-jp] +Description="Keyboard - Japanese" +Language=ja +Label=ja + +[keyboard-jp-kana] +Description="Keyboard - Japanese - Japanese (Kana)" +Language=ja +Label=jp + +[keyboard-jp-kana86] +Description="Keyboard - Japanese - Japanese (Kana 86)" +Language=ja +Label=jp + +[keyboard-jp-OADG109A] +Description="Keyboard - Japanese - Japanese (OADG 109A)" +Language=ja +Label=jp + +[keyboard-jp-mac] +Description="Keyboard - Japanese - Japanese (Macintosh)" +Language=ja +Label=jp + +[keyboard-jp-dvorak] +Description="Keyboard - Japanese - Japanese (Dvorak)" +Language=ja +Label=jp + +[keyboard-jp-sun_type6] +Description="Keyboard - Japanese - Japanese (Sun Type 6)" +Language=ja +Label=jp + +[keyboard-jp-sun_type7] +Description="Keyboard - Japanese - Japanese (Sun Type 7, PC-compatible)" +Language=ja +Label=jp + +[keyboard-jp-sun_type7_suncompat] +Description="Keyboard - Japanese - Japanese (Sun Type 7, Sun-compatible)" +Language=ja +Label=jp + +[keyboard-latam] +Description="Keyboard - Spanish (Latin American)" +Language=es +Label=es + +[keyboard-latam-nodeadkeys] +Description="Keyboard - Spanish (Latin American) - Spanish (Latin American, no dead keys)" +Language=es +Label=latam + +[keyboard-latam-deadtilde] +Description="Keyboard - Spanish (Latin American) - Spanish (Latin American, dead tilde)" +Language=es +Label=latam + +[keyboard-latam-dvorak] +Description="Keyboard - Spanish (Latin American) - Spanish (Latin American, Dvorak)" +Language=es +Label=latam + +[keyboard-latam-colemak] +Description="Keyboard - Spanish (Latin American) - Spanish (Latin American, Colemak)" +Language=es +Label=latam + +[keyboard-latam-colemak-gaming] +Description="Keyboard - Spanish (Latin American) - Spanish (Latin American, Colemak for gaming)" +Language=es +Label=latam + +[keyboard-mt] +Description="Keyboard - Maltese" +Language=mt +Label=mt + +[keyboard-mt-us] +Description="Keyboard - Maltese - Maltese (US)" +Language=mt +Label=mt + +[keyboard-mt-alt-us] +Description="Keyboard - Maltese - Maltese (US layout with AltGr overrides)" +Language=mt +Label=mt + +[keyboard-mt-alt-gb] +Description="Keyboard - Maltese - Maltese (UK, with AltGr overrides)" +Language=mt +Label=mt + +[keyboard-no] +Description="Keyboard - Norwegian" +Language=no +Label=no + +[keyboard-no-nodeadkeys] +Description="Keyboard - Norwegian - Norwegian (no dead keys)" +Language=no +Label=no + +[keyboard-no-winkeys] +Description="Keyboard - Norwegian - Norwegian (Windows)" +Language=no +Label=no + +[keyboard-no-dvorak] +Description="Keyboard - Norwegian - Norwegian (Dvorak)" +Language=no +Label=no + +[keyboard-no-smi] +Description="Keyboard - Norwegian - Northern Saami (Norway)" +Language=se +Label=no + +[keyboard-no-smi_nodeadkeys] +Description="Keyboard - Norwegian - Northern Saami (Norway, no dead keys)" +Language=se +Label=no + +[keyboard-no-mac] +Description="Keyboard - Norwegian - Norwegian (Macintosh)" +Language=no +Label=no + +[keyboard-no-mac_nodeadkeys] +Description="Keyboard - Norwegian - Norwegian (Macintosh, no dead keys)" +Language=no +Label=no + +[keyboard-no-colemak] +Description="Keyboard - Norwegian - Norwegian (Colemak)" +Language=no +Label=no + +[keyboard-no-sun_type6] +Description="Keyboard - Norwegian - Norwegian (Sun Type 6/7)" +Language=no +Label=no + +[keyboard-pl] +Description="Keyboard - Polish" +Language=pl +Label=pl + +[keyboard-pl-legacy] +Description="Keyboard - Polish - Polish (legacy)" +Language=pl +Label=pl + +[keyboard-pl-qwertz] +Description="Keyboard - Polish - Polish (QWERTZ)" +Language=pl +Label=pl + +[keyboard-pl-dvorak] +Description="Keyboard - Polish - Polish (Dvorak)" +Language=pl +Label=pl + +[keyboard-pl-dvorak_quotes] +Description="Keyboard - Polish - Polish (Dvorak, with Polish quotes on quotemark key)" +Language=pl +Label=pl + +[keyboard-pl-dvorak_altquotes] +Description="Keyboard - Polish - Polish (Dvorak, with Polish quotes on key 1)" +Language=pl +Label=pl + +[keyboard-pl-csb] +Description="Keyboard - Polish - Kashubian" +Language=csb +Label=pl + +[keyboard-pl-szl] +Description="Keyboard - Polish - Silesian" +Language=szl +Label=pl + +[keyboard-pl-ru_phonetic_dvorak] +Description="Keyboard - Polish - Russian (Poland, phonetic Dvorak)" +Language=ru +Label=ru + +[keyboard-pl-dvp] +Description="Keyboard - Polish - Polish (programmer Dvorak)" +Language=pl +Label=pl + +[keyboard-pl-intl] +Description="Keyboard - Polish - Polish (intl., with dead keys)" +Language=pl +Label=pl + +[keyboard-pl-colemak] +Description="Keyboard - Polish - Polish (Colemak)" +Language=pl +Label=pl + +[keyboard-pl-colemak_dh] +Description="Keyboard - Polish - Polish (Colemak-DH)" +Language=pl +Label=pl + +[keyboard-pl-sun_type6] +Description="Keyboard - Polish - Polish (Sun Type 6/7)" +Language=pl +Label=pl + +[keyboard-pl-glagolica] +Description="Keyboard - Polish - Polish (Glagolica)" +Language=pl +Label=pl + +[keyboard-ro] +Description="Keyboard - Romanian" +Language=ro +Label=ro + +[keyboard-ro-std] +Description="Keyboard - Romanian - Romanian (standard)" +Language=ro +Label=ro + +[keyboard-ro-winkeys] +Description="Keyboard - Romanian - Romanian (Windows)" +Language=ro +Label=ro + +[keyboard-ro-crh_dobruja] +Description="Keyboard - Romanian - Crimean Tatar (Dobruja Q)" +Language=crh +Label=crh + +[keyboard-ro-ergonomic] +Description="Keyboard - Romanian - Romanian (ergonomic Touchtype)" +Language=ro +Label=ro + +[keyboard-ro-sun_type6] +Description="Keyboard - Romanian - Romanian (Sun Type 6/7)" +Language=ro +Label=ro + diff --git a/config/fcitx5/conf/classicui.conf b/config/fcitx5/conf/classicui.conf new file mode 100644 index 0000000..8ca9227 --- /dev/null +++ b/config/fcitx5/conf/classicui.conf @@ -0,0 +1,29 @@ +# Vertical Candidate List +Vertical Candidate List=False +# Use Per Screen DPI +PerScreenDPI=False +# Use mouse wheel to go to prev or next page +WheelForPaging=True +# Font +Font="Source Han Sans CN 13" +# Menu Font +MenuFont="Source Han Sans CN 10" +# Use input method langauge to display text +UseInputMethodLangaugeToDisplayText=True + +# Available Themes +# +# Material-Color-Pink +# Material-Color-Blue +# Material-Color-Brown +# Material-Color-DeepPurple +# Material-Color-Indigo +# Material-Color-Red +# Material-Color-Teal +# Material-Color-Black +# Material-Color-Orange +# Material-Color-SakuraPink + +# Theme +Theme=Material-Color-Black + diff --git a/config/fcitx5/conf/notifications.conf b/config/fcitx5/conf/notifications.conf new file mode 100644 index 0000000..36b4456 --- /dev/null +++ b/config/fcitx5/conf/notifications.conf @@ -0,0 +1,3 @@ +[HiddenNotifications] +0=fcitx-rime-deploy + diff --git a/config/fcitx5/conf/rime.conf b/config/fcitx5/conf/rime.conf new file mode 100644 index 0000000..c0af886 --- /dev/null +++ b/config/fcitx5/conf/rime.conf @@ -0,0 +1,12 @@ +# Show preedit within application +# 单行模式 +PreeditInApplication=True +# Commit current text when deactivating +Commit when deactivate=True +# Load available plugins automatically +AutoloadPlugins=True +# Plugins +Plugins= +# Modules +Modules= + diff --git a/config/fcitx5/config b/config/fcitx5/config new file mode 100644 index 0000000..455ca12 --- /dev/null +++ b/config/fcitx5/config @@ -0,0 +1,69 @@ +[Hotkey] +# Enumerate when press trigger key repeatedly +EnumerateWithTriggerKeys=True +# Skip first input method while enumerating +EnumerateSkipFirst=False + +[Hotkey/TriggerKeys] +0=Multi_key + +[Hotkey/AltTriggerKeys] +0=Shift_L + +[Hotkey/EnumerateForwardKeys] +0=Control+Shift_L + +[Hotkey/EnumerateBackwardKeys] +0=Control+Shift_R + +[Hotkey/EnumerateGroupForwardKeys] +0=Super+space + +[Hotkey/EnumerateGroupBackwardKeys] +0=Shift+Super+space + +[Hotkey/ActivateKeys] +0=Multi_key + +[Hotkey/DeactivateKeys] +0=Multi_key + +[Hotkey/PrevPage] +0=Up + +[Hotkey/NextPage] +0=Down + +[Hotkey/PrevCandidate] +0=Shift+Tab + +[Hotkey/NextCandidate] +0=Tab + +[Hotkey/TogglePreedit] +0=Control+Alt+P + +[Behavior] +# Active By Default +ActiveByDefault=False +# Share Input State +ShareInputState=No +# Show preedit in application +PreeditEnabledByDefault=True +# Show Input Method Information when switch input method +ShowInputMethodInformation=True +# Show Input Method Information when changing focus +showInputMethodInformationWhenFocusIn=False +# Show compact input method information +CompactInputMethodInformation=True +# Show first input method information +ShowFirstInputMethodInformation=True +# Default page size +DefaultPageSize=9 +# Force Enabled Addons +EnabledAddons= +# Force Disabled Addons +DisabledAddons= +# Preload input method to be used by default +PreloadInputMethod=True + diff --git a/config/fcitx5/profile b/config/fcitx5/profile new file mode 100644 index 0000000..d28185b --- /dev/null +++ b/config/fcitx5/profile @@ -0,0 +1,23 @@ +[Groups/0] +# Group Name +Name=Default +# Layout +Default Layout=us +# Default Input Method +DefaultIM=rime + +[Groups/0/Items/0] +# Name +Name=keyboard-us +# Layout +Layout= + +[Groups/0/Items/1] +# Name +Name=rime +# Layout +Layout= + +[GroupOrder] +0=Default + diff --git a/config/git/commit-template.txt b/config/git/commit-template.txt new file mode 100644 index 0000000..87a5de4 --- /dev/null +++ b/config/git/commit-template.txt @@ -0,0 +1,58 @@ +Sub: + +Body: + +==== End ==== + +# ## Help ## +# +# Subject line imperative uppercase verbs: +# +# Add = Create a capability e.g. feature, test, dependency. +# Drop = Delete a capability e.g. feature, test, dependency. +# Fix = Fix an issue e.g. bug, typo, accident, misstatement. +# Bump = Increase the version of something e.g. a dependency. +# Make = Change the build process, or tools, or infrastructure. +# Start = Begin doing something; e.g. enable a toggle, feature flag, etc. +# Stop = End doing something; e.g. disable a toggle, feature flag, etc. +# Optimize = A change that MUST be just about performance, e.g. speed up code. +# Document = A change that MUST be only in the documentation, e.g. help files. +# Refactor = A change that MUST be just refactoring. +# Reformat = A change that MUST be just format, e.g. indent line, trim space, etc. +# Rephrase = A change that MUST be just textual, e.g. edit a comment, doc, etc. +# +# For the subject line: +# * Use 50 characters maximum. +# * Do not use a sentence-ending period. +# +# For the body text: +# * Use as many lines as you like. +# * Use 72 characters maximum per line for typical word wrap text. +# +# +# ## About ## +# +# This is our team's starting point for our git commit messages. +# You can edit this template as you like, to customize it. +# +# For more information about git commit ideas and help: +# https://github.com/joelparkerhenderson/git_commit_message +# +# +# ## Usage ## +# +# Put the template file here: +# +# ~/.git_commit_template.txt +# +# Configure git to use the template file by running: +# +# git config --global commit.template ~/.git_commit_template.txt +# +# Or add the template file to the ~/.gitconfig file: +# +# [commit] +# template = ~/.git_commit_template.txt +# +# If you prefer other file locations or ways of working, +# you can freely adjust the usage as you like. diff --git a/config/git/default.gitconfig b/config/git/default.gitconfig new file mode 100644 index 0000000..93cddeb --- /dev/null +++ b/config/git/default.gitconfig @@ -0,0 +1,54 @@ +[user] + email = astroshot@outlook.com + name = Shockwave +[commit] + template = ~/.config/git/commit-template.txt +[pull] + rebase = true + +# my vim is a soft link of nvim +[core] + editor = nvim + # pager = delta +[diff] + tool = nvimdiff +[difftool "nvimdiff"] + cmd = nvim -d $LOCAL $REMOTE $MERGED -c "$wincmd w" -c "wincmd J" + +# merge UI in vim will be like: +# +-------------------------------------+ +# | | | | +# | LOCAL | BASE | REMOTE | +# | | | | +# +-------------------------------------+ +# | | +# | | +# | MERGED | +# | | +# | | +# +-------------------------------------+ +[merge] + tool = nvimdiff +[mergetool] + cmd = nvim -d $LOCAL $BASE $REMOTE $MERGED -c "$wincmd w" -c "$wincmd J" + keepBackup = false + +# Don't use pager when type `git branch` +[pager] + branch = false + +# [interactive] +# diffFilter = delta --color-only + +# [delta] +# features = side-by-side line-numbers decorations +# whitespace-error-style = 22 reverse +# plus-style = "syntax #012800" +# minus-style = "syntax #340001" +# syntax-theme = Monokai Extended +# navigate = true +# linenumbers = true +# [delta "decorations"] +# commit-decoration-style = bold yellow box ul +# file-style = bold yellow ul +# file-decoration-style = none diff --git a/config/golang/dlv/config.yml b/config/golang/dlv/config.yml new file mode 100644 index 0000000..838298b --- /dev/null +++ b/config/golang/dlv/config.yml @@ -0,0 +1,25 @@ +# Configuration file for the delve debugger. + +# This is the default configuration file. Available options are provided, but disabled. +# Delete the leading hash mark to enable an item. + +# Provided aliases will be added to the default aliases for a given command. +aliases: + # command: ["alias1", "alias2"] + +# Define sources path substitution rules. Can be used to rewrite a source path stored +# in program's debug information, if the sources were moved to a different place +# between compilation and debugging. +# Note that substitution rules will not be used for paths passed to "break" and "trace" +# commands. +substitute-path: + # - {from: path, to: path} + +# Maximum number of elements loaded from an array. +# max-array-values: 64 + +# Maximum loaded string length. +max-string-len: 99999 + +# Uncomment the following line to make the whatis command also print the DWARF location expression of its argument. +# show-location-expr: true diff --git a/config/golang/get-go-env.sh b/config/golang/get-go-env.sh new file mode 100644 index 0000000..cbb5147 --- /dev/null +++ b/config/golang/get-go-env.sh @@ -0,0 +1,31 @@ +#!/bin/bash +mkdir -p $GOPATH/src/golang.org/x +git clone https://github.com/golang/tools.git $GOPATH/src/golang.org/x/tools +git clone https://github.com/golang/lint.git $GOPATH/src/golang.org/x/lint +git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net +git clone https://github.com/golang/sys.git $GOPATH/src/golang.org/x/sys + +go get github.com/nsf/gocode +go get github.com/stamblerre/gocode +go get github.com/uudashr/gopkgs/cmd/gopkgs +go get github.com/ramya-rao-a/go-outline +go get github.com/acroca/go-symbols +go get github.com/fatih/gomodifytags +go get github.com/haya14busa/goplay/cmd/goplay +go get github.com/josharian/impl +go get github.com/davidrjenni/reftools/cmd/fillstruct +go get github.com/rogpeppe/godef +go get golang.org/x/tools/cmd/godoc +go get github.com/sqs/goreturns +go get github.com/golang/lint/golint +go get github.com/kisielk/errcheck +go get github.com/klauspost/asmfmt/cmd/asmfmt +go get github.com/alecthomas/gometalinter +go get honnef.co/go/tools/cmd/keyify +go get github.com/cweill/gotests/... + +go get golang.org/x/tools/cmd/guru +go get golang.org/x/tools/cmd/gorename +go get golang.org/x/tools/cmd/goimports +go get golang.org/x/tools/cmd/gopls +curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh diff --git a/config/i3/Install.md b/config/i3/Install.md new file mode 100644 index 0000000..ede44f8 --- /dev/null +++ b/config/i3/Install.md @@ -0,0 +1,36 @@ +# Install i3 + +## Packages + +```bash +sudo pacman -S i3-gaps xorg-servier xorg-init xorg-xrandr +``` + +## Fonts + +```bash +sudo pacman -S wqy-microhei +``` + +## Polybar + +```bash +yay -S nerd-fonts-meslo polybar bspwm xbacklight pulseaudio wlan battery temperature +``` + +## Adjust resolution + +Input `cvt 1920 1080` and returns + +```bash +Modeline "1920x1080_60.00" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync +``` + +Then + +```bash +xrandr --newmode "1920x1080" 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync +xrandr --addmode Virtual-1 1920x1080 +xrandr --output Virtual-1 --mode 1920x1080 +``` + diff --git a/config/i3/config b/config/i3/config new file mode 100644 index 0000000..aaf10b9 --- /dev/null +++ b/config/i3/config @@ -0,0 +1,247 @@ +# This file has been auto-generated by i3-config-wizard(1). +# It will not be overwritten, so edit it as you like. +# +# Should you change your keyboard layout some time, delete +# this file and re-run i3-config-wizard(1). +# + +# i3 config file (v4) +# +# Please see https://i3wm.org/docs/userguide.html for a complete reference! + +set $mod Mod4 + +# Font for window titles. Will also be used by the bar unless a different font +# is used in the bar {} block below. +font pango:monospace 8 + +# This font is widely installed, provides lots of unicode glyphs, right-to-left +# text rendering and scalability on retina/hidpi displays (thanks to pango). +#font pango:DejaVu Sans Mono 8 + +# The combination of xss-lock, nm-applet and pactl is a popular choice, so +# they are included here as an example. Modify as you see fit. + +# xss-lock grabs a logind suspend inhibit lock and will use i3lock to lock the +# screen before suspend. Use loginctl lock-session to lock your screen. +exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock --nofork + +# NetworkManager is the most popular way to manage wireless networks on Linux, +# and nm-applet is a desktop environment-independent system tray GUI for it. +exec --no-startup-id nm-applet + +# Use pactl to adjust volume in PulseAudio. +set $refresh_i3status killall -SIGUSR1 i3status +bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status +bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status +bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status +bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status + +# Use Mouse+$mod to drag floating windows to their wanted position +floating_modifier $mod + +# start a terminal +bindsym $mod+Return exec i3-sensible-terminal + +# kill focused window +bindsym $mod+Shift+q kill + +# start dmenu (a program launcher) +# bindsym $mod+d exec dmenu_run +# There also is the (new) i3-dmenu-desktop which only displays applications +# shipping a .desktop file. It is a wrapper around dmenu, so you need that +# installed. +# bindsym $mod+d exec --no-startup-id i3-dmenu-desktop + +# change focus +bindsym $mod+j focus left +bindsym $mod+k focus down +bindsym $mod+l focus up +bindsym $mod+semicolon focus right + +# alternatively, you can use the cursor keys: +bindsym $mod+Left focus left +bindsym $mod+Down focus down +bindsym $mod+Up focus up +bindsym $mod+Right focus right + +# move focused window +bindsym $mod+Shift+j move left +bindsym $mod+Shift+k move down +bindsym $mod+Shift+l move up +bindsym $mod+Shift+semicolon move right + +# alternatively, you can use the cursor keys: +bindsym $mod+Shift+Left move left +bindsym $mod+Shift+Down move down +bindsym $mod+Shift+Up move up +bindsym $mod+Shift+Right move right + +# split in horizontal orientation +bindsym $mod+h split h + +# split in vertical orientation +bindsym $mod+v split v + +# enter fullscreen mode for the focused container +bindsym $mod+f fullscreen toggle + +# change container layout (stacked, tabbed, toggle split) +bindsym $mod+s layout stacking +bindsym $mod+w layout tabbed +bindsym $mod+e layout toggle split + +# toggle tiling / floating +bindsym $mod+Shift+space floating toggle + +# change focus between tiling / floating windows +bindsym $mod+space focus mode_toggle + +# focus the parent container +bindsym $mod+a focus parent + +# focus the child container +#bindsym $mod+d focus child + +# Define names for default workspaces for which we configure key bindings later on. +# We use variables to avoid repeating the names in multiple places. +set $ws1 "1" +set $ws2 "2" +set $ws3 "3" +set $ws4 "4" +set $ws5 "5" +set $ws6 "6" +set $ws7 "7" +set $ws8 "8" +set $ws9 "9" +set $ws10 "10" + +# switch to workspace +bindsym $mod+1 workspace number $ws1 +bindsym $mod+2 workspace number $ws2 +bindsym $mod+3 workspace number $ws3 +bindsym $mod+4 workspace number $ws4 +bindsym $mod+5 workspace number $ws5 +bindsym $mod+6 workspace number $ws6 +bindsym $mod+7 workspace number $ws7 +bindsym $mod+8 workspace number $ws8 +bindsym $mod+9 workspace number $ws9 +bindsym $mod+0 workspace number $ws10 + +# move focused container to workspace +bindsym $mod+Shift+1 move container to workspace number $ws1 +bindsym $mod+Shift+2 move container to workspace number $ws2 +bindsym $mod+Shift+3 move container to workspace number $ws3 +bindsym $mod+Shift+4 move container to workspace number $ws4 +bindsym $mod+Shift+5 move container to workspace number $ws5 +bindsym $mod+Shift+6 move container to workspace number $ws6 +bindsym $mod+Shift+7 move container to workspace number $ws7 +bindsym $mod+Shift+8 move container to workspace number $ws8 +bindsym $mod+Shift+9 move container to workspace number $ws9 +bindsym $mod+Shift+0 move container to workspace number $ws10 + +# reload the configuration file +bindsym $mod+Shift+c reload +# restart i3 inplace (preserves your layout/session, can be used to upgrade i3) +bindsym $mod+Shift+r restart +# exit i3 (logs you out of your X session) +bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -B 'Yes, exit i3' 'i3-msg exit'" + +# resize window (you can also use the mouse for that) +mode "resize" { + # These bindings trigger as soon as you enter the resize mode + + # Pressing left will shrink the window’s width. + # Pressing right will grow the window’s width. + # Pressing up will shrink the window’s height. + # Pressing down will grow the window’s height. + bindsym j resize shrink width 10 px or 10 ppt + bindsym k resize grow height 10 px or 10 ppt + bindsym l resize shrink height 10 px or 10 ppt + bindsym semicolon resize grow width 10 px or 10 ppt + + # same bindings, but for the arrow keys + bindsym Left resize shrink width 10 px or 10 ppt + bindsym Down resize grow height 10 px or 10 ppt + bindsym Up resize shrink height 10 px or 10 ppt + bindsym Right resize grow width 10 px or 10 ppt + + # back to normal: Enter or Escape or $mod+r + bindsym Return mode "default" + bindsym Escape mode "default" + bindsym $mod+r mode "default" +} + +bindsym $mod+r mode "resize" +bindsym $mod+d exec rofi -show drun + +# Start i3bar to display a workspace bar (plus the system information i3status +# finds out, if available) +# bar { +# status_command i3status +# font pango: MesloLGLDZ Nerd Font 12 +# } + +# remove i3 title +new_window none +new_float normal +hide_edge_borders both + +# polybar config +exec_always --no-startup-id $HOME/.config/polybar/launch.sh + +# ----------------------------------------------------------------------------- +# i3-gaps +# ----------------------------------------------------------------------------- + +gaps inner 6 +gaps outer 0 +smart_gaps on +smart_borders on + +set $mode_gaps gaps +set $mode_gaps_outer outer gaps +set $mode_gaps_inner inner gaps +bindsym $mod+Shift+g mode "$mode_gaps" + +mode "$mode_gaps" { + bindsym o mode "$mode_gaps_outer" + bindsym i mode "$mode_gaps_inner" + + bindsym 0 mode "default", exec --no-startup-id i3-msg "gaps inner current set 0" && i3-msg "gaps outer current set 0" + bindsym d mode "default", exec --no-startup-id i3-msg "gaps inner current set $default_gaps_inner" && i3-msg "gaps outer current set $default_gaps_outer" + + bindsym Return mode "default" + bindsym Escape mode "default" +} + +mode "$mode_gaps_inner" { + bindsym plus gaps inner current plus 5 + bindsym minus gaps inner current minus 5 + bindsym 0 mode "default", gaps inner current set 0 + bindsym d mode "default", gaps inner current set $default_gaps_inner + + bindsym Shift+plus gaps inner all plus 5 + bindsym Shift+minus gaps inner all minus 5 + bindsym Shift+0 mode "default", gaps inner all set 0 + bindsym Shift+d mode "default", gaps inner all set $default_gaps_inner + + bindsym Return mode "default" + bindsym Escape mode "default" +} + +mode "$mode_gaps_outer" { + bindsym plus gaps outer current plus 5 + bindsym minus gaps outer current minus 5 + bindsym 0 mode "default", gaps outer current set 0 + bindsym d mode "default", gaps outer current set $default_gaps_outer + + bindsym Shift+plus gaps outer all plus 5 + bindsym Shift+minus gaps outer all minus 5 + bindsym Shift+0 mode "default", gaps outer all set 0 + bindsym Shift+d mode "default", gaps outer all set $default_gaps_outer + + bindsym Return mode "default" + bindsym Escape mode "default" +} + diff --git a/config/i3/config.sh b/config/i3/config.sh new file mode 100644 index 0000000..00a00a4 --- /dev/null +++ b/config/i3/config.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +# adjust resolution + +set -x +xrandr --newmode "1920x1080" $(cvt 1920 1080 | sed '1d' | sed 's/Modeline "1920x1080_60.00"//') +xrandr --addmode Virtual-1 1920x1080 +xrandr --output Virtual-1 --mode 1920x1080 + diff --git a/config/ide/create-idea.sh b/config/ide/create-idea.sh new file mode 100755 index 0000000..8bad838 --- /dev/null +++ b/config/ide/create-idea.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +set -x +bin_file=/opt/idea/bin/idea.sh +echo '' >>$bin_file +echo '# chinese input settings' >>$bin_file +echo 'export GTK_IM_MODULE=fcitx' >>$bin_file +echo 'export QT_IM_MODULE=fcitx' >>$bin_file +echo 'export XMODIFIERS=@im=fcitx' >>$bin_file + +if [[ ! -d ~/.local/share/applications ]]; then + mkdir -p ~/.local/share/applications +fi + +if [[ ! -f ~/.local/share/applications/idea.desktop ]]; then + touch ~/.local/share/applications/idea.desktop +fi + +cat >~/.local/share/applications/idea.desktop <~/.local/share/applications/postman.desktop <>$bin_file +echo '# chinese input settings' >>$bin_file +echo 'export GTK_IM_MODULE=fcitx' >>$bin_file +echo 'export QT_IM_MODULE=fcitx' >>$bin_file +echo 'export XMODIFIERS=@im=fcitx' >>$bin_file + +if [[ ! -d ~/.local/share/applications ]]; then + mkdir -p ~/.local/share/applications +fi + +if [[ ! -f ~/.local/share/applications/pycharm.desktop ]]; then + touch ~/.local/share/applications/pycharm.desktop +fi + +cat >~/.local/share/applications/pycharm.desktop < ~/.local/share/applications/pycharm.desktop < to get BIDI +#: support, because it will force kitty to always treat the text as +#: LTR, which FriBidi expects for terminals. + +# adjust_line_height 0 +# adjust_column_width 0 + +adjust_line_height 110% +adjust_column_width 100% + +#: Change the size of each character cell kitty renders. You can use +#: either numbers, which are interpreted as pixels or percentages +#: (number followed by %), which are interpreted as percentages of the +#: unmodified values. You can use negative pixels or percentages less +#: than 100% to reduce sizes (but this might cause rendering +#: artifacts). + +# adjust_baseline 0 + +#: Adjust the vertical alignment of text (the height in the cell at +#: which text is positioned). You can use either numbers, which are +#: interpreted as pixels or percentages (number followed by %), which +#: are interpreted as the percentage of the line height. A positive +#: value moves the baseline up, and a negative value moves them down. +#: The underline and strikethrough positions are adjusted accordingly. + +# symbol_map + +#: E.g. symbol_map U+E0A0-U+E0A3,U+E0C0-U+E0C7 PowerlineSymbols + +#: Map the specified Unicode codepoints to a particular font. Useful +#: if you need special rendering for some symbols, such as for +#: Powerline. Avoids the need for patched fonts. Each Unicode code +#: point is specified in the form `U+`. You +#: can specify multiple code points, separated by commas and ranges +#: separated by hyphens. This option can be specified multiple times. +#: The syntax is:: + +#: symbol_map codepoints Font Family Name + +# narrow_symbols + +#: E.g. narrow_symbols U+E0A0-U+E0A3,U+E0C0-U+E0C7 1 + +#: Usually, for Private Use Unicode characters and some symbol/dingbat +#: characters, if the character is followed by one or more spaces, +#: kitty will use those extra cells to render the character larger, if +#: the character in the font has a wide aspect ratio. Using this +#: option you can force kitty to restrict the specified code points to +#: render in the specified number of cells (defaulting to one cell). +#: This option can be specified multiple times. The syntax is:: + +#: narrow_symbols codepoints [optionally the number of cells] + +# disable_ligatures never + +#: Choose how you want to handle multi-character ligatures. The +#: default is to always render them. You can tell kitty to not render +#: them when the cursor is over them by using cursor to make editing +#: easier, or have kitty never render them at all by using always, if +#: you don't like them. The ligature strategy can be set per-window +#: either using the kitty remote control facility or by defining +#: shortcuts for it in kitty.conf, for example:: + +#: map alt+1 disable_ligatures_in active always +#: map alt+2 disable_ligatures_in all never +#: map alt+3 disable_ligatures_in tab cursor + +#: Note that this refers to programming ligatures, typically +#: implemented using the calt OpenType feature. For disabling general +#: ligatures, use the font_features option. + +# font_features + +#: E.g. font_features none + +#: Choose exactly which OpenType features to enable or disable. This +#: is useful as some fonts might have features worthwhile in a +#: terminal. For example, Fira Code includes a discretionary feature, +#: zero, which in that font changes the appearance of the zero (0), to +#: make it more easily distinguishable from Ø. Fira Code also includes +#: other discretionary features known as Stylistic Sets which have the +#: tags ss01 through ss20. + +#: For the exact syntax to use for individual features, see the +#: HarfBuzz documentation . + +#: Note that this code is indexed by PostScript name, and not the font +#: family. This allows you to define very precise feature settings; +#: e.g. you can disable a feature in the italic font but not in the +#: regular font. + +#: On Linux, font features are first read from the FontConfig database +#: and then this option is applied, so they can be configured in a +#: single, central place. + +#: To get the PostScript name for a font, use `kitty +list-fonts +#: --psnames`: + +#: .. code-block:: sh + +#: $ kitty +list-fonts --psnames | grep Fira +#: Fira Code +#: Fira Code Bold (FiraCode-Bold) +#: Fira Code Light (FiraCode-Light) +#: Fira Code Medium (FiraCode-Medium) +#: Fira Code Regular (FiraCode-Regular) +#: Fira Code Retina (FiraCode-Retina) + +#: The part in brackets is the PostScript name. + +#: Enable alternate zero and oldstyle numerals:: + +#: font_features FiraCode-Retina +zero +onum + +#: Enable only alternate zero in the bold font:: + +#: font_features FiraCode-Bold +zero + +#: Disable the normal ligatures, but keep the calt feature which (in +#: this font) breaks up monotony:: + +#: font_features TT2020StyleB-Regular -liga +calt + +#: In conjunction with force_ltr, you may want to disable Arabic +#: shaping entirely, and only look at their isolated forms if they +#: show up in a document. You can do this with e.g.:: + +#: font_features UnifontMedium +isol -medi -fina -init + +# box_drawing_scale 0.001, 1, 1.5, 2 + +#: The sizes of the lines used for the box drawing Unicode characters. +#: These values are in pts. They will be scaled by the monitor DPI to +#: arrive at a pixel value. There must be four values corresponding to +#: thin, normal, thick, and very thick lines. + +#: }}} + +#: Cursor customization {{{ + +# cursor #cccccc +cursor #fdf6e3 + +#: Default cursor color. If set to the special value none the cursor +#: will be rendered with a "reverse video" effect. It's color will be +#: the color of the text in the cell it is over and the text will be +#: rendered with the background color of the cell. Note that if the +#: program running in the terminal sets a cursor color, this takes +#: precedence. Also, the cursor colors are modified if the cell +#: background and foreground colors have very low contrast. + +# cursor_text_color #111111 +cursor_text_color #002b36 + +#: The color of text under the cursor. If you want it rendered with +#: the background color of the cell underneath instead, use the +#: special keyword: background. Note that if cursor is set to none +#: then this option is ignored. + +cursor_shape block + +#: The cursor shape can be one of block, beam, underline. Note that +#: when reloading the config this will be changed only if the cursor +#: shape has not been set by the program running in the terminal. This +#: sets the default cursor shape, applications running in the terminal +#: can override it. In particular, shell integration +#: in kitty sets +#: the cursor shape to beam at shell prompts. You can avoid this by +#: setting shell_integration to no-cursor. + +# cursor_beam_thickness 1.5 + +#: The thickness of the beam cursor (in pts). + +# cursor_underline_thickness 2.0 + +#: The thickness of the underline cursor (in pts). + +cursor_blink_interval 0 + +#: The interval to blink the cursor (in seconds). Set to zero to +#: disable blinking. Negative values mean use system default. Note +#: that the minimum interval will be limited to repaint_delay. + +# cursor_stop_blinking_after 15.0 + +#: Stop blinking cursor after the specified number of seconds of +#: keyboard inactivity. Set to zero to never stop blinking. + +#: }}} + +#: Scrollback {{{ + +scrollback_lines 2000 + +#: Number of lines of history to keep in memory for scrolling back. +#: Memory is allocated on demand. Negative numbers are (effectively) +#: infinite scrollback. Note that using very large scrollback is not +#: recommended as it can slow down performance of the terminal and +#: also use large amounts of RAM. Instead, consider using +#: scrollback_pager_history_size. Note that on config reload if this +#: is changed it will only affect newly created windows, not existing +#: ones. + +# scrollback_pager less --chop-long-lines --RAW-CONTROL-CHARS +INPUT_LINE_NUMBER + +# TODO: Try to use vim to browse scrollback history +# scrollback_pager vi -c 'set ft=man' - + +#: Program with which to view scrollback in a new window. The +#: scrollback buffer is passed as STDIN to this program. If you change +#: it, make sure the program you use can handle ANSI escape sequences +#: for colors and text formatting. INPUT_LINE_NUMBER in the command +#: line above will be replaced by an integer representing which line +#: should be at the top of the screen. Similarly CURSOR_LINE and +#: CURSOR_COLUMN will be replaced by the current cursor position or +#: set to 0 if there is no cursor, for example, when showing the last +#: command output. + +# scrollback_pager_history_size 0 +scrollback_pager_history_size 10 + +#: Separate scrollback history size (in MB), used only for browsing +#: the scrollback buffer with pager. This separate buffer is not +#: available for interactive scrolling but will be piped to the pager +#: program when viewing scrollback buffer in a separate window. The +#: current implementation stores the data in UTF-8, so approximatively +#: 10000 lines per megabyte at 100 chars per line, for pure ASCII, +#: unformatted text. A value of zero or less disables this feature. +#: The maximum allowed size is 4GB. Note that on config reload if this +#: is changed it will only affect newly created windows, not existing +#: ones. + +# scrollback_fill_enlarged_window no + +#: Fill new space with lines from the scrollback buffer after +#: enlarging a window. + +# wheel_scroll_multiplier 5.0 + +#: Multiplier for the number of lines scrolled by the mouse wheel. +#: Note that this is only used for low precision scrolling devices, +#: not for high precision scrolling devices on platforms such as macOS +#: and Wayland. Use negative numbers to change scroll direction. See +#: also wheel_scroll_min_lines. + +# wheel_scroll_min_lines 1 + +#: The minimum number of lines scrolled by the mouse wheel. The scroll +#: multiplier only takes effect after it +#: reaches this number. Note that this is only used for low precision +#: scrolling devices like wheel mice that scroll by very small amounts +#: when using the wheel. With a negative number, the minimum number of +#: lines will always be added. + +# touch_scroll_multiplier 1.0 + +#: Multiplier for the number of lines scrolled by a touchpad. Note +#: that this is only used for high precision scrolling devices on +#: platforms such as macOS and Wayland. Use negative numbers to change +#: scroll direction. + +#: }}} + +#: Mouse {{{ + +# mouse_hide_wait 3.0 + +#: Hide mouse cursor after the specified number of seconds of the +#: mouse not being used. Set to zero to disable mouse cursor hiding. +#: Set to a negative value to hide the mouse cursor immediately when +#: typing text. Disabled by default on macOS as getting it to work +#: robustly with the ever-changing sea of bugs that is Cocoa is too +#: much effort. + +# url_color #0087bd +# url_style curly + +url_color yellow +url_style dashed + +#: The color and style for highlighting URLs on mouse-over. url_style +#: can be one of: none, straight, double, curly, dotted, dashed. + +# open_url_with default + +#: The program to open clicked URLs. The special value default means +#: to use the operating system's default URL handler (open on macOS +#: and xdg-open on Linux). + +# url_prefixes file ftp ftps gemini git gopher http https irc ircs kitty mailto news sftp ssh + +#: The set of URL prefixes to look for when detecting a URL under the +#: mouse cursor. + +detect_urls yes + +#: Detect URLs under the mouse. Detected URLs are highlighted with an +#: underline and the mouse cursor becomes a hand over them. Even if +#: this option is disabled, URLs are still clickable. + +# url_excluded_characters + +#: Additional characters to be disallowed from URLs, when detecting +#: URLs under the mouse cursor. By default, all characters that are +#: legal in URLs are allowed. + +copy_on_select clipboard + +#: Copy to clipboard or a private buffer on select. With this set to +#: clipboard, selecting text with the mouse will cause the text to be +#: copied to clipboard. Useful on platforms such as macOS that do not +#: have the concept of primary selection. You can instead specify a +#: name such as a1 to copy to a private kitty buffer. Map a shortcut +#: with the paste_from_buffer action to paste from this private +#: buffer. For example:: + +#: copy_on_select a1 +#: map shift+cmd+v paste_from_buffer a1 + +#: Note that copying to the clipboard is a security risk, as all +#: programs, including websites open in your browser can read the +#: contents of the system clipboard. + +# paste_actions quote-urls-at-prompt + +#: A comma separated list of actions to take when pasting text into +#: the terminal. The supported paste actions are: + +#: quote-urls-at-prompt: +#: If the text being pasted is a URL and the cursor is at a shell prompt, +#: automatically quote the URL (needs shell_integration). +#: confirm: +#: Confirm the paste if bracketed paste mode is not active or there is more +#: a large amount of text being pasted. +#: filter: +#: Run the filter_paste() function from the file paste-actions.py in +#: the kitty config directory on the pasted text. The text returned by the +#: function will be actually pasted. + +strip_trailing_spaces smart + +#: Remove spaces at the end of lines when copying to clipboard. A +#: value of smart will do it when using normal selections, but not +#: rectangle selections. A value of always will always do it. + +# select_by_word_characters @-./_~?&=%+# +select_by_word_characters :@-./_~?&=%+# + +#: Characters considered part of a word when double clicking. In +#: addition to these characters any character that is marked as an +#: alphanumeric character in the Unicode database will be matched. + +# select_by_word_characters_forward + +#: Characters considered part of a word when extending the selection +#: forward on double clicking. In addition to these characters any +#: character that is marked as an alphanumeric character in the +#: Unicode database will be matched. + +#: If empty (default) select_by_word_characters will be used for both +#: directions. + +# click_interval -1.0 + +#: The interval between successive clicks to detect double/triple +#: clicks (in seconds). Negative numbers will use the system default +#: instead, if available, or fallback to 0.5. + +# focus_follows_mouse no + +#: Set the active window to the window under the mouse when moving the +#: mouse around. + +# pointer_shape_when_grabbed arrow + +#: The shape of the mouse pointer when the program running in the +#: terminal grabs the mouse. Valid values are: arrow, beam and hand. + +default_pointer_shape beam + +#: The default shape of the mouse pointer. Valid values are: arrow, +#: beam and hand. + +pointer_shape_when_dragging beam + +#: The default shape of the mouse pointer when dragging across text. +#: Valid values are: arrow, beam and hand. + +#: Mouse actions {{{ + +#: Mouse buttons can be mapped to perform arbitrary actions. The +#: syntax is: + +#: .. code-block:: none + +#: mouse_map button-name event-type modes action + +#: Where button-name is one of left, middle, right, b1 ... b8 with +#: added keyboard modifiers. For example: ctrl+shift+left refers to +#: holding the Ctrl+Shift keys while clicking with the left mouse +#: button. The value b1 ... b8 can be used to refer to up to eight +#: buttons on a mouse. + +#: event-type is one of press, release, doublepress, triplepress, +#: click, doubleclick. modes indicates whether the action is performed +#: when the mouse is grabbed by the program running in the terminal, +#: or not. The values are grabbed or ungrabbed or a comma separated +#: combination of them. grabbed refers to when the program running in +#: the terminal has requested mouse events. Note that the click and +#: double click events have a delay of click_interval to disambiguate +#: from double and triple presses. + +#: You can run kitty with the kitty --debug-input command line option +#: to see mouse events. See the builtin actions below to get a sense +#: of what is possible. + +#: If you want to unmap an action, map it to no_op. For example, to +#: disable opening of URLs with a plain click:: + +#: mouse_map left click ungrabbed no_op + +#: See all the mappable actions including mouse actions here +#: . + +#: .. note:: +#: Once a selection is started, releasing the button that started it will +#: automatically end it and no release event will be dispatched. + +# clear_all_mouse_actions no + +#: Remove all mouse action definitions up to this point. Useful, for +#: instance, to remove the default mouse actions. + +#: Click the link under the mouse or move the cursor + +# mouse_map left click ungrabbed mouse_handle_click selection link prompt + +#:: First check for a selection and if one exists do nothing. Then +#:: check for a link under the mouse cursor and if one exists, click +#:: it. Finally check if the click happened at the current shell +#:: prompt and if so, move the cursor to the click location. Note +#:: that this requires shell integration +#:: to work. + +#: Click the link under the mouse or move the cursor even when grabbed + +# mouse_map shift+left click grabbed,ungrabbed mouse_handle_click selection link prompt + +#:: Same as above, except that the action is performed even when the +#:: mouse is grabbed by the program running in the terminal. + +#: Click the link under the mouse cursor + +# mouse_map ctrl+shift+left release grabbed,ungrabbed mouse_handle_click link + +#:: Variant with Ctrl+Shift is present because the simple click based +#:: version has an unavoidable delay of click_interval, to +#:: disambiguate clicks from double clicks. + +#: Discard press event for link click + +# mouse_map ctrl+shift+left press grabbed discard_event + +#:: Prevent this press event from being sent to the program that has +#:: grabbed the mouse, as the corresponding release event is used to +#:: open a URL. + +#: Paste from the primary selection + +# mouse_map middle release ungrabbed paste_from_selection + +#: Start selecting text + +# mouse_map left press ungrabbed mouse_selection normal + +#: Start selecting text in a rectangle + +# mouse_map ctrl+alt+left press ungrabbed mouse_selection rectangle + +#: Select a word + +# mouse_map left doublepress ungrabbed mouse_selection word + +#: Select a line + +# mouse_map left triplepress ungrabbed mouse_selection line + +#: Select line from point + +# mouse_map ctrl+alt+left triplepress ungrabbed mouse_selection line_from_point + +#:: Select from the clicked point to the end of the line. + +#: Extend the current selection + +# mouse_map right press ungrabbed mouse_selection extend + +#:: If you want only the end of the selection to be moved instead of +#:: the nearest boundary, use move-end instead of extend. + +#: Paste from the primary selection even when grabbed + +# mouse_map shift+middle release ungrabbed,grabbed paste_selection +# mouse_map shift+middle press grabbed discard_event + +#: Start selecting text even when grabbed + +# mouse_map shift+left press ungrabbed,grabbed mouse_selection normal + +#: Start selecting text in a rectangle even when grabbed + +# mouse_map ctrl+shift+alt+left press ungrabbed,grabbed mouse_selection rectangle + +#: Select a word even when grabbed + +# mouse_map shift+left doublepress ungrabbed,grabbed mouse_selection word + +#: Select a line even when grabbed + +# mouse_map shift+left triplepress ungrabbed,grabbed mouse_selection line + +#: Select line from point even when grabbed + +# mouse_map ctrl+shift+alt+left triplepress ungrabbed,grabbed mouse_selection line_from_point + +#:: Select from the clicked point to the end of the line even when +#:: grabbed. + +#: Extend the current selection even when grabbed + +# mouse_map shift+right press ungrabbed,grabbed mouse_selection extend + +#: Show clicked command output in pager + +# mouse_map ctrl+shift+right press ungrabbed mouse_show_command_output + +#:: Requires shell integration +#:: to work. + +#: }}} + +#: }}} + +#: Performance tuning {{{ + +# repaint_delay 10 + +#: Delay between screen updates (in milliseconds). Decreasing it, +#: increases frames-per-second (FPS) at the cost of more CPU usage. +#: The default value yields ~100 FPS which is more than sufficient for +#: most uses. Note that to actually achieve 100 FPS, you have to +#: either set sync_to_monitor to no or use a monitor with a high +#: refresh rate. Also, to minimize latency when there is pending input +#: to be processed, this option is ignored. + +# input_delay 3 + +#: Delay before input from the program running in the terminal is +#: processed (in milliseconds). Note that decreasing it will increase +#: responsiveness, but also increase CPU usage and might cause flicker +#: in full screen programs that redraw the entire screen on each loop, +#: because kitty is so fast that partial screen updates will be drawn. + +# sync_to_monitor yes + +#: Sync screen updates to the refresh rate of the monitor. This +#: prevents screen tearing +#: when scrolling. +#: However, it limits the rendering speed to the refresh rate of your +#: monitor. With a very high speed mouse/high keyboard repeat rate, +#: you may notice some slight input latency. If so, set this to no. + +#: }}} + +#: Terminal bell {{{ + +# enable_audio_bell yes + +#: The audio bell. Useful to disable it in environments that require +#: silence. + +# visual_bell_duration 0.0 + +#: The visual bell duration (in seconds). Flash the screen when a bell +#: occurs for the specified number of seconds. Set to zero to disable. + +# visual_bell_color none + +#: The color used by visual bell. Set to none will fall back to +#: selection background color. If you feel that the visual bell is too +#: bright, you can set it to a darker color. + +# window_alert_on_bell yes + +#: Request window attention on bell. Makes the dock icon bounce on +#: macOS or the taskbar flash on linux. + +# bell_on_tab "🔔 " + +#: Some text or a Unicode symbol to show on the tab if a window in the +#: tab that does not have focus has a bell. If you want to use leading +#: or trailing spaces, surround the text with quotes. See +#: tab_title_template for how this is rendered. + +#: For backwards compatibility, values of yes, y and true are +#: converted to the default bell symbol and no, n, false and none are +#: converted to the empty string. + +# command_on_bell none + +#: Program to run when a bell occurs. The environment variable +#: KITTY_CHILD_CMDLINE can be used to get the program running in the +#: window in which the bell occurred. + +# bell_path none + +#: Path to a sound file to play as the bell sound. If set to none, the +#: system default bell sound is used. Must be in a format supported by +#: the operating systems sound API, such as WAV or OGA on Linux +#: (libcanberra) or AIFF, MP3 or WAV on macOS (NSSound) + +#: }}} + +#: Window layout {{{ + +remember_window_size yes +# initial_window_width 640 +# initial_window_height 400 + +#: If enabled, the window size will be remembered so that new +#: instances of kitty will have the same size as the previous +#: instance. If disabled, the window will initially have size +#: configured by initial_window_width/height, in pixels. You can use a +#: suffix of "c" on the width/height values to have them interpreted +#: as number of cells instead of pixels. + +# enabled_layouts * +enabled_layouts tall + +#: The enabled window layouts. A comma separated list of layout names. +#: The special value all means all layouts. The first listed layout +#: will be used as the startup layout. Default configuration is all +#: layouts in alphabetical order. For a list of available layouts, see +#: the layouts . + +# window_resize_step_cells 2 +# window_resize_step_lines 2 + +#: The step size (in units of cell width/cell height) to use when +#: resizing kitty windows in a layout with the shortcut +#: start_resizing_window. The cells value is used for horizontal +#: resizing, and the lines value is used for vertical resizing. + +window_border_width 1px + +#: The width of window borders. Can be either in pixels (px) or pts +#: (pt). Values in pts will be rounded to the nearest number of pixels +#: based on screen resolution. If not specified, the unit is assumed +#: to be pts. Note that borders are displayed only when more than one +#: window is visible. They are meant to separate multiple windows. + +draw_minimal_borders yes + +#: Draw only the minimum borders needed. This means that only the +#: borders that separate the inactive window from a neighbor are +#: drawn. Note that setting a non-zero window_margin_width overrides +#: this and causes all borders to be drawn. + +window_margin_width 0 + +#: The window margin (in pts) (blank area outside the border). A +#: single value sets all four sides. Two values set the vertical and +#: horizontal sides. Three values set top, horizontal and bottom. Four +#: values set top, right, bottom and left. + +# single_window_margin_width -1 + +#: The window margin to use when only a single window is visible (in +#: pts). Negative values will cause the value of window_margin_width +#: to be used instead. A single value sets all four sides. Two values +#: set the vertical and horizontal sides. Three values set top, +#: horizontal and bottom. Four values set top, right, bottom and left. + +# window_padding_width 0 +window_padding_width 0 7 0 7 + +#: The window padding (in pts) (blank area between the text and the +#: window border). A single value sets all four sides. Two values set +#: the vertical and horizontal sides. Three values set top, horizontal +#: and bottom. Four values set top, right, bottom and left. + +placement_strategy center + +#: When the window size is not an exact multiple of the cell size, the +#: cell area of the terminal window will have some extra padding on +#: the sides. You can control how that padding is distributed with +#: this option. Using a value of center means the cell area will be +#: placed centrally. A value of top-left means the padding will be +#: only at the bottom and right edges. + +# active_border_color #00ff00 + +#: The color for the border of the active window. Set this to none to +#: not draw borders around the active window. + +# inactive_border_color #cccccc + +#: The color for the border of inactive windows. + +# bell_border_color #ff5a00 + +#: The color for the border of inactive windows in which a bell has +#: occurred. + +# inactive_text_alpha 1.0 + +#: Fade the text in inactive windows by the specified amount (a number +#: between zero and one, with zero being fully faded). + +# Set to yes then window title is not displayed +hide_window_decorations no + +#: Hide the window decorations (title-bar and window borders) with +#: yes. On macOS, titlebar-only can be used to only hide the titlebar. +#: Whether this works and exactly what effect it has depends on the +#: window manager/operating system. Note that the effects of changing +#: this option when reloading config are undefined. + +# window_logo_path none + +#: Path to a logo image. Must be in PNG format. Relative paths are +#: interpreted relative to the kitty config directory. The logo is +#: displayed in a corner of every kitty window. The position is +#: controlled by window_logo_position. Individual windows can be +#: configured to have different logos either using the launch action +#: or the remote control facility. + +# window_logo_position bottom-right + +#: Where to position the window logo in the window. The value can be +#: one of: top-left, top, top-right, left, center, right, bottom-left, +#: bottom, bottom-right. + +# window_logo_alpha 0.5 + +#: The amount the logo should be faded into the background. With zero +#: being fully faded and one being fully opaque. + +# resize_debounce_time 0.1 + +#: The time to wait before redrawing the screen when a resize event is +#: received (in seconds). On platforms such as macOS, where the +#: operating system sends events corresponding to the start and end of +#: a resize, this number is ignored. + +# resize_draw_strategy static + +#: Choose how kitty draws a window while a resize is in progress. A +#: value of static means draw the current window contents, mostly +#: unchanged. A value of scale means draw the current window contents +#: scaled. A value of blank means draw a blank window. A value of size +#: means show the window size in cells. + +# resize_in_steps no + +#: Resize the OS window in steps as large as the cells, instead of +#: with the usual pixel accuracy. Combined with initial_window_width +#: and initial_window_height in number of cells, this option can be +#: used to keep the margins as small as possible when resizing the OS +#: window. Note that this does not currently work on Wayland. + +visual_window_select_characters 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ + +#: The list of characters for visual window selection. For example, +#: for selecting a window to focus on with focus_visible_window. The +#: value should be a series of unique numbers or alphabets, case +#: insensitive, from the set [0-9A-Z]. Specify your preference as a +#: string of characters. + +# confirm_os_window_close -1 + +#: Ask for confirmation when closing an OS window or a tab with at +#: least this number of kitty windows in it by window manager (e.g. +#: clicking the window close button or pressing the operating system +#: shortcut to close windows) or by the close_tab action. A value of +#: zero disables confirmation. This confirmation also applies to +#: requests to quit the entire application (all OS windows, via the +#: quit action). Negative values are converted to positive ones, +#: however, with shell_integration enabled, using negative values +#: means windows sitting at a shell prompt are not counted, only +#: windows where some command is currently running. Note that if you +#: want confirmation when closing individual windows, you can map the +#: close_window_with_confirmation action. + +#: }}} + +#: Tab bar {{{ + +tab_bar_edge bottom + +#: The edge to show the tab bar on, top or bottom. + +# tab_bar_margin_width 0.0 + +#: The margin to the left and right of the tab bar (in pts). + +# tab_bar_margin_height 0.0 0.0 + +#: The margin above and below the tab bar (in pts). The first number +#: is the margin between the edge of the OS Window and the tab bar. +#: The second number is the margin between the tab bar and the +#: contents of the current tab. + +tab_bar_style powerline + +#: The tab bar style, can be one of: + +#: fade +#: Each tab's edges fade into the background color. (See also tab_fade) +#: slant +#: Tabs look like the tabs in a physical file. +#: separator +#: Tabs are separated by a configurable separator. (See also +#: tab_separator) +#: powerline +#: Tabs are shown as a continuous line with "fancy" separators. +#: (See also tab_powerline_style) +#: custom +#: A user-supplied Python function called draw_tab is loaded from the file +#: tab_bar.py in the kitty config directory. For examples of how to +#: write such a function, see the functions named draw_tab_with_* in +#: kitty's source code: kitty/tab_bar.py. See also +#: this discussion https://github.com/kovidgoyal/kitty/discussions/4447 +#: for examples from kitty users. +#: hidden +#: The tab bar is hidden. If you use this, you might want to create a mapping +#: for the select_tab action which presents you with a list of tabs and +#: allows for easy switching to a tab. + +# tab_bar_align left + +#: The horizontal alignment of the tab bar, can be one of: left, +#: center, right. + +# tab_bar_min_tabs 2 + +#: The minimum number of tabs that must exist before the tab bar is +#: shown. + +# tab_switch_strategy previous + +#: The algorithm to use when switching to a tab when the current tab +#: is closed. The default of previous will switch to the last used +#: tab. A value of left will switch to the tab to the left of the +#: closed tab. A value of right will switch to the tab to the right of +#: the closed tab. A value of last will switch to the right-most tab. + +# tab_fade 0.25 0.5 0.75 1 + +#: Control how each tab fades into the background when using fade for +#: the tab_bar_style. Each number is an alpha (between zero and one) +#: that controls how much the corresponding cell fades into the +#: background, with zero being no fade and one being full fade. You +#: can change the number of cells used by adding/removing entries to +#: this list. + +# tab_separator " ┇" + +#: The separator between tabs in the tab bar when using separator as +#: the tab_bar_style. + +tab_powerline_style slanted + +#: The powerline separator style between tabs in the tab bar when +#: using powerline as the tab_bar_style, can be one of: angled, +#: slanted, round. + +# tab_activity_symbol none + +#: Some text or a Unicode symbol to show on the tab if a window in the +#: tab that does not have focus has some activity. If you want to use +#: leading or trailing spaces, surround the text with quotes. See +#: tab_title_template for how this is rendered. + +# tab_title_template "{fmt.fg.red}{bell_symbol}{activity_symbol}{fmt.fg.tab}{title}" +# tab_title_template "{fmt.fg.cyan}{index}:{fmt.fg.red}{bell_symbol}{activity_symbol}{fmt.fg.tab}{title}" +# Show short path in tab title +tab_title_template "{bell_symbol}{fmt.fg.cyan}[{index}] {activity_symbol}{fmt.fg.tab}{title[title.rfind('/')+1:]}" + +#: A template to render the tab title. The default just renders the +#: title with optional symbols for bell and activity. If you wish to +#: include the tab-index as well, use something like: {index}:{title}. +#: Useful if you have shortcuts mapped for goto_tab N. If you prefer +#: to see the index as a superscript, use {sup.index}. In addition you +#: can use {layout_name} for the current layout name, {num_windows} +#: for the number of windows in the tab and {num_window_groups} for +#: the number of window groups (not counting overlay windows) in the +#: tab. Note that formatting is done by Python's string formatting +#: machinery, so you can use, for instance, {layout_name[:2].upper()} +#: to show only the first two letters of the layout name, upper-cased. +#: If you want to style the text, you can use styling directives, for +#: example: +#: `{fmt.fg.red}red{fmt.fg.tab}normal{fmt.bg._00FF00}greenbg{fmt.bg.tab}`. +#: Similarly, for bold and italic: +#: `{fmt.bold}bold{fmt.nobold}normal{fmt.italic}italic{fmt.noitalic}`. +#: Note that for backward compatibility, if {bell_symbol} or +#: {activity_symbol} are not present in the template, they are +#: prepended to it. + +# active_tab_title_template none +active_tab_title_template "{bell_symbol}{fmt.fg.white}[{index}] {activity_symbol}{fmt.fg.tab}{title[title.rfind('/')+1:]}" + +#: Template to use for active tabs. If not specified falls back to +#: tab_title_template. + +active_tab_foreground #eee8d5 +active_tab_background #586e75 +active_tab_font_style normal + +inactive_tab_foreground #586e75 +inactive_tab_background #073642 +inactive_tab_font_style normal + +#: Tab bar colors and styles. + +tab_bar_background none + +#: Background color for the tab bar. Defaults to using the terminal +#: background color. + +tab_bar_margin_color none + +#: Color for the tab bar margin area. Defaults to using the terminal +#: background color. + +#: }}} + +#: Color scheme {{{ + +# foreground #dddddd +# background #000000 + +#: The foreground and background colors. + +# background_opacity 1.0 + +#: The opacity of the background. A number between zero and one, where +#: one is opaque and zero is fully transparent. This will only work if +#: supported by the OS (for instance, when using a compositor under +#: X11). Note that it only sets the background color's opacity in +#: cells that have the same background color as the default terminal +#: background, so that things like the status bar in vim, powerline +#: prompts, etc. still look good. But it means that if you use a color +#: theme with a background color in your editor, it will not be +#: rendered as transparent. Instead you should change the default +#: background color in your kitty config and not use a background +#: color in the editor color scheme. Or use the escape codes to set +#: the terminals default colors in a shell script to launch your +#: editor. Be aware that using a value less than 1.0 is a (possibly +#: significant) performance hit. If you want to dynamically change +#: transparency of windows, set dynamic_background_opacity to yes +#: (this is off by default as it has a performance cost). Changing +#: this option when reloading the config will only work if +#: dynamic_background_opacity was enabled in the original config. + +# background_image none + +#: Path to a background image. Must be in PNG format. + +# background_image_layout tiled + +#: Whether to tile, scale or clamp the background image. The value can +#: be one of tiled, mirror-tiled, scaled, clamped. + +# background_image_linear no + +#: When background image is scaled, whether linear interpolation +#: should be used. + +# dynamic_background_opacity no + +#: Allow changing of the background_opacity dynamically, using either +#: keyboard shortcuts (increase_background_opacity and +#: decrease_background_opacity) or the remote control facility. +#: Changing this option by reloading the config is not supported. + +# background_tint 0.0 + +#: How much to tint the background image by the background color. The +#: tint is applied only under the text area, not margin/borders. This +#: option makes it easier to read the text. Tinting is done using the +#: current background color for each window. This option applies only +#: if background_opacity is set and transparent windows are supported +#: or background_image is set. + +# dim_opacity 0.75 + +#: How much to dim text that has the DIM/FAINT attribute set. One +#: means no dimming and zero means fully dimmed (i.e. invisible). + +# selection_foreground #000000 +# selection_background #fffacd + +#: The foreground and background colors for text selected with the +#: mouse. Setting both of these to none will cause a "reverse video" +#: effect for selections, where the selection will be the cell text +#: color and the text will become the cell background color. Setting +#: only selection_foreground to none will cause the foreground color +#: to be used unchanged. Note that these colors can be overridden by +#: the program running in the terminal. + +#: The color table {{{ + +# macOS dark background +# background #24221c + +# kde breeze dark background +# background #2A2E32 + +# Custom Solarized Dark +background #002b36 +foreground #9bc1c2 +cursor #93a1a1 +selection_background #657b83 +# black +color0 #586e75 +color8 #006388 +# red +color1 #d01b24 +color9 #f4153b +# green +color2 #6bbe6c +color10 #50ee84 +# yellow +color3 #a57705 +color11 #b17e28 +# blue +color4 #2075c7 +color12 #178dc7 +# magenta +color5 #c61b6e +color13 #e14d8e +# cyan +color6 #259185 +color14 #00b29e +# white +color7 #e9e2cb +color15 #fcf4dc +selection_foreground #001e26 + +mark1_foreground yellow +mark1_background black +mark2_foreground yellow +mark2_background black +mark3_foreground yellow +mark3_background black + +# Solarized Dark High Contrast +# background #001e26 +# foreground #9bc1c2 +# cursor #f34a00 +# selection_background #003747 +# color0 #002731 +# color8 #006388 +# color1 #d01b24 +# color9 #f4153b +# color2 #6bbe6c +# color10 #50ee84 +# color3 #a57705 +# color11 #b17e28 +# color4 #2075c7 +# color12 #178dc7 +# color5 #c61b6e +# color13 #e14d8e +# color6 #259185 +# color14 #00b29e +# color7 #e9e2cb +# color15 #fcf4dc +# selection_foreground #001e26 + +# Solarized Dark Patched +# background #001e26 +# foreground #708183 +# cursor #708183 +# selection_background #002731 +# color0 #002731 +# color8 #465a61 +# color1 #d01b24 +# color9 #bd3612 +# color2 #728905 +# color10 #465a61 +# color3 #a57705 +# color11 #52676f +# color4 #2075c7 +# color12 #708183 +# color5 #c61b6e +# color13 #5856b9 +# color6 #259185 +# color14 #81908f +# color7 #e9e2cb +# color15 #fcf4dc +# selection_foreground #001e26 + +#: The 256 terminal colors. There are 8 basic colors, each color has a +#: dull and bright version, for the first 16 colors. You can set the +#: remaining 240 colors as color16 to color255. + +# color0 #000000 +# color8 #767676 + +#: black + +# color1 #cc0403 +# color9 #f2201f + +#: red + +# color2 #19cb00 +# color10 #23fd00 + +#: green + +# color3 #cecb00 +# color11 #fffd00 + +#: yellow + +# color4 #0d73cc +# color12 #1a8fff + +#: blue + +# color5 #cb1ed1 +# color13 #fd28ff + +#: magenta + +# color6 #0dcdcd +# color14 #14ffff + +#: cyan + +# color7 #dddddd +# color15 #ffffff + +#: white + +# mark1_foreground black + +#: Color for marks of type 1 + +# mark1_background #98d3cb + +#: Color for marks of type 1 (light steel blue) + +# mark2_foreground black + +#: Color for marks of type 2 + +# mark2_background #f2dcd3 + +#: Color for marks of type 1 (beige) + +# mark3_foreground black + +#: Color for marks of type 3 + +# mark3_background #f274bc + +#: Color for marks of type 3 (violet) + +#: }}} + +#: }}} + +#: Advanced {{{ + +# shell . + +#: The shell program to execute. The default value of . means to use +#: whatever shell is set as the default shell for the current user. +#: Note that on macOS if you change this, you might need to add +#: --login and --interactive to ensure that the shell starts in +#: interactive mode and reads its startup rc files. + +# editor . + +#: The terminal based text editor (such as vim or nano) to use when +#: editing the kitty config file or similar tasks. + +#: The default value of . means to use the environment variables +#: VISUAL and EDITOR in that order. If these variables aren't set, +#: kitty will run your shell ($SHELL -l -i -c env) to see if your +#: shell startup rc files set VISUAL or EDITOR. If that doesn't work, +#: kitty will cycle through various known editors (vim, emacs, etc.) +#: and take the first one that exists on your system. + +# close_on_child_death no + +#: Close the window when the child process (shell) exits. With the +#: default value no, the terminal will remain open when the child +#: exits as long as there are still processes outputting to the +#: terminal (for example disowned or backgrounded processes). When +#: enabled with yes, the window will close as soon as the child +#: process exits. Note that setting it to yes means that any +#: background processes still using the terminal can fail silently +#: because their stdout/stderr/stdin no longer work. + +# allow_remote_control no + +#: Allow other programs to control kitty. If you turn this on, other +#: programs can control all aspects of kitty, including sending text +#: to kitty windows, opening new windows, closing windows, reading the +#: content of windows, etc. Note that this even works over SSH +#: connections. You can choose to either allow any program running +#: within kitty to control it with yes, or only allow programs that +#: connect to the socket (specified with the listen_on config option +#: or kitty --listen-on command line option) with the value socket- +#: only. The latter is useful if you want to prevent programs running +#: on a remote computer over SSH from controlling kitty. Reloading the +#: config will not affect this option. + +# listen_on none + +#: Listen to the specified UNIX socket for remote control connections. +#: Note that this will apply to all kitty instances. It can be +#: overridden by the kitty --listen-on command line option, which +#: supports listening on TCP socket. This option accepts only UNIX +#: sockets, such as unix:${TEMP}/mykitty or unix:@mykitty (on Linux). +#: Environment variables are expanded and relative paths are resolved +#: with respect to the temporary directory. If {kitty_pid} is present, +#: then it is replaced by the PID of the kitty process, otherwise the +#: PID of the kitty process is appended to the value, with a hyphen. +#: This option is ignored unless you also set allow_remote_control to +#: enable remote control. See the help for kitty --listen-on for more +#: details. Changing this option by reloading the config is not +#: supported. + +# env + +#: Specify the environment variables to be set in all child processes. +#: Using the name with an equal sign (e.g. env VAR=) will set it to +#: the empty string. Specifying only the name (e.g. env VAR) will +#: remove the variable from the child process' environment. Note that +#: environment variables are expanded recursively, for example:: + +#: env VAR1=a +#: env VAR2=${HOME}/${VAR1}/b + +#: The value of VAR2 will be /a/b. + +env LANG=en_US.UTF-8 + +# watcher + +#: Path to python file which will be loaded for watchers +#: . Can be +#: specified more than once to load multiple watchers. The watchers +#: will be added to every kitty window. Relative paths are resolved +#: relative to the kitty config directory. Note that reloading the +#: config will only affect windows created after the reload. + +# exe_search_path + +#: Control where kitty finds the programs to run. The default search +#: order is: First search the system wide PATH, then ~/.local/bin and +#: ~/bin. If still not found, the PATH defined in the login shell +#: after sourcing all its startup files is tried. Finally, if present, +#: the PATH specified by the env option is tried. + +#: This option allows you to prepend, append, or remove paths from +#: this search order. It can be specified multiple times for multiple +#: paths. A simple path will be prepended to the search order. A path +#: that starts with the + sign will be append to the search order, +#: after ~/bin above. A path that starts with the - sign will be +#: removed from the entire search order. For example:: + +#: exe_search_path /some/prepended/path +#: exe_search_path +/some/appended/path +#: exe_search_path -/some/excluded/path + +# update_check_interval 24 + +#: The interval to periodically check if an update to kitty is +#: available (in hours). If an update is found, a system notification +#: is displayed informing you of the available update. The default is +#: to check every 24 hours, set to zero to disable. Update checking is +#: only done by the official binary builds. Distro packages or source +#: builds do not do update checking. Changing this option by reloading +#: the config is not supported. + +# startup_session none + +#: Path to a session file to use for all kitty instances. Can be +#: overridden by using the kitty --session command line option for +#: individual instances. See sessions +#: in the +#: kitty documentation for details. Note that relative paths are +#: interpreted with respect to the kitty config directory. Environment +#: variables in the path are expanded. Changing this option by +#: reloading the config is not supported. + +# clipboard_control write-clipboard write-primary read-clipboard-ask read-primary-ask +clipboard_control write-clipboard write-primary read-clipboard-ask read-primary-ask + +#: Allow programs running in kitty to read and write from the +#: clipboard. You can control exactly which actions are allowed. The +#: possible actions are: write-clipboard, read-clipboard, write- +#: primary, read-primary, read-clipboard-ask, read-primary-ask. The +#: default is to allow writing to the clipboard and primary selection +#: and to ask for permission when a program tries to read from the +#: clipboard. Note that disabling the read confirmation is a security +#: risk as it means that any program, even the ones running on a +#: remote server via SSH can read your clipboard. See also +#: clipboard_max_size. + +# clipboard_max_size 64 +clipboard_max_size 64 + +#: The maximum size (in MB) of data from programs running in kitty +#: that will be stored for writing to the system clipboard. A value of +#: zero means no size limit is applied. See also clipboard_control. + +# file_transfer_confirmation_bypass + +#: The password that can be supplied to the file transfer kitten +#: to skip the +#: transfer confirmation prompt. This should only be used when +#: initiating transfers from trusted computers, over trusted networks +#: or encrypted transports, as it allows any programs running on the +#: remote machine to read/write to the local filesystem, without +#: permission. + +allow_hyperlinks yes + +#: Process hyperlink escape sequences (OSC 8). If disabled OSC 8 +#: escape sequences are ignored. Otherwise they become clickable +#: links, that you can click with the mouse or by using the hints +#: kitten . The +#: special value of ask means that kitty will ask before opening the +#: link when clicked. + +shell_integration no-cursor + +#: Enable shell integration on supported shells. This enables features +#: such as jumping to previous prompts, browsing the output of the +#: previous command in a pager, etc. on supported shells. Set to +#: disabled to turn off shell integration, completely. It is also +#: possible to disable individual features, set to a space separated +#: list of these values: no-rc, no-cursor, no-title, no-cwd, no- +#: prompt-mark, no-complete. See Shell integration +#: for details. + +# allow_cloning ask + +#: Control whether programs running in the terminal can request new +#: windows to be created. The canonical example is clone-in-kitty +#: . +#: By default, kitty will ask for permission for each clone request. +#: Allowing cloning unconditionally gives programs running in the +#: terminal (including over SSH) permission to execute arbitrary code, +#: as the user who is running the terminal, on the computer that the +#: terminal is running on. + +# clone_source_strategies venv,conda,env_var,path + +#: Control what shell code is sourced when running clone-in-kitty in +#: the newly cloned window. The supported strategies are: + +#: venv +#: Source the file $VIRTUAL_ENV/bin/activate. This is used by the +#: Python stdlib venv module and allows cloning venvs automatically. +#: conda +#: Run conda activate $CONDA_DEFAULT_ENV. This supports the virtual +#: environments created by conda. +#: env_var +#: Execute the contents of the environment variable +#: KITTY_CLONE_SOURCE_CODE with eval. +#: path +#: Source the file pointed to by the environment variable +#: KITTY_CLONE_SOURCE_PATH. + +#: This option must be a comma separated list of the above values. +#: This only source the first valid one in the above order. + +# term xterm-kitty + +# NOTE: Enable ssh login for old tmux +term xterm-256color + +#: The value of the TERM environment variable to set. Changing this +#: can break many terminal programs, only change it if you know what +#: you are doing, not because you read some advice on "Stack Overflow" +#: to change it. The TERM variable is used by various programs to get +#: information about the capabilities and behavior of the terminal. If +#: you change it, depending on what programs you run, and how +#: different the terminal you are changing it to is, various things +#: from key-presses, to colors, to various advanced features may not +#: work. Changing this option by reloading the config will only affect +#: newly created windows. + +#: }}} + +#: OS specific tweaks {{{ + +# wayland_titlebar_color system + +#: The color of the kitty window's titlebar on Wayland systems with +#: client side window decorations such as GNOME. A value of system +#: means to use the default system color, a value of background means +#: to use the background color of the currently active window and +#: finally you can use an arbitrary color, such as #12af59 or red. + +macos_titlebar_color dark + +#: The color of the kitty window's titlebar on macOS. A value of +#: system means to use the default system color, light or dark can +#: also be used to set it explicitly. A value of background means to +#: use the background color of the currently active window and finally +#: you can use an arbitrary color, such as #12af59 or red. WARNING: +#: This option works by using a hack when arbitrary color (or +#: background) is configured, as there is no proper Cocoa API for it. +#: It sets the background color of the entire window and makes the +#: titlebar transparent. As such it is incompatible with +#: background_opacity. If you want to use both, you are probably +#: better off just hiding the titlebar with hide_window_decorations. + +# macos_option_as_alt no + +#: Use the Option key as an Alt key on macOS. With this set to no, +#: kitty will use the macOS native Option+Key to enter Unicode +#: character behavior. This will break any Alt+Key keyboard shortcuts +#: in your terminal programs, but you can use the macOS Unicode input +#: technique. You can use the values: left, right or both to use only +#: the left, right or both Option keys as Alt, instead. Note that +#: kitty itself always treats Option the same as Alt. This means you +#: cannot use this option to configure different kitty shortcuts for +#: Option+Key vs. Alt+Key. Also, any kitty shortcuts using +#: Option/Alt+Key will take priority, so that any such key presses +#: will not be passed to terminal programs running inside kitty. +#: Changing this option by reloading the config is not supported. + +# macos_hide_from_tasks no + +#: Hide the kitty window from running tasks on macOS (⌘+Tab and the +#: Dock). Changing this option by reloading the config is not +#: supported. + +macos_quit_when_last_window_closed yes + +#: Have kitty quit when all the top-level windows are closed on macOS. +#: By default, kitty will stay running, even with no open windows, as +#: is the expected behavior on macOS. + +# macos_window_resizable yes + +#: Disable this if you want kitty top-level OS windows to not be +#: resizable on macOS. Changing this option by reloading the config +#: will only affect newly created OS windows. + +# macos_thicken_font 0 + +#: Draw an extra border around the font with the given width, to +#: increase legibility at small font sizes on macOS. For example, a +#: value of 0.75 will result in rendering that looks similar to sub- +#: pixel antialiasing at common font sizes. + +macos_traditional_fullscreen no + +#: Use the macOS traditional full-screen transition, that is faster, +#: but less pretty. + +# macos_show_window_title_in all + +#: Control where the window title is displayed on macOS. A value of +#: window will show the title of the currently active window at the +#: top of the macOS window. A value of menubar will show the title of +#: the currently active window in the macOS global menu bar, making +#: use of otherwise wasted space. A value of all will show the title +#: in both places, and none hides the title. See +#: macos_menubar_title_max_length for how to control the length of the +#: title in the menu bar. + +# macos_menubar_title_max_length 0 + +#: The maximum number of characters from the window title to show in +#: the macOS global menu bar. Values less than one means that there is +#: no maximum limit. + +# macos_custom_beam_cursor no + +#: Use a custom mouse cursor for macOS that is easier to see on both +#: light and dark backgrounds. Nowadays, the default macOS cursor +#: already comes with a white border. WARNING: this might make your +#: mouse cursor invisible on dual GPU machines. Changing this option +#: by reloading the config is not supported. + +# macos_colorspace srgb + +#: The colorspace in which to interpret terminal colors. The default +#: of srgb will cause colors to match those seen in web browsers. The +#: value of default will use whatever the native colorspace of the +#: display is. The value of displayp3 will use Apple's special +#: snowflake display P3 color space, which will result in over +#: saturated (brighter) colors with some color shift. Reloading +#: configuration will change this value only for newly created OS +#: windows. + +# linux_display_server auto + +#: Choose between Wayland and X11 backends. By default, an appropriate +#: backend based on the system state is chosen automatically. Set it +#: to x11 or wayland to force the choice. Changing this option by +#: reloading the config is not supported. + +#: }}} + +#: Keyboard shortcuts {{{ + +#: Keys are identified simply by their lowercase Unicode characters. +#: For example: a for the A key, [ for the left square bracket key, +#: etc. For functional keys, such as Enter or Escape, the names are +#: present at Functional key definitions +#: . For modifier keys, the names are ctrl (control, ⌃), +#: shift (⇧), alt (opt, option, ⌥), super (cmd, command, ⌘). See also: +#: GLFW mods + +#: On Linux you can also use XKB key names to bind keys that are not +#: supported by GLFW. See XKB keys +#: for a list of key names. The name to use is the part +#: after the XKB_KEY_ prefix. Note that you can only use an XKB key +#: name for keys that are not known as GLFW keys. + +#: Finally, you can use raw system key codes to map keys, again only +#: for keys that are not known as GLFW keys. To see the system key +#: code for a key, start kitty with the kitty --debug-input option, +#: kitty will output some debug text for every key event. In that text +#: look for native_code, the value of that becomes the key name in the +#: shortcut. For example: + +#: .. code-block:: none + +#: on_key_input: glfw key: 0x61 native_code: 0x61 action: PRESS mods: none text: 'a' + +#: Here, the key name for the A key is 0x61 and you can use it with:: + +#: map ctrl+0x61 something + +#: to map Ctrl+A to something. + +#: You can use the special action no_op to unmap a keyboard shortcut +#: that is assigned in the default configuration:: + +#: map kitty_mod+space no_op + +#: If you would like kitty to completely ignore a key event, not even +#: sending it to the program running in the terminal, map it to +#: discard_event:: + +#: map kitty_mod+f1 discard_event + +#: You can combine multiple actions to be triggered by a single +#: shortcut with combine action, using the syntax below:: + +#: map key combine action1 action2 action3 ... + +#: For example:: + +#: map kitty_mod+e combine : new_window : next_layout + +#: This will create a new window and switch to the next available +#: layout. + +#: You can use multi-key shortcuts with the syntax shown below:: + +#: map key1>key2>key3 action + +#: For example:: + +#: map ctrl+f>2 set_font_size 20 + +#: The full list of actions that can be mapped to key presses is +#: available here . + +# kitty_mod ctrl+shift +kitty_mod ctrl+shift + +#: Special modifier key alias for default shortcuts. You can change +#: the value of this option to alter all default shortcuts that use +#: kitty_mod. + +# clear_all_shortcuts no + +#: Remove all shortcut definitions up to this point. Useful, for +#: instance, to remove the default shortcuts. + +# action_alias + +#: E.g. action_alias launch_tab launch --type=tab --cwd=current + +#: Define action aliases to avoid repeating the same options in +#: multiple mappings. Aliases can be defined for any action and will +#: be expanded recursively. For example, the above alias allows you to +#: create mappings to launch a new tab in the current working +#: directory without duplication:: + +#: map f1 launch_tab vim +#: map f2 launch_tab emacs + +#: Similarly, to alias kitten invocation:: + +#: action_alias hints kitten hints --hints-offset=0 + +# kitten_alias + +#: E.g. kitten_alias hints hints --hints-offset=0 + +#: Like action_alias above, but specifically for kittens. Generally, +#: prefer to use action_alias. This option is a legacy version, +#: present for backwards compatibility. It causes all invocations of +#: the aliased kitten to be substituted. So the example above will +#: cause all invocations of the hints kitten to have the --hints- +#: offset=0 option applied. + +#: Clipboard {{{ + +#: Copy to clipboard + +# map kitty_mod+c copy_to_clipboard +# map cmd+c copy_to_clipboard + +#:: There is also a copy_or_interrupt action that can be optionally +#:: mapped to Ctrl+C. It will copy only if there is a selection and +#:: send an interrupt otherwise. Similarly, +#:: copy_and_clear_or_interrupt will copy and clear the selection or +#:: send an interrupt if there is no selection. + +#: Paste from clipboard + +# map kitty_mod+v paste_from_clipboard +# map cmd+v paste_from_clipboard + +#: Paste from selection + +# map kitty_mod+s paste_from_selection +# map shift+insert paste_from_selection + +#: Pass selection to program + +# map kitty_mod+o pass_selection_to_program + +#:: You can also pass the contents of the current selection to any +#:: program with pass_selection_to_program. By default, the system's +#:: open program is used, but you can specify your own, the selection +#:: will be passed as a command line argument to the program. For +#:: example:: + +#:: map kitty_mod+o pass_selection_to_program firefox + +#:: You can pass the current selection to a terminal program running +#:: in a new kitty window, by using the @selection placeholder:: + +#:: map kitty_mod+y new_window less @selection + +#: }}} + +#: Scrolling {{{ + +#: Scroll line up + +# map kitty_mod+up scroll_line_up +# map kitty_mod+k scroll_line_up +# map opt+cmd+page_up scroll_line_up +# map cmd+up scroll_line_up + +#: Scroll line down + +# map kitty_mod+down scroll_line_down +# map kitty_mod+j scroll_line_down +# map opt+cmd+page_down scroll_line_down +# map cmd+down scroll_line_down + +#: Scroll page up + +# map kitty_mod+page_up scroll_page_up +# map cmd+page_up scroll_page_up + +#: Scroll page down + +# map kitty_mod+page_down scroll_page_down +# map cmd+page_down scroll_page_down + +#: Scroll to top + +# map kitty_mod+home scroll_home +# map cmd+home scroll_home + +#: Scroll to bottom + +# map kitty_mod+end scroll_end +# map cmd+end scroll_end + +#: Scroll to previous shell prompt + +# map kitty_mod+z scroll_to_prompt -1 + +#:: Use a parameter of 0 for scroll_to_prompt to scroll to the last +#:: jumped to or the last clicked position. Requires shell +#:: integration +#:: to work. + +#: Scroll to next shell prompt + +# map kitty_mod+x scroll_to_prompt 1 + +#: Browse scrollback buffer in pager + +# map kitty_mod+h show_scrollback +map kitty_mod+h launch --stdin-source=@screen_scrollback --stdin-add-formatting less +G -R + +#:: You can pipe the contents of the current screen and history +#:: buffer as STDIN to an arbitrary program using launch --stdin- +#:: source. For example, the following opens the scrollback buffer in +#:: less in an overlay window:: + +#:: map f1 launch --stdin-source=@screen_scrollback --stdin-add-formatting --type=overlay less +G -R + +#:: For more details on piping screen and buffer contents to external +#:: programs, see launch . + +#: Browse output of the last shell command in pager + +# map kitty_mod+g show_last_command_output + +#:: You can also define additional shortcuts to get the command +#:: output. For example, to get the first command output on screen:: + +#:: map f1 show_first_command_output_on_screen + +#:: To get the command output that was last accessed by a keyboard +#:: action or mouse action:: + +#:: map f1 show_last_visited_command_output + +#:: You can pipe the output of the last command run in the shell +#:: using the launch action. For example, the following opens the +#:: output in less in an overlay window:: + +#:: map f1 launch --stdin-source=@last_cmd_output --stdin-add-formatting --type=overlay less +G -R + +#:: To get the output of the first command on the screen, use +#:: @first_cmd_output_on_screen. To get the output of the last jumped +#:: to command, use @last_visited_cmd_output. + +#:: Requires shell integration +#:: to work. + +#: }}} + +#: Window management {{{ + +#: New window + +# map kitty_mod+enter new_window +# map cmd+enter new_window + +#:: You can open a new kitty window running an arbitrary program, for +#:: example:: + +#:: map kitty_mod+y launch mutt + +#:: You can open a new window with the current working directory set +#:: to the working directory of the current window using:: + +#:: map ctrl+alt+enter launch --cwd=current + +#:: You can open a new window that is allowed to control kitty via +#:: the kitty remote control facility with launch --allow-remote- +#:: control. Any programs running in that window will be allowed to +#:: control kitty. For example:: + +#:: map ctrl+enter launch --allow-remote-control some_program + +#:: You can open a new window next to the currently active window or +#:: as the first window, with:: + +#:: map ctrl+n launch --location=neighbor +#:: map ctrl+f launch --location=first + +#:: For more details, see launch +#:: . + +#: New OS window + +# map kitty_mod+n new_os_window +# map cmd+n new_os_window + +#:: Works like new_window above, except that it opens a top-level OS +#:: window. In particular you can use new_os_window_with_cwd to open +#:: a window with the current working directory. + +#: Close window + +# map kitty_mod+w close_window +# map shift+cmd+d close_window + +#: Next window + +# map kitty_mod+] next_window + +#: Previous window + +# map kitty_mod+[ previous_window + +#: Move window forward + +# map kitty_mod+f move_window_forward + +#: Move window backward + +# map kitty_mod+b move_window_backward + +#: Move window to top + +# map kitty_mod+` move_window_to_top + +#: Start resizing window + +# map kitty_mod+r start_resizing_window +# map cmd+r start_resizing_window + +#: First window + +# map kitty_mod+1 first_window +# map cmd+1 first_window + +#: Second window + +# map kitty_mod+2 second_window +# map cmd+2 second_window + +#: Third window + +# map kitty_mod+3 third_window +# map cmd+3 third_window + +#: Fourth window + +# map kitty_mod+4 fourth_window +# map cmd+4 fourth_window + +#: Fifth window + +# map kitty_mod+5 fifth_window +# map cmd+5 fifth_window + +#: Sixth window + +# map kitty_mod+6 sixth_window +# map cmd+6 sixth_window + +#: Seventh window + +# map kitty_mod+7 seventh_window +# map cmd+7 seventh_window + +#: Eight window + +# map kitty_mod+8 eighth_window +# map cmd+8 eighth_window + +#: Ninth window + +# map kitty_mod+9 ninth_window +# map cmd+9 ninth_window + +#: Tenth window + +map kitty_mod+0 tenth_window +# map cmd+0 tenth_window + +#: Visually select and focus window + +# map kitty_mod+f7 focus_visible_window + +#:: Display overlay numbers and alphabets on the window, and switch +#:: the focus to the window when you press the key. When there are +#:: only two windows, the focus will be switched directly without +#:: displaying the overlay. You can change the overlay characters and +#:: their order with option visual_window_select_characters. + +#: Visually swap window with another + +# map kitty_mod+f8 swap_with_window + +#:: Works like focus_visible_window above, but swaps the window. + +#: }}} + +#: Tab management {{{ + +#: Next tab + +# map kitty_mod+right next_tab +# map shift+cmd+] next_tab +# map ctrl+tab next_tab +map shift+right next_tab +map shift+left previous_tab + +#: Previous tab + +# map kitty_mod+left previous_tab +# map shift+cmd+[ previous_tab +# map ctrl+shift+tab previous_tab + +#: New tab + +# map kitty_mod+t new_tab +# map cmd+t new_tab + +#: Close tab + +# map kitty_mod+q close_tab +# map cmd+w close_tab + +#: Close OS window + +# map shift+cmd+w close_os_window + +#: Move tab forward + +# map kitty_mod+. move_tab_forward +map kitty_mod+right move_tab_forward + +#: Move tab backward + +# map kitty_mod+, move_tab_backward +map kitty_mod+left move_tab_backward + +#: Set tab title + +# map kitty_mod+alt+t set_tab_title +# map shift+cmd+i set_tab_title + + +#: You can also create shortcuts to go to specific tabs, with 1 being +#: the first tab, 2 the second tab and -1 being the previously active +#: tab, and any number larger than the last tab being the last tab:: + +#: map ctrl+alt+1 goto_tab 1 +#: map ctrl+alt+2 goto_tab 2 + +map alt+1 goto_tab 1 +map alt+2 goto_tab 2 +map alt+3 goto_tab 3 +map alt+4 goto_tab 4 +map alt+5 goto_tab 5 +map alt+6 goto_tab 6 +map alt+7 goto_tab 7 +map alt+8 goto_tab 8 +map alt+9 goto_tab 9 + +#: Just as with new_window above, you can also pass the name of +#: arbitrary commands to run when using new_tab and new_tab_with_cwd. +#: Finally, if you want the new tab to open next to the current tab +#: rather than at the end of the tabs list, use:: + +#: map ctrl+t new_tab !neighbor [optional cmd to run] +#: }}} + +#: Layout management {{{ + +#: Next layout + +# map kitty_mod+l next_layout + + +#: You can also create shortcuts to switch to specific layouts:: + +#: map ctrl+alt+t goto_layout tall +#: map ctrl+alt+s goto_layout stack + +#: Similarly, to switch back to the previous layout:: + +#: map ctrl+alt+p last_used_layout + +#: There is also a toggle_layout action that switches to the named +#: layout or back to the previous layout if in the named layout. +#: Useful to temporarily "zoom" the active window by switching to the +#: stack layout:: + +#: map ctrl+alt+z toggle_layout stack +#: }}} + +#: Font sizes {{{ + +#: You can change the font size for all top-level kitty OS windows at +#: a time or only the current one. + +#: Increase font size + +# map kitty_mod+equal change_font_size all +2.0 +# map kitty_mod+plus change_font_size all +2.0 +# map kitty_mod+kp_add change_font_size all +2.0 +# map cmd+plus change_font_size all +2.0 +# map cmd+equal change_font_size all +2.0 +# map shift+cmd+equal change_font_size all +2.0 + +#: Decrease font size + +# map kitty_mod+minus change_font_size all -2.0 +# map kitty_mod+kp_subtract change_font_size all -2.0 +# map cmd+minus change_font_size all -2.0 +# map shift+cmd+minus change_font_size all -2.0 + +#: Reset font size + +# map kitty_mod+backspace change_font_size all 0 +# map cmd+0 change_font_size all 0 + + +#: To setup shortcuts for specific font sizes:: + +#: map kitty_mod+f6 change_font_size all 10.0 + +#: To setup shortcuts to change only the current OS window's font +#: size:: + +#: map kitty_mod+f6 change_font_size current 10.0 +#: }}} + +#: Select and act on visible text {{{ + +#: Use the hints kitten to select text and either pass it to an +#: external program or insert it into the terminal or copy it to the +#: clipboard. + +#: Open URL + +# map kitty_mod+e open_url_with_hints + +#:: Open a currently visible URL using the keyboard. The program used +#:: to open the URL is specified in open_url_with. + +#: Insert selected path + +# map kitty_mod+p>f kitten hints --type path --program - + +#:: Select a path/filename and insert it into the terminal. Useful, +#:: for instance to run git commands on a filename output from a +#:: previous git command. + +#: Open selected path + +# map kitty_mod+p>shift+f kitten hints --type path + +#:: Select a path/filename and open it with the default open program. + +#: Insert selected line + +# map kitty_mod+p>l kitten hints --type line --program - + +#:: Select a line of text and insert it into the terminal. Useful for +#:: the output of things like: `ls -1`. + +#: Insert selected word + +# map kitty_mod+p>w kitten hints --type word --program - + +#:: Select words and insert into terminal. + +#: Insert selected hash + +# map kitty_mod+p>h kitten hints --type hash --program - + +#:: Select something that looks like a hash and insert it into the +#:: terminal. Useful with git, which uses SHA1 hashes to identify +#:: commits. + +#: Open the selected file at the selected line + +# map kitty_mod+p>n kitten hints --type linenum + +#:: Select something that looks like filename:linenum and open it in +#:: vim at the specified line number. + +#: Open the selected hyperlink + +# map kitty_mod+p>y kitten hints --type hyperlink + +#:: Select a hyperlink (i.e. a URL that has been marked as such by +#:: the terminal program, for example, by `ls --hyperlink=auto`). + + +#: The hints kitten has many more modes of operation that you can map +#: to different shortcuts. For a full description see hints kitten +#: . +#: }}} + +#: Miscellaneous {{{ + +#: Toggle fullscreen + +# map kitty_mod+f11 toggle_fullscreen +# map ctrl+cmd+f toggle_fullscreen + +#: Toggle maximized + +# map kitty_mod+f10 toggle_maximized + +#: Toggle macOS secure keyboard entry + +# map opt+cmd+s toggle_macos_secure_keyboard_entry + +#: Unicode input + +# map kitty_mod+u kitten unicode_input +# map ctrl+cmd+space kitten unicode_input + +#: Edit config file + +# map kitty_mod+f2 edit_config_file +# map cmd+, edit_config_file + +#: Open the kitty command shell + +# map kitty_mod+escape kitty_shell window + +#:: Open the kitty shell in a new window / tab / overlay / os_window +#:: to control kitty using commands. + +#: Increase background opacity + +# map kitty_mod+a>m set_background_opacity +0.1 + +#: Decrease background opacity + +# map kitty_mod+a>l set_background_opacity -0.1 + +#: Make background fully opaque + +# map kitty_mod+a>1 set_background_opacity 1 + +#: Reset background opacity + +# map kitty_mod+a>d set_background_opacity default + +#: Reset the terminal + +# map kitty_mod+delete clear_terminal reset active +# map opt+cmd+r clear_terminal reset active + +#:: You can create shortcuts to clear/reset the terminal. For +#:: example:: + +#:: # Reset the terminal +#:: map f1 clear_terminal reset active +#:: # Clear the terminal screen by erasing all contents +#:: map f1 clear_terminal clear active +#:: # Clear the terminal scrollback by erasing it +#:: map f1 clear_terminal scrollback active +#:: # Scroll the contents of the screen into the scrollback +#:: map f1 clear_terminal scroll active +#:: # Clear everything up to the line with the cursor +#:: map f1 clear_terminal to_cursor active + +#:: If you want to operate on all kitty windows instead of just the +#:: current one, use all instead of active. + +#:: It is also possible to remap Ctrl+L to both scroll the current +#:: screen contents into the scrollback buffer and clear the screen, +#:: instead of just clearing the screen, for example, for ZSH add the +#:: following to ~/.zshrc: + +#:: .. code-block:: zsh + +#:: scroll-and-clear-screen() { +#:: printf '\n%.0s' {1..$LINES} +#:: zle clear-screen +#:: } +#:: zle -N scroll-and-clear-screen +#:: bindkey '^l' scroll-and-clear-screen + +#: Clear up to cursor line + +# map cmd+k clear_terminal to_cursor active + +#: Reload kitty.conf + +# map kitty_mod+f5 load_config_file +# map ctrl+cmd+, load_config_file + +#:: Reload kitty.conf, applying any changes since the last time it +#:: was loaded. Note that a handful of options cannot be dynamically +#:: changed and require a full restart of kitty. Particularly, when +#:: changing shortcuts for actions located on the macOS global menu +#:: bar, a full restart is needed. You can also map a keybinding to +#:: load a different config file, for example:: + +#:: map f5 load_config /path/to/alternative/kitty.conf + +#:: Note that all options from the original kitty.conf are discarded, +#:: in other words the new configuration *replace* the old ones. + +#: Debug kitty configuration + +# map kitty_mod+f6 debug_config +# map opt+cmd+, debug_config + +#:: Show details about exactly what configuration kitty is running +#:: with and its host environment. Useful for debugging issues. + +#: Send arbitrary text on key presses + +# Jump to the begining and end of line +map alt+left send_text all \x01 +map alt+right send_text all \x05 + +#:: E.g. map ctrl+shift+alt+h send_text all Hello World + +#:: You can tell kitty to send arbitrary (UTF-8) encoded text to the +#:: client program when pressing specified shortcut keys. For +#:: example:: + +#:: map ctrl+alt+a send_text all Special text + +#:: This will send "Special text" when you press the Ctrl+Alt+A key +#:: combination. The text to be sent is a python string literal so +#:: you can use escapes like \x1b to send control codes or \u21fb to +#:: send Unicode characters (or you can just input the Unicode +#:: characters directly as UTF-8 text). You can use `kitty +kitten +#:: show_key` to get the key escape codes you want to emulate. + +#:: The first argument to send_text is the keyboard modes in which to +#:: activate the shortcut. The possible values are normal, +#:: application, kitty or a comma separated combination of them. The +#:: modes normal and application refer to the DECCKM cursor key mode +#:: for terminals, and kitty refers to the kitty extended keyboard +#:: protocol. The special value all means all of them. + +#:: Some more examples:: + +#:: # Output a word and move the cursor to the start of the line (like typing and pressing Home) +#:: map ctrl+alt+a send_text normal Word\x1b[H +#:: map ctrl+alt+a send_text application Word\x1bOH +#:: # Run a command at a shell prompt (like typing the command and pressing Enter) +#:: map ctrl+alt+a send_text normal,application some command with arguments\r + +#: Open kitty Website + +# map shift+cmd+/ open_url https://sw.kovidgoyal.net/kitty/ + +#: }}} + +#: }}} diff --git a/config/kitty/config.sh b/config/kitty/config.sh new file mode 100755 index 0000000..b466295 --- /dev/null +++ b/config/kitty/config.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +set -x + +BASE_CONF=$HOME/.config/kitty/base.conf +KITTY_CONF=$HOME/.config/kitty/kitty.conf + +if [[ -f $BASE_CONF ]]; then + rm -f $BASE_CONF +fi + +if [[ -f $KITTY_CONF ]]; then + rm -f $KITTY_CONF +fi + +ln -s $HOME/Projects/notes/config/kitty/base.conf $BASE_CONF + +if [[ $(uname -s) = "Darwin" ]]; then + ln -s $HOME/Projects/notes/config/kitty/macos.conf $KITTY_CONF +elif [[ $(uname -s) = "Linux" ]]; then + ln -s $HOME/Projects/notes/config/kitty/linux.conf $KITTY_CONF +fi + diff --git a/config/kitty/kitty.conf.bak b/config/kitty/kitty.conf.bak new file mode 100644 index 0000000..6deaaab --- /dev/null +++ b/config/kitty/kitty.conf.bak @@ -0,0 +1,2294 @@ +# vim:fileencoding=utf-8:foldmethod=marker + +#: Fonts {{{ + +#: kitty has very powerful font management. You can configure +#: individual font faces and even specify special fonts for particular +#: characters. + +# font_family MesloLGL Nerd Font +# bold_font auto +# italic_font auto +# bold_italic_font auto +font_family Hack Nerd Font Mono +bold_font Hack Nerd Font Mono Bold +italic_font Hack Nerd Font Mono Italic +bold_italic_font Hack Nerd Font Mono Bold Italic +# font_family Hack +# bold_font Hack Bold +# italic_font Hack Italic +# bold_italic_font Hack Bold Italic + +#: You can specify different fonts for the bold/italic/bold-italic +#: variants. To get a full list of supported fonts use the `kitty +#: +list-fonts` command. By default they are derived automatically, by +#: the OSes font system. When bold_font or bold_italic_font is set to +#: auto on macOS, the priority of bold fonts is semi-bold, bold, +#: heavy. Setting them manually is useful for font families that have +#: many weight variants like Book, Medium, Thick, etc. For example:: + +#: font_family Operator Mono Book +#: bold_font Operator Mono Medium +#: italic_font Operator Mono Book Italic +#: bold_italic_font Operator Mono Medium Italic + +# On Linux, 11pts is ok +font_size 13.0 + +#: Font size (in pts) + +# force_ltr no + +#: kitty does not support BIDI (bidirectional text), however, for RTL +#: scripts, words are automatically displayed in RTL. That is to say, +#: in an RTL script, the words "HELLO WORLD" display in kitty as +#: "WORLD HELLO", and if you try to select a substring of an RTL- +#: shaped string, you will get the character that would be there had +#: the the string been LTR. For example, assuming the Hebrew word +#: ירושלים, selecting the character that on the screen appears to be ם +#: actually writes into the selection buffer the character י. kitty's +#: default behavior is useful in conjunction with a filter to reverse +#: the word order, however, if you wish to manipulate RTL glyphs, it +#: can be very challenging to work with, so this option is provided to +#: turn it off. Furthermore, this option can be used with the command +#: line program GNU FriBidi +#: to get BIDI +#: support, because it will force kitty to always treat the text as +#: LTR, which FriBidi expects for terminals. + +# adjust_line_height 0 +# adjust_column_width 0 + +adjust_line_height 120% +adjust_column_width 100% + +#: Change the size of each character cell kitty renders. You can use +#: either numbers, which are interpreted as pixels or percentages +#: (number followed by %), which are interpreted as percentages of the +#: unmodified values. You can use negative pixels or percentages less +#: than 100% to reduce sizes (but this might cause rendering +#: artifacts). + +# adjust_baseline 0 + +#: Adjust the vertical alignment of text (the height in the cell at +#: which text is positioned). You can use either numbers, which are +#: interpreted as pixels or percentages (number followed by %), which +#: are interpreted as the percentage of the line height. A positive +#: value moves the baseline up, and a negative value moves them down. +#: The underline and strikethrough positions are adjusted accordingly. + +# symbol_map + +#: E.g. symbol_map U+E0A0-U+E0A3,U+E0C0-U+E0C7 PowerlineSymbols + +#: Map the specified Unicode codepoints to a particular font. Useful +#: if you need special rendering for some symbols, such as for +#: Powerline. Avoids the need for patched fonts. Each Unicode code +#: point is specified in the form `U+`. You +#: can specify multiple code points, separated by commas and ranges +#: separated by hyphens. This option can be specified multiple times. +#: The syntax is:: + +#: symbol_map codepoints Font Family Name + +# narrow_symbols + +#: E.g. narrow_symbols U+E0A0-U+E0A3,U+E0C0-U+E0C7 1 + +#: Usually, for Private Use Unicode characters and some symbol/dingbat +#: characters, if the character is followed by one or more spaces, +#: kitty will use those extra cells to render the character larger, if +#: the character in the font has a wide aspect ratio. Using this +#: option you can force kitty to restrict the specified code points to +#: render in the specified number of cells (defaulting to one cell). +#: This option can be specified multiple times. The syntax is:: + +#: narrow_symbols codepoints [optionally the number of cells] + +# disable_ligatures never + +#: Choose how you want to handle multi-character ligatures. The +#: default is to always render them. You can tell kitty to not render +#: them when the cursor is over them by using cursor to make editing +#: easier, or have kitty never render them at all by using always, if +#: you don't like them. The ligature strategy can be set per-window +#: either using the kitty remote control facility or by defining +#: shortcuts for it in kitty.conf, for example:: + +#: map alt+1 disable_ligatures_in active always +#: map alt+2 disable_ligatures_in all never +#: map alt+3 disable_ligatures_in tab cursor + +#: Note that this refers to programming ligatures, typically +#: implemented using the calt OpenType feature. For disabling general +#: ligatures, use the font_features option. + +# font_features + +#: E.g. font_features none + +#: Choose exactly which OpenType features to enable or disable. This +#: is useful as some fonts might have features worthwhile in a +#: terminal. For example, Fira Code includes a discretionary feature, +#: zero, which in that font changes the appearance of the zero (0), to +#: make it more easily distinguishable from Ø. Fira Code also includes +#: other discretionary features known as Stylistic Sets which have the +#: tags ss01 through ss20. + +#: For the exact syntax to use for individual features, see the +#: HarfBuzz documentation . + +#: Note that this code is indexed by PostScript name, and not the font +#: family. This allows you to define very precise feature settings; +#: e.g. you can disable a feature in the italic font but not in the +#: regular font. + +#: On Linux, font features are first read from the FontConfig database +#: and then this option is applied, so they can be configured in a +#: single, central place. + +#: To get the PostScript name for a font, use `kitty +list-fonts +#: --psnames`: + +#: .. code-block:: sh + +#: $ kitty +list-fonts --psnames | grep Fira +#: Fira Code +#: Fira Code Bold (FiraCode-Bold) +#: Fira Code Light (FiraCode-Light) +#: Fira Code Medium (FiraCode-Medium) +#: Fira Code Regular (FiraCode-Regular) +#: Fira Code Retina (FiraCode-Retina) + +#: The part in brackets is the PostScript name. + +#: Enable alternate zero and oldstyle numerals:: + +#: font_features FiraCode-Retina +zero +onum + +#: Enable only alternate zero in the bold font:: + +#: font_features FiraCode-Bold +zero + +#: Disable the normal ligatures, but keep the calt feature which (in +#: this font) breaks up monotony:: + +#: font_features TT2020StyleB-Regular -liga +calt + +#: In conjunction with force_ltr, you may want to disable Arabic +#: shaping entirely, and only look at their isolated forms if they +#: show up in a document. You can do this with e.g.:: + +#: font_features UnifontMedium +isol -medi -fina -init + +# box_drawing_scale 0.001, 1, 1.5, 2 + +#: The sizes of the lines used for the box drawing Unicode characters. +#: These values are in pts. They will be scaled by the monitor DPI to +#: arrive at a pixel value. There must be four values corresponding to +#: thin, normal, thick, and very thick lines. + +#: }}} + +#: Cursor customization {{{ + +# cursor #cccccc +cursor #fdf6e3 + +#: Default cursor color. If set to the special value none the cursor +#: will be rendered with a "reverse video" effect. It's color will be +#: the color of the text in the cell it is over and the text will be +#: rendered with the background color of the cell. Note that if the +#: program running in the terminal sets a cursor color, this takes +#: precedence. Also, the cursor colors are modified if the cell +#: background and foreground colors have very low contrast. + +# cursor_text_color #111111 +cursor_text_color #002b36 + +#: The color of text under the cursor. If you want it rendered with +#: the background color of the cell underneath instead, use the +#: special keyword: background. Note that if cursor is set to none +#: then this option is ignored. + +cursor_shape block + +#: The cursor shape can be one of block, beam, underline. Note that +#: when reloading the config this will be changed only if the cursor +#: shape has not been set by the program running in the terminal. This +#: sets the default cursor shape, applications running in the terminal +#: can override it. In particular, shell integration +#: in kitty sets +#: the cursor shape to beam at shell prompts. You can avoid this by +#: setting shell_integration to no-cursor. + +# cursor_beam_thickness 1.5 + +#: The thickness of the beam cursor (in pts). + +# cursor_underline_thickness 2.0 + +#: The thickness of the underline cursor (in pts). + +cursor_blink_interval 0 + +#: The interval to blink the cursor (in seconds). Set to zero to +#: disable blinking. Negative values mean use system default. Note +#: that the minimum interval will be limited to repaint_delay. + +# cursor_stop_blinking_after 15.0 + +#: Stop blinking cursor after the specified number of seconds of +#: keyboard inactivity. Set to zero to never stop blinking. + +#: }}} + +#: Scrollback {{{ + +scrollback_lines 2000 + +#: Number of lines of history to keep in memory for scrolling back. +#: Memory is allocated on demand. Negative numbers are (effectively) +#: infinite scrollback. Note that using very large scrollback is not +#: recommended as it can slow down performance of the terminal and +#: also use large amounts of RAM. Instead, consider using +#: scrollback_pager_history_size. Note that on config reload if this +#: is changed it will only affect newly created windows, not existing +#: ones. + +# scrollback_pager less --chop-long-lines --RAW-CONTROL-CHARS +INPUT_LINE_NUMBER + +# TODO: Try to use vim to browse scrollback history +# scrollback_pager vi -c 'set ft=man' - + +#: Program with which to view scrollback in a new window. The +#: scrollback buffer is passed as STDIN to this program. If you change +#: it, make sure the program you use can handle ANSI escape sequences +#: for colors and text formatting. INPUT_LINE_NUMBER in the command +#: line above will be replaced by an integer representing which line +#: should be at the top of the screen. Similarly CURSOR_LINE and +#: CURSOR_COLUMN will be replaced by the current cursor position or +#: set to 0 if there is no cursor, for example, when showing the last +#: command output. + +# scrollback_pager_history_size 0 +scrollback_pager_history_size 10 + +#: Separate scrollback history size (in MB), used only for browsing +#: the scrollback buffer with pager. This separate buffer is not +#: available for interactive scrolling but will be piped to the pager +#: program when viewing scrollback buffer in a separate window. The +#: current implementation stores the data in UTF-8, so approximatively +#: 10000 lines per megabyte at 100 chars per line, for pure ASCII, +#: unformatted text. A value of zero or less disables this feature. +#: The maximum allowed size is 4GB. Note that on config reload if this +#: is changed it will only affect newly created windows, not existing +#: ones. + +# scrollback_fill_enlarged_window no + +#: Fill new space with lines from the scrollback buffer after +#: enlarging a window. + +# wheel_scroll_multiplier 5.0 + +#: Multiplier for the number of lines scrolled by the mouse wheel. +#: Note that this is only used for low precision scrolling devices, +#: not for high precision scrolling devices on platforms such as macOS +#: and Wayland. Use negative numbers to change scroll direction. See +#: also wheel_scroll_min_lines. + +# wheel_scroll_min_lines 1 + +#: The minimum number of lines scrolled by the mouse wheel. The scroll +#: multiplier only takes effect after it +#: reaches this number. Note that this is only used for low precision +#: scrolling devices like wheel mice that scroll by very small amounts +#: when using the wheel. With a negative number, the minimum number of +#: lines will always be added. + +# touch_scroll_multiplier 1.0 + +#: Multiplier for the number of lines scrolled by a touchpad. Note +#: that this is only used for high precision scrolling devices on +#: platforms such as macOS and Wayland. Use negative numbers to change +#: scroll direction. + +#: }}} + +#: Mouse {{{ + +# mouse_hide_wait 3.0 + +#: Hide mouse cursor after the specified number of seconds of the +#: mouse not being used. Set to zero to disable mouse cursor hiding. +#: Set to a negative value to hide the mouse cursor immediately when +#: typing text. Disabled by default on macOS as getting it to work +#: robustly with the ever-changing sea of bugs that is Cocoa is too +#: much effort. + +# url_color #0087bd +# url_style curly + +#: The color and style for highlighting URLs on mouse-over. url_style +#: can be one of: none, straight, double, curly, dotted, dashed. + +# open_url_with default + +#: The program to open clicked URLs. The special value default means +#: to use the operating system's default URL handler (open on macOS +#: and xdg-open on Linux). + +# url_prefixes file ftp ftps gemini git gopher http https irc ircs kitty mailto news sftp ssh + +#: The set of URL prefixes to look for when detecting a URL under the +#: mouse cursor. + +detect_urls yes + +#: Detect URLs under the mouse. Detected URLs are highlighted with an +#: underline and the mouse cursor becomes a hand over them. Even if +#: this option is disabled, URLs are still clickable. + +# url_excluded_characters + +#: Additional characters to be disallowed from URLs, when detecting +#: URLs under the mouse cursor. By default, all characters that are +#: legal in URLs are allowed. + +copy_on_select clipboard + +#: Copy to clipboard or a private buffer on select. With this set to +#: clipboard, selecting text with the mouse will cause the text to be +#: copied to clipboard. Useful on platforms such as macOS that do not +#: have the concept of primary selection. You can instead specify a +#: name such as a1 to copy to a private kitty buffer. Map a shortcut +#: with the paste_from_buffer action to paste from this private +#: buffer. For example:: + +#: copy_on_select a1 +#: map shift+cmd+v paste_from_buffer a1 + +#: Note that copying to the clipboard is a security risk, as all +#: programs, including websites open in your browser can read the +#: contents of the system clipboard. + +# paste_actions quote-urls-at-prompt + +#: A comma separated list of actions to take when pasting text into +#: the terminal. The supported paste actions are: + +#: quote-urls-at-prompt: +#: If the text being pasted is a URL and the cursor is at a shell prompt, +#: automatically quote the URL (needs shell_integration). +#: confirm: +#: Confirm the paste if bracketed paste mode is not active or there is more +#: a large amount of text being pasted. +#: filter: +#: Run the filter_paste() function from the file paste-actions.py in +#: the kitty config directory on the pasted text. The text returned by the +#: function will be actually pasted. + +strip_trailing_spaces always + +#: Remove spaces at the end of lines when copying to clipboard. A +#: value of smart will do it when using normal selections, but not +#: rectangle selections. A value of always will always do it. + +select_by_word_characters @-./_~?&=%+# + +#: Characters considered part of a word when double clicking. In +#: addition to these characters any character that is marked as an +#: alphanumeric character in the Unicode database will be matched. + +# select_by_word_characters_forward + +#: Characters considered part of a word when extending the selection +#: forward on double clicking. In addition to these characters any +#: character that is marked as an alphanumeric character in the +#: Unicode database will be matched. + +#: If empty (default) select_by_word_characters will be used for both +#: directions. + +# click_interval -1.0 + +#: The interval between successive clicks to detect double/triple +#: clicks (in seconds). Negative numbers will use the system default +#: instead, if available, or fallback to 0.5. + +# focus_follows_mouse no + +#: Set the active window to the window under the mouse when moving the +#: mouse around. + +# pointer_shape_when_grabbed arrow + +#: The shape of the mouse pointer when the program running in the +#: terminal grabs the mouse. Valid values are: arrow, beam and hand. + +default_pointer_shape arrow + +#: The default shape of the mouse pointer. Valid values are: arrow, +#: beam and hand. + +pointer_shape_when_dragging hand + +#: The default shape of the mouse pointer when dragging across text. +#: Valid values are: arrow, beam and hand. + +#: Mouse actions {{{ + +#: Mouse buttons can be mapped to perform arbitrary actions. The +#: syntax is: + +#: .. code-block:: none + +#: mouse_map button-name event-type modes action + +#: Where button-name is one of left, middle, right, b1 ... b8 with +#: added keyboard modifiers. For example: ctrl+shift+left refers to +#: holding the Ctrl+Shift keys while clicking with the left mouse +#: button. The value b1 ... b8 can be used to refer to up to eight +#: buttons on a mouse. + +#: event-type is one of press, release, doublepress, triplepress, +#: click, doubleclick. modes indicates whether the action is performed +#: when the mouse is grabbed by the program running in the terminal, +#: or not. The values are grabbed or ungrabbed or a comma separated +#: combination of them. grabbed refers to when the program running in +#: the terminal has requested mouse events. Note that the click and +#: double click events have a delay of click_interval to disambiguate +#: from double and triple presses. + +#: You can run kitty with the kitty --debug-input command line option +#: to see mouse events. See the builtin actions below to get a sense +#: of what is possible. + +#: If you want to unmap an action, map it to no_op. For example, to +#: disable opening of URLs with a plain click:: + +#: mouse_map left click ungrabbed no_op + +#: See all the mappable actions including mouse actions here +#: . + +#: .. note:: +#: Once a selection is started, releasing the button that started it will +#: automatically end it and no release event will be dispatched. + +# clear_all_mouse_actions no + +#: Remove all mouse action definitions up to this point. Useful, for +#: instance, to remove the default mouse actions. + +#: Click the link under the mouse or move the cursor + +# mouse_map left click ungrabbed mouse_handle_click selection link prompt + +#:: First check for a selection and if one exists do nothing. Then +#:: check for a link under the mouse cursor and if one exists, click +#:: it. Finally check if the click happened at the current shell +#:: prompt and if so, move the cursor to the click location. Note +#:: that this requires shell integration +#:: to work. + +#: Click the link under the mouse or move the cursor even when grabbed + +# mouse_map shift+left click grabbed,ungrabbed mouse_handle_click selection link prompt + +#:: Same as above, except that the action is performed even when the +#:: mouse is grabbed by the program running in the terminal. + +#: Click the link under the mouse cursor + +# mouse_map ctrl+shift+left release grabbed,ungrabbed mouse_handle_click link + +#:: Variant with Ctrl+Shift is present because the simple click based +#:: version has an unavoidable delay of click_interval, to +#:: disambiguate clicks from double clicks. + +#: Discard press event for link click + +# mouse_map ctrl+shift+left press grabbed discard_event + +#:: Prevent this press event from being sent to the program that has +#:: grabbed the mouse, as the corresponding release event is used to +#:: open a URL. + +#: Paste from the primary selection + +# mouse_map middle release ungrabbed paste_from_selection + +#: Start selecting text + +# mouse_map left press ungrabbed mouse_selection normal + +#: Start selecting text in a rectangle + +# mouse_map ctrl+alt+left press ungrabbed mouse_selection rectangle + +#: Select a word + +# mouse_map left doublepress ungrabbed mouse_selection word + +#: Select a line + +# mouse_map left triplepress ungrabbed mouse_selection line + +#: Select line from point + +# mouse_map ctrl+alt+left triplepress ungrabbed mouse_selection line_from_point + +#:: Select from the clicked point to the end of the line. + +#: Extend the current selection + +# mouse_map right press ungrabbed mouse_selection extend + +#:: If you want only the end of the selection to be moved instead of +#:: the nearest boundary, use move-end instead of extend. + +#: Paste from the primary selection even when grabbed + +# mouse_map shift+middle release ungrabbed,grabbed paste_selection +# mouse_map shift+middle press grabbed discard_event + +#: Start selecting text even when grabbed + +# mouse_map shift+left press ungrabbed,grabbed mouse_selection normal + +#: Start selecting text in a rectangle even when grabbed + +# mouse_map ctrl+shift+alt+left press ungrabbed,grabbed mouse_selection rectangle + +#: Select a word even when grabbed + +# mouse_map shift+left doublepress ungrabbed,grabbed mouse_selection word + +#: Select a line even when grabbed + +# mouse_map shift+left triplepress ungrabbed,grabbed mouse_selection line + +#: Select line from point even when grabbed + +# mouse_map ctrl+shift+alt+left triplepress ungrabbed,grabbed mouse_selection line_from_point + +#:: Select from the clicked point to the end of the line even when +#:: grabbed. + +#: Extend the current selection even when grabbed + +# mouse_map shift+right press ungrabbed,grabbed mouse_selection extend + +#: Show clicked command output in pager + +# mouse_map ctrl+shift+right press ungrabbed mouse_show_command_output + +#:: Requires shell integration +#:: to work. + +#: }}} + +#: }}} + +#: Performance tuning {{{ + +# repaint_delay 10 + +#: Delay between screen updates (in milliseconds). Decreasing it, +#: increases frames-per-second (FPS) at the cost of more CPU usage. +#: The default value yields ~100 FPS which is more than sufficient for +#: most uses. Note that to actually achieve 100 FPS, you have to +#: either set sync_to_monitor to no or use a monitor with a high +#: refresh rate. Also, to minimize latency when there is pending input +#: to be processed, this option is ignored. + +# input_delay 3 + +#: Delay before input from the program running in the terminal is +#: processed (in milliseconds). Note that decreasing it will increase +#: responsiveness, but also increase CPU usage and might cause flicker +#: in full screen programs that redraw the entire screen on each loop, +#: because kitty is so fast that partial screen updates will be drawn. + +# sync_to_monitor yes + +#: Sync screen updates to the refresh rate of the monitor. This +#: prevents screen tearing +#: when scrolling. +#: However, it limits the rendering speed to the refresh rate of your +#: monitor. With a very high speed mouse/high keyboard repeat rate, +#: you may notice some slight input latency. If so, set this to no. + +#: }}} + +#: Terminal bell {{{ + +# enable_audio_bell yes + +#: The audio bell. Useful to disable it in environments that require +#: silence. + +# visual_bell_duration 0.0 + +#: The visual bell duration (in seconds). Flash the screen when a bell +#: occurs for the specified number of seconds. Set to zero to disable. + +# visual_bell_color none + +#: The color used by visual bell. Set to none will fall back to +#: selection background color. If you feel that the visual bell is too +#: bright, you can set it to a darker color. + +# window_alert_on_bell yes + +#: Request window attention on bell. Makes the dock icon bounce on +#: macOS or the taskbar flash on linux. + +# bell_on_tab "🔔 " + +#: Some text or a Unicode symbol to show on the tab if a window in the +#: tab that does not have focus has a bell. If you want to use leading +#: or trailing spaces, surround the text with quotes. See +#: tab_title_template for how this is rendered. + +#: For backwards compatibility, values of yes, y and true are +#: converted to the default bell symbol and no, n, false and none are +#: converted to the empty string. + +# command_on_bell none + +#: Program to run when a bell occurs. The environment variable +#: KITTY_CHILD_CMDLINE can be used to get the program running in the +#: window in which the bell occurred. + +# bell_path none + +#: Path to a sound file to play as the bell sound. If set to none, the +#: system default bell sound is used. Must be in a format supported by +#: the operating systems sound API, such as WAV or OGA on Linux +#: (libcanberra) or AIFF, MP3 or WAV on macOS (NSSound) + +#: }}} + +#: Window layout {{{ + +remember_window_size yes +# initial_window_width 640 +# initial_window_height 400 + +#: If enabled, the window size will be remembered so that new +#: instances of kitty will have the same size as the previous +#: instance. If disabled, the window will initially have size +#: configured by initial_window_width/height, in pixels. You can use a +#: suffix of "c" on the width/height values to have them interpreted +#: as number of cells instead of pixels. + +# enabled_layouts * + +#: The enabled window layouts. A comma separated list of layout names. +#: The special value all means all layouts. The first listed layout +#: will be used as the startup layout. Default configuration is all +#: layouts in alphabetical order. For a list of available layouts, see +#: the layouts . + +# window_resize_step_cells 2 +# window_resize_step_lines 2 + +#: The step size (in units of cell width/cell height) to use when +#: resizing kitty windows in a layout with the shortcut +#: start_resizing_window. The cells value is used for horizontal +#: resizing, and the lines value is used for vertical resizing. + +window_border_width 1px + +#: The width of window borders. Can be either in pixels (px) or pts +#: (pt). Values in pts will be rounded to the nearest number of pixels +#: based on screen resolution. If not specified, the unit is assumed +#: to be pts. Note that borders are displayed only when more than one +#: window is visible. They are meant to separate multiple windows. + +draw_minimal_borders yes + +#: Draw only the minimum borders needed. This means that only the +#: borders that separate the inactive window from a neighbor are +#: drawn. Note that setting a non-zero window_margin_width overrides +#: this and causes all borders to be drawn. + +window_margin_width 0 + +#: The window margin (in pts) (blank area outside the border). A +#: single value sets all four sides. Two values set the vertical and +#: horizontal sides. Three values set top, horizontal and bottom. Four +#: values set top, right, bottom and left. + +# single_window_margin_width -1 + +#: The window margin to use when only a single window is visible (in +#: pts). Negative values will cause the value of window_margin_width +#: to be used instead. A single value sets all four sides. Two values +#: set the vertical and horizontal sides. Three values set top, +#: horizontal and bottom. Four values set top, right, bottom and left. + +# window_padding_width 0 +window_padding_width 0 1 0 1 + +#: The window padding (in pts) (blank area between the text and the +#: window border). A single value sets all four sides. Two values set +#: the vertical and horizontal sides. Three values set top, horizontal +#: and bottom. Four values set top, right, bottom and left. + +placement_strategy center + +#: When the window size is not an exact multiple of the cell size, the +#: cell area of the terminal window will have some extra padding on +#: the sides. You can control how that padding is distributed with +#: this option. Using a value of center means the cell area will be +#: placed centrally. A value of top-left means the padding will be +#: only at the bottom and right edges. + +# active_border_color #00ff00 + +#: The color for the border of the active window. Set this to none to +#: not draw borders around the active window. + +# inactive_border_color #cccccc + +#: The color for the border of inactive windows. + +# bell_border_color #ff5a00 + +#: The color for the border of inactive windows in which a bell has +#: occurred. + +# inactive_text_alpha 1.0 + +#: Fade the text in inactive windows by the specified amount (a number +#: between zero and one, with zero being fully faded). + +# Set to yes then window title is not displayed +hide_window_decorations no + +#: Hide the window decorations (title-bar and window borders) with +#: yes. On macOS, titlebar-only can be used to only hide the titlebar. +#: Whether this works and exactly what effect it has depends on the +#: window manager/operating system. Note that the effects of changing +#: this option when reloading config are undefined. + +# window_logo_path none + +#: Path to a logo image. Must be in PNG format. Relative paths are +#: interpreted relative to the kitty config directory. The logo is +#: displayed in a corner of every kitty window. The position is +#: controlled by window_logo_position. Individual windows can be +#: configured to have different logos either using the launch action +#: or the remote control facility. + +# window_logo_position bottom-right + +#: Where to position the window logo in the window. The value can be +#: one of: top-left, top, top-right, left, center, right, bottom-left, +#: bottom, bottom-right. + +# window_logo_alpha 0.5 + +#: The amount the logo should be faded into the background. With zero +#: being fully faded and one being fully opaque. + +# resize_debounce_time 0.1 + +#: The time to wait before redrawing the screen when a resize event is +#: received (in seconds). On platforms such as macOS, where the +#: operating system sends events corresponding to the start and end of +#: a resize, this number is ignored. + +# resize_draw_strategy static + +#: Choose how kitty draws a window while a resize is in progress. A +#: value of static means draw the current window contents, mostly +#: unchanged. A value of scale means draw the current window contents +#: scaled. A value of blank means draw a blank window. A value of size +#: means show the window size in cells. + +# resize_in_steps no + +#: Resize the OS window in steps as large as the cells, instead of +#: with the usual pixel accuracy. Combined with initial_window_width +#: and initial_window_height in number of cells, this option can be +#: used to keep the margins as small as possible when resizing the OS +#: window. Note that this does not currently work on Wayland. + +visual_window_select_characters 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ + +#: The list of characters for visual window selection. For example, +#: for selecting a window to focus on with focus_visible_window. The +#: value should be a series of unique numbers or alphabets, case +#: insensitive, from the set [0-9A-Z]. Specify your preference as a +#: string of characters. + +# confirm_os_window_close -1 + +#: Ask for confirmation when closing an OS window or a tab with at +#: least this number of kitty windows in it by window manager (e.g. +#: clicking the window close button or pressing the operating system +#: shortcut to close windows) or by the close_tab action. A value of +#: zero disables confirmation. This confirmation also applies to +#: requests to quit the entire application (all OS windows, via the +#: quit action). Negative values are converted to positive ones, +#: however, with shell_integration enabled, using negative values +#: means windows sitting at a shell prompt are not counted, only +#: windows where some command is currently running. Note that if you +#: want confirmation when closing individual windows, you can map the +#: close_window_with_confirmation action. + +#: }}} + +#: Tab bar {{{ + +tab_bar_edge bottom + +#: The edge to show the tab bar on, top or bottom. + +# tab_bar_margin_width 0.0 + +#: The margin to the left and right of the tab bar (in pts). + +# tab_bar_margin_height 0.0 0.0 + +#: The margin above and below the tab bar (in pts). The first number +#: is the margin between the edge of the OS Window and the tab bar. +#: The second number is the margin between the tab bar and the +#: contents of the current tab. + +tab_bar_style powerline + +#: The tab bar style, can be one of: + +#: fade +#: Each tab's edges fade into the background color. (See also tab_fade) +#: slant +#: Tabs look like the tabs in a physical file. +#: separator +#: Tabs are separated by a configurable separator. (See also +#: tab_separator) +#: powerline +#: Tabs are shown as a continuous line with "fancy" separators. +#: (See also tab_powerline_style) +#: custom +#: A user-supplied Python function called draw_tab is loaded from the file +#: tab_bar.py in the kitty config directory. For examples of how to +#: write such a function, see the functions named draw_tab_with_* in +#: kitty's source code: kitty/tab_bar.py. See also +#: this discussion https://github.com/kovidgoyal/kitty/discussions/4447 +#: for examples from kitty users. +#: hidden +#: The tab bar is hidden. If you use this, you might want to create a mapping +#: for the select_tab action which presents you with a list of tabs and +#: allows for easy switching to a tab. + +# tab_bar_align left + +#: The horizontal alignment of the tab bar, can be one of: left, +#: center, right. + +# tab_bar_min_tabs 2 + +#: The minimum number of tabs that must exist before the tab bar is +#: shown. + +# tab_switch_strategy previous + +#: The algorithm to use when switching to a tab when the current tab +#: is closed. The default of previous will switch to the last used +#: tab. A value of left will switch to the tab to the left of the +#: closed tab. A value of right will switch to the tab to the right of +#: the closed tab. A value of last will switch to the right-most tab. + +# tab_fade 0.25 0.5 0.75 1 + +#: Control how each tab fades into the background when using fade for +#: the tab_bar_style. Each number is an alpha (between zero and one) +#: that controls how much the corresponding cell fades into the +#: background, with zero being no fade and one being full fade. You +#: can change the number of cells used by adding/removing entries to +#: this list. + +# tab_separator " ┇" + +#: The separator between tabs in the tab bar when using separator as +#: the tab_bar_style. + +tab_powerline_style slanted + +#: The powerline separator style between tabs in the tab bar when +#: using powerline as the tab_bar_style, can be one of: angled, +#: slanted, round. + +# tab_activity_symbol none + +#: Some text or a Unicode symbol to show on the tab if a window in the +#: tab that does not have focus has some activity. If you want to use +#: leading or trailing spaces, surround the text with quotes. See +#: tab_title_template for how this is rendered. + +# tab_title_template "{fmt.fg.red}{bell_symbol}{activity_symbol}{fmt.fg.tab}{title}" +# tab_title_template "{fmt.fg.cyan}{index}:{fmt.fg.red}{bell_symbol}{activity_symbol}{fmt.fg.tab}{title}" +# Show short path in tab title +tab_title_template "{fmt.fg.cyan}{index}:{fmt.fg.red}{bell_symbol}{activity_symbol}{fmt.fg.tab}{title[title.rfind('/')+1:]}" + +#: A template to render the tab title. The default just renders the +#: title with optional symbols for bell and activity. If you wish to +#: include the tab-index as well, use something like: {index}:{title}. +#: Useful if you have shortcuts mapped for goto_tab N. If you prefer +#: to see the index as a superscript, use {sup.index}. In addition you +#: can use {layout_name} for the current layout name, {num_windows} +#: for the number of windows in the tab and {num_window_groups} for +#: the number of window groups (not counting overlay windows) in the +#: tab. Note that formatting is done by Python's string formatting +#: machinery, so you can use, for instance, {layout_name[:2].upper()} +#: to show only the first two letters of the layout name, upper-cased. +#: If you want to style the text, you can use styling directives, for +#: example: +#: `{fmt.fg.red}red{fmt.fg.tab}normal{fmt.bg._00FF00}greenbg{fmt.bg.tab}`. +#: Similarly, for bold and italic: +#: `{fmt.bold}bold{fmt.nobold}normal{fmt.italic}italic{fmt.noitalic}`. +#: Note that for backward compatibility, if {bell_symbol} or +#: {activity_symbol} are not present in the template, they are +#: prepended to it. + +# active_tab_title_template none + +#: Template to use for active tabs. If not specified falls back to +#: tab_title_template. + +active_tab_foreground #eee8d5 +active_tab_background #586e75 +active_tab_font_style bold-italic +inactive_tab_foreground #586e75 +inactive_tab_background #073642 +inactive_tab_font_style normal + +#: Tab bar colors and styles. + +tab_bar_background none + +#: Background color for the tab bar. Defaults to using the terminal +#: background color. + +tab_bar_margin_color none + +#: Color for the tab bar margin area. Defaults to using the terminal +#: background color. + +#: }}} + +#: Color scheme {{{ + +# foreground #dddddd +# background #000000 + +#: The foreground and background colors. + +# background_opacity 1.0 + +#: The opacity of the background. A number between zero and one, where +#: one is opaque and zero is fully transparent. This will only work if +#: supported by the OS (for instance, when using a compositor under +#: X11). Note that it only sets the background color's opacity in +#: cells that have the same background color as the default terminal +#: background, so that things like the status bar in vim, powerline +#: prompts, etc. still look good. But it means that if you use a color +#: theme with a background color in your editor, it will not be +#: rendered as transparent. Instead you should change the default +#: background color in your kitty config and not use a background +#: color in the editor color scheme. Or use the escape codes to set +#: the terminals default colors in a shell script to launch your +#: editor. Be aware that using a value less than 1.0 is a (possibly +#: significant) performance hit. If you want to dynamically change +#: transparency of windows, set dynamic_background_opacity to yes +#: (this is off by default as it has a performance cost). Changing +#: this option when reloading the config will only work if +#: dynamic_background_opacity was enabled in the original config. + +# background_image none + +#: Path to a background image. Must be in PNG format. + +# background_image_layout tiled + +#: Whether to tile, scale or clamp the background image. The value can +#: be one of tiled, mirror-tiled, scaled, clamped. + +# background_image_linear no + +#: When background image is scaled, whether linear interpolation +#: should be used. + +# dynamic_background_opacity no + +#: Allow changing of the background_opacity dynamically, using either +#: keyboard shortcuts (increase_background_opacity and +#: decrease_background_opacity) or the remote control facility. +#: Changing this option by reloading the config is not supported. + +# background_tint 0.0 + +#: How much to tint the background image by the background color. The +#: tint is applied only under the text area, not margin/borders. This +#: option makes it easier to read the text. Tinting is done using the +#: current background color for each window. This option applies only +#: if background_opacity is set and transparent windows are supported +#: or background_image is set. + +# dim_opacity 0.75 + +#: How much to dim text that has the DIM/FAINT attribute set. One +#: means no dimming and zero means fully dimmed (i.e. invisible). + +# selection_foreground #000000 +# selection_background #fffacd + +#: The foreground and background colors for text selected with the +#: mouse. Setting both of these to none will cause a "reverse video" +#: effect for selections, where the selection will be the cell text +#: color and the text will become the cell background color. Setting +#: only selection_foreground to none will cause the foreground color +#: to be used unchanged. Note that these colors can be overridden by +#: the program running in the terminal. + +#: The color table {{{ + +# Custom Solarized Dark +background #002b36 +foreground #9bc1c2 +cursor #93a1a1 +selection_background #657b83 +# black +color0 #586e75 +color8 #006388 +# red +color1 #d01b24 +color9 #f4153b +# green +color2 #6bbe6c +color10 #50ee84 +# yellow +color3 #a57705 +color11 #b17e28 +# blue +color4 #2075c7 +color12 #178dc7 +# magenta +color5 #c61b6e +color13 #e14d8e +# cyan +color6 #259185 +color14 #00b29e +# white +color7 #e9e2cb +color15 #fcf4dc +selection_foreground #001e26 + +mark1_foreground yellow +mark1_background black +mark2_foreground yellow +mark2_background black +mark3_foreground yellow +mark3_background black + +# Solarized Dark High Contrast +# background #001e26 +# foreground #9bc1c2 +# cursor #f34a00 +# selection_background #003747 +# color0 #002731 +# color8 #006388 +# color1 #d01b24 +# color9 #f4153b +# color2 #6bbe6c +# color10 #50ee84 +# color3 #a57705 +# color11 #b17e28 +# color4 #2075c7 +# color12 #178dc7 +# color5 #c61b6e +# color13 #e14d8e +# color6 #259185 +# color14 #00b29e +# color7 #e9e2cb +# color15 #fcf4dc +# selection_foreground #001e26 + +# Solarized Dark Patched +# background #001e26 +# foreground #708183 +# cursor #708183 +# selection_background #002731 +# color0 #002731 +# color8 #465a61 +# color1 #d01b24 +# color9 #bd3612 +# color2 #728905 +# color10 #465a61 +# color3 #a57705 +# color11 #52676f +# color4 #2075c7 +# color12 #708183 +# color5 #c61b6e +# color13 #5856b9 +# color6 #259185 +# color14 #81908f +# color7 #e9e2cb +# color15 #fcf4dc +# selection_foreground #001e26 + +#: The 256 terminal colors. There are 8 basic colors, each color has a +#: dull and bright version, for the first 16 colors. You can set the +#: remaining 240 colors as color16 to color255. + +# color0 #000000 +# color8 #767676 + +#: black + +# color1 #cc0403 +# color9 #f2201f + +#: red + +# color2 #19cb00 +# color10 #23fd00 + +#: green + +# color3 #cecb00 +# color11 #fffd00 + +#: yellow + +# color4 #0d73cc +# color12 #1a8fff + +#: blue + +# color5 #cb1ed1 +# color13 #fd28ff + +#: magenta + +# color6 #0dcdcd +# color14 #14ffff + +#: cyan + +# color7 #dddddd +# color15 #ffffff + +#: white + +# mark1_foreground black + +#: Color for marks of type 1 + +# mark1_background #98d3cb + +#: Color for marks of type 1 (light steel blue) + +# mark2_foreground black + +#: Color for marks of type 2 + +# mark2_background #f2dcd3 + +#: Color for marks of type 1 (beige) + +# mark3_foreground black + +#: Color for marks of type 3 + +# mark3_background #f274bc + +#: Color for marks of type 3 (violet) + +#: }}} + +#: }}} + +#: Advanced {{{ + +# shell . + +#: The shell program to execute. The default value of . means to use +#: whatever shell is set as the default shell for the current user. +#: Note that on macOS if you change this, you might need to add +#: --login and --interactive to ensure that the shell starts in +#: interactive mode and reads its startup rc files. + +# editor . + +#: The terminal based text editor (such as vim or nano) to use when +#: editing the kitty config file or similar tasks. + +#: The default value of . means to use the environment variables +#: VISUAL and EDITOR in that order. If these variables aren't set, +#: kitty will run your shell ($SHELL -l -i -c env) to see if your +#: shell startup rc files set VISUAL or EDITOR. If that doesn't work, +#: kitty will cycle through various known editors (vim, emacs, etc.) +#: and take the first one that exists on your system. + +# close_on_child_death no + +#: Close the window when the child process (shell) exits. With the +#: default value no, the terminal will remain open when the child +#: exits as long as there are still processes outputting to the +#: terminal (for example disowned or backgrounded processes). When +#: enabled with yes, the window will close as soon as the child +#: process exits. Note that setting it to yes means that any +#: background processes still using the terminal can fail silently +#: because their stdout/stderr/stdin no longer work. + +# allow_remote_control no + +#: Allow other programs to control kitty. If you turn this on, other +#: programs can control all aspects of kitty, including sending text +#: to kitty windows, opening new windows, closing windows, reading the +#: content of windows, etc. Note that this even works over SSH +#: connections. You can choose to either allow any program running +#: within kitty to control it with yes, or only allow programs that +#: connect to the socket (specified with the listen_on config option +#: or kitty --listen-on command line option) with the value socket- +#: only. The latter is useful if you want to prevent programs running +#: on a remote computer over SSH from controlling kitty. Reloading the +#: config will not affect this option. + +# listen_on none + +#: Listen to the specified UNIX socket for remote control connections. +#: Note that this will apply to all kitty instances. It can be +#: overridden by the kitty --listen-on command line option, which +#: supports listening on TCP socket. This option accepts only UNIX +#: sockets, such as unix:${TEMP}/mykitty or unix:@mykitty (on Linux). +#: Environment variables are expanded and relative paths are resolved +#: with respect to the temporary directory. If {kitty_pid} is present, +#: then it is replaced by the PID of the kitty process, otherwise the +#: PID of the kitty process is appended to the value, with a hyphen. +#: This option is ignored unless you also set allow_remote_control to +#: enable remote control. See the help for kitty --listen-on for more +#: details. Changing this option by reloading the config is not +#: supported. + +# env + +#: Specify the environment variables to be set in all child processes. +#: Using the name with an equal sign (e.g. env VAR=) will set it to +#: the empty string. Specifying only the name (e.g. env VAR) will +#: remove the variable from the child process' environment. Note that +#: environment variables are expanded recursively, for example:: + +#: env VAR1=a +#: env VAR2=${HOME}/${VAR1}/b + +#: The value of VAR2 will be /a/b. + +# watcher + +#: Path to python file which will be loaded for watchers +#: . Can be +#: specified more than once to load multiple watchers. The watchers +#: will be added to every kitty window. Relative paths are resolved +#: relative to the kitty config directory. Note that reloading the +#: config will only affect windows created after the reload. + +# exe_search_path + +#: Control where kitty finds the programs to run. The default search +#: order is: First search the system wide PATH, then ~/.local/bin and +#: ~/bin. If still not found, the PATH defined in the login shell +#: after sourcing all its startup files is tried. Finally, if present, +#: the PATH specified by the env option is tried. + +#: This option allows you to prepend, append, or remove paths from +#: this search order. It can be specified multiple times for multiple +#: paths. A simple path will be prepended to the search order. A path +#: that starts with the + sign will be append to the search order, +#: after ~/bin above. A path that starts with the - sign will be +#: removed from the entire search order. For example:: + +#: exe_search_path /some/prepended/path +#: exe_search_path +/some/appended/path +#: exe_search_path -/some/excluded/path + +# update_check_interval 24 + +#: The interval to periodically check if an update to kitty is +#: available (in hours). If an update is found, a system notification +#: is displayed informing you of the available update. The default is +#: to check every 24 hours, set to zero to disable. Update checking is +#: only done by the official binary builds. Distro packages or source +#: builds do not do update checking. Changing this option by reloading +#: the config is not supported. + +# startup_session none + +#: Path to a session file to use for all kitty instances. Can be +#: overridden by using the kitty --session command line option for +#: individual instances. See sessions +#: in the +#: kitty documentation for details. Note that relative paths are +#: interpreted with respect to the kitty config directory. Environment +#: variables in the path are expanded. Changing this option by +#: reloading the config is not supported. + +# clipboard_control write-clipboard write-primary read-clipboard-ask read-primary-ask + +#: Allow programs running in kitty to read and write from the +#: clipboard. You can control exactly which actions are allowed. The +#: possible actions are: write-clipboard, read-clipboard, write- +#: primary, read-primary, read-clipboard-ask, read-primary-ask. The +#: default is to allow writing to the clipboard and primary selection +#: and to ask for permission when a program tries to read from the +#: clipboard. Note that disabling the read confirmation is a security +#: risk as it means that any program, even the ones running on a +#: remote server via SSH can read your clipboard. See also +#: clipboard_max_size. + +# clipboard_max_size 64 + +#: The maximum size (in MB) of data from programs running in kitty +#: that will be stored for writing to the system clipboard. A value of +#: zero means no size limit is applied. See also clipboard_control. + +# file_transfer_confirmation_bypass + +#: The password that can be supplied to the file transfer kitten +#: to skip the +#: transfer confirmation prompt. This should only be used when +#: initiating transfers from trusted computers, over trusted networks +#: or encrypted transports, as it allows any programs running on the +#: remote machine to read/write to the local filesystem, without +#: permission. + +allow_hyperlinks yes + +#: Process hyperlink escape sequences (OSC 8). If disabled OSC 8 +#: escape sequences are ignored. Otherwise they become clickable +#: links, that you can click with the mouse or by using the hints +#: kitten . The +#: special value of ask means that kitty will ask before opening the +#: link when clicked. + +shell_integration no-cursor + +#: Enable shell integration on supported shells. This enables features +#: such as jumping to previous prompts, browsing the output of the +#: previous command in a pager, etc. on supported shells. Set to +#: disabled to turn off shell integration, completely. It is also +#: possible to disable individual features, set to a space separated +#: list of these values: no-rc, no-cursor, no-title, no-cwd, no- +#: prompt-mark, no-complete. See Shell integration +#: for details. + +# allow_cloning ask + +#: Control whether programs running in the terminal can request new +#: windows to be created. The canonical example is clone-in-kitty +#: . +#: By default, kitty will ask for permission for each clone request. +#: Allowing cloning unconditionally gives programs running in the +#: terminal (including over SSH) permission to execute arbitrary code, +#: as the user who is running the terminal, on the computer that the +#: terminal is running on. + +# clone_source_strategies venv,conda,env_var,path + +#: Control what shell code is sourced when running clone-in-kitty in +#: the newly cloned window. The supported strategies are: + +#: venv +#: Source the file $VIRTUAL_ENV/bin/activate. This is used by the +#: Python stdlib venv module and allows cloning venvs automatically. +#: conda +#: Run conda activate $CONDA_DEFAULT_ENV. This supports the virtual +#: environments created by conda. +#: env_var +#: Execute the contents of the environment variable +#: KITTY_CLONE_SOURCE_CODE with eval. +#: path +#: Source the file pointed to by the environment variable +#: KITTY_CLONE_SOURCE_PATH. + +#: This option must be a comma separated list of the above values. +#: This only source the first valid one in the above order. + +# term xterm-kitty + +# NOTE: Enable ssh login for old tmux +term xterm-256color + +#: The value of the TERM environment variable to set. Changing this +#: can break many terminal programs, only change it if you know what +#: you are doing, not because you read some advice on "Stack Overflow" +#: to change it. The TERM variable is used by various programs to get +#: information about the capabilities and behavior of the terminal. If +#: you change it, depending on what programs you run, and how +#: different the terminal you are changing it to is, various things +#: from key-presses, to colors, to various advanced features may not +#: work. Changing this option by reloading the config will only affect +#: newly created windows. + +#: }}} + +#: OS specific tweaks {{{ + +# wayland_titlebar_color system + +#: The color of the kitty window's titlebar on Wayland systems with +#: client side window decorations such as GNOME. A value of system +#: means to use the default system color, a value of background means +#: to use the background color of the currently active window and +#: finally you can use an arbitrary color, such as #12af59 or red. + +macos_titlebar_color dark + +#: The color of the kitty window's titlebar on macOS. A value of +#: system means to use the default system color, light or dark can +#: also be used to set it explicitly. A value of background means to +#: use the background color of the currently active window and finally +#: you can use an arbitrary color, such as #12af59 or red. WARNING: +#: This option works by using a hack when arbitrary color (or +#: background) is configured, as there is no proper Cocoa API for it. +#: It sets the background color of the entire window and makes the +#: titlebar transparent. As such it is incompatible with +#: background_opacity. If you want to use both, you are probably +#: better off just hiding the titlebar with hide_window_decorations. + +# macos_option_as_alt no + +#: Use the Option key as an Alt key on macOS. With this set to no, +#: kitty will use the macOS native Option+Key to enter Unicode +#: character behavior. This will break any Alt+Key keyboard shortcuts +#: in your terminal programs, but you can use the macOS Unicode input +#: technique. You can use the values: left, right or both to use only +#: the left, right or both Option keys as Alt, instead. Note that +#: kitty itself always treats Option the same as Alt. This means you +#: cannot use this option to configure different kitty shortcuts for +#: Option+Key vs. Alt+Key. Also, any kitty shortcuts using +#: Option/Alt+Key will take priority, so that any such key presses +#: will not be passed to terminal programs running inside kitty. +#: Changing this option by reloading the config is not supported. + +# macos_hide_from_tasks no + +#: Hide the kitty window from running tasks on macOS (⌘+Tab and the +#: Dock). Changing this option by reloading the config is not +#: supported. + +macos_quit_when_last_window_closed yes + +#: Have kitty quit when all the top-level windows are closed on macOS. +#: By default, kitty will stay running, even with no open windows, as +#: is the expected behavior on macOS. + +# macos_window_resizable yes + +#: Disable this if you want kitty top-level OS windows to not be +#: resizable on macOS. Changing this option by reloading the config +#: will only affect newly created OS windows. + +# macos_thicken_font 0 + +#: Draw an extra border around the font with the given width, to +#: increase legibility at small font sizes on macOS. For example, a +#: value of 0.75 will result in rendering that looks similar to sub- +#: pixel antialiasing at common font sizes. + +macos_traditional_fullscreen no + +#: Use the macOS traditional full-screen transition, that is faster, +#: but less pretty. + +# macos_show_window_title_in all + +#: Control where the window title is displayed on macOS. A value of +#: window will show the title of the currently active window at the +#: top of the macOS window. A value of menubar will show the title of +#: the currently active window in the macOS global menu bar, making +#: use of otherwise wasted space. A value of all will show the title +#: in both places, and none hides the title. See +#: macos_menubar_title_max_length for how to control the length of the +#: title in the menu bar. + +# macos_menubar_title_max_length 0 + +#: The maximum number of characters from the window title to show in +#: the macOS global menu bar. Values less than one means that there is +#: no maximum limit. + +# macos_custom_beam_cursor no + +#: Use a custom mouse cursor for macOS that is easier to see on both +#: light and dark backgrounds. Nowadays, the default macOS cursor +#: already comes with a white border. WARNING: this might make your +#: mouse cursor invisible on dual GPU machines. Changing this option +#: by reloading the config is not supported. + +# macos_colorspace srgb + +#: The colorspace in which to interpret terminal colors. The default +#: of srgb will cause colors to match those seen in web browsers. The +#: value of default will use whatever the native colorspace of the +#: display is. The value of displayp3 will use Apple's special +#: snowflake display P3 color space, which will result in over +#: saturated (brighter) colors with some color shift. Reloading +#: configuration will change this value only for newly created OS +#: windows. + +# linux_display_server auto + +#: Choose between Wayland and X11 backends. By default, an appropriate +#: backend based on the system state is chosen automatically. Set it +#: to x11 or wayland to force the choice. Changing this option by +#: reloading the config is not supported. + +#: }}} + +#: Keyboard shortcuts {{{ + +#: Keys are identified simply by their lowercase Unicode characters. +#: For example: a for the A key, [ for the left square bracket key, +#: etc. For functional keys, such as Enter or Escape, the names are +#: present at Functional key definitions +#: . For modifier keys, the names are ctrl (control, ⌃), +#: shift (⇧), alt (opt, option, ⌥), super (cmd, command, ⌘). See also: +#: GLFW mods + +#: On Linux you can also use XKB key names to bind keys that are not +#: supported by GLFW. See XKB keys +#: for a list of key names. The name to use is the part +#: after the XKB_KEY_ prefix. Note that you can only use an XKB key +#: name for keys that are not known as GLFW keys. + +#: Finally, you can use raw system key codes to map keys, again only +#: for keys that are not known as GLFW keys. To see the system key +#: code for a key, start kitty with the kitty --debug-input option, +#: kitty will output some debug text for every key event. In that text +#: look for native_code, the value of that becomes the key name in the +#: shortcut. For example: + +#: .. code-block:: none + +#: on_key_input: glfw key: 0x61 native_code: 0x61 action: PRESS mods: none text: 'a' + +#: Here, the key name for the A key is 0x61 and you can use it with:: + +#: map ctrl+0x61 something + +#: to map Ctrl+A to something. + +#: You can use the special action no_op to unmap a keyboard shortcut +#: that is assigned in the default configuration:: + +#: map kitty_mod+space no_op + +#: If you would like kitty to completely ignore a key event, not even +#: sending it to the program running in the terminal, map it to +#: discard_event:: + +#: map kitty_mod+f1 discard_event + +#: You can combine multiple actions to be triggered by a single +#: shortcut with combine action, using the syntax below:: + +#: map key combine action1 action2 action3 ... + +#: For example:: + +#: map kitty_mod+e combine : new_window : next_layout + +#: This will create a new window and switch to the next available +#: layout. + +#: You can use multi-key shortcuts with the syntax shown below:: + +#: map key1>key2>key3 action + +#: For example:: + +#: map ctrl+f>2 set_font_size 20 + +#: The full list of actions that can be mapped to key presses is +#: available here . + +# kitty_mod ctrl+shift +kitty_mod ctrl+shift + +#: Special modifier key alias for default shortcuts. You can change +#: the value of this option to alter all default shortcuts that use +#: kitty_mod. + +# clear_all_shortcuts no + +#: Remove all shortcut definitions up to this point. Useful, for +#: instance, to remove the default shortcuts. + +# action_alias + +#: E.g. action_alias launch_tab launch --type=tab --cwd=current + +#: Define action aliases to avoid repeating the same options in +#: multiple mappings. Aliases can be defined for any action and will +#: be expanded recursively. For example, the above alias allows you to +#: create mappings to launch a new tab in the current working +#: directory without duplication:: + +#: map f1 launch_tab vim +#: map f2 launch_tab emacs + +#: Similarly, to alias kitten invocation:: + +#: action_alias hints kitten hints --hints-offset=0 + +# kitten_alias + +#: E.g. kitten_alias hints hints --hints-offset=0 + +#: Like action_alias above, but specifically for kittens. Generally, +#: prefer to use action_alias. This option is a legacy version, +#: present for backwards compatibility. It causes all invocations of +#: the aliased kitten to be substituted. So the example above will +#: cause all invocations of the hints kitten to have the --hints- +#: offset=0 option applied. + +#: Clipboard {{{ + +#: Copy to clipboard + +# map kitty_mod+c copy_to_clipboard +# map cmd+c copy_to_clipboard + +#:: There is also a copy_or_interrupt action that can be optionally +#:: mapped to Ctrl+C. It will copy only if there is a selection and +#:: send an interrupt otherwise. Similarly, +#:: copy_and_clear_or_interrupt will copy and clear the selection or +#:: send an interrupt if there is no selection. + +#: Paste from clipboard + +# map kitty_mod+v paste_from_clipboard +# map cmd+v paste_from_clipboard + +#: Paste from selection + +# map kitty_mod+s paste_from_selection +# map shift+insert paste_from_selection + +#: Pass selection to program + +# map kitty_mod+o pass_selection_to_program + +#:: You can also pass the contents of the current selection to any +#:: program with pass_selection_to_program. By default, the system's +#:: open program is used, but you can specify your own, the selection +#:: will be passed as a command line argument to the program. For +#:: example:: + +#:: map kitty_mod+o pass_selection_to_program firefox + +#:: You can pass the current selection to a terminal program running +#:: in a new kitty window, by using the @selection placeholder:: + +#:: map kitty_mod+y new_window less @selection + +#: }}} + +#: Scrolling {{{ + +#: Scroll line up + +# map kitty_mod+up scroll_line_up +# map kitty_mod+k scroll_line_up +# map opt+cmd+page_up scroll_line_up +# map cmd+up scroll_line_up + +#: Scroll line down + +# map kitty_mod+down scroll_line_down +# map kitty_mod+j scroll_line_down +# map opt+cmd+page_down scroll_line_down +# map cmd+down scroll_line_down + +#: Scroll page up + +# map kitty_mod+page_up scroll_page_up +# map cmd+page_up scroll_page_up + +#: Scroll page down + +# map kitty_mod+page_down scroll_page_down +# map cmd+page_down scroll_page_down + +#: Scroll to top + +# map kitty_mod+home scroll_home +# map cmd+home scroll_home + +#: Scroll to bottom + +# map kitty_mod+end scroll_end +# map cmd+end scroll_end + +#: Scroll to previous shell prompt + +# map kitty_mod+z scroll_to_prompt -1 + +#:: Use a parameter of 0 for scroll_to_prompt to scroll to the last +#:: jumped to or the last clicked position. Requires shell +#:: integration +#:: to work. + +#: Scroll to next shell prompt + +# map kitty_mod+x scroll_to_prompt 1 + +#: Browse scrollback buffer in pager + +# map kitty_mod+h show_scrollback +map kitty_mod+h launch --stdin-source=@screen_scrollback --stdin-add-formatting less +G -R + +#:: You can pipe the contents of the current screen and history +#:: buffer as STDIN to an arbitrary program using launch --stdin- +#:: source. For example, the following opens the scrollback buffer in +#:: less in an overlay window:: + +#:: map f1 launch --stdin-source=@screen_scrollback --stdin-add-formatting --type=overlay less +G -R + +#:: For more details on piping screen and buffer contents to external +#:: programs, see launch . + +#: Browse output of the last shell command in pager + +# map kitty_mod+g show_last_command_output + +#:: You can also define additional shortcuts to get the command +#:: output. For example, to get the first command output on screen:: + +#:: map f1 show_first_command_output_on_screen + +#:: To get the command output that was last accessed by a keyboard +#:: action or mouse action:: + +#:: map f1 show_last_visited_command_output + +#:: You can pipe the output of the last command run in the shell +#:: using the launch action. For example, the following opens the +#:: output in less in an overlay window:: + +#:: map f1 launch --stdin-source=@last_cmd_output --stdin-add-formatting --type=overlay less +G -R + +#:: To get the output of the first command on the screen, use +#:: @first_cmd_output_on_screen. To get the output of the last jumped +#:: to command, use @last_visited_cmd_output. + +#:: Requires shell integration +#:: to work. + +#: }}} + +#: Window management {{{ + +#: New window + +# map kitty_mod+enter new_window +# map cmd+enter new_window + +#:: You can open a new kitty window running an arbitrary program, for +#:: example:: + +#:: map kitty_mod+y launch mutt + +#:: You can open a new window with the current working directory set +#:: to the working directory of the current window using:: + +#:: map ctrl+alt+enter launch --cwd=current + +#:: You can open a new window that is allowed to control kitty via +#:: the kitty remote control facility with launch --allow-remote- +#:: control. Any programs running in that window will be allowed to +#:: control kitty. For example:: + +#:: map ctrl+enter launch --allow-remote-control some_program + +#:: You can open a new window next to the currently active window or +#:: as the first window, with:: + +#:: map ctrl+n launch --location=neighbor +#:: map ctrl+f launch --location=first + +#:: For more details, see launch +#:: . + +#: New OS window + +# map kitty_mod+n new_os_window +# map cmd+n new_os_window + +#:: Works like new_window above, except that it opens a top-level OS +#:: window. In particular you can use new_os_window_with_cwd to open +#:: a window with the current working directory. + +#: Close window + +# map kitty_mod+w close_window +# map shift+cmd+d close_window + +#: Next window + +# map kitty_mod+] next_window + +#: Previous window + +# map kitty_mod+[ previous_window + +#: Move window forward + +# map kitty_mod+f move_window_forward + +#: Move window backward + +# map kitty_mod+b move_window_backward + +#: Move window to top + +# map kitty_mod+` move_window_to_top + +#: Start resizing window + +# map kitty_mod+r start_resizing_window +# map cmd+r start_resizing_window + +#: First window + +# map kitty_mod+1 first_window +# map cmd+1 first_window + +#: Second window + +# map kitty_mod+2 second_window +# map cmd+2 second_window + +#: Third window + +# map kitty_mod+3 third_window +# map cmd+3 third_window + +#: Fourth window + +# map kitty_mod+4 fourth_window +# map cmd+4 fourth_window + +#: Fifth window + +# map kitty_mod+5 fifth_window +# map cmd+5 fifth_window + +#: Sixth window + +# map kitty_mod+6 sixth_window +# map cmd+6 sixth_window + +#: Seventh window + +# map kitty_mod+7 seventh_window +# map cmd+7 seventh_window + +#: Eight window + +# map kitty_mod+8 eighth_window +# map cmd+8 eighth_window + +#: Ninth window + +# map kitty_mod+9 ninth_window +# map cmd+9 ninth_window + +#: Tenth window + +map kitty_mod+0 tenth_window +# map cmd+0 tenth_window + +#: Visually select and focus window + +# map kitty_mod+f7 focus_visible_window + +#:: Display overlay numbers and alphabets on the window, and switch +#:: the focus to the window when you press the key. When there are +#:: only two windows, the focus will be switched directly without +#:: displaying the overlay. You can change the overlay characters and +#:: their order with option visual_window_select_characters. + +#: Visually swap window with another + +# map kitty_mod+f8 swap_with_window + +#:: Works like focus_visible_window above, but swaps the window. + +#: }}} + +#: Tab management {{{ + +#: Next tab + +# map kitty_mod+right next_tab +# map shift+cmd+] next_tab +# map ctrl+tab next_tab + +#: Previous tab + +# map kitty_mod+left previous_tab +# map shift+cmd+[ previous_tab +# map ctrl+shift+tab previous_tab + +#: New tab + +# map kitty_mod+t new_tab +# map cmd+t new_tab + +#: Close tab + +# map kitty_mod+q close_tab +# map cmd+w close_tab + +#: Close OS window + +# map shift+cmd+w close_os_window + +#: Move tab forward + +# map kitty_mod+. move_tab_forward + +#: Move tab backward + +# map kitty_mod+, move_tab_backward + +#: Set tab title + +# map kitty_mod+alt+t set_tab_title +# map shift+cmd+i set_tab_title + + +#: You can also create shortcuts to go to specific tabs, with 1 being +#: the first tab, 2 the second tab and -1 being the previously active +#: tab, and any number larger than the last tab being the last tab:: + +#: map ctrl+alt+1 goto_tab 1 +#: map ctrl+alt+2 goto_tab 2 + +map alt+1 goto_tab 1 +map alt+2 goto_tab 2 +map alt+3 goto_tab 3 +map alt+4 goto_tab 4 +map alt+5 goto_tab 5 +map alt+6 goto_tab 6 +map alt+7 goto_tab 7 +map alt+8 goto_tab 8 +map alt+9 goto_tab 9 + +#: Just as with new_window above, you can also pass the name of +#: arbitrary commands to run when using new_tab and new_tab_with_cwd. +#: Finally, if you want the new tab to open next to the current tab +#: rather than at the end of the tabs list, use:: + +#: map ctrl+t new_tab !neighbor [optional cmd to run] +#: }}} + +#: Layout management {{{ + +#: Next layout + +# map kitty_mod+l next_layout + + +#: You can also create shortcuts to switch to specific layouts:: + +#: map ctrl+alt+t goto_layout tall +#: map ctrl+alt+s goto_layout stack + +#: Similarly, to switch back to the previous layout:: + +#: map ctrl+alt+p last_used_layout + +#: There is also a toggle_layout action that switches to the named +#: layout or back to the previous layout if in the named layout. +#: Useful to temporarily "zoom" the active window by switching to the +#: stack layout:: + +#: map ctrl+alt+z toggle_layout stack +#: }}} + +#: Font sizes {{{ + +#: You can change the font size for all top-level kitty OS windows at +#: a time or only the current one. + +#: Increase font size + +# map kitty_mod+equal change_font_size all +2.0 +# map kitty_mod+plus change_font_size all +2.0 +# map kitty_mod+kp_add change_font_size all +2.0 +# map cmd+plus change_font_size all +2.0 +# map cmd+equal change_font_size all +2.0 +# map shift+cmd+equal change_font_size all +2.0 + +#: Decrease font size + +# map kitty_mod+minus change_font_size all -2.0 +# map kitty_mod+kp_subtract change_font_size all -2.0 +# map cmd+minus change_font_size all -2.0 +# map shift+cmd+minus change_font_size all -2.0 + +#: Reset font size + +# map kitty_mod+backspace change_font_size all 0 +# map cmd+0 change_font_size all 0 + + +#: To setup shortcuts for specific font sizes:: + +#: map kitty_mod+f6 change_font_size all 10.0 + +#: To setup shortcuts to change only the current OS window's font +#: size:: + +#: map kitty_mod+f6 change_font_size current 10.0 +#: }}} + +#: Select and act on visible text {{{ + +#: Use the hints kitten to select text and either pass it to an +#: external program or insert it into the terminal or copy it to the +#: clipboard. + +#: Open URL + +# map kitty_mod+e open_url_with_hints + +#:: Open a currently visible URL using the keyboard. The program used +#:: to open the URL is specified in open_url_with. + +#: Insert selected path + +# map kitty_mod+p>f kitten hints --type path --program - + +#:: Select a path/filename and insert it into the terminal. Useful, +#:: for instance to run git commands on a filename output from a +#:: previous git command. + +#: Open selected path + +# map kitty_mod+p>shift+f kitten hints --type path + +#:: Select a path/filename and open it with the default open program. + +#: Insert selected line + +# map kitty_mod+p>l kitten hints --type line --program - + +#:: Select a line of text and insert it into the terminal. Useful for +#:: the output of things like: `ls -1`. + +#: Insert selected word + +# map kitty_mod+p>w kitten hints --type word --program - + +#:: Select words and insert into terminal. + +#: Insert selected hash + +# map kitty_mod+p>h kitten hints --type hash --program - + +#:: Select something that looks like a hash and insert it into the +#:: terminal. Useful with git, which uses SHA1 hashes to identify +#:: commits. + +#: Open the selected file at the selected line + +# map kitty_mod+p>n kitten hints --type linenum + +#:: Select something that looks like filename:linenum and open it in +#:: vim at the specified line number. + +#: Open the selected hyperlink + +# map kitty_mod+p>y kitten hints --type hyperlink + +#:: Select a hyperlink (i.e. a URL that has been marked as such by +#:: the terminal program, for example, by `ls --hyperlink=auto`). + + +#: The hints kitten has many more modes of operation that you can map +#: to different shortcuts. For a full description see hints kitten +#: . +#: }}} + +#: Miscellaneous {{{ + +#: Toggle fullscreen + +# map kitty_mod+f11 toggle_fullscreen +# map ctrl+cmd+f toggle_fullscreen + +#: Toggle maximized + +# map kitty_mod+f10 toggle_maximized + +#: Toggle macOS secure keyboard entry + +# map opt+cmd+s toggle_macos_secure_keyboard_entry + +#: Unicode input + +# map kitty_mod+u kitten unicode_input +# map ctrl+cmd+space kitten unicode_input + +#: Edit config file + +# map kitty_mod+f2 edit_config_file +# map cmd+, edit_config_file + +#: Open the kitty command shell + +# map kitty_mod+escape kitty_shell window + +#:: Open the kitty shell in a new window / tab / overlay / os_window +#:: to control kitty using commands. + +#: Increase background opacity + +# map kitty_mod+a>m set_background_opacity +0.1 + +#: Decrease background opacity + +# map kitty_mod+a>l set_background_opacity -0.1 + +#: Make background fully opaque + +# map kitty_mod+a>1 set_background_opacity 1 + +#: Reset background opacity + +# map kitty_mod+a>d set_background_opacity default + +#: Reset the terminal + +# map kitty_mod+delete clear_terminal reset active +# map opt+cmd+r clear_terminal reset active + +#:: You can create shortcuts to clear/reset the terminal. For +#:: example:: + +#:: # Reset the terminal +#:: map f1 clear_terminal reset active +#:: # Clear the terminal screen by erasing all contents +#:: map f1 clear_terminal clear active +#:: # Clear the terminal scrollback by erasing it +#:: map f1 clear_terminal scrollback active +#:: # Scroll the contents of the screen into the scrollback +#:: map f1 clear_terminal scroll active +#:: # Clear everything up to the line with the cursor +#:: map f1 clear_terminal to_cursor active + +#:: If you want to operate on all kitty windows instead of just the +#:: current one, use all instead of active. + +#:: It is also possible to remap Ctrl+L to both scroll the current +#:: screen contents into the scrollback buffer and clear the screen, +#:: instead of just clearing the screen, for example, for ZSH add the +#:: following to ~/.zshrc: + +#:: .. code-block:: zsh + +#:: scroll-and-clear-screen() { +#:: printf '\n%.0s' {1..$LINES} +#:: zle clear-screen +#:: } +#:: zle -N scroll-and-clear-screen +#:: bindkey '^l' scroll-and-clear-screen + +#: Clear up to cursor line + +# map cmd+k clear_terminal to_cursor active + +#: Reload kitty.conf + +# map kitty_mod+f5 load_config_file +# map ctrl+cmd+, load_config_file + +#:: Reload kitty.conf, applying any changes since the last time it +#:: was loaded. Note that a handful of options cannot be dynamically +#:: changed and require a full restart of kitty. Particularly, when +#:: changing shortcuts for actions located on the macOS global menu +#:: bar, a full restart is needed. You can also map a keybinding to +#:: load a different config file, for example:: + +#:: map f5 load_config /path/to/alternative/kitty.conf + +#:: Note that all options from the original kitty.conf are discarded, +#:: in other words the new configuration *replace* the old ones. + +#: Debug kitty configuration + +# map kitty_mod+f6 debug_config +# map opt+cmd+, debug_config + +#:: Show details about exactly what configuration kitty is running +#:: with and its host environment. Useful for debugging issues. + +#: Send arbitrary text on key presses + +# Jump to the begining and end of line +map alt+left send_text all \x01 +map alt+right send_text all \x05 + +#:: E.g. map ctrl+shift+alt+h send_text all Hello World + +#:: You can tell kitty to send arbitrary (UTF-8) encoded text to the +#:: client program when pressing specified shortcut keys. For +#:: example:: + +#:: map ctrl+alt+a send_text all Special text + +#:: This will send "Special text" when you press the Ctrl+Alt+A key +#:: combination. The text to be sent is a python string literal so +#:: you can use escapes like \x1b to send control codes or \u21fb to +#:: send Unicode characters (or you can just input the Unicode +#:: characters directly as UTF-8 text). You can use `kitty +kitten +#:: show_key` to get the key escape codes you want to emulate. + +#:: The first argument to send_text is the keyboard modes in which to +#:: activate the shortcut. The possible values are normal, +#:: application, kitty or a comma separated combination of them. The +#:: modes normal and application refer to the DECCKM cursor key mode +#:: for terminals, and kitty refers to the kitty extended keyboard +#:: protocol. The special value all means all of them. + +#:: Some more examples:: + +#:: # Output a word and move the cursor to the start of the line (like typing and pressing Home) +#:: map ctrl+alt+a send_text normal Word\x1b[H +#:: map ctrl+alt+a send_text application Word\x1bOH +#:: # Run a command at a shell prompt (like typing the command and pressing Enter) +#:: map ctrl+alt+a send_text normal,application some command with arguments\r + +#: Open kitty Website + +# map shift+cmd+/ open_url https://sw.kovidgoyal.net/kitty/ + +#: }}} + +#: }}} diff --git a/config/kitty/linux.conf b/config/kitty/linux.conf new file mode 100644 index 0000000..6685437 --- /dev/null +++ b/config/kitty/linux.conf @@ -0,0 +1,8 @@ +include base.conf + +font_family Hack +bold_font Hack Bold +italic_font Hack Italic +bold_italic_font Hack Bold Italic + +font_size 11.0 diff --git a/config/kitty/macos.conf b/config/kitty/macos.conf new file mode 100644 index 0000000..be5fcc7 --- /dev/null +++ b/config/kitty/macos.conf @@ -0,0 +1,8 @@ +include base.conf + +font_family Hack Nerd Font Mono +bold_font Hack Nerd Font Mono Bold +italic_font Hack Nerd Font Mono Italic +bold_italic_font Hack Nerd Font Mono Bold Italic + +font_size 14.0 diff --git a/config/maven/settings-aliyun.xml b/config/maven/settings-aliyun.xml new file mode 100644 index 0000000..2d2d6a5 --- /dev/null +++ b/config/maven/settings-aliyun.xml @@ -0,0 +1,68 @@ + + + + + + + /home/ezio/.m2/repository + + + alimaven + central + aliyun maven + https://maven.aliyun.com/repository/central + + + aliyunmaven + * + 阿里云公共仓库 + https://maven.aliyun.com/repository/public + + + alimaven + aliyun maven + http://maven.aliyun.com/nexus/content/groups/public/ + central + + + central + Maven Repository Switchboard + http://repo1.maven.org/maven2/ + central + + + repo2 + central + Human Readable Name for this Mirror. + http://repo2.maven.org/maven2/ + + + ibiblio + central + Human Readable Name for this Mirror. + http://mirrors.ibiblio.org/pub/mirrors/maven2/ + + + jboss-public-repository-group + central + JBoss Public Repository Group + http://repository.jboss.org/nexus/content/groups/public + + + google-maven-central + Google Maven Central + https://maven-central.storage.googleapis.com + + central + + + + maven.net.cn + oneof the central mirrors in china + http://maven.net.cn/content/groups/public/ + central + + + diff --git a/config/mysql/mariadb.service b/config/mysql/mariadb.service new file mode 100644 index 0000000..cd30497 --- /dev/null +++ b/config/mysql/mariadb.service @@ -0,0 +1,175 @@ +# It's not recommended to modify this file in-place, because it will be +# overwritten during package upgrades. If you want to customize, the +# best way is to create a file "/etc/systemd/system/mariadb.service", +# containing +# .include /usr/lib/systemd/system/mariadb.service +# ...make your changes here... +# or create a file "/etc/systemd/system/mariadb.service.d/foo.conf", +# which doesn't need to include ".include" call and which will be parsed +# after the file mariadb.service itself is parsed. +# +# For more info about custom unit files, see systemd.unit(5) or +# https://mariadb.com/kb/en/mariadb/systemd/ +# +# Copyright notice: +# +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +[Unit] +Description=MariaDB 10.9.2 database server +Documentation=man:mariadbd(8) +Documentation=https://mariadb.com/kb/en/library/systemd/ +After=network.target + +[Install] +WantedBy=multi-user.target + + +[Service] + +############################################################################## +## Core requirements +## + +Type=notify + +# Setting this to true can break replication and the Type=notify settings +# See also bind-address mariadbd option. +PrivateNetwork=false + +############################################################################## +## Package maintainers +## + +User=mysql +Group=mysql + +# CAP_IPC_LOCK To allow memlock to be used as non-root user +# CAP_DAC_OVERRIDE To allow auth_pam_tool (which is SUID root) to read /etc/shadow when it's chmod 0 +# does nothing for non-root, not needed if /etc/shadow is u+r +# CAP_AUDIT_WRITE auth_pam_tool needs it on Debian for whatever reason +CapabilityBoundingSet=CAP_IPC_LOCK CAP_DAC_OVERRIDE CAP_AUDIT_WRITE + +# PrivateDevices=true implies NoNewPrivileges=true and +# SUID auth_pam_tool suddenly doesn't do setuid anymore +PrivateDevices=false + +# Prevent writes to /usr, /boot, and /etc +ProtectSystem=full + +# Database dir: '/var/lib/mysql' should be writable even +# ProtectSystem=full prevents it +ReadWritePaths=-/data/mysql + + +# Doesn't yet work properly with SELinux enabled +# NoNewPrivileges=true + +# Prevent accessing /home, /root and /run/user +ProtectHome=true + +# Execute pre and post scripts as root, otherwise it does it as User= +PermissionsStartOnly=true + + + +# Perform automatic wsrep recovery. When server is started without wsrep, +# galera_recovery simply returns an empty string. In any case, however, +# the script is not expected to return with a non-zero status. +# It is always safe to unset _WSREP_START_POSITION environment variable. +# Do not panic if galera_recovery script is not available. (MDEV-10538) +ExecStartPre=/bin/sh -c "systemctl unset-environment _WSREP_START_POSITION" +ExecStartPre=/bin/sh -c "[ ! -e /usr/bin/galera_recovery ] && VAR= || \ + VAR=`cd /usr/bin/..; /usr/bin/galera_recovery`; [ $? -eq 0 ] \ + && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1" + +# Needed to create system tables etc. +# ExecStartPre=/usr/bin/mysql_install_db -u mysql + +# Start main service +# MYSQLD_OPTS here is for users to set in /etc/systemd/system/mariadb.service.d/MY_SPECIAL.conf +# Use the [Service] section and Environment="MYSQLD_OPTS=...". +# This isn't a replacement for my.cnf. +# _WSREP_NEW_CLUSTER is for the exclusive use of the script galera_new_cluster +ExecStart=/usr/bin/mariadbd $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION + +# Unset _WSREP_START_POSITION environment variable. +ExecStartPost=/bin/sh -c "systemctl unset-environment _WSREP_START_POSITION" + + + +KillSignal=SIGTERM + +# Don't want to see an automated SIGKILL ever +SendSIGKILL=no + +# Restart crashed server only, on-failure would also restart, for example, when +# my.cnf contains unknown option +Restart=on-abort +RestartSec=5s + +UMask=007 + +############################################################################## +## USERs can override +## +## +## by creating a file in /etc/systemd/system/mariadb.service.d/MY_SPECIAL.conf +## and adding/setting the following under [Service] will override this file's +## settings. + +# Useful options not previously available in [mysqld_safe] + +# Kernels like killing mariadbd when out of memory because its big. +# Lets temper that preference a little. +# OOMScoreAdjust=-600 + +# Explicitly start with high IO priority +# BlockIOWeight=1000 + +# If you don't use the /tmp directory for SELECT ... OUTFILE and +# LOAD DATA INFILE you can enable PrivateTmp=true for a little more security. +PrivateTmp=true + +# Set an explicit Start and Stop timeout of 900 seconds (15 minutes!) +# this is the same value as used in SysV init scripts in the past +# Galera might need a longer timeout, check the KB if you want to change this: +# https://mariadb.com/kb/en/library/systemd/#configuring-the-systemd-service-timeout +TimeoutStartSec=900 +TimeoutStopSec=900 + +## +## Options previously available to be set via [mysqld_safe] +## that now needs to be set by systemd config files as mysqld_safe +## isn't executed. +## + +# Number of files limit. previously [mysqld_safe] open-files-limit +LimitNOFILE=32768 + +# Maximium core size. previously [mysqld_safe] core-file-size +# LimitCore= + +# Nice priority. previously [mysqld_safe] nice +# Nice=-5 + +# Timezone. previously [mysqld_safe] timezone +# Environment="TZ=UTC" + +# Library substitutions. previously [mysqld_safe] malloc-lib with explicit paths +# (in LD_LIBRARY_PATH) and library name (in LD_PRELOAD). +# Environment="LD_LIBRARY_PATH=/path1 /path2" "LD_PRELOAD= +Environment="LD_PRELOAD=/usr/lib/libjemalloc.so" + +# Flush caches. previously [mysqld_safe] flush-caches=1 +# ExecStartPre=sync +# ExecStartPre=sysctl -q -w vm.drop_caches=3 + +# numa-interleave=1 equalivant +# Change ExecStart=numactl --interleave=all /usr/bin/mariadbd...... + +# crash-script equalivent +# FailureAction= diff --git a/config/mysql/my.cnf b/config/mysql/my.cnf new file mode 100644 index 0000000..b305c41 --- /dev/null +++ b/config/mysql/my.cnf @@ -0,0 +1,36 @@ +# For advice on how to change settings please see +# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html + +[mysqld] +# +# Remove leading # and set to the amount of RAM for the most important data +# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. +# innodb_buffer_pool_size = 128M +# +# Remove leading # to turn on a very important data integrity option: logging +# changes to the binary log between backups. +# log_bin +# +# Remove leading # to set options mainly useful for reporting servers. +# The server defaults are faster for transactions and fast SELECTs. +# Adjust sizes as needed, experiment to find the optimal values. +# join_buffer_size = 128M +# sort_buffer_size = 2M +# read_rnd_buffer_size = 2M +datadir=/var/lib/mysql +socket=/var/lib/mysql/mysql.sock + +# Disabling symbolic-links is recommended to prevent assorted security risks +symbolic-links=0 + +log-error=/var/log/mysqld.log +pid-file=/var/run/mysqld/mysqld.pid + +# +skip-grant-tables + +bind-address = 0.0.0.0 +port = 8306 + +[client] +socket=/var/lib/mysql/mysql.sock diff --git a/config/mysql/my56.cnf b/config/mysql/my56.cnf new file mode 100644 index 0000000..7db2e19 --- /dev/null +++ b/config/mysql/my56.cnf @@ -0,0 +1,41 @@ +# For advice on how to change settings please see +# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html + +[mysqld] + +# Remove leading # and set to the amount of RAM for the most important data +# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. +# innodb_buffer_pool_size = 128M + +# Remove leading # to turn on a very important data integrity option: logging +# changes to the binary log between backups. +# log_bin + +# These are commonly set, remove the # and set as required. +# basedir = /home/work/.local/mysql +datadir = /data/work/.local/var/lib/mysql +log_bin=mysql-bin +binlog_format=Row +port = 8306 +server_id = 1 +socket = /data/work/.local/var/run/mysqld/mysql.sock + +# Remove leading # to set options mainly useful for reporting servers. +# The server defaults are faster for transactions and fast SELECTs. +# Adjust sizes as needed, experiment to find the optimal values. +# join_buffer_size = 128M +# sort_buffer_size = 2M +# read_rnd_buffer_size = 2M + +character-set-server = utf8mb4 +collation-server = utf8mb4_unicode_ci +init_connect='SET NAMES utf8mb4' +skip-character-set-client-handshake = true +# skip-grant-tables + +[client] +default-character-set=utf8mb4 + +[mysql] +default-character-set = utf8mb4 +sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES diff --git a/config/mysql/my57-dev.cnf b/config/mysql/my57-dev.cnf new file mode 100644 index 0000000..90405cf --- /dev/null +++ b/config/mysql/my57-dev.cnf @@ -0,0 +1,64 @@ +# For advice on how to change settings please see +# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html + +[mysqld] + +# Remove leading # and set to the amount of RAM for the most important data +# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. +# innodb_buffer_pool_size = 128M + +# Remove leading # to turn on a very important data integrity option: logging +# changes to the binary log between backups. +# log_bin + +# These are commonly set, remove the # and set as required. +basedir = /home/work/.local/mysql-5.7.24 +datadir = /data/work/.local/var/lib/mysql57 +plugin-dir = /data/work/.local/mysql-5.7.24/lib/plugin +# user = work +log-error = /data/work/.local/var/log/mysql57/mysqld.log +pid-file = /data/work/.local/var/lib/mysql57/your.machine.com.mysql57.pid +port = 3306 +socket = /data/work/.local/var/lib/mysql57/mysql.sock +server_id = 1 + +# disable ssl encryption +skip-ssl + +# Remove leading # to set options mainly useful for reporting servers. +# The server defaults are faster for transactions and fast SELECTs. +# Adjust sizes as needed, experiment to find the optimal values. +# join_buffer_size = 128M +# sort_buffer_size = 2M +# read_rnd_buffer_size = 2M + +character-set-server = utf8mb4 +collation-server = utf8mb4_unicode_ci +init_connect='SET NAMES utf8mb4' +# skip-character-set-client-handshake = true +default-storage-engine = InnoDB + +# 对于mysql服务器最大连接数值的设置范围比较理想的是:服务器响应的最大连接数值占服务器上限连接数值的比例值在10%以上,如果在10%以下,说明mysql服务器最大连接上限值设置过高。 +max_connections = 200 +max_user_connections = 100 +max_allowed_packet = 256M + +[client] +default-character-set=utf8mb4 +socket = /data/work/.local/var/lib/mysql57/mysql.sock + +[mysql] +sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES +socket = /data/work/.local/var/lib/mysql57/mysql.sock + +[mysqld_safe] +socket = /data/work/.local/var/lib/mysql57/mysql.sock +pid-file = /data/work/.local/var/lib/mysql57/your.machine.com.mysql57.pid +default-character-set = utf8mb4 + +[mysqldump] +# 开启快速导出 +quick +default-character-set = utf8mb4 +max_allowed_packet = 256M + diff --git a/config/mysql/mycli b/config/mysql/mycli new file mode 100755 index 0000000..a346f50 --- /dev/null +++ b/config/mysql/mycli @@ -0,0 +1,3 @@ +#!/bin/bash + +$HOME/.virtualenvs/mycli/bin/mycli $* diff --git a/config/mysql/myclirc b/config/mysql/myclirc new file mode 100644 index 0000000..f35caaa --- /dev/null +++ b/config/mysql/myclirc @@ -0,0 +1,189 @@ +# vi: ft=dosini +[main] + +# Enables context sensitive auto-completion. If this is disabled the all +# possible completions will be listed. +smart_completion = True + +# Multi-line mode allows breaking up the sql statements into multiple lines. If +# this is set to True, then the end of the statements must have a semi-colon. +# If this is set to False then sql statements can't be split into multiple +# lines. End of line (return) is considered as the end of the statement. +multi_line = True + +# Destructive warning mode will alert you before executing a sql statement +# that may cause harm to the database such as "drop table", "drop database" +# or "shutdown". +destructive_warning = True + +# log_file location. +log_file = ~/.cache/mycli/mycli.log + +# Default log level. Possible values: "CRITICAL", "ERROR", "WARNING", "INFO" +# and "DEBUG". "NONE" disables logging. +log_level = INFO + +# Log every query and its results to a file. Enable this by uncommenting the +# line below. +audit_log = ~/.cache/mycli/mycli-audit.log + +# Timing of sql statments and table rendering. +timing = True + +# Table format. Possible values: ascii, double, github, +# psql, plain, simple, grid, fancy_grid, pipe, orgtbl, rst, mediawiki, html, +# latex, latex_booktabs, textile, moinmoin, jira, vertical, tsv, csv. +# Recommended: ascii +table_format = simple + +# Syntax coloring style. Possible values (many support the "-dark" suffix): +# manni, igor, xcode, vim, autumn, vs, rrt, native, perldoc, borland, tango, emacs, +# friendly, monokai, paraiso, colorful, murphy, bw, pastie, paraiso, trac, default, +# fruity. +# Screenshots at http://mycli.net/syntax +# Can be further modified in [colors] +syntax_style = monokai + +# Keybindings: Possible values: emacs, vi. +# Emacs mode: Ctrl-A is home, Ctrl-E is end. All emacs keybindings are available in the REPL. +# When Vi mode is enabled you can use modal editing features offered by Vi in the REPL. +key_bindings = emacs + +# Enabling this option will show the suggestions in a wider menu. Thus more items are suggested. +wider_completion_menu = True + +# MySQL prompt +# \D - The full current date +# \d - Database name +# \h - Hostname of the server +# \m - Minutes of the current time +# \n - Newline +# \P - AM/PM +# \p - Port +# \R - The current time, in 24-hour military time (0–23) +# \r - The current time, standard 12-hour time (1–12) +# \s - Seconds of the current time +# \t - Product type (Percona, MySQL, MariaDB) +# \A - DSN alias name (from the [alias_dsn] section) +# \u - Username +# \x1b[...m - insert ANSI escape sequence +# prompt = '\x1b[1;33m[\x1b[1;31m\t \x1b[32m\u\x1b[37m@\x1b[34m\h:\x1b[36m\p\x1b[31m/\d\x1b[1;33m] \x1b[35m➜ ' +prompt = '\x1b[37m# \x1b[1;33m\t \x1b[32m\u\x1b[37m@\x1b[34m\h\x1b[37m:\x1b[36m\p\x1b[37m/\x1b[31m\d \x1b[35m➜ ' +prompt_continuation = ' ' + +# \x1b[0m 所有属性重设为默认值,通常出现在一串指令的最后 +# \x1b[1m 设置粗体,高亮 +# \x1b[2m 设置亮度减半(用一种颜色模拟另一种颜色) +# \x1b[4m 设置下划线,下划线的颜色由”\x1b]…“设置 +# \x1b[5m 设置闪烁 +# \x1b[7m 设置反显,前景色与背景色交换(字体颜色与背景颜色) +# \x1b[8m 隐藏,前景色与背景色同色 +# \x1b[9m 设置删除线(示例效果:谁也逃不过王境泽定律 ) +# \x1b[10m 重设选定映像,显示控制标记,反转元素标记 +# \x1b[11m 选择空映像,设置显示控制标记,重设反转标记. +# \x1b[12m 选择空映像,设置显示控制标记,重设反转标记.(在完成映像表转换之前反转标记引起每一字节的高位反转.) +# \x1b[21m 设置正常亮度(与ECMA-48 不兼容) +# \x1b[22m 设置正常亮度 +# \x1b[24m 关闭下划线 +# \x1b[25m 关闭闪烁 +# \x1b[27m 关闭反显 +# \x1b[28m 关闭影藏 +# \x1b[29m 关闭删除线 +# \x1b[30-37m 30:黑色前景;31:红色前景;32:绿色前景;33:棕色前景;34:蓝色前景;35:品红前景;36:孔雀蓝前景;37:白色前景 +# \x1b[38m 设置RGB前景色 +# \x1b[39m 设置默认前景色 +# \x1b[40-47m 40:黑色背景;41:红色背景;42:绿色背景;43:棕色背景;44:蓝色背景;45:品红背景;46:孔雀蓝背景;47:白色背景 +# \x1b[48m 设置RGB背景色 +# \x1b[53m 设置上划线 +# \x1b[55m 关闭上划线 +# \x1b[90-97m 设置前景色,颜色同30-37,亮度提升 +# \x1b[100-107m 设置背景色,颜色同41-47,亮度提升 +# +# SGR指令能够在一条指令中添加多个属性,例如\x1b[5;9;30;41m 即为设置闪烁,下划线,黑色字体红色背景。 +# 在Xterm, KDE 的konsole,以及支持libvte的终端上支持如下指令: +# \x1b[38;2;r;g;bm 选择RGB前景色 +# \x1b[48;2;r;g;bm 选择RGB背景色 + +# Skip intro info on startup and outro info on exit +less_chatty = False + +# Use alias from --login-path instead of host name in prompt +login_path_as_host = False + +# Cause result sets to be displayed vertically if they are too wide for the current window, +# and using normal tabular format otherwise. (This applies to statements terminated by ; or \G.) +auto_vertical_output = False + +# keyword casing preference. Possible values "lower", "upper", "auto" +keyword_casing = auto + +# disabled pager on startup +enable_pager = False + +# Custom colors for the completion menu, toolbar, etc. +[colors] +completion-menu.completion.current = 'bg:#ffffff #000000' +completion-menu.completion = 'bg:#008888 #ffffff' +completion-menu.meta.completion.current = 'bg:#44aaaa #000000' +completion-menu.meta.completion = 'bg:#448888 #ffffff' +completion-menu.multi-column-meta = 'bg:#aaffff #000000' +scrollbar.arrow = 'bg:#003333' +scrollbar = 'bg:#00aaaa' +selected = '#ffffff bg:#6666aa' +search = '#ffffff bg:#4444aa' +search.current = '#ffffff bg:#44aa44' +bottom-toolbar = 'bg:#222222 #aaaaaa' +bottom-toolbar.off = 'bg:#222222 #888888' +bottom-toolbar.on = 'bg:#222222 #ffffff' +search-toolbar = 'noinherit bold' +search-toolbar.text = 'nobold' +system-toolbar = 'noinherit bold' +arg-toolbar = 'noinherit bold' +arg-toolbar.text = 'nobold' +bottom-toolbar.transaction.valid = 'bg:#222222 #00ff5f bold' +bottom-toolbar.transaction.failed = 'bg:#222222 #ff005f bold' + +# style classes for colored table output +output.header = "#00ff5f bold" +output.odd-row = "" +output.even-row = "" +output.null = "#808080" + +# SQL syntax highlighting overrides +sql.comment = 'italic #408080' +# sql.comment.multi-line = '' +# sql.comment.single-line = '' +# sql.comment.optimizer-hint = '' +# sql.escape = 'border:#FF0000' +# sql.keyword = 'bold #008000' +# sql.datatype = 'nobold #B00040' +# sql.literal = '' +# sql.literal.date = '' +# sql.symbol = '' +# sql.quoted-schema-object = '' +# sql.quoted-schema-object.escape = '' +# sql.constant = '#880000' +# sql.function = '#0000FF' +# sql.variable = '#19177C' +# sql.number = '#666666' +# sql.number.binary = '' +# sql.number.float = '' +# sql.number.hex = '' +# sql.number.integer = '' +# sql.operator = '#666666' +# sql.punctuation = '' +# sql.string = '#BA2121' +# sql.string.double-quouted = '' +# sql.string.escape = 'bold #BB6622' +# sql.string.single-quoted = '' +# sql.whitespace = '' + +# Favorite queries. +[favorite_queries] + +# Use the -d option to reference a DSN. +# Special characters in passwords and other strings can be escaped with URL encoding. +[alias_dsn] +# example_dsn = mysql://[user[:password]@][host][:port][/dbname] +local = mysql://admin@127.0.0.1:3306/test + diff --git a/config/nodejs/get_nodejs.sh b/config/nodejs/get_nodejs.sh new file mode 100644 index 0000000..9fa1584 --- /dev/null +++ b/config/nodejs/get_nodejs.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +echo 'First, make npm dir for current user...' +mkdir -p -v $HOME/.local/npm/lib/node_modules $HOME/.local/npm/bin + +echo 'Then, install nodejs-lts and npm...' +yay -S nodejs-lts-dubnium npm + +echo 'Last, set npm install prefix' +npm config set prefix "$HOME/.local/npm" +npm config set registry https://registry.npm.taobao.org + +echo 'Install create-react-app...' +cnpm install -g create-react-app diff --git a/config/nodejs/npm.md b/config/nodejs/npm.md new file mode 100644 index 0000000..ee461cc --- /dev/null +++ b/config/nodejs/npm.md @@ -0,0 +1,25 @@ +# npm config + +使用系统 npm 目录会报权限错误,建议使用自定义的目录。 + +```bash +export NODE_PATH="$NODE_PATH:$HOME/.local/npm/lib/node_modules" +export PATH=$HOME/.local/npm/bin:$PATH +``` + +由于npm 安装太慢,所以使用cnmp。 + +```bash +npm install -g cnpm --registry=https://registry.npm.taobao.org +npm config set registry https://registry.npm.taobao.org +``` + +使用cnmp安装react + +```bash +cnpm install -g create-react-app +create-react-app my-app +cd my-app/ +npm start +``` + diff --git a/config/nushell/config.nu b/config/nushell/config.nu new file mode 100644 index 0000000..48f0552 --- /dev/null +++ b/config/nushell/config.nu @@ -0,0 +1,578 @@ +# Nushell Config File + +module completions { + # Custom completions for external commands (those outside of Nushell) + # Each completions has two parts: the form of the external command, including its flags and parameters + # and a helper command that knows how to complete values for those flags and parameters + # + # This is a simplified version of completions for git branches and git remotes + def "nu-complete git branches" [] { + ^git branch | lines | each { |line| $line | str replace '[\*\+] ' '' | str trim } + } + + def "nu-complete git remotes" [] { + ^git remote | lines | each { |line| $line | str trim } + } + + export extern "git checkout" [ + branch?: string@"nu-complete git branches" # name of the branch to checkout + -b: string # create and checkout a new branch + -B: string # create/reset and checkout a branch + -l # create reflog for new branch + --guess # second guess 'git checkout ' (default) + --overlay # use overlay mode (default) + --quiet(-q) # suppress progress reporting + --recurse-submodules: string # control recursive updating of submodules + --progress # force progress reporting + --merge(-m) # perform a 3-way merge with the new branch + --conflict: string # conflict style (merge or diff3) + --detach(-d) # detach HEAD at named commit + --track(-t) # set upstream info for new branch + --force(-f) # force checkout (throw away local modifications) + --orphan: string # new unparented branch + --overwrite-ignore # update ignored files (default) + --ignore-other-worktrees # do not check if another worktree is holding the given ref + --ours(-2) # checkout our version for unmerged files + --theirs(-3) # checkout their version for unmerged files + --patch(-p) # select hunks interactively + --ignore-skip-worktree-bits # do not limit pathspecs to sparse entries only + --pathspec-from-file: string # read pathspec from file + ] + + export extern "git push" [ + remote?: string@"nu-complete git remotes", # the name of the remote + refspec?: string@"nu-complete git branches"# the branch / refspec + --verbose(-v) # be more verbose + --quiet(-q) # be more quiet + --repo: string # repository + --all # push all refs + --mirror # mirror all refs + --delete(-d) # delete refs + --tags # push tags (can't be used with --all or --mirror) + --dry-run(-n) # dry run + --porcelain # machine-readable output + --force(-f) # force updates + --force-with-lease: string # require old value of ref to be at this value + --recurse-submodules: string # control recursive pushing of submodules + --thin # use thin pack + --receive-pack: string # receive pack program + --exec: string # receive pack program + --set-upstream(-u) # set upstream for git pull/status + --progress # force progress reporting + --prune # prune locally removed refs + --no-verify # bypass pre-push hook + --follow-tags # push missing but relevant tags + --signed: string # GPG sign the push + --atomic # request atomic transaction on remote side + --push-option(-o): string # option to transmit + --ipv4(-4) # use IPv4 addresses only + --ipv6(-6) # use IPv6 addresses only + ] +} + +# Get just the extern definitions without the custom completion commands +use completions * + +# for more information on themes see +# https://www.nushell.sh/book/coloring_and_theming.html +let default_theme = { + # color for nushell primitives + separator: white + leading_trailing_space_bg: { attr: n } # no fg, no bg, attr none effectively turns this off + header: green_bold + empty: blue + bool: white + int: white + filesize: white + duration: white + date: white + range: white + float: white + string: white + nothing: white + binary: white + cellpath: white + row_index: green_bold + record: white + list: white + block: white + hints: dark_gray + + # shapes are used to change the cli syntax highlighting + shape_garbage: { fg: "#FFFFFF" bg: "#FF0000" attr: b} + shape_binary: purple_bold + shape_bool: light_cyan + shape_int: purple_bold + shape_float: purple_bold + shape_range: yellow_bold + shape_internalcall: cyan_bold + shape_external: cyan + shape_externalarg: green_bold + shape_literal: blue + shape_operator: yellow + shape_signature: green_bold + shape_string: green + shape_string_interpolation: cyan_bold + shape_datetime: cyan_bold + shape_list: cyan_bold + shape_table: blue_bold + shape_record: cyan_bold + shape_block: blue_bold + shape_filepath: cyan + shape_globpattern: cyan_bold + shape_variable: purple + shape_flag: blue_bold + shape_custom: green + shape_nothing: light_cyan +} + +# The default config record. This is where much of your global configuration is setup. +let $config = { + filesize_metric: false + # basic, compact, compact_double, light, thin, with_love, rounded, reinforced, heavy, none, other + table_mode: none + use_ls_colors: true + rm_always_trash: false + color_config: $default_theme + use_grid_icons: true + footer_mode: "25" # always, never, number_of_rows, auto + quick_completions: true # set this to false to prevent auto-selecting completions when only one remains + partial_completions: true # set this to false to prevent partial filling of the prompt + animate_prompt: false # redraw the prompt every second + float_precision: 2 + use_ansi_coloring: true + filesize_format: "auto" # b, kb, kib, mb, mib, gb, gib, tb, tib, pb, pib, eb, eib, zb, zib, auto + edit_mode: emacs # emacs, vi + max_history_size: 1000 # Session has to be reloaded for this to take effect + sync_history_on_enter: true # Enable to share the history between multiple sessions, else you have to close the session to persist history to file + menus: [ + # Configuration for default nushell menus + # Note the lack of souce parameter + { + name: completion_menu + only_buffer_difference: false + marker: "| " + type: { + layout: columnar + columns: 4 + col_width: 20 # Optional value. If missing all the screen width is used to calculate column width + col_padding: 2 + } + style: { + text: green + selected_text: green_reverse + description_text: yellow + } + } + { + name: history_menu + only_buffer_difference: true + marker: "? " + type: { + layout: list + page_size: 10 + } + style: { + text: green + selected_text: green_reverse + description_text: yellow + } + } + { + name: help_menu + only_buffer_difference: true + marker: "? " + type: { + layout: description + columns: 4 + col_width: 20 # Optional value. If missing all the screen width is used to calculate column width + col_padding: 2 + selection_rows: 4 + description_rows: 10 + } + style: { + text: green + selected_text: green_reverse + description_text: yellow + } + } + # Example of extra menus created using a nushell source + # Use the source field to create a list of records that populates + # the menu + { + name: commands_menu + only_buffer_difference: false + marker: "# " + type: { + layout: columnar + columns: 4 + col_width: 20 + col_padding: 2 + } + style: { + text: green + selected_text: green_reverse + description_text: yellow + } + source: { |buffer, position| + $nu.scope.commands + | where command =~ $buffer + | each { |it| {value: $it.command description: $it.usage} } + } + } + { + name: vars_menu + only_buffer_difference: true + marker: "# " + type: { + layout: list + page_size: 10 + } + style: { + text: green + selected_text: green_reverse + description_text: yellow + } + source: { |buffer, position| + $nu.scope.vars + | where name =~ $buffer + | sort-by name + | each { |it| {value: $it.name description: $it.type} } + } + } + { + name: commands_with_description + only_buffer_difference: true + marker: "# " + type: { + layout: description + columns: 4 + col_width: 20 + col_padding: 2 + selection_rows: 4 + description_rows: 10 + } + style: { + text: green + selected_text: green_reverse + description_text: yellow + } + source: { |buffer, position| + $nu.scope.commands + | where command =~ $buffer + | each { |it| {value: $it.command description: $it.usage} } + } + } + ] + keybindings: [ + { + name: completion_menu + modifier: none + keycode: tab + mode: emacs # Options: emacs vi_normal vi_insert + event: { + until: [ + { send: menu name: completion_menu } + { send: menunext } + ] + } + } + { + name: completion_previous + modifier: shift + keycode: backtab + mode: [emacs, vi_normal, vi_insert] # Note: You can add the same keybinding to all modes by using a list + event: { send: menuprevious } + } + { + name: history_menu + modifier: control + keycode: char_x + mode: emacs + event: { + until: [ + { send: menu name: history_menu } + { send: menupagenext } + ] + } + } + { + name: history_previous + modifier: control + keycode: char_z + mode: emacs + event: { + until: [ + { send: menupageprevious } + { edit: undo } + ] + } + } + # Keybindings used to trigger the user defined menus + { + name: commands_menu + modifier: control + keycode: char_t + mode: [emacs, vi_normal, vi_insert] + event: { send: menu name: commands_menu } + } + { + name: vars_menu + modifier: control + keycode: char_y + mode: [emacs, vi_normal, vi_insert] + event: { send: menu name: vars_menu } + } + { + name: commands_with_description + modifier: control + keycode: char_u + mode: [emacs, vi_normal, vi_insert] + event: { send: menu name: commands_with_description } + } + ] +} + +# Do not overwrite open command on macOS +def nuopen [arg, --raw (-r)] { + if $raw { + open -r $arg + } else { + open $arg + } +} + +alias open = ^open + +alias ll = ls -l +alias la = ls -a +alias lt = (ls | sort-by modified -r | sort-by type) +alias g = git +alias ga = git add +alias gaa = git add --all +alias gam = git am +alias gama = git am --abort +alias gamc = git am --continue +alias gams = git am --skip +alias gamscp = git am --show-current-patch +alias gap = git apply +alias gapa = git add --patch +alias gapt = git apply --3way +alias gau = git add --update +alias gav = git add --verbose +alias gb = git branch +alias gbD = git branch -D +alias gba = git branch -a +alias gbd = git branch -d +# alias gbda = git branch --no-color --merged | command grep -vE "^(\+|\*|\s*($(git_main_branch)|development|develop|devel|dev)\s*$)" | command xargs -n 1 git branch -d +alias gbl = git blame -b -w +alias gbnm = git branch --no-merged +alias gbr = git branch --remote +alias gbs = git bisect +alias gbsb = git bisect bad +alias gbsg = git bisect good +alias gbsr = git bisect reset +alias gbss = git bisect start +alias gc = git commit -v +alias gc! = git commit -v --amend +alias gca = git commit -v -a +alias gca! = git commit -v -a --amend +alias gcam = git commit -a -m +alias gcan! = git commit -v -a --no-edit --amend +alias gcans! = git commit -v -a -s --no-edit --amend +alias gcb = git checkout -b +alias gcd = git checkout develop +alias gcf = git config --list +alias gcl = git clone --recurse-submodules +alias gclean = git clean -id +alias gcm = git checkout $(git_main_branch) +alias gcmsg = git commit -m +alias gcn! = git commit -v --no-edit --amend +alias gco = git checkout +alias gcount = git shortlog -sn +alias gcp = git cherry-pick +alias gcpa = git cherry-pick --abort +alias gcpc = git cherry-pick --continue +alias gcs = git commit -S +alias gcsm = git commit -s -m +alias gd = git diff +alias gdca = git diff --cached +alias gdct = git describe --tags $(git rev-list --tags --max-count=1) +alias gdcw = git diff --cached --word-diff +alias gds = git diff --staged +alias gdt = git diff-tree --no-commit-id --name-only -r +alias gdw = git diff --word-diff +alias gf = git fetch +alias gfa = git fetch --all --prune +# alias gfg = git ls-files | grep +alias gfo = git fetch origin +alias gg = git gui citool +alias gga = git gui citool --amend +alias ggpull = git pull origin (git_current_branch) +alias ggpur = ggu +alias ggpush = git push origin (git_current_branch) +alias ggsup = git branch --set-upstream-to=origin/$(git_current_branch) +alias ghh = git help +alias gignore = git update-index --assume-unchanged +# alias gignored = git ls-files -v | grep "^[[:lower:]]" +alias git-svn-dcommit-push = git svn dcommit && git push github $(git_main_branch):svntrunk +alias gk = \gitk --all --branches +alias gke = \gitk --all $(git log -g --pretty=%h) +alias gl = git pull +alias glg = git log --stat +alias glgg = git log --graph +alias glgga = git log --graph --decorate --all +alias glgm = git log --graph --max-count=10 +alias glgp = git log --stat -p +alias glo = git log --oneline --decorate +alias globurl = noglob urlglobber +alias glod = git log --graph --pretty=\%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset\ +alias glods = git log --graph --pretty=\%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset\ --date=short +alias glog = git log --oneline --decorate --graph +alias gloga = git log --oneline --decorate --graph --all +alias glol = git log --graph --pretty=\%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset\ +alias glola = git log --graph --pretty=\%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset\ --all +alias glols = git log --graph --pretty=\%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset\ --stat +alias glp = _git_log_prettily +alias glum = git pull upstream $(git_main_branch) +alias gm = git merge +alias gma = git merge --abort +alias gmom = git merge origin/$(git_main_branch) +alias gmt = git mergetool --no-prompt +alias gmtvim = git mergetool --no-prompt --tool=vimdiff +alias gmum = git merge upstream/$(git_main_branch) +alias gp = git push +alias gpd = git push --dry-run +alias gpf = git push --force-with-lease +alias gpf! = git push --force +alias gpoat = git push origin --all && git push origin --tags +alias gpristine = git reset --hard && git clean -dffx +alias gpsup = git push --set-upstream origin $(git_current_branch) +alias gpu = git push upstream +alias gpv = git push -v +alias gr = git remote +alias gra = git remote add +alias grb = git rebase +alias grba = git rebase --abort +alias grbc = git rebase --continue +alias grbd = git rebase develop +alias grbi = git rebase -i +alias grbm = git rebase $(git_main_branch) +alias grbs = git rebase --skip +alias grep = grep --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,.tox} +alias grev = git revert +alias grh = git reset +alias grhh = git reset --hard +alias grm = git rm +alias grmc = git rm --cached +alias grmv = git remote rename +alias groh = git reset origin/$(git_current_branch) --hard +alias grrm = git remote remove +alias grs = git restore +alias grset = git remote set-url +alias grss = git restore --source +alias grt = cd "$(git rev-parse --show-toplevel || echo .)" +alias gru = git reset -- +alias grup = git remote update +alias grv = git remote -v +alias gsb = git status -sb +alias gsd = git svn dcommit +alias gsh = git show +alias gsi = git submodule init +alias gsps = git show --pretty=short --show-signature +alias gsr = git svn rebase +alias gss = git status -s +alias gst = git status +alias gsta = git stash push +alias gstaa = git stash apply +alias gstall = git stash --all +alias gstc = git stash clear +alias gstd = git stash drop +alias gstl = git stash list +alias gstp = git stash pop +alias gsts = git stash show --text +alias gstu = git stash --include-untracked +alias gsu = git submodule update +alias gsw = git switch +alias gswc = git switch -c +# alias gtl = gtl(){ git tag --sort=-v:refname -n -l "${1}*" }; noglob gtl +alias gts = git tag -s +# alias gtv = git tag | sort -V +alias gunignore = git update-index --no-assume-unchanged +# alias gunwip = git log -n 1 | grep -q -c "\-\-wip\-\-" && git reset HEAD~1 +alias gup = git pull --rebase +alias gupa = git pull --rebase --autostash +alias gupav = git pull --rebase --autostash -v +alias gupv = git pull --rebase -v +alias gwch = git whatchanged -p --abbrev-commit --pretty=medium +# alias gwip = git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign -m "--wip-- [skip ci]" + +# def __git_prompt_git [...args] { +# let GIT_OPTIONAL_LOCKS = 0; command git $args +# } + +# def git_current_branch [] { +# let ref = (__git_prompt_git symbolic-ref HEAD | split row "/") +# let ret = $env.LAST_EXIT_CODE +# if $ret != 0 { +# if $ret == 128 { +# ref = (__git_prompt_git rev-parse HEAD | split row "/") +# } +# } + +# let num = (echo $ref | length) +# echo $ref | get ($num - 1) +# } + +def nope [] { + each { |it| $it == false } +} + +def git_current_branch [] { + let in-git-repo = (do --ignore-errors { git rev-parse --abbrev-ref HEAD } | empty? | nope) + let status = (if $in-git-repo { + git --no-optional-locks status --porcelain=2 --branch | lines + } else { + [] + }) + + let on-named-branch = (if $in-git-repo { + $status + | where ($it | str starts-with '# branch.head') + | first + | str contains '(detached)' + | nope + } else { + false + }) + + let branch-name = (if $on-named-branch { + $status + | where ($it | str starts-with '# branch.head') + | split column ' ' col1 col2 branch + | get branch + | first + } else { + '' + }) + + $branch-name +} + +def ggpush [] { + git push origin (git_current_branch) +} + + +# Refer to bash version +# function git_current_branch() { +# local ref +# ref=$(__git_prompt_git symbolic-ref --quiet HEAD 2>/dev/null) +# local ret=$? +# if [[ $ret != 0 ]]; then +# [[ $ret == 128 ]] && return # no git repo. +# ref=$(__git_prompt_git rev-parse --short HEAD 2>/dev/null) || return +# fi +# echo ${ref#refs/heads/} +# } + diff --git a/config/nushell/env.nu b/config/nushell/env.nu new file mode 100644 index 0000000..d0b8567 --- /dev/null +++ b/config/nushell/env.nu @@ -0,0 +1,566 @@ +# Nushell Environment Config File + +def create_left_prompt [] { + let path_segment = ($env.PWD) + + $path_segment +} + +def display_time [] { + let time_segment = ([ + (ansi { fg: "#d33682"}) + (date now | date format '[%Y-%m-%d %H:%M:%S]') + ] | str collect) + + $time_segment +} + +def create_right_prompt [] { + '' +} + +def indicator [] { + let code = $env.LAST_EXIT_CODE + let indicator = ( + if $code == 0 {[ + (ansi {fg: '#2aa198'}) + (" ❯❯❯ ") + ] | str collect + } else {[ + # if LAST_EXIT_CODE is not 0, then display the code + (ansi { fg: '#b58900' }) + ( "C:" ) + (ansi { fg: '#dc322f' }) + ( $code ) + (ansi { fg: '#dc322f' }) + (" ❯❯❯ ") + ] | str collect + } + ) + + $indicator +} + +# Use nushell functions to define your right and left prompt +let-env PROMPT_COMMAND = { simpleline-git } +let-env PROMPT_COMMAND_RIGHT = { create_right_prompt } + +# The prompt indicators are environmental variables that represent +# the state of the prompt +let-env PROMPT_INDICATOR = { indicator } +# let-env PROMPT_INDICATOR = { " ❯❯❯ " } +let-env PROMPT_INDICATOR_VI_INSERT = { ": " } +let-env PROMPT_INDICATOR_VI_NORMAL = { " ❯ " } +let-env PROMPT_MULTILINE_INDICATOR = { "::: " } + +# Specifies how environment variables are: +# - converted from a string to a value on Nushell startup (from_string) +# - converted from a value back to a string when running external commands (to_string) +# Note: The conversions happen *after* config.nu is loaded +let-env ENV_CONVERSIONS = { + "PATH": { + from_string: { |s| $s | split row (char esep) } + to_string: { |v| $v | str collect (char esep) } + } + "Path": { + from_string: { |s| $s | split row (char esep) } + to_string: { |v| $v | str collect (char esep) } + } +} + +# Directories to search for scripts when calling source or use +# +# By default, /scripts is added +let-env NU_LIB_DIRS = [ + ($nu.config-path | path dirname | path join 'scripts') +] + +# Directories to search for plugin binaries when calling register +# +# By default, /plugins is added +let-env NU_PLUGIN_DIRS = [ + ($nu.config-path | path dirname | path join 'plugins') +] + +# To add entries to PATH (on Windows you might use Path), you can use the following pattern: +# let-env PATH = ($env.PATH | prepend '/some/path') + +# Inspired by panache-git: https://github.com/ehdevries/panache-git +module simpleline { + # Get the current directory with home abbreviated + export def simpleline_dir [] { + let current-dir = ($env.PWD) + + let current-dir-relative-to-home = ( + do --ignore-errors { $current-dir | path relative-to $nu.home-path } | str collect + ) + + let in-sub-dir-of-home = ($current-dir-relative-to-home | empty? | nope) + let current-dir-abbreviated = (if $in-sub-dir-of-home { + $'~(char separator)($current-dir-relative-to-home)' + } else if $current-dir == $nu.home-path { + '~' + } else { + $current-dir + }) + + $'(ansi { fg: "#859900" })($current-dir-abbreviated)' + } + + # Get repository status as structured data + export def simpleline_structured [] { + let in-git-repo = (do --ignore-errors { git rev-parse --abbrev-ref HEAD } | empty? | nope) + + let status = (if $in-git-repo { + git --no-optional-locks status --porcelain=2 --branch | lines + } else { + [] + }) + + let on-named-branch = (if $in-git-repo { + $status + | where ($it | str starts-with '# branch.head') + | first + | str contains '(detached)' + | nope + } else { + false + }) + + let branch-name = (if $on-named-branch { + $status + | where ($it | str starts-with '# branch.head') + | split column ' ' col1 col2 branch + | get branch + | first + } else { + '' + }) + + let commit-hash = (if $in-git-repo { + $status + | where ($it | str starts-with '# branch.oid') + | split column ' ' col1 col2 full_hash + | get full_hash + | first + | str substring [0 7] + } else { + '' + }) + + let tracking-upstream-branch = (if $in-git-repo { + $status + | where ($it | str starts-with '# branch.upstream') + | str collect + | empty? + | nope + } else { + false + }) + + let upstream-exists-on-remote = (if $in-git-repo { + $status + | where ($it | str starts-with '# branch.ab') + | str collect + | empty? + | nope + } else { + false + }) + + let ahead-behind-table = (if $upstream-exists-on-remote { + $status + | where ($it | str starts-with '# branch.ab') + | split column ' ' col1 col2 ahead behind + } else { + [[]] + }) + + let commits-ahead = (if $upstream-exists-on-remote { + $ahead-behind-table + | get ahead + | first + | into int + } else { + 0 + }) + + let commits-behind = (if $upstream-exists-on-remote { + $ahead-behind-table + | get behind + | first + | into int + | math abs + } else { + 0 + }) + + let has-staging-or-worktree-changes = (if $in-git-repo { + $status + | where ($it | str starts-with '1') || ($it | str starts-with '2') + | str collect + | empty? + | nope + } else { + false + }) + + let has-untracked-files = (if $in-git-repo { + $status + | where ($it | str starts-with '?') + | str collect + | empty? + | nope + } else { + false + }) + + let has-unresolved-merge-conflicts = (if $in-git-repo { + $status + | where ($it | str starts-with 'u') + | str collect + | empty? + | nope + } else { + false + }) + + let staging-worktree-table = (if $has-staging-or-worktree-changes { + $status + | where ($it | str starts-with '1') || ($it | str starts-with '2') + | split column ' ' + | get column2 + | split column '' staging worktree --collapse-empty + } else { + [[]] + }) + + let staging-added-count = (if $has-staging-or-worktree-changes { + $staging-worktree-table + | where staging == 'A' + | length + } else { + 0 + }) + + let staging-modified-count = (if $has-staging-or-worktree-changes { + $staging-worktree-table + | where staging in ['M', 'R'] + | length + } else { + 0 + }) + + let staging-deleted-count = (if $has-staging-or-worktree-changes { + $staging-worktree-table + | where staging == 'D' + | length + } else { + 0 + }) + + let stashed-count = (if $in-git-repo { + git stash list | split row "\n" | length + } else { + 0 + }) + + let untracked-count = (if $has-untracked-files { + $status + | where ($it | str starts-with '?') + | length + } else { + 0 + }) + + let worktree-modified-count = ( + if $has-staging-or-worktree-changes { + $staging-worktree-table + | where worktree in ['M', 'R'] + | length + } else { + 0 + }) + + let worktree-deleted-count = (if $has-staging-or-worktree-changes { + $staging-worktree-table + | where worktree == 'D' + | length + } else { + 0 + }) + + let merge-conflict-count = (if $has-unresolved-merge-conflicts { + $status + | where ($it | str starts-with 'u') + | length + } else { + 0 + }) + + { + in_git_repo: $in-git-repo, + on_named_branch: $on-named-branch, + branch_name: $branch-name, + commit_hash: $commit-hash, + tracking_upstream_branch: $tracking-upstream-branch, + upstream_exists_on_remote: $upstream-exists-on-remote, + commits_ahead: $commits-ahead, + commits_behind: $commits-behind, + staging_added_count: $staging-added-count, + staging_modified_count: $staging-modified-count, + staging_deleted_count: $staging-deleted-count, + stashed_count: $stashed-count, + untracked_count: $untracked-count, + worktree_modified_count: $worktree-modified-count, + worktree_deleted_count: $worktree-deleted-count, + merge_conflict_count: $merge-conflict-count + } + } + + # Get repository status as a styled string + export def simpleline_styled [] { + let status = (simpleline_structured) + let is-local-only = ($status.tracking_upstream_branch != true) + let upstream-deleted = ( + $status.tracking_upstream_branch && + $status.upstream_exists_on_remote != true + ) + + let is-up-to-date = ( + $status.upstream_exists_on_remote && + $status.commits_ahead == 0 && + $status.commits_behind == 0 + ) + + let is-ahead = ( + $status.upstream_exists_on_remote && + $status.commits_ahead > 0 && + $status.commits_behind == 0 + ) + + let is-behind = ( + $status.upstream_exists_on_remote && + $status.commits_ahead == 0 && + $status.commits_behind > 0 + ) + + let is-ahead-and-behind = ( + $status.upstream_exists_on_remote && + $status.commits_ahead > 0 && + $status.commits_behind > 0 + ) + + let branch-name = (if $status.in_git_repo { + (if $status.on_named_branch { + $status.branch_name + } else { + ['(' $status.commit_hash '...)'] | str collect + }) + } else { + '' + }) + + let branch-styled = (if $status.in_git_repo { + (if $is-local-only { + (branch-local-only $branch-name) + } else if $is-up-to-date { + (branch-up-to-date $branch-name) + } else if $is-ahead { + (branch-ahead $branch-name $status.commits_ahead) + } else if $is-behind { + (branch-behind $branch-name $status.commits_behind) + } else if $is-ahead-and-behind { + (branch-ahead-and-behind $branch-name $status.commits_ahead $status.commits_behind) + } else if $upstream-deleted { + (branch-upstream-deleted $branch-name) + } else { + $branch-name + }) + } else { + '' + }) + + let has-staging-changes = ( + $status.staging_added_count > 0 || + $status.staging_modified_count > 0 || + $status.staging_deleted_count > 0 + ) + + let has-worktree-changes = ( + $status.untracked_count > 0 || + $status.worktree_modified_count > 0 || + $status.worktree_deleted_count > 0 || + $status.merge_conflict_count > 0 + ) + + let has-stashed-changes = ( + $status.stashed_count > 0 + ) + + let has-merge-conflicts = $status.merge_conflict_count > 0 + + let staging-summary = (if $has-staging-changes { + (staging-changes $status.staging_added_count $status.staging_modified_count $status.staging_deleted_count) + } else { + '' + }) + + let worktree-summary = (if $has-worktree-changes { + (worktree-changes $status.untracked_count $status.worktree_modified_count $status.worktree_deleted_count) + } else { + '' + }) + + let stash-summary = (if $has-stashed-changes { + (stashed-changes $status.stashed_count) + } else { + '' + }) + + let merge-conflict-summary = (if $has-merge-conflicts { + (unresolved-conflicts $status.merge_conflict_count) + } else { + '' + }) + + let delimiter = (if ($has-staging-changes && $has-worktree-changes) { + ('|' | bright-yellow) + } else { + '' + }) + + let local-summary = ( + $'($staging-summary) ($delimiter) ($worktree-summary) ($stash-summary) ($merge-conflict-summary)' | str trim + ) + + let local-indicator = (if $status.in_git_repo { + (if $has-worktree-changes { + ('!' | red) + } else if $has-staging-changes { + ('~' | bright-cyan) + } else if $has-stashed-changes { + ('▣' | green) + } else { + '' + }) + } else { + '' + }) + + let repo-summary = ( + $'($branch-styled) ($local-summary) ($local-indicator)' | str trim + ) + + let left-bracket = ('[' | bright-yellow) + let right-bracket = (']' | bright-yellow) + + (if $status.in_git_repo { + $'($left-bracket)($repo-summary)($right-bracket)' + } else { + '' + }) + } + + # Helper commands to encapsulate style and make everything else more readable + def nope [] { + each { |it| $it == false } + } + + def bright-cyan [] { + each { |it| $"(ansi -e '96m')($it)(ansi reset)" } + } + + def bright-green [] { + each { |it| $"(ansi -e '92m')($it)(ansi reset)" } + } + + def bright-red [] { + each { |it| $"(ansi -e '91m')($it)(ansi reset)" } + } + + def bright-yellow [] { + each { |it| $"(ansi -e '93m')($it)(ansi reset)" } + } + + def green [] { + each { |it| $"(ansi green)($it)(ansi reset)" } + } + + def red [] { + each { |it| $"(ansi red)($it)(ansi reset)" } + } + + def branch-local-only [ + branch: string + ] { + $branch | bright-cyan + } + + def branch-upstream-deleted [ + branch: string + ] { + $'($branch) (char failed)' | bright-cyan + } + + def branch-up-to-date [ + branch: string + ] { + $'($branch) (char identical_to)' | bright-cyan + } + + def branch-ahead [ + branch: string + ahead: int + ] { + $'($branch) (char branch_ahead)($ahead)' | bright-green + } + + def branch-behind [ + branch: string + behind: int + ] { + $'($branch) (char branch_behind)($behind)' | bright-red + } + + def branch-ahead-and-behind [ + branch: string + ahead: int + behind: int + ] { + $'($branch) (char branch_behind)($behind) (char branch_ahead)($ahead)' | bright-yellow + } + + def staging-changes [ + added: int + modified: int + deleted: int + ] { + $'+($added) ~($modified) -($deleted)' | green + } + + def worktree-changes [ + added: int + modified: int + deleted: int + ] { + $'+($added) ~($modified) -($deleted)' | red + } + + def stashed-changes [ num: int ] { + $'▣($num)' | bright-cyan + } + + def unresolved-conflicts [ + conflicts: int + ] { + $'!($conflicts)' | red + } +} + +# An opinionated Git prompt for Nushell, styled after posh-git +def simpleline-git [] { + use simpleline * + let prompt = ($'(display_time) (simpleline_dir) (simpleline_styled)' | str trim ) + $'($prompt)' +} diff --git a/config/nushell/oh-my.nu b/config/nushell/oh-my.nu new file mode 100644 index 0000000..b1a45b4 --- /dev/null +++ b/config/nushell/oh-my.nu @@ -0,0 +1,568 @@ +# oh-my.nu +# NOTE: This is meant to run with engine-q and not nushell yet +# It's still being tested. There will be bugs. :) + +# REQUIREMENTS # +# you definitely need nerd fonts https://www.nerdfonts.com +# nerd fonts repo https://github.com/ryanoasis/nerd-fonts +# i use "FiraCode Nerd Font Mono" on mac +# +# you also must have the engine-q gstat plugin installed and registered + +# ATTRIBUTION # +# A little fancier prompt with git information +# inspired by https://github.com/xcambar/purs +# inspired by https://github.com/IlanCosman/tide +# inspired by https://github.com/JanDeDobbeleer/oh-my-posh + + +# Abbreviate home path +def home_abbrev [os_name] { + let is_home_in_path = ($env.PWD | str starts-with $nu.home-path) + if $is_home_in_path { + if ($os_name =~ "windows") { + let home = ($nu.home-path | str replace -a '\\' '/') + let pwd = ($env.PWD | str replace -a '\\' '/') + $pwd | str replace $home '~' + } else { + $env.PWD | str replace $nu.home-path '~' + } + } else { + $env.PWD | str replace -a '\\' '/' + } +} + +def path_abbrev_if_needed [apath term_width] { + # probably shouldn't do coloring here but since we're coloring + # only certain parts, it's kind of tricky to do it in another place + let T = (ansi { fg: "#BCBCBC" bg: "#3465A4"}) # truncated + let P = (ansi { fg: "#E4E4E4" bg: "#3465A4"}) # path + let PB = (ansi { fg: "#E4E4E4" bg: "#3465A4" attr: b}) # path bold + let R = (ansi reset) + + if (($apath | str length) > ($term_width / 2)) { + # split out by path separator into tokens + # don't use psep here because in home_abbrev we're making them all '/' + let splits = ($apath | split row '/') + + let splits_len = ($splits | length) + let subtractor = (if ($splits_len <= 2) { 1 } else { 2 }) + # get all the tokens except the last + let tokens = (for x in 1..($splits_len - $subtractor) { + $"($T)((($splits) | get $x | split chars) | get 0)($R)" + }) + + # need an insert command + let tokens = ($tokens | prepend $"($T)~") + + # append the last part of the path + let tokens = ($tokens | append $"($PB)($splits | last)($R)") + + # collect + $tokens | str collect $"($T)/" + } else { + # $"($P)($apath)($R)" + + # FIXME: This is close but it fails with folder with space. I'm not sure why. + # let splits = ($apath | split row '/') + # let splits_len = ($splits | length) + # let tokens = (for x in 0..($splits_len - 1) { + # if ($x < ($splits_len - 1)) { + # $"/($T)(($splits | get $x | split chars).0)($R)" + # } + # }) + # let tokens = ($tokens | append $"/($PB)(($splits | last).0)($R)") + # $tokens | str collect $"($T)" + + # FIXME: This is close but it fails with folder with space. I'm not sure why. + # cd "/Applications/Hex Fiend.app/" + #    ~/H/A/Hex Fiend.app  + # should be + #    ~/A/Hex Fiend.app  + let splits = ($apath | split row '/') + let splits_len = ($splits | length) + if ($splits_len == 0) { + # We're at / on the file system + $"/($T)" + } else if ($splits_len == 1) { + let top_part = ($splits | first) + let tokens = $"($PB)($top_part)($R)" + $tokens | str collect $"($T)" + } else { + let top_part = ($splits | first ($splits_len - 1)) + let end_part = ($splits | last) + let tokens = (for x in $top_part { + $"/($T)(($x | split chars).0)($R)" + }) + let tokens = ($tokens | append $"/($PB)($end_part)($R)") + $tokens | str collect $"($T)" + } + } +} + +def get_index_change_count [gs] { + let index_new = ($gs | get idx_added_staged) + let index_modified = ($gs | get idx_modified_staged) + let index_deleted = ($gs | get idx_deleted_staged) + let index_renamed = ($gs | get idx_renamed) + let index_typechanged = ($gs | get idx_type_changed) + + $index_new + $index_modified + $index_deleted + $index_renamed + $index_typechanged +} + +def get_working_tree_count [gs] { + let wt_modified = ($gs | get wt_modified) + let wt_deleted = ($gs | get wt_deleted) + let wt_typechanged = ($gs | get wt_type_changed) + let wt_renamed = ($gs | get wt_renamed) + + $wt_modified + $wt_deleted + $wt_typechanged + $wt_renamed +} + +def get_conflicted_count [gs] { + ($gs | get conflicts) +} + +def get_untracked_count [gs] { + ($gs | get wt_untracked) +} + +def get_branch_name [gs] { + let br = ($gs | get branch) + if $br == "no_branch" { + "" + } else { + $br + } +} + +def get_ahead_count [gs] { + ($gs | get ahead) +} + +def get_behind_count [gs] { + ($gs | get behind) +} + +def get_icons_list [] { + { + AHEAD_ICON: (char branch_ahead), # "↑" 2191 + BEHIND_ICON: (char branch_behind), # "↓" 2193 + NO_CHANGE_ICON: (char branch_identical) # ≣ 2263 + HAS_CHANGE_ICON: "*", + INDEX_CHANGE_ICON: "♦", + WT_CHANGE_ICON: "✚", + CONFLICTED_CHANGE_ICON: "✖", + UNTRACKED_CHANGE_ICON: (char branch_untracked) # ≢ 2262 + INSERT_SYMBOL_ICON: "❯", + HAMBURGER_ICON: (char hamburger) # "≡" 2261 + GITHUB_ICON: "", # f408 + BRANCH_ICON: (char nf_branch) # "" e0a0 + REBASE_ICON: "", # e728 + TAG_ICON: "" # f412 + } +} + +def get_icon_by_name [name] { + do -i { get_icons_list | get $name } +} + +def get_os_icon [os] { + # f17c = tux, f179 = apple, f17a = windows + if ($os.name =~ macos) { + (char -u f179) + } else if ($os.name =~ windows) { + (char -u f17a) + } else if ($os.kernel_version =~ WSL) { + $'(char -u f17a)(char -u f17c)' + } else if ($os.family =~ unix) { + (char -u f17c) + } else { + '' + } +} + +# ╭─────────────────────┬───────────────╮ +# │ idx_added_staged │ 0 │ #INDEX_NEW +# │ idx_modified_staged │ 0 │ #INDEX_MODIFIED +# │ idx_deleted_staged │ 0 │ #INDEX_DELETED +# │ idx_renamed │ 0 │ #INDEX_RENAMED +# │ idx_type_changed │ 0 │ #INDEX_TYPECHANGE +# │ wt_untracked │ 0 │ #WT_NEW +# │ wt_modified │ 0 │ #WT_MODIFIED +# │ wt_deleted │ 0 │ #WT_DELETED +# │ wt_type_changed │ 0 │ #WT_TYPECHANGE +# │ wt_renamed │ 0 │ #WT_RENAMED +# │ ignored │ 0 │ +# │ conflicts │ 0 │ #CONFLICTED +# │ ahead │ 0 │ +# │ behind │ 0 │ +# │ stashes │ 0 │ +# │ repo_name │ engine-q │ +# │ tag │ no_tag │ +# │ branch │ main │ +# │ remote │ upstream/main │ +# ╰─────────────────────┴───────────────╯ + +def get_repo_status [gs os] { + # replace this 30 with whatever the width of the terminal is + let display_path = (path_abbrev_if_needed (home_abbrev $os.name) 30) + let branch_name = (get_branch_name $gs) + let ahead_cnt = (get_ahead_count $gs) + let behind_cnt = (get_behind_count $gs) + let index_change_cnt = (get_index_change_count $gs) + let wt_change_cnt = (get_working_tree_count $gs) + let conflicted_cnt = (get_conflicted_count $gs) + let untracked_cnt = (get_untracked_count $gs) + let has_no_changes = ( + if ($index_change_cnt <= 0) && + ($wt_change_cnt <= 0) && + ($conflicted_cnt <= 0) && + ($untracked_cnt <= 0) { + true + } else { + false + } + ) + + let GIT_BG = "#C4A000" + let GIT_FG = "#000000" + # let TERM_BG = "#0C0C0C" + + # The multi-color fg colors are good if you just have a black background + + let AHEAD_ICON = (get_icon_by_name AHEAD_ICON) + # let A_COLOR = (ansi { fg:"#00ffff" bg: ($GIT_BG) }) + let A_COLOR = (ansi { fg: ($GIT_FG) bg: ($GIT_BG) }) + + let BEHIND_ICON = (get_icon_by_name BEHIND_ICON) + # let B_COLOR = (ansi { fg:"#00ffff" bg: ($GIT_BG) }) + let B_COLOR = (ansi { fg: ($GIT_FG) bg: ($GIT_BG) }) + + let INDEX_CHANGE_ICON = (get_icon_by_name INDEX_CHANGE_ICON) + # let I_COLOR = (ansi { fg:"#00ff00" bg: ($GIT_BG) }) + let I_COLOR = (ansi { fg: ($GIT_FG) bg: ($GIT_BG) }) + + let CONFLICTED_CHANGE_ICON = (get_icon_by_name CONFLICTED_CHANGE_ICON) + # let C_COLOR = (ansi { fg:"#ff0000" bg: ($GIT_BG) }) + let C_COLOR = (ansi { fg: ($GIT_FG) bg: ($GIT_BG) }) + + let WT_CHANGE_ICON = (get_icon_by_name WT_CHANGE_ICON) + # let W_COLOR = (ansi { fg:"#ff00ff" bg: ($GIT_BG) }) + let W_COLOR = (ansi { fg: ($GIT_FG) bg: ($GIT_BG) }) + + let UNTRACKED_CHANGE_ICON = (get_icon_by_name UNTRACKED_CHANGE_ICON) + # let U_COLOR = (ansi { fg:"#ffff00" bg: ($GIT_BG) }) + let U_COLOR = (ansi { fg: ($GIT_FG) bg: ($GIT_BG) }) + + let NO_CHANGE_ICON = (get_icon_by_name NO_CHANGE_ICON) + # let N_COLOR = (ansi { fg:"#00ff00" bg: ($GIT_BG) }) + let N_COLOR = (ansi { fg: ($GIT_FG) bg: ($GIT_BG) }) + + let HAS_CHANGE_ICON = (get_icon_by_name HAS_CHANGE_ICON) + # let H_COLOR = (ansi { fg:"#ff0000" bg: ($GIT_BG) attr: b }) + let H_COLOR = (ansi { fg: ($GIT_FG) bg: ($GIT_BG) attr: b }) + + let INSERT_SYMBOL_ICON = (get_icon_by_name INSERT_SYMBOL_ICON) + # let S_COLOR = (ansi { fg:"#00ffff" bg: ($GIT_BG) }) + let S_COLOR = (ansi { fg: ($GIT_FG) bg: ($GIT_BG) }) + + let R = (ansi reset) + + let repo_status = ( + $"( + if ($ahead_cnt > 0) { $'($A_COLOR)($AHEAD_ICON)($ahead_cnt)($R)' } + )( + if ($behind_cnt > 0) { $'($B_COLOR)($BEHIND_ICON)($behind_cnt)($R)' } + )( + if ($index_change_cnt > 0) { $'($I_COLOR)($INDEX_CHANGE_ICON)($index_change_cnt)($R)' } + )( + if ($conflicted_cnt > 0) { $'($C_COLOR)($CONFLICTED_CHANGE_ICON)($conflicted_cnt)($R)' } + )( + if ($wt_change_cnt > 0) { $'($W_COLOR)($WT_CHANGE_ICON)($wt_change_cnt)($R)' } + )( + if ($untracked_cnt > 0) { $'($U_COLOR)($UNTRACKED_CHANGE_ICON)($untracked_cnt)($R)' } + )( + if $has_no_changes { $'($N_COLOR)($NO_CHANGE_ICON)($R)' } else { $'($H_COLOR)($HAS_CHANGE_ICON)($R)' } + )" + ) + + $repo_status +} + +def git_left_prompt [gs os] { + # replace this 30 with whatever the width of the terminal is + let display_path = (path_abbrev_if_needed (home_abbrev $os.name) 30) + let branch_name = (get_branch_name $gs) + let R = (ansi reset) + + # when reduce is available + # echo "one" "two" "three" | reduce { if ($acc | str starts-with 't') { $acc + $it } { $it }} + + # some icons and the unicode char + # e0b0 + # e0b1 + # e0b2 + # e0b3 + # f1d3 + # f07c or  f115 + # f015 or  f7db + + let GIT_BG = "#C4A000" + let GIT_FG = "#000000" + let TERM_BG = "#0C0C0C" + + let repo_status = (get_repo_status $gs $os) + + # build segments and then put together the segments for the prompt + let os_segment = ([ + (ansi { fg: "#080808" bg: "#CED7CF"}) # os bg color + (char space) # space + (get_os_icon $os) # os icon + (char space) # space + (ansi { fg: "#CED7CF" bg: "#3465A4"}) # color transition + (char -u e0b0) #  + (char space) # space + ] | str collect) + + let is_home_in_path = ($env.PWD | str starts-with $nu.home-path) + let path_segment = (if (($is_home_in_path) && ($branch_name == "")) { + [ + (char -u f015) #  home icon + (char space) # space + $display_path # ~/src/forks/nushell + (ansi { fg: "#CED7CF" bg: "#3465A4"}) # color just to color the next space + (char space) # space + ] | str collect + } else { + [ + (char -u f07c) #  folder icon + (char space) # space + $display_path # ~/src/forks/nushell + (ansi { fg: "#CED7CF" bg: "#3465A4"}) # color just to color the next space + (char space) # space + ] | str collect + }) + + let git_segment = (if ($branch_name != "") { + [ + (ansi { fg: "#3465A4" bg: "#4E9A06"}) # color + (char -u e0b0) #  + (char space) # space + (ansi { fg: $TERM_BG bg: "#4E9A06"}) # color + # (char -u f1d3) #  + (char -u e0a0) #  + (char space) # space + ($branch_name) # main + (char space) # space + (ansi { fg: "#4E9A06" bg: $GIT_BG}) # color + (char -u e0b0) #  + (char space) # space + ($R) # reset color + $repo_status # repo status + ] | str collect + }) + + let git_right = false + let indicator_segment = (if ($branch_name == "" || $git_right) { + [ + (ansi { fg: "#3465A4" bg: $TERM_BG}) # color + (char -u e0b0) #  + ($R) # reset color + ] | str collect + } else { + [ + (ansi { fg: $GIT_BG bg: $TERM_BG}) # color + (char -u e0b0) #  + ($R) # reset color + ] | str collect + }) + + # assemble all segments for final prompt printing + [ + $os_segment + $path_segment + (if ($git_right == false) { + $git_segment + }) + $indicator_segment + ] | str collect +} + +def git_right_prompt [gs os] { + # right prompt ideas + # 1. just the time on the right + # 2. date and time on the right + # 3. git information on the right + # 4. maybe git and time + # 5. would like to get CMD_DURATION_MS going there too when it's implemented + # 6. all of the above, chosen by def parameters + + let branch_name = (get_branch_name $gs) + let repo_status = (get_repo_status $gs $os) + let R = (ansi reset) + let TIME_BG = "#D3D7CF" + let TERM_FG = "#0C0C0C" + let GIT_BG = "#C4A000" + let GIT_FG = "#000000" + let TERM_BG = "#0C0C0C" + let TERM_FG_DEFAULT = "\e[39m" + let TERM_BG_DEFAULT = "\e[49m" + + let datetime_segment = ([ + (ansi { fg: $TIME_BG bg: $TERM_FG}) + (char -u e0b2) #  + (ansi { fg: $TERM_FG bg: $TIME_BG}) + (char space) + (date now | date format '%m/%d/%Y %I:%M:%S%.3f') + (char space) + ($R) + ] | str collect) + + let time_segment = ([ + (ansi { fg: $TIME_BG bg: $TERM_FG}) + (char -u e0b2) #  + (ansi { fg: $TERM_FG bg: $TIME_BG}) + (char space) + (date now | date format '%I:%M:%S %p') + (char space) + ($R) + ] | str collect) + + let git_segment = (if ($branch_name != "") { + [ + (ansi { fg: $GIT_BG bg: $TERM_BG}) # color + (char -u e0b2) #  + (ansi { fg: $TERM_FG bg: $GIT_BG}) # color + (char space) # space + $repo_status # repo status + (ansi { fg: $TERM_FG bg: $GIT_BG}) # color + (char space) + (ansi { fg: "#4E9A06" bg: $GIT_BG }) # color + (char -u e0b2) #  + (ansi { fg: $TERM_BG bg: "#4E9A06"}) # color + (char space) # space + # (char -u f1d3) #  + # (char -u e0a0) #  + (char nf_git_branch) #  + (char space) # space + $branch_name # main + (char space) # space + ($R) # reset color + ] | str collect + }) + + let execution_time_segment = ( + [ + # (ansi { fg: "#606060" bg: "#191323"}) + (ansi { fg: "#606060"}) + $TERM_BG_DEFAULT + (char -u e0b3) + (char space) + $env.CMD_DURATION_MS + (char space) + ($R) + ] | str collect + ) + + let status_segment = ( + [ + (if $env.LAST_EXIT_CODE != 0 { + (ansi { fg: "#CC0000" bg: "#191323"}) + } else { + (ansi { fg: "#606060" bg: "#191323"}) + }) + (char -u e0b3) + (char space) + $env.LAST_EXIT_CODE + (char space) + ($R) + ] | str collect + ) + # 1. datetime - working + # $datetime_segment + + # 2. time only - working + [ + (if $env.LAST_EXIT_CODE != 0 { + $status_segment + }) + $execution_time_segment + $time_segment + ] | str collect + + # 3. git only - working + # $git_segment + + # 4. git + time -> need to fix the transition + # [ + # $git_segment + # $time_segment + # ] | str collect + + # 5. fernando wants this on the left prompt + # [ + # $os_segment + # $time_segment + # $path_segment + # ] +} + +def git_prompt [] { + let gs = (gstat) + let os = $nu.os-info + let left_prompt = (git_left_prompt $gs $os) + let right_prompt = (git_right_prompt $gs $os) + + # set the title of the window/tab + # Wezterm accepts: + # osc0 \x1b]0; + # osc1 \x1b]1; + # osc2 \x1b]2; + # the typical way to set the terminal title is: + # osc2 some_string bel aka (char osc)2;($some_string)(char bel) or "\u001b]2;($some_string)\a" + # bel is escape \a or \x7 or \u0007 + # but i've also seen it as + # osc2 some_string string_terminator aka (char osc)2;($some_string)(ansi st) or "\u001b];($some_string)\\" + # where string_terminator is \ + # so you might want to play around with these settings a bit + + #let abbrev = ((path_abbrev_if_needed (home_abbrev $os.name) 30) | ansi strip) + + # $"\u001b]0;($abbrev)" + # note that this isn't ending properly with a bel or a st, that's + # because it makes the string echo to the screen as an empty line + + # turning off now since a similar thing is built into nushell + it breaks kitty + #$"(ansi osc)2;($abbrev)" + + # return in record literal syntax to be used kind of like a tuple + # so we don't have to run this script more than once per prompt + { + left_prompt: $left_prompt + right_prompt: $right_prompt + } + # + # in the config.nu you would do something like + # use "c:\some\path\to\nu_scripts\engine-q\prompt\oh-my.nu" git_prompt + # let-env PROMPT_COMMAND = { (git_prompt).left_prompt } + # let-env PROMPT_COMMAND_RIGHT = { (git_prompt).right_prompt } + # let-env PROMPT_INDICATOR = " " +} + + +# panache-git +# An opinionated Git prompt for Nushell, styled after posh-git +# +# Quick Start: +# - Download this script (panache-git.nu) +# - In your Nushell config: +# - Source this script +# - Set panache-git as your prompt command +# - Disable the separate prompt indicator by setting it to an empty string +# - For example, with this script in your home directory: +# source ~/panache-git.nu +# let-env PROMPT_COMMAND = { panache-git } +# let-env PROMPT_INDICATOR = { "" } +# - Restart Nushell +# diff --git a/config/nvim.v1/coc-settings.json b/config/nvim.v1/coc-settings.json new file mode 100644 index 0000000..cbac8e1 --- /dev/null +++ b/config/nvim.v1/coc-settings.json @@ -0,0 +1,9 @@ +{ + "languageserver": { + "golang": { + "command": "gopls", + "rootPatterns": ["go.mod", ".vim/", ".git/", ".hg/"], + "filetypes": ["go"] + } + } +} diff --git a/config/nvim.v1/init-gitee.vim b/config/nvim.v1/init-gitee.vim new file mode 100644 index 0000000..f192193 --- /dev/null +++ b/config/nvim.v1/init-gitee.vim @@ -0,0 +1,682 @@ +" " +" ██  ██ ██ ███  ███  ██ ███████  █████  ██  ██ ███████ ███████  ██████  ███  ███ ███████  " +" ██  ██ ██ ████  ████  ██ ██       ██   ██ ██  ██ ██      ██      ██    ██ ████  ████ ██       " +" ██  ██ ██ ██ ████ ██  ██ ███████  ███████ ██  █  ██ █████  ███████ ██  ██ ██ ████ ██ █████ " +"  ██  ██  ██ ██  ██  ██  ██      ██  ██   ██ ██ ███ ██ ██          ██ ██  ██ ██  ██  ██ ██ " +"  ████   ██ ██      ██  ██ ███████  ██  ██  ███ ███  ███████ ███████  ██████  ██      ██ ███████  " +" " +" Install Plug +if empty(glob('~/.config/nvim/autoload/plug.vim')) + silent !curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs + \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim + autocmd VimEnter * PlugInstall --sync | source $MYVIMRC +endif + +" Plug Manager +call plug#begin('~/.config/nvim/plug') + +" let g:plug_url_format = 'https://gitee.com/%s.git' +let g:plug_url_format = 'git@gitee.com:%s.git' + +" themes +Plug 'vim-plug-mirror/NeoSolarized' +Plug 'vim-plug-mirror/rainbow' +Plug 'vim-plug-mirror/vim-nerdtree-syntax-highlight' + +" git +Plug 'vim-plug-mirror/vim-fugitive' +Plug 'vim-plug-mirror/vim-gitgutter' +" Plug 'vim-plug-mirror/ConflictMotions' + +" auto complete +" Plug 'Valloric/YouCompleteMe' +Plug 'vim-plug-mirror/coc.nvim', {'branch': 'release'} +Plug 'vim-plug-mirror/auto-pairs' +Plug 'vim-plug-mirror/nvim-lspconfig' + +" python dev +" Plug 'davidhalter/jedi-vim' +" show indent line +Plug 'vim-plug-mirror/indentLine' +Plug 'vim-plug-mirror/python-mode', { 'for': 'python', 'branch': 'main' } + +" grammar check/highlight +Plug 'vim-plug-mirror/ale' +Plug 'vim-plug-mirror/vim-easy-align' +Plug 'vim-plug-mirror/vim-virtualenv' +Plug 'vim-plug-mirror/nerdcommenter' + +" golang dev +Plug 'mirrors/vim-go' + +" rust +Plug 'vim-plug-mirror/rust.vim' +" run :CocInstall coc-rust-analyzer after installation + +" sh +Plug 'vim-plug-mirror/vim-shfmt', { 'for': 'sh' } + +" hive sql +Plug 'vim-plug-mirror/hive.vim' +" Plug 'vim-plug-mirror/Vim' + +" toml +Plug 'vim-plug-mirror/vim-toml' + +" thrift +Plug 'vim-plug-mirror/thrift.vim' + +" NERDTree +Plug 'vim-plug-mirror/nerdtree' +Plug 'vim-plug-mirror/nerdtree-git-plugin' + +Plug 'vim-plug-mirror/vim-airline' +Plug 'vim-plug-mirror/vim-airline-themes' +" Plug 'vim-plug-mirror/vim-devicons' + +" tools +Plug 'vim-plug-mirror/vim-startify' +Plug 'vim-plug-mirror/LeaderF' +Plug 'vim-plug-mirror/tagbar' +Plug 'vim-plug-mirror/ag.vim' +Plug 'vim-plug-mirror/vim-ripgrep' +" Plug 'epmatsw/ag.vim' +" Plug 'mileszs/ack.vim' + +Plug 'vim-plug-mirror/FlyGrep.vim' +Plug 'vim-plug-mirror/incsearch.vim' +Plug 'vim-plug-mirror/vim-easymotion' +Plug 'vim-plug-mirror/undotree' +Plug 'vim-plug-mirror/vim-surround' +Plug 'vim-plug-mirror/vim-multiple-cursors' +Plug 'vim-plug-mirror/vim-better-whitespace' + +Plug 'vim-plug-mirror/vim-cursorword' +Plug 'vim-plug-mirror/vim-interestingwords' +Plug 'vim-plug-mirror/vim-table-mode' + +" snippets +Plug 'vim-plug-mirror/ultisnips' +Plug 'vim-plug-mirror/vim-snippets' + +call plug#end() + +" ---------------------------------------------------------------------------------------------------------------------- +" basic config +set termguicolors +colorscheme NeoSolarized +set background=dark + +set shortmess=atI +set backspace=indent,eol,start +set number " AKA nu +set relativenumber " AKA rnu +set ruler +set showcmd +set showmatch +set cursorline +syntax on +set incsearch " find as you type search +set hlsearch " highlight search terms +set winminheight=0 " windows can be 0 line high +set ignorecase " case insensitive search +set smartcase " case sensitive when uc present +set wildmenu " show list instead of just completing +set wildmode=list:longest,full " command completion, list matches, then longest common part, then all. +set whichwrap=b,s,h,l,<,>,[,] " backspace and cursor keys wrap to +set scrolljump=5 " lines to scroll when cursor leaves screen +set scrolloff=3 " minimum lines to keep above and below cursor +set foldenable " auto fold code +set gdefault " the /g flag on :s substitutions by default +set clipboard+=unnamedplus +let g:solarized_termcolors=256 + +set encoding=utf-8 +set fenc=utf-8 +set fencs=utf-8,usc-bom,euc-jp,gb18030,gbk,gb2312,cp936 + +" set indent for most codes +set expandtab +set autoindent +set fileformat=unix + +set tabstop=4 +set softtabstop=4 +set shiftwidth=4 + +set foldmethod=indent +set textwidth=120 + +" .py files +autocmd BufNewFile,BufRead *.py +\ set tabstop=4 | +\ set softtabstop=4 | +\ set shiftwidth=4 + +autocmd BufNewFile,BufRead *.yaml,*.yml,*.json,*.ps1,*.lua +\ set tabstop=2 | +\ set softtabstop=2 | +\ set shiftwidth=2 + +autocmd FileType gitconfig +\ set tabstop=4 | +\ set softtabstop=4 | +\ set shiftwidth=4 + +autocmd FileType vim +\ set tabstop=2 | +\ set softtabstop=2 | +\ set shiftwidth=2 + +" map to `,`, default '\' +let g:mapleader = "," +nnoremap ; : +nmap e :e $MYVIMRC +nmap r :so $MYVIMRC + +" Remember to execute /usr/local/bin/python3 -m pip install neovim +if filereadable('/usr/local/bin/python3') + let g:python3_host_prog = '/usr/local/bin/python3' +else + let g:python3_host_prog = '/usr/bin/python3' +endif +let python_highlight_all = 1 + +" indentLine +let g:indentLine_char_list = ['|', '¦', '┆', '┊'] +let g:indentLine_fileTypeExclude = ['defx', 'denite', 'dashboard', 'tagbar', 'vista_kind', 'vista', 'startify', 'nerdtree', 'txt', 'log'] +let g:indentLine_concealcursor = 'niv' + +":verbose set conceallevel 查看哪个插件设置的值 +autocmd FileType json,markdown let g:indentLine_conceallevel = 0 + + +" ale config +let g:ale_sign_error = '✗' +let g:ale_sign_warning = '--' + +" for .hql files +autocmd BufNewFile,BufRead *.hql set filetype=hive expandtab +" for .q files +autocmd BufNewFile,BufRead *.q set filetype=hive expandtab + +" ==# 大小写敏感的等于判断 +" ==? 大小写不敏感的等于判断 +" type :h exp4 to see more comparement +autocmd BufWinEnter quickfix nnoremap + \ q :cclose:lclose +autocmd BufEnter * if (winnr('$') == 1 && &buftype ==# 'quickfix' ) | + \ bd| + \ q | endif + +" ---------------------------------------------------------------------------------------------------------------------- +" startify +let s:header = [ + \ '', + \ '', + \ '', + \' ██╗░░██╗░█████╗░██╗██╗░░░░░  ███╗░░░███╗███████╗░██████╗░░█████╗░████████╗██████╗░░█████╗░███╗░░██╗', + \' ██║░░██║██╔══██╗██║██║░░░░░  ████╗░████║██╔════╝██╔════╝░██╔══██╗╚══██╔══╝██╔══██╗██╔══██╗████╗░██║', + \' ███████║███████║██║██║░░░░░  ██╔████╔██║█████╗░░██║░░██╗░███████║░░░██║░░░██████╔╝██║░░██║██╔██╗██║', + \' ██╔══██║██╔══██║██║██║░░░░░  ██║╚██╔╝██║██╔══╝░░██║░░╚██╗██╔══██║░░░██║░░░██╔══██╗██║░░██║██║╚████║', + \' ██║░░██║██║░░██║██║███████╗  ██║░╚═╝░██║███████╗╚██████╔╝██║░░██║░░░██║░░░██║░░██║╚█████╔╝██║░╚███║', + \' ╚═╝░░╚═╝╚═╝░░╚═╝╚═╝╚══════╝  ╚═╝░░░░░╚═╝╚══════╝░╚═════╝░╚═╝░░╚═╝░░░╚═╝░░░╚═╝░░╚═╝░╚════╝░╚═╝░░╚══╝', + \ '', + \ '', + \ '', + \ ] + +let s:footer = [ + \ '', + \' ███████╗░█████╗░██████╗░  ░█████╗░██╗░░░██╗██████╗░███████╗██████╗░████████╗██████╗░░█████╗░███╗░░██╗', + \' ██╔════╝██╔══██╗██╔══██╗  ██╔══██╗╚██╗░██╔╝██╔══██╗██╔════╝██╔══██╗╚══██╔══╝██╔══██╗██╔══██╗████╗░██║', + \' █████╗░░██║░░██║██████╔╝  ██║░░╚═╝░╚████╔╝░██████╦╝█████╗░░██████╔╝░░░██║░░░██████╔╝██║░░██║██╔██╗██║', + \' ██╔══╝░░██║░░██║██╔══██╗  ██║░░██╗░░╚██╔╝░░██╔══██╗██╔══╝░░██╔══██╗░░░██║░░░██╔══██╗██║░░██║██║╚████║', + \' ██║░░░░░╚█████╔╝██║░░██║  ╚█████╔╝░░░██║░░░██████╦╝███████╗██║░░██║░░░██║░░░██║░░██║╚█████╔╝██║░╚███║', + \' ╚═╝░░░░░░╚════╝░╚═╝░░╚═╝  ░╚════╝░░░░╚═╝░░░╚═════╝░╚══════╝╚═╝░░╚═╝░░░╚═╝░░░╚═╝░░╚═╝░╚════╝░╚═╝░░╚══╝', + \ '', + \ ] + +let g:startify_custom_header = startify#center(s:header) +let g:startify_custom_footer = startify#center(s:footer) + +function! s:set_startify_left_padding() abort + let g:startify_padding_left = winwidth(0)/2 - 20 +endfunction + +autocmd! FileType startify +autocmd FileType startify set laststatus=0 showtabline=0 + \| autocmd BufLeave set laststatus=2 showtabline=2 +autocmd User Startified setlocal buflisted +" autocmd VimEnter * call s:set_startify_left_padding() + +" plugins config +" NERDTree +" open a NERDTree automatically when vim starts up +" autocmd VimEnter * NERDTree +" place the cursor in the editor +autocmd VimEnter * wincmd w +" open a NERDTree automatically when vim starts up if no files were specified +" autocmd StdinReadPre * let s:std_in=1 +" autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif + +" open NERDTree automatically when vim starts up on opening a directory +autocmd StdinReadPre * let s:std_in=1 +autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | endif + +" close vim when the only left open is a NERDTree +autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif + +" If another buffer tries to replace NERDTree, put it in the other window, and bring back NERDTree. +autocmd BufEnter * if bufname('#') =~ 'NERD_tree_\d\+' && bufname('%') !~ 'NERD_tree_\d\+' && winnr('$') > 1 | + \ let buf=bufnr() | buffer# | execute "normal! \w" | execute 'buffer'.buf | endif + +map t :NERDTreeToggle +" locate current file +map l :NERDTreeFind + +" Change default arrows +" let g:NERDTreeDirArrowExpandable = '📁' +" let g:NERDTreeDirArrowCollapsible = '📂' +let g:NERDTreeDirArrowExpandable = '|+|' +let g:NERDTreeDirArrowCollapsible = '|-|' + +let g:NERDTreeGitStatusIndicatorMapCustom = { + \ "Modified" : "✹", + \ "Staged" : "✚", + \ "Untracked" : "✭", + \ "Renamed" : "➜", + \ "Unmerged" : "═", + \ "Deleted" : "✖", + \ "Dirty" : "✗", + \ "Clean" : "✔︎", + \ 'Ignored' : '☒', + \ "Unknown" : "?" + \ } + + +" display row number in NERDTree +" let NERDTreeShowLineNumbers = 1 +" set width +" let NERDTreeWinSize=20 +let NERDTreeIgnore = ['\.pyc$', '\.pyo$', '\~$', '__pycache__$[[dir]]', '\.swp$', 'node_modules'] + +" close rainbow in nerdtree +let g:rainbow_conf = { +\ 'separately': { +\ 'nerdtree': 0 +\ } +\} + +" airline settings. +let g:airline_theme = 'solarized' +let g:airline_solarized_bg='dark' +let g:airline_powerline_fonts = 1 + +if !exists('g:airline_symbols') + let g:airline_symbols = {} +endif + +let g:airline_left_sep = '' +let g:airline_left_alt_sep = '' +let g:airline_right_sep = '' +let g:airline_right_alt_sep = '' +let g:airline_symbols.branch = '' +let g:airline_symbols.readonly = '' +let g:airline_symbols.linenr = '␊' +let g:airline_symbols.maxlinenr = '㏑' + +" show absolute file path in status line +let g:airline_section_c = '%<%F%m %#__accent_red#%{airline#util#wrap(airline#parts#readonly(),0)}%#__restore__#' +" show tab number in tab line +let g:airline#extensions#tabline#enabled = 1 +let g:airline#extensions#tabline#tab_nr_type = 1 +let g:airline#extensions#tabline#formatter = 'default' +let g:airline#extensions#tabline#left_sep = '' +let g:airline#extensions#tabline#left_alt_sep = '' +let g:airline#extensions#tabline#right_sep = '' +let g:airline#extensions#tabline#right_alt_sep = '' + +let g:airline#extensions#bufferline#enabled = 1 + +" leaderF config +let g:Lf_ShortcutF = "ff" +noremap fb :=printf("Leaderf buffer %s", "") +noremap fm :=printf("Leaderf mru %s", "") +noremap ft :=printf("Leaderf bufTag %s", "") +noremap fl :=printf("Leaderf line %s", "") +" let g:Lf_WindowPosition = 'popup' +" 禁用缓存 +let g:Lf_UseCache = 0 +let g:Lf_UseVersionControlTool = 0 +let g:Lf_UseMemoryCache = 0 +let g:Lf_PreviewInPopup = 1 +let g:Lf_StlSeparator = { 'left': "\ue0b0", 'right': "\ue0b2", 'font': "DejaVu Sans Mono for Powerline" } +let g:Lf_PreviewResult = {'Function': 1, 'BufTag': 0, 'File': 1 } +" 设置项目根目录模式 +let g:Lf_WorkingDirectoryMode = 'AF' +let g:Lf_RootMarkers = ['.git', '.svn', '.hg', '.project', '.root'] +" autocmd BufNewFile,BufRead X:/yourdir* let g:Lf_WildIgnore={'file':['*.vcproj', '*.vcxproj'],'dir':[]} +let g:Lf_WildIgnore={ + \ 'file':['*.vcproj', '*.vcxproj', '*.exe', '*.so', '*.sw?', '*.o', '*.py[co]'], + \ 'dir':['.git', '.node_modules', '.hg',] + \ } +let g:Lf_StlColorscheme = 'powerline' + +if has('nvim') + let s:cachedir = expand(stdpath('cache')) + let s:configdir = expand(stdpath('config')) +else + "vim will share same folder with nvim + if has('win32') + let s:cachedir = expand('~/AppData/Local/Temp/cache/nvim') + let s:configdir = expand('~/AppData/Local/nvim') + else + let s:cachedir = expand('~/.cache/nvim') + let s:configdir = expand('~/.config/nvim') + endif +endif +let g:Lf_CacheDirectory = s:cachedir + +" YCM configs +" let g:ycm_autoclose_preview_window_after_completion = 1 +" let g:ycm_key_invoke_completion = '' +" let g:ycm_min_num_identifier_candidate_chars = 2 +" 屏蔽 YCM 的诊断信息 +" let g:ycm_show_diagnostics_ui = 0 +" let g:ycm_collect_identifiers_from_comments_and_strings = 0 + +let g:rainbow_active = 1 + +" devicons config +if exists("g:loaded_webdevicons") + call webdevicons#refresh() +endif +let g:airline_powerline_fonts = 1 +let g:webdevicons_enable_vimfiler = 0 +let g:WebDevIconsNerdTreeAfterGlyphPadding = ' ' +let g:WebDevIconsNerdTreeGitPluginForceVAlign = 0 + +" Tagbar +" map :TagbarToggle + +" nerdtree highlighting +let g:NERDTreeFileExtensionHighlightFullName = 1 +let g:NERDTreeExactMatchHighlightFullName = 1 +let g:NERDTreePatternMatchHighlightFullName = 1 + +" fugitive +" this makes Gdiff uses vertical spilter +set diffopt+=vertical + +" gitgutter +let g:gitgutter_sign_modified = '>' +let g:gitgutter_sign_modified_removed = '>_' + +" better whitespace config: do not show whitespace when open the following file types +let g:better_whitespace_filetypes_blacklist=['', 'startify', 'diff', 'git', + \ 'gitcommit', 'unite', 'qf', 'help', 'markdown', 'fugitive'] + +" NERDCommenter +" Add spaces after comment delimiters by default +let g:NERDSpaceDelims = 1 +" Align line-wise comment delimiters flush left instead of following code indentation +let g:NERDDefaultAlign = 'left' +" Enable trimming of trailing whitespace when uncommenting +let g:NERDTrimTrailingWhitespace = 1 +" Enable NERDCommenterToggle to check all selected lines is commented or not +let g:NERDToggleCheckAllLines = 1 + +" easy align +" Start interactive EasyAlign in visual mode (e.g. vipga) +xmap ga (EasyAlign) +" Start interactive EasyAlign for a motion/text object (e.g. gaip) +nmap ga (EasyAlign) + +" for ack +" if executable('ag') + " let g:ackprg = 'ag --vimgrep' +" endif + +" shfmt +let g:shfmt_fmt_on_save = 1 +let g:shfmt_extra_args = '-i 4' + +" vim-multiple-cursors +let g:multi_cursor_use_default_mapping = 0 +" Default mapping +let g:multi_cursor_start_word_key = '' +let g:multi_cursor_select_all_word_key = '' +let g:multi_cursor_start_key = 'g' +let g:multi_cursor_select_all_key = 'g' +let g:multi_cursor_next_key = '' +let g:multi_cursor_prev_key = '' +let g:multi_cursor_skip_key = '' +let g:multi_cursor_quit_key = '' +" let g:multi_cursor_start_word_key = '' + +" vim-table-mode configs +let g:table_mode_corner='|' +function! s:isAtStartOfLine(mapping) + let text_before_cursor = getline('.')[0 : col('.')-1] + let mapping_pattern = '\V' . escape(a:mapping, '\') + let comment_pattern = '\V' . escape(substitute(&l:commentstring, '%s.*$', '', ''), '\') + return (text_before_cursor =~? '^' . ('\v(' . comment_pattern . '\v)?') . '\s*\v' . mapping_pattern . '\v$') +endfunction + +inoreabbrev + \ isAtStartOfLine('\|\|') ? + \ ':TableModeEnable' : '' +inoreabbrev __ + \ isAtStartOfLine('__') ? + \ ':silent! TableModeDisable' : '__' + +" nvim coc configs +" TextEdit might fail if hidden is not set. +set hidden + +" Some servers have issues with backup files, see #649. +set nobackup +set nowritebackup + +" Give more space for displaying messages. +set cmdheight=2 + +" Having longer updatetime (default is 4000 ms = 4 s) leads to noticeable +" delays and poor user experience. +set updatetime=300 + +" Don't pass messages to |ins-completion-menu|. +set shortmess+=c + +" Always show the signcolumn, otherwise it would shift the text each time +" diagnostics appear/become resolved. +set signcolumn=yes + +" Use tab for trigger completion with characters ahead and navigate. +" NOTE: There's always complete item selected by default, you may want to enable +" no select by `"suggest.noselect": true` in your configuration file. +" NOTE: Use command ':verbose imap ' to make sure tab is not mapped by +" other plugin before putting this into your config. +inoremap + \ coc#pum#visible() ? coc#pum#next(1) : + \ CheckBackspace() ? "\" : + \ coc#refresh() +inoremap coc#pum#visible() ? coc#pum#prev(1) : "\" + +" Make to accept selected completion item or notify coc.nvim to format +" u breaks current undo, please make your own choice. +" inoremap coc#pum#visible() ? coc#pum#confirm() : "\u\\=coc#on_enter()\" +inoremap coc#pum#visible() ? coc#pum#confirm() : "\u\" + +function! CheckBackspace() abort + let col = col('.') - 1 + return !col || getline('.')[col - 1] =~# '\s' +endfunction + +" Use to trigger completion. +if has('nvim') + inoremap coc#refresh() +else + inoremap coc#refresh() +endif + +" Use to confirm completion, `u` means break undo chain at current +" position. Coc only does snippet and additional edit on confirm. +" could be remapped by other vim plugin, try `:verbose imap `. +if exists('*complete_info') + inoremap complete_info()["selected"] != "-1" ? "\" : "\u\" +else + inoremap pumvisible() ? "\" : "\u\" +endif + +" Use `[g` and `]g` to navigate diagnostics +nmap [g (coc-diagnostic-prev) +nmap ]g (coc-diagnostic-next) + +" GoTo code navigation. +nmap gd (coc-definition) +nmap gy (coc-type-definition) +nmap gi (coc-implementation) +nmap gr (coc-references) + +" Use K to show documentation in preview window. +nnoremap K :call ShowDocumentation() + +function! ShowDocumentation() + if CocAction('hasProvider', 'hover') + call CocActionAsync('doHover') + else + call feedkeys('K', 'in') + endif +endfunction + + +" Highlight the symbol and its references when holding the cursor. +autocmd CursorHold * silent call CocActionAsync('highlight') + +" Symbol renaming. +nmap rn (coc-rename) + +" Formatting selected code. +xmap F (coc-format-selected) +nmap F (coc-format-selected) + +augroup mygroup + autocmd! + " Setup formatexpr specified filetype(s). + autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') + " Update signature help on jump placeholder. + autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp') +augroup end + +" Applying codeAction to the selected region. +" Example: `aap` for current paragraph +xmap a (coc-codeaction-selected) +nmap a (coc-codeaction-selected) + +" Remap keys for applying codeAction to the current buffer. +nmap ac (coc-codeaction) +" Apply AutoFix to problem on the current line. +nmap qf (coc-fix-current) + +" Run the Code Lens action on the current line. +nmap cl (coc-codelens-action) + +" Map function and class text objects +" NOTE: Requires 'textDocument.documentSymbol' support from the language server. +xmap if (coc-funcobj-i) +omap if (coc-funcobj-i) +xmap af (coc-funcobj-a) +omap af (coc-funcobj-a) +xmap ic (coc-classobj-i) +omap ic (coc-classobj-i) +xmap ac (coc-classobj-a) +omap ac (coc-classobj-a) + +" Remap and for scroll float windows/popups. +if has('nvim-0.4.0') || has('patch-8.2.0750') + nnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" + nnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" + inoremap coc#float#has_scroll() ? "\=coc#float#scroll(1)\" : "\" + inoremap coc#float#has_scroll() ? "\=coc#float#scroll(0)\" : "\" + vnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" + vnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" +endif + +" Use CTRL-S for selections ranges. +" Requires 'textDocument/selectionRange' support of language server. +nmap (coc-range-select) +xmap (coc-range-select) + +" Add `:Format` command to format current buffer. +command! -nargs=0 Format :call CocActionAsync('format') + +" Add `:Fold` command to fold current buffer. +command! -nargs=? Fold :call CocAction('fold', ) + +" Add `:OR` command for organize imports of the current buffer. +command! -nargs=0 OR :call CocActionAsync('runCommand', 'editor.action.organizeImport') + +" Add (Neo)Vim's native statusline support. +" NOTE: Please see `:h coc-status` for integrations with external plugins that +" provide custom statusline: lightline.vim, vim-airline. +set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')} + +" Mappings for CoCList +" Show all diagnostics. +nnoremap a :CocList diagnostics +" Manage extensions. +nnoremap e :CocList extensions +" Show commands. +nnoremap c :CocList commands +" Find symbol of current document. +nnoremap o :CocList outline +" Search workspace symbols. +nnoremap s :CocList -I symbols +" Do default action for next item. +nnoremap j :CocNext +" Do default action for previous item. +nnoremap k :CocPrev +" Resume latest coc list. +nnoremap p :CocListResume + +" Trail blank characters of EOL +map :FixWhitespace + +" coc rust-analyzer config +let g:LanguageClient_serverCommands = { +\ 'rust': ['rust-analyzer'], +\ } + +let g:ale_linters = {'rust': ['analyzer']} + +" pymode settings +let g:pymode = 1 +let g:pymode_trim_whitespaces = 1 +let g:pymode_options_max_line_length = 120 +let g:pymode_lint_options_pep8 = + \ {'max_line_length': g:pymode_options_max_line_length} + +let g:pymode_rope = 1 +let g:pymode_rope_refix = '' +let g:pymode_lint_cwindow = 0 +set completeopt=menuone,noinsert +let g:pymode_rope_completion = 1 +let g:pymode_rope_complete_on_dot = 1 +let g:pymode_rope_autoimport_modules = ['os', 'shutil', 'datetime'] + +" Find definition +let g:pymode_rope_goto_definition_bind = 'g' +let g:pymode_rope_goto_definition_cmd = 'new' + +" vim snippets +" Trigger configuration. You need to change this to something other than if you use one of the following: +" - https://github.com/Valloric/YouCompleteMe +" - https://github.com/nvim-lua/completion-nvim +let g:UltiSnipsExpandTrigger="" +let g:UltiSnipsJumpForwardTrigger="" +let g:UltiSnipsJumpBackwardTrigger="" + +" If you want :UltiSnipsEdit to split your window. +let g:UltiSnipsEditSplit="vertical" diff --git a/config/nvim.v1/init.vim b/config/nvim.v1/init.vim new file mode 100644 index 0000000..dfde9aa --- /dev/null +++ b/config/nvim.v1/init.vim @@ -0,0 +1,564 @@ +" " +" ██  ██ ██ ███  ███  ██ ███████  █████  ██  ██ ███████ ███████  ██████  ███  ███ ███████  " +" ██  ██ ██ ████  ████  ██ ██       ██   ██ ██  ██ ██      ██      ██    ██ ████  ████ ██       " +" ██  ██ ██ ██ ████ ██  ██ ███████  ███████ ██  █  ██ █████  ███████ ██  ██ ██ ████ ██ █████ " +"  ██  ██  ██ ██  ██  ██  ██      ██  ██   ██ ██ ███ ██ ██          ██ ██  ██ ██  ██  ██ ██ " +"  ████   ██ ██      ██  ██ ███████  ██  ██  ███ ███  ███████ ███████  ██████  ██      ██ ███████  " +" " +" Install Plug +if empty(glob('~/.config/nvim/autoload/plug.vim')) + silent !curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs + \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim + autocmd VimEnter * PlugInstall --sync | source $MYVIMRC +endif + +" Plug Manager +call plug#begin('~/.config/nvim/plug') + +" themes +Plug 'iCyMind/NeoSolarized' +Plug 'luochen1990/rainbow' +Plug 'tiagofumo/vim-nerdtree-syntax-highlight' + +" git +Plug 'tpope/vim-fugitive' +Plug 'airblade/vim-gitgutter' + +" auto complete +" Plug 'Valloric/YouCompleteMe' +Plug 'neoclide/coc.nvim', {'branch': 'release'} +Plug 'jiangmiao/auto-pairs' +Plug 'neovim/nvim-lspconfig' + +" python dev +" Plug 'davidhalter/jedi-vim' +" show indent line +Plug 'Yggdroot/indentLine' +Plug 'python-mode/python-mode', { 'for': 'python', 'branch': 'develop' } + +" grammar check/highlight +Plug 'w0rp/ale' +Plug 'junegunn/vim-easy-align' +Plug 'plytophogy/vim-virtualenv' +Plug 'scrooloose/nerdcommenter' + +" golang dev +Plug 'fatih/vim-go' + +" rust +Plug 'rust-lang/rust.vim' +" run :CocInstall coc-rust-analyzer after installation + +" sh +Plug 'z0mbix/vim-shfmt', { 'for': 'sh' } + +" hive sql +Plug 'autowitch/hive.vim' +Plug 'JessicaKMcIntosh/Vim' + +" toml +Plug 'cespare/vim-toml' + +" thrift +Plug 'solarnz/thrift.vim' + +" NERDTree +Plug 'preservim/nerdtree' +Plug 'Xuyuanp/nerdtree-git-plugin' + +Plug 'vim-airline/vim-airline' +Plug 'vim-airline/vim-airline-themes' +Plug 'ryanoasis/vim-devicons' + +" tools +Plug 'mhinz/vim-startify' +Plug 'Yggdroot/LeaderF' +Plug 'majutsushi/tagbar' +Plug 'astroshot/ag.vim' +Plug 'astroshot/vim-ripgrep' +" Plug 'epmatsw/ag.vim' +" Plug 'mileszs/ack.vim' + +Plug 'wsdjeg/FlyGrep.vim' +Plug 'haya14busa/incsearch.vim' +Plug 'easymotion/vim-easymotion' +Plug 'mbbill/undotree' +Plug 'tpope/vim-surround' +Plug 'terryma/vim-multiple-cursors' +Plug 'ntpeters/vim-better-whitespace' + +Plug 'itchyny/vim-cursorword' +Plug 'lfv89/vim-interestingwords' +Plug 'dhruvasagar/vim-table-mode' + +call plug#end() + +" ---------------------------------------------------------------------------------------------------------------------- +" basic config +set termguicolors +colorscheme NeoSolarized +set background=dark + +set shortmess=atI +set backspace=indent,eol,start +set number " AKA nu +set relativenumber " AKA rnu +set ruler +set showcmd +set showmatch +set cursorline +syntax on +set incsearch " find as you type search +set hlsearch " highlight search terms +set winminheight=0 " windows can be 0 line high +set ignorecase " case insensitive search +set smartcase " case sensitive when uc present +set wildmenu " show list instead of just completing +set wildmode=list:longest,full " command completion, list matches, then longest common part, then all. +set whichwrap=b,s,h,l,<,>,[,] " backspace and cursor keys wrap to +set scrolljump=5 " lines to scroll when cursor leaves screen +set scrolloff=3 " minimum lines to keep above and below cursor +set foldenable " auto fold code +set gdefault " the /g flag on :s substitutions by default +set clipboard+=unnamedplus +let g:solarized_termcolors=256 + +set encoding=utf-8 +set fenc=utf-8 +set fencs=utf-8,usc-bom,euc-jp,gb18030,gbk,gb2312,cp936 + +" set indent for most codes +set expandtab +set autoindent +set fileformat=unix + +set tabstop=4 +set softtabstop=4 +set shiftwidth=4 + +set foldmethod=indent +set textwidth=120 + +" .py files +autocmd BufNewFile,BufRead *.py +\ set tabstop=4 | +\ set softtabstop=4 | +\ set shiftwidth=4 + +autocmd BufNewFile,BufRead *.yaml,*.yml,*.json,*.ps1 +\ set tabstop=2 | +\ set softtabstop=2 | +\ set shiftwidth=2 + +autocmd FileType gitconfig +\ set tabstop=4 | +\ set softtabstop=4 | +\ set shiftwidth=4 + +autocmd FileType vim +\ set tabstop=2 | +\ set softtabstop=2 | +\ set shiftwidth=2 + +" map to `,`, default '\' +let g:mapleader = "," +nnoremap ; : +nmap e :e $MYVIMRC +nmap r :so $MYVIMRC + +" Remember to execute /usr/local/bin/python3 -m pip install neovim +if filereadable('/usr/local/bin/python3') + let g:python3_host_prog = '/usr/local/bin/python3' +else + let g:python3_host_prog = '/usr/bin/python3' +endif +let python_highlight_all = 1 + +" indentLine +let g:indentLine_char_list = ['|', '¦', '┆', '┊'] +let g:indentLine_fileTypeExclude = ['defx', 'denite', 'dashboard', 'tagbar', 'vista_kind', 'vista', 'startify', 'nerdtree', 'txt'] +let g:indentLine_concealcursor = 'niv' +autocmd FileType json,markdown let g:indentLine_conceallevel = 0 + +" ale config +let g:ale_sign_error = '✗' +let g:ale_sign_warning = '--' + +" for .hql files +autocmd BufNewFile,BufRead *.hql set filetype=hive expandtab +" for .q files +autocmd BufNewFile,BufRead *.q set filetype=hive expandtab + +" ==# 大小写敏感的等于判断 +" ==? 大小写不敏感的等于判断 +" type :h exp4 to see more comparement +autocmd BufWinEnter quickfix nnoremap + \ q :cclose:lclose +autocmd BufEnter * if (winnr('$') == 1 && &buftype ==# 'quickfix' ) | + \ bd| + \ q | endif + +" ---------------------------------------------------------------------------------------------------------------------- +" startify +let s:header = [ + \ '', + \ ' __ __________ __ ____ _____ __ ______ ________ ___ _____ _ ________ ', + \ ' / / / / ____/ / / / / __ \ / ___// / / / __ \/ ____/ //_/ | / / | | / / ____/ ', + \ ' / /_/ / __/ / / / / / / / / \__ \/ /_/ / / / / / / ,< | | /| / / /| | | / / __/ ', + \ ' / __ / /___/ /___/ /___/ /_/ / ___/ / __ / /_/ / /___/ /| | | |/ |/ / ___ | |/ / /___ ', + \ ' /_/ /_/_____/_____/_____/\____/ /____/_/ /_/\____/\____/_/ |_| |__/|__/_/ |_|___/_____/ ', + \ '', + \ ] + +let s:footer = [ + \ '', + \ ' ██ █ █ ▄ █ ██ ▄█ █ █▀▄▀█ ▄███▄ ▄▀ ██ ▄▄▄▄▀ █▄▄▄▄ ████▄ ▄ ', + \ ' █ █ █ █ █ █ █ █ ██ █ █ █ █ █▀ ▀ ▄▀ █ █ ▀▀▀ █ █ ▄▀ █ █ █ ', + \ ' █▄▄█ █ █ ██▀▀█ █▄▄█ ██ █ █ ▄ █ ██▄▄ █ ▀▄ █▄▄█ █ █▀▀▌ █ █ ██ █ ', + \ ' █ █ ███▄ ███▄ █ █ █ █ ▐█ ███▄ █ █ █▄ ▄▀ █ █ █ █ █ █ █ ▀████ █ █ █ ', + \ ' █ ▀ ▀ █ █ ▐ ▀ █ ▀███▀ ███ █ ▀ █ █ █ █ ', + \ ' █ ▀ █ ▀ █ ▀ █ ██ ', + \ ' ▀ ▀ ▀ ', + \ '', + \ ] + +let g:startify_custom_header = startify#center(s:header) +let g:startify_custom_footer = startify#center(s:footer) + +function! s:set_startify_left_padding() abort + let g:startify_padding_left = winwidth(0)/2 - 20 +endfunction + +autocmd! FileType startify +autocmd FileType startify set laststatus=0 showtabline=0 + \| autocmd BufLeave set laststatus=2 showtabline=2 +autocmd User Startified setlocal buflisted +" autocmd VimEnter * call s:set_startify_left_padding() + +" plugins config +" NERDTree +" open a NERDTree automatically when vim starts up +" autocmd VimEnter * NERDTree +" place the cursor in the editor +autocmd VimEnter * wincmd w +" open a NERDTree automatically when vim starts up if no files were specified +" autocmd StdinReadPre * let s:std_in=1 +" autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif + +" open NERDTree automatically when vim starts up on opening a directory +autocmd StdinReadPre * let s:std_in=1 +autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | endif + +" close vim when the only left open is a NERDTree +autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif + +map t :NERDTreeToggle +" locate current file +map l :NERDTreeFind + + +" display row number in NERDTree +" let NERDTreeShowLineNumbers = 1 +" set width +" let NERDTreeWinSize=20 +let NERDTreeIgnore = ['\.pyc$', '\.pyo$', '\~$', '__pycache__$[[dir]]', '\.swp$'] + +" close rainbow in nerdtree +let g:rainbow_conf = { +\ 'separately': { +\ 'nerdtree': 0 +\ } +\} + +" airline settings. +let g:airline_theme = 'solarized' +let g:airline_solarized_bg='dark' +let g:airline_powerline_fonts = 1 + +if !exists('g:airline_symbols') + let g:airline_symbols = {} +endif + +let g:airline_left_sep = '' +let g:airline_left_alt_sep = '' +let g:airline_right_sep = '' +let g:airline_right_alt_sep = '' +let g:airline_symbols.branch = '' +let g:airline_symbols.readonly = '' +let g:airline_symbols.linenr = '␊' +let g:airline_symbols.maxlinenr = '㏑' + +" show absolute file path in status line +let g:airline_section_c = '%<%F%m %#__accent_red#%{airline#util#wrap(airline#parts#readonly(),0)}%#__restore__#' +" show tab number in tab line +let g:airline#extensions#tabline#enabled = 1 +let g:airline#extensions#tabline#tab_nr_type = 1 +let g:airline#extensions#tabline#formatter = 'default' +let g:airline#extensions#tabline#left_sep = '' +let g:airline#extensions#tabline#left_alt_sep = '' +let g:airline#extensions#tabline#right_sep = '' +let g:airline#extensions#tabline#right_alt_sep = '' + +let g:airline#extensions#bufferline#enabled = 1 + +" leaderF config +let g:Lf_WindowPosition = 'popup' +let g:Lf_PreviewInPopup = 1 +let g:Lf_StlSeparator = { 'left': "\ue0b0", 'right': "\ue0b2", 'font': "DejaVu Sans Mono for Powerline" } +let g:Lf_PreviewResult = {'Function': 1, 'BufTag': 0, 'File': 1 } +let g:LF_NormalMap = { +\ "File": [[ "u", ':LeaderfFile ..' ]] +\} + +" YCM configs +" let g:ycm_autoclose_preview_window_after_completion = 1 +" let g:ycm_key_invoke_completion = '' +" let g:ycm_min_num_identifier_candidate_chars = 2 +" 屏蔽 YCM 的诊断信息 +" let g:ycm_show_diagnostics_ui = 0 +" let g:ycm_collect_identifiers_from_comments_and_strings = 0 + +let g:rainbow_active = 1 + +" devicons config +if exists("g:loaded_webdevicons") + call webdevicons#refresh() +endif +let g:airline_powerline_fonts = 1 +let g:webdevicons_enable_vimfiler = 0 +let g:WebDevIconsNerdTreeAfterGlyphPadding = ' ' +let g:WebDevIconsNerdTreeGitPluginForceVAlign = 0 + +" Tagbar +" map :TagbarToggle + +" nerdtree highlighting +let g:NERDTreeFileExtensionHighlightFullName = 1 +let g:NERDTreeExactMatchHighlightFullName = 1 +let g:NERDTreePatternMatchHighlightFullName = 1 + +" fugitive +" this makes Gdiff uses vertical spilter +set diffopt+=vertical + +" gitgutter +let g:gitgutter_sign_modified = '>' +let g:gitgutter_sign_modified_removed = '>_' + +" better whitespace config: do not show whitespace when open the following file types +let g:better_whitespace_filetypes_blacklist=['', 'startify', 'diff', 'git', + \ 'gitcommit', 'unite', 'qf', 'help', 'markdown', 'fugitive'] + +" NERDCommenter +" Add spaces after comment delimiters by default +let g:NERDSpaceDelims = 1 +" Align line-wise comment delimiters flush left instead of following code indentation +let g:NERDDefaultAlign = 'left' +" Enable trimming of trailing whitespace when uncommenting +let g:NERDTrimTrailingWhitespace = 1 +" Enable NERDCommenterToggle to check all selected lines is commented or not +let g:NERDToggleCheckAllLines = 1 + +" easy align +" Start interactive EasyAlign in visual mode (e.g. vipga) +xmap ga (EasyAlign) +" Start interactive EasyAlign for a motion/text object (e.g. gaip) +nmap ga (EasyAlign) + +" for ack +" if executable('ag') + " let g:ackprg = 'ag --vimgrep' +" endif + +" shfmt +let g:shfmt_fmt_on_save = 1 +let g:shfmt_extra_args = '-i 4' + +" vim-multiple-cursors +let g:multi_cursor_use_default_mapping = 0 +" Default mapping +let g:multi_cursor_start_word_key = '' +let g:multi_cursor_select_all_word_key = '' +let g:multi_cursor_start_key = 'g' +let g:multi_cursor_select_all_key = 'g' +let g:multi_cursor_next_key = '' +let g:multi_cursor_prev_key = '' +let g:multi_cursor_skip_key = '' +let g:multi_cursor_quit_key = '' +" let g:multi_cursor_start_word_key = '' + +" vim-table-mode configs +let g:table_mode_corner='|' +function! s:isAtStartOfLine(mapping) + let text_before_cursor = getline('.')[0 : col('.')-1] + let mapping_pattern = '\V' . escape(a:mapping, '\') + let comment_pattern = '\V' . escape(substitute(&l:commentstring, '%s.*$', '', ''), '\') + return (text_before_cursor =~? '^' . ('\v(' . comment_pattern . '\v)?') . '\s*\v' . mapping_pattern . '\v$') +endfunction + +inoreabbrev + \ isAtStartOfLine('\|\|') ? + \ ':TableModeEnable' : '' +inoreabbrev __ + \ isAtStartOfLine('__') ? + \ ':silent! TableModeDisable' : '__' + +" nvim coc configs + +" TextEdit might fail if hidden is not set. +set hidden + +" Some servers have issues with backup files, see #649. +set nobackup +set nowritebackup + +" Give more space for displaying messages. +set cmdheight=2 + +" Having longer updatetime (default is 4000 ms = 4 s) leads to noticeable +" delays and poor user experience. +set updatetime=300 + +" Don't pass messages to |ins-completion-menu|. +set shortmess+=c + +" Always show the signcolumn, otherwise it would shift the text each time +" diagnostics appear/become resolved. +set signcolumn=yes + +" Use tab for trigger completion with characters ahead and navigate. +" NOTE: Use command ':verbose imap ' to make sure tab is not mapped by +" other plugin before putting this into your config. +inoremap + \ pumvisible() ? "\" : + \ check_back_space() ? "\" : + \ coc#refresh() +inoremap pumvisible() ? "\" : "\" + +function! s:check_back_space() abort + let col = col('.') - 1 + return !col || getline('.')[col - 1] =~# '\s' +endfunction + +" Use to trigger completion. +inoremap coc#refresh() + +" Use to confirm completion, `u` means break undo chain at current +" position. Coc only does snippet and additional edit on confirm. +" could be remapped by other vim plugin, try `:verbose imap `. +if exists('*complete_info') + inoremap complete_info()["selected"] != "-1" ? "\" : "\u\" +else + inoremap pumvisible() ? "\" : "\u\" +endif + +" Use `[g` and `]g` to navigate diagnostics +nmap [g (coc-diagnostic-prev) +nmap ]g (coc-diagnostic-next) + +" GoTo code navigation. +nmap gd (coc-definition) +nmap gy (coc-type-definition) +nmap gi (coc-implementation) +nmap gr (coc-references) + +" Use K to show documentation in preview window. +nnoremap K :call show_documentation() + +function! s:show_documentation() + if (index(['vim','help'], &filetype) >= 0) + execute 'h '.expand('') + else + call CocAction('doHover') + endif +endfunction + +" Highlight the symbol and its references when holding the cursor. +autocmd CursorHold * silent call CocActionAsync('highlight') + +" Symbol renaming. +nmap rn (coc-rename) + +" Formatting selected code. +xmap F (coc-format-selected) +nmap F (coc-format-selected) + +augroup js_group + autocmd! + " Setup formatexpr specified filetype(s). + autocmd FileType js,typescript,json setlocal formatexpr=CocAction('formatSelected') + " Update signature help on jump placeholder. + autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp') +augroup end + +" Applying codeAction to the selected region. +" Example: `aap` for current paragraph +xmap a (coc-codeaction-selected) +nmap a (coc-codeaction-selected) + +" Remap keys for applying codeAction to the current line. +nmap ac (coc-codeaction) +" Apply AutoFix to problem on the current line. +nmap qf (coc-fix-current) + +" Introduce function text object +" NOTE: Requires 'textDocument.documentSymbol' support from the language server. +xmap if (coc-funcobj-i) +xmap af (coc-funcobj-a) +omap if (coc-funcobj-i) +omap af (coc-funcobj-a) + +" Use for selections ranges. +" NOTE: Requires 'textDocument/selectionRange' support from the language server. +" coc-tsserver, coc-python are the examples of servers that support it. +nmap (coc-range-select) +xmap (coc-range-select) + +" Add `:Format` command to format current buffer. +command! -nargs=0 Format :call CocAction('format') + +" Add `:Fold` command to fold current buffer. +command! -nargs=? Fold :call CocAction('fold', ) + +" Add `:OR` command for organize imports of the current buffer. +command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport') + +" Add (Neo)Vim's native statusline support. +" NOTE: Please see `:h coc-status` for integrations with external plugins that +" provide custom statusline: lightline.vim, vim-airline. +set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')} + +" Mappings using CoCList: +" Show all diagnostics. +nnoremap a :CocList diagnostics +" Manage extensions. +nnoremap e :CocList extensions +" Show commands. +nnoremap c :CocList commands +" Find symbol of current document. +nnoremap o :CocList outline +" Search workspace symbols. +nnoremap s :CocList -I symbols +" Do default action for next item. +nnoremap j :CocNext +" Do default action for previous item. +nnoremap k :CocPrev +" Resume latest coc list. +nnoremap p :CocListResume + +" Trail blank characters of EOL +map :FixWhitespace + +" coc rust-analyzer config +let g:LanguageClient_serverCommands = { +\ 'rust': ['rust-analyzer'], +\ } + +let g:ale_linters = {'rust': ['analyzer']} + +" pymode settings +let g:pymode_options_max_line_length = 120 +let g:pymode_lint_options_pep8 = + \ {'max_line_length': g:pymode_options_max_line_length} + +let g:pymode_lint_cwindow = 0 diff --git a/config/nvim.v1/lua/ale.lua b/config/nvim.v1/lua/ale.lua new file mode 100644 index 0000000..f8819ee --- /dev/null +++ b/config/nvim.v1/lua/ale.lua @@ -0,0 +1,3 @@ +vim.g.ale_sign_error = '✗' +vim.g.ale_sign_warning = '--' +vim.g.ale_linters = { rust = {'analyzer'} } \ No newline at end of file diff --git a/config/nvim.v1/lua/complete.lua b/config/nvim.v1/lua/complete.lua new file mode 100644 index 0000000..ab4083c --- /dev/null +++ b/config/nvim.v1/lua/complete.lua @@ -0,0 +1,181 @@ +vim.cmd([[ +" nvim coc configs +" TextEdit might fail if hidden is not set. +set hidden + +" Some servers have issues with backup files, see #649. +set nobackup +set nowritebackup + +" Give more space for displaying messages. +set cmdheight=2 + +" Having longer updatetime (default is 4000 ms = 4 s) leads to noticeable +" delays and poor user experience. +set updatetime=300 + +" Don't pass messages to |ins-completion-menu|. +set shortmess+=c + +" Always show the signcolumn, otherwise it would shift the text each time +" diagnostics appear/become resolved. +set signcolumn=yes + +" Use tab for trigger completion with characters ahead and navigate. +" NOTE: There's always complete item selected by default, you may want to enable +" no select by `"suggest.noselect": true` in your configuration file. +" NOTE: Use command ':verbose imap ' to make sure tab is not mapped by +" other plugin before putting this into your config. +inoremap + \ coc#pum#visible() ? coc#pum#next(1) : + \ CheckBackspace() ? "\" : + \ coc#refresh() +inoremap coc#pum#visible() ? coc#pum#prev(1) : "\" + +" Make to accept selected completion item or notify coc.nvim to format +" u breaks current undo, please make your own choice. +" inoremap coc#pum#visible() ? coc#pum#confirm() : "\u\\=coc#on_enter()\" +inoremap coc#pum#visible() ? coc#pum#confirm() : "\u\" + +function! CheckBackspace() abort + let col = col('.') - 1 + return !col || getline('.')[col - 1] =~# '\s' +endfunction + +" Use to trigger completion. +if has('nvim') + inoremap coc#refresh() +else + inoremap coc#refresh() +endif + +" Use to confirm completion, `u` means break undo chain at current +" position. Coc only does snippet and additional edit on confirm. +" could be remapped by other vim plugin, try `:verbose imap `. +if exists('*complete_info') + inoremap complete_info()["selected"] != "-1" ? "\" : "\u\" +else + inoremap pumvisible() ? "\" : "\u\" +endif + +" Use `[g` and `]g` to navigate diagnostics +nmap [g (coc-diagnostic-prev) +nmap ]g (coc-diagnostic-next) + +" GoTo code navigation. +nmap gd (coc-definition) +nmap gy (coc-type-definition) +nmap gi (coc-implementation) +nmap gr (coc-references) + +" Use K to show documentation in preview window. +nnoremap K :call ShowDocumentation() + +function! ShowDocumentation() + if CocAction('hasProvider', 'hover') + call CocActionAsync('doHover') + else + call feedkeys('K', 'in') + endif +endfunction + + +" Highlight the symbol and its references when holding the cursor. +autocmd CursorHold * silent call CocActionAsync('highlight') + +" Symbol renaming. +nmap rn (coc-rename) + +" Formatting selected code. +xmap F (coc-format-selected) +nmap F (coc-format-selected) + +augroup mygroup + autocmd! + " Setup formatexpr specified filetype(s). + autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') + " Update signature help on jump placeholder. + autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp') +augroup end + +" Applying codeAction to the selected region. +" Example: `aap` for current paragraph +xmap a (coc-codeaction-selected) +nmap a (coc-codeaction-selected) + +" Remap keys for applying codeAction to the current buffer. +nmap ac (coc-codeaction) +" Apply AutoFix to problem on the current line. +nmap qf (coc-fix-current) + +" Run the Code Lens action on the current line. +nmap cl (coc-codelens-action) + +" Map function and class text objects +" NOTE: Requires 'textDocument.documentSymbol' support from the language server. +xmap if (coc-funcobj-i) +omap if (coc-funcobj-i) +xmap af (coc-funcobj-a) +omap af (coc-funcobj-a) +xmap ic (coc-classobj-i) +omap ic (coc-classobj-i) +xmap ac (coc-classobj-a) +omap ac (coc-classobj-a) + +" Remap and for scroll float windows/popups. +if has('nvim-0.4.0') || has('patch-8.2.0750') + nnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" + nnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" + inoremap coc#float#has_scroll() ? "\=coc#float#scroll(1)\" : "\" + inoremap coc#float#has_scroll() ? "\=coc#float#scroll(0)\" : "\" + vnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" + vnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" +endif + +" Use CTRL-S for selections ranges. +" Requires 'textDocument/selectionRange' support of language server. +nmap (coc-range-select) +xmap (coc-range-select) + +" Add `:Format` command to format current buffer. +command! -nargs=0 Format :call CocActionAsync('format') + +" Add `:Fold` command to fold current buffer. +command! -nargs=? Fold :call CocAction('fold', ) + +" Add `:OR` command for organize imports of the current buffer. +command! -nargs=0 OR :call CocActionAsync('runCommand', 'editor.action.organizeImport') + +" Add (Neo)Vim's native statusline support. +" NOTE: Please see `:h coc-status` for integrations with external plugins that +" provide custom statusline: lightline.vim, vim-airline. +set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')} + +" Mappings for CoCList +" Show all diagnostics. +nnoremap a :CocList diagnostics +" Manage extensions. +nnoremap e :CocList extensions +" Show commands. +nnoremap c :CocList commands +" Find symbol of current document. +nnoremap o :CocList outline +" Search workspace symbols. +nnoremap s :CocList -I symbols +" Do default action for next item. +nnoremap j :CocNext +" Do default action for previous item. +nnoremap k :CocPrev +" Resume latest coc list. +nnoremap p :CocListResume + +" Trail blank characters of EOL +map :FixWhitespace + +" coc rust-analyzer config +let g:LanguageClient_serverCommands = { +\ 'rust': ['rust-analyzer'], +\ } + +let g:ale_linters = {'rust': ['analyzer']} +]]) \ No newline at end of file diff --git a/config/nvim.v1/lua/fugitive.lua b/config/nvim.v1/lua/fugitive.lua new file mode 100644 index 0000000..51116da --- /dev/null +++ b/config/nvim.v1/lua/fugitive.lua @@ -0,0 +1,9 @@ +-- fugitive +vim.opt.diffopt = vim.opt.diffopt + { vertical = true } + +-- gitgutter +vim.g.gitgutter_sign_modified = '>' +vim.g.gitgutter_sign_modified_removed = '>_' + +-- better whitespace config: do not show whitespace when open the following file types +vim.g.better_whitespace_filetypes_blacklist = {'', 'startify', 'diff', 'git', 'gitcommit', 'unite', 'qf', 'help', 'markdown', 'fugitive'} diff --git a/config/nvim.v1/lua/indentline.lua b/config/nvim.v1/lua/indentline.lua new file mode 100644 index 0000000..5f49d3a --- /dev/null +++ b/config/nvim.v1/lua/indentline.lua @@ -0,0 +1,54 @@ +-- indentLine config +-- local status_ok, indent_blankline = pcall(require, "indent_blankline") +-- if not status_ok then +-- return +-- end + +vim.g.indentLine_enabled = 1 +vim.g.indentLine_char_list = {'|', '¦', '┆', '┊'} +vim.g.indentLine_fileTypeExclude = { + 'alpha', + 'defx', + 'denite', + 'dashboard', + 'tagbar', + 'vista_kind', + 'vista', + 'startify', + 'nerdtree', + 'txt', + 'packer', + 'log', +} +vim.g.indentLine_concealcursor = 'niv' + +vim.cmd([[autocmd FileType json,markdown let g:indentLine_conceallevel=0]]) + +-- TODO: I guess this char can be space +vim.g.indent_blankline_char = "▏" +vim.g.indent_blankline_show_trailing_blankline_indent = false +vim.g.indent_blankline_show_first_indent_level = true +vim.g.indent_blankline_use_treesitter = true +vim.g.indent_blankline_show_current_context = true +vim.g.indent_blankline_context_patterns = { + "class", + "return", + "function", + "method", + "^if", + "^while", + "jsx_element", + "^for", + "^object", + "^table", + "block", + "arguments", + "if_statement", + "else_clause", + "jsx_element", + "jsx_self_closing_element", + "try_statement", + "catch_clause", + "import_statement", + "operation_type", +} diff --git a/config/nvim.v1/lua/leaderf.lua b/config/nvim.v1/lua/leaderf.lua new file mode 100644 index 0000000..0ecf1aa --- /dev/null +++ b/config/nvim.v1/lua/leaderf.lua @@ -0,0 +1,40 @@ +vim.g.Lf_ShortcutF = "ff" + +local default_opts = {noremap = true, silent = true} +vim.api.nvim_set_keymap('n', 'fb', ':=printf("Leaderf buffer %s", "")', default_opts) +vim.api.nvim_set_keymap('n', 'fm', ':=printf("Leaderf mru %s", "")', default_opts) +vim.api.nvim_set_keymap('n', 'ft', ':=printf("Leaderf bufTag %s", "")', default_opts) +vim.api.nvim_set_keymap('n', 'fl', ':=printf("Leaderf line %s", "")', default_opts) + +vim.g.Lf_UseCache = 0 +vim.g.Lf_UseVersionControlTool = 0 +vim.g.Lf_UseMemoryCache = 0 +vim.g.Lf_PreviewInPopup = 1 +vim.g.Lf_StlSeparator = { left = '', right = '', font = "DejaVu Sans Mono for Powerline" } +vim.g.Lf_PreviewResult = {Function = 1, BufTag = 0, File = 1} +-- 根目录模式 +vim.g.Lf_WorkingDirectoryMode = 'AF' +vim.g.Lf_RootMarkers = {'.git', '.svn', '.hg', '.project', '.root'} +-- autocmd BufNewFile,BufRead X:/yourdir* let g:Lf_WildIgnore={'file':['*.vcproj', '*.vcxproj'],'dir':[]} +vim.g.Lf_WildIgnore = { + file = {'*.vcproj', '*.vcxproj', '*.exe', '*.so', '*.sw?', '*.o', '*.py[co]'}, + dir = {'.git', '.node_modules', '.hg'}, +} +vim.g.Lf_StlColorscheme = 'powerline' + +vim.cmd [[ +if has('nvim') + let s:cachedir = expand(stdpath('cache')) + let s:configdir = expand(stdpath('config')) +else + "vim will share same folder with nvim + if has('win32') + let s:cachedir = expand('~/AppData/Local/Temp/cache/nvim') + let s:configdir = expand('~/AppData/Local/nvim') + else + let s:cachedir = expand('~/.cache/nvim') + let s:configdir = expand('~/.config/nvim') + endif +endif +let g:Lf_CacheDirectory = s:cachedir +]] diff --git a/config/nvim.v1/lua/nerdcomment.lua b/config/nvim.v1/lua/nerdcomment.lua new file mode 100644 index 0000000..d9d1584 --- /dev/null +++ b/config/nvim.v1/lua/nerdcomment.lua @@ -0,0 +1,9 @@ +-- NERDCommenter +-- Add spaces after comment delimiters by default +vim.g.NERDSpaceDelims = 1 +-- Align line-wise comment delimiters flush left instead of following code indentation +vim.g.NERDDefaultAlign = 'left' +-- Enable trimming of trailing whitespace when uncommenting +vim.g.NERDTrimTrailingWhitespace = 1 +-- Enable NERDCommenterToggle to check all selected lines is commented or not +vim.g.NERDToggleCheckAllLines = 1 diff --git a/config/nvim.v1/lua/nerdtree.lua b/config/nvim.v1/lua/nerdtree.lua new file mode 100644 index 0000000..94f435b --- /dev/null +++ b/config/nvim.v1/lua/nerdtree.lua @@ -0,0 +1,46 @@ +-- NERDTree +-- open a NERDTree automatically when vim starts up +-- autocmd VimEnter * NERDTree +-- place the cursor in the editor +vim.cmd [[autocmd VimEnter * wincmd w]] +vim.cmd [[autocmd StdinReadPre * let s:std_in=1]] +vim.cmd [[autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | endif]] +-- close vim when the only left open is a NERDTree +vim.cmd [[autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif]] +-- If another buffer tries to replace NERDTree, put it in the other window, and bring back NERDTree. +vim.cmd [[autocmd BufEnter * if bufname('#') =~ 'NERD_tree_\d\+' && bufname('%') !~ 'NERD_tree_\d\+' && winnr('$') > 1 | let buf=bufnr() | buffer# | execute "normal! \w" | execute 'buffer'.buf | endif]] + +-- toggle nerdtree +local default_opts = {noremap = true, silent = true} +vim.api.nvim_set_keymap('', 't', ':NERDTreeToggle', default_opts) +vim.api.nvim_set_keymap('', 'l', ':NERDTreeFind', default_opts) + +-- " Change default arrows +-- " let g:NERDTreeDirArrowExpandable = '📁' +-- " let g:NERDTreeDirArrowCollapsible = '📂' +vim.g.NERDTreeDirArrowExpandable = '+' +vim.g.NERDTreeDirArrowCollapsible = '-' +vim.g.NERDTreeGitStatusIndicatorMapCustom = { + Modified = "✹", + Staged = "✚", + Untracked = "✭", + Renamed = "➜", + Unmerged = "═", + Deleted = "✖", + Dirty = "✗", + Clean = "✔︎", + Ignored = '☒', + Unknown = "?" +} + +-- " display row number in NERDTree +-- " let NERDTreeShowLineNumbers = 1 +-- " set width +-- " let NERDTreeWinSize=20 +-- vim.cmd "let NERDTreeIgnore = []" +vim.g.NERDTreeIgnore = {'\\.pyc$', '\\.pyo$', '\\~$', '__pycache__$[[dir]]', '\\.swp$', 'node_modules'} + +vim.g.NERDTreeFileExtensionHighlightFullName = 1 +vim.g.NERDTreeExactMatchHighlightFullName = 1 +vim.g.NERDTreePatternMatchHighlightFullName = 1 + diff --git a/config/nvim.v1/lua/plug.lua b/config/nvim.v1/lua/plug.lua new file mode 100644 index 0000000..89d4235 --- /dev/null +++ b/config/nvim.v1/lua/plug.lua @@ -0,0 +1,98 @@ +-- For plug manager +-- +vim.cmd [[ +if empty(glob('~/.config/nvim/autoload/plug.vim')) + silent !curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs + \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim + autocmd VimEnter * PlugInstall --sync | source $MYVIMRC +endif +]] + +local Plug = vim.fn['plug#'] +vim.call('plug#begin', '~/.config/nvim/plug') +-- I have cloned all plugins needed to my own repo +vim.g.plug_url_format = "git@gitee.com:%s.git" + +-- themes +Plug('astroshot/NeoSolarized') +Plug('astroshot/rainbow') +Plug('astroshot/vim-nerdtree-syntax-highlight') + +-- git +Plug('astroshot/vim-fugitive') +Plug('astroshot/vim-gitgutter') +-- Plug('astroshot/ConflictMotions') + +-- auto complete +-- Plug 'Valloric/YouCompleteMe' +-- Plug 'astroshot/coc.nvim', {'branch': 'release'} +Plug('astroshot/coc.nvim', {branch = 'release'}) +Plug('astroshot/auto-pairs') +Plug('astroshot/nvim-lspconfig') + +-- python dev +-- Plug 'davidhalter/jedi-vim' +-- show indent line +-- Plug('astroshot/indentLine') +Plug('astroshot/python-mode', {['for'] = 'python', branch = 'main'}) + +-- grammar check/highlight +Plug('astroshot/ale') +Plug('astroshot/vim-easy-align') +Plug('astroshot/vim-virtualenv') +Plug('astroshot/nerdcommenter') + +-- golang dev +Plug('mirrors/vim-go') + +-- rust +Plug('astroshot/rust.vim') +-- run :CocInstall coc-rust-analyzer after installation + +-- sh +Plug('astroshot/vim-shfmt', {['for'] = 'sh'}) + +-- hive sql +Plug 'astroshot/hive.vim' +-- Plug 'astroshot/Vim' + +-- toml +Plug('astroshot/vim-toml') + +-- thrift +Plug('astroshot/thrift.vim') + +-- NERDTree +-- Plug('astroshot/nerdtree') +-- Plug('astroshot/nerdtree-git-plugin') + +-- Plug('astroshot/vim-airline') +-- Plug('astroshot/vim-airline-themes') +-- Plug('astroshot/vim-devicons') + +-- tools +-- Plug('astroshot/vim-startify') +-- Plug('astroshot/LeaderF') +Plug('astroshot/tagbar') +Plug('astroshot/ag.vim') +Plug('astroshot/vim-ripgrep') +-- Plug 'epmatsw/ag.vim' +-- Plug 'mileszs/ack.vim' + +-- Plug('astroshot/FlyGrep.vim') +Plug('astroshot/incsearch.vim') +-- Plug('astroshot/vim-easymotion') +Plug('astroshot/undotree') +Plug('astroshot/vim-surround') +Plug('astroshot/vim-multiple-cursors') +Plug('astroshot/vim-better-whitespace') + +Plug('astroshot/vim-cursorword') +Plug('astroshot/vim-interestingwords') +Plug('astroshot/vim-table-mode') + +-- snippets +Plug('astroshot/ultisnips') +Plug('astroshot/vim-snippets') + +vim.call('plug#end') diff --git a/config/nvim.v1/lua/startify.lua b/config/nvim.v1/lua/startify.lua new file mode 100644 index 0000000..b9477f9 --- /dev/null +++ b/config/nvim.v1/lua/startify.lua @@ -0,0 +1,34 @@ +-- startify config +-- local status_ok, indent_blankline = pcall(require, "indent_blankline") +-- if not status_ok then +-- return +-- end + +local header = { + [[]], + [[██╗░░██╗░█████╗░██╗██╗░░░░░  ███╗░░░███╗███████╗░██████╗░░█████╗░████████╗██████╗░░█████╗░███╗░░██╗]], + [[██║░░██║██╔══██╗██║██║░░░░░  ████╗░████║██╔════╝██╔════╝░██╔══██╗╚══██╔══╝██╔══██╗██╔══██╗████╗░██║]], + [[███████║███████║██║██║░░░░░  ██╔████╔██║█████╗░░██║░░██╗░███████║░░░██║░░░██████╔╝██║░░██║██╔██╗██║]], + [[██╔══██║██╔══██║██║██║░░░░░  ██║╚██╔╝██║██╔══╝░░██║░░╚██╗██╔══██║░░░██║░░░██╔══██╗██║░░██║██║╚████║]], + [[██║░░██║██║░░██║██║███████╗  ██║░╚═╝░██║███████╗╚██████╔╝██║░░██║░░░██║░░░██║░░██║╚█████╔╝██║░╚███║]], + [[╚═╝░░╚═╝╚═╝░░╚═╝╚═╝╚══════╝  ╚═╝░░░░░╚═╝╚══════╝░╚═════╝░╚═╝░░╚═╝░░░╚═╝░░░╚═╝░░╚═╝░╚════╝░╚═╝░░╚══╝]], + [[]], +} + +local footer = { + [[]], + [[███████╗░█████╗░██████╗░  ░█████╗░██╗░░░██╗██████╗░███████╗██████╗░████████╗██████╗░░█████╗░███╗░░██╗]], + [[██╔════╝██╔══██╗██╔══██╗  ██╔══██╗╚██╗░██╔╝██╔══██╗██╔════╝██╔══██╗╚══██╔══╝██╔══██╗██╔══██╗████╗░██║]], + [[█████╗░░██║░░██║██████╔╝  ██║░░╚═╝░╚████╔╝░██████╦╝█████╗░░██████╔╝░░░██║░░░██████╔╝██║░░██║██╔██╗██║]], + [[██╔══╝░░██║░░██║██╔══██╗  ██║░░██╗░░╚██╔╝░░██╔══██╗██╔══╝░░██╔══██╗░░░██║░░░██╔══██╗██║░░██║██║╚████║]], + [[██║░░░░░╚█████╔╝██║░░██║  ╚█████╔╝░░░██║░░░██████╦╝███████╗██║░░██║░░░██║░░░██║░░██║╚█████╔╝██║░╚███║]], + [[╚═╝░░░░░░╚════╝░╚═╝░░╚═╝  ░╚════╝░░░░╚═╝░░░╚═════╝░╚══════╝╚═╝░░╚═╝░░░╚═╝░░░╚═╝░░╚═╝░╚════╝░╚═╝░░╚══╝]], + [[]], +} + +vim.g.startify_custom_header = vim.call('startify#center', header) +vim.g.startify_custom_footer = vim.call('startify#center', footer) + +vim.cmd [[autocmd! FileType startify]] +vim.cmd [[autocmd FileType startify set laststatus=0 showtabline=0 | autocmd BufLeave set laststatus=2 showtabline=2]] +vim.cmd [[autocmd User Startified setlocal buflisted]] diff --git a/config/nvim.v1/lua/util.lua b/config/nvim.v1/lua/util.lua new file mode 100644 index 0000000..9e90550 --- /dev/null +++ b/config/nvim.v1/lua/util.lua @@ -0,0 +1,18 @@ +function map(mode, lhs, rhs, opts) + local options = { noremap = true, silent = true } + if opts then + options = vim.tbl_extend('force', options, opts) + end + vim.api.nvim_set_keymap(mode, lhs, rhs, options) +end + +-- vim snippets +-- Trigger configuration. You need to change this to something other than if you use one of the following: +-- - https://github.com/Valloric/YouCompleteMe +-- - https://github.com/nvim-lua/completion-nvim +vim.g.UltiSnipsExpandTrigger = "" +vim.g.UltiSnipsJumpForwardTrigger = "" +vim.g.UltiSnipsJumpBackwardTrigger = "" + +-- If you want :UltiSnipsEdit to split your window. +vim.g.UltiSnipsEditSplit = "vertical" diff --git a/config/nvim/init.lua b/config/nvim/init.lua new file mode 100644 index 0000000..3f86d8d --- /dev/null +++ b/config/nvim/init.lua @@ -0,0 +1,31 @@ +-- ███ ██ ███████ ██████ ██ ██ ██ ███ ███ ██ ███████ ██████ ██████ ██████ ██ -- +-- ████ ██ ██ ██ ██ ██ ██ ██ ████ ████ ██ ██ ██ ██ ██ ██ ██ ██ -- +-- ██ ██ ██ █████ ██ ██ ██ ██ ██ ██ ████ ██ ██ ███████ ██ ██ ██ ██ ██ ██ -- +-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ -- +-- ██ ████ ███████ ██████ ████ ██ ██ ██ ██ ███████ ██████ ██████ ██████ ███████ -- + +-- vim option +require('neo.option') +-- packer plugin manager +-- NOTE: 建议将自己的配置文件保存在 lua 的子目录中,避免配置模块名和插件名同名时加载失败 +require('neo.pkg') +require('neo.lspconf') +require('neo.lspmason') +require('neo.lspsaga') +require('neo.alpha') +require('neo.alphascreen') +require('neo.autopairs') +require('neo.bufferline') +require('neo.cmp') +require('neo.comment') +require('neo.go') +require('neo.hop') +require('neo.indentline') +require('neo.lualine') +require('neo.markdown') +require('neo.nvimtree') +require('neo.python') +require('neo.treesitter') +require('neo.trouble') +require('neo.telescope') +require('neo.theme') diff --git a/config/nvim/lua/neo/alpha.lua b/config/nvim/lua/neo/alpha.lua new file mode 100644 index 0000000..8477348 --- /dev/null +++ b/config/nvim/lua/neo/alpha.lua @@ -0,0 +1,66 @@ +local status_ok, alpha = pcall(require, "alpha") +if not status_ok then + print('alpha load error') + return +end + +local ghidorah = { + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣀⣀⡀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⠀⣠⣦⣄⣀⣴⣦⣄⣈⣻⣿⣿⣿⣿⣿⣿⡇⠀', + '⠀⠀⠀⠀⠀⠀⣀⡀⣀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠁⠀⠀⠀', + '⠀⠀⠀⠀⠀⢀⣿⣿⣿⣿⣿⡿⠿⠛⠋⠉⠁⠀⠀⠀⠀⠀⠸⢿⣿⣷⣄⣀⠀⠀', + '⠀⠀⠀⣶⣶⣿⣿⣿⣿⠟⠉⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⠀⠈⠉⠉⠀⠀', + '⠀⣀⣠⣿⣿⣿⡿⠟⠁⠀⢀⣄⣀⣠⣦⣀⣠⣄⠀⢹⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⣿⣿⣿⣿⡿⠁⣰⣷⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⣿⣿⣷⣄⠀⠀⠀⠀⠀⠀', + '⠀⣿⣿⣿⣿⣷⣾⣿⣿⣿⣿⠟⠛⠉⠉⠉⠉⠙⢻⣿⣿⣿⣿⣿⣷⣄⠀⠀⠀⠀', + '⠀⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⠁⠀⠀⠹⠛⠁⠀⠀⠀', + '⠀⣿⣿⣿⣿⣿⣿⣿⣧⣤⣤⣄⠀⠀⠀⠀⠀⠀⠀⠀⠙⣷⠄⠀⠀⠀⠀⠀⠀⠀', + '⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣶⡄⠀⠀⢀⣀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⣿⣿⣿⣿⡿⠟⠛⠛⠛⠻⠿⣿⣿⣷⣤⣆⠀⣈⠻⣿⣿⣿⣿⣶⣶⣶⠆⠀⠀', + '⠀⣿⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠈⠛⠿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠉⠉⠀⠀⠀', + '⠀⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠹⢿⣿⣷⣄⣀⠀⠀⠀⠀', + '⠀⠛⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠀⠀⠀⠀', +} + +local pic = ghidorah +local ok, alphascreen = pcall(require, 'neo.alphascreen') +if ok then + pic = alphascreen.choose() +end + +local dashboard = require("alpha.themes.dashboard") +dashboard.section.header.val = pic +dashboard.section.buttons.val = { + dashboard.button("f", " Find file", ":Telescope find_files "), + dashboard.button("e", " New file", ":ene startinsert "), + dashboard.button("p", " Find project", ":Telescope projects "), + dashboard.button("r", " Recently used files", ":Telescope oldfiles "), + dashboard.button("t", " Find text", ":Telescope live_grep "), + dashboard.button("c", " Configuration", ":e ~/.config/nvim/init.lua "), + dashboard.button("u", " Update plugins", ":PackerSync"), + dashboard.button("q", " Quit Neovim", ":qa"), +} + +local function footer() +-- NOTE: requires the fortune-mod package to work +-- local handle = io.popen("fortune") +-- local fortune = handle:read("*a") +-- handle:close() +-- return fortune + return "Love vim, love life." +end + +dashboard.section.footer.val = footer() +dashboard.section.footer.opts.hl = "Type" +dashboard.section.header.opts.hl = "Include" +dashboard.section.buttons.opts.hl = "Keyword" +dashboard.opts.opts.noautocmd = true +-- vim.cmd([[autocmd User AlphaReady echo 'ready']]) +alpha.setup(dashboard.opts) + +vim.cmd([[ + augroup _alpha + autocmd! + autocmd User AlphaReady set showtabline=0 | autocmd BufUnload set showtabline=2 + augroup end +]]) diff --git a/config/nvim/lua/neo/alphascreen.lua b/config/nvim/lua/neo/alphascreen.lua new file mode 100644 index 0000000..63a8993 --- /dev/null +++ b/config/nvim/lua/neo/alphascreen.lua @@ -0,0 +1,567 @@ +alphascreen = {} + +local screens = { + { + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡞⠁⢻⠀⢱⢱⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠞⣁⡴⢺⠀⠈⣿⡷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡼⢁⡴⠋⠀⠈⢣⠀⢸⣇⠈⢳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡼⠁⡾⠁⠀⠀⠀⠈⡇⢸⢹⠀⠀⢻⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⠇⣼⠁⠀⠀⠀⠀⠀⢹⠸⣾⠀⠀⠀⢳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⡇⠀⠀⠀⠀⠀⠀⢸⡆⣿⠀⠀⠀⠈⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⢭⠁⠀⠀⠀⠀⠀⠀⠘⡇⣿⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡤⡖⣧⣿⠀⢰⠒⠒⠲⢤⡀⠀⡇⣿⣀⡤⠤⢤⣿⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⠋⠰⡇⢹⣿⡇⠸⣄⠀⠀⠀⠘⡆⣷⣿⠁⠀⢀⣼⣿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢘⣆⠀⠘⣶⣿⡇⠀⠈⠑⠒⠒⠚⠁⣿⠉⠓⠒⠋⣾⡟⠈⢧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡤⠖⠋⠁⣟⣇⠀⠈⢫⠳⡀⠀⠀⠀⠀⠀⠸⠏⠀⠀⠀⡼⠟⠀⠀⠈⢧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡴⠚⠁⠀⠀⠀⠀⢻⠸⡆⠀⠀⢳⡱⡀⠀⠀⠀⡀⠀⠀⠀⢀⡼⠁⠀⠀⢀⣀⡬⢷⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⣠⠞⠁⠀⠀⠀⠀⠀⠀⠀⢸⠀⠹⣄⡦⢤⣳⡙⢦⡀⠀⠉⠉⠉⣠⣞⢹⠀⠀⡶⠋⢁⡴⠋⠀⠈⠓⠦⣀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⡾⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⡾⠀⠀⠈⣿⡄⣧⡧⠖⠛⠛⠉⠉⠉⢛⣛⡛⢦⣸⠁⡴⠋⠀⠀⠀⠀⠀⠀⠘⡆⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⢸⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠃⠀⠀⢀⡿⠛⠁⠀⠀⠀⠀⠀⠀⠀⠠⢤⣉⡙⢿⠀⡇⠀⠀⠀⠀⠀⠀⠀⠀⣇⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠇⠀⢠⠶⠋⠀⠀⠀⢰⡀⠀⠀⠀⠀⠀⠀⠀⢀⣈⠻⢧⣿⡆⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⢸⠀⡀⠀⠀⠀⠀⠀⠀⡴⠃⣠⠾⠋⠀⠀⠀⠀⠀⣠⠛⠒⠒⠒⠒⠒⠚⠉⠉⠉⠉⠛⠳⡄⠀⠀⠀⣜⢦⡀⠀⢸⠀⠀⠀⠀', + '⠀⠀⠀⠀⢀⣸⠞⣁⠀⠀⠀⠀⠀⢀⣣⠞⠁⠀⠀⠀⠀⠀⢠⣾⢱⠀⢇⠐⡇⠀⠀⠀⠀⠀⣠⡴⠀⠀⠘⣦⡀⠀⠈⢦⡙⢦⣸⡆⠀⠀⠀', + '⠀⠀⠀⠀⣺⠗⠋⠁⢀⣀⣀⡤⠞⠉⠀⠀⠀⠀⠀⠀⢀⡴⠋⠛⠻⠦⣼⣄⣧⣀⣽⠛⠋⠉⢧⠀⠀⠀⠀⠈⠳⣦⡀⠀⠙⠳⢬⣿⠀⠀⠀', + '⠀⠀⣠⠟⠁⣀⡴⣺⡿⢻⠋⠀⠀⠀⠀⠀⠀⠀⠀⣴⠏⡇⠀⣶⣦⠀⢀⣧⣬⣽⠁⠸⠿⢠⠈⢧⠀⠀⠀⠀⠀⠈⠳⣦⡀⠀⠀⠙⣆⠀⠀', + '⠀⢰⠃⢀⣼⢋⡼⠋⠀⡇⠀⠀⠀⠀⠀⠀⠀⢠⡞⠁⣿⡇⠀⠀⠀⢠⡿⠁⠈⠙⣷⠀⠀⢸⡀⡌⢧⡀⠀⠀⠀⠀⠀⠈⠻⣄⠀⢠⡸⡄⠀', + '⢀⡏⢠⠟⢁⡟⠀⠀⢸⠃⠀⠀⠀⠀⠀⠀⣰⣿⣦⠬⣿⠀⣾⡆⠀⠸⡽⣄⡀⣠⣿⠀⠸⣿⣿⠷⣬⢳⡀⠀⠀⠀⠀⠀⠀⡏⠳⣄⠙⢿⡄', + }, + { + '⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⣾⢋⣿⣿⣶⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⢀⣾⣯⣿⣟⣯⡼⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⣼⣿⠋⠉⠀⠀⠀⠀⠛⠛⠻⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⢀⢠⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⣼⢸⠃⠀⠀⢀⣠⡤⢤⣀⡀⠀⠀⠀⠻⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⢠⡦⣄⡀⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⣿⢸⠀⣠⠖⠋⠀⠀⠀⠈⣿⣠⣴⣾⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⢰⣦⣾⣿⢿⣏⣷⣶⣧⣽⣷⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠏⠀⢻⣼⠀⣏⣀⠀⠀⠀⣀⡴⠛⢀⠀⢸⣿⢻⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⢸⣏⣹⣿⣾⣟⡻⣯⣿⣿⢛⢿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡄⣠⣾⠈⠀⠈⠛⠓⠒⠛⠉⠀⠀⠘⡆⢸⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠙⣿⢿⣯⣿⣿⠿⣿⣿⡏⣾⣻⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣷⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⢸⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠘⢿⣟⣿⣿⠏⣵⣿⣿⣽⢯⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⡽⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠈⢿⡼⣿⢟⣽⣿⣷⣷⣿⣿⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢷⣼⣿⣿⠿⢟⣛⣿⠇⠀⠀⠀⣴⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠻⣷⣿⣽⣿⣿⣽⢿⣻⡿⠟⡟⣆⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢿⣶⡶⠟⢿⣿⠃⢀⣠⣴⠶⠿⠿⠿⢷⣶⠟⣻⣯⣁⠀⠀⠀⠀⠀⠙⢿⡉⢻⣓⠲⢤⣀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣷⡿⣛⣵⣂⣾⢣⣿⣿⡳⣖⢤⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣦⡶⣾⣿⡏⠹⠋⠈⠀⠀⠀⠀⢸⣟⠀⠀⠀⠀⠀⠀⠀⠀⠉⠁⣸⠷⠦⣼⣿⠟⠿⣷', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣭⣭⣽⣾⣿⠟⠀⠁⠙⢆⠹⣿⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣐⣦⣐⣲⣞⣇⣹⣭⣦⠁⣀⠠⠀⣀⣀⡀⢰⢸⣸⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣯⣽⠏⠁⠀⣾⣿', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⠛⢿⣿⣟⣁⠀⠀⠀⠀⠈⠀⢿⣿⣩⣷⡶⠤⣄⣀⠀⣀⣤⡤⢤⣤⣦⣾⣿⣿⣿⣿⣿⣿⣿⣿⣾⣿⣶⣀⣴⣶⣿⣷⣿⣾⣿⣿⣿⣶⣦⣔⣠⣠⣤⣤⣴⣺⣿⣿⣿⣠⣤⣤⣿⠃', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣇⡀⠀⠀⠀⠀⠘⡟⢏⣿⣿⢰⠲⡍⠻⣭⡀⠀⣠⠞⢉⣼⠏⠍⠉⠛⣿⣉⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣻⣿⣿⡿⠃⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠿⣿⣦⣤⡀⣠⣷⣿⣿⣿⣷⠖⠒⠒⠚⠛⣿⣿⣥⣠⣾⣿⣾⡀⠳⣶⣿⣿⣿⣿⣿⣿⣿⣿⠿⣿⣿⣿⠿⣟⢿⣿⣿⣿⣿⣿⠋⠩⢾⣿⣿⣷⣿⣿⣿⡿⠋⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠻⣿⣿⣿⣿⣿⣿⣋⣀⣀⣀⣠⣀⣀⠀⠙⢏⣿⣿⢸⡝⡀⢶⣾⠏⣱⢿⣡⣾⣷⡟⠀⢠⡟⠁⠀⠀⠀⠀⠈⠙⣿⣿⠟⠀⣰⣿⣿⡿⡽⢠⣿⡿⠁⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠛⠻⠿⢿⣿⣿⣿⣿⣿⡿⣿⣷⣄⣿⣇⠅⢸⡇⡳⣾⠏⢠⢏⣴⡿⣡⠦⡍⣹⠟⠁⠀⠀⠀⠀⣠⡶⠛⣡⠞⣠⣼⣿⣿⣿⣞⣥⣿⠟⠀⠀⠀⠀⠀⠀', + '⠀⠀ ⠉⠉⠛⠿⢿⣿⣝⣿⣿⢟⡄⢸⠻⣦⣾⢠⣏⣼⠛⣀⡻⠶⣿⠋⠀⠀⠀⢀⣴⠞⠋⠀⣼⣷⣾⣿⣿⣿⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀ ⠀⠀⠀⠀⠀⠈⠙⣿⣿⣾⠃⡿⢰⣨⣦⠞⠛⢻⣼⣯⣠⣸⠃⠀⠀⣠⡶⠛⠁⠀⠀⣼⣿⣿⣿⡿⠛⢿⣿⣿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⢰⡇⠀⣰⡇⣄⠀⣸⣸⡈⢡⡏⠀⣠⡾⠋⠀⠀⠀⣠⣾⣿⡿⣿⡟⠀⢀⣼⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⣿⣿⡸⣇⠳⠼⣿⣶⣾⣿⠶⢇⡞⣠⡞⠉⠀⠀⢀⣴⠟⣡⣿⡟⢹⡟⠁⡀⣾⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⢿⣿⣧⣿⣶⣾⣿⣿⣿⣇⣠⣾⡿⠋⠀⠀⣠⣶⣿⣧⣾⡿⠋⠀⣾⠇⠰⢻⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + }, + { + ' ', + ' ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡴⢞⣧⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + ' ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⢟⣵⠟⢫⡛⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + ' ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣞⣿⡟⠋⠐⢿⣻⣮⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + ' ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣦⠀⠀⠀⠀⠀⠀⠀⢠⣿⡿⠀⠀⠀⠚⠉⠿⣿⣿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + ' ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠤⢿⣿⣿⣿⠀⠀⠀⠀⠀⠀⢀⣼⣿⣧⡴⠚⠉⢨⣿⢰⡾⣣⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + ' ⠤⢤⡀⠀⣀⣀⣀⠀⢠⣤⣤⠀⢀⣶⡶⢠⣤⣤⠀⣖⣲⠀⠀⣖⠆⠤⠤⢀⡀⠸⣿⣿⣿⣿⠀⠀⠀⠀⠀⢿⠀⡏⢾⣤⣤⣤⠞⠁⢐⣿⡟⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + ' ⠭⠭⣤⣴⣟⣯⠹⠶⠾⠆⣰⣶⠾⠏⢙⡿⠿⠿⣿⣃⣴⡭⢁⣀⠉⠀⠈⠉⠀⢰⣿⣟⢹⣿⡇⠀⠀⠀⠀⠈⢻⣻⠀⠀⠉⠀⠀⣠⠞⠹⢻⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + ' ⣉⡿⣿⠶⢀⣀⣯⣭⣝⣛⢦⣭⣭⣇⡈⣟⣛⣻⡆⣭⣭⣅⣀⣖⡒⠄⠀⠀⠀⠘⣯⣷⢨⢿⡇⠀⠀⠀⠀⠀⠀⣿⣄⣀⣤⡤⠞⠁⠀⠀⣼⣻⡦⣶⠖⠲⢤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + ' ⠭⠭⠭⠿⣘⣒⡶⠮⡍⢩⠼⡎⣉⢭⣷⡄⢀⠾⠷⠀⣴⣶⣳⠊⠁⠀⠐⠲⠾⢣⡽⠿⢇⡞⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⠋⣿⠀⠀⣴⣿⣿⣫⠤⠬⣿⣷⠟⠹⢷⠀⠀⠀⠀⠀⠀⠀⠀', + ' ⠘⢿⣿⠤⢽⣯⠉⢩⣥⣾⠉⠁⠈⠉⠀⠿⠛⠃⠀⠀⢿⣷⣦⣤⣄⣤⣤⣤⣤⢽⣶⠓⠚⠛⠓⠛⠛⠉⠉⠉⠉⠉⠉⠙⠛⠻⢯⣽⣛⢯⣠⣶⠞⠛⠉⢉⣠⠌⢻⡇⠀⠀⠀⠀⠀⠀⠀', + ' ⠆⠈⠉⠉⠉⠁⠀⠀⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠛⠿⢶⣶⣶⣿⣿⣿⣾⣶⣿⣦⣤⣀⣀⣀⣀⡀⠀⠀⢀⣀⠀⠀⠈⢻⣿⡟⠁⣀⣀⠈⣉⣀⡀⢹⣧⣠⡀⠀⠀⠀⠀⠀', + ' ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⣿⣿⠿⢿⣏⠙⢻⡿⢿⡿⢿⣿⣿⣶⣿⣿⣿⣿⣿⣿⣿⡿⢿⣿⣿⣿⣿⣿⣿⡉⣿⣆⠀⠀⠀⠀⠀', + ' ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⡇⠀⢻⡄⣞⡴⣤⣽⣾⣿⣷⠸⣇⣏⣿⡿⡏⡻⢸⣁⡀⠀⣿⣯⡹⣯⡉⠁⠸⣟⣆⠀⠀⠀⠀', + ' ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣄⠈⣧⡇⢰⠛⠟⠛⢻⣿⡀⣿⣿⠇⣧⣧⣧⢸⣿⣿⣿⣿⡏⠻⣏⠻⠰⢤⣿⣾⡄⠀⠀⠀', + ' ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⣆⣸⣿⣾⠀⢀⣤⣾⣿⣧⢻⡞⡇⣼⠿⣜⠸⣿⣿⣿⣿⡇⠀⢿⣶⣤⣾⣿⣿⣇⠀⠀⠀', + ' ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⣿⣿⣴⡿⠛⠁⠈⢿⣷⣿⣿⣇⠯⢼⣷⣿⣿⣿⣿⣷⣦⣶⣿⣿⣿⣿⣿⣿⡄⠀⠀', + ' ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣿⣿⣿⠿⠛⠉⠀⠀⠀⠀⠈⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀⠀', + ' ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠛⣿⣿⣿⣿⣿⣿⣆⠀', + ' ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠻⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⣿⣿⣿⣿⣿⣿ ', + ' ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ', + ' ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ', + }, + { + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣴⡾⠛⠻⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⢞⡽⢉⣤⣄⣈⣿⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣻⢿⣶⣿⠟⠋⠙⠒⠚⠳⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⣌⡙⠲⢄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣹⣡⣿⣿⠁⢀⠀⡀⠀⠀⠀⢹⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠠⠽⣒⣄⠙⢪⣍⣒⠒⢤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⡟⣼⡿⣁⣀⡀⣀⣀⠀⠀⠀⠀⣹⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠈⠀⠀⠱⡄⢧⠈⣹⠶⠈⠙⠒⠤⢤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠔⢺⢵⡿⠋⠁⠀⠀⠐⣸⡟⢷⣾⣿⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠙⣮⡟⠛⠉⠉⠉⠲⡴⡁⣙⠽⠒⠒⠒⠒⠦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡧⢄⣽⠸⢷⣤⣀⣀⣠⠞⠉⠀⢸⡇⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⢀⡴⡄⡇⢧⠀⠀⠀⠀⠀⢧⠸⡗⠋⠉⢲⡻⡍⠑⠒⣛⣢⣄⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢶⣿⠀⠛⠉⠀⠀⠀⠀⠀⠀⢸⣇⠿⣻⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⢠⠎⡼⢰⢃⡏⠀⠀⣠⣿⣷⢼⡀⡇⠀⠀⠀⢳⠙⢖⣩⠴⠚⠡⡽⡖⢦⡌⠙⠒⠒⠒⢤⣀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⢙⡿⣿⣿⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⡏⣰⣣⣣⠞⠀⠀⣼⣿⣿⢏⣼⢀⡇⠒⣖⡢⢤⡇⣏⠀⠀⠀⢀⡽⠈⣡⠴⠒⢤⣸⡑⣲⠬⠳⢦⠲⠤⣄⠀⠀⠀⠀⣿⢿⣿⣿⣿⣿⡖⠀⠀⠰⠾⡽⣻⠍⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠇⢛⡵⠃⠀⠀⢠⣿⣿⣷⣿⠏⣼⠇⠠⢠⣈⣤⣷⡟⡍⠉⠉⠛⢒⡇⣹⡀⠀⠀⣣⠛⣡⠴⠒⣆⢯⣳⣾⣗⢤⡀⠀⢹⣿⣿⠛⢁⡿⡁⠀⠀⠠⣸⡇⢷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠄⠀⢲⡘⢧⡀⠀⠀⠘⠻⢿⣿⠋⣾⣿⣿⣶⣾⣿⡿⣹⡭⠐⠀⠀⠰⠔⡧⡿⣯⡛⠶⣧⡜⣧⣷⣿⣿⡈⣿⢻⣮⡵⣷⣄⠀⢿⣿⣤⣬⣾⣧⣤⣤⡞⢹⣾⣿⣀⣀⣀⠀⣀⣠⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠙⠦⣉⡒⠦⠤⠖⣊⡥⠚⠁⠀⠀⢈⡽⠟⣰⣿⣿⣦⣤⣄⡀⣜⣾⡀⡈⢻⣿⣾⠇⣿⣏⠙⢛⡇⣿⣷⣧⣏⢻⢸⡧⠶⢿⣿⣿⣿⣿⣿⠋⠁⠸⡀⣾⠈⠁⠈⢻⣿⣯⡈⠁⠉⠻⣦⣄⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠉⠙⠛⠉⠁⠀⢲⡤⠤⠴⠊⡀⣞⠉⠉⠻⢿⣿⣿⢟⣿⣧⣆⡈⢈⣿⡟⣰⡟⠉⠓⣾⢷⡏⡿⢹⣿⣾⣿⣧⢤⢿⣿⣿⡛⢿⣿⡷⣀⣤⣾⠟⠀⠀⠀⡾⠛⠙⣧⠀⠀⠀⠈⢻⡆⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠙⠉⠙⠪⠗⡤⠤⠔⠚⠀⡜⠛⠛⡿⣿⣿⣟⣵⣿⡅⣀⣠⢏⣿⢙⣧⣿⣿⣿⠉⢿⡦⣀⠛⣿⣟⠶⣿⣴⠏⠉⠀⠀⠀⠀⣼⠃⠄⠀⠘⣇⢀⠄⠀⡀⡙⣦⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠉⠳⣌⠒⠦⠤⠒⢫⠛⠿⢿⣿⡿⣃⣾⣛⣘⣿⣿⣿⣿⣠⣿⣸⠁⢀⠛⠻⠆⢹⣿⣴⡆⠀⠀⢀⡼⠃⠰⣴⡞⣦⣜⣦⡀⠈⠀⠁⡾⡃⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠒⠋⠉⠻⣍⡒⣊⣡⠞⠛⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⣤⣾⣿⣿⡇⠀⠀⣾⠅⠀⠀⠈⢻⢹⡍⠉⠛⢿⣶⣶⣿⡄⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠀⠀⠀⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⢁⣼⣿⣿⢿⣗⠀⢠⠇⠀⠀⠀⠀⠈⢸⡄⠀⠀⠀⠘⣿⡿⠁⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⡇⠀⢡⣟⣱⣦⡙⣿⣿⡦⢸⠀⠀⠀⠀⠀⢠⢸⣿⠄⠀⠀⠀⢸⠓⡆⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⡇⠀⠈⢿⣮⣥⡾⡋⠘⠁⣸⠂⠀⠀⠀⠀⣸⢍⣿⣷⣴⣶⣦⣼⣿⣽⡆', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⣾⣿⡏⠀⠀⠀⣟⠀⠀⠀⠀⢰⢿⢸⡏⢿⣿⣿⢿⣿⣿⣗⣧', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⣿⣿⣿⣿⣷⣄⢁⣽⣿⣿⣧⠀⠀⣸⣿⣿⣦⣄⣴⣻⣿⣾⣿⡿⠽⠀⢲⣼⡃⢹⣿', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⣻⠉⠛⣦⣴⡀⣿⣿⡾⠋', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⣿⣿⣿⣿⣿⡟⠟⢿⣿⢿⡿⠿⢿⣿⣿⣿⣿⢻⡟⢰⡟⡲⣶⡿⠿⠷⠻⠁⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⣿⣿⣿⣿⠋⠀⠀⠈⠋⠀⠀⠀⣿⣿⣿⣿⣿⣾⣇⣿⣿⣯⡟⠁⠀⠀⠀⠀⠀⠀', + }, + { + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣶⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⢀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⣾⡟⡏⣼⣿⣷⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣺⣿⣿⣿⣿⡇⣿⣿⣿⣿⣿⣷⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣽⣿⣿⣿⣿⣿⡇⣿⣿⣿⣿⣿⣿⣿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⡇⣿⣿⣿⣟⣛⠻⢿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡾⡏⣶⣿⣿⣶⣮⣻⡇⡟⣡⣾⣿⣿⣿⡎⠭⠛⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠋⠀⢰⣅⢙⠿⡿⠿⣫⣇⣧⣻⠿⣿⣿⠟⣴⢸⠛⡎⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⡂⡾⣿⣷⣾⣧⣤⣿⣿⣿⣿⣦⣴⣶⣿⣿⢸⡀⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠂⠡⡇⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⡜⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡄⡞⠀⠈⢿⣿⡿⠿⠛⠛⠋⠙⠛⠛⡛⣻⣿⣿⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡵⡆⠀⠀⠘⣿⣿⣔⣭⣍⢨⣍⣈⣤⣦⢻⣿⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢨⡃⡇⢀⠀⠀⠈⠙⣿⡻⣿⢃⣅⢿⠟⠁⠿⠁⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⡁⡃⡃⣼⠀⠀⠀⣿⣶⠌⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣶⣾⠟⣋⣭⠿⠿⠶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⢸⣧⢡⣄⠂⣀⠀⣠⡫⣤⣠⠀⠀⠀⠀⠀⠀⠀⠀⣴⡿⠃⣈⠟⢡⢜⣥⣶⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣾⠿⡿⣸⣿⣸⡟⣧⢹⣇⡀⢌⣛⣛⣂⠀⠀⠀⠀⠀⠀⠾⠿⢁⣀⣃⣀⣥⣩⠭⠝⢶⣒⡭⣍⠙⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⣿⣯⡑⠀⣿⢟⣾⣿⡾⣨⣿⣿⣷⣶⣉⣁⣤⣤⣤⣦⣬⣭⣭⣭⣭⣛⣛⠻⠿⣿⣾⣽⣾⣿⡟⣪⠧⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⢀⠀⢀⠀⣀⡀⣼⣿⣿⡿⣿⣷⣬⣯⣬⣥⣶⣥⣽⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣶⣍⠻⢿⣯⣪⢋⡖⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠈⠓⠍⠛⠯⠭⠭⠌⠹⡭⣽⣿⣿⣿⣿⣯⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠰⡿⡡⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⣹⣷⣮⣥⣒⣀⠙⢻⣿⣿⠿⢟⠛⣛⣛⣛⣛⣛⠙⢛⡛⣛⣛⡻⠿⠿⠿⠿⡿⣿⣿⣿⣿⣿⠟⠃⠈⠀⡐⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠸⣿⣿⠿⢃⣾⣿⣿⣳⣶⣾⢣⢻⡇⣿⣿⣿⣿⠟⣄⠂⣄⠙⢿⣿⣿⣷⠀⠀⠀⠀⠉⠙⢛⠫⣶⡘⣆⠀⠈⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠠⢛⡁⢎⣾⣿⣿⣿⣿⣿⡏⣀⠘⡇⣿⣿⣿⣗⠸⣮⠳⣯⠂⢸⣿⣿⣿⠀⠀⠀⠀⠀⠨⡌⣄⣿⣿⣿⣦⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠐⡟⠌⣼⣿⣿⣿⣿⣿⣿⠃⠀⠀⠀⣿⣿⣿⣿⣦⠈⠉⠀⣀⣽⣿⣿⣿⡀⠀⠀⠀⠀⢰⢡⣿⢸⣿⣿⣿⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⢀⣶⢱⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⢻⣿⣿⣿⣿⡇⠀⠀⢿⣿⣿⣿⣿⡇⠀⠀⠀⠀⢀⣾⣿⣾⣿⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⢀⢀⡟⢸⣿⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀⢸⣿⣿⣿⣿⠇⠀⠀⠸⣿⣿⣿⡿⠃⠀⠀⠀⢠⣶⣿⣿⣿⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + }, + { + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣞⣿⢷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡟⣿⣼⣶⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡔⣿⣿⠁⠀⠈⠙⠦⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⠋⠀⣿⣳⣦⡀⠈⡶⡀⣬⡕⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠞⠁⠀⠀⣿⣿⣿⣯⠁⠉⡁⣭⠁⠈⢧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡏⠀⠀⠀⠀⣿⢿⣿⣉⣠⡤⠤⢴⣄⡀⠈⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡤⠞⠚⠒⠒⢦⠀⡟⣶⠛⠁⠀⠀⠀⠀⢘⣷⣞⣋⣶⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⠻⣄⠀⠀⢀⣸⡆⣇⠹⣧⣤⠀⠀⢀⡴⠟⠁⣿⢹⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⡇⠈⠳⢤⡾⠿⠀⡟⠀⠈⠋⠉⠉⠉⠀⠀⠀⢻⣼⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡀⠀⠀⠈⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⣴⣼⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢷⡀⠀⠀⢀⣀⣇⣀⣀⣀⡀⠀⠀⣐⡌⢸⣿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣧⢴⢿⡛⠛⣛⣿⣛⣻⣿⣿⠰⡋⢧⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣖⠦⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣎⢧⠙⠛⣿⣿⠛⠋⣾⣃⣴⣶⣿⣿⣶⣶⣶⣶⣤⣤⣤⣤⣄⡀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣆⠀⠘⢿⣶⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡠⠼⣮⣷⣄⣿⣿⣓⣀⣵⣷⣿⣿⣿⣿⣿⣿⣿⠟⣫⡶⣰⣟⣉⡛⢦⡀⠀⠀⠀', + '⣤⣄⣀⠀⠀⢒⣶⡀⠀⠀⠀⠀⠸⡄⠀⠈⢻⢿⣿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠄⢠⣶⠚⣹⢠⢰⣿⡘⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⣴⣿⡿⠁⠙⠉⢯⣭⢤⣽⣄⠀⠀', + '⠀⠀⠉⠙⠓⠺⠿⣷⣦⣄⣀⠀⢀⠹⡄⠀⠀⠻⣿⣿⣷⣤⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡤⠖⣿⡄⣿⡿⠀⣿⡚⠾⣭⣻⢿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⢁⣀⠀⠀⠨⠦⠀⠈⠿⡆⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠛⠿⣿⣷⣧⣶⣂⠐⠙⠛⠛⠻⠿⠷⠶⢤⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠏⢠⣌⢳⣿⣿⣷⠨⣯⡻⠷⣶⣈⡙⠦⠙⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣾⣿⣿⢿⣿⣶⣶⣶⣾⣷⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⣿⣿⣿⣟⡿⢿⣿⣿⣶⣶⣤⣤⣀⡦⠤⠈⠁⠀⠀⣀⡀⠀⠀⠘⢾⡉⠀⠀⠉⠹⣿⣿⣿⣆⣿⣿⡷⣶⣍⡛⢷⡤⠀⢽⡟⠈⠉⠂⠉⡏⣹⣿⣿⣿⣿⣿⢿⣹⣿⣿⣿⡿⣿⣿⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣽⣿⠿⠿⣿⣿⣿⣶⣯⣭⣙⠟⢛⢛⣿⢿⣷⣶⣤⣄⣉⡁⠐⠟⠀⠈⣡⣘⠛⠿⣶⣽⣿⣿⣿⣿⣿⣿⣄⠉⢻⣷⣄⠀⠀⡗⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⡏⣼⠿⣿⣿⣿⣷⣿⣿⣇', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀⠀⠀⠉⠛⠿⣿⣿⣿⡟⣽⡟⣾⣿⣉⡉⠻⢟⠿⢿⣶⣦⣬⣟⡹⣿⣶⣿⣿⣿⣿⣿⣿⣿⠀⠙⢿⣶⣍⠛⠀⠌⠁⠐⢤⣀⠀⢸⣿⣿⣿⣿⣿⡧⠀⠀⢻⣿⣿⣿⣿⣿⢿', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣿⢹⣿⣽⣿⣿⣿⣿⣿⣶⠖⣾⣿⣿⣿⢿⣿⣿⣾⣧⣼⣻⣿⣿⣿⣿⣧⠀⠀⠹⢿⣦⡀⠀⠀⠀⠀⠈⠉⠛⠻⠿⢿⣿⣿⣧⣠⠀⣺⣿⣿⣿⣿⣿⣼', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⣿⣿⣿⣷⣬⣹⣻⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⢀⣤⣿⣷⣄⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠉⠭⠿⠞⠷⢬⣽⣿⣿⣿⣿', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣷⣿⡍⠛⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣼⣿⣿⣿⡿⢿⣧⣽⣷⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢦⠈⠻⣿⣿⡟', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⣿⣿⣿⣿⣿⣿⡄⠀⢸⣿⡯⡦⠯⣿⣿⣿⣿⡟⢿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠉⠛⣿⣿⣿⣷⣤⢀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⡇', + }, + { + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠤⠀⠀⠠⠤⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠌⣿⣿⣿⠿⢿⣿⣶⣦⣅⡠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠸⣿⣿⠀⢀⣀⣻⡟⠛⢿⣦⡀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠗⠁⣠⣾⠟⠋⠁⠀⣂⣤⡻⣷⡔⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡾⠡⡒⣼⣿⣁⣠⣤⣶⣿⣿⣿⣿⡌⢿⡐⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣇⣤⣶⣿⡿⣿⡟⢩⣭⠤⢒⠠⣶⣬⠈⣷⢡⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⡿⠟⠩⡀⢲⠸⣿⡘⡀⢈⣠⣵⣿⣿⣷⠘⣇⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡏⣀⣁⠺⢁⡼⢃⣿⣧⢡⣬⣤⣶⣶⣶⣤⣄⠹⡌⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠌⠀⣨⣶⣿⣿⣿⡆⣿⣿⠿⠛⠛⠛⠻⠀⠘⠔⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⡬⢠⣾⣿⣿⣿⣿⣿⣧⠈⠠⠾⠿⠛⠻⠗⢰⠀⠐⠨⢢⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢡⡿⠟⠻⣿⣿⣿⣿⣿⠀⣤⣤⣶⠶⠿⠇⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠢⠂⠂⢹⣿⣿⣿⡟⠀⢁⣀⣤⣴⡶⠀⣶⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡄⠸⠛⢋⣭⣀⡀⣄⡀⠨⡉⠳⣄⠹⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠒⠈⣤⡄⣀⣠⠄⠈⠺⠀⠐⠈⣇⠘⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡔⠰⠃⡁⣤⢀⣲⡆⠀⠀⣤⣴⣶⣆⠘⠀⠿⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠖⠠⢁⠦⠂⢩⢀⡰⠀⠀⠀⢹⣿⣿⣿⣇⠀⣾⣧⢙⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠎⣰⣇⢂⠰⠒⢨⣔⡰⠀⠀⠀⠀⢿⣿⣿⡿⡆⢸⣷⠀⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡜⣰⣧⠙⡌⢐⠝⡨⣄⠂⢰⠀⠀⠀⠘⣿⣽⣻⠇⠘⣾⠃⢱⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢡⣿⣿⣧⠙⣦⡐⢨⣴⠂⣼⣇⠀⠀⠀⣿⢾⣟⡇⢠⣿⠀⢻⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⡇⠀⠷⢄⠻⢠⣿⣿⠀⠀⠀⣯⣟⣯⡇⠸⣷⠀⢾⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⡟⠀⢻⣷⣿⣾⣿⣿⠀⠀⠀⢿⡾⣯⠇⢸⡇⠀⣿⣞⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⣿⡿⠃⣰⣿⣿⣿⣿⣿⡇⠀⠀⠀⢘⣽⣯⠃⢸⠇⠀⢸⣽⣯⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⠃⠀⠿⠿⠿⠿⠿⠿⠃⠀⠀⠀⠾⠽⠞⠀⠸⠀⠀⠸⠷⠿⠎⠀⠀⠀⠀⠀⠀⠀⠀⠀', + }, + { + ' ', + '⠍⣔⡒⢤⠀⡠⢤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⠠⠍⢷⢒⠢⡝⣍⠦⣀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠠⣄⡐⠢⡀⠘⠚⢏⢙⠒⠭⣑⡉⠣⢀⡨⣗⡦⢄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠁⡀⠉⠲⡌⠂⢀⠀⠀⠘⠂⠒⠝⢒⠒⢍⠑⠻⠖⢭⣙⡂⠀⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠐⣜⣿⣹⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⡏⢧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⢤⣀⡐⠢⢤⣈⡉⢒⡲⠤⢄⣀⠀⠀⠈⠘⢭⡉⠙⠐⠯⣕⡪⣓⣏⡓⡶⠤⣀⠀⠀⠀⠀⢸⣿⣿⣏⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⣌⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠠⠀⣉⠁⠦⠀⠀⠀⠈⠉⠒⠲⠀⠀⠂⠤⢀⠈⠀⠀⠄⠀⠀⠈⠓⠯⣥⣛⠖⠍⠓⠦⠀⠈⣏⣿⣿⣯⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣷⣹⡸⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠙⠦⢄⡘⠢⢁⠀⠀⠂⠀⠀⢀⡀⠀⢀⠂⠠⢀⠈⠒⠄⢄⡀⠟⢄⣀⠰⠖⢭⡒⠤⡄⠀⠈⢋⣿⣦⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠞⣿⡏⠉⡳⣧⣄⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⡁⡀⠀⠀⠀⠠⠀⡀⠈⠒⠠⠀⡀⠀⠢⠤⣀⠀⠈⠻⠷⣀⣑⡢⠬⣆⡀⠨⢅⡀⠀⠀⠀⠀⠀⢨⣯⠿⣯⡇⠀⠀⠀⠀⠀⠀⠀⠀⣰⠦⠅⢸⣧⣿⣜⣿⣿⢧⣿⠙⢷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⣘⣀⡈⡉⡁⠀⠒⠂⠐⠠⠶⠂⣀⡠⡈⠑⠀⠀⡀⢀⡀⠠⠄⡠⠍⠀⠀⠈⠀⢀⠑⠒⠀⠀⠀⠀⠀⣼⣆⢿⣿⠀⠀⠀⠀⠀⠀⢠⣼⡟⢀⡀⣼⡿⣿⣿⣿⣿⡿⡻⡄⠸⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠈⠈⠈⠀⠁⠈⠐⠒⠄⢈⡀⡀⢁⣈⡢⣭⠥⢄⡈⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⢿⢸⠘⣿⡇⠀⠀⠀⠀⠀⣾⠿⠃⠀⠘⢿⣽⢻⣿⣿⡿⠀⣃⠐⠀⠀⣹⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠈⠁⠂⠐⠀⠀⠉⠀⠂⠀⠀⠂⠀⠠⠤⠀⢀⢀⣈⢢⠤⠤⠄⠐⠐⠀⠀⠀⠀⠀⠀⠀⠀⠸⣻⢾⡟⣿⡀⠀⠀⠀⠀⢀⡇⣀⣀⣤⡀⠀⡿⣷⣿⣻⣽⣿⣿⣝⣿⡇⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠉⠂⠀⠀⠐⠒⠀⠀⠲⠄⢄⠀⠀⠀⠂⠀⠀⠀⠐⢀⠀⠀⠠⠀⠀⠐⠀⠂⠉⠀⠀⠀⠀⠀⠀⠀⢸⣿⣟⣳⣿⠁⠀⠀⠀⠀⠈⣿⣯⡟⠣⣍⢲⣥⣿⣿⡋⠀⣀⣀⡽⢺⡷⣿⣳⡶⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⢀⢀⠀⣠⠢⠂⠁⠠⠀⠂⠒⠂⠀⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⢀⠤⠀⠀⠀⠀⠀⠀⠀⢸⢼⣗⣞⡿⠄⠀⠀⠀⠀⡴⣿⣷⡉⠘⢿⣷⣷⡟⣿⣧⣤⣴⣿⠴⠞⠃⣿⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠈⠀⠈⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⢀⠀⠀⠄⠒⠊⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⢻⣸⣿⠇⠀⠀⠀⠀⠉⣾⠻⠧⢭⣉⡀⢿⣆⣾⣿⣿⣿⡵⣄⠀⠀⢻⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⡀⢀⠀⠂⠒⠁⠁⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠄⠄⠀⠀⠀⠀⠀⠀⠀⣿⢸⣿⡟⠓⠀⠀⠀⠀⠀⠸⡄⠀⠀⠈⠉⢿⣼⣿⣿⣿⣿⠁⠿⠀⠀⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⢠⠤⠐⠐⠈⠁⠀⠀⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⠂⠀⡀⠀⠀⠠⠀⠀⠄⠀⠀⣀⡀⠀⠀⠀⠈⣿⡇⣿⣧⠀⠀⠀⠀⠀⠀⠀⢳⠀⢴⣶⠷⡾⠿⢿⣿⣿⣿⡄⠀⡇⣰⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⢀⢠⠄⠀⠂⡀⡠⠀⠂⠀⠀⠁⠀⠀⠀⠀⢀⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⣿⢻⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠳⠼⣿⡦⡟⠻⣿⣿⣿⣿⡵⢠⣵⡟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⡀⠀⠀⡠⣤⠤⠊⠑⢀⢀⠁⠀⡀⠀⠀⠀⠄⠀⠀⠄⠀⠀⡀⠀⠂⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡏⡧⢸⣿⠀⠀⡀⠀⠀⠀⠀⠀⠀⠰⣜⣿⣷⣀⣶⣟⡿⢃⠱⣮⣇⡇⠀⠀⠀⠀⢀⣀⡀⢀⡀⠀⠀⠀⠀⠀', + '⠈⠀⠀⠀⠈⣁⠤⠂⠂⠁⠀⠀⠀⠀⠀⡀⠀⠀⣀⡄⠐⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣷⠳⢸⣿⣇⠀⣈⣀⣀⣀⠀⠀⠀⠀⢻⡿⣿⣿⣿⣿⣿⣿⣾⣷⠟⣇⣀⢀⣴⣾⣿⣿⣿⣷⣿⣧⣄⡀⠀⠀', + '⠀⠀⠀⠐⠉⠁⠀⠀⠀⠀⡀⡀⠀⠐⠘⠧⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⠀⠈⡿⡏⢺⢳⣿⣿⣿⣿⣿⣾⣷⣦⣴⣿⣷⣿⣦⡺⣿⣿⣿⣿⣿⣿⡻⣿⣗⣾⣿⣿⣿⣿⣿⡓⣾⣿⣿⡿⡄⠀', + '⠀⠀⠀⠀⡀⡤⠀⠒⠂⠁⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⠤⠐⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣯⢽⣼⣿⡿⡟⢿⣿⣿⣿⣿⣿⣽⣿⣿⣶⣿⣟⣴⣿⣾⣯⣿⣿⣷⣿⣽⣿⣿⣿⣿⣿⣭⣻⣿⣯⣷⣾⣿⠀', + '⠀⠀⠒⠋⠀⠀⠀⠀⠠⠄⠆⠀⠀⠀⠀⠀⣀⡠⠤⠖⠋⠈⠁⠀⠀⠀⠀⢀⠺⢁⣠⠤⠴⢮⡁⢰⠘⢯⣾⣿⣿⣧⣷⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡙⠙⠻⠿⣿⣿⣽⣿⠃', + '⠀⠀⠀⠀⠀⠀⠀⠖⠉⣀⠄⢀⠒⢊⡭⢤⣀⣀⠤⠀⠀⠀⠂⠀⠀⠀⠀⠈⠉⠛⠀⢀⣶⣾⣷⣯⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠈⠈⠉⣿⠀', + '⠀⠀⣀⣠⠤⠠⠖⠃⠩⠆⣀⡬⠤⠖⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣟⣺⣟⡿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣤⡀⠀⠀⣸⡏⠀', + '⡯⠋⠁⠀⠀⠉⠁⠀⠒⠊⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠓⠿⢷⣮⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠷⣶⡿⠀⠀', + }, + { + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⢞⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⠾⣓⢷⣢⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣄⣤⣤⣴⣶⣶⣄⡴⢋⣵⡿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣖⣽⡟⠀⠀⠀⠳⣢⡽⠳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⣿⣽⣿⣿⣿⣿⣿⣧⣴⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⡟⣼⣿⣇⠀⠀⠀⢸⣯⡇⠀⣿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡿⠃⢹⣇⣨⡧⠀⠀⠀⠀⠳⢠⠙⠾⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣥⣿⣶⣼⠛⣅⣠⣤⣤⣤⣤⣤⡄⢠⡷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⢀⡠⠞⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⡽⢛⣿⣿⣞⡿⢍⣴⠚⠆⢉⡟⡇⢸⣷⣾⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⢀⡴⠋⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣷⣬⣿⣾⢹⣄⣽⣿⡤⠞⣭⣂⠿⢈⣟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⣰⠏⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⡏⠟⢯⣼⢀⣠⡵⠖⠃⠉⠉⠀⠀⢸⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⢠⣾⣩⣾⣿⣿⠟⠋⠉⢸⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣆⣈⣻⣟⣡⣀⣀⣀⠀⠀⠀⢀⣴⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⢠⣿⣿⣿⣿⣿⣥⣤⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣯⣿⣿⣯⣽⣿⡧⠀⠀⣠⣞⡽⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⢠⣿⣿⣿⣿⣿⣷⣿⡟⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⠀⠀⠀⢻⣿⣿⣿⣿⠃⣸⠇⠀⣸⣧⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⣾⣿⣿⣿⣿⣿⠿⠟⠃⠀⠀⠈⢻⣿⣿⣿⣿⣿⣿⣿⣷⣶⣤⣀⡀⢀⢠⣤⡶⢿⠹⣿⡻⣿⣷⣄⣨⣿⣿⣿⣿⣶⣟⣠⡴⢯⣽⣛⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⢸⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣭⣝⣳⣏⢓⡷⠙⣷⣿⣷⣼⡙⠿⣿⣿⣿⣿⣿⣿⣧⠤⠛⠟⡤⠲⠤⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⣼⣿⣿⣿⣿⣿⣀⣤⣶⣦⠀⠀⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⣿⣿⣾⣿⣿⣿⣝⣄⢐⣆⣉⡻⠦⣄⠉⠚⠛⢺⡑⠼⡂⠁⢈⠻⢙⡲⣄⡀⠀⠀⠀⠀⠀⠀', + '⢿⣿⣿⣿⣿⣿⣿⣾⣿⣿⡆⠀⠀⠀⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⣷⡌⢷⣀⡲⠭⠇⠛⢉⣑⡏⠑⢲⣔⡐⣶⢌⠇⡴⣄⣿⠛⢦⡀⠀⠀⠀⠀', + '⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠀⠀⠀⠀⠙⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣏⡑⠒⢲⡆⠈⣿⠷⣶⢒⢂⣤⡬⠷⣃⣠⢏⣤⡁⣿⣿⣄⢠⡟⣄⠀⠀⠀', + '⠈⣿⣿⣿⣿⡿⠟⠛⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣶⣶⣶⣶⣶⣶⣧⣤⣤⣬⣙⠀⠐⠳⣌⢖⣼⣿⣿⣿⣿⣄⣸⢷⡀⠀', + '⠀⠙⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⢛⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠀⢨⢿⡍⠉⣿⣿⣿⣶⣤⣾⣿⣿⣿⣿⣿⣿⣿⣷⣿⠄', + }, + { + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣶⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢉⣿⡟⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣸⣷⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣧⣿⣏⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣧⡦⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⠋⠁⡇⠀⠸⣿⣿⣿⣿⣿⣇⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠤⠤⠤⠼⠇⠀⠀⠀⠀⠀⢻⣿⣿⣿⣻⣿⣾⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⡤⠀⠀⠠⠶⠶⠶⣾⠇⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⣿⣇⣮⣇⡀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠒⠀⠀⠀⠀⣀⣠⠀⠤⠤⠤⠤⠴⠖⠒⠒⠒⠒⠒⠋⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣶⣶⣄⠀⣷⣶⡿⠿⣿⣿⣿⢻⡇⣿⣿⣷⠆⠀⠀⠀⠀⠀⠀⠀', + '⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⢿⡳⣾⣾⣿⣿⣿⣞⢹⣿⣫⣿⣇⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⡛⠣⣟⣿⣿⣿⣿⣿⠃⠀⠀⣿⢣⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣧⡉⠳⣤⣿⣿⣯⣁⣝⣻⡀⢀⣀⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⢸⣷⣾⢻⡿⣿⣿⣿⣿⣟⣆⣺⣾⡋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠻⣿⣿⠟⠻⢿⣿⡟⢉⣏⣽⣿⣴⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢿⣿⣶⣶⣿⣷⣿⣿⣿⣿⣿⠛⠀⢀⣀⣀⣠⣄⡀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠀⢀⣠⣤⣶⣶⣶⣦⢽⣿⣥⣭⣿⣛⣛⣛⣛⣛⣛⣳⣔⣿⣿⣿⣿⣙⣿⣷⣄⠀⠀', + ' ⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⡤⣴⣶⣶⣾⣿⣏⣿⣿⣿⣷⣶⣿⣧⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠛⠛⠛⢻⣿⣿⣿⣿⣿⡿⣿⣿⣿⣿⣿⠿⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣏⣿⡄', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠌⠉⣹⣾⣿⢇⣿⡏⣿⣶⣢⣿⣛⣆⣿⣛⣃⣽⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣂⢿⣿⣾⣷⣿⠽⢿⡿⡟⢛⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢯⣿⣳⠙⠀⠀⢠⢎⡇⢷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡽⠀⠀', + }, + { + '⠀⠀⠀⠀⡤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠬⠹⣛⠷⣯⣗⡦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⣙⣒⠴⢝⡳⢯⣈⠑⣫⣷⠀⠀⠀⢠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⣤⡶⡶⣓⣷⣤⡀⠀⠀⠀⠀', + '⠀⠈⢘⡇⠭⣱⡪⢭⡾⣭⣒⡾⢽⣲⠤⣁⢠⠤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⡿⠭⠽⠽⠾⢼⣿⣿⣆⠀⠀⠀', + '⠀⢠⢒⢳⠀⡠⠭⡅⡠⣫⠖⠉⢗⢾⣉⣲⠯⢟⡲⢯⣖⡧⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⢹⣿⣿⠀⠀⠀', + '⠀⠀⠛⢽⡢⠡⠅⣒⢿⠕⠛⣴⡀⠐⣈⣒⠩⠐⠪⢟⣻⢝⣻⣁⣶⣢⢄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⡟⣁⣤⣤⢤⣀⠀⠀⠀⠀⢼⣿⣿⠀⠀⠀', + '⠀⠀⠄⡢⠯⣄⣎⡊⠘⣘⡷⡇⢈⠛⠯⣾⠙⡗⡍⡀⡹⡝⠲⠝⠒⠭⢻⡾⣻⣯⣷⣦⠀⠀⠀⠀⣼⢹⠏⣾⡥⠄⠈⣤⣾⢖⢢⣴⣶⡞⢿⡿⠀⠀⠀', + '⠁⠀⠩⠭⡏⢳⣦⠮⣭⣒⣽⠷⣀⡒⠆⢁⡃⠊⠉⡀⢖⡑⢋⠃⣀⢶⠎⣴⣱⣿⣿⣿⠗⠀⠀⠀⢿⡏⠀⠉⠛⠋⢩⡟⠋⢸⣾⣿⣽⣇⢻⡇⠀⠀⠀', + '⠀⠀⠀⠀⠀⠁⠈⠉⠁⠁⠈⠻⣓⣺⡽⢴⣒⣍⠆⠉⣐⣓⠟⢈⡴⠁⣰⣿⣿⣟⣿⢃⢀⠀⠀⠀⢸⠃⠀⠀⠀⠠⠏⠀⠀⢸⣿⣿⡿⣷⣿⠁⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠒⠻⠭⠑⠒⡯⠵⣪⣦⣾⣯⣿⣿⣿⣿⡿⠛⠀⠀⠀⠘⣿⣿⣶⣶⣿⠁⠀⠀⠈⣉⣿⣷⢻⡏⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⢀⣠⠴⠒⣛⣶⢟⣿⠾⣿⣟⣛⡛⣯⣀⣀⣀⡀⠀⠀⢹⡟⠋⣳⡇⠀⠀⣀⣴⣿⢋⢳⡟⣀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣶⣋⣉⣉⡉⠀⢀⣴⣾⢁⣿⡛⠓⠒⠒⠯⣽⠂⣀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣿⣽⣿⣷⣶⣾⣿⣿⣷⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣤⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⠿⣿⠿⣿⣿⣿⣿⠙⠛⠻⠿⠿⠿⣿⣿⣿⣿⣿⣿⣯⣷⣤⣤⣦⣭⣽⣿⣟⣟⣻⣿⣿⣿⣿⣇⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⣤⣿⣿⣿⠃⠀⠀⠀⠀⡀⢀⣀⠶⣾⣿⡿⣿⣿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡆', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡞⢺⣿⣿⣿⣿⠀⠀⣀⡤⠔⢂⣴⣿⣾⣋⣩⢾⡿⣻⣾⣿⡏⠛⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣇⣼⣿⣿⣿⣿⣶⣿⣿⣿⣿⣿⣿⣿⣟⠸⠁⢸⣿⣯⣿⡿⠃⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⣲⣻⢿⡟⠀⠀⠀⢰⣿⣹⣿⣿⣿⢿⢿⣿⣿⣿⣿⡿', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣼⡷⣿⣿⡵⠶⠄⣠⣿⣿⣿⣿⣿⣿⠸⠀⢻⣿⣿⣿⡇', + }, + { + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⢞⡴⣫⢞⠃⣡⠞⠃⠓⠋⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⣫⢞⡵⣠⠞⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠔⣩⢞⡵⣫⠞⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⢖⡵⢊⠉⡼⣟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠴⢲⠲⠿⣫⠞⠀⠀⠁⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡰⠋⠀⠀⠀⢀⣾⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⠀⠀⠀⠀⢠⡾⣿⣓⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⡏⠠⡀⠀⠀⠀⢘⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⠀⠀⢀⡰⠟⣋⠉⣐⣿⣏⢳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣯⣴⣿⡄⣽⡒⣄⣴⠟⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⠀⠀⣸⠷⢛⣧⢖⡖⠺⢯⣏⣿⢧⣀⠀⠀⠀⠀⠀⠀⠀⢀⡴⣫⡾⣸⠿⠻⣿⣾⣷⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⠀⠠⣭⣽⠛⠛⡿⣄⣰⣶⡿⠸⣇⢘⡆⠀⠀⠀⢀⣠⣶⣿⣟⣿⣡⣶⣿⣿⣿⠟⠑⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⠀⠀⣷⢿⡇⡄⡈⠃⠀⠀⠀⠀⡏⢹⡇⣀⣴⣾⡭⠞⢹⡄⣠⣾⣿⣿⣿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⠀⠀⢿⣿⣷⢍⡁⠀⣀⣀⣤⣤⣿⣼⣤⣾⣿⠀⣼⣆⣽⣿⣿⣿⡿⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⠀⠀⢸⣿⣿⣯⣴⣪⣗⣽⣿⣮⣽⣿⣿⣿⣿⣾⣯⣿⣿⣿⢟⡉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⠀⠀⠀⢿⡿⣻⣿⢿⣿⣟⢛⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣽⣶⢿⣽⣦⢍⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⠀⠀⢀⣬⣭⣵⣿⣿⣿⣾⢿⢻⡭⣋⣿⣿⣿⠿⣿⣿⣿⣿⣿⢀⠈⠛⣝⣯⣷⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⢀⣴⣿⣿⣿⣿⡿⣛⣹⣏⣿⣿⣿⣿⡿⡋⣀⣤⣤⣍⣽⣿⣿⣿⣾⣶⣿⣷⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⣿⣿⠿⠛⠉⢠⣾⣿⣿⣿⣿⣿⣿⣙⠻⣿⣿⣟⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⢸⣿⣇⡀⠀⡔⣮⣿⣿⣿⣿⣷⣝⢿⢳⣜⣿⣿⢿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⢸⣿⠹⠃⣀⢙⣿⣿⣿⣿⣯⠄⠈⢳⣽⣿⣿⣿⡟⣿⣿⣿⣿⠿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠈⣇⠐⢀⣽⠿⣿⣿⢿⡟⣿⡐⠀⠀⢻⡿⣿⣿⡇⢸⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⣿⣦⡿⢁⣾⣿⣿⣿⣧⢹⣧⡉⠀⠈⢿⣿⡾⠀⣿⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⢸⣿⣽⡾⠗⠓⢻⡻⣿⣯⣟⣿⣶⣤⣤⣿⣇⣭⣼⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + }, + { + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣼⣿⣿⣯⣗⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠴⠒⠛⠛⠛⠒⠦⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⠴⠖⠀⠀⠀⠀⠀⠀⠀⠀⠉⠳⠦⣄⡀⠤⣄⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⠿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠖⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠙⢷⡄⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣯⠶⢸⣿⡉⠿⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣷⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⡏⣄⡹⣿⣶⣾⣿⣇⡀⠹⣿⡦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠋⠀⠀⠀⠀⠀⠀⠀⣠⡴⠞⠛⢛⢛⢦⡀⠀⠀⠀⠀⠀⠀⠀⢿⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⣿⣿⡛⢿⡏⡟⠙⡟⢷⡄⣿⣷⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⠏⠀⠀⠀⠈⠀⠀⠘⣆⠀⠀⠀⠀⠀⠀⢸⠆⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⡿⡇⠀⠻⣥⡤⣝⣷⣿⢹⣯⣨⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠀⠀⠀⠀⠀⠀⠀⢰⡏⠀⠀⠀⠀⠀⠀⠀⠀⢸⡆⠀⠀⠀⠀⠀⢸⡀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⡇⠘⠂⠀⠘⠿⣿⠟⠻⢸⣿⡾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡆⠀⠀⠀⠀⠀⠀⠈⢷⡀⠀⠀⠀⠀⠀⠀⠀⣼⠃⠀⠀⠀⠀⠀⠀⢸⡇⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⠿⣿⠀⢠⡂⠀⠀⠀⠀⠀⣼⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢷⣲⡄⠀⠀⠀⠀⠀⠈⠻⣤⣀⠀⠀⠀⣠⡞⠁⠀⠀⠀⠀⠀⠀⢀⣾⠁⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣄⠘⡧⣷⣶⣤⣤⣄⣽⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠂⣿⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀⢠⡾⠋⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡿⣿⣿⣿⣿⣿⣿⣈⢿⣾⣿⣽⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⠟⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣵⣿⣿⣿⣿⣿⣿⣿⣧⣀⣭⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⢄⣐⣦⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⠃⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⡗⠛⣋⣠⣼⣧⣼⣯⠙⠻⣿⡏⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠀⠈⠓⢦⡀⠀⠀⠒⢶⣦⣤⣤⣴⠴⠞⠋⠁⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡞⢻⣵⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣶⣦⣀⠀⡀⢀⣠⣤⣄⣤⣀⠀⠀⠀⠀⠀⢀⠤⠀⢀⢀⣀⡶⢒⣿⣿⣾⣯⡉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⢃⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣾⣿⣿⣿⣷⣾⣿⣷⣾⢻⣿⡻⣿⣿⣶⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⣼⣷⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⣾⣿⣷⣿⣿⡿⢷⢄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠏⠋⠙⡟⣿⣿⡟⠛⠿⣿⣿⣿⣿⣿⣿⣿⣧⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀⠨⣿⣿⡿⠿⣿⠛⠛⠛⠛⠻⠿⠿⠿⢟⡻⠅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠿⣿⣿⣿⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡆⠐⢨⣿⡷⢾⣿⠀⠀⠀⠀⠀⠀⠈⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠛⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⣼⣿⢷⣾⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + }, + { + ' ', + '⠀⠀⠀⠀⠀⣴⣦⣤⣤⣤⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠈⠙⠛⠛⠶⠿⣭⣿⣛⣷⡶⣶⣤⣤⣄⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠙⠛⠻⠶⢶⣯⣭⣿⣛⣻⠶⢶⣤⣤⣄⣀⡀⠀⠀⠀⢠⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠙⠛⠛⠻⠷⠶⣯⣭⣭⣽⣛⣶⢿⣿⣿⣿⣄⣤⣀⠀⠀⣾⡻⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⢻⣿⣿⣿⣣⣸⣿⣿⣽⣛⡛⠾⠿⠿⣷⣤⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡻⣿⣯⣽⡋⠛⠛⠉⠙⠛⠛⠷⢶⣶⣤⣭⣹⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⡇⣴⣿⡻⡇⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣟⢿⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣸⣧⣹⣏⣙⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠛⠁⠀⢀⣀⣤⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢻⡟⠛⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣾⣿⣿⣟⣻⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣇⣀⣀⣘⣷⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⡿⠛⠻⠛⠛⢿⣿⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠉⣿⡻⣿⣿⡀⠀⠀⠀⠀⠀⠀⢀⣾⣿⡿⠛⠃⠀⠀⢀⣄⠀⢿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⡆⢿⣿⡸⣿⡇⠀⠀⠀⠀⠀⢀⣾⣿⡟⠁⠀⢀⣀⣀⠈⠙⣷⣼⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡇⠤⣿⣧⠛⣧⠀⠀⠀⠀⢠⡿⣹⡏⡴⠾⠃⠀⢉⣿⠗⣂⣯⣥⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣶⢹⡿⠀⠘⣧⡀⠀⠀⠸⣷⡿⠈⠷⠶⠶⢶⣿⣿⠸⣿⣿⡟⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣶⣅⣠⣼⣿⣿⣄⠀⠀⠘⣧⠀⠘⠿⣦⣿⣿⣿⣼⣿⣿⢶⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣯⠝⣧⡀⠀⣿⣶⣶⣤⣽⣿⠋⣿⢿⣿⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣧⠙⢿⣟⢻⣦⢸⣿⣧⡻⢾⡿⢏⣾⣿⣶⣾⣿⣿⠟⣿⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣧⡘⣿⣎⣿⣿⡿⣿⣄⢿⣷⣿⣿⣿⣿⣿⣿⣯⣼⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣷⡘⢿⣿⣿⣾⣿⣽⣿⣦⣿⣿⣿⠛⠁⢿⣿⠈⠻⣿⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢿⡽⣿⣿⢁⣿⣿⣿⡟⠃⠉⠁⠀⠀⠀⣠⡶⠶⢶⣭⣽⡷⣦⡀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⣿⡟⠛⣿⡏⠀⠀⠀⣀⣤⡴⠟⠉⠀⢠⡾⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⠏⠁⣰⡇⠶⣤⣾⣿⣿⠏⠀⢀⠀⣤⣸⣷⣽⡏⣿⣿⣮⡹⣧⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣻⡆⢰⣿⣤⣤⣿⣿⡿⠃⠀⣰⣿⣿⣿⣿⣿⣿⡇⠈⣿⣿⣿⣿⣀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⣿⠀⠈⣭⣿⣿⡏⠀⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ ', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⡏⢀⠀⣿⣿⠟⠀⠀⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟ ', + }, + { + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠞⠛⢺⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡏⠀⡄⠈⣾⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠇⠀⣧⠀⢩⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⡾⡖⠚⡇⡇⠈⠉⠙⠛⠵⢦⣄⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣴⠛⠁⠀⢇⠀⢰⢳⡀⠀⠀⠀⠀⠀⠉⢉⢹⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡋⠙⠇⠀⠀⠀⢸⠀⠀⡇⡇⠀⠀⠀⣠⠀⣠⠎⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⡗⣄⠀⠀⠀⠀⠈⣄⣀⣸⡕⠤⢔⡞⢁⠔⢝⠀⠀⢷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠈⠣⣄⠀⣀⠀⡿⠤⠇⠧⢠⠎⡠⠊⠀⣼⣠⢤⡼⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣇⠀⠶⡪⠕⣌⠳⡇⠀⠀⣠⢃⠜⠁⡠⠼⠳⡌⠳⠙⣾⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢎⠀⡏⠑⠢⣮⡑⠎⢢⣰⡱⠋⡠⠊⠀⠀⠀⡇⢸⢀⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⡄⠸⡄⠀⠀⠙⡧⡀⢋⠀⢸⠀⠀⠀⢀⠜⠀⢸⣸⢅⠀⠀⠀⠀⢀⡠⡴⠭⠭⢉⠩⠵⡢⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⡌⢺⠶⣤⣔⡳⠱⣸⠀⠈⠒⠒⠒⠉⠀⡔⡱⢻⡆⠳⣄⠀⡠⡿⠉⡄⠀⣏⠀⢏⠀⠚⠵⣓⠶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢇⠀⠑⡄⠀⠀⠀⠘⡄⠀⠀⠀⠀⠀⠀⣇⠇⢸⣷⠀⠀⠑⢱⢹⣀⣳⠤⠝⠂⠚⠀⠀⠀⠀⠙⠪⠭⠟⣛⡷⣢⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠦⡄⠰⣀⡀⠀⠀⡇⠀⢀⢤⢲⠀⠀⠀⠀⠸⣿⠀⣀⣴⣾⡯⠒⢄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⡀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⢴⣾⠁⠀⠱⡈⢫⣉⣓⠢⠀⠸⡸⠀⠀⠀⠀⠀⣿⣜⢶⣾⣿⣾⣤⣊⣠⣀⣀⣤⣤⡤⢀⠀⠀⠀⠀⠀⠀⠀⠀⠙⡄⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣮⣿⣿⠃⠀⠸⡲⢌⠢⣑⣒⣈⣣⠷⠁⠀⢀⢀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⡿⠟⠛⠉⠀⠀⠙⢏⠁⢒⣀⠤⠀⠀⠀⠀⠸⡀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⢠⠃⣿⣿⣿⠇⠀⠀⠀⡇⠀⠑⢄⠀⠀⣠⣴⡶⠟⢋⣡⣾⣿⠗⢿⣿⡿⠿⠛⠉⠁⠀⠀⠀⠀⣀⠤⡦⢼⡀⠈⢦⠀⠀⠀⠀⠀⠀⠇⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⡜⠀⢻⡿⠃⠀⡀⠀⢀⣱⠀⠀⣨⣵⣿⣿⡋⣠⣴⣿⣿⡿⠋⠀⠈⠒⠤⣀⣀⡀⠤⠤⠄⠒⠉⠀⠀⠀⢰⠳⡀⠀⠣⡀⠀⠀⠀⠀⢸⠀⠀⠀', + '⠀⠀⠀⠀⠀⢀⣀⢜⣡⠄⠚⠁⣠⣾⣿⡿⣲⠤⣤⣘⠛⣿⣿⣿⣿⣿⢟⠕⠁⠀⠀⠀⠀⡰⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣣⠈⠒⠤⠬⠦⠀⢀⠀⢸⠀⠀⠀', + '⠀⠀⢠⣲⣽⣷⣿⣿⠋⠀⢀⡀⣼⣿⢫⠎⠀⠀⡸⠈⠇⣼⣿⣿⢫⣷⣥⣀⣀⡀⠀⠀⢠⠃⠈⠢⢄⠤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡟⠀⢸⠀⠀⠀', + '⠀⠀⢳⣿⣿⣿⡿⣱⢰⡄⢸⣿⣿⡇⡞⡦⠔⠚⣡⢞⣼⣿⣿⢏⣾⣿⣿⣿⣿⣿⣿⣶⡞⠀⢀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢴⣿⡇⠀⢸⠀⠀⠀', + '⠀⠀⢸⣿⣿⣟⣾⣿⣿⡇⠈⢻⣿⣷⣧⣈⣑⣩⣴⣿⣿⡿⢃⣾⣿⣿⣿⣿⣿⣿⠿⠋⠀⠀⠀⠈⠻⣧⠀⠀⣀⣀⣀⡀⢠⡄⠀⣀⡴⠖⣛⣛⡳⠦⠁⠀⠈⠀⠀⠀', + '⠀⠀⢸⣿⣿⣿⣿⡿⠋⠀⣰⣿⣿⣿⣿⣿⣿⣿⡿⠟⣩⣴⣿⣿⣿⣿⠿⠛⠉⠀⠀⠀⠀⠀⠀⠀⢠⡏⠀⠚⢹⣛⣛⣀⣼⣣⣞⣉⣀⡰⠿⢿⣿⣿⠁⢠⡇⡄⠀⠀', + '⠀⠀⢸⣿⣿⣿⠟⠀⠀⢀⣿⣿⣿⣿⣯⣭⣭⣥⠶⠿⠿⠟⠛⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⡾⠓⠋⠉⠉⠁⠀⠀⣿⠏⠀⢀⣬⠍⣝⠳⣨⡟⠀⣾⣇⠇⠀⠀', + '⠀⠀⣿⣿⡟⠁⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⡿⢋⣠⣤⣤⣀⣀⣀⣤⣤⣴⣶⣦⣄⡀⠀⢠⣞⡥⠟⠁⠀⢠⣖⡶⠟⠿⠸⠏⠀⠰⣟⢁⣠⡛⣿⣿⠇⢰⣿⣿⠸⠀⠀', + }, + { + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⣀⣤⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢱⡈⢿⠋⢩⡝⣿⣿⣿⣷⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢷⠘⡄⠂⢸⢿⠿⢛⡛⠿⠷⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣀⣤⡄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢇⠹⣶⠂⠀⢀⣴⣶⠗⢒⢤⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⣀⣀⣀⣀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠄⠀⠀⠈⣹⣿⣱⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢈⠀⠂⢀⡠⠟⠉⣀⣠⣶⣾⣿⣷⣤⡀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠲⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣉⣭⣭⣥⣤⣤⣤⣤⣼⣿⣿⣿⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠸⡆⢠⣾⣤⠴⠟⢛⠛⠛⠻⠿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠛⠛⢛⣛⣿⣿⣿⣿⣿⣿⡄⠀⢰⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠆⣴⠟⠉⣀⣤⣶⣶⠠⠀⣦⠉⠳⠌⠷⠀⠀⠀⠀⠀⠀⠀', + '⣽⣿⣿⣿⡗⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⠤⠄⠈⢽⣿⣿⣿⣿⡇⠡⡀⢂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢦⠀⡏⢀⠘⠿⣿⠿⠋⣠⡆⡏⡀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀', + '⣿⣿⣛⣛⡒⠀⠀⠀⢄⣴⣶⣶⣤⣤⣤⡀⠀⠀⣀⣄⣠⣨⣽⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠄⠓⣂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢊⢠⣿⣷⣶⣶⣶⣾⠟⠁⠡⠀⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀', + '⢸⡟⠀⠤⠤⠀⠀⠀⠈⠛⠛⠛⠛⠛⠋⠉⠭⠅⠩⠿⠿⠿⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠂⡀⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡟⠸⣿⣿⡿⠿⣿⣇⠸⠸⠂⢠⠞⠋⠀⠀⠀⠀⠀⠀⠀⠀', + '⠉⠉⠉⠉⠉⢉⣽⣿⣿⠋⠀⠀⠀⠀⠉⠉⠉⠀⠈⠙⠛⢛⣻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢰⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⠒⠂⢶⢰⢂⣿⣿⣶⠀⢐⣩⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⢀⣀⣤⣿⣿⣿⣷⣶⣶⣶⣶⣶⣄⣀⣀⣀⣀⣠⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⢨⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠛⠛⠀⢊⣼⠿⠟⢃⡐⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠒⢒⣖⣟⣛⣛⡛⠛⠛⠛⠛⠛⠛⠛⠛⠛⠛⠛⠛⣛⣿⣿⣿⣿⣟⣿⣿⣿⣿⣿⣿⣿⣿⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⣶⣶⣶⣶⣿⣿⣁⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠻⣿⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣙⠟⠭⠭⠿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⡀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⡿⢋⠥⠖⡶⠃⠀⢂⡀⢠⣄⠀⠀⠀⠀', + '⣀⣤⣖⣿⣤⣀⡀⠀⠀⠀⠀⢀⣀⠀⠀⠀⠀⠀⠀⣀⣄⣀⣶⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⢠⠀⠀⠀⠀⠀⠀⢀⠂⢸⣿⠑⡀⣴⡀⢳⠄⣹⣿⣿⡿⢋⠄⠁⠄⣴⠃⢀⣴⣿⠏⣸⣿⡿⠀⠀⠀', + '⣿⣿⣿⣿⣿⣯⣭⣁⣤⣄⣤⣤⣛⣓⣒⣒⢒⣒⣲⣶⣶⣶⣶⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡌⡄⠀⠀⠀⣠⣶⣿⡃⡄⡿⠀⡗⠘⣷⠀⠁⣿⠋⣩⣴⠁⠜⣠⠞⠁⣸⣿⠟⣡⣾⡿⠋⣠⡆⠀⠀', + '⣿⣿⣿⣿⡿⠏⠀⠘⠻⣿⣿⣿⣿⣿⣿⣛⣛⣻⣿⣿⣿⣿⣿⡿⠿⠿⢿⣿⣿⣿⣿⣿⣿⣿⣷⢸⠀⠤⢾⣿⣿⠏⡃⢡⠡⢠⣤⡟⠀⣴⣾⡏⠲⡌⢿⣷⡾⡏⡀⠒⠉⠔⠚⠡⠌⢠⣾⣿⠁⠀⠀', + '⠿⠿⣿⣿⡿⣿⠿⣿⣿⠗⠒⠀⠀⠛⠛⠛⠓⠈⠉⠩⠽⣿⣿⡷⠶⢶⣾⣿⣿⣿⣿⣿⣿⣿⣿⡌⣷⡄⠲⣾⣿⣰⠃⠸⣧⡙⠛⢁⣆⠟⣛⣃⣀⣉⡁⠲⠶⣿⣿⣦⣾⠆⠻⡆⢠⣿⡿⠋⠀⠀⠀', + '⠀⠀⠀⠀⠀⠙⠛⠿⠿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⢲⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠈⠅⠀⢋⣭⣴⣶⣶⡇⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣶⣌⠛⠋⠀⠀⠀⡜⠋⠁⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠛⠛⠛⠋⠙⢿⣿⠿⢋⣴⣶⣶⣏⢹⣿⣿⣿⣧⠀⠙⠿⣿⣿⣿⣿⣿⣿⣿⣷⣿⣿⣿⡷⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢤⡔⠊⠻⣟⣿⣿⣍⠀⠻⠿⠿⠿⠂⠂⠀⠚⠛⠛⠛⠛⠛⠻⠿⠟⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠀⣠⣧⠍⠁⠀⠀⡀⠀⠀⠀⠀⢁⣤⣤⣤⣶⣶⣶⣶⣖⣢⡤⣤⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠁⠀⠀⠀⠀⠀⣛⠀⢀⡀⠰⢿⣿⣿⣿⡿⠟⢛⣩⣭⣭⣭⣭⣭⣭⣥⣤⣀⣀⡀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣷⣾⣿⣿⣦⡙⢿⢋⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⠀⠀⠀', + }, + { + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⠖⠒⢤⡀⠀⠀⠀⠀⠀⠀⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⡀⠀⠀⠀⠀⠀⠀⡗⡅⠀⠀⠀⠱⡀⠀⠀⠀⠀⠀⢹⣣⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡏⠇⠀⠀⠀⠀⠀⠀⢡⣷⠰⠻⣷⣀⢠⠀⠀⠀⠀⢠⠘⣥⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣷⢸⣣⠀⠀⠀⠀⡀⡜⢸⡄⡆⠀⠠⣽⢆⡤⡀⢀⠖⠇⣿⢠⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣽⡄⠣⣥⡀⢀⡾⢆⢈⢸⡇⡎⢀⢓⠂⡇⣬⣦⡞⡸⢠⡟⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⡄⠐⣵⡎⠹⠋⠈⢸⣔⡀⠘⠋⢥⠉⢨⣿⣇⠛⣼⠃⡜⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⣧⣞⡃⠀⠀⠀⠖⣟⠇⠀⠀⠀⢀⠇⣿⡧⡾⢃⡒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⢹⢲⢤⣀⠀⣯⣠⣔⡼⠛⢛⣿⣿⡜⢁⠕⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣏⢦⣸⣳⣵⣯⡛⠿⢤⠴⡋⠁⣿⢈⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢇⠳⠠⡀⠸⠇⣀⡍⠳⠋⠁⢀⢹⡸⠁⠀⠀⠀⠀⠀ ', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣧⢀⠀⠡⡟⠉⠀⣀⠀⠀⢈⣾⠃⠀⠀⠀⠀⠀⠀ ', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⡽⡟⡴⠷⠬⠙⣽⠃⢀⢜⠁⠀⠀⠀⠀⠀⠀⠀ ', + '⠀⠀⠀⠀⢀⡤⠲⠶⣀⣠⣤⡤⡄⢀⣀⣠⢤⡤⠤⠼⠿⠒⠲⠚⠂⠉⢁⣯⢼⣖⣂⡤⣤⡀⠀⠀⠀ ', + '⠀⠀⢀⠔⠉⠀⠀⣠⣤⣤⣠⣄⣤⣬⣊⣿⣶⡤⣽⣒⣀⠀⡀⠀⣀⣘⣛⣳⣶⣶⣿⣍⠉⠀⠀⠀⠀ ', + '⠀⠀⢸⣦⣤⣄⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⡿⠿⠛⠟⠋⠚⢱⣿⣿⣿⣯⠀⡿⣋⣹⠒⢠⡤⣀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠙⢿⣿⣿⣯⡍⢉⣉⢩⣾⣿⡟⢏⡿⠛⣶⣤⣄⣀⣀⡀⣀⣈⣝⣻⣿⣿⣇⢰⣗⢑⡶⡾⠧⣭⣬⡄⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠙⢿⣿⣿⣿⣷⡿⣿⣿⡐⠿⡙⢳⢏⣹⣯⠟⠹⢩⣿⠿⢉⡐⢫⢻⣿⣸⣼⣋⡮⣰⡟⢇⡽⡀⠀⣀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠈⠉⢻⣿⣿⣮⣖⡬⢚⣋⡭⣹⣫⡫⠭⡻⣘⠸⡯⠭⠀⠯⣄⣿⣷⣿⢞⣧⣿⠁⣿⢲⡇⢲⡻ ', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣡⠼⠟⢷⣧⣄⡗⣿⡿⢾⢿⡟⣟⣭⣉⠙⣓⡫⣽⣷⣿⣯⡻⣿⠀⣸⡼⢁⠉⠀ ', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣳⠄⠀⠈⢿⣿⡵⡹⡿⠊⣰⣿⣿⣿⡿⠿⠿⣿⣿⣿⣿⣷⣙⢻⡷⢹⡷⡼⠀⠀ ', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣯⠀⠀⠀⣸⣿⣿⣟⣠⣾⣿⣿⣿⣿⣷⣶⣤⣿⣿⣿⡿⣿⣻⣶⣿⡜⡷⢳⠀⠀ ', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⠿⢦⣼⣿⣿⣿⣿⡅⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⣴⢸⠀⠀ ', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣧⠬⠀⠀⢀⣺⣿⡟⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣘⡄⠀ ', + }, + { + '⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⢷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⣠⣤⣠⣿⣷⣤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⢤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡸⢹⠘⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⢤⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⢿⣿⣿⣾⣿⣽⠁⢀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣕⣦⠤⣀⣀⡀⠀⣀⣀⡀⢀⣤⡦⢸⡀⠹⡄⢀⣠⠤⣄⠀⢀⡠⢔⣡⠞⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠈⢿⣿⣿⣿⣿⣷⣻⢿⢧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣽⣿⣯⣗⣒⠹⠷⢾⣝⣺⠿⠞⠀⠉⠇⢸⢿⣽⣋⣯⠶⢶⣶⢾⣛⡵⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠉⠻⣿⣿⣿⣿⣧⡬⠳⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠿⣍⡙⠳⢄⣾⣿⣿⣿⢿⣷⡄⠀⡁⢰⡾⣗⣿⡿⢖⣿⡿⠟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠘⠻⢿⣿⣿⣿⣷⠼⢳⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠲⣼⠿⢭⣙⠛⠛⢯⣿⢰⡁⡿⠟⢋⣅⣼⣾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠈⢻⢿⣿⢿⣣⢼⡻⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⡇⣼⠿⠷⣄⠈⣟⣿⣹⠃⣠⣯⠿⡇⢳⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠈⣾⣿⣿⣿⣿⣧⢸⣶⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⠀⡿⠂⠐⠻⣷⣮⢾⠯⣴⡾⠃⠐⢻⠈⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠨⢿⣿⣿⣿⣿⢿⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡄⣿⢦⣀⢀⣶⣹⣼⠀⣇⣶⢀⣠⣞⡾⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⡄⢳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡟⢻⣿⡆⠀⠈⠉⡿⣸⢄⠉⠉⠉⢀⣾⣱⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⣧⠈⢳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠳⡏⢿⡄⢀⣄⣭⣻⣟⣷⣤⡄⡞⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣦⠈⢧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠽⡶⡿⢱⣹⡗⢋⡉⣸⡇⡘⡖⠺⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⣿⣶⠈⢧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡟⣯⣄⠹⣷⣌⢐⡿⠋⣸⠅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⣿⣿⣇⠜⠲⣦⡶⣤⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⣀⠀⠀⠀⠀⣀⣀⣇⣬⣿⣷⣶⣿⣿⣶⣟⢿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⣿⣶⣦⢹⣧⣥⣿⣿⣿⣿⣶⣟⣿⣷⣶⣿⣯⡷⣎⢃⣭⣿⢝⢿⣿⣿⣿⣿⣿⣿⢟⠿⠊⠳⢤⡴⠤⠤⣄⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⢻⠻⣹⣿⠷⣷⠷⢝⠛⠛⣉⡩⠤⠾⠀⡀⠀⣷⠀⠸⣏⡙⡆⡌⣧⡀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡼⡆⣨⣷⣶⣦⣌⠺⣿⠞⢥⣀⣤⣦⣄⣈⡑⠟⠀⢀⣴⣬⢁⣾⢯⠿⡄⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠛⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⢳⣻⣿⣷⣭⣸⠀⡍⡀⠐⡷⡋⠀⠀⢹⢆⠀⠀⢸⠀⢸⣿⣯⣤⣔⣛⣲⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠙⠛⠛⠿⢿⣿⣿⣿⣿⣿⣿⠋⠛⠛⠛⠋⠀⢹⡉⠀⢻⣷⣤⣤⡾⣼⠙⠀⠈⢣⣠⢿⡿⢻⣧⡀⠈⠳⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣿⣿⣿⣿⣿⣧⡀⠀⠀⠀⠀⠀⠻⣷⠃⠈⢉⡉⠁⢣⠄⠀⠀⠈⡃⢸⡇⣮⡶⠻⠛⠛⠿⣆⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⣿⣿⣿⣿⣿⣿⣶⣾⣶⣶⣾⣾⣄⠈⠉⣩⣼⣧⣤⣤⣤⣤⣾⣿⣿⣿⣴⣾⠓⠀⠹⡀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣤⣾⣿⣿⣿⣿⣿⣿⣿⠻⣿⣿⣿⠏⠁⠀⠂⡄⠹⡄', + }, + { + ' ⠀⢀⣠⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣰⢶⣦⠀ ', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣻⡦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣶⣋⡴⠋⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣿⣟⢣⡀⠀⣸⣿⠹⣿⣤⠶⠒⠶⣦⣀⣀⣀⣠⣤⢶⣿⡿⠛⠁⠉⢀⣀⣾⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣧⡀⠈⠻⠧⠤⠭⣿⠀⢘⣿⣅⣀⣴⣿⣶⣶⣿⢻⠍⠉⠁⠀⠁⢀⣤⠾⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣶⣾⣟⠳⠟⠉⠀⠀⠀⢩⣼⢿⣿⣿⣿⣿⡖⠶⣄⡀⢀⣴⡟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⢿⣿⡒⢦⣦⠀⠀⠈⣵⣿⣿⡿⣻⢟⣿⡄⠈⢳⡋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣤⡙⢦⡙⠆⡸⣼⣾⣿⢿⡷⠟⠻⣅⠁⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⡿⣄⠻⣏⣹⣻⣿⣿⣯⣾⣃⡠⢻⡄⠸⣬⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⢀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⡷⠿⢦⣽⣿⢿⣿⣿⠋⠁⠀⠀⣼⡇⢀⡿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⢀⣠⣾⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢿⡄⢸⠸⣿⢸⣿⣿⣦⣀⡴⠋⠀⣷⡿⠟⢸⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⢈⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⢿⣟⠉⣿⡏⣿⠁⠀⠀⠀⠀⢄⣿⢡⣴⠿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⢻⣔⣾⣷⣛⣤⣤⣴⠚⢱⣿⠇⣼⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠐⠟⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣧⣿⣿⣿⣿⢉⣏⡷⠀⠿⢿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠘⣿⡏⢱⣾⡿⢀⣀⣴⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠘⢿⣿⣿⣿⣿⣿⣿⣿⣿⢿⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⡀⣀⣀⣀⠹⣿⣾⣿⣷⣿⣿⣿⣿⣿⣿⡷⣯⣼⡴⣶⣶⣤⣤⣤⣤⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⡟⣸⣿⣶⣤⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣦⣾⠛⠉⣻⣿⣿⣿⣷⣶⣿⣿⣟⣿⣿⣿⣿⣿⣿⣿⣿⣶⣿⣤⣤⣶⣷⣦⢀⡞⣾⣯⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠈⡻⠿⣟⣛⣋⣻⣷⣿⣿⣿⣿⣿⣿⣿⣶⠶⣤⣤⣤⣤⣴⣶⣟⢹⣿⣿⣿⡞⡇⢿⠿⠟⠋⠘⣿⢿⡿⢛⢉⡹⢥⡘⠻⠿⠿⡿⣿⣫⣏⣘⡿⠿⠿⢻⢣⣿⣿⣿⣷⣄⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠉⠻⡿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⣛⣛⣟⣛⣿⣿⣿⣿⣷⡇⢠⣶⡿⣿⣦⠈⠓⠛⣻⣵⡿⠋⠻⣷⣄⠀⠀⠟⣿⣿⣿⣿⣷⡄⣸⣸⣿⣿⣿⣿⢿⣷⡎⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢝⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⣿⣿⣿⣿⠜⠫⡿⣿⣿⣅⠀⢀⣨⣿⠐⢨⢿⠿⣿⣿⠏⢁⣇⣏⣿⣿⣿⣿⣿⡄⣽⡇⠘⢾⣄⡀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠟⠋⠀⠱⣿⣿⡿⣿⣽⣿⡿⣯⣤⣾⡞⠀⠀⠉⠉⠉⡼⣽⣿⣿⣿⣿⣿⣿⣿⣰⡿⣶⣌⡟⣧⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠉⠉⠉⠉⠉⠛⠻⠿⣿⣿⣿⣝⠆⠀⢀⣀⣤⠀⣌⣉⡄⠸⠹⠻⠿⣿⣿⣿⣁⣀⣠⣴⣶⣼⣵⣿⣿⠿⢿⣿⣿⣿⣿⣿⣿⣦⣽⣳⣿⣷⣦⣀⡀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣳⣌⠹⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀', + }, + { + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡀⣻⣄⡀⠀⠀⢸⠰⣄⡴⢶⣄⠀⠀⠀⠀⣀⡤⣖⣿⣼⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢻⣧⣑⠻⠭⠗⣼⡟⣏⠀⠀⢩⡗⣒⣚⣩⣵⣾⣿⡿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⢹⣿⣷⣶⣿⣧⠈⢷⣾⣿⣿⡿⢿⣿⡿⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡤⢖⣫⠍⠑⠪⡷⢄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⠿⣿⣿⡀⢿⡿⢿⡿⣫⣶⢳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣵⢿⠙⢻⣟⠲⢦⡀⠀⠩⡷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢁⣿⣧⡀⠺⢧⡸⢠⣿⢞⡙⣿⣏⢧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⢟⠥⢞⣆⣿⣿⣷⡶⣾⣷⡀⠘⢹⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢿⡍⢻⣦⣿⣱⣿⡿⠛⢻⣿⣿⠿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣏⣇⢟⣸⠃⠀⣰⣶⡻⣟⣿⡄⡾⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠨⣷⣼⣿⡏⠰⢿⣯⣴⡟⢸⢧⡧⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⣏⢰⡾⣞⡗⢄⣈⣻⣾⣿⡏⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⣶⣦⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⢿⣧⣤⣄⣶⣮⡁⡴⡄⡟⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⣿⣿⣿⣷⡇⡏⢳⣔⣻⣿⢷⠿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⣴⣿⡽⣿⣿⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣟⣿⣿⣯⢿⡿⣻⣿⣿⣷⡇⠀⠀⠀⠀⠀⠀⠀⡀⣰⣿⣿⣿⣿⣿⡾⣷⡁⠀⠘⣚⢉⣸⡰⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⢻⣿⣷⣿⣫⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣯⣼⣴⣾⣿⠋⢂⣹⠯⣗⣀⣠⠀⠀⠀⣰⣽⣿⣿⣿⣿⣿⢿⣿⣌⡁⠀⠸⣿⣿⡋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠈⣿⣿⣽⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣦⠶⠶⣢⣾⣿⣿⣿⣿⢓⡾⣫⣾⣿⡟⠛⠛⢿⣦⡀⣾⣿⣿⣶⣿⣛⣯⣴⣙⣿⣷⣤⣾⣹⡽⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⣿⣿⣾⣿⣿⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⣳⣿⢷⣿⣯⣾⡿⣿⣷⢏⣾⠟⣩⡟⠁⣰⡆⡌⠋⢿⣿⣿⡟⠋⠀⢩⡽⣯⣿⣿⡟⢿⣻⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠈⠉⢿⣿⠛⢙⣿⠦⣄⠀⠀⠀⠀⠀⢀⣴⣟⡿⣯⣍⢿⣿⣯⣿⣿⣿⡗⢸⣿⡾⣿⣷⣰⡿⠀⠀⠀⠜⣿⡏⣠⣤⣄⡌⣀⢹⣟⣹⡝⠂⠻⣟⣟⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠘⣿⣄⡀⠈⣷⣼⣦⡀⢀⣠⣾⣿⣿⣿⣿⣿⣿⢸⣿⣿⣿⣿⡟⣣⠛⠟⢙⣿⣿⣿⡃⠀⠀⠀⠀⢻⣷⣿⡹⣿⣭⣿⣾⢻⢻⣿⢢⠀⠹⣇⢼⡏⠻⣽⣲⢤⣀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⣶⣶⣴⣦', + '⠀⠀⠀⠀⠸⣿⣷⡀⢨⡽⢿⣷⢿⣿⣿⣿⣿⣿⣿⢻⣯⣿⣿⣿⢿⡿⡏⣿⣷⣆⢸⣿⣿⣿⣥⠀⢰⠀⠡⠈⣿⣿⣥⡤⣭⣽⣿⢸⣶⣾⠠⡆⡤⢻⣿⢸⣷⣯⡟⣸⡏⡗⣓⠲⠵⣄⣒⣒⣦⣤⣄⡤⣀⣴⣿⣿⣿⣿⣿⠟', + '⠀⠀⠀⠀⠀⢙⣿⣿⣾⣿⡻⣻⣦⣽⣿⣿⣿⣿⣿⣾⣿⣞⠑⣎⣧⣿⢷⣿⣿⣿⢸⣿⣿⣿⣿⡆⠐⡶⠀⠀⢻⣿⠖⠀⢄⣽⣿⣛⣹⣻⣰⣷⣃⣨⣿⣿⣿⣿⣿⣿⣇⣿⣿⣶⣦⣴⣤⣤⣾⣿⣷⣿⣿⣧⣵⣽⡿⠻⠁⠀', + '⠀⠀⠀⠀⠀⠀⠻⡿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠋⠁⣿⣿⡽⣶⣾⡟⣻⠀⠙⢛⣡⣿⣿⣿⣿⣿⣿⡀⠀⠖⠀⢀⣻⡆⢀⠈⠊⢹⡏⣹⣿⡿⣷⠏⠻⡄⠀⠉⠙⠿⠛⠻⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠟⠋⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠈⠛⠿⠿⠿⠛⠉⠁⠀⠀⠀⠐⢻⢷⣿⣯⣍⣽⣷⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢢⣳⣄⠀⠁⣷⡞⣀⣐⡆⣿⡓⠷⢷⣏⣾⣮⢿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢘⣿⣿⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡤⣻⣴⣶⣾⣿⣿⣻⡽⡞⣶⠶⣾⣿⣿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + ' ⠹⡼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⣿⢻⣳⡾⣿⡿⣾⣽⡶⢷⣶⡾⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ', + ' ⠈⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣺⣿⣯⣯⣿⡿⣩⢃⣝⣿⣿⣿⣿⣟⢷⡶⡦ ', + ' ⠀⢀⣿⢿⡿⣾⣿⣿⣿⣿⣿⣿⣿⣿⣡⣿⣿⣿⣿⣿⣴⣿⣾⡿⣷⣼⣝⣿⣿⣯⣿⣥⣤⣄ ', + ' ⠀⢈⣛⣧⣶⣶⣶⣶⣿⣿⣿⣿⡿⠛⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⣟⣛⠿⣿⣷⣿⣿⣿⣿ ', + ' ⠉⣿⠁⣽⠿⠿⠛⠛⡋⠁⠀⠀⠀⠘⣿⣿⣿⣿⣿⣿⣿⣟⣿⣿⣿⣿⣶⣿⣟⣛⣁⡭⣑ ', + }, + { + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢧⣢⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣻⡍⠂⠂⠀⣀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⡆⢹⢄⣼⣿⣭⣝⠲⠶⢲⣶', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣧⣸⣾⣫⠀⣿⠀⠈⠁⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⠀⢰⣧⣩⠿⠿⠿⣿⡿⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⡤⠖⢚⣙⣾⡿⣳⡶⣤⣞⡻⣗⣀⣞⠟⠋⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⣤⣴⣶⣋⣁⣠⣭⣷⣿⣿⣿⡇⣿⣿⢼⣿⣿⡿⣿⡏⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣄⣴⣺⣭⣷⣾⣿⣿⠿⠿⠿⠟⠛⢋⡿⠛⣄⠛⢦⣄⡘⣿⣿⣿⣼⢗⣄⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣾⣷⣽⡿⠟⠛⠛⠉⠀⠀⠀⠀⠀⠀⡞⣠⣶⠿⢿⣿⣿⣿⣽⣿⣿⣰⣾⢏⣷⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠼⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⠟⠁⠀⡽⣿⣿⣿⣾⠿⢿⣻⣭⣿⣿⡂⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠛⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣶⡟⡉⢷⡄⢀⣶⣿⣯⣻⣿⣿⣿⣿⣿⣻⡟⢠⠇⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⠴⠒⠛⣇⢁⠝⣿⣀⣽⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⣳⡞⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⠞⠉⠀⠀⢀⣠⣼⣿⣾⣾⡏⢻⣿⣿⣿⣿⡿⠉⠉⠉⣿⣿⣿⣿⠁⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡤⠞⠁⠀⠀⣠⣦⣶⣿⣿⣿⣿⢟⣿⣶⣿⣿⣿⠿⣿⣁⠀⠀⠀⠈⠛⠟⠉⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⣀⣄⢀⣰⡾⠛⠁⢀⣀⡤⠶⡾⠛⢷⣆⣠⣴⣿⠿⢋⣩⡽⠛⣿⣩⣿⠟⢡⠟⠀⠀⠀⠀⠨⣙⠒⠦⢤⣀⡀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⢠⣾⠷⢛⣽⣿⣿⣿⠞⠉⣠⣤⣶⣷⡿⣿⣿⡻⢷⣶⣿⣿⣷⣶⣤⣬⣿⠏⠀⠋⢀⣠⣶⡀⠀⠀⠀⠈⣏⣿⡟⢧⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⢀⡤⣼⣿⣿⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠛⠛⠉⠁⢠⣿⣯⣿⣿⣿⣿⣿⣿⣷⣶⣶⣶⣿⣿⣿⣧⣤⣴⣴⣤⣿⠤⣿⡾⠀⠀⠀⠀⠀⠀⠀', + '⠀⢀⣾⣷⣿⡿⣻⣿⣹⣿⣿⣿⣿⣿⡟⠋⠁⠀⠀⠀⠀⠀⠘⠿⠿⠟⠛⠉⠛⠉⠛⠛⠛⠿⠿⠿⢿⡿⠿⠭⠭⠭⠿⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⣸⣿⣿⣿⣿⣿⢿⣿⣿⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⢶⣟⣿⣿⣿⣟⣿⣟⣿⣾⣿⣻⣭⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠈⠻⢽⣟⣷⣿⣿⣿⠟⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + }, + { + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣻⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣇⣧⢧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⠖⠋⢈⣧⡎⠑⠢⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⠋⠉⠑⢦⣸⣿⣿⡴⠋⠀⠙⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠎⠀⠀⠀⠀⠀⠻⣿⡟⠀⠀⠀⠀⠀⠹⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠞⠀⠀⠀⠀⠀⠀⠀⢹⡆⠀⠀⠀⠀⠀⠀⢧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣶⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠁⠀⠀⠀⠀⠀⠀⠀⢸⡅⠀⢀⣠⠤⢤⠀⠘⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡉⣩⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠃⣠⡶⠋⠙⠒⠤⣀⠘⢸⡇⡾⡭⠞⠉⠉⢻⣦⣈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠛⠛⠧⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⡇⢷⡀⠀⠀⠀⢈⡇⢸⡇⣟⠀⠀⠀⢀⣾⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⣠⡴⠛⢒⣶⣿⣿⡟⢻⠀⠀⠀⠀⠀⠀⠀⠀⢻⠀⠙⠢⠤⠔⠊⠀⠰⣇⠘⠲⠤⢖⠋⣸⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⢠⣧⢖⣠⣾⡟⠁⢹⣧⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⢧⡀⠀⠀⠀⠀⠀⢰⡜⠀⠀⠀⣸⢀⡿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⢸⠉⠉⠚⠋⠀⠀⢠⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣦⡀⠀⠤⠤⢾⡇⠠⡀⢲⣯⡞⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⣾⣦⣄⣀⣉⣉⣵⠛⢀⠴⠊⠉⠉⠉⠛⠻⢶⣄⠀⠀⠀⢇⠁⢸⡀⠀⢀⣃⣐⠛⣿⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣴⠃⠀⠀⠀⠀⠀⠈⣆⠀⠹⣷⣤⡀⠘⢧⣄⠃⠀⠰⢧⡼⣣⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⡆⠀⠀⠀⠀⡀⢰⣦⡘⠀⠀⠹⡎⣿⠒⠀⠉⠻⢿⣿⣾⣿⣿⣀⢀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠙⠿⢿⣿⡿⠟⠁⠀⠀⢀⡀⠸⣃⣿⣿⣷⠀⠀⠀⣿⣿⠀⠀⠀⠀⠀⠙⠿⣟⠛⣫⣿⡿⠂⠈⠙⠻⣟⢿⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠘⣆⠀⠀⠀⠀⠀⢴⣴⠋⠀⣾⣿⡿⠁⠻⠀⠀⣼⣿⡟⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠋⠀⠀⠀⠀⠀⠈⠙⣽⣿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠈⠓⠤⣄⣠⣴⡯⠤⣄⠀⠘⠋⠀⠀⠀⢠⣾⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⣄⡀⠀⠀⠀⠀⠀⠀⠘⢹⡄⠀⠀⠐⢦⠀⠀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢘⡆⠀⠀⠀⣀⣴⣿⣿⣿⣿⣿⣄⠀⠀⠀⠀⠀⠀⢠⡞⠙⠉⠙⣇⠀⠀⠀⠀⠀⠀⣺⣿⣦⣄⣀⣌⣳⡀⠀⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢱⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣤⣤⣴⣾⣿⣧⡀⠀⢀⣿⣄⠀⠀⠀⠀⠀⣿⠟⠛⠛⠛⠿⠛⢿⡄⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⣀⢀⣰⡏⠀⠀⠀⠀⠀⠀⢀⡏⠀⠀⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠤⢤⡀⠀⠀⠀⢀⡾⢃⠈⠁⠀⠀⠀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⣿⣿⣿⣿⣿⣿⣿⣿⠃⠀⠀⠈⠳⢤⡀⢈⣠⣶⠀⢀⢀⠀⢀⠀', + '⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠉⠀⠀⠀⢻⣿⣿⣿⣟⡿⠛⠁⠀⠀⠀⠀⠀⠀⠙⣏⠛⢫⢔⡟⣸⢀⠘⣠', + }, +} + +function alphascreen.choose() + local seed_str = tostring(os.time()):reverse():sub(1, 6) + math.randomseed(tonumber(seed_str)) + local index = math.random(#screens) + return screens[index] +end + +return alphascreen diff --git a/config/nvim/lua/neo/autopairs.lua b/config/nvim/lua/neo/autopairs.lua new file mode 100644 index 0000000..bd900b0 --- /dev/null +++ b/config/nvim/lua/neo/autopairs.lua @@ -0,0 +1,33 @@ +-- Setup nvim-cmp. +local status_ok, npairs = pcall(require, "nvim-autopairs") +if not status_ok then + return +end + +npairs.setup { + check_ts = true, + ts_config = { + lua = { "string", "source" }, + javascript = { "string", "template_string" }, + java = false, + }, + disable_filetype = { "TelescopePrompt", "spectre_panel" }, + fast_wrap = { + map = "", + chars = { "{", "[", "(", '"', "'" }, + pattern = string.gsub([[ [%'%"%)%>%]%)%}%,] ]], "%s+", ""), + offset = 0, -- Offset from pattern match + end_key = "$", + keys = "qwertyuiopzxcvbnmasdfghjkl", + check_comma = true, + highlight = "PmenuSel", + highlight_grey = "LineNr", + }, +} + +local cmp_autopairs = require("nvim-autopairs.completion.cmp") +local cmp_status_ok, cmp = pcall(require, "cmp") +if not cmp_status_ok then + return +end +cmp.event:on("confirm_done", cmp_autopairs.on_confirm_done { map_char = { tex = "" } }) diff --git a/config/nvim/lua/neo/bufferline.lua b/config/nvim/lua/neo/bufferline.lua new file mode 100644 index 0000000..5ae7399 --- /dev/null +++ b/config/nvim/lua/neo/bufferline.lua @@ -0,0 +1,9 @@ +local ok, bufferline = pcall(require, 'bufferline') +if not ok then + print('bufferline load error') + return +end + +vim.opt.termguicolors = true +bufferline.setup{ +} \ No newline at end of file diff --git a/config/nvim/lua/neo/cmp.lua b/config/nvim/lua/neo/cmp.lua new file mode 100644 index 0000000..facda43 --- /dev/null +++ b/config/nvim/lua/neo/cmp.lua @@ -0,0 +1,213 @@ +local cmp_status_ok, cmp = pcall(require, "cmp") +if not cmp_status_ok then + return +end + +local ok, luasnip = pcall(require, 'luasnip') +if not ok then + print('luasnip load error') + return +end + +local has_words_before = function() + local line, col = unpack(vim.api.nvim_win_get_cursor(0)) + return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil +end + +require("luasnip.loaders.from_vscode").lazy_load() + +cmp.setup({ + enabled = function() + if + require("cmp.config.context").in_treesitter_capture("comment") == true + or require("cmp.config.context").in_syntax_group("Comment") + then + return false + else + return true + end + end, + + preselect = cmp.PreselectMode.Item, + window = { + completion = cmp.config.window.bordered(), + documentation = cmp.config.window.bordered(), + }, + formatting = { + fields = { "kind", "abbr", "menu" }, + format = function(entry, vim_item) + local lspkind_icons = { + Text = "", + Method = "", + Function = "", + Constructor = "", + Field = "ﰠ", + Variable = "", + Class = "ﴯ", + Interface = "", + Module = "", + Property = "ﰠ", + Unit = "塞", + Value = "", + Enum = "", + Keyword = "", + Snippet = "", + Color = "", + File = "", + Reference = "", + Folder = "", + EnumMember = "", + Constant = "", + Struct = "פּ", + Event = "", + Operator = "", + TypeParameter = " ", + Robot = "ﮧ", + Smiley = "ﲃ", + Note = " ", + + } + local meta_type = vim_item.kind + -- load lspkind icons + vim_item.kind = lspkind_icons[vim_item.kind] .. "" + if entry.source.name == "cmp_tabnine" then + vim_item.kind = lspkind_icons["Robot"] + -- vim_item.kind_hl_group = "CmpItemKindTabnine" + end + + if entry.source.name == "emoji" then + vim_item.kind = lspkind_icons["Smiley"] + vim_item.kind_hl_group = "CmpItemKindEmoji" + end + + if entry.source.name == "look" then + vim_item.kind = lspkind_icons["Note"] + -- vim_item.kind_hl_group = "CmpItemKindEmoji" + end + vim_item.menu = ({ + buffer = "[Buffer]", + nvim_lsp = meta_type, + path = "[Path]", + luasnip = "[LuaSnip]", + cmp_tabnine = "[TN]", + emoji = "[Emoji]", + look = "[Dict]", + })[entry.source.name] + + return vim_item + end, + }, + mapping = { + -- [''] = cmp.mapping(cmp.mapping.scroll_docs(-4), { 'i', 'c' }), + -- [''] = cmp.mapping(cmp.mapping.scroll_docs(4), { 'i', 'c' }), + -- [''] = cmp.mapping(cmp.mapping.complete(), { 'i', 'c' }), + [""] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `` mapping. + [""] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `` mapping. + -- [""] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `` mapping. + [""] = cmp.mapping({ + i = cmp.mapping.abort(), + c = cmp.mapping.close(), + }), + -- [""] = cmp.mapping(function() + -- cmp.close() + -- end, { "i", "s" }), + [""] = cmp.mapping(function(fallback) + -- cmp.close() + if luasnip.expand_or_jumpable() then + luasnip.expand_or_jump() + -- if luasnip.jumpable(1) then + -- luasnip.jump(1) + else + fallback() + end + end, { "i", "s" }), + [""] = cmp.mapping(function(fallback) + -- cmp.close() + if luasnip.jumpable(-1) then + luasnip.jump(-1) + else + fallback() + end + end, { "i", "s" }), + [""] = cmp.mapping.confirm({ + select = true, + -- cmp.close() + }), + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif luasnip.expand_or_jumpable() then + luasnip.expand_or_jump() + elseif has_words_before() then + cmp.complete() + else + fallback() + end + end, { "i", "s" }), + + [""] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + elseif luasnip.jumpable(-1) then + luasnip.jump(-1) + else + fallback() + end + end, { "i", "s" }), + }, + -- You can set mappings if you want + -- mapping = insert_map, + snippet = { + expand = function(args) + require("luasnip").lsp_expand(args.body) + end, + }, + sources = { + { name = "nvim_lsp", priority = 50 }, + { name = "cmp_tabnine", priority = 90 }, + { name = "luasnip", priority = 50 }, + { name = "path", priority = 99 }, + { name = "buffer", priority = 50, max_item_count = 5 }, + { name = "emoji", priority = 50 }, + { name = "nvim_lsp_signature_help", priority = 50 }, + { + name = "look", + keyword_length = 5, + max_item_count = 5, + option = { + convert_case = true, + loud = true, + --dict = '/usr/share/dict/words' + }, + }, + }, +}) + +cmp.setup.filetype({ "TelescopePrompt" }, { + sources = {}, +}) +cmp.setup.filetype({ "vim", "markdown" }, { + sources = { + { + name = "look", + keyword_length = 5, + max_item_count = 5, + option = { + convert_case = true, + loud = true, + --dict = '/usr/share/dict/words' + }, + }, + }, +}) + +-- require("cmp").setup.cmdline(":", { +-- sources = { +-- { name = "cmdline", max_item_count = 10 }, +-- }, +-- }) +-- require("cmp").setup.cmdline("/", { +-- sources = { +-- { name = "buffer" }, +-- }, +-- }) \ No newline at end of file diff --git a/config/nvim/lua/neo/comment.lua b/config/nvim/lua/neo/comment.lua new file mode 100644 index 0000000..5b792c7 --- /dev/null +++ b/config/nvim/lua/neo/comment.lua @@ -0,0 +1,18 @@ +local ok, comment = pcall(require, 'Comment') +if not ok then + print('Comment load error') +end + +comment.setup({ + ignore = '^$', + + toggler = { + line = 'cc', + block = 'bc', + }, + + opleader = { + line = 'c', + block = 'b', + }, +}) diff --git a/config/nvim/lua/neo/go.lua b/config/nvim/lua/neo/go.lua new file mode 100644 index 0000000..34b23ff --- /dev/null +++ b/config/nvim/lua/neo/go.lua @@ -0,0 +1,13 @@ +local ok, go = pcall(require, 'go') +if not ok then + print('go-nvim load error') + return +end + +gofmt = require('go.format') + +do_fmt = gofmt.gofmt +do_import = gofmt.goimport + +vim.api.nvim_exec([[ autocmd BufWritePre *.go :silent! lua require('go.format').goimport() ]], false) +go.setup() diff --git a/config/nvim/lua/neo/hop.lua b/config/nvim/lua/neo/hop.lua new file mode 100644 index 0000000..90f7cd2 --- /dev/null +++ b/config/nvim/lua/neo/hop.lua @@ -0,0 +1,12 @@ +local ok, hop = pcall(require, 'hop') +if not ok then + print('hop load error') + return +end + +hop.setup() + +vim.api.nvim_set_keymap('n', 'w', ':HopWord', {noremap=true, silent=true}) +vim.api.nvim_set_keymap('n', 'b', ':HopWord', {noremap=true, silent=true}) +vim.api.nvim_set_keymap('n', 'j', ':HopLine', {noremap=true, silent=true}) +vim.api.nvim_set_keymap('n', 'k', ':HopLine', {noremap=true, silent=true}) diff --git a/config/nvim/lua/neo/indentline.lua b/config/nvim/lua/neo/indentline.lua new file mode 100644 index 0000000..3aa7996 --- /dev/null +++ b/config/nvim/lua/neo/indentline.lua @@ -0,0 +1,87 @@ +local status_ok, indent_blankline = pcall(require, "indent_blankline") +if not status_ok then + return +end + +vim.g.indent_blankline_buftype_exclude = { + "terminal", + "nofile", + "quickfix", + "prompt", +} + +vim.g.indent_blankline_filetype = { + 'python', + 'lua', +} + +-- vim.g.indent_blankline_filetype_exclude = { +-- "alpha", +-- "dashboard", +-- "help", +-- "man", +-- "neogitstatus", +-- 'nerdtree', +-- 'vista', +-- "startify", +-- "packer", +-- "NvimTree", +-- "Trouble", +-- } + +vim.g.indentLine_enabled = 1 +-- vim.g.indent_blankline_char = "│" +vim.g.indent_blankline_char = "▏" +-- vim.g.indent_blankline_char = "▎" +vim.g.indent_blankline_show_trailing_blankline_indent = false +vim.g.indent_blankline_show_first_indent_level = true +vim.g.indent_blankline_use_treesitter = true +vim.g.indent_blankline_show_current_context = true +vim.g.indent_blankline_context_patterns = { + "class", + "return", + "function", + "method", + "^if", + "^while", + "jsx_element", + "^for", + "^object", + "^table", + "block", + "arguments", + "if_statement", + "else_clause", + "jsx_element", + "jsx_self_closing_element", + "try_statement", + "catch_clause", + "import_statement", + "operation_type", +} +-- HACK: work-around for https://github.com/lukas-reineke/indent-blankline.nvim/issues/59 +vim.wo.colorcolumn = "99999" + +-- vim.cmd [[highlight IndentBlanklineIndent1 fg=#E06C75 gui=nocombine]] +-- vim.cmd [[highlight IndentBlanklineIndent2 fg=#E5C07B gui=nocombine]] +-- vim.cmd [[highlight IndentBlanklineIndent3 fg=#98C379 gui=nocombine]] +-- vim.cmd [[highlight IndentBlanklineIndent4 fg=#56B6C2 gui=nocombine]] +-- vim.cmd [[highlight IndentBlanklineIndent5 fg=#61AFEF gui=nocombine]] +-- vim.cmd [[highlight IndentBlanklineIndent6 fg=#C678DD gui=nocombine]] +-- vim.opt.list = true +-- vim.opt.listchars:append "space:⋅" +-- vim.opt.listchars:append "space:" +-- vim.opt.listchars:append "eol:↴" + +indent_blankline.setup({ + -- show_end_of_line = true, + -- space_char_blankline = " ", + show_current_context = true, + -- show_current_context_start = true, + -- char_highlight_list = { + -- "IndentBlanklineIndent1", + -- "IndentBlanklineIndent2", + -- "IndentBlanklineIndent3", + -- }, + show_trailing_blankline_indent = false, +}) diff --git a/config/nvim/lua/neo/lspconf.lua b/config/nvim/lua/neo/lspconf.lua new file mode 100644 index 0000000..0ce7d37 --- /dev/null +++ b/config/nvim/lua/neo/lspconf.lua @@ -0,0 +1,141 @@ +local ok, lspconfig = pcall(require, 'lspconfig') +if not ok then + print('lspconfig load error') + return +end + +local opts = { noremap=true, silent=true } +vim.keymap.set('n', 'e', vim.diagnostic.open_float, opts) +vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts) +vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts) +vim.keymap.set('n', 'q', vim.diagnostic.setloclist, opts) + +-- Use an on_attach function to only map the following keys +-- after the language server attaches to the current buffer +-- local on_attach = function(client, bufnr) +-- -- Enable completion triggered by +-- vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') +-- +-- -- Mappings. +-- -- See `:help vim.lsp.*` for documentation on any of the below functions +-- local bufopts = { noremap=true, silent=true, buffer=bufnr } +-- vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts) +-- vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts) +-- vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts) +-- vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts) +-- vim.keymap.set('n', '', vim.lsp.buf.signature_help, bufopts) +-- vim.keymap.set('n', 'wa', vim.lsp.buf.add_workspace_folder, bufopts) +-- vim.keymap.set('n', 'wr', vim.lsp.buf.remove_workspace_folder, bufopts) +-- vim.keymap.set('n', 'wl', function() +-- print(vim.inspect(vim.lsp.buf.list_workspace_folders())) +-- end, bufopts) +-- vim.keymap.set('n', 'D', vim.lsp.buf.type_definition, bufopts) +-- vim.keymap.set('n', 'rn', vim.lsp.buf.rename, bufopts) +-- vim.keymap.set('n', 'ca', vim.lsp.buf.code_action, bufopts) +-- vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts) +-- vim.keymap.set('n', 'f', vim.lsp.buf.formatting, bufopts) +-- end + +local on_attach = function(_, bufnr) + vim.api.nvim_buf_set_option(bufnr, "omnifunc", "v:lua.vim.lsp.omnifunc") + + local opts = { noremap = true, silent = true } + vim.api.nvim_buf_set_keymap(bufnr, "n", "gD", "lua vim.lsp.buf.declaration()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "gd", "lua vim.lsp.buf.definition()", opts) + -- vim.api.nvim_buf_set_keymap(bufnr, "n", "K", "lua vim.lsp.buf.hover()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "gi", "lua vim.lsp.buf.implementation()", opts) + -- vim.api.nvim_buf_set_keymap(bufnr, 'n', '', 'lua vim.lsp.buf.signature_help()', opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "wa", "lua vim.lsp.buf.add_workspace_folder()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "wr", "lua vim.lsp.buf.remove_workspace_folder()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "wl", "lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "D", "lua vim.lsp.buf.type_definition()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "rn", "lua vim.lsp.buf.rename()", opts) + -- vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gr', 'lua vim.lsp.buf.references()', opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "ca", "lua vim.lsp.buf.code_action()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "e", "lua vim.diagnostic.open_float()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "[d", "lua vim.diagnostic.goto_prev()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "]d", "lua vim.diagnostic.goto_next()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "q", "lua vim.diagnostic.setloclist()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "so", [[lua require('telescope.builtin').lsp_document_symbols()]], opts) + vim.cmd([[ command! Format execute 'lua vim.lsp.buf.formatting()' ]]) + + -- lspsaga keymappings + vim.api.nvim_buf_set_keymap(bufnr, "n", "gr", "Lspsaga rename", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "gx", "Lspsaga code_action", opts) + vim.api.nvim_buf_set_keymap(bufnr, "x", "gx", ":Lspsaga range_code_action", opts) + -- map(bufnr, "n", "gd", "Lspsaga peek_definition", opts) + + vim.api.nvim_buf_set_keymap(bufnr, "n", "gf", "Lspsaga lsp_finder", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "K", "Lspsaga hover_doc", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "go", "Lspsaga show_line_diagnostics", opts) + -- use goto preview instead as below. + -- map(bufnr, "n", "gp", "Lspsaga preview_definition", opts) + -- map(bufnr, "n", "gs", "Lspsaga signature_help", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "gj", "Lspsaga diagnostic_jump_next", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "gk", "Lspsaga diagnostic_jump_prev", opts) + -- map(bufnr, "n", "", "lua require('lspsaga.action').smart_scroll_with_saga(-1, '')", opts) + -- map(bufnr, "n", "", "lua require('lspsaga.action').smart_scroll_with_saga(1, '')", opts) + -- goto preview keymappings + vim.api.nvim_buf_set_keymap(bufnr, "n", "gp", "lua require('goto-preview').goto_preview_definition()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "gpi", "lua require('goto-preview').goto_preview_implementation()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "gP", "lua require('goto-preview').close_all_win()", opts) + vim.api.nvim_buf_set_keymap(bufnr, "n", "gF", "lua require('goto-preview').goto_preview_references()", opts) +end +-- nvim-cmp supports additional completion capabilities +local capabilities = vim.lsp.protocol.make_client_capabilities() +capabilities = require("cmp_nvim_lsp").update_capabilities(capabilities) +capabilities.textDocument.foldingRange = { + dynamicRegistration = false, + lineFoldingOnly = true +} + +local lsp_flags = { + -- This is the default in Nvim 0.7+ + debounce_text_changes = 150, +} + +lspconfig.ccls.setup({ + on_attach = on_attach, + flags = lsp_flags, +}) + +lspconfig.clangd.setup({ + on_attach = on_attach, + flags = lsp_flags, +}) + +lspconfig.gopls.setup({ + on_attach = on_attach, + capabilities = capabilities, + root_dir = lspconfig.util.root_pattern('.git', 'go.mod'), + init_options = { + usePlaceholders = true, + completeUnimported = true, + }, +}) + +lspconfig.pyright.setup{ + on_attach = on_attach, + flags = lsp_flags, +} + +lspconfig.rust_analyzer.setup{ + on_attach = on_attach, + flags = lsp_flags, + settings = { + ["rust-analyzer"] = {} + } +} + +lspconfig.sumneko_lua.setup({ + on_attach = function(client, bufnr) + client.server_capabilities.document_formatting = false + client.server_capabilities.document_range_formatting = false + on_attach(client, bufnr) + end, + settings = settings, + flags = { + debounce_text_changes = 150, + }, + capabilities = capabilities, +}) \ No newline at end of file diff --git a/config/nvim/lua/neo/lspmason.lua b/config/nvim/lua/neo/lspmason.lua new file mode 100644 index 0000000..b33e830 --- /dev/null +++ b/config/nvim/lua/neo/lspmason.lua @@ -0,0 +1,34 @@ +local ok, mason = pcall(require, 'mason') +if not ok then + print('mason load error') + return +end + +local ok, installer = pcall(require, 'mason-lspconfig') +if not ok then + print('mason-lspconfig load error') + return +end + +local lspconfig = require('lspconfig') + +local servers = { + 'ccls', + 'clangd', + 'gopls', + 'jsonls', + 'sumneko_lua', + 'marksman', + 'pyright', + 'rust_analyzer', + 'sqls', + 'lemminx', +} + +mason.setup({ + install_root_dir = vim.fn.stdpath('config') .. '/mason', +}) + +installer.setup({ + ensure_installed = servers, +}) diff --git a/config/nvim/lua/neo/lspsaga.lua b/config/nvim/lua/neo/lspsaga.lua new file mode 100644 index 0000000..74152bb --- /dev/null +++ b/config/nvim/lua/neo/lspsaga.lua @@ -0,0 +1,203 @@ +local ok, saga = pcall(require, 'lspsaga') +if not ok then + print('lspsaga load error') + return +end + +saga.init_lsp_saga({ + -- Options with default value + -- "single" | "double" | "rounded" | "bold" | "plus" + border_style = "rounded", + --the range of 0 for fully opaque window (disabled) to 100 for fully + --transparent background. Values between 0-30 are typically most useful. + saga_winblend = 0, + -- when cursor in saga window you config these to move + move_in_saga = { prev = "", next = "" }, + -- Error, Warn, Info, Hint + -- use emoji like + -- { "🙀", "😿", "😾", "😺" } + -- or + -- { "😡", "😥", "😤", "😐" } + -- and diagnostic_header can be a function type + -- must return a string and when diagnostic_header + -- is function type it will have a param `entry` + -- entry is a table type has these filed + -- { bufnr, code, col, end_col, end_lnum, lnum, message, severity, source } + diagnostic_header = { " ", " ", " ", "ﴞ " }, + -- preview lines of lsp_finder and definition preview + max_preview_lines = 10, + -- use emoji lightbulb in default + code_action_icon = "💡", + -- if true can press number to execute the codeaction in codeaction window + code_action_num_shortcut = true, + -- same as nvim-lightbulb but async + code_action_lightbulb = { + enable = true, + enable_in_insert = false, + cache_code_action = true, + sign = true, + update_time = 150, + sign_priority = 20, + virtual_text = false, + }, + -- finder icons + finder_icons = { + def = " ", + ref = "諭 ", + link = " ", + }, + -- finder do lsp request timeout + -- if your project big enough or your server very slow + -- you may need to increase this value + finder_request_timeout = 1500, + -- set antoher colorscheme in preview window + -- finder_preview_hl_ns = 0, + finder_action_keys = { + open = "o", + vsplit = "v", + split = "s", + tabe = "t", + quit = "q", + }, + code_action_keys = { + quit = "q", + exec = "", + }, + definition_action_keys = { + edit = "o", + vsplit = "v", + split = "i", + tabe = "t", + quit = "q", + }, + rename_action_quit = "", + rename_in_select = true, + -- show symbols in winbar must nightly + symbol_in_winbar = { + in_custom = false, + enable = false, + separator = " ", + show_file = true, + click_support = false, + }, + -- show outline + show_outline = { + win_position = "right", + --set special filetype win that outline window split.like NvimTree neotree + -- defx, db_ui + win_with = "", + win_width = 30, + auto_enter = true, + auto_preview = true, + virt_text = "┃", + jump_key = "o", + -- auto refresh when change buffer + auto_refresh = true, + }, + -- custom lsp kind + -- usage { Field = 'color code'} or {Field = {your icon, your color code}} + custom_kind = {}, + -- if you don't use nvim-lspconfig you must pass your server name and + -- the related filetypes into this table + -- like server_filetype_map = { metals = { "sbt", "scala" } } + server_filetype_map = {}, +}) + +saga.init_lsp_saga({ + -- Options with default value + -- "single" | "double" | "rounded" | "bold" | "plus" + border_style = "rounded", + --the range of 0 for fully opaque window (disabled) to 100 for fully + --transparent background. Values between 0-30 are typically most useful. + saga_winblend = 0, + -- when cursor in saga window you config these to move + move_in_saga = { prev = "", next = "" }, + -- Error, Warn, Info, Hint + -- use emoji like + -- { "🙀", "😿", "😾", "😺" } + -- or + -- { "😡", "😥", "😤", "😐" } + -- and diagnostic_header can be a function type + -- must return a string and when diagnostic_header + -- is function type it will have a param `entry` + -- entry is a table type has these filed + -- { bufnr, code, col, end_col, end_lnum, lnum, message, severity, source } + diagnostic_header = { " ", " ", " ", "ﴞ " }, + -- preview lines of lsp_finder and definition preview + max_preview_lines = 10, + -- use emoji lightbulb in default + code_action_icon = "💡", + -- if true can press number to execute the codeaction in codeaction window + code_action_num_shortcut = true, + -- same as nvim-lightbulb but async + code_action_lightbulb = { + enable = true, + enable_in_insert = false, + cache_code_action = true, + sign = true, + update_time = 150, + sign_priority = 20, + virtual_text = false, + }, + -- finder icons + finder_icons = { + def = " ", + ref = "諭 ", + link = " ", + }, + -- finder do lsp request timeout + -- if your project big enough or your server very slow + -- you may need to increase this value + finder_request_timeout = 1500, + -- set antoher colorscheme in preview window + -- finder_preview_hl_ns = 0, + finder_action_keys = { + open = "o", + vsplit = "v", + split = "s", + tabe = "t", + quit = "q", + }, + code_action_keys = { + quit = "q", + exec = "", + }, + definition_action_keys = { + edit = "o", + vsplit = "v", + split = "i", + tabe = "t", + quit = "q", + }, + rename_action_quit = "", + rename_in_select = true, + -- show symbols in winbar must nightly + symbol_in_winbar = { + in_custom = false, + enable = false, + separator = " ", + show_file = true, + click_support = false, + }, + -- show outline + show_outline = { + win_position = "right", + --set special filetype win that outline window split.like NvimTree neotree + -- defx, db_ui + win_with = "", + win_width = 30, + auto_enter = true, + auto_preview = true, + virt_text = "┃", + jump_key = "o", + -- auto refresh when change buffer + auto_refresh = true, + }, + -- custom lsp kind + -- usage { Field = 'color code'} or {Field = {your icon, your color code}} + custom_kind = {}, + -- if you don't use nvim-lspconfig you must pass your server name and + -- the related filetypes into this table + -- like server_filetype_map = { metals = { "sbt", "scala" } } + server_filetype_map = {}, +}) \ No newline at end of file diff --git a/config/nvim/lua/neo/lualine.lua b/config/nvim/lua/neo/lualine.lua new file mode 100644 index 0000000..46a4996 --- /dev/null +++ b/config/nvim/lua/neo/lualine.lua @@ -0,0 +1,50 @@ +local ok, lualine = pcall(require, 'lualine') +if not ok then + print('lualine load error') + return +end + +lualine.setup { + options = { + icons_enabled = true, + theme = 'solarized_dark', + component_separators = { left = '', right = ''}, + section_separators = { left = '', right = ''}, + disabled_filetypes = { + statusline = {}, + winbar = {}, + }, + -- disabled_filetypes = { "alpha", "dashboard", "NvimTree", "Outline" }, + ignore_focus = {}, + always_divide_middle = true, + globalstatus = false, + refresh = { + statusline = 1000, + tabline = 1000, + winbar = 1000, + } + }, + + sections = { + lualine_a = {'mode'}, + lualine_b = {'branch', 'diff', 'diagnostics'}, + lualine_c = {'filename'}, + lualine_x = {'encoding', 'fileformat', 'filetype'}, + lualine_y = {'progress'}, + lualine_z = {'location'} + }, + + inactive_sections = { + lualine_a = {}, + lualine_b = {}, + lualine_c = {'filename'}, + lualine_x = {'location'}, + lualine_y = {}, + lualine_z = {} + }, + + -- tabline = {}, + winbar = {}, + inactive_winbar = {}, + extensions = {} +} \ No newline at end of file diff --git a/config/nvim/lua/neo/markdown.lua b/config/nvim/lua/neo/markdown.lua new file mode 100644 index 0000000..95c4794 --- /dev/null +++ b/config/nvim/lua/neo/markdown.lua @@ -0,0 +1,21 @@ +-- vim-table-mode configs +vim.g.table_mode_corner = '|' +vim.cmd([[ +function! s:isAtStartOfLine(mapping) + let text_before_cursor = getline('.')[0 : col('.')-1] + let mapping_pattern = '\V' . escape(a:mapping, '\') + let comment_pattern = '\V' . escape(substitute(&l:commentstring, '%s.*$', '', ''), '\') + return (text_before_cursor =~? '^' . ('\v(' . comment_pattern . '\v)?') . '\s*\v' . mapping_pattern . '\v$') +endfunction + +inoreabbrev + \ isAtStartOfLine('\|\|') ? + \ ':TableModeEnable' : '' +inoreabbrev __ + \ isAtStartOfLine('__') ? + \ ':silent! TableModeDisable' : '__' +]]) + +local default_opts = {noremap = true, silent = true} +vim.api.nvim_set_keymap('x', 'ga', '(EasyAlign)', default_opts) +vim.api.nvim_set_keymap('n', 'ga', '(EasyAlign)', default_opts) diff --git a/config/nvim/lua/neo/nvimtree.lua b/config/nvim/lua/neo/nvimtree.lua new file mode 100644 index 0000000..c9771d8 --- /dev/null +++ b/config/nvim/lua/neo/nvimtree.lua @@ -0,0 +1,45 @@ +local ok, tree = pcall(require, 'nvim-tree') +if not ok then + print('nvim-tree load error') + return +end + +vim.g.loaded = 1 +vim.g.loaded_netrwPlugin = 1 + +tree.setup({ + sort_by = "case_sensitive", + + view = { + adaptive_size = true, + mappings = { + list = { + { key = "u", action = "dir_up" }, + { key = "v", action = "vsplit" }, + { key = "s", action = "split" }, + }, + }, + }, + + renderer = { + group_empty = true, + }, + + filters = { + dotfiles = true, + }, +}) + +vim.api.nvim_set_keymap('n', 't', ':NvimTreeToggle', {noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'l', ':NvimTreeFindFile', {noremap = true, silent = true}) + +vim.cmd([[autocmd StdinReadPre * let s:std_in=1]]) +-- vim.cmd([[autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NvimTreeOpen' argv()[0] | wincmd p | ene | endif]]) + +-- try to close nvim when only NvimTree is open +vim.cmd([[autocmd BufEnter * if (winnr("$") == 1 && bufname('%') =~ 'NvimTree_\d') | q | endif]]) +-- If another buffer tries to replace NvimTree, put it in the other window, and bring back NvimTree. +vim.cmd([[autocmd BufEnter * if bufname('#') =~ 'NvimTree_\d\+' && bufname('%') !~ 'NERD_tree_\d\+' && winnr('$') > 1 | let buf=bufnr() | buffer# | execute "normal! \w" | execute 'buffer'.buf | endif]]) + +vim.cmd([[autocmd FileType NvimTree set laststatus=0 showtabline=0 | autocmd BufLeave set laststatus=2 showtabline=2]]) + diff --git a/config/nvim/lua/neo/option.lua b/config/nvim/lua/neo/option.lua new file mode 100644 index 0000000..fda24d5 --- /dev/null +++ b/config/nvim/lua/neo/option.lua @@ -0,0 +1,101 @@ +local options = { + termguicolors = true, + ruler = true, + background = "dark", + number = true, + relativenumber = true, + showcmd = true, + cursorline = true, + shortmess = "atI", + incsearch = true, + hlsearch = true, + winminheight = 0, + ignorecase = true, + smartcase = true, + wildmenu = true, + wildmode = "list:longest,full", + scrolljump = 5, + scrolloff = 3, + foldenable = true, + gdefault = true, + + encoding = "utf-8", + fileencoding = "utf-8", + fileencodings = "utf-8,usc-bom,euc-jp,gb18030,gbk,gb2312,cp936", + + expandtab = true, + autoindent = true, + fileformat = "unix", + + tabstop = 4, + softtabstop = 4, + shiftwidth = 4, + + foldmethod = indent, + textwidth = 120 +} + +for k, v in pairs(options) do + vim.opt[k] = v +end + +vim.g.mapleader = ',' +vim.g.solarized_termcolors = 256 + +vim.cmd([[syntax on]]) +vim.cmd("set whichwrap=b,s,h,l,<,>,[,]") +vim.cmd([[set clipboard+=unnamedplus]]) +-- set global config var +-- vim.api.nvim_set_var('solarized_termcolors', 256) + +vim.api.nvim_create_autocmd({"BufNewFile", "BufRead"}, { + pattern = { "*.yaml", "*.yml", "*.json", "*.ps1", "*.lua", }, + command = [[set tabstop=2 softtabstop=2 shiftwidth=2]] +}) + +vim.api.nvim_create_autocmd("FileType", { + pattern = { "vim", "vimrc", }, + command = [[set tabstop=2 softtabstop=2 shiftwidth=2]] +}) + +vim.api.nvim_create_autocmd({"FileType"}, { + pattern = {"gitconfig"}, + command = [[set tabstop=4 softtabstop=4 shiftwidth=4]] +}) + +vim.api.nvim_create_autocmd({"BufNewFile", "BufRead"}, { + pattern = { "*.py" }, + command = [[set tabstop=4 softtabstop=4 shiftwidth=4]] +}) + +vim.cmd("nnoremap ; :") +-- vim.api.nvim_set_keymap('n', ';', ':', { +-- silent = true, +-- noremap = true +-- }) +-- vim.keymap.set('n', ';', ':', {noremap = true, silent = true}) + +vim.api.nvim_set_keymap('i', 'HH', '', { + silent = true, + noremap = true +}) + +vim.api.nvim_set_keymap('i', 'LL', '', { + silent = true, + noremap = true +}) + +-- autocmd BufWinEnter quickfix nnoremap +-- \ q :cclose:lclose +-- autocmd BufEnter * if (winnr('$') == 1 && &buftype ==# 'quickfix' ) | +-- \ bd| +-- \ q | endif +vim.api.nvim_create_autocmd("BufWinEnter", { + pattern = {"quickfix"}, + command = [[nnoremap q :cclose:lclose]] +}) + +vim.api.nvim_create_autocmd("BufEnter", { + pattern = {"*"}, + command = [[if (winnr('$') == 1 && &buftype ==# 'quickfix') | bd | q | endif]] +}) diff --git a/config/nvim/lua/neo/pkg.lua b/config/nvim/lua/neo/pkg.lua new file mode 100644 index 0000000..cf416bc --- /dev/null +++ b/config/nvim/lua/neo/pkg.lua @@ -0,0 +1,265 @@ +-- stdpath('config') returns $HOME/.config/nvim +-- NOTE: strange rules for neovim `packadd` method, only paths match 'pack/*/start/{dirname}' or 'pack/*/opt/{dirname}' can be added +-- local packer_install_dir = '~/.config/nvim/pack/packer/start/packer.nvim' + +local config_path = vim.fn.stdpath('config') +local packer_install_path = config_path .. '/pack/packer/start/packer.nvim' +local packer_pkg_root = config_path .. '/pack' +local packer_compile = config_path .. '/pack/packer_complied.lua' +local packer_cache = vim.fn.stdpath('cache') .. '/packer.nvim' + +local packer_conf = { + ensure_dependencies = true, -- Should packer install plugin dependencies? + snapshot = nil, -- Name of the snapshot you would like to load at startup + snapshot_path = packer_cache, -- Default save directory for snapshots + package_root = packer_pkg_root, + compile_path = packer_compile, + plugin_package = 'packer', -- The default package for plugins + max_jobs = nil, -- Limit the number of simultaneous jobs. nil means no limit + auto_clean = true, -- During sync(), remove unused plugins + compile_on_sync = true, -- During sync(), run packer.compile() + disable_commands = false, -- Disable creating commands + opt_default = false, -- Default to using opt (as opposed to start) plugins + transitive_opt = true, -- Make dependencies of opt plugins also opt by default + transitive_disable = true, -- Automatically disable dependencies of disabled plugins + auto_reload_compiled = true, -- Automatically reload the compiled file after creating it. + preview_updates = false, -- If true, always preview updates before choosing which plugins to update, same as `PackerUpdate --preview`. + git = { + cmd = 'git', -- The base command for git operations + subcommands = { -- Format strings for git subcommands + update = 'pull --ff-only --progress --rebase=false', + install = 'clone --depth %i --no-single-branch --progress', + fetch = 'fetch --depth 999999 --progress', + checkout = 'checkout %s --', + update_branch = 'merge --ff-only @{u}', + current_branch = 'branch --show-current', + diff = 'log --color=never --pretty=format:FMT --no-show-signature HEAD@{1}...HEAD', + diff_fmt = '%%h %%s (%%cr)', + get_rev = 'rev-parse --short HEAD', + get_msg = 'log --color=never --pretty=format:FMT --no-show-signature HEAD -n 1', + submodules = 'submodule update --init --recursive --progress' + }, + depth = 1, -- Git clone depth + clone_timeout = 600, -- Timeout, in seconds, for git clones + -- default_url_format = 'https://github.com/%s', -- Lua format string used for "aaa/bbb" style plugins + -- default_url_format = 'git@gitee.com:%s.git', + -- default_url_format = 'https://gitcode.net/%s', + default_url_format = '%s.git', + }, + + display = { + open_fn = function() + return require("packer.util").float({ border = "rounded" }) + end, + }, + + luarocks = { + python_cmd = 'python' -- Set the python command to use for running hererocks + }, + + log = { level = 'warn' }, -- The default print log level. One of: "trace", "debug", "info", "warn", "error", "fatal". + + profile = { + enable = false, + threshold = 1, -- integer in milliseconds, plugins which load faster than this won't be shown in profile output + }, + + autoremove = false, -- Remove disabled or unused plugins without prompting the user +} + +local ensure_packer = function() + if vim.fn.empty(vim.fn.glob(packer_install_path)) > 0 then + vim.fn.system({'git', 'clone', '--depth', '1', 'https://gitcode.net/nvim-packer/packer.nvim', packer_install_path}) + vim.cmd('packadd packer.nvim') + return true + end + return false +end + +local packer_bootstrap = ensure_packer() + +vim.cmd([[ + augroup packer_user_config + autocmd! + autocmd BufWritePost pkg.lua source | PackerSync + augroup end +]]) + +local ok, packer = pcall(require, 'packer') +if not ok then + print('packer loaded error') + return +end + +packer.init(packer_conf) + +return packer.startup(function(use) + use({ + 'https://gitcode.net/nvim-packer/packer.nvim', + }) + + use({ + 'https://gitcode.net/nvim-packer/plenary.nvim', + }) + + use({ + 'https://gitcode.net/nvim-packer/nvim-web-devicons' + }) + + use({ + 'https://gitcode.net/nvim-packer/telescope.nvim', + requires = { {'https://gitcode.net/nvim-packer/plenary.nvim'} }, + }) + + use({ + 'https://gitcode.net/nvim-packer/project.nvim', + }) + + use({ + 'https://gitcode.net/nvim-packer/indent-blankline.nvim', + }) + + use({ + 'https://gitcode.net/nvim-packer/alpha-nvim', + requires = { {'https://gitcode.net/nvim-packer/nvim-web-devicons'} }, + }) + + + use({ + 'https://gitcode.net/nvim-packer/nvim-lspconfig', + }) + + use({ + 'https://gitcode.net/nvim-packer/mason.nvim', + }) + + use({ + 'https://gitcode.net/nvim-packer/mason-lspconfig.nvim', + }) + + use({ + 'https://gitcode.net/nvim-packer/lspsaga.nvim', + branch = 'main', + }) + + use({ + 'https://gitcode.net/nvim-packer/lualine.nvim', + }) + + use({ + 'https://gitcode.net/nvim-packer/bufferline.nvim', + }) + + use({ + 'https://gitcode.net/nvim-packer/nvim-tree.lua', + }) + + use({ + 'https://gitcode.net/nvim-packer/nvim-treesitter', + }) + + use({ + 'https://gitcode.net/nvim-packer/trouble.nvim', + requires = { {'https://gitcode.net/nvim-packer/nvim-web-devicons'} }, + }) + + use({ + 'https://gitcode.net/nvim-packer/hop.nvim', + }) + + use({ + 'https://gitcode.net/nvim-packer/nvim-solarized-lua', + }) + + use({ + 'https://gitcode.net/nvim-packer/go.nvim', + }) + + use({ + 'https://gitcode.net/nvim-packer/rust-tools.nvim', + ft = 'rust', + config = function() + require('rust-tools').setup({ + }) + end, + }) + + use({ + 'https://gitcode.net/nvim-packer/nvim-ts-rainbow', + requires = { {'https://gitcode.net/nvim-packer/nvim-treesitter'} }, + }) + + use({ + 'https://gitcode.net/nvim-packer/nvim-surround', + config = function() + require('nvim-surround').setup({ + }) + end + }) + + use({ + 'https://gitcode.net/nvim-packer/nvim-autopairs', + config = function() + require("nvim-autopairs").setup({ + }) + end + }) + + use({ + 'https://gitcode.net/nvim-packer/git-blame.nvim', + -- config = function() + -- require('gitblame').setup({ + -- }) + -- end + }) + + use({ + 'https://gitcode.net/nvim-packer/gitsigns.nvim', + tag = 'release', + config = function() + require('gitsigns').setup() + end + }) + + use({ "https://gitcode.net/nvim-packer/nvim-cmp", }) -- The completion plugin + use({ "https://gitcode.net/nvim-packer/cmp-buffer",}) -- buffer completions + use({ "https://gitcode.net/nvim-packer/cmp-path", }) -- path completions + use({ "https://gitcode.net/nvim-packer/cmp_luasnip", }) -- snippet completions + use({ "https://gitcode.net/nvim-packer/cmp-nvim-lsp", }) + use({ "https://gitcode.net/nvim-packer/cmp-nvim-lua", }) + + use({ + 'https://gitcode.net/nvim-packer/Comment.nvim', + }) + + -- snippets + use({ + 'https://gitcode.net/nvim-packer/LuaSnip', + tag = "v1.*", + }) + + use({ + 'https://gitcode.net/nvim-packer/friendly-snippets', + }) + + -- use({ + -- 'https://gitcode.net/vim-plug/ale', + -- }) + + use({ + 'https://gitcode.net/vim-plug/vim-easy-align', + }) + + use({ + 'https://gitcode.net/vim-plug/vim-virtualenv', + }) + + + use({ + 'https://gitcode.net/vim-plug/vim-table-mode', + }) + + if packer_bootstrap then + require('packer').sync() + end + end) diff --git a/config/nvim/lua/neo/python.lua b/config/nvim/lua/neo/python.lua new file mode 100644 index 0000000..8993560 --- /dev/null +++ b/config/nvim/lua/neo/python.lua @@ -0,0 +1,31 @@ +-- vim.cmd [[ +-- " Remember to execute /usr/local/bin/python3 -m pip install neovim +local possible_pythons = {'/usr/local/bin/python3', '/usr/bin/python3', '/opt/homebrew/bin/python3'} +for i, v in pairs(possible_pythons) do + if vim.fn.filereadable(v) == 1 then + vim.api.nvim_set_var('python3_host_prog', v) + break + end +end + +vim.api.nvim_set_var('python_highlight_all', 1) + +-- pymode settings +-- vim.g.pymode = 1 +-- vim.g.pymode_trim_whitespaces = 1 +-- vim.g.pymode_options_max_line_length = 120 +-- vim.g.pymode_lint_options_pep8 = {max_line_length = vim.g.pymode_options_max_line_length} +-- +-- vim.g.pymode_rope = 1 +-- vim.g.pymode_rope_refix = '' +-- vim.g.pymode_lint_cwindow = 0 +-- +-- -- set completeopt=menuone,noinsert +-- vim.api.nvim_set_var('completeopt', {'menuone', 'noinsert'}) +-- vim.g.pymode_rope_completion = 1 +-- vim.g.pymode_rope_complete_on_dot = 1 +-- vim.g.pymode_rope_autoimport_modules = {'os', 'shutil', 'datetime'} +-- +-- -- Find definition +-- vim.g.pymode_rope_goto_definition_bind = 'g' +-- vim.g.pymode_rope_goto_definition_cmd = 'new' diff --git a/config/nvim/lua/neo/telescope.lua b/config/nvim/lua/neo/telescope.lua new file mode 100644 index 0000000..34a16f0 --- /dev/null +++ b/config/nvim/lua/neo/telescope.lua @@ -0,0 +1,65 @@ +local status_ok, project = pcall(require, "project_nvim") +if not status_ok then + print('project load error') + return +end + +-- The problem of load telescope fails is duplicate name +-- put your config into a sub dir solves this problem +local tele_ok, telescope = pcall(require, "telescope") +if not tele_ok then + print('telescope load error') + return +end + +vim.api.nvim_set_keymap('n', 'ff', ':Telescope find_files', {noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'fb', ':Telescope buffers', {noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'rg', ':Telescope live_grep', {noremap = true, silent = true}) +vim.api.nvim_set_keymap('n', 'fh', ':Telescope help_tags', {noremap = true, silent = true}) + +project.setup({ + sync_root_with_cwd = true, + respect_buf_cwd = true, + update_focused_file = { + enable = true, + update_root = true + }, + + -- @usage set to false to disable project.nvim. + -- This is on by default since it's currently the expected behavior. + active = true, + + on_config_done = nil, + + -- @usage set to true to disable setting the current-woriking directory + -- Manual mode doesn't automatically change your root directory, so you have + -- the option to manually do so using `:ProjectRoot` command. + manual_mode = false, + + -- @usage Methods of detecting the root directory + -- Allowed values: **"lsp"** uses the native neovim lsp + --- **"pattern"** uses vim-rooter like glob pattern matching. Here + -- order matters: if one is not detected, the other is used as fallback. You + -- can also delete or rearangne the detection methods. + -- detection_methods = { "lsp", "pattern" }, -- NOTE: lsp detection will get annoying with multiple langs in one project + detection_methods = { "pattern" }, + + -- @usage patterns used to detect root dir, when **"pattern"** is in detection_methods + patterns = { ".git", "_darcs", ".hg", ".bzr", ".svn", "Makefile", "package.json", "README", "src", "pkg" }, + + -- @ Show hidden files in telescope when searching for files in a project + show_hidden = false, + + -- @usage When set to false, you will get a message when project.nvim changes your directory. + -- When set to false, you will get a message when project.nvim changes your directory. + silent_chdir = true, + + -- @usage list of lsp client names to ignore when using **lsp** detection. eg: { "efm", ... } + ignore_lsp = {}, + + -- @type string + -- @usage path to store the project history for use in telescope + datapath = vim.fn.stdpath("config"), +}) + +telescope.load_extension('projects') diff --git a/config/nvim/lua/neo/theme.lua b/config/nvim/lua/neo/theme.lua new file mode 100644 index 0000000..a3ca70c --- /dev/null +++ b/config/nvim/lua/neo/theme.lua @@ -0,0 +1,46 @@ +-- use NeoSolarized +vim.cmd [[colorscheme solarized]] +-- airline settings. +vim.g.airline_theme = 'solarized' +vim.g.airline_solarized_bg = 'dark' +vim.g.airline_powerline_fonts = 1 + +vim.cmd [[ +if !exists('g:airline_symbols') + let g:airline_symbols = {} +endif +]] + +-- TODO: fix +-- if not vim.fn.exists('g:airline_symbols') then +-- vim.g.airline_symbols = {} +-- endif + +vim.g.airline_left_sep = '' +vim.g.airline_left_alt_sep = '' +vim.g.airline_right_sep = '' +vim.g.airline_right_alt_sep = '' +vim.g.airline_symbols.branch = '' +vim.g.airline_symbols.readonly = '' +vim.g.airline_symbols.linenr = '␊' +vim.g.airline_symbols.maxlinenr = '㏑' + +-- show absolute file path in status line +vim.api.nvim_set_var('airline_section_c', '%<%F%m %#__accent_red#%{airline#util#wrap(airline#parts#readonly(),0)}%#__restore__#') +-- show tab number in tab line +vim.api.nvim_set_var('airline#extensions#tabline#enabled', 1) +vim.api.nvim_set_var('airline#extensions#tabline#tab_nr_type', 1) +vim.api.nvim_set_var('airline#extensions#tabline#formatter', 'default') +vim.api.nvim_set_var('airline#extensions#tabline#left_sep', '') +vim.api.nvim_set_var('airline#extensions#tabline#left_alt_sep', '') +vim.api.nvim_set_var('airline#extensions#tabline#right_sep', '') +vim.api.nvim_set_var('airline#extensions#tabline#right_alt_sep', '') +vim.api.nvim_set_var('airline#extensions#bufferline#enabled', 1) + +-- rainbow +vim.g.rainbow_active = 1 +vim.g.rainbow_conf = { + separately = { + nerdtree = 0 + } +} \ No newline at end of file diff --git a/config/nvim/lua/neo/treesitter.lua b/config/nvim/lua/neo/treesitter.lua new file mode 100644 index 0000000..01cf9e6 --- /dev/null +++ b/config/nvim/lua/neo/treesitter.lua @@ -0,0 +1,49 @@ +local status_ok, configs = pcall(require, "nvim-treesitter.configs") +if not status_ok then + return +end + +configs.setup({ + -- one of "all" or a list of languages + ensure_installed = { + 'bash', + 'c', + 'cpp', + 'dockerfile', + 'gitignore', + 'java', + 'javascript', + 'json', + 'json5', + 'python', + 'rust', + 'toml', + 'go', + 'gomod', + 'lua', + 'vim', + 'sql', + 'yaml', + }, + + ignore_install = {}, -- List of parsers to ignore installing + highlight = { + enable = true, -- false will disable the whole extension + disable = {}, -- list of language that will be disabled + }, + + autopairs = { + enable = true, + }, + + rainbow = { + enable = true, + -- disable = { "jsx", "cpp" }, list of languages you want to disable the plugin for + extended_mode = true, -- Also highlight non-bracket delimiters like html tags, boolean or table: lang -> boolean + max_file_lines = 100000, -- Do not enable for files with more than n lines, int + -- colors = {}, -- table of hex strings + -- termcolors = {} -- table of colour name strings + }, + + indent = { enable = true, disable = { "python", "css" } }, +}) diff --git a/config/nvim/lua/neo/trouble.lua b/config/nvim/lua/neo/trouble.lua new file mode 100644 index 0000000..5df2c53 --- /dev/null +++ b/config/nvim/lua/neo/trouble.lua @@ -0,0 +1,6 @@ +local ok, trouble = pcall(require, 'trouble') +if not ok then + print('trouble load error') +end + +trouble.setup() \ No newline at end of file diff --git a/config/os/linux/backup.md b/config/os/linux/backup.md new file mode 100644 index 0000000..fe00242 --- /dev/null +++ b/config/os/linux/backup.md @@ -0,0 +1,15 @@ +# Backup and Restore Linux System + +## Backup + +```bash +sudo tar cvpzf /run/media/ezio/Scopinok/bak/manjaro/snapshot-20190616.tgz / --exclude=/proc --exclude=/lost+found --exclude=/tmp --exclude=/sys --exclude=/media --exclude=/home --exclude=/mnt --warning=no-file-change +``` + +## Restore + +Be aware that files aleady exist in path `/` will not be removed. + +```bash +sudo tar xvpzf backup.tgz -C / +``` diff --git a/config/os/linux/change_dirnames.sh b/config/os/linux/change_dirnames.sh new file mode 100644 index 0000000..d96865d --- /dev/null +++ b/config/os/linux/change_dirnames.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +desktop="$HOME/Desktop" +mkdir $desktop +downloads="$HOME/Downloads" +mkdir $downloads +templates="$HOME/Templates" +mkdir $templates +public="$HOME/Public" +mkdir $public +documents="$HOME/Documents" +mkdir $documents +music="$HOME/Music" +mkdir $music +pics="$HOME/Pictures" +mkdir $pics +videos="$HOME/Videos" +mkdir $videos + +echo 'backup old user-dirs' +dir=$HOME/.config/user-dirs.dirs +mv $HOME/.config/user-dirs.dirs $HOME/.config/user-dirs.bak + +echo 'generating new user-dirs' +echo "XDG_DESKTOP_DIR=$desktop" >>$dir +echo "XDG_DOWNLOAD_DIR=$downloads" >>$dir +echo "XDG_TEMPLATES_DIR=$templates" >>$dir +echo "XDG_PUBLICSHARE_DIR=$public" >>$dir +echo "XDG_DOCUMENTS_DIR=$documents" >>$dir +echo "XDG_MUSIC_DIR=$music" >>$dir +echo "XDG_PICTURES_DIR=$pics" >>$dir +echo "XDG_VIDEOS_DIR=$videos" >>$dir diff --git a/config/os/linux/home.bash b/config/os/linux/home.bash new file mode 100644 index 0000000..378e4d3 --- /dev/null +++ b/config/os/linux/home.bash @@ -0,0 +1,140 @@ +# +# ~/.bashrc +# + +[[ $- != *i* ]] && return + +colors() { + local fgc bgc vals seq0 + + printf "Color escapes are %s\n" '\e[${value};...;${value}m' + printf "Values 30..37 are \e[33mforeground colors\e[m\n" + printf "Values 40..47 are \e[43mbackground colors\e[m\n" + printf "Value 1 gives a \e[1mbold-faced look\e[m\n\n" + + # foreground colors + for fgc in {30..37}; do + # background colors + for bgc in {40..47}; do + fgc=${fgc#37} # white + bgc=${bgc#40} # black + + vals="${fgc:+$fgc;}${bgc}" + vals=${vals%%;} + + seq0="${vals:+\e[${vals}m}" + printf " %-9s" "${seq0:-(default)}" + printf " ${seq0}TEXT\e[m" + printf " \e[${vals:+${vals+$vals;}}1mBOLD\e[m" + done + echo; echo + done +} + +[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion + +# Change the window title of X terminals +case ${TERM} in + xterm*|rxvt*|Eterm*|aterm|kterm|gnome*|interix|konsole*) + PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/\~}\007"' + ;; + screen*) + PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/\~}\033\\"' + ;; +esac + +use_color=true + +# Set colorful PS1 only on colorful terminals. +# dircolors --print-database uses its own built-in database +# instead of using /etc/DIR_COLORS. Try to use the external file +# first to take advantage of user additions. Use internal bash +# globbing instead of external grep binary. +safe_term=${TERM//[^[:alnum:]]/?} # sanitize TERM +match_lhs="" +[[ -f ~/.dir_colors ]] && match_lhs="${match_lhs}$(<~/.dir_colors)" +[[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(/dev/null \ + && match_lhs=$(dircolors --print-database) +[[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color=true + +if ${use_color} ; then + # Enable colors for ls, etc. Prefer ~/.dir_colors #64489 + if type -P dircolors >/dev/null ; then + if [[ -f ~/.dir_colors ]] ; then + eval $(dircolors -b ~/.dir_colors) + elif [[ -f /etc/DIR_COLORS ]] ; then + eval $(dircolors -b /etc/DIR_COLORS) + fi + fi + + if [[ ${EUID} == 0 ]] ; then + PS1='\[\033[01;31m\][\h\[\033[01;36m\] \W\[\033[01;31m\]]\$\[\033[00m\] ' + else + PS1='\[\033[01;32m\][\u@\h\[\033[01;37m\] \W\[\033[01;32m\]]\$\[\033[00m\] ' + fi + + alias ls='ls --color=auto' + alias grep='grep --colour=auto' + alias egrep='grep -E --colour=auto' + alias fgrep='fgrep --colour=auto' +else + if [[ ${EUID} == 0 ]] ; then + # show root@ when we don't have colors + PS1='\u@\h \W \$ ' + else + PS1='\u@\h \w \$ ' + fi +fi + +unset use_color safe_term match_lhs sh + +alias cp="cp -i" # confirm before overwriting something +alias df='df -h' # human-readable sizes +alias free='free -m' # show sizes in MB +alias np='nano -w PKGBUILD' +alias more=less + +xhost +local:root > /dev/null 2>&1 + +complete -cf sudo + +# Bash won't get SIGWINCH if another process is in the foreground. +# Enable checkwinsize so that bash will check the terminal size when +# it regains control. #65623 +# http://cnswww.cns.cwru.edu/~chet/bash/FAQ (E11) +shopt -s checkwinsize + +shopt -s expand_aliases + +# export QT_SELECT=4 + +# Enable history appending instead of overwriting. #139609 +shopt -s histappend + +# +# # ex - archive extractor +# # usage: ex +ex () +{ + if [ -f $1 ] ; then + case $1 in + *.tar.bz2) tar xjf $1 ;; + *.tar.gz) tar xzf $1 ;; + *.bz2) bunzip2 $1 ;; + *.rar) unrar x $1 ;; + *.gz) gunzip $1 ;; + *.tar) tar xf $1 ;; + *.tbz2) tar xjf $1 ;; + *.tgz) tar xzf $1 ;; + *.zip) unzip $1 ;; + *.Z) uncompress $1;; + *.7z) 7z x $1 ;; + *) echo "'$1' cannot be extracted via ex()" ;; + esac + else + echo "'$1' is not a valid file" + fi +} +. "$HOME/.cargo/env" diff --git a/config/os/linux/init.bash b/config/os/linux/init.bash new file mode 100644 index 0000000..120e0f0 --- /dev/null +++ b/config/os/linux/init.bash @@ -0,0 +1,210 @@ +# +# ~/.bashrc +# + +# If not running interactively, don't do anything +[[ $- != *i* ]] && return + +# PS1='[\u@\h \W]\$ ' + +PS1="\[$(tput bold)\]\[$(tput setaf 6)\]\t \[$(tput setaf 2)\][\[$(tput setaf 3)\]\u\[$(tput setaf 1)\]@\[$(tput setaf 3)\]\h \[$(tput setaf 6)\]\w\[$(tput setaf 2)\]]\[$(tput setaf 4)\]\\$ \[$(tput sgr0)\]" + +# git function +function __git_prompt_git() { + GIT_OPTIONAL_LOCKS=0 command git "$@" +} + +function git_main_branch() { + if [[ -n "$(git branch --list main)" ]]; then + echo main + else + echo master + fi +} + +function git_current_branch() { + local ref + ref=$(__git_prompt_git symbolic-ref --quiet HEAD 2>/dev/null) + local ret=$? + if [[ $ret != 0 ]]; then + [[ $ret == 128 ]] && return # no git repo. + ref=$(__git_prompt_git rev-parse --short HEAD 2>/dev/null) || return + fi + echo ${ref#refs/heads/} +} + +function git_info() { + info=$(git --no-optional-locks status --porcelain=2 --branch --show-stash 2>/dev/null) + local ret=$? + if [[ $ret != 0 ]]; then + return + fi + echo $info +} + +alias ls='ls --color=auto' +alias la='ls --color=auto -alh' +alias md='mkdir -p' +alias diff='diff --color' +alias grep='grep --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,.tox}' + +# git alias +alias g=git +alias ga='git add' +alias gaa='git add --all' +alias gam='git am' +alias gama='git am --abort' +alias gamc='git am --continue' +alias gams='git am --skip' +alias gamscp='git am --show-current-patch' +alias gap='git apply' +alias gapa='git add --patch' +alias gapt='git apply --3way' +alias gau='git add --update' +alias gav='git add --verbose' +alias gb='git branch' +alias gbD='git branch -D' +alias gba='git branch -a' +alias gbd='git branch -d' +alias gbda='git branch --no-color --merged | command grep -vE "^(\+|\*|\s*($(git_main_branch)|development|develop|devel|dev)\s*$)" | command xargs -n 1 git branch -d' +alias gbl='git blame -b -w' +alias gbnm='git branch --no-merged' +alias gbr='git branch --remote' +alias gbs='git bisect' +alias gbsb='git bisect bad' +alias gbsg='git bisect good' +alias gbsr='git bisect reset' +alias gbss='git bisect start' +alias gc='git commit -v' +alias 'gc!'='git commit -v --amend' +alias gca='git commit -v -a' +alias 'gca!'='git commit -v -a --amend' +alias gcam='git commit -a -m' +alias 'gcan!'='git commit -v -a --no-edit --amend' +alias 'gcans!'='git commit -v -a -s --no-edit --amend' +alias gcb='git checkout -b' +alias gcd='git checkout develop' +alias gcf='git config --list' +alias gcl='git clone --recurse-submodules' +alias gclean='git clean -id' +alias gcm='git checkout $(git_main_branch)' +alias gcmsg='git commit -m' +alias 'gcn!'='git commit -v --no-edit --amend' +alias gco='git checkout' +alias gcount='git shortlog -sn' +alias gcp='git cherry-pick' +alias gcpa='git cherry-pick --abort' +alias gcpc='git cherry-pick --continue' +alias gcs='git commit -S' +alias gcsm='git commit -s -m' +alias gd='git diff' +alias gdca='git diff --cached' +alias gdct='git describe --tags $(git rev-list --tags --max-count=1)' +alias gdcw='git diff --cached --word-diff' +alias gds='git diff --staged' +alias gdt='git diff-tree --no-commit-id --name-only -r' +alias gdw='git diff --word-diff' +alias gf='git fetch' +alias gfa='git fetch --all --prune' +alias gfg='git ls-files | grep' +alias gfo='git fetch origin' +alias gg='git gui citool' +alias gga='git gui citool --amend' +alias ggpull='git pull origin "$(git_current_branch)"' +alias ggpur=ggu +alias ggpush='git push origin "$(git_current_branch)"' +alias ggsup='git branch --set-upstream-to=origin/$(git_current_branch)' +alias ghh='git help' +alias gignore='git update-index --assume-unchanged' +alias gignored='git ls-files -v | grep "^[[:lower:]]"' +alias git-svn-dcommit-push='git svn dcommit && git push github $(git_main_branch):svntrunk' +alias gk='\gitk --all --branches' +alias gke='\gitk --all $(git log -g --pretty=%h)' +alias gl='git pull' +alias glg='git log --stat' +alias glgg='git log --graph' +alias glgga='git log --graph --decorate --all' +alias glgm='git log --graph --max-count=10' +alias glgp='git log --stat -p' +alias glo='git log --oneline --decorate' +alias globurl='noglob urlglobber ' +alias glod='git log --graph --pretty='\''%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset'\' +alias glods='git log --graph --pretty='\''%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset'\'' --date=short' +alias glog='git log --oneline --decorate --graph' +alias gloga='git log --oneline --decorate --graph --all' +alias glol='git log --graph --pretty='\''%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\' +alias glola='git log --graph --pretty='\''%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\'' --all' +alias glols='git log --graph --pretty='\''%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\'' --stat' +alias glp=_git_log_prettily +alias glum='git pull upstream $(git_main_branch)' +alias gm='git merge' +alias gma='git merge --abort' +alias gmom='git merge origin/$(git_main_branch)' +alias gmt='git mergetool --no-prompt' +alias gmtvim='git mergetool --no-prompt --tool=vimdiff' +alias gmum='git merge upstream/$(git_main_branch)' +alias gp='git push' +alias gpd='git push --dry-run' +alias gpf='git push --force-with-lease' +alias 'gpf!'='git push --force' +alias gpoat='git push origin --all && git push origin --tags' +alias gpristine='git reset --hard && git clean -dffx' +alias gpsup='git push --set-upstream origin $(git_current_branch)' +alias gpu='git push upstream' +alias gpv='git push -v' +alias gr='git remote' +alias gra='git remote add' +alias grb='git rebase' +alias grba='git rebase --abort' +alias grbc='git rebase --continue' +alias grbd='git rebase develop' +alias grbi='git rebase -i' +alias grbm='git rebase $(git_main_branch)' +alias grbs='git rebase --skip' +alias grep='grep --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,.tox}' +alias grev='git revert' +alias grh='git reset' +alias grhh='git reset --hard' +alias grm='git rm' +alias grmc='git rm --cached' +alias grmv='git remote rename' +alias groh='git reset origin/$(git_current_branch) --hard' +alias grrm='git remote remove' +alias grs='git restore' +alias grset='git remote set-url' +alias grss='git restore --source' +alias grt='cd "$(git rev-parse --show-toplevel || echo .)"' +alias gru='git reset --' +alias grup='git remote update' +alias grv='git remote -v' +alias gsb='git status -sb' +alias gsd='git svn dcommit' +alias gsh='git show' +alias gsi='git submodule init' +alias gsps='git show --pretty=short --show-signature' +alias gsr='git svn rebase' +alias gss='git status -s' +alias gst='git status' +alias gsta='git stash push' +alias gstaa='git stash apply' +alias gstall='git stash --all' +alias gstc='git stash clear' +alias gstd='git stash drop' +alias gstl='git stash list' +alias gstp='git stash pop' +alias gsts='git stash show --text' +alias gstu='git stash --include-untracked' +alias gsu='git submodule update' +alias gsw='git switch' +alias gswc='git switch -c' +alias gtl='gtl(){ git tag --sort=-v:refname -n -l "${1}*" }; noglob gtl' +alias gts='git tag -s' +alias gtv='git tag | sort -V' +alias gunignore='git update-index --no-assume-unchanged' +alias gunwip='git log -n 1 | grep -q -c "\-\-wip\-\-" && git reset HEAD~1' +alias gup='git pull --rebase' +alias gupa='git pull --rebase --autostash' +alias gupav='git pull --rebase --autostash -v' +alias gupv='git pull --rebase -v' +alias gwch='git whatchanged -p --abbrev-commit --pretty=medium' +alias gwip='git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign -m "--wip-- [skip ci]"' diff --git a/config/os/linux/manjaro/Manjaro.md b/config/os/linux/manjaro/Manjaro.md new file mode 100644 index 0000000..0b01aa8 --- /dev/null +++ b/config/os/linux/manjaro/Manjaro.md @@ -0,0 +1,172 @@ +# Manjaro config + +## Basic dev tools + +```bash +sudo pacman -S go neovim fcitx fcitx-configtool cmake the_silver_searcher octave python-requests python-neovim terminus-font tmux tig +``` + +source + +```bash +sudo pacman-mirrors -i -c China -m rank +``` + +勾选 `http://mirrors.ustc.edu.cn/manjaro/`, 然后按 `OK` 键两次。 + +刷新缓存 + +```bash +sudo pacman -Syy +``` + +### Install vscode + +```bash +git clone https://AUR.archlinux.org/visual-studio-code-bin.git +cd visual-studio-code-bin/ +makepkg -s +sudo pacman -U visual-studio-code-bin-*.pkg.tar.xz +``` + +### Install google-chrome + +```bash +git clone https://aur.archlinux.org/google-chrome.git +cd google-chrome +yay -U google-chrome-67.0.3396.99-1-x86_64.pkg.tar.xz +``` + +### Install yay + +```bash +git clone https://aur.archlinux.org/yay.git +cd yay +makepkg -s +``` + +If error occurs: + +```bash +yay_sources git repo ... 失败 (未知的公共密匙 XXXXXXXXXXXXXXX) +==> 错误: 一个或多个 PGP 签名无法校验! +``` + +Fix: + +```bash +gpg --recv-keys XXXXXXXXXXXXXXX +``` + +### Install fonts and symbola + +```bash +sudo pacman -S noto-fonts noto-fonts-cjk noto-fonts-emoji wqy-microhei +yay -S ttf-symbola +``` + +### PyCharm + +```bash +yay -S pycharm +sudo chown -R user:group /usr/share/pycharm +``` + +### Intellij-Idea + +```bash +yay -S intellij-idea-community-edition +sudo chown -R user:group /usr/share/intellijidea-ce +``` + +## Others + +```bash +yay -S boxes fcitx-googlepinyin graphviz neofetch tree tcl tk +``` + +Fix a stop job is running for session c2 of user xxx (xs / 1min 30s) + +```bash +yay -S watchdog +systemctl enable watchdog.service +systemctl start watchdog.service +``` + +### Mysql Installation + +```bash +yay -S mysql +``` + +Choose mariadb, and then initialize the MariaDB data directory prior to starting the service. + +```bash +sudo mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql +``` + +start service + +```bash +systemctl start mariadb +``` + +stop service + +```bash +systemctl stop mariadb +``` + +restart service + +```bash +systemctl restart mariadb +``` + +## Timezone Config + +```bash +timedatectl status +timedatectl set-local-rtc 0 +timedatectl set-timezone Asia/Shanghai +``` + +## Change folder names to English + +edit `~/.config/user-dirs.dirs` + +```bash +vi ~/.config/user-dirs.dirs +``` + +then change dir name as you wish + +```bash +XDG_DESKTOP_DIR="$HOME/Desktop" +XDG_DOWNLOAD_DIR="$HOME/Downloads" +XDG_TEMPLATES_DIR="$HOME/Templates" +XDG_PUBLICSHARE_DIR="$HOME/Public" +XDG_DOCUMENTS_DIR="$HOME/Documents" +XDG_MUSIC_DIR="$HOME/Music" +XDG_PICTURES_DIR="$HOME/Pictures" +XDG_VIDEOS_DIR="$HOME/Videos" +``` + +## Shorten `A stop job is running` + +```bash +vi /etc/systemd/system.conf +``` + +Then change + +```bash +DefaultTimeoutStartSec=9s +DefaultTimeoutStopSec=9s +``` + +## Change hostname + +```bash +sudo hostnamectl set-hostname $new_name +``` diff --git a/config/os/linux/manjaro/cuda-conf.sh b/config/os/linux/manjaro/cuda-conf.sh new file mode 100644 index 0000000..a849991 --- /dev/null +++ b/config/os/linux/manjaro/cuda-conf.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +CUDA_PATH=/opt/cuda +CUDA_LIB=$CUDA_PATH/lib64/ + +for file in $(find $CUDA_LIB -name "*.so.10"); do + sudo ln -s $file "$file.0" +done diff --git a/config/os/linux/manjaro/install-pacman-items.sh b/config/os/linux/manjaro/install-pacman-items.sh new file mode 100644 index 0000000..ec28f4f --- /dev/null +++ b/config/os/linux/manjaro/install-pacman-items.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +echo 'Install basic tools...' +sudo pacman -S go cmake neovim + +sudo rm /usr/bin/vi +sudo ln -s /usr/bin/nvim /usr/bin/vi +sudo ln -s /usr/bin/nvim /usr/bin/vim diff --git a/config/os/linux/manjaro/prepare-yay.sh b/config/os/linux/manjaro/prepare-yay.sh new file mode 100644 index 0000000..b9eebea --- /dev/null +++ b/config/os/linux/manjaro/prepare-yay.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +cwd=$(pwd) +echo 'Install basic tools...' +sudo pacman -S go neovim cmake + +sudo rm /usr/bin/vi +sudo ln -s /usr/bin/nvim /usr/bin/vi +sudo ln -s /usr/bin/nvim /usr/bin/vim + +echo 'Getting yay...' +yay_path=$HOME/Projects/yay + +if [[ -d $yay_path ]]; then + rm -rf $yay_path +fi + +git clone https://aur.archlinux.org/yay.git -C $yay_path + +cd $yay_path && makepkg -s && sudo pacman -U yay-*.pkg.tar.xz +cd $cwd + diff --git a/config/os/linux/manjaro/yay-add-essential-items.sh b/config/os/linux/manjaro/yay-add-essential-items.sh new file mode 100644 index 0000000..2f6783e --- /dev/null +++ b/config/os/linux/manjaro/yay-add-essential-items.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +echo 'Installing visual-studio-code' +yay -S visual-studio-code-bin + +echo 'Installing basic tools using yay...' +yay -S the_silver_searcher tig neofetch tree xclip mitmproxy fzf + +echo 'Installing fonts and symbola' +yay -S noto-fonts noto-fonts-cjk noto-fonts-emoji wqy-microhei ttf-symbola wqy-zenhei adobe-source-han-sans-cn-fonts diff --git a/config/os/linux/manjaro/yay-add-optimal-items.sh b/config/os/linux/manjaro/yay-add-optimal-items.sh new file mode 100644 index 0000000..2159b11 --- /dev/null +++ b/config/os/linux/manjaro/yay-add-optimal-items.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +echo 'Installing basic tools using yay...' +yay -S graphviz tcl tk ctags tldr + +echo 'Installing fonts and symbola' +yay -S nerd-fonts-meslo ttf-monaco diff --git a/config/os/linux/systemd.md b/config/os/linux/systemd.md new file mode 100644 index 0000000..6961f39 --- /dev/null +++ b/config/os/linux/systemd.md @@ -0,0 +1,7 @@ +# Problems + +Unit dbus-org.freedesktop.resolve1.service not found + +```bash +sudo ln -s /usr/lib/systemd/system/systemd-resolved.service /usr/lib/systemd/system/dbus-org.freedesktop.resolve1.service +``` diff --git a/config/os/linux/xfce.xinitrc b/config/os/linux/xfce.xinitrc new file mode 100644 index 0000000..1bc2289 --- /dev/null +++ b/config/os/linux/xfce.xinitrc @@ -0,0 +1,66 @@ +#!/bin/bash +# +# ~/.xinitrc +# +# Executed by startx (run your window manager from here) + +userresources=$HOME/.Xresources +usermodmap=$HOME/.Xmodmap +sysresources=/etc/X11/xinit/.Xresources +sysmodmap=/etc/X11/xinit/.Xmodmap + +SESSION=${1:-xfce} + +# merge in defaults and keymaps + +if [ -f $sysresources ]; then + xrdb -merge $sysresources +fi + +if [ -f $sysmodmap ]; then + xmodmap $sysmodmap +fi + +if [ -f "$userresources" ]; then + xrdb -merge "$userresources" +fi + +if [ -f "$usermodmap" ]; then + xmodmap "$usermodmap" +fi + +# start some nice programs + +if [ -d /etc/X11/xinit/xinitrc.d ] ; then + for f in /etc/X11/xinit/xinitrc.d/?*.sh ; do + [ -x "$f" ] && . "$f" + done + unset f +fi + +get_session(){ + local dbus_args=(--sh-syntax --exit-with-session) + case "$SESSION" in + awesome) dbus_args+=(awesome) ;; + bspwm) dbus_args+=(bspwm-session) ;; + budgie) dbus_args+=(budgie-desktop) ;; + cinnamon) dbus_args+=(cinnamon-session) ;; + deepin) dbus_args+=(startdde) ;; + enlightenment) dbus_args+=(enlightenment_start) ;; + fluxbox) dbus_args+=(startfluxbox) ;; + gnome) dbus_args+=(gnome-session) ;; + i3|i3wm) dbus_args+=(i3 --shmlog-size 0) ;; + jwm) dbus_args+=(jwm) ;; + kde) dbus_args+=(startkde) ;; + lxde) dbus_args+=(startlxde) ;; + lxqt) dbus_args+=(lxqt-session) ;; + mate) dbus_args+=(mate-session) ;; + xfce) dbus_args+=(xfce4-session) ;; + openbox) dbus_args+=(openbox-session) ;; + *) dbus_args+=("$SESSION") ;; + esac + + echo "dbus-launch ${dbus_args[*]}" +} + +exec $(get_session) diff --git a/config/os/mac/brew_cleanup.sh b/config/os/mac/brew_cleanup.sh new file mode 100644 index 0000000..0b0ed94 --- /dev/null +++ b/config/os/mac/brew_cleanup.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +brew_packages_to_be_cleaned=$(brew list -1 | grep -vi python | tr '\n' ' ') +echo "packages to be cleaned: $brew_packages_to_be_cleaned" +echo "Do you wish to clean those packages (y/n)? " +read answer +echo "you choose $answer" + +if [[ "$answer" == "y" || "$answer" == "Y" ]]; then + brew cleanup $brew_packages_to_be_cleaned +else + echo "brew will not cleanup any packages" +fi diff --git a/config/os/mac/get_brew.sh b/config/os/mac/get_brew.sh new file mode 100644 index 0000000..956fe54 --- /dev/null +++ b/config/os/mac/get_brew.sh @@ -0,0 +1,3 @@ +#!/bin/bash +/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" + diff --git a/config/os/mac/install-brew.sh b/config/os/mac/install-brew.sh new file mode 100644 index 0000000..aca763c --- /dev/null +++ b/config/os/mac/install-brew.sh @@ -0,0 +1,651 @@ +#!/bin/bash +set -u + +# First check if the OS is Linux. +if [[ "$(uname)" = "Linux" ]]; then + HOMEBREW_ON_LINUX=1 +fi + +# On macOS, this script installs to /usr/local only. +# On Linux, it installs to /home/linuxbrew/.linuxbrew if you have sudo access +# and ~/.linuxbrew otherwise. +# To install elsewhere (which is unsupported) +# you can untar https://github.com/Homebrew/brew/tarball/master +# anywhere you like. +if [[ -z "${HOMEBREW_ON_LINUX-}" ]]; then + HOMEBREW_PREFIX="/usr/local" + HOMEBREW_REPOSITORY="/usr/local/Homebrew" + HOMEBREW_CACHE="${HOME}/Library/Caches/Homebrew" + + STAT="stat -f" + CHOWN="/usr/sbin/chown" + CHGRP="/usr/bin/chgrp" + GROUP="admin" + TOUCH="/usr/bin/touch" +else + HOMEBREW_PREFIX_DEFAULT="/home/linuxbrew/.linuxbrew" + HOMEBREW_CACHE="${HOME}/.cache/Homebrew" + + STAT="stat --printf" + CHOWN="/bin/chown" + CHGRP="/bin/chgrp" + GROUP="$(id -gn)" + TOUCH="/bin/touch" +fi +BREW_REPO="https://github.com/Homebrew/brew" + +# TODO: bump version when new macOS is released +MACOS_LATEST_SUPPORTED="10.15" +# TODO: bump version when new macOS is released +MACOS_OLDEST_SUPPORTED="10.13" + +# For Homebrew on Linux +REQUIRED_RUBY_VERSION=2.6 # https://github.com/Homebrew/brew/pull/6556 +REQUIRED_GLIBC_VERSION=2.13 # https://docs.brew.sh/Homebrew-on-Linux#requirements + +# no analytics during installation +export HOMEBREW_NO_ANALYTICS_THIS_RUN=1 +export HOMEBREW_NO_ANALYTICS_MESSAGE_OUTPUT=1 + +# string formatters +if [[ -t 1 ]]; then + tty_escape() { printf "\033[%sm" "$1"; } +else + tty_escape() { :; } +fi +tty_mkbold() { tty_escape "1;$1"; } +tty_underline="$(tty_escape "4;39")" +tty_blue="$(tty_mkbold 34)" +tty_red="$(tty_mkbold 31)" +tty_bold="$(tty_mkbold 39)" +tty_reset="$(tty_escape 0)" + +have_sudo_access() { + local -a args + if [[ -n "${SUDO_ASKPASS-}" ]]; then + args=("-A") + fi + + if [[ -z "${HAVE_SUDO_ACCESS-}" ]]; then + if [[ -n "${args[*]-}" ]]; then + /usr/bin/sudo "${args[@]}" -l mkdir &>/dev/null + else + /usr/bin/sudo -l mkdir &>/dev/null + fi + HAVE_SUDO_ACCESS="$?" + fi + + if [[ -z "${HOMEBREW_ON_LINUX-}" ]] && [[ "$HAVE_SUDO_ACCESS" -ne 0 ]]; then + abort "Need sudo access on macOS (e.g. the user $USER to be an Administrator)!" + fi + + return "$HAVE_SUDO_ACCESS" +} + +shell_join() { + local arg + printf "%s" "$1" + shift + for arg in "$@"; do + printf " " + printf "%s" "${arg// /\ }" + done +} + +chomp() { + printf "%s" "${1/"$'\n'"/}" +} + +ohai() { + printf "${tty_blue}==>${tty_bold} %s${tty_reset}\n" "$(shell_join "$@")" +} + +warn() { + printf "${tty_red}Warning${tty_reset}: %s\n" "$(chomp "$1")" +} + +abort() { + printf "%s\n" "$1" + exit 1 +} + +execute() { + if ! "$@"; then + abort "$(printf "Failed during: %s" "$(shell_join "$@")")" + fi +} + +execute_sudo() { + local -a args=("$@") + if [[ -n "${SUDO_ASKPASS-}" ]]; then + args=("-A" "${args[@]}") + fi + if have_sudo_access; then + ohai "/usr/bin/sudo" "${args[@]}" + execute "/usr/bin/sudo" "${args[@]}" + else + ohai "${args[@]}" + execute "${args[@]}" + fi +} + +getc() { + local save_state + save_state=$(/bin/stty -g) + /bin/stty raw -echo + IFS= read -r -n 1 -d '' "$@" + /bin/stty "$save_state" +} + +wait_for_user() { + local c + echo + echo "Press RETURN to continue or any other key to abort" + getc c + # we test for \r and \n because some stuff does \r instead + if ! [[ "$c" == $'\r' || "$c" == $'\n' ]]; then + exit 1 + fi +} + +major_minor() { + echo "${1%%.*}.$( + x="${1#*.}" + echo "${x%%.*}" + )" +} + +if [[ -z "${HOMEBREW_ON_LINUX-}" ]]; then + macos_version="$(major_minor "$(/usr/bin/sw_vers -productVersion)")" +fi + +version_gt() { + [[ "${1%.*}" -gt "${2%.*}" ]] || [[ "${1%.*}" -eq "${2%.*}" && "${1#*.}" -gt "${2#*.}" ]] +} +version_ge() { + [[ "${1%.*}" -gt "${2%.*}" ]] || [[ "${1%.*}" -eq "${2%.*}" && "${1#*.}" -ge "${2#*.}" ]] +} +version_lt() { + [[ "${1%.*}" -lt "${2%.*}" ]] || [[ "${1%.*}" -eq "${2%.*}" && "${1#*.}" -lt "${2#*.}" ]] +} + +should_install_git() { + if [[ $(command -v git) ]]; then + return 1 + fi +} + +should_install_command_line_tools() { + if [[ -n "${HOMEBREW_ON_LINUX-}" ]]; then + return 1 + fi + + if version_gt "$macos_version" "10.13"; then + ! [[ -e "/Library/Developer/CommandLineTools/usr/bin/git" ]] + else + ! [[ -e "/Library/Developer/CommandLineTools/usr/bin/git" ]] || + ! [[ -e "/usr/include/iconv.h" ]] + fi +} + +get_permission() { + $STAT "%A" "$1" +} + +user_only_chmod() { + [[ -d "$1" ]] && [[ "$(get_permission "$1")" != "755" ]] +} + +exists_but_not_writable() { + [[ -e "$1" ]] && ! [[ -r "$1" && -w "$1" && -x "$1" ]] +} + +get_owner() { + $STAT "%u" "$1" +} + +file_not_owned() { + [[ "$(get_owner "$1")" != "$(id -u)" ]] +} + +get_group() { + $STAT "%g" "$1" +} + +file_not_grpowned() { + [[ " $(id -G "$USER") " != *" $(get_group "$1") "* ]] +} + +# Please sync with 'test_ruby()' in 'Library/Homebrew/utils/ruby.sh' from Homebrew/brew repository. +test_ruby() { + if [[ ! -x $1 ]]; then + return 1 + fi + + "$1" --enable-frozen-string-literal --disable=gems,did_you_mean,rubyopt -rrubygems -e \ + "abort if Gem::Version.new(RUBY_VERSION.to_s.dup).to_s.split('.').first(2) != \ + Gem::Version.new('$REQUIRED_RUBY_VERSION').to_s.split('.').first(2)" 2>/dev/null +} + +no_usable_ruby() { + local ruby_exec + IFS=$'\n' # Do word splitting on new lines only + for ruby_exec in $(which -a ruby); do + if test_ruby "$ruby_exec"; then + return 1 + fi + done + IFS=$' \t\n' # Restore IFS to its default value + return 0 +} + +outdated_glibc() { + local glibc_version + glibc_version=$(ldd --version | head -n1 | grep -o '[0-9.]*$' | grep -o '^[0-9]\+\.[0-9]\+') + version_lt "$glibc_version" "$REQUIRED_GLIBC_VERSION" +} + +if [[ -n "${HOMEBREW_ON_LINUX-}" ]] && no_usable_ruby && outdated_glibc; then + abort "$( + cat <<-EOFABORT + Homebrew requires Ruby $REQUIRED_RUBY_VERSION which was not found on your system. + Homebrew portable Ruby requires Glibc version $REQUIRED_GLIBC_VERSION or newer, + and your Glibc version is too old. + See ${tty_underline}https://docs.brew.sh/Homebrew-on-Linux#requirements${tty_reset} + Install Ruby $REQUIRED_RUBY_VERSION and add its location to your PATH. + EOFABORT + )" +fi + +# USER isn't always set so provide a fall back for the installer and subprocesses. +if [[ -z "${USER-}" ]]; then + USER="$(chomp "$(id -un)")" + export USER +fi + +# Invalidate sudo timestamp before exiting (if it wasn't active before). +if ! /usr/bin/sudo -n -v 2>/dev/null; then + trap '/usr/bin/sudo -k' EXIT +fi + +# Things can fail later if `pwd` doesn't exist. +# Also sudo prints a warning message for no good reason +cd "/usr" || exit 1 + +####################################################################### script +if should_install_git; then + abort "$( + cat <&1) != *"mkdir"* ]]; then + ohai "Select the Homebrew installation directory" + echo "- ${tty_bold}Enter your password${tty_reset} to install to ${tty_underline}${HOMEBREW_PREFIX_DEFAULT}${tty_reset} (${tty_bold}recommended${tty_reset})" + echo "- ${tty_bold}Press Control-D${tty_reset} to install to ${tty_underline}$HOME/.linuxbrew${tty_reset}" + echo "- ${tty_bold}Press Control-C${tty_reset} to cancel installation" + fi + if have_sudo_access; then + HOMEBREW_PREFIX="$HOMEBREW_PREFIX_DEFAULT" + else + HOMEBREW_PREFIX="$HOME/.linuxbrew" + fi + trap - SIGINT + fi + HOMEBREW_REPOSITORY="${HOMEBREW_PREFIX}/Homebrew" +fi + +if [[ "$UID" == "0" ]]; then + abort "Don't run this as root!" +elif [[ -d "$HOMEBREW_PREFIX" && ! -x "$HOMEBREW_PREFIX" ]]; then + abort "$( + cat </dev/null || return + + # we do it in four steps to avoid merge errors when reinstalling + execute "git" "init" "-q" + + # "git remote add" will fail if the remote is defined in the global config + execute "git" "config" "remote.origin.url" "${BREW_REPO}" + execute "git" "config" "remote.origin.fetch" "+refs/heads/*:refs/remotes/origin/*" + + # ensure we don't munge line endings on checkout + execute "git" "config" "core.autocrlf" "false" + + execute "git" "fetch" "origin" "--force" + execute "git" "fetch" "origin" "--tags" "--force" + + execute "git" "reset" "--hard" "origin/master" + + execute "ln" "-sf" "${HOMEBREW_REPOSITORY}/bin/brew" "${HOMEBREW_PREFIX}/bin/brew" + + execute "${HOMEBREW_PREFIX}/bin/brew" "update" "--force" +) + +if [[ ":${PATH}:" != *":${HOMEBREW_PREFIX}/bin:"* ]]; then + warn "${HOMEBREW_PREFIX}/bin is not in your PATH." +fi + +ohai "Installation successful!" +echo + +# Use the shell's audible bell. +if [[ -t 1 ]]; then + printf "\a" +fi + +# Use an extra newline and bold to avoid this being missed. +ohai "Homebrew has enabled anonymous aggregate formulae and cask analytics." +echo "$( + cat </dev/null || return + execute "git" "config" "--replace-all" "homebrew.analyticsmessage" "true" + execute "git" "config" "--replace-all" "homebrew.caskanalyticsmessage" "true" +) + +ohai "Next steps:" +echo "- Run \`brew help\` to get started" +echo "- Further documentation: " +echo " ${tty_underline}https://docs.brew.sh${tty_reset}" + +if [[ -n "${HOMEBREW_ON_LINUX-}" ]]; then + case "$SHELL" in + */bash*) + if [[ -r "$HOME/.bash_profile" ]]; then + shell_profile="$HOME/.bash_profile" + else + shell_profile="$HOME/.profile" + fi + ;; + */zsh*) + shell_profile="$HOME/.zprofile" + ;; + *) + shell_profile="$HOME/.profile" + ;; + esac + + cat <> ${shell_profile} +- Add Homebrew to your ${tty_bold}PATH${tty_reset} + eval \$(${HOMEBREW_PREFIX}/bin/brew shellenv) +- We recommend that you install GCC by running: + brew install gcc + +EOS +fi diff --git a/config/os/mac/install-dev-items.sh b/config/os/mac/install-dev-items.sh new file mode 100644 index 0000000..fe49d06 --- /dev/null +++ b/config/os/mac/install-dev-items.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# dev lang +brew install python@3.8 golang mysql@5.7 mitmproxy + +# tools +brew install neovim screenfetch tig the_silver_searcher tree p7zip cloc shfmt + diff --git a/config/os/mac/iterm2.json b/config/os/mac/iterm2.json new file mode 100644 index 0000000..60f1f1b --- /dev/null +++ b/config/os/mac/iterm2.json @@ -0,0 +1,799 @@ +{ + "Profiles": [ + { + "Transparency": 0.06008684961928934, + "Tags": [], + "Ansi 12 Color": { + "Red Component": 0.51372549019607838, + "Color Space": "sRGB", + "Blue Component": 0.58823529411764708, + "Green Component": 0.58039215686274515 + }, + "Ansi 1 Color": { + "Red Component": 0.86274509803921573, + "Color Space": "sRGB", + "Blue Component": 0.18431372549019609, + "Green Component": 0.19607843137254902 + }, + "Ansi 7 Color": { + "Red Component": 0.93333333333333335, + "Color Space": "sRGB", + "Blue Component": 0.83529411764705885, + "Green Component": 0.90980392156862744 + }, + "Bold Color": { + "Red Component": 0.57647058823529407, + "Color Space": "sRGB", + "Blue Component": 0.63137254901960782, + "Green Component": 0.63137254901960782 + }, + "Ansi 8 Color": { + "Red Component": 0, + "Color Space": "sRGB", + "Blue Component": 0.21176470588235294, + "Green Component": 0.16862745098039217 + }, + "Ansi 9 Color": { + "Red Component": 0.79607843137254897, + "Color Space": "sRGB", + "Blue Component": 0.086274509803921581, + "Green Component": 0.29411764705882354 + }, + "Horizontal Spacing": 1, + "Rows": 30, + "Default Bookmark": "No", + "Ansi 4 Color": { + "Red Component": 0.14901960784313725, + "Color Space": "sRGB", + "Blue Component": 0.82352941176470584, + "Green Component": 0.54509803921568623 + }, + "Cursor Guide Color": { + "Red Component": 0.70213186740875244, + "Color Space": "sRGB", + "Blue Component": 1, + "Alpha Component": 0.25, + "Green Component": 0.9268307089805603 + }, + "Non-ASCII Anti Aliased": true, + "Use Bright Bold": true, + "Ansi 10 Color": { + "Red Component": 0.34509803921568627, + "Color Space": "sRGB", + "Blue Component": 0.45882352941176469, + "Green Component": 0.43137254901960786 + }, + "Icon": 1, + "Ambiguous Double Width": false, + "Jobs to Ignore": [ + "rlogin", + "ssh", + "slogin", + "telnet" + ], + "Ansi 15 Color": { + "Red Component": 0.99215686274509807, + "Color Space": "sRGB", + "Blue Component": 0.8901960784313725, + "Green Component": 0.96470588235294119 + }, + "Foreground Color": { + "Red Component": 0.51372549019607838, + "Color Space": "sRGB", + "Blue Component": 0.58823529411764708, + "Green Component": 0.58039215686274515 + }, + "Working Directory": "\/Users\/liuzhao", + "Blinking Cursor": false, + "Disable Window Resizing": true, + "Sync Title": false, + "Prompt Before Closing 2": false, + "BM Growl": true, + "Command": "", + "Description": "Default", + "Mouse Reporting": true, + "Screen": -1, + "Selection Color": { + "Red Component": 0.027450980392156866, + "Color Space": "sRGB", + "Blue Component": 0.25882352941176473, + "Green Component": 0.21176470588235294 + }, + "Columns": 120, + "Idle Code": 0, + "Ansi 13 Color": { + "Red Component": 0.42352941176470588, + "Color Space": "sRGB", + "Blue Component": 0.7686274509803922, + "Green Component": 0.44313725490196076 + }, + "Brighten Bold Text": false, + "Custom Command": "No", + "ASCII Anti Aliased": true, + "Non Ascii Font": "Monaco 12", + "Vertical Spacing": 1, + "Use Bold Font": true, + "Option Key Sends": 0, + "Selected Text Color": { + "Red Component": 0.57647058823529407, + "Color Space": "sRGB", + "Blue Component": 0.63137254901960782, + "Green Component": 0.63137254901960782 + }, + "Background Color": { + "Red Component": 0, + "Color Space": "sRGB", + "Blue Component": 0.21176470588235294, + "Green Component": 0.16862745098039217 + }, + "Character Encoding": 4, + "Ansi 11 Color": { + "Red Component": 0.396078431372549, + "Color Space": "sRGB", + "Blue Component": 0.51372549019607838, + "Green Component": 0.4823529411764706 + }, + "Use Italic Font": true, + "Unlimited Scrollback": false, + "Keyboard Map": { + "0xf700-0x260000": { + "Text": "[1;6A", + "Action": 10 + }, + "0x37-0x40000": { + "Text": "0x1f", + "Action": 11 + }, + "0x32-0x40000": { + "Text": "0x00", + "Action": 11 + }, + "0xf709-0x20000": { + "Text": "[17;2~", + "Action": 10 + }, + "0xf70c-0x20000": { + "Text": "[20;2~", + "Action": 10 + }, + "0xf729-0x20000": { + "Text": "[1;2H", + "Action": 10 + }, + "0xf72b-0x40000": { + "Text": "[1;5F", + "Action": 10 + }, + "0xf705-0x20000": { + "Text": "[1;2Q", + "Action": 10 + }, + "0xf703-0x260000": { + "Text": "[1;6C", + "Action": 10 + }, + "0xf700-0x220000": { + "Text": "[1;2A", + "Action": 10 + }, + "0xf701-0x280000": { + "Text": "0x1b 0x1b 0x5b 0x42", + "Action": 11 + }, + "0x38-0x40000": { + "Text": "0x7f", + "Action": 11 + }, + "0x33-0x40000": { + "Text": "0x1b", + "Action": 11 + }, + "0xf703-0x220000": { + "Text": "[1;2C", + "Action": 10 + }, + "0xf701-0x240000": { + "Text": "[1;5B", + "Action": 10 + }, + "0xf70d-0x20000": { + "Text": "[21;2~", + "Action": 10 + }, + "0xf702-0x260000": { + "Text": "[1;6D", + "Action": 10 + }, + "0xf729-0x40000": { + "Text": "[1;5H", + "Action": 10 + }, + "0xf706-0x20000": { + "Text": "[1;2R", + "Action": 10 + }, + "0x34-0x40000": { + "Text": "0x1c", + "Action": 11 + }, + "0xf700-0x280000": { + "Text": "0x1b 0x1b 0x5b 0x41", + "Action": 11 + }, + "0x2d-0x40000": { + "Text": "0x1f", + "Action": 11 + }, + "0xf70e-0x20000": { + "Text": "[23;2~", + "Action": 10 + }, + "0xf702-0x220000": { + "Text": "[1;2D", + "Action": 10 + }, + "0xf703-0x280000": { + "Text": "0x1b 0x1b 0x5b 0x43", + "Action": 11 + }, + "0xf700-0x240000": { + "Text": "[1;5A", + "Action": 10 + }, + "0xf707-0x20000": { + "Text": "[1;2S", + "Action": 10 + }, + "0xf70a-0x20000": { + "Text": "[18;2~", + "Action": 10 + }, + "0x35-0x40000": { + "Text": "0x1d", + "Action": 11 + }, + "0xf70f-0x20000": { + "Text": "[24;2~", + "Action": 10 + }, + "0xf703-0x240000": { + "Text": "[1;5C", + "Action": 10 + }, + "0xf701-0x260000": { + "Text": "[1;6B", + "Action": 10 + }, + "0xf702-0x280000": { + "Text": "0x1b 0x1b 0x5b 0x44", + "Action": 11 + }, + "0xf72b-0x20000": { + "Text": "[1;2F", + "Action": 10 + }, + "0x36-0x40000": { + "Text": "0x1e", + "Action": 11 + }, + "0xf708-0x20000": { + "Text": "[15;2~", + "Action": 10 + }, + "0xf701-0x220000": { + "Text": "[1;2B", + "Action": 10 + }, + "0xf70b-0x20000": { + "Text": "[19;2~", + "Action": 10 + }, + "0xf702-0x240000": { + "Text": "[1;5D", + "Action": 10 + }, + "0xf704-0x20000": { + "Text": "[1;2P", + "Action": 10 + } + }, + "Window Type": 0, + "Background Image Location": "", + "Blur": false, + "Badge Color": { + "Red Component": 1, + "Color Space": "sRGB", + "Blue Component": 0, + "Alpha Component": 0.5, + "Green Component": 0.1491314172744751 + }, + "Scrollback Lines": 1000, + "Send Code When Idle": false, + "Close Sessions On End": true, + "Terminal Type": "xterm-256color", + "Visual Bell": true, + "Flashing Bell": false, + "Silence Bell": false, + "Ansi 14 Color": { + "Red Component": 0.57647058823529407, + "Color Space": "sRGB", + "Blue Component": 0.63137254901960782, + "Green Component": 0.63137254901960782 + }, + "Name": "Default", + "Cursor Text Color": { + "Red Component": 0.027450980392156866, + "Color Space": "sRGB", + "Blue Component": 0.25882352941176473, + "Green Component": 0.21176470588235294 + }, + "Shortcut": "", + "Cursor Color": { + "Red Component": 0.51372549019607838, + "Color Space": "sRGB", + "Blue Component": 0.58823529411764708, + "Green Component": 0.58039215686274515 + }, + "Ansi 0 Color": { + "Red Component": 0.027450980392156866, + "Color Space": "sRGB", + "Blue Component": 0.25882352941176473, + "Green Component": 0.21176470588235294 + }, + "Triggers": [ + { + "regex": "rz waiting to receive.\\*\\*B0100", + "action": "MuteCoprocessTrigger", + "parameter": "\/usr\/local\/bin\/iterm2-send-zmodem.sh" + }, + { + "regex": "\\*\\*B00000000000000", + "action": "MuteCoprocessTrigger", + "parameter": "\/usr\/local\/bin\/iterm2-recv-zmodem.sh" + } + ], + "Guid": "7361BE32-B14C-4280-A00C-FE36CC21FC5E", + "Link Color": { + "Red Component": 0, + "Color Space": "sRGB", + "Blue Component": 0.73423302173614502, + "Alpha Component": 1, + "Green Component": 0.35916060209274292 + }, + "Custom Directory": "No", + "Ansi 5 Color": { + "Red Component": 0.82745098039215681, + "Color Space": "sRGB", + "Blue Component": 0.50980392156862742, + "Green Component": 0.21176470588235294 + }, + "Use Non-ASCII Font": false, + "Right Option Key Sends": 0, + "Normal Font": "MesloLGLNerdFontComplete-Regular 14", + "Ansi 6 Color": { + "Red Component": 0.16470588235294117, + "Color Space": "sRGB", + "Blue Component": 0.59607843137254901, + "Green Component": 0.63137254901960782 + }, + "Ansi 3 Color": { + "Red Component": 0.70980392156862748, + "Color Space": "sRGB", + "Blue Component": 0, + "Green Component": 0.53725490196078429 + }, + "Ansi 2 Color": { + "Red Component": 0.52156862745098043, + "Color Space": "sRGB", + "Blue Component": 0, + "Green Component": 0.59999999999999998 + } + }, + { + "Working Directory": "\/Users\/liuzhao", + "Prompt Before Closing 2": false, + "Selected Text Color": { + "Red Component": 0.57647058823529407, + "Color Space": "sRGB", + "Blue Component": 0.63137254901960782, + "Green Component": 0.63137254901960782 + }, + "Rows": 25, + "Ansi 11 Color": { + "Red Component": 0.396078431372549, + "Color Space": "sRGB", + "Blue Component": 0.51372549019607838, + "Green Component": 0.4823529411764706 + }, + "Use Italic Font": true, + "HotKey Characters": "", + "Foreground Color": { + "Red Component": 0.51372549019607838, + "Color Space": "sRGB", + "Blue Component": 0.58823529411764708, + "Green Component": 0.58039215686274515 + }, + "HotKey Window Floats": false, + "Right Option Key Sends": 0, + "Character Encoding": 4, + "Selection Color": { + "Red Component": 0.027450980392156866, + "Color Space": "sRGB", + "Blue Component": 0.25882352941176473, + "Green Component": 0.21176470588235294 + }, + "Triggers": [ + { + "regex": "rz waiting to receive.\\*\\*B0100", + "action": "MuteCoprocessTrigger", + "parameter": "\/usr\/local\/bin\/iterm2-send-zmodem.sh" + }, + { + "regex": "\\*\\*B00000000000000", + "action": "MuteCoprocessTrigger", + "parameter": "\/usr\/local\/bin\/iterm2-recv-zmodem.sh" + } + ], + "Blend": 0.5, + "Mouse Reporting": true, + "Ansi 4 Color": { + "Red Component": 0.14901960784313725, + "Color Space": "sRGB", + "Blue Component": 0.82352941176470584, + "Green Component": 0.54509803921568623 + }, + "Non-ASCII Anti Aliased": true, + "Sync Title": false, + "Disable Window Resizing": true, + "Description": "Default", + "Close Sessions On End": true, + "Jobs to Ignore": [ + "rlogin", + "ssh", + "slogin", + "telnet" + ], + "Scrollback Lines": 1000, + "HotKey Window Reopens On Activation": false, + "Brighten Bold Text": false, + "Flashing Bell": false, + "Cursor Guide Color": { + "Red Component": 0.70213186740875244, + "Color Space": "sRGB", + "Blue Component": 1, + "Alpha Component": 0.25, + "Green Component": 0.9268307089805603 + }, + "BM Growl": true, + "Ansi 3 Color": { + "Red Component": 0.70980392156862748, + "Color Space": "sRGB", + "Blue Component": 0, + "Green Component": 0.53725490196078429 + }, + "Icon": 1, + "Use Non-ASCII Font": false, + "Link Color": { + "Red Component": 0, + "Color Space": "sRGB", + "Blue Component": 0.73423302173614502, + "Alpha Component": 1, + "Green Component": 0.35916060209274292 + }, + "Shortcut": "", + "Background Image Location": "", + "Bold Color": { + "Red Component": 0.57647058823529407, + "Color Space": "sRGB", + "Blue Component": 0.63137254901960782, + "Green Component": 0.63137254901960782 + }, + "Unlimited Scrollback": false, + "Custom Command": "No", + "HotKey Key Code": 111, + "Keyboard Map": { + "0xf700-0x260000": { + "Text": "[1;6A", + "Action": 10 + }, + "0x37-0x40000": { + "Text": "0x1f", + "Action": 11 + }, + "0x32-0x40000": { + "Text": "0x00", + "Action": 11 + }, + "0xf709-0x20000": { + "Text": "[17;2~", + "Action": 10 + }, + "0xf70c-0x20000": { + "Text": "[20;2~", + "Action": 10 + }, + "0xf729-0x20000": { + "Text": "[1;2H", + "Action": 10 + }, + "0xf72b-0x40000": { + "Text": "[1;5F", + "Action": 10 + }, + "0xf705-0x20000": { + "Text": "[1;2Q", + "Action": 10 + }, + "0xf703-0x260000": { + "Text": "[1;6C", + "Action": 10 + }, + "0xf700-0x220000": { + "Text": "[1;2A", + "Action": 10 + }, + "0xf701-0x280000": { + "Text": "0x1b 0x1b 0x5b 0x42", + "Action": 11 + }, + "0x38-0x40000": { + "Text": "0x7f", + "Action": 11 + }, + "0x33-0x40000": { + "Text": "0x1b", + "Action": 11 + }, + "0xf703-0x220000": { + "Text": "[1;2C", + "Action": 10 + }, + "0xf701-0x240000": { + "Text": "[1;5B", + "Action": 10 + }, + "0xf70d-0x20000": { + "Text": "[21;2~", + "Action": 10 + }, + "0xf702-0x260000": { + "Text": "[1;6D", + "Action": 10 + }, + "0xf729-0x40000": { + "Text": "[1;5H", + "Action": 10 + }, + "0xf706-0x20000": { + "Text": "[1;2R", + "Action": 10 + }, + "0x34-0x40000": { + "Text": "0x1c", + "Action": 11 + }, + "0xf700-0x280000": { + "Text": "0x1b 0x1b 0x5b 0x41", + "Action": 11 + }, + "0x2d-0x40000": { + "Text": "0x1f", + "Action": 11 + }, + "0xf70e-0x20000": { + "Text": "[23;2~", + "Action": 10 + }, + "0xf702-0x220000": { + "Text": "[1;2D", + "Action": 10 + }, + "0xf703-0x280000": { + "Text": "0x1b 0x1b 0x5b 0x43", + "Action": 11 + }, + "0xf700-0x240000": { + "Text": "[1;5A", + "Action": 10 + }, + "0xf707-0x20000": { + "Text": "[1;2S", + "Action": 10 + }, + "0xf70a-0x20000": { + "Text": "[18;2~", + "Action": 10 + }, + "0x35-0x40000": { + "Text": "0x1d", + "Action": 11 + }, + "0xf70f-0x20000": { + "Text": "[24;2~", + "Action": 10 + }, + "0xf703-0x240000": { + "Text": "[1;5C", + "Action": 10 + }, + "0xf701-0x260000": { + "Text": "[1;6B", + "Action": 10 + }, + "0xf702-0x280000": { + "Text": "0x1b 0x1b 0x5b 0x44", + "Action": 11 + }, + "0xf72b-0x20000": { + "Text": "[1;2F", + "Action": 10 + }, + "0x36-0x40000": { + "Text": "0x1e", + "Action": 11 + }, + "0xf708-0x20000": { + "Text": "[15;2~", + "Action": 10 + }, + "0xf701-0x220000": { + "Text": "[1;2B", + "Action": 10 + }, + "0xf70b-0x20000": { + "Text": "[19;2~", + "Action": 10 + }, + "0xf702-0x240000": { + "Text": "[1;5D", + "Action": 10 + }, + "0xf704-0x20000": { + "Text": "[1;2P", + "Action": 10 + } + }, + "Ansi 14 Color": { + "Red Component": 0.57647058823529407, + "Color Space": "sRGB", + "Blue Component": 0.63137254901960782, + "Green Component": 0.63137254901960782 + }, + "Ansi 2 Color": { + "Red Component": 0.52156862745098043, + "Color Space": "sRGB", + "Blue Component": 0, + "Green Component": 0.59999999999999998 + }, + "Send Code When Idle": false, + "ASCII Anti Aliased": true, + "Tags": [], + "Ansi 9 Color": { + "Red Component": 0.79607843137254897, + "Color Space": "sRGB", + "Blue Component": 0.086274509803921581, + "Green Component": 0.29411764705882354 + }, + "Use Bold Font": true, + "Silence Bell": false, + "Ansi 12 Color": { + "Red Component": 0.51372549019607838, + "Color Space": "sRGB", + "Blue Component": 0.58823529411764708, + "Green Component": 0.58039215686274515 + }, + "Window Type": 2, + "Use Bright Bold": true, + "Has Hotkey": true, + "HotKey Modifier Activation": 0, + "Cursor Text Color": { + "Red Component": 0.027450980392156866, + "Color Space": "sRGB", + "Blue Component": 0.25882352941176473, + "Green Component": 0.21176470588235294 + }, + "HotKey Window Dock Click Action": 2, + "Default Bookmark": "No", + "Cursor Color": { + "Red Component": 0.51372549019607838, + "Color Space": "sRGB", + "Blue Component": 0.58823529411764708, + "Green Component": 0.58039215686274515 + }, + "Ansi 1 Color": { + "Red Component": 0.86274509803921573, + "Color Space": "sRGB", + "Blue Component": 0.18431372549019609, + "Green Component": 0.19607843137254902 + }, + "Name": "Hotkey Window", + "Blinking Cursor": false, + "Guid": "FFC1C33A-B60E-4764-AAD6-BA97FFB9AB86", + "Idle Code": 0, + "Ansi 10 Color": { + "Red Component": 0.34509803921568627, + "Color Space": "sRGB", + "Blue Component": 0.45882352941176469, + "Green Component": 0.43137254901960786 + }, + "Ansi 8 Color": { + "Red Component": 0, + "Color Space": "sRGB", + "Blue Component": 0.21176470588235294, + "Green Component": 0.16862745098039217 + }, + "Badge Color": { + "Red Component": 1, + "Color Space": "sRGB", + "Blue Component": 0, + "Alpha Component": 0.5, + "Green Component": 0.1491314172744751 + }, + "Ambiguous Double Width": false, + "Blur Radius": 2, + "Ansi 0 Color": { + "Red Component": 0.027450980392156866, + "Color Space": "sRGB", + "Blue Component": 0.25882352941176473, + "Green Component": 0.21176470588235294 + }, + "Blur": true, + "Normal Font": "MesloLGLNerdFontComplete-Regular 14", + "Vertical Spacing": 1, + "Ansi 7 Color": { + "Red Component": 0.93333333333333335, + "Color Space": "sRGB", + "Blue Component": 0.83529411764705885, + "Green Component": 0.90980392156862744 + }, + "Space": -1, + "HotKey Window AutoHides": true, + "Command": "", + "Terminal Type": "xterm-256color", + "Horizontal Spacing": 1, + "Option Key Sends": 0, + "HotKey Window Animates": true, + "HotKey Modifier Flags": 1048576, + "Ansi 15 Color": { + "Red Component": 0.99215686274509807, + "Color Space": "sRGB", + "Blue Component": 0.8901960784313725, + "Green Component": 0.96470588235294119 + }, + "Ansi 6 Color": { + "Red Component": 0.16470588235294117, + "Color Space": "sRGB", + "Blue Component": 0.59607843137254901, + "Green Component": 0.63137254901960782 + }, + "Transparency": 0.070758645304568546, + "HotKey Activated By Modifier": false, + "Background Color": { + "Red Component": 0, + "Color Space": "sRGB", + "Blue Component": 0.21176470588235294, + "Green Component": 0.16862745098039217 + }, + "Screen": -1, + "Initial Use Transparency": true, + "HotKey Characters Ignoring Modifiers": "", + "Non Ascii Font": "Monaco 12", + "Ansi 13 Color": { + "Red Component": 0.42352941176470588, + "Color Space": "sRGB", + "Blue Component": 0.7686274509803922, + "Green Component": 0.44313725490196076 + }, + "Columns": 80, + "HotKey Alternate Shortcuts": [], + "Visual Bell": true, + "Custom Directory": "No", + "Ansi 5 Color": { + "Red Component": 0.82745098039215681, + "Color Space": "sRGB", + "Blue Component": 0.50980392156862742, + "Green Component": 0.21176470588235294 + } + } + ] +} \ No newline at end of file diff --git a/config/os/mac/restore_brew_source.sh b/config/os/mac/restore_brew_source.sh new file mode 100644 index 0000000..3b1bf38 --- /dev/null +++ b/config/os/mac/restore_brew_source.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +set +x + +# brew 程序本身,Homebrew/Linuxbrew 相同 +git -C "$(brew --repo)" remote set-url origin https://github.com/Homebrew/brew.git + +# 以下针对 mac OS 系统上的 Homebrew +git -C "$(brew --repo homebrew/core)" remote set-url origin https://github.com/Homebrew/homebrew-core.git +git -C "$(brew --repo homebrew/cask)" remote set-url origin https://github.com/Homebrew/homebrew-cask.git +git -C "$(brew --repo homebrew/cask-fonts)" remote set-url origin https://github.com/Homebrew/homebrew-cask-fonts.git +git -C "$(brew --repo homebrew/cask-drivers)" remote set-url origin https://github.com/Homebrew/homebrew-cask-drivers.git + +# 以下针对 Linux 系统上的 Linuxbrew +# git -C "$(brew --repo homebrew/core)" remote set-url origin https://github.com/Homebrew/linuxbrew-core.git diff --git a/config/os/mac/use_tsinghua_brew.sh b/config/os/mac/use_tsinghua_brew.sh new file mode 100644 index 0000000..89beb34 --- /dev/null +++ b/config/os/mac/use_tsinghua_brew.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +set +x + +if [[ ! -d $(brew --repo homebrew/cask-fonts) ]]; then + mkdir -p $(brew --repo homebrew/cask-fonts) +fi + +if [[ ! -d $(brew --repo homebrew/cask-drivers) ]]; then + mkdir -p $(brew --repo homebrew/cask-drivers) +fi + +if [[ ! -d $(brew --repo homebrew/cask) ]]; then + mkdir -p $(brew --repo homebrew/cask) +fi + +# brew 程序本身,Homebrew/Linuxbrew 相同 +git -C "$(brew --repo)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git + +# 以下针对 mac OS 系统上的 Homebrew +git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git +git -C "$(brew --repo homebrew/cask)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask.git +git -C "$(brew --repo homebrew/cask-fonts)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask-fonts.git +git -C "$(brew --repo homebrew/cask-drivers)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask-drivers.git + +# 以下针对 Linux 系统上的 Linuxbrew +# git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/linuxbrew-core.git diff --git a/config/pgsql/create.sql b/config/pgsql/create.sql new file mode 100644 index 0000000..2144562 --- /dev/null +++ b/config/pgsql/create.sql @@ -0,0 +1,103 @@ +CREATE OR REPLACE FUNCTION public.generate_create_table_statement(p_table_name character varying) + RETURNS SETOF text AS +$BODY$ +DECLARE + v_table_ddl text; + column_record record; + table_rec record; + constraint_rec record; + firstrec boolean; +BEGIN + FOR table_rec IN + SELECT c.relname + FROM pg_catalog.pg_class c + LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace + WHERE relkind = 'r' + AND relname~ ('^('||p_table_name||')$') + AND n.nspname <> 'pg_catalog' + AND n.nspname <> 'information_schema' + AND n.nspname !~ '^pg_toast' + AND pg_catalog.pg_table_is_visible(c.oid) + ORDER BY c.relname + LOOP + FOR column_record IN + SELECT + b.nspname as schema_name, + b.relname as table_name, + a.attname as column_name, + pg_catalog.format_type(a.atttypid, a.atttypmod) as column_type, + CASE WHEN + (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128) + FROM pg_catalog.pg_attrdef d + WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) IS NOT NULL THEN + 'DEFAULT '|| (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128) + FROM pg_catalog.pg_attrdef d + WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) + ELSE + '' + END as column_default_value, + CASE WHEN a.attnotnull = true THEN + 'NOT NULL' + ELSE + 'NULL' + END as column_not_null, + a.attnum as attnum, + e.max_attnum as max_attnum + FROM pg_catalog.pg_attribute a + INNER JOIN ( + SELECT c.oid, + n.nspname, + c.relname + FROM pg_catalog.pg_class c + LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace + WHERE c.relname = table_rec.relname + AND pg_catalog.pg_table_is_visible(c.oid) + ORDER BY 2, 3) b + ON a.attrelid = b.oid + INNER JOIN ( + SELECT + a.attrelid, + max(a.attnum) as max_attnum + FROM pg_catalog.pg_attribute a + WHERE a.attnum > 0 + AND NOT a.attisdropped + GROUP BY a.attrelid) e + ON a.attrelid=e.attrelid + WHERE a.attnum > 0 + AND NOT a.attisdropped + ORDER BY a.attnum + LOOP + IF column_record.attnum = 1 THEN + v_table_ddl:='CREATE TABLE '||column_record.schema_name||'.'||column_record.table_name||' ('; + ELSE + v_table_ddl:=v_table_ddl||','; + END IF; + + IF column_record.attnum <= column_record.max_attnum THEN + v_table_ddl:=v_table_ddl||chr(10)|| + ' '||column_record.column_name||' '||column_record.column_type||' '||column_record.column_default_value||' '||column_record.column_not_null; + END IF; + END LOOP; + + firstrec := TRUE; + FOR constraint_rec IN + SELECT conname, pg_get_constraintdef(c.oid) as constrainddef + FROM pg_constraint c + WHERE conrelid=( + SELECT attrelid FROM pg_attribute + WHERE attrelid = ( + SELECT oid FROM pg_class WHERE relname = table_rec.relname + ) AND attname='tableoid' + ) + LOOP + v_table_ddl:=v_table_ddl||','||chr(10); + v_table_ddl:=v_table_ddl||'CONSTRAINT '||constraint_rec.conname; + v_table_ddl:=v_table_ddl||chr(10)||' '||constraint_rec.constrainddef; + firstrec := FALSE; + END LOOP; + v_table_ddl:=v_table_ddl||');'; + RETURN NEXT v_table_ddl; + END LOOP; +END; +$BODY$ +LANGUAGE plpgsql VOLATILE COST 100; diff --git a/config/pgsql/pg14.conf b/config/pgsql/pg14.conf new file mode 100644 index 0000000..1f1a190 --- /dev/null +++ b/config/pgsql/pg14.conf @@ -0,0 +1,9 @@ +# PostgreSQL server configuration + +port = 5432 +max_connections = 50 + +log_connections = yes +log_destination = 'syslog' +search_path = '"$user", public' +shared_buffers = 128MB diff --git a/config/pgsql/pgcli.config b/config/pgsql/pgcli.config new file mode 100644 index 0000000..6c0155e --- /dev/null +++ b/config/pgsql/pgcli.config @@ -0,0 +1,212 @@ +# vi: ft=dosini +[main] + +# Enables context sensitive auto-completion. If this is disabled, all +# possible completions will be listed. +smart_completion = True + +# Display the completions in several columns. (More completions will be +# visible.) +wider_completion_menu = True + +# Multi-line mode allows breaking up the sql statements into multiple lines. If +# this is set to True, then the end of the statements must have a semi-colon. +# If this is set to False then sql statements can't be split into multiple +# lines. End of line (return) is considered as the end of the statement. +multi_line = True + +# If multi_line_mode is set to "psql", in multi-line mode, [Enter] will execute +# the current input if the input ends in a semicolon. +# If multi_line_mode is set to "safe", in multi-line mode, [Enter] will always +# insert a newline, and [Esc] [Enter] or [Alt]-[Enter] must be used to execute +# a command. +multi_line_mode = psql + +# Destructive warning mode will alert you before executing a sql statement +# that may cause harm to the database such as "drop table", "drop database", +# "shutdown", "delete", or "update". +# Possible values: +# "all" - warn on data definition statements, server actions such as SHUTDOWN, DELETE or UPDATE +# "moderate" - skip warning on UPDATE statements, except for unconditional updates +# "off" - skip all warnings +destructive_warning = all + +# Enables expand mode, which is similar to `\x` in psql. +expand = False + +# Enables auto expand mode, which is similar to `\x auto` in psql. +auto_expand = False + +# If set to True, table suggestions will include a table alias +generate_aliases = False + +# log_file location. +# In Unix/Linux: ~/.config/pgcli/log +# In Windows: %USERPROFILE%\AppData\Local\dbcli\pgcli\log +# %USERPROFILE% is typically C:\Users\{username} +log_file = default + +# keyword casing preference. Possible values: "lower", "upper", "auto" +keyword_casing = auto + +# casing_file location. +# In Unix/Linux: ~/.config/pgcli/casing +# In Windows: %USERPROFILE%\AppData\Local\dbcli\pgcli\casing +# %USERPROFILE% is typically C:\Users\{username} +casing_file = default + +# If generate_casing_file is set to True and there is no file in the above +# location, one will be generated based on usage in SQL/PLPGSQL functions. +generate_casing_file = False + +# Casing of column headers based on the casing_file described above +case_column_headers = True + +# history_file location. +# In Unix/Linux: ~/.config/pgcli/history +# In Windows: %USERPROFILE%\AppData\Local\dbcli\pgcli\history +# %USERPROFILE% is typically C:\Users\{username} +history_file = default + +# Default log level. Possible values: "CRITICAL", "ERROR", "WARNING", "INFO" +# and "DEBUG". "NONE" disables logging. +log_level = INFO + +# Order of columns when expanding * to column list +# Possible values: "table_order" and "alphabetic" +asterisk_column_order = table_order + +# Whether to qualify with table alias/name when suggesting columns +# Possible values: "always", "never" and "if_more_than_one_table" +qualify_columns = always + +# When no schema is entered, only suggest objects in search_path +search_path_filter = False + +# Default pager. +# By default 'PAGER' environment variable is used +# pager = less -SRXF + +# Timing of sql statements and table rendering. +timing = True + +# Show/hide the informational toolbar with function keymap at the footer. +show_bottom_toolbar = False + +# Table format. Possible values: psql, plain, simple, grid, fancy_grid, pipe, +# ascii, double, github, orgtbl, rst, mediawiki, html, latex, latex_booktabs, +# textile, moinmoin, jira, vertical, tsv, csv. +# Recommended: psql, fancy_grid and grid. +table_format = simple + +# Syntax Style. Possible values: manni, igor, xcode, vim, autumn, vs, rrt, +# native, perldoc, borland, tango, emacs, friendly, monokai, paraiso-dark, +# colorful, murphy, bw, pastie, paraiso-light, trac, default, fruity +syntax_style = vim + +# Keybindings: +# When Vi mode is enabled you can use modal editing features offered by Vi in the REPL. +# When Vi mode is disabled emacs keybindings such as Ctrl-A for home and Ctrl-E +# for end are available in the REPL. +vi = False + +# Error handling +# When one of multiple SQL statements causes an error, choose to either +# continue executing the remaining statements, or stopping +# Possible values "STOP" or "RESUME" +on_error = STOP + +# Set threshold for row limit. Use 0 to disable limiting. +row_limit = 1000 + +# Truncate long text fields to this value for tabular display (does not apply to csv). +# Leave unset to disable truncation. Example: "max_field_width = " +# Be aware that formatting might get slow with values larger than 500 and tables with +# lots of records. +max_field_width = 500 + +# Skip intro on startup and goodbye on exit +less_chatty = False + +# Postgres prompt +# \t - Current date and time +# \u - Username +# \h - Short hostname of the server (up to first '.') +# \H - Hostname of the server +# \d - Database name +# \p - Database port +# \i - Postgres PID +# \# - "@" sign if logged in as superuser, '>' in other case +# \n - Newline +# \dsn_alias - name of dsn alias if -D option is used (empty otherwise) +# \x1b[...m - insert ANSI escape sequence +# eg: prompt = '\x1b[35m\u@\x1b[32m\h:\x1b[36m\d>' +# prompt = '\u@\h:\d> ' +prompt = '\x1b[37m# \x1b[1;33mPostgreSQL \x1b[32m\u\x1b[37m@\x1b[34m\H\x1b[37m:\x1b[36m\p\x1b[37m/\x1b[31m\d \x1b[35m➜ ' + +# Number of lines to reserve for the suggestion menu +min_num_menu_lines = 4 + +# Character used to left pad multi-line queries to match the prompt size. +multiline_continuation_char = ' ' + +# The string used in place of a null value. +null_string = '' + +# manage pager on startup +enable_pager = True + +# Use keyring to automatically save and load password in a secure manner +keyring = True + +# Custom colors for the completion menu, toolbar, etc. +[colors] +completion-menu.completion.current = 'bg:#ffffff #000000' +completion-menu.completion = 'bg:#008888 #ffffff' +completion-menu.meta.completion.current = 'bg:#44aaaa #000000' +completion-menu.meta.completion = 'bg:#448888 #ffffff' +completion-menu.multi-column-meta = 'bg:#aaffff #000000' +scrollbar.arrow = 'bg:#003333' +scrollbar = 'bg:#00aaaa' +selected = '#ffffff bg:#6666aa' +search = '#ffffff bg:#4444aa' +search.current = '#ffffff bg:#44aa44' +bottom-toolbar = 'bg:#222222 #aaaaaa' +bottom-toolbar.off = 'bg:#222222 #888888' +bottom-toolbar.on = 'bg:#222222 #ffffff' +search-toolbar = 'noinherit bold' +search-toolbar.text = 'nobold' +system-toolbar = 'noinherit bold' +arg-toolbar = 'noinherit bold' +arg-toolbar.text = 'nobold' +bottom-toolbar.transaction.valid = 'bg:#222222 #00ff5f bold' +bottom-toolbar.transaction.failed = 'bg:#222222 #ff005f bold' +# These three values can be used to further refine the syntax highlighting. +# They are commented out by default, since they have priority over the theme set +# with the `syntax_style` setting and overriding its behavior can be confusing. +# literal.string = '#ba2121' +# literal.number = '#666666' +# keyword = 'bold #008000' + +# style classes for colored table output +output.header = "#00ff5f bold" +output.odd-row = "" +output.even-row = "" +output.null = "#808080" + +# Named queries are queries you can execute by name. +[named queries] + +# DSN to call by -D option +[alias_dsn] +# example_dsn = postgresql://[user[:password]@][netloc][:port][/dbname] +local-postgres = postgresql://postgres@127.0.0.1:5432 +local = postgresql://admin:gsEoWPxkWqHQMk3sK*2J@127.0.0.1:5432/test + +# Format for number representation +# for decimal "d" - 12345678, ",d" - 12,345,678 +# for float "g" - 123456.78, ",g" - 123,456.78 +[data_formats] +decimal = "" +float = "" + diff --git a/config/pgsql/postgresql.service b/config/pgsql/postgresql.service new file mode 100644 index 0000000..9120123 --- /dev/null +++ b/config/pgsql/postgresql.service @@ -0,0 +1,45 @@ +[Unit] +Description=PostgreSQL database server +Documentation=man:postgres(1) +After=network.target + +[Service] +Type=notify +TimeoutSec=120 +User=postgres +Group=postgres + +Environment=PGROOT=/data/postgres + +SyslogIdentifier=postgres +PIDFile=/data/postgres/postmaster.pid +RuntimeDirectory=postgresql +RuntimeDirectoryMode=755 + +ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGROOT}/data +ExecStart=/usr/bin/postgres -D ${PGROOT}/data +ExecReload=/bin/kill -HUP ${MAINPID} +KillMode=mixed +KillSignal=SIGINT + +# Due to PostgreSQL's use of shared memory, OOM killer is often overzealous in +# killing Postgres, so adjust it downward +OOMScoreAdjust=-200 + +# Additional security-related features +PrivateTmp=true +ProtectHome=true +ProtectSystem=full +NoNewPrivileges=true +ProtectControlGroups=true +ProtectKernelModules=true +ProtectKernelTunables=true +PrivateDevices=true +RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 +RestrictNamespaces=true +RestrictRealtime=true +SystemCallArchitectures=native + +[Install] +WantedBy=multi-user.target + diff --git a/config/pgsql/start-pg.sh b/config/pgsql/start-pg.sh new file mode 100755 index 0000000..66ebfed --- /dev/null +++ b/config/pgsql/start-pg.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +log=$HOME/.local/var/log/pg_server.log +data_path=$HOME/.local/var/postgres +# nohup postgres -D $data_path >$log 2>&1 +index-sort = true +wrapping-scroll = false + +; Only show workspaces on the same output as the bar +;pin-workspaces = true + +label-mode-padding = 2 +label-mode-foreground = #000 +label-mode-background = ${colors.primary} + +; focused = Active workspace on focused monitor +label-focused = %index% +label-focused-background = ${colors.background-alt} +label-focused-underline= ${colors.primary} +label-focused-padding = 2 + +; unfocused = Inactive workspace on any monitor +label-unfocused = %index% +label-unfocused-padding = 2 + +; visible = Active workspace on unfocused monitor +label-visible = %index% +label-visible-background = ${self.label-focused-background} +label-visible-underline = ${self.label-focused-underline} +label-visible-padding = ${self.label-focused-padding} + +; urgent = Workspace with urgency hint set +label-urgent = %index% +label-urgent-background = ${colors.alert} +label-urgent-padding = 2 + +; Separator in between workspaces +; label-separator = | + + +[module/mpd] +type = internal/mpd +format-online = + +icon-prev =  +icon-stop =  +icon-play =  +icon-pause =  +icon-next =  + +label-song-maxlen = 25 +label-song-ellipsis = true + +[module/xbacklight] +type = internal/xbacklight + +format =