From 3adcf542289a0883924ae9b9be8b898c36702c95 Mon Sep 17 00:00:00 2001
From: Sam Chudnick <sam@chudnick.com>
Date: Sun, 11 Jun 2023 07:54:59 -0400
Subject: Add some Vim plugins

---
 .vim/pack/css-color/start/css-color/.gitattributes |    5 +
 .vim/pack/css-color/start/css-color/README.md      |   16 +
 .../css-color/start/css-color/after/syntax/c.vim   |    1 +
 .../css-color/start/css-color/after/syntax/cfg.vim |    1 +
 .../start/css-color/after/syntax/clojure.vim       |    2 +
 .../css-color/start/css-color/after/syntax/csh.vim |    4 +
 .../css-color/start/css-color/after/syntax/css.vim |    1 +
 .../start/css-color/after/syntax/dosini.vim        |    1 +
 .../css-color/start/css-color/after/syntax/elm.vim |    1 +
 .../start/css-color/after/syntax/fish.vim          |    3 +
 .../css-color/start/css-color/after/syntax/go.vim  |    1 +
 .../start/css-color/after/syntax/html.vim          |    2 +
 .../css-color/start/css-color/after/syntax/i3.vim  |    4 +
 .../start/css-color/after/syntax/i3config.vim      |    3 +
 .../start/css-color/after/syntax/javascript.vim    |   14 +
 .../start/css-color/after/syntax/json.vim          |    1 +
 .../css-color/start/css-color/after/syntax/jsx.vim |    3 +
 .../start/css-color/after/syntax/kitty.vim         |    1 +
 .../start/css-color/after/syntax/less.vim          |    8 +
 .../start/css-color/after/syntax/moon.vim          |    1 +
 .../css-color/start/css-color/after/syntax/nix.vim |    2 +
 .../start/css-color/after/syntax/perl.vim          |    1 +
 .../css-color/start/css-color/after/syntax/php.vim |    1 +
 .../start/css-color/after/syntax/python.vim        |    1 +
 .../css-color/start/css-color/after/syntax/qml.vim |    1 +
 .../css-color/start/css-color/after/syntax/r.vim   |    1 +
 .../start/css-color/after/syntax/rasi.vim          |    4 +
 .../start/css-color/after/syntax/ruby.vim          |    1 +
 .../start/css-color/after/syntax/sass.vim          |    1 +
 .../start/css-color/after/syntax/scss.vim          |    1 +
 .../css-color/start/css-color/after/syntax/sh.vim  |    6 +
 .../start/css-color/after/syntax/stylus.vim        |    1 +
 .../start/css-color/after/syntax/tcsh.vim          |    4 +
 .../start/css-color/after/syntax/tmux.vim          |    1 +
 .../start/css-color/after/syntax/typescript.vim    |    6 +
 .../css-color/after/syntax/typescriptreact.vim     |    1 +
 .../start/css-color/after/syntax/vala.vim          |    1 +
 .../css-color/start/css-color/after/syntax/vim.vim |    1 +
 .../start/css-color/after/syntax/xdefaults.vim     |    1 +
 .../css-color/start/css-color/after/syntax/xml.vim |    1 +
 .../start/css-color/after/syntax/yaml.vim          |    1 +
 .../css-color/start/css-color/after/syntax/zsh.vim |    4 +
 .../start/css-color/autoload/css_color.vim         |  336 +++++
 .../start/css-color/syntax/colornames/basic.vim    |   47 +
 .../start/css-color/syntax/colornames/extended.vim |  290 ++++
 .vim/pack/css-color/start/css-color/tests/bench    |    6 +
 .../css-color/start/css-color/tests/example.csh    |   13 +
 .../css-color/start/css-color/tests/example.css    |   24 +
 .../css-color/start/css-color/tests/example.fish   |   10 +
 .../css-color/start/css-color/tests/example.jsx    |   11 +
 .../css-color/start/css-color/tests/example.less   |   24 +
 .../css-color/start/css-color/tests/example.nix    |   69 +
 .../css-color/start/css-color/tests/example.sass   |   25 +
 .../css-color/start/css-color/tests/example.scss   |   24 +
 .../css-color/start/css-color/tests/example.sh     |   26 +
 .../css-color/start/css-color/tests/example.stylus |   28 +
 .../css-color/start/css-color/tests/example.tcsh   |   13 +
 .../css-color/start/css-color/tests/example.ts     |   21 +
 .../css-color/start/css-color/tests/example.tsx    |   53 +
 .../css-color/start/css-color/tests/example.zsh    |   23 +
 .../css-color/start/css-color/tests/torture.css    |  256 ++++
 .../gruvbox/autoload/airline/themes/gruvbox.vim    |   79 +
 .../default/start/gruvbox/autoload/gruvbox.vim     |   41 +
 .../autoload/lightline/colorscheme/gruvbox.vim     |   57 +
 .vim/pack/default/start/gruvbox/colors/gruvbox.vim | 1418 ++++++++++++++++++
 .../default/start/gruvbox/gruvbox_256palette.sh    |  118 ++
 .../start/gruvbox/gruvbox_256palette_osx.sh        |  116 ++
 .../vendor/start/nerdtree/autoload/nerdtree.vim    |  249 ++++
 .../start/nerdtree/autoload/nerdtree/ui_glue.vim   |  732 ++++++++++
 .vim/pack/vendor/start/nerdtree/doc/NERDTree.txt   | 1534 ++++++++++++++++++++
 .vim/pack/vendor/start/nerdtree/doc/tags           |  143 ++
 .../start/nerdtree/lib/nerdtree/bookmark.vim       |  365 +++++
 .../vendor/start/nerdtree/lib/nerdtree/creator.vim |  402 +++++
 .../vendor/start/nerdtree/lib/nerdtree/event.vim   |   13 +
 .../start/nerdtree/lib/nerdtree/flag_set.vim       |   58 +
 .../vendor/start/nerdtree/lib/nerdtree/key_map.vim |  164 +++
 .../nerdtree/lib/nerdtree/menu_controller.vim      |  211 +++
 .../start/nerdtree/lib/nerdtree/menu_item.vim      |  118 ++
 .../start/nerdtree/lib/nerdtree/nerdtree.vim       |  209 +++
 .../start/nerdtree/lib/nerdtree/notifier.vim       |   35 +
 .../vendor/start/nerdtree/lib/nerdtree/opener.vim  |  326 +++++
 .../vendor/start/nerdtree/lib/nerdtree/path.vim    |  852 +++++++++++
 .../start/nerdtree/lib/nerdtree/tree_dir_node.vim  |  706 +++++++++
 .../start/nerdtree/lib/nerdtree/tree_file_node.vim |  349 +++++
 .../pack/vendor/start/nerdtree/lib/nerdtree/ui.vim |  532 +++++++
 .../nerdtree/nerdtree_plugin/exec_menuitem.vim     |   40 +
 .../start/nerdtree/nerdtree_plugin/fs_menu.vim     |  484 ++++++
 .../vendor/start/nerdtree/nerdtree_plugin/vcs.vim  |   47 +
 .../vendor/start/nerdtree/plugin/NERD_tree.vim     |  234 +++
 .../pack/vendor/start/nerdtree/syntax/nerdtree.vim |   97 ++
 .../extensions/tabline/formatters/webdevicons.vim  |   14 +
 .../autoload/devicons/plugins/ctrlp.vim            |   30 +
 .../autoload/devicons/plugins/denite.vim           |   10 +
 .../autoload/devicons/plugins/flagship.vim         |   15 +
 .../autoload/devicons/plugins/startify.vim         |    6 +
 .../autoload/devicons/plugins/unite.vim            |   37 +
 .../autoload/devicons/plugins/vimfiler.vim         |    8 +
 .../autoload/vimfiler/columns/devicons.vim         |   80 +
 .../vendor/start/vim-devicons/doc/webdevicons.txt  | 1078 ++++++++++++++
 .../vim-devicons/nerdtree_plugin/webdevicons.vim   |  389 +++++
 .../start/vim-devicons/plugin/webdevicons.vim      |  703 +++++++++
 .../vim-devicons/pythonx/vim_devicons/__init__.py  |    2 +
 .../pythonx/vim_devicons/powerline/__init__.py     |    2 +
 .../pythonx/vim_devicons/powerline/segments.py     |   28 +
 .../denite/filter/devicons_denite_converter.py     |   31 +
 .vim/pack/vendor/start/vim-devicons/test/.themisrc |    1 +
 .../start/vim-devicons/test/default_setting.vim    |   39 +
 .../vendor/start/vim-devicons/test/fileformat.vim  |   29 +
 .../vendor/start/vim-devicons/test/filetype.vim    |  344 +++++
 .vim/plugin/python_autopep8.vim                    |  174 +++
 .vim/vimrc                                         |   57 +-
 111 files changed, 14206 insertions(+), 14 deletions(-)
 create mode 100644 .vim/pack/css-color/start/css-color/.gitattributes
 create mode 100644 .vim/pack/css-color/start/css-color/README.md
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/c.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/cfg.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/clojure.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/csh.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/css.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/dosini.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/elm.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/fish.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/go.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/html.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/i3.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/i3config.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/javascript.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/json.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/jsx.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/kitty.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/less.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/moon.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/nix.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/perl.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/php.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/python.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/qml.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/r.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/rasi.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/ruby.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/sass.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/scss.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/sh.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/stylus.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/tcsh.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/tmux.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/typescript.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/typescriptreact.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/vala.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/vim.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/xdefaults.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/xml.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/yaml.vim
 create mode 100644 .vim/pack/css-color/start/css-color/after/syntax/zsh.vim
 create mode 100644 .vim/pack/css-color/start/css-color/autoload/css_color.vim
 create mode 100644 .vim/pack/css-color/start/css-color/syntax/colornames/basic.vim
 create mode 100644 .vim/pack/css-color/start/css-color/syntax/colornames/extended.vim
 create mode 100755 .vim/pack/css-color/start/css-color/tests/bench
 create mode 100644 .vim/pack/css-color/start/css-color/tests/example.csh
 create mode 100644 .vim/pack/css-color/start/css-color/tests/example.css
 create mode 100644 .vim/pack/css-color/start/css-color/tests/example.fish
 create mode 100644 .vim/pack/css-color/start/css-color/tests/example.jsx
 create mode 100644 .vim/pack/css-color/start/css-color/tests/example.less
 create mode 100644 .vim/pack/css-color/start/css-color/tests/example.nix
 create mode 100644 .vim/pack/css-color/start/css-color/tests/example.sass
 create mode 100644 .vim/pack/css-color/start/css-color/tests/example.scss
 create mode 100644 .vim/pack/css-color/start/css-color/tests/example.sh
 create mode 100644 .vim/pack/css-color/start/css-color/tests/example.stylus
 create mode 100644 .vim/pack/css-color/start/css-color/tests/example.tcsh
 create mode 100644 .vim/pack/css-color/start/css-color/tests/example.ts
 create mode 100644 .vim/pack/css-color/start/css-color/tests/example.tsx
 create mode 100644 .vim/pack/css-color/start/css-color/tests/example.zsh
 create mode 100644 .vim/pack/css-color/start/css-color/tests/torture.css
 create mode 100644 .vim/pack/default/start/gruvbox/autoload/airline/themes/gruvbox.vim
 create mode 100644 .vim/pack/default/start/gruvbox/autoload/gruvbox.vim
 create mode 100644 .vim/pack/default/start/gruvbox/autoload/lightline/colorscheme/gruvbox.vim
 create mode 100644 .vim/pack/default/start/gruvbox/colors/gruvbox.vim
 create mode 100755 .vim/pack/default/start/gruvbox/gruvbox_256palette.sh
 create mode 100755 .vim/pack/default/start/gruvbox/gruvbox_256palette_osx.sh
 create mode 100644 .vim/pack/vendor/start/nerdtree/autoload/nerdtree.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/autoload/nerdtree/ui_glue.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/doc/NERDTree.txt
 create mode 100644 .vim/pack/vendor/start/nerdtree/doc/tags
 create mode 100644 .vim/pack/vendor/start/nerdtree/lib/nerdtree/bookmark.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/lib/nerdtree/creator.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/lib/nerdtree/event.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/lib/nerdtree/flag_set.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/lib/nerdtree/key_map.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/lib/nerdtree/menu_controller.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/lib/nerdtree/menu_item.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/lib/nerdtree/nerdtree.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/lib/nerdtree/notifier.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/lib/nerdtree/opener.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/lib/nerdtree/path.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/lib/nerdtree/tree_dir_node.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/lib/nerdtree/tree_file_node.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/lib/nerdtree/ui.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/nerdtree_plugin/exec_menuitem.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/nerdtree_plugin/fs_menu.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/nerdtree_plugin/vcs.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/plugin/NERD_tree.vim
 create mode 100644 .vim/pack/vendor/start/nerdtree/syntax/nerdtree.vim
 create mode 100644 .vim/pack/vendor/start/vim-devicons/autoload/airline/extensions/tabline/formatters/webdevicons.vim
 create mode 100644 .vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/ctrlp.vim
 create mode 100644 .vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/denite.vim
 create mode 100644 .vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/flagship.vim
 create mode 100644 .vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/startify.vim
 create mode 100644 .vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/unite.vim
 create mode 100644 .vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/vimfiler.vim
 create mode 100644 .vim/pack/vendor/start/vim-devicons/autoload/vimfiler/columns/devicons.vim
 create mode 100644 .vim/pack/vendor/start/vim-devicons/doc/webdevicons.txt
 create mode 100644 .vim/pack/vendor/start/vim-devicons/nerdtree_plugin/webdevicons.vim
 create mode 100644 .vim/pack/vendor/start/vim-devicons/plugin/webdevicons.vim
 create mode 100644 .vim/pack/vendor/start/vim-devicons/pythonx/vim_devicons/__init__.py
 create mode 100644 .vim/pack/vendor/start/vim-devicons/pythonx/vim_devicons/powerline/__init__.py
 create mode 100644 .vim/pack/vendor/start/vim-devicons/pythonx/vim_devicons/powerline/segments.py
 create mode 100644 .vim/pack/vendor/start/vim-devicons/rplugin/python3/denite/filter/devicons_denite_converter.py
 create mode 100644 .vim/pack/vendor/start/vim-devicons/test/.themisrc
 create mode 100644 .vim/pack/vendor/start/vim-devicons/test/default_setting.vim
 create mode 100644 .vim/pack/vendor/start/vim-devicons/test/fileformat.vim
 create mode 100644 .vim/pack/vendor/start/vim-devicons/test/filetype.vim
 create mode 100644 .vim/plugin/python_autopep8.vim

diff --git a/.vim/pack/css-color/start/css-color/.gitattributes b/.vim/pack/css-color/start/css-color/.gitattributes
new file mode 100644
index 0000000..5632fd9
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/.gitattributes
@@ -0,0 +1,5 @@
+/autoload/css_color.vim export-subst
+/.gitattributes         export-ignore
+/README.md              export-ignore
+/LICENSE                export-ignore
+/tests                  export-ignore
diff --git a/.vim/pack/css-color/start/css-color/README.md b/.vim/pack/css-color/start/css-color/README.md
new file mode 100644
index 0000000..77b2540
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/README.md
@@ -0,0 +1,16 @@
+<h1 align="center">CSS Color</h1>
+
+<div align="center">
+A very fast, multi-syntax context-sensitive color name highlighter<br>
+<img src="https://raw.githubusercontent.com/ap/vim-css-color/5377c65022ee6d660b898bad954aeea73fa613b8/screenshot.png" width="763">
+
+<sub>
+<pre><code>#  <b>Install</b>:  If you use a plugin manager then follow its instructions.  Otherwise:     
+git clone https://github.com/ap/vim-css-color.git ~/.vim/pack/css-color/start/css-color</code></pre>
+</sub><br>
+
+</div>
+
+<sub>Inspired
+by  [Niklas Hofer](http://www.vim.org/scripts/script.php?script_id=2150)
+and [Max Vasiliev](https://github.com/skammer/vim-css-color).</sub>
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/c.vim b/.vim/pack/css-color/start/css-color/after/syntax/c.vim
new file mode 100644
index 0000000..d87f75d
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/c.vim
@@ -0,0 +1 @@
+call css_color#init('hex', 'none', 'cComment,cCommentL,cString,cCppString')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/cfg.vim b/.vim/pack/css-color/start/css-color/after/syntax/cfg.vim
new file mode 100644
index 0000000..9261fc0
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/cfg.vim
@@ -0,0 +1 @@
+call css_color#init('hex', 'none', 'CfgComment,CfgString')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/clojure.vim b/.vim/pack/css-color/start/css-color/after/syntax/clojure.vim
new file mode 100644
index 0000000..c708985
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/clojure.vim
@@ -0,0 +1,2 @@
+let [type, keywords] = expand('%:e') ==? 'cljs' ? ['css', 'extended'] : ['hex', 'none']
+call css_color#init(type, keywords, 'clojureComment,clojureString')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/csh.vim b/.vim/pack/css-color/start/css-color/after/syntax/csh.vim
new file mode 100644
index 0000000..2ce84d0
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/csh.vim
@@ -0,0 +1,4 @@
+syn match cshCommentColor contained '\(#[^#]*\)\@<=\zs#\x\{3}\%(\x\{3}\)\?\>' containedin=cshComment
+call css_color#init( 'hex', 'none'
+	\, 'cshDblQuote,cshSnglQuote,cshHereDoc,'
+	\. 'cshCommentColor' )
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/css.vim b/.vim/pack/css-color/start/css-color/after/syntax/css.vim
new file mode 100644
index 0000000..1b45f23
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/css.vim
@@ -0,0 +1 @@
+call css_color#init('css', 'extended', 'cssMediaBlock,cssFunction,cssDefinition,cssAttrRegion,cssComment')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/dosini.vim b/.vim/pack/css-color/start/css-color/after/syntax/dosini.vim
new file mode 100644
index 0000000..102bc91
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/dosini.vim
@@ -0,0 +1 @@
+call css_color#init('hex', 'none', 'dosiniValue')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/elm.vim b/.vim/pack/css-color/start/css-color/after/syntax/elm.vim
new file mode 100644
index 0000000..9e60d62
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/elm.vim
@@ -0,0 +1 @@
+call css_color#init('hex', 'none', 'elmLineComment,elmString')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/fish.vim b/.vim/pack/css-color/start/css-color/after/syntax/fish.vim
new file mode 100644
index 0000000..f0e7db9
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/fish.vim
@@ -0,0 +1,3 @@
+" https://github.com/dag/vim-fish (and presumably its various forks)
+syn match fishCommentColor contained '\(#[^#]*\)\@<=\zs#\x\{3}\%(\x\{3}\)\?\>' containedin=fishComment
+call css_color#init( 'hex', 'none', 'fishString,fishCommentColor' )
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/go.vim b/.vim/pack/css-color/start/css-color/after/syntax/go.vim
new file mode 100644
index 0000000..24a8c45
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/go.vim
@@ -0,0 +1 @@
+call css_color#init('hex', 'none', 'goComment,goString,goRawString')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/html.vim b/.vim/pack/css-color/start/css-color/after/syntax/html.vim
new file mode 100644
index 0000000..5452276
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/html.vim
@@ -0,0 +1,2 @@
+" default html syntax should already be including the css syntax
+call css_color#init('none', 'none', 'htmlString,htmlCommentPart')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/i3.vim b/.vim/pack/css-color/start/css-color/after/syntax/i3.vim
new file mode 100644
index 0000000..e56050f
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/i3.vim
@@ -0,0 +1,4 @@
+" see also: i3config.vim for the stock Vim 8.2+ syntax
+" Colour => https://github.com/moon-musick/vim-i3-config-syntax
+" i3*    => https://github.com/PotatoesMaster/i3-vim-syntax
+call css_color#init('hex', 'none', 'Colour,i3SimpleString,i3Color1st,i3Color2nd,i3ColorLast')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/i3config.vim b/.vim/pack/css-color/start/css-color/after/syntax/i3config.vim
new file mode 100644
index 0000000..5043952
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/i3config.vim
@@ -0,0 +1,3 @@
+" i3ConfigColor => stock Vim syntax and recent https://github.com/mboughaba/i3config.vim
+" Color         => https://github.com/mboughaba/i3config.vim prior to dff3b177ebaf6aae35591cd4c9c734fff9ed7145
+call css_color#init('hex', 'none', 'i3ConfigColor,Color')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/javascript.vim b/.vim/pack/css-color/start/css-color/after/syntax/javascript.vim
new file mode 100644
index 0000000..84558ac
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/javascript.vim
@@ -0,0 +1,14 @@
+" ft=coffee includes javascript, but mostly sets up own syntax groups
+" so until it has specific support there's no point in loading anyway
+" and for some reason the W3C syntax color keywords break its highlighting
+" (this refers to the https://github.com/kchmck/vim-coffee-script plugin)
+if &syntax =~# '\(^\|\.\)coffee\($\|\.\)' | finish | endif
+
+" javaScriptX = default Vim syntax
+" jsX         = https://github.com/pangloss/vim-javascript
+" javascriptX = https://github.com/othree/yajs.vim
+call css_color#init('hex', 'extended'
+	\,  'javaScriptComment,javaScriptLineComment,javaScriptStringS,javaScriptStringD,javaScriptStringT'
+	\. ',jsComment,jsString,jsTemplateString,jsObjectKeyString,jsObjectStringKey,jsClassStringKey'
+	\. ',javascriptComment,javascriptLineComment,javascriptLineComment,javascriptString,javascriptTemplate'
+	\)
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/json.vim b/.vim/pack/css-color/start/css-color/after/syntax/json.vim
new file mode 100644
index 0000000..f7b5fad
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/json.vim
@@ -0,0 +1 @@
+call css_color#init('css', 'none', 'jsonString')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/jsx.vim b/.vim/pack/css-color/start/css-color/after/syntax/jsx.vim
new file mode 100644
index 0000000..322bc49
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/jsx.vim
@@ -0,0 +1,3 @@
+" jsx syntax should already be including the javascript and xml syntaxes
+" but those only use `hex` parsing; JSX needs `css` for inline CSS styles
+call css_color#init('css', 'none', '')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/kitty.vim b/.vim/pack/css-color/start/css-color/after/syntax/kitty.vim
new file mode 100644
index 0000000..94dd425
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/kitty.vim
@@ -0,0 +1 @@
+call css_color#init('hex', 'none', 'kittyColor,kittyComment')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/less.vim b/.vim/pack/css-color/start/css-color/after/syntax/less.vim
new file mode 100644
index 0000000..0f39b91
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/less.vim
@@ -0,0 +1,8 @@
+" variable               | property       | multiline      | end-of-line | plugin
+" -----------------------+----------------+----------------+-------------+---------
+"                lessCssAttribute         | lessCssComment | lessComment | https://github.com/genoma/vim-less
+"                 lessAttribute           | lessCssComment | lessComment | https://github.com/KohPoll/vim-less
+" lessVariableValue      | lessDefinition | cssComment     | lessComment | https://github.com/groenewege/vim-less
+" lessVariableDefinition | cssDefinition  | cssComment     | lessComment | https://github.com/lunaru/vim-less
+
+call css_color#init('css', 'extended', 'lessVariableValue,lessVariableDefinition,lessDefinition,lessCssAttribute,lessAttribute,cssDefinition,cssComment,lessCssComment,lessComment')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/moon.vim b/.vim/pack/css-color/start/css-color/after/syntax/moon.vim
new file mode 100644
index 0000000..cb32815
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/moon.vim
@@ -0,0 +1 @@
+call css_color#init('hex', 'extended', 'moonComment,moonString')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/nix.vim b/.vim/pack/css-color/start/css-color/after/syntax/nix.vim
new file mode 100644
index 0000000..d2ffdbb
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/nix.vim
@@ -0,0 +1,2 @@
+" https://github.com/LnL7/vim-nix
+call css_color#init('hex', 'none', 'nixComment,nixString,nixSimpleString')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/perl.vim b/.vim/pack/css-color/start/css-color/after/syntax/perl.vim
new file mode 100644
index 0000000..09f57e8
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/perl.vim
@@ -0,0 +1 @@
+call css_color#init('hex', 'none', 'perlComment,perlDATA,perlString,perlStringUnexpanded,perlQQ,perlHereDoc')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/php.vim b/.vim/pack/css-color/start/css-color/after/syntax/php.vim
new file mode 100644
index 0000000..7c86eb3
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/php.vim
@@ -0,0 +1 @@
+call css_color#init('css', 'basic', 'phpComment,phpStringSingle,phpStringDouble')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/python.vim b/.vim/pack/css-color/start/css-color/after/syntax/python.vim
new file mode 100644
index 0000000..08104d7
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/python.vim
@@ -0,0 +1 @@
+call css_color#init('hex', 'none', 'pythonComment,pythonString')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/qml.vim b/.vim/pack/css-color/start/css-color/after/syntax/qml.vim
new file mode 100644
index 0000000..5503f20
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/qml.vim
@@ -0,0 +1 @@
+call css_color#init('css', 'extended', 'qmlStringD')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/r.vim b/.vim/pack/css-color/start/css-color/after/syntax/r.vim
new file mode 100644
index 0000000..32ae58b
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/r.vim
@@ -0,0 +1 @@
+call css_color#init('hex', 'extended', 'rComment,rString')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/rasi.vim b/.vim/pack/css-color/start/css-color/after/syntax/rasi.vim
new file mode 100644
index 0000000..103a9ea
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/rasi.vim
@@ -0,0 +1,4 @@
+" https://github.com/Fymyte/rasi.vim
+call css_color#init('css', 'extended'
+    \,  'rasiHexColor,rasiRGBColor,rasiRGBAColor,rasiHSLColor,rasiHSLAColor,rasiNamedColor'
+    \. ',rasiPropertyVal,rasiComment,rasiCommentL,rasiEnvVar,rasiVarReference')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/ruby.vim b/.vim/pack/css-color/start/css-color/after/syntax/ruby.vim
new file mode 100644
index 0000000..5a930a6
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/ruby.vim
@@ -0,0 +1 @@
+call css_color#init('hex', 'none', 'rubyComment,rubyData,rubyString')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/sass.vim b/.vim/pack/css-color/start/css-color/after/syntax/sass.vim
new file mode 100644
index 0000000..79f8bc0
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/sass.vim
@@ -0,0 +1 @@
+call css_color#init('css', 'extended', 'sassCssAttribute,sassComment,sassCssComment')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/scss.vim b/.vim/pack/css-color/start/css-color/after/syntax/scss.vim
new file mode 100644
index 0000000..57569b1
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/scss.vim
@@ -0,0 +1 @@
+call css_color#init('css', 'extended', 'scssAttribute,scssComment,scssVariableValue,scssMap,scssMapValue,sassCssAttribute,cssComment')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/sh.vim b/.vim/pack/css-color/start/css-color/after/syntax/sh.vim
new file mode 100644
index 0000000..8d7d618
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/sh.vim
@@ -0,0 +1,6 @@
+syn match shCommentColor contained '\(#[^#]*\)\@<=\zs#\x\{3}\%(\x\{3}\)\?\>' containedin=shQuickComment,shBQComment,shComment
+call css_color#init( 'hex', 'none'
+	\, 'shSingleQuote,shDoubleQuote,shHereDoc,'
+	\. 'shTestSingleQuote,shTestDoubleQuote,'
+	\. 'shEchoQuote,shEmbeddedEcho,shEcho,'
+	\. 'shCommentColor' )
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/stylus.vim b/.vim/pack/css-color/start/css-color/after/syntax/stylus.vim
new file mode 100644
index 0000000..0aca85e
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/stylus.vim
@@ -0,0 +1 @@
+call css_color#init('css', 'extended', 'stylusCssAttribute,stylusComment,cssComment')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/tcsh.vim b/.vim/pack/css-color/start/css-color/after/syntax/tcsh.vim
new file mode 100644
index 0000000..ce7db7d
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/tcsh.vim
@@ -0,0 +1,4 @@
+syn match tcshCommentColor contained '\(#[^#]*\)\@<=\zs#\x\{3}\%(\x\{3}\)\?\>' containedin=tcshComment
+call css_color#init( 'hex', 'none'
+	\, 'tcshSQuote,tcshDQuote,tcshHereDoc,'
+	\. 'tcshCommentColor' )
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/tmux.vim b/.vim/pack/css-color/start/css-color/after/syntax/tmux.vim
new file mode 100644
index 0000000..666f16c
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/tmux.vim
@@ -0,0 +1 @@
+call css_color#init('css', 'none', 'tmuxString,tmuxComment')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/typescript.vim b/.vim/pack/css-color/start/css-color/after/syntax/typescript.vim
new file mode 100644
index 0000000..301425d
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/typescript.vim
@@ -0,0 +1,6 @@
+" https://github.com/HerringtonDarkholme/yats.vim (stock Vim syntax)
+" https://github.com/leafgarland/typescript-vim
+call css_color#init('css', 'extended'
+ \, 'typescriptString,typescriptStringProperty,typescriptStringS,typescriptStringD,typescriptStringB,'
+ \. 'typescriptComment,typescriptLineComment,typescriptCommentSkip,typescriptDocComment'
+ \)
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/typescriptreact.vim b/.vim/pack/css-color/start/css-color/after/syntax/typescriptreact.vim
new file mode 100644
index 0000000..da45708
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/typescriptreact.vim
@@ -0,0 +1 @@
+runtime after/syntax/typescript.vim
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/vala.vim b/.vim/pack/css-color/start/css-color/after/syntax/vala.vim
new file mode 100644
index 0000000..8b7b104
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/vala.vim
@@ -0,0 +1 @@
+call css_color#init('hex', 'extended', 'valaString')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/vim.vim b/.vim/pack/css-color/start/css-color/after/syntax/vim.vim
new file mode 100644
index 0000000..bcb1986
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/vim.vim
@@ -0,0 +1 @@
+call css_color#init('hex', 'none', 'vimHiGuiRgb,vimString,vimComment,vimLineComment')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/xdefaults.vim b/.vim/pack/css-color/start/css-color/after/syntax/xdefaults.vim
new file mode 100644
index 0000000..e15ceb5
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/xdefaults.vim
@@ -0,0 +1 @@
+call css_color#init('hex', 'extended', 'xdefaultsValue')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/xml.vim b/.vim/pack/css-color/start/css-color/after/syntax/xml.vim
new file mode 100644
index 0000000..a6e11fa
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/xml.vim
@@ -0,0 +1 @@
+call css_color#init('hex', 'none', 'xmlComment,xmlCommentPart,xmlString')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/yaml.vim b/.vim/pack/css-color/start/css-color/after/syntax/yaml.vim
new file mode 100644
index 0000000..2193fa2
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/yaml.vim
@@ -0,0 +1 @@
+call css_color#init('hex', 'extended', 'yamlComment,yamlFlowString,yamlPlainScalar')
diff --git a/.vim/pack/css-color/start/css-color/after/syntax/zsh.vim b/.vim/pack/css-color/start/css-color/after/syntax/zsh.vim
new file mode 100644
index 0000000..8f89ebb
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/after/syntax/zsh.vim
@@ -0,0 +1,4 @@
+syn match zshCommentColor contained '\(#[^#]*\)\@<=\zs#\x\{3}\%(\x\{3}\)\?\>' containedin=zshComment
+call css_color#init( 'hex', 'none'
+	\, 'zshString,zshPOSIXString,zshHereDoc,'
+	\. 'zshCommentColor' )
diff --git a/.vim/pack/css-color/start/css-color/autoload/css_color.vim b/.vim/pack/css-color/start/css-color/autoload/css_color.vim
new file mode 100644
index 0000000..b5a0dc4
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/autoload/css_color.vim
@@ -0,0 +1,336 @@
+" Language:     Colorful CSS Color Preview
+" Author:       Aristotle Pagaltzis <pagaltzis@gmx.de>
+" Commit:       $Format:%H$
+" Licence:      The MIT License (MIT)
+
+if ! ( v:version >= 700 && has('syntax') && ( has('gui_running') || has('nvim') || &t_Co == 256 ) )
+	function! css_color#init(type, keywords, groups)
+	endfunction
+	function! css_color#extend(groups)
+	endfunction
+	finish
+endif
+
+function! s:rgb2color(r,g,b)
+	" Convert 80% -> 204, 100% -> 255, etc.
+	let rgb = map( [a:r,a:g,a:b], 'v:val =~ "%$" ? ( 255 * v:val ) / 100 : v:val' )
+	return printf( '%02x%02x%02x', rgb[0], rgb[1], rgb[2] )
+endfunction
+
+function! s:hsl2color(h,s,l)
+	" Convert 80% -> 0.8, 100% -> 1.0, etc.
+	let [s,l] = map( [a:s, a:l], 'v:val =~ "%$" ? v:val / 100.0 : v:val + 0.0' )
+	" algorithm transcoded to vim from http://www.w3.org/TR/css3-color/#hsl-color
+	let hh = ( a:h % 360 ) / 360.0
+	let m2 = l <= 0.5 ? l * ( s + 1 ) : l + s - l * s
+	let m1 = l * 2 - m2
+	let rgb = []
+	for h in [ hh + (1/3.0), hh, hh - (1/3.0) ]
+		let h = h < 0 ? h + 1 : h > 1 ? h - 1 : h
+		let v =
+			\ h * 6 < 1 ? m1 + ( m2 - m1 ) * h * 6 :
+			\ h * 2 < 1 ? m2 :
+			\ h * 3 < 2 ? m1 + ( m2 - m1 ) * ( 2/3.0 - h ) * 6 :
+			\ m1
+		if v > 1.0 | return '' | endif
+		let rgb += [ float2nr( 255 * v ) ]
+	endfor
+	return printf( '%02x%02x%02x', rgb[0], rgb[1], rgb[2] )
+endfunction
+
+let s:_1_3 = 1.0/3
+let s:_16_116 = 16.0/116.0
+let s:cos16 = cos(16*(180/atan2(0,-1)))
+let s:sin16 = sin(16*(180/atan2(0,-1)))
+
+function s:rgb2din99(rgb)
+	let [r,g,b] = map( copy(a:rgb), 'v:val > 0.04045 ? pow((v:val + 0.055) / 1.055, 2.4) : v:val / 12.92' )
+
+	let x = r * 0.4124 + g * 0.3576 + b * 0.1805
+	let y = r * 0.2126 + g * 0.7152 + b * 0.0722
+	let z = r * 0.0193 + g * 0.1192 + b * 0.9505
+
+	" Observer 2°, Illuminant D65
+	let x = ( x * 100 ) /  95.0489
+	let z = ( z * 100 ) / 108.8840
+
+	let [x,y,z] = map( [x,y,z], 'v:val > 0.008856 ? pow(v:val, s:_1_3) : 7.787 * v:val + s:_16_116' )
+
+	let [L,a,b] = [ (116 * y) - 16, 500 * (x - y), 200 * (y - z) ]
+
+	let L99 = 105.51 * log(1 + 0.0158 * L)
+
+	let e =        a * s:cos16 + b * s:sin16
+	let f = 0.7 * (b * s:cos16 - a * s:sin16)
+
+	let g = 0.045 * sqrt(e*e + f*f)
+	if g == 0
+		let [a99, b99] = [0.0, 0.0]
+	else
+		let k = log(1 + g) / g
+		let a99 = k * e
+		let b99 = k * f
+	endif
+
+	return [L99, a99, b99]
+endfunction
+
+let s:hex={}
+for i in range(0, 255)
+	let s:hex[ printf( '%02x', i ) ] = i
+endfor
+
+let s:exe=[]
+function! s:flush_exe()
+	if len(s:exe) | exe join( remove( s:exe, 0, -1 ), ' | ' ) | endif
+endfunction
+
+if has('gui_running')
+	function! s:create_highlight(color, is_bright)
+		call add( s:exe, 'hi BG'.a:color.' guibg=#'.a:color.' guifg=#'.( a:is_bright ? '000000' : 'ffffff' ) )
+	endfunction
+else
+	" preset 16 vt100 colors
+	let s:xtermcolor = [
+		\ [ 0x00, 0x00, 0x00 ],
+		\ [ 0xCD, 0x00, 0x00 ],
+		\ [ 0x00, 0xCD, 0x00 ],
+		\ [ 0xCD, 0xCD, 0x00 ],
+		\ [ 0x00, 0x00, 0xEE ],
+		\ [ 0xCD, 0x00, 0xCD ],
+		\ [ 0x00, 0xCD, 0xCD ],
+		\ [ 0xE5, 0xE5, 0xE5 ],
+		\ [ 0x7F, 0x7F, 0x7F ],
+		\ [ 0xFF, 0x00, 0x00 ],
+		\ [ 0x00, 0xFF, 0x00 ],
+		\ [ 0xFF, 0xFF, 0x00 ],
+		\ [ 0x5C, 0x5C, 0xFF ],
+		\ [ 0xFF, 0x00, 0xFF ],
+		\ [ 0x00, 0xFF, 0xFF ],
+		\ [ 0xFF, 0xFF, 0xFF ]]
+
+	" the 6 values used in the xterm color cube
+	"                    0    95   135   175   215   255
+	let s:cubergb = [ 0x00, 0x5F, 0x87, 0xAF, 0xD7, 0xFF ]
+	for s:rrr in s:cubergb
+		for s:ggg in s:cubergb
+			for s:bbb in s:cubergb
+				call add( s:xtermcolor, [ s:rrr, s:ggg, s:bbb ] )
+			endfor
+		endfor
+	endfor
+
+	" grayscale ramp
+	let s:xtermcolor += map( range(24), 'repeat( [10 * v:val + 8], 3 )' )
+
+	for idx in range(len(s:xtermcolor))
+		let s:xtermcolor[idx] = s:rgb2din99( map(s:xtermcolor[idx], 'v:val / 255.0') )
+	endfor
+
+	" selects the nearest xterm color for a rgb value like #FF0000
+	function! s:rgb2xterm(color)
+		let best_match=0
+		let smallest_distance = 10000000000
+		let color = tolower(a:color)
+		let r = s:hex[color[0:1]]
+		let g = s:hex[color[2:3]]
+		let b = s:hex[color[4:5]]
+
+		let [L1,a1,b1] = s:rgb2din99([ r/255.0, g/255.0, b/255.0 ])
+
+		for idx in range(len(s:xtermcolor))
+			let [L2,a2,b2] = s:xtermcolor[idx]
+			let dL = L1 - L2
+			let da = a1 - a2
+			let db = b1 - b2
+			let distance = dL*dL + da*da + db*db
+			if distance == 0 | return idx | endif
+			if distance > smallest_distance | continue | endif
+			let smallest_distance = distance
+			let best_match = idx
+		endfor
+		return best_match
+	endfunction
+
+	let s:color_idx = {}
+	function! s:create_highlight(color, is_bright)
+		let color_idx = get( s:color_idx, a:color, -1 )
+		if color_idx == -1
+			let color_idx = s:rgb2xterm(a:color)
+			let s:color_idx[a:color] = color_idx
+		endif
+		call add( s:exe,
+			\   'hi BG'.a:color
+			\ . ' guibg=#' .a:color  .' guifg=#' .( a:is_bright ? '000000' : 'ffffff' )
+			\ . ' ctermbg='.color_idx.' ctermfg='.( a:is_bright ? 0 : 15 )
+			\ )
+	endfunction
+endif
+
+function! s:recreate_highlights()
+	call filter( copy( b:css_color_hi ), 's:create_highlight( v:key, v:val )' )
+endfunction
+
+let s:pattern_color = {}
+let s:color_bright  = {}
+function! s:create_syn_match()
+
+	let pattern = submatch(0)
+
+	if has_key( b:css_color_syn, pattern ) | return | endif
+	let b:css_color_syn[pattern] = 1
+
+	let rgb_color = get( s:pattern_color, pattern, '' )
+
+	if ! strlen( rgb_color )
+		let hex = submatch(1)
+		let funcname = submatch(2)
+
+		let rgb_color
+			\ = funcname == 'rgb' ? s:rgb2color(submatch(3),submatch(4),submatch(5))
+			\ : funcname == 'hsl' ? s:hsl2color(submatch(3),submatch(4),submatch(5))
+			\ : strlen(hex) >= 6  ? tolower(hex[0:5])
+			\ : strlen(hex) >= 3  ? tolower(hex[0].hex[0].hex[1].hex[1].hex[2].hex[2])
+			\ : ''
+
+		if rgb_color == '' | throw 'css_color: create_syn_match invoked on bad match data' | endif
+		let s:pattern_color[pattern] = rgb_color
+	endif
+
+	if ! has_key( b:css_color_hi, rgb_color )
+		let is_bright = get( s:color_bright, rgb_color, -1 )
+		if is_bright == -1
+			let r = s:hex[rgb_color[0:1]]
+			let g = s:hex[rgb_color[2:3]]
+			let b = s:hex[rgb_color[4:5]]
+			let is_bright = r*30 + g*59 + b*11 > 12000
+			let s:color_bright[rgb_color] = is_bright
+		endif
+
+		call s:create_highlight( rgb_color, is_bright )
+		let b:css_color_hi[rgb_color] = is_bright
+	endif
+
+	" iff pattern ends on word character, require word break to match
+	if pattern =~ '\>$' | let pattern .= '\>' | endif
+	call add( s:exe, 'syn match BG'.rgb_color.' /'.escape(pattern, '/').'/ contained containedin=@colorableGroup' )
+
+	return ''
+endfunction
+
+function! s:clear_matches()
+	call map(get(w:, 'css_color_match_id', []), 'matchdelete(v:val)')
+	let w:css_color_match_id = []
+endfunction
+
+function! s:create_matches()
+	call s:clear_matches()
+	if ! &l:cursorline | return | endif
+	" adds matches based that duplicate the highlighted colors on the current line
+	let lnr = line('.')
+	let group = ''
+	let groupstart = 0
+	let endcol = &l:synmaxcol ? &l:synmaxcol : col('$')
+	for col in range( 1, endcol )
+		let nextgroup = col < endcol ? synIDattr( synID( lnr, col, 1 ), 'name' ) : ''
+		if group == nextgroup | continue | endif
+		if group =~ '^BG\x\{6}$'
+			let regex = '\%'.lnr.'l\%'.groupstart.'c'.repeat( '.', col - groupstart )
+			let w:css_color_match_id += [ matchadd( group, regex, -1 ) ]
+		endif
+		let group = nextgroup
+		let groupstart = col
+	endfor
+endfunction
+
+let s:_hexcolor   = '#\(\x\{3}\%(\>\|\x\{3}\>\)\)' " submatch 1
+let s:_rgbacolor  = '#\(\x\{3}\%(\>\|\x\%(\>\|\x\{2}\%(\>\|\x\{2}\>\)\)\)\)' " submatch 1
+let s:_funcname   = '\(rgb\|hsl\)a\?' " submatch 2
+let s:_ws_        = '\s*'
+let s:_numval     = s:_ws_ . '\(\d\{1,3}%\?\)' " submatch 3,4,5
+let s:_listsep    = s:_ws_ . ','
+let s:_otherargs_ = '\%(,[^)]*\)\?'
+let s:_funcexpr   = s:_funcname . '[(]' . s:_numval . s:_listsep . s:_numval . s:_listsep . s:_numval . s:_ws_ . s:_otherargs_ . '[)]'
+let s:_csscolor   = s:_rgbacolor . '\|' . s:_funcexpr
+" N.B. sloppy heuristic constants for performance reasons:
+"      a) start somewhere left of screen in case of partially visible colorref
+"      b) take some multiple of &columns to handle multibyte chars etc
+" N.B. these substitute() calls are here just for the side effect
+"      of invoking s:create_syn_match during substitution -- because
+"      match() and friends do not allow finding all matches in a single
+"      scan without examining the start of the string over and over
+function! s:parse_screen()
+	let leftcol = winsaveview().leftcol
+	let left = max([ leftcol - 15, 0 ])
+	let width = &columns * 4
+	call filter( range( line('w0'), line('w$') ), 'substitute( strpart( getline(v:val), col([v:val, left]), width ), b:css_color_pat, ''\=s:create_syn_match()'', ''g'' )' )
+	call s:flush_exe()
+endfunction
+
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+function! css_color#reinit()
+	call s:recreate_highlights()
+	call s:flush_exe()
+endfunction
+
+function! css_color#enable()
+	if ! b:css_color_off | return | endif
+	if len( b:css_color_grp ) | exe 'syn cluster colorableGroup add=' . join( b:css_color_grp, ',' ) | endif
+	augroup CSSColor
+		autocmd! * <buffer>
+		if has('nvim-0.3.1')
+			autocmd CursorMoved,CursorMovedI <buffer> call s:parse_screen()
+		else
+			autocmd CursorMoved,CursorMovedI <buffer> call s:parse_screen() | call s:create_matches()
+			autocmd BufWinEnter <buffer> call s:create_matches()
+			autocmd BufWinLeave <buffer> call s:clear_matches()
+		endif
+		autocmd ColorScheme <buffer> call css_color#reinit()
+	augroup END
+	let b:css_color_off = 0
+	doautocmd CSSColor CursorMoved
+endfunction
+
+function! css_color#disable()
+	if b:css_color_off | return | endif
+	if len( b:css_color_grp ) | exe 'syn cluster colorableGroup remove=' . join( b:css_color_grp, ',' ) | endif
+	autocmd! CSSColor * <buffer>
+	let b:css_color_off = 1
+endfunction
+
+function! css_color#toggle()
+	if b:css_color_off | call css_color#enable()
+	else               | call css_color#disable()
+	endif
+endfunction
+
+let s:type         = [ 'none', 'hex', 'rgba', 'css', 'none' ] " with wraparound for index() == -1
+let s:pat_for_type = [ '^$', s:_hexcolor, s:_rgbacolor, s:_csscolor, '^$' ]
+
+function! css_color#init(type, keywords, groups)
+	let new_type = index( s:type, a:type )
+	let old_type = index( s:pat_for_type, get( b:, 'css_color_pat', '$^' ) )
+
+	let b:css_color_pat = s:pat_for_type[ max( [ old_type, new_type ] ) ]
+	let b:css_color_grp = extend( get( b:, 'css_color_grp', [] ), split( a:groups, ',' ), 0 )
+	let b:css_color_hi  = {}
+	let b:css_color_syn = {}
+	let b:css_color_off = 1
+
+	call css_color#enable()
+
+	if a:keywords != 'none'
+		exe 'syntax include syntax/colornames/'.a:keywords.'.vim'
+		call extend( s:color_bright, b:css_color_hi )
+	endif
+endfunction
+
+" utility function for development use
+function! css_color#dump_highlights()
+	call s:recreate_highlights()
+	let cmd = join( sort( remove( s:exe, 0, -1 ) ),  "\n" )
+	let cmd = substitute( cmd, '#......', '\U&', 'g' )
+	let cmd = substitute( cmd, 'ctermbg=\zs\d\+', '\=printf("%-3d",submatch(0))', 'g' )
+	return cmd
+endfunction
diff --git a/.vim/pack/css-color/start/css-color/syntax/colornames/basic.vim b/.vim/pack/css-color/start/css-color/syntax/colornames/basic.vim
new file mode 100644
index 0000000..37730ce
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/syntax/colornames/basic.vim
@@ -0,0 +1,47 @@
+" Language:     Colorful CSS Color Preview
+" Author:       Aristotle Pagaltzis <pagaltzis@gmx.de>
+" Commit:       $Format:%H$
+" Licence:      The MIT License (MIT)
+
+" W3C basic colors
+
+hi BG000000 guibg=#000000 guifg=#FFFFFF ctermbg=16  ctermfg=15
+hi BGc0c0c0 guibg=#C0C0C0 guifg=#000000 ctermbg=250 ctermfg=0
+hi BG808080 guibg=#808080 guifg=#000000 ctermbg=244 ctermfg=0
+hi BGffffff guibg=#FFFFFF guifg=#000000 ctermbg=231 ctermfg=0
+hi BG800000 guibg=#800000 guifg=#FFFFFF ctermbg=88  ctermfg=15
+hi BGff0000 guibg=#FF0000 guifg=#FFFFFF ctermbg=196 ctermfg=15
+hi BG800080 guibg=#800080 guifg=#FFFFFF ctermbg=90  ctermfg=15
+hi BGff00ff guibg=#FF00FF guifg=#FFFFFF ctermbg=201 ctermfg=15
+hi BG008000 guibg=#008000 guifg=#FFFFFF ctermbg=28  ctermfg=15
+hi BG00ff00 guibg=#00FF00 guifg=#000000 ctermbg=46  ctermfg=0
+hi BG808000 guibg=#808000 guifg=#FFFFFF ctermbg=100 ctermfg=15
+hi BGffff00 guibg=#FFFF00 guifg=#000000 ctermbg=226 ctermfg=0
+hi BG000080 guibg=#000080 guifg=#FFFFFF ctermbg=18  ctermfg=15
+hi BG0000ff guibg=#0000FF guifg=#FFFFFF ctermbg=21  ctermfg=15
+hi BG008080 guibg=#008080 guifg=#FFFFFF ctermbg=30  ctermfg=15
+hi BG00ffff guibg=#00FFFF guifg=#000000 ctermbg=51  ctermfg=0
+
+call extend( b:css_color_hi,
+	\{'000000':0,'c0c0c0':1,'808080':1,'ffffff':1,'800000':0,'ff0000':0
+	\,'800080':0,'ff00ff':0,'008000':0,'00ff00':1,'808000':0,'ffff00':1
+	\,'000080':0,'0000ff':0,'008080':0,'00ffff':1} )
+
+syn case ignore
+
+syn keyword BG000000 black   contained containedin=@colorableGroup
+syn keyword BGc0c0c0 silver  contained containedin=@colorableGroup
+syn keyword BG808080 gray    contained containedin=@colorableGroup
+syn match   BGffffff "\c\<white\(-\)\@!\>" contained containedin=@colorableGroup
+syn keyword BG800000 maroon  contained containedin=@colorableGroup
+syn keyword BGff0000 red     contained containedin=@colorableGroup
+syn keyword BG800080 purple  contained containedin=@colorableGroup
+syn keyword BGff00ff fuchsia contained containedin=@colorableGroup
+syn keyword BG008000 green   contained containedin=@colorableGroup
+syn keyword BG00ff00 lime    contained containedin=@colorableGroup
+syn keyword BG808000 olive   contained containedin=@colorableGroup
+syn keyword BGffff00 yellow  contained containedin=@colorableGroup
+syn keyword BG000080 navy    contained containedin=@colorableGroup
+syn keyword BG0000ff blue    contained containedin=@colorableGroup
+syn keyword BG008080 teal    contained containedin=@colorableGroup
+syn keyword BG00ffff aqua    contained containedin=@colorableGroup
diff --git a/.vim/pack/css-color/start/css-color/syntax/colornames/extended.vim b/.vim/pack/css-color/start/css-color/syntax/colornames/extended.vim
new file mode 100644
index 0000000..13230ed
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/syntax/colornames/extended.vim
@@ -0,0 +1,290 @@
+" Language:     Colorful CSS Color Preview
+" Author:       Aristotle Pagaltzis <pagaltzis@gmx.de>
+" Commit:       $Format:%H$
+" Licence:      The MIT License (MIT)
+
+" W3C extended colors
+
+syntax include syntax/colornames/basic.vim
+
+hi BG00008b guibg=#00008B guifg=#FFFFFF ctermbg=18  ctermfg=15
+hi BG0000cd guibg=#0000CD guifg=#FFFFFF ctermbg=20  ctermfg=15
+hi BG006400 guibg=#006400 guifg=#FFFFFF ctermbg=22  ctermfg=15
+hi BG008b8b guibg=#008B8B guifg=#FFFFFF ctermbg=30  ctermfg=15
+hi BG00bfff guibg=#00BFFF guifg=#000000 ctermbg=74  ctermfg=0
+hi BG00ced1 guibg=#00CED1 guifg=#000000 ctermbg=6   ctermfg=0
+hi BG00fa9a guibg=#00FA9A guifg=#000000 ctermbg=49  ctermfg=0
+hi BG00ff7f guibg=#00FF7F guifg=#000000 ctermbg=48  ctermfg=0
+hi BG191970 guibg=#191970 guifg=#FFFFFF ctermbg=18  ctermfg=15
+hi BG1e90ff guibg=#1E90FF guifg=#000000 ctermbg=33  ctermfg=0
+hi BG20b2aa guibg=#20B2AA guifg=#000000 ctermbg=37  ctermfg=0
+hi BG228b22 guibg=#228B22 guifg=#FFFFFF ctermbg=28  ctermfg=15
+hi BG2e8b57 guibg=#2E8B57 guifg=#FFFFFF ctermbg=29  ctermfg=15
+hi BG2f4f4f guibg=#2F4F4F guifg=#FFFFFF ctermbg=23  ctermfg=15
+hi BG32cd32 guibg=#32CD32 guifg=#000000 ctermbg=2   ctermfg=0
+hi BG3cb371 guibg=#3CB371 guifg=#000000 ctermbg=35  ctermfg=0
+hi BG40e0d0 guibg=#40E0D0 guifg=#000000 ctermbg=44  ctermfg=0
+hi BG4169e1 guibg=#4169E1 guifg=#FFFFFF ctermbg=62  ctermfg=15
+hi BG4682b4 guibg=#4682B4 guifg=#FFFFFF ctermbg=67  ctermfg=15
+hi BG483d8b guibg=#483D8B guifg=#FFFFFF ctermbg=90  ctermfg=15
+hi BG48d1cc guibg=#48D1CC guifg=#000000 ctermbg=44  ctermfg=0
+hi BG4b0082 guibg=#4B0082 guifg=#FFFFFF ctermbg=54  ctermfg=15
+hi BG556b2f guibg=#556B2F guifg=#FFFFFF ctermbg=58  ctermfg=15
+hi BG5f9ea0 guibg=#5F9EA0 guifg=#000000 ctermbg=73  ctermfg=0
+hi BG6495ed guibg=#6495ED guifg=#000000 ctermbg=68  ctermfg=0
+hi BG663399 guibg=#663399 guifg=#FFFFFF ctermbg=91  ctermfg=15
+hi BG66cdaa guibg=#66CDAA guifg=#000000 ctermbg=79  ctermfg=0
+hi BG696969 guibg=#696969 guifg=#FFFFFF ctermbg=242 ctermfg=15
+hi BG6a5acd guibg=#6A5ACD guifg=#FFFFFF ctermbg=62  ctermfg=15
+hi BG6b8e23 guibg=#6B8E23 guifg=#FFFFFF ctermbg=64  ctermfg=15
+hi BG708090 guibg=#708090 guifg=#000000 ctermbg=8   ctermfg=0
+hi BG778899 guibg=#778899 guifg=#000000 ctermbg=67  ctermfg=0
+hi BG7b68ee guibg=#7B68EE guifg=#000000 ctermbg=98  ctermfg=0
+hi BG7cfc00 guibg=#7CFC00 guifg=#000000 ctermbg=118 ctermfg=0
+hi BG7fff00 guibg=#7FFF00 guifg=#000000 ctermbg=118 ctermfg=0
+hi BG7fffd4 guibg=#7FFFD4 guifg=#000000 ctermbg=122 ctermfg=0
+hi BG87ceeb guibg=#87CEEB guifg=#000000 ctermbg=117 ctermfg=0
+hi BG87cefa guibg=#87CEFA guifg=#000000 ctermbg=117 ctermfg=0
+hi BG8a2be2 guibg=#8A2BE2 guifg=#FFFFFF ctermbg=93  ctermfg=15
+hi BG8b0000 guibg=#8B0000 guifg=#FFFFFF ctermbg=88  ctermfg=15
+hi BG8b008b guibg=#8B008B guifg=#FFFFFF ctermbg=90  ctermfg=15
+hi BG8b4513 guibg=#8B4513 guifg=#FFFFFF ctermbg=130 ctermfg=15
+hi BG8fbc8f guibg=#8FBC8F guifg=#000000 ctermbg=108 ctermfg=0
+hi BG90ee90 guibg=#90EE90 guifg=#000000 ctermbg=120 ctermfg=0
+hi BG9370d8 guibg=#9370D8 guifg=#000000 ctermbg=134 ctermfg=0
+hi BG9400d3 guibg=#9400D3 guifg=#FFFFFF ctermbg=92  ctermfg=15
+hi BG98fb98 guibg=#98FB98 guifg=#000000 ctermbg=120 ctermfg=0
+hi BG9932cc guibg=#9932CC guifg=#FFFFFF ctermbg=128 ctermfg=15
+hi BG9acd32 guibg=#9ACD32 guifg=#000000 ctermbg=112 ctermfg=0
+hi BGa0522d guibg=#A0522D guifg=#FFFFFF ctermbg=130 ctermfg=15
+hi BGa52a2a guibg=#A52A2A guifg=#FFFFFF ctermbg=124 ctermfg=15
+hi BGa9a9a9 guibg=#A9A9A9 guifg=#000000 ctermbg=248 ctermfg=0
+hi BGadd8e6 guibg=#ADD8E6 guifg=#000000 ctermbg=152 ctermfg=0
+hi BGadff2f guibg=#ADFF2F guifg=#000000 ctermbg=154 ctermfg=0
+hi BGafeeee guibg=#AFEEEE guifg=#000000 ctermbg=159 ctermfg=0
+hi BGb0c4de guibg=#B0C4DE guifg=#000000 ctermbg=153 ctermfg=0
+hi BGb0e0e6 guibg=#B0E0E6 guifg=#000000 ctermbg=152 ctermfg=0
+hi BGb22222 guibg=#B22222 guifg=#FFFFFF ctermbg=124 ctermfg=15
+hi BGb8860b guibg=#B8860B guifg=#000000 ctermbg=136 ctermfg=0
+hi BGba55d3 guibg=#BA55D3 guifg=#000000 ctermbg=134 ctermfg=0
+hi BGbc8f8f guibg=#BC8F8F guifg=#000000 ctermbg=138 ctermfg=0
+hi BGbdb76b guibg=#BDB76B guifg=#000000 ctermbg=143 ctermfg=0
+hi BGc71585 guibg=#C71585 guifg=#FFFFFF ctermbg=162 ctermfg=15
+hi BGcd5c5c guibg=#CD5C5C guifg=#000000 ctermbg=167 ctermfg=0
+hi BGcd853f guibg=#CD853F guifg=#000000 ctermbg=172 ctermfg=0
+hi BGd2691e guibg=#D2691E guifg=#000000 ctermbg=166 ctermfg=0
+hi BGd2b48c guibg=#D2B48C guifg=#000000 ctermbg=180 ctermfg=0
+hi BGd3d3d3 guibg=#D3D3D3 guifg=#000000 ctermbg=252 ctermfg=0
+hi BGd87093 guibg=#D87093 guifg=#000000 ctermbg=168 ctermfg=0
+hi BGd8bfd8 guibg=#D8BFD8 guifg=#000000 ctermbg=182 ctermfg=0
+hi BGda70d6 guibg=#DA70D6 guifg=#000000 ctermbg=170 ctermfg=0
+hi BGdaa520 guibg=#DAA520 guifg=#000000 ctermbg=178 ctermfg=0
+hi BGdc143c guibg=#DC143C guifg=#FFFFFF ctermbg=197 ctermfg=15
+hi BGdcdcdc guibg=#DCDCDC guifg=#000000 ctermbg=253 ctermfg=0
+hi BGdda0dd guibg=#DDA0DD guifg=#000000 ctermbg=183 ctermfg=0
+hi BGdeb887 guibg=#DEB887 guifg=#000000 ctermbg=180 ctermfg=0
+hi BGe0ffff guibg=#E0FFFF guifg=#000000 ctermbg=195 ctermfg=0
+hi BGe6e6fa guibg=#E6E6FA guifg=#000000 ctermbg=189 ctermfg=0
+hi BGe9967a guibg=#E9967A guifg=#000000 ctermbg=209 ctermfg=0
+hi BGee82ee guibg=#EE82EE guifg=#000000 ctermbg=213 ctermfg=0
+hi BGeee8aa guibg=#EEE8AA guifg=#000000 ctermbg=229 ctermfg=0
+hi BGf08080 guibg=#F08080 guifg=#000000 ctermbg=210 ctermfg=0
+hi BGf0e68c guibg=#F0E68C guifg=#000000 ctermbg=186 ctermfg=0
+hi BGf0f8ff guibg=#F0F8FF guifg=#000000 ctermbg=231 ctermfg=0
+hi BGf0fff0 guibg=#F0FFF0 guifg=#000000 ctermbg=195 ctermfg=0
+hi BGf0ffff guibg=#F0FFFF guifg=#000000 ctermbg=231 ctermfg=0
+hi BGf4a460 guibg=#F4A460 guifg=#000000 ctermbg=215 ctermfg=0
+hi BGf5deb3 guibg=#F5DEB3 guifg=#000000 ctermbg=223 ctermfg=0
+hi BGf5f5dc guibg=#F5F5DC guifg=#000000 ctermbg=230 ctermfg=0
+hi BGf5f5f5 guibg=#F5F5F5 guifg=#000000 ctermbg=255 ctermfg=0
+hi BGf5fffa guibg=#F5FFFA guifg=#000000 ctermbg=231 ctermfg=0
+hi BGf8f8ff guibg=#F8F8FF guifg=#000000 ctermbg=231 ctermfg=0
+hi BGfa8072 guibg=#FA8072 guifg=#000000 ctermbg=210 ctermfg=0
+hi BGfaebd7 guibg=#FAEBD7 guifg=#000000 ctermbg=255 ctermfg=0
+hi BGfaf0e6 guibg=#FAF0E6 guifg=#000000 ctermbg=255 ctermfg=0
+hi BGfafad2 guibg=#FAFAD2 guifg=#000000 ctermbg=230 ctermfg=0
+hi BGfdf5e6 guibg=#FDF5E6 guifg=#000000 ctermbg=255 ctermfg=0
+hi BGff1493 guibg=#FF1493 guifg=#FFFFFF ctermbg=198 ctermfg=15
+hi BGff4500 guibg=#FF4500 guifg=#FFFFFF ctermbg=202 ctermfg=15
+hi BGff6347 guibg=#FF6347 guifg=#000000 ctermbg=203 ctermfg=0
+hi BGff69b4 guibg=#FF69B4 guifg=#000000 ctermbg=205 ctermfg=0
+hi BGff7f50 guibg=#FF7F50 guifg=#000000 ctermbg=209 ctermfg=0
+hi BGff8c00 guibg=#FF8C00 guifg=#000000 ctermbg=208 ctermfg=0
+hi BGffa07a guibg=#FFA07A guifg=#000000 ctermbg=216 ctermfg=0
+hi BGffa500 guibg=#FFA500 guifg=#000000 ctermbg=214 ctermfg=0
+hi BGffb6c1 guibg=#FFB6C1 guifg=#000000 ctermbg=217 ctermfg=0
+hi BGffc0cb guibg=#FFC0CB guifg=#000000 ctermbg=217 ctermfg=0
+hi BGffd700 guibg=#FFD700 guifg=#000000 ctermbg=220 ctermfg=0
+hi BGffdab9 guibg=#FFDAB9 guifg=#000000 ctermbg=223 ctermfg=0
+hi BGffdead guibg=#FFDEAD guifg=#000000 ctermbg=223 ctermfg=0
+hi BGffe4b5 guibg=#FFE4B5 guifg=#000000 ctermbg=223 ctermfg=0
+hi BGffe4c4 guibg=#FFE4C4 guifg=#000000 ctermbg=223 ctermfg=0
+hi BGffe4e1 guibg=#FFE4E1 guifg=#000000 ctermbg=224 ctermfg=0
+hi BGffebcd guibg=#FFEBCD guifg=#000000 ctermbg=223 ctermfg=0
+hi BGffefd5 guibg=#FFEFD5 guifg=#000000 ctermbg=230 ctermfg=0
+hi BGfff0f5 guibg=#FFF0F5 guifg=#000000 ctermbg=255 ctermfg=0
+hi BGfff5ee guibg=#FFF5EE guifg=#000000 ctermbg=231 ctermfg=0
+hi BGfff8dc guibg=#FFF8DC guifg=#000000 ctermbg=230 ctermfg=0
+hi BGfffacd guibg=#FFFACD guifg=#000000 ctermbg=230 ctermfg=0
+hi BGfffaf0 guibg=#FFFAF0 guifg=#000000 ctermbg=231 ctermfg=0
+hi BGfffafa guibg=#FFFAFA guifg=#000000 ctermbg=231 ctermfg=0
+hi BGffffe0 guibg=#FFFFE0 guifg=#000000 ctermbg=230 ctermfg=0
+hi BGfffff0 guibg=#FFFFF0 guifg=#000000 ctermbg=231 ctermfg=0
+
+call extend( b:css_color_hi,
+	\{'00008b':0,'0000cd':0,'006400':0,'008b8b':0,'00bfff':1,'00ced1':1
+	\,'00fa9a':1,'00ff7f':1,'191970':0,'1e90ff':1,'20b2aa':1,'228b22':0
+	\,'2e8b57':0,'2f4f4f':0,'32cd32':1,'3cb371':1,'40e0d0':1,'4169e1':0
+	\,'4682b4':0,'483d8b':0,'48d1cc':1,'4b0082':0,'556b2f':0,'5f9ea0':1
+	\,'6495ed':1,'66cdaa':1,'696969':0,'6a5acd':0,'6b8e23':0,'708090':1
+	\,'778899':1,'7b68ee':1,'7cfc00':1,'7fff00':1,'7fffd4':1,'87ceeb':1
+	\,'87cefa':1,'8a2be2':0,'8b0000':0,'8b008b':0,'8b4513':0,'8fbc8f':1
+	\,'90ee90':1,'9370d8':1,'9400d3':0,'98fb98':1,'9932cc':0,'9acd32':1
+	\,'a0522d':0,'a52a2a':0,'a9a9a9':1,'add8e6':1,'adff2f':1,'afeeee':1
+	\,'b0c4de':1,'b0e0e6':1,'b22222':0,'b8860b':1,'ba55d3':1,'bc8f8f':1
+	\,'bdb76b':1,'c71585':0,'cd5c5c':1,'cd853f':1,'d2691e':1,'d2b48c':1
+	\,'d3d3d3':1,'d87093':1,'d8bfd8':1,'da70d6':1,'daa520':1,'dc143c':0
+	\,'dcdcdc':1,'dda0dd':1,'deb887':1,'e0ffff':1,'e6e6fa':1,'e9967a':1
+	\,'ee82ee':1,'eee8aa':1,'f08080':1,'f0e68c':1,'f0f8ff':1,'f0fff0':1
+	\,'f0ffff':1,'f4a460':1,'f5deb3':1,'f5f5dc':1,'f5f5f5':1,'f5fffa':1
+	\,'f8f8ff':1,'fa8072':1,'faebd7':1,'faf0e6':1,'fafad2':1,'fdf5e6':1
+	\,'ff1493':0,'ff4500':0,'ff6347':1,'ff69b4':1,'ff7f50':1,'ff8c00':1
+	\,'ffa07a':1,'ffa500':1,'ffb6c1':1,'ffc0cb':1,'ffd700':1,'ffdab9':1
+	\,'ffdead':1,'ffe4b5':1,'ffe4c4':1,'ffe4e1':1,'ffebcd':1,'ffefd5':1
+	\,'fff0f5':1,'fff5ee':1,'fff8dc':1,'fffacd':1,'fffaf0':1,'fffafa':1
+	\,'ffffe0':1,'fffff0':1} )
+
+syn case ignore
+
+syn keyword BGf0f8ff AliceBlue            contained containedin=@colorableGroup
+syn keyword BGfaebd7 AntiqueWhite         contained containedin=@colorableGroup
+syn keyword BG7fffd4 Aquamarine           contained containedin=@colorableGroup
+syn keyword BGf0ffff Azure                contained containedin=@colorableGroup
+syn keyword BGf5f5dc Beige                contained containedin=@colorableGroup
+syn keyword BGffe4c4 Bisque               contained containedin=@colorableGroup
+syn keyword BGffebcd BlanchedAlmond       contained containedin=@colorableGroup
+syn keyword BG8a2be2 BlueViolet           contained containedin=@colorableGroup
+syn keyword BGa52a2a Brown                contained containedin=@colorableGroup
+syn keyword BGdeb887 BurlyWood            contained containedin=@colorableGroup
+syn keyword BG5f9ea0 CadetBlue            contained containedin=@colorableGroup
+syn keyword BG7fff00 Chartreuse           contained containedin=@colorableGroup
+syn keyword BGd2691e Chocolate            contained containedin=@colorableGroup
+syn keyword BGff7f50 Coral                contained containedin=@colorableGroup
+syn keyword BG6495ed CornflowerBlue       contained containedin=@colorableGroup
+syn keyword BGfff8dc Cornsilk             contained containedin=@colorableGroup
+syn keyword BGdc143c Crimson              contained containedin=@colorableGroup
+syn keyword BG00ffff Cyan                 contained containedin=@colorableGroup
+syn keyword BG00008b DarkBlue             contained containedin=@colorableGroup
+syn keyword BG008b8b DarkCyan             contained containedin=@colorableGroup
+syn keyword BGb8860b DarkGoldenRod        contained containedin=@colorableGroup
+syn keyword BGa9a9a9 DarkGray             contained containedin=@colorableGroup
+syn keyword BG006400 DarkGreen            contained containedin=@colorableGroup
+syn keyword BGa9a9a9 DarkGrey             contained containedin=@colorableGroup
+syn keyword BGbdb76b DarkKhaki            contained containedin=@colorableGroup
+syn keyword BG8b008b DarkMagenta          contained containedin=@colorableGroup
+syn keyword BG556b2f DarkOliveGreen       contained containedin=@colorableGroup
+syn keyword BG9932cc DarkOrchid           contained containedin=@colorableGroup
+syn keyword BG8b0000 DarkRed              contained containedin=@colorableGroup
+syn keyword BGe9967a DarkSalmon           contained containedin=@colorableGroup
+syn keyword BG8fbc8f DarkSeaGreen         contained containedin=@colorableGroup
+syn keyword BG483d8b DarkSlateBlue        contained containedin=@colorableGroup
+syn keyword BG2f4f4f DarkSlateGray        contained containedin=@colorableGroup
+syn keyword BG2f4f4f DarkSlateGrey        contained containedin=@colorableGroup
+syn keyword BG00ced1 DarkTurquoise        contained containedin=@colorableGroup
+syn keyword BG9400d3 DarkViolet           contained containedin=@colorableGroup
+syn keyword BGff8c00 Darkorange           contained containedin=@colorableGroup
+syn keyword BGff1493 DeepPink             contained containedin=@colorableGroup
+syn keyword BG00bfff DeepSkyBlue          contained containedin=@colorableGroup
+syn keyword BG696969 DimGray              contained containedin=@colorableGroup
+syn keyword BG696969 DimGrey              contained containedin=@colorableGroup
+syn keyword BG1e90ff DodgerBlue           contained containedin=@colorableGroup
+syn keyword BGb22222 FireBrick            contained containedin=@colorableGroup
+syn keyword BGfffaf0 FloralWhite          contained containedin=@colorableGroup
+syn keyword BG228b22 ForestGreen          contained containedin=@colorableGroup
+syn keyword BGdcdcdc Gainsboro            contained containedin=@colorableGroup
+syn keyword BGf8f8ff GhostWhite           contained containedin=@colorableGroup
+syn keyword BGffd700 Gold                 contained containedin=@colorableGroup
+syn keyword BGdaa520 GoldenRod            contained containedin=@colorableGroup
+syn keyword BGadff2f GreenYellow          contained containedin=@colorableGroup
+syn keyword BG808080 Grey                 contained containedin=@colorableGroup
+syn keyword BGf0fff0 HoneyDew             contained containedin=@colorableGroup
+syn keyword BGff69b4 HotPink              contained containedin=@colorableGroup
+syn keyword BGcd5c5c IndianRed            contained containedin=@colorableGroup
+syn keyword BG4b0082 Indigo               contained containedin=@colorableGroup
+syn keyword BGfffff0 Ivory                contained containedin=@colorableGroup
+syn keyword BGf0e68c Khaki                contained containedin=@colorableGroup
+syn keyword BGe6e6fa Lavender             contained containedin=@colorableGroup
+syn keyword BGfff0f5 LavenderBlush        contained containedin=@colorableGroup
+syn keyword BG7cfc00 LawnGreen            contained containedin=@colorableGroup
+syn keyword BGfffacd LemonChiffon         contained containedin=@colorableGroup
+syn keyword BGadd8e6 LightBlue            contained containedin=@colorableGroup
+syn keyword BGf08080 LightCoral           contained containedin=@colorableGroup
+syn keyword BGe0ffff LightCyan            contained containedin=@colorableGroup
+syn keyword BGfafad2 LightGoldenRodYellow contained containedin=@colorableGroup
+syn keyword BGd3d3d3 LightGray            contained containedin=@colorableGroup
+syn keyword BG90ee90 LightGreen           contained containedin=@colorableGroup
+syn keyword BGd3d3d3 LightGrey            contained containedin=@colorableGroup
+syn keyword BGffb6c1 LightPink            contained containedin=@colorableGroup
+syn keyword BGffa07a LightSalmon          contained containedin=@colorableGroup
+syn keyword BG20b2aa LightSeaGreen        contained containedin=@colorableGroup
+syn keyword BG87cefa LightSkyBlue         contained containedin=@colorableGroup
+syn keyword BG778899 LightSlateGray       contained containedin=@colorableGroup
+syn keyword BG778899 LightSlateGrey       contained containedin=@colorableGroup
+syn keyword BGb0c4de LightSteelBlue       contained containedin=@colorableGroup
+syn keyword BGffffe0 LightYellow          contained containedin=@colorableGroup
+syn keyword BG32cd32 LimeGreen            contained containedin=@colorableGroup
+syn keyword BGfaf0e6 Linen                contained containedin=@colorableGroup
+syn keyword BGff00ff Magenta              contained containedin=@colorableGroup
+syn keyword BG66cdaa MediumAquaMarine     contained containedin=@colorableGroup
+syn keyword BG0000cd MediumBlue           contained containedin=@colorableGroup
+syn keyword BGba55d3 MediumOrchid         contained containedin=@colorableGroup
+syn keyword BG9370d8 MediumPurple         contained containedin=@colorableGroup
+syn keyword BG3cb371 MediumSeaGreen       contained containedin=@colorableGroup
+syn keyword BG7b68ee MediumSlateBlue      contained containedin=@colorableGroup
+syn keyword BG00fa9a MediumSpringGreen    contained containedin=@colorableGroup
+syn keyword BG48d1cc MediumTurquoise      contained containedin=@colorableGroup
+syn keyword BGc71585 MediumVioletRed      contained containedin=@colorableGroup
+syn keyword BG191970 MidnightBlue         contained containedin=@colorableGroup
+syn keyword BGf5fffa MintCream            contained containedin=@colorableGroup
+syn keyword BGffe4e1 MistyRose            contained containedin=@colorableGroup
+syn keyword BGffe4b5 Moccasin             contained containedin=@colorableGroup
+syn keyword BGffdead NavajoWhite          contained containedin=@colorableGroup
+syn keyword BGfdf5e6 OldLace              contained containedin=@colorableGroup
+syn keyword BG6b8e23 OliveDrab            contained containedin=@colorableGroup
+syn keyword BGffa500 Orange               contained containedin=@colorableGroup
+syn keyword BGff4500 OrangeRed            contained containedin=@colorableGroup
+syn keyword BGda70d6 Orchid               contained containedin=@colorableGroup
+syn keyword BGeee8aa PaleGoldenRod        contained containedin=@colorableGroup
+syn keyword BG98fb98 PaleGreen            contained containedin=@colorableGroup
+syn keyword BGafeeee PaleTurquoise        contained containedin=@colorableGroup
+syn keyword BGd87093 PaleVioletRed        contained containedin=@colorableGroup
+syn keyword BGffefd5 PapayaWhip           contained containedin=@colorableGroup
+syn keyword BGffdab9 PeachPuff            contained containedin=@colorableGroup
+syn keyword BGcd853f Peru                 contained containedin=@colorableGroup
+syn keyword BGffc0cb Pink                 contained containedin=@colorableGroup
+syn keyword BGdda0dd Plum                 contained containedin=@colorableGroup
+syn keyword BGb0e0e6 PowderBlue           contained containedin=@colorableGroup
+syn keyword BGbc8f8f RosyBrown            contained containedin=@colorableGroup
+syn keyword BG4169e1 RoyalBlue            contained containedin=@colorableGroup
+syn keyword BG663399 RebeccaPurple        contained containedin=@colorableGroup
+syn keyword BG8b4513 SaddleBrown          contained containedin=@colorableGroup
+syn keyword BGfa8072 Salmon               contained containedin=@colorableGroup
+syn keyword BGf4a460 SandyBrown           contained containedin=@colorableGroup
+syn keyword BG2e8b57 SeaGreen             contained containedin=@colorableGroup
+syn keyword BGfff5ee SeaShell             contained containedin=@colorableGroup
+syn keyword BGa0522d Sienna               contained containedin=@colorableGroup
+syn keyword BG87ceeb SkyBlue              contained containedin=@colorableGroup
+syn keyword BG6a5acd SlateBlue            contained containedin=@colorableGroup
+syn keyword BG708090 SlateGray            contained containedin=@colorableGroup
+syn keyword BG708090 SlateGrey            contained containedin=@colorableGroup
+syn keyword BGfffafa Snow                 contained containedin=@colorableGroup
+syn keyword BG00ff7f SpringGreen          contained containedin=@colorableGroup
+syn keyword BG4682b4 SteelBlue            contained containedin=@colorableGroup
+syn keyword BGd2b48c Tan                  contained containedin=@colorableGroup
+syn keyword BGd8bfd8 Thistle              contained containedin=@colorableGroup
+syn keyword BGff6347 Tomato               contained containedin=@colorableGroup
+syn keyword BG40e0d0 Turquoise            contained containedin=@colorableGroup
+syn keyword BGee82ee Violet               contained containedin=@colorableGroup
+syn keyword BGf5deb3 Wheat                contained containedin=@colorableGroup
+syn keyword BGf5f5f5 WhiteSmoke           contained containedin=@colorableGroup
+syn keyword BG9acd32 YellowGreen          contained containedin=@colorableGroup
diff --git a/.vim/pack/css-color/start/css-color/tests/bench b/.vim/pack/css-color/start/css-color/tests/bench
new file mode 100755
index 0000000..21e6eea
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/tests/bench
@@ -0,0 +1,6 @@
+#!/bin/sh
+set -e
+s=startuptime.txt
+vim --startuptime $s -o -c qa "$@"
+perl -lane'$sum += $F[1] if m!/\.vim/after/syntax/css\.vim$!; END {print $sum}' $s
+rm $s
diff --git a/.vim/pack/css-color/start/css-color/tests/example.csh b/.vim/pack/css-color/start/css-color/tests/example.csh
new file mode 100644
index 0000000..b5b1af4
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/tests/example.csh
@@ -0,0 +1,13 @@
+# TODO #0f0 should show up green
+# TODO  f00 should not show up red
+
+set word = '#0f0'
+echo "#0f0"
+echo #f00
+#f00
+##0f0
+# TODO #0f0
+# TODO #0f0 TODO
+cat <<X
+#0f0
+X
diff --git a/.vim/pack/css-color/start/css-color/tests/example.css b/.vim/pack/css-color/start/css-color/tests/example.css
new file mode 100644
index 0000000..d420cbd
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/tests/example.css
@@ -0,0 +1,24 @@
+i { background: #359 }
+b { background: #335599 }
+u { background: rgba(144, 0, 0, .5) }
+s { background: hsl(0, 100%, 50%) }
+
+*::color1 { -x-: #359 }
+*::color2 { -x-: #335599 }
+*::color3 { -x-: rgba(144, 0, 0, .5) }
+*::color4 { -x-: hsl(0, 100%, 50%) }
+
+/*
+ * #123, #456
+ */
+
+/* #123456 */
+
+ul {
+  color: white;
+}
+
+ul li {
+  color: yellow;
+  background: black;
+}
diff --git a/.vim/pack/css-color/start/css-color/tests/example.fish b/.vim/pack/css-color/start/css-color/tests/example.fish
new file mode 100644
index 0000000..f159d73
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/tests/example.fish
@@ -0,0 +1,10 @@
+# #0f0 should show up green
+#  f00 should not show up red
+
+#f00
+##0f0
+# #0f0
+echo '#0f0'
+set result "#0f0"
+echo #f00
+echo ##0f0
diff --git a/.vim/pack/css-color/start/css-color/tests/example.jsx b/.vim/pack/css-color/start/css-color/tests/example.jsx
new file mode 100644
index 0000000..0608466
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/tests/example.jsx
@@ -0,0 +1,11 @@
+var Example = React.createClass({
+	render: function() {
+		var style = {
+			color: '#ffde00',
+			backgroundColor: 'green',
+			border: '3px dotted rgba(255,0,0)'
+			fontSize: 200
+		};
+		return <div style={style}> Hi! </div>;
+	}
+});
diff --git a/.vim/pack/css-color/start/css-color/tests/example.less b/.vim/pack/css-color/start/css-color/tests/example.less
new file mode 100644
index 0000000..ffadbad
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/tests/example.less
@@ -0,0 +1,24 @@
+i { background: #359 }
+b { background: #335599 }
+u { background: rgba(144, 0, 0, .5) }
+s { background: hsl(0, 100%, 50%) }
+
+@color1: #359;
+@color1: #335599;
+@color3: rgba(144, 0, 0, .5);
+@color4: hsl(0, 100%, 50%);
+
+/*
+ * #123, #456
+ */
+
+// #123456
+
+ul {
+  color: white;
+
+  li {
+    color: yellow;
+    background: black;
+  }
+}
diff --git a/.vim/pack/css-color/start/css-color/tests/example.nix b/.vim/pack/css-color/start/css-color/tests/example.nix
new file mode 100644
index 0000000..05f3438
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/tests/example.nix
@@ -0,0 +1,69 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+  cfg = config.colorscheme.nord;
+  hexColor = types.str // {
+    check = (x: hasPrefix "#" x && builtins.stringLength x == 7);
+    description = "hexadecimal color";
+  };
+  mkHexColorOption = name: default:
+    mkOption {
+      type = hexColor;
+      default = default;
+      description = name;
+    };
+in {
+  ## POLAR NIGHT
+  # The origin color or the Polar Night palette.
+  nord0  = mkHexColorOption "nord0"  "#2E3440";
+
+  # A brighter shade color based on nord0.
+  nord1  = mkHexColorOption "nord1"  "#3B4252";
+
+  # An even more brighter shade color of nord0.
+  nord2  = mkHexColorOption "nord2"  "#434C5E";
+
+  # The brightest shade color based on nord0.
+  nord3  = mkHexColorOption "nord3"  "#4C566A";
+
+  ## SNOW STORM
+  # The origin color or the Snow Storm palette.
+  nord4  = mkHexColorOption "nord4"  "#D8DEE9";
+
+  # A brighter shade color of nord4.
+  nord5  = mkHexColorOption "nord5"  "#E5E9F0";
+
+  # The brightest shade color based on nord4.
+  nord6  = mkHexColorOption "nord6"  "#ECEFF4";
+
+  ## FROST
+  # A calm and highly contrasted color reminiscent of frozen polar water.
+  nord7  = mkHexColorOption "nord7"  "#8FBCBB";
+
+  # The bright and shiny primary accent color reminiscent of pure and clear ice.
+  nord8  = mkHexColorOption "nord8"  "#88C0D0";
+
+  # A more darkened and less saturated color reminiscent of arctic waters.
+  nord9  = mkHexColorOption "nord9"  "#81A1C1";
+
+  # A dark and intensive color reminiscent of the deep arctic ocean.
+  nord10 = mkHexColorOption "nord10" "#5E81AC";
+
+  ## AURORA
+  # RED
+  nord11 = mkHexColorOption "nord11" "#BF616A";
+
+  # ORANGE
+  nord12 = mkHexColorOption "nord12" "#D08770";
+
+  # YELLOW
+  nord13 = mkHexColorOption "nord13" "#EBCB8B";
+
+  # GREEN
+  nord14 = mkHexColorOption "nord14" "#A3BE8C";
+
+  # PURPLE
+  nord15 = mkHexColorOption "nord15" "#B48EAD";
+}
diff --git a/.vim/pack/css-color/start/css-color/tests/example.sass b/.vim/pack/css-color/start/css-color/tests/example.sass
new file mode 100644
index 0000000..e1c8cd0
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/tests/example.sass
@@ -0,0 +1,25 @@
+i
+  background: #359
+b
+  background: #335599
+u
+  background: rgba(144, 0, 0, .5)
+s
+  background: hsl(0, 100%, 50%)
+
+!color1 = #359
+!color2 = #335599
+!color3 = rgba(144, 0, 0, .5)
+!color4 = hsl(0, 100%, 50%)
+
+/*
+ * #123, #456
+ */
+
+// #123456
+
+ul
+  color = white
+  li
+    color = yellow
+    background = black
diff --git a/.vim/pack/css-color/start/css-color/tests/example.scss b/.vim/pack/css-color/start/css-color/tests/example.scss
new file mode 100644
index 0000000..a93f4da
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/tests/example.scss
@@ -0,0 +1,24 @@
+i { background: #359 }
+b { background: #335599 }
+u { background: rgba(144, 0, 0, .5) }
+s { background: hsl(0, 100%, 50%) }
+
+$color1: #359;
+$color2: #335599;
+$color3: rgba(144, 0, 0, .5);
+$color4: hsl(0, 100%, 50%);
+
+/*
+ * #123, #456
+ */
+
+// #123456
+
+ul {
+  color: white;
+
+  li {
+    color: yellow;
+    background: black;
+  }
+}
diff --git a/.vim/pack/css-color/start/css-color/tests/example.sh b/.vim/pack/css-color/start/css-color/tests/example.sh
new file mode 100644
index 0000000..676da41
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/tests/example.sh
@@ -0,0 +1,26 @@
+# XXX  #0f0 should show up green
+# XXX   f00 should not show up red
+# FIXME ff0 should show up yellow but are known not to
+
+echo '#0f0'
+echo ##0f0
+echo \#ff0
+echo #f00
+echo ##0f0
+echo # #0f0
+cmd '#0f0'
+cmd "#0f0"
+cmd \#ff0
+cmd #f00
+cmd ##0f0
+cmd # #0f0
+echo `foo # #0f0`
+for (( x = '#0f0' )) ; do : ; done
+for (( x = "#0f0" )) ; do : ; done
+#f00
+##0f0 XXX
+# #0f0 XXX
+# XXX #0f0 XXX
+cat << ''
+#0f0
+
diff --git a/.vim/pack/css-color/start/css-color/tests/example.stylus b/.vim/pack/css-color/start/css-color/tests/example.stylus
new file mode 100644
index 0000000..9789507
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/tests/example.stylus
@@ -0,0 +1,28 @@
+i
+	background #359
+b
+	background #335599
+u
+	background rgba(144, 0, 0, .5)
+s
+	background hsl(0, 100%, 50%)
+
+color1 = #359
+color2 = #335599
+color3 = rgba(144, 0, 0, .5)
+color4 = hsl(0, 100%, 50%)
+
+/*
+ * #123, #456
+ */
+
+// #123456
+
+ul {
+  color: white;
+
+  li {
+    color: yellow;
+    background: black;
+  }
+}
diff --git a/.vim/pack/css-color/start/css-color/tests/example.tcsh b/.vim/pack/css-color/start/css-color/tests/example.tcsh
new file mode 100644
index 0000000..b5b1af4
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/tests/example.tcsh
@@ -0,0 +1,13 @@
+# TODO #0f0 should show up green
+# TODO  f00 should not show up red
+
+set word = '#0f0'
+echo "#0f0"
+echo #f00
+#f00
+##0f0
+# TODO #0f0
+# TODO #0f0 TODO
+cat <<X
+#0f0
+X
diff --git a/.vim/pack/css-color/start/css-color/tests/example.ts b/.vim/pack/css-color/start/css-color/tests/example.ts
new file mode 100644
index 0000000..2509bd4
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/tests/example.ts
@@ -0,0 +1,21 @@
+import { DefaultTheme } from 'styled-components';
+
+const MyTheme = {
+	green2: '#2f7a5c',
+	green3: '#35b281',
+	green4: '#26805c',
+	green5: '#28664D',
+};
+
+/* green darker variations
+'#3fa27b'
+'#378e6c'
+'#2f7a5c'
+'#28664D'
+'#20513e'
+*/
+
+let x = '#20513e';
+let y = foo('#20513e');
+
+export default myTheme;
diff --git a/.vim/pack/css-color/start/css-color/tests/example.tsx b/.vim/pack/css-color/start/css-color/tests/example.tsx
new file mode 100644
index 0000000..ad156c3
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/tests/example.tsx
@@ -0,0 +1,53 @@
+export class ResultRow extends b.Component<IFood> {
+  static id: string = "search-result-row";
+
+  render(): b.INode {
+    return (
+      <Tr style={this.rowColorStyle(this.data.pH)}>
+        <Td>{this.data.name}</Td>
+        <Td>{this.data.pH}</Td>
+      </Tr>
+    );
+  }
+
+  private rowColorStyle(ph: number): b.IStyle {
+    let backgroundColor = "#00000000";
+    let color = "whitesmoke";
+    if (ph >= 9) {
+      backgroundColor = "#ac39ac";
+    } else if (ph >= 8.5) {
+      backgroundColor = "#d279d2";
+    } else if (ph >= 8.25) {
+      backgroundColor = "#e6b3e6";
+    } else if (ph >= 8) {
+      backgroundColor = "#80bfff";
+    } else if (ph >= 7.75) {
+      backgroundColor = "#77b300";
+    } else if (ph >= 7.5) {
+      backgroundColor = "#5cd65c";
+    } else if (ph >= 7.25) {
+      backgroundColor = "#00e600";
+    } else if (ph >= 7) {
+      backgroundColor = "#ffff33";
+    } else if (ph >= 6.5) {
+      backgroundColor = "#ffcc00";
+    } else if (ph >= 6.25) {
+      backgroundColor = "#ff8000";
+    } else if (ph >= 6) {
+      backgroundColor = "#ff6600";
+    } else if (ph >= 5.5) {
+      backgroundColor = "#ff1a1a";
+    } else if (ph >= 5) {
+      backgroundColor = "#cc0000";
+      color = "#ffffff";
+    } else if (ph >= 4.5) {
+      backgroundColor = "#990000";
+      color = "#ffffff";
+    } else {
+      backgroundColor = "#660000";
+      color = "#ffffff";
+    }
+
+    return { backgroundColor, color };
+  }
+}
diff --git a/.vim/pack/css-color/start/css-color/tests/example.zsh b/.vim/pack/css-color/start/css-color/tests/example.zsh
new file mode 100644
index 0000000..412a949
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/tests/example.zsh
@@ -0,0 +1,23 @@
+# XXX  #0f0 should show up green
+# XXX   f00 should not show up red
+# FIXME ff0 should show up yellow but are known not to
+
+echo '#0f0'
+echo ##0f0
+echo \#ff0
+echo #f00
+echo ##0f0
+echo # #0f0
+cmd '#0f0'
+cmd "#0f0"
+cmd \#ff0
+cmd #f00
+cmd ##0f0
+cmd # #0f0
+#f00
+##0f0 XXX
+# #0f0 XXX
+# XXX #0f0 XXX
+cat << ''
+#0f0
+
diff --git a/.vim/pack/css-color/start/css-color/tests/torture.css b/.vim/pack/css-color/start/css-color/tests/torture.css
new file mode 100644
index 0000000..5705f84
--- /dev/null
+++ b/.vim/pack/css-color/start/css-color/tests/torture.css
@@ -0,0 +1,256 @@
+p { color: #300000; color: #300001; color: #300002; color: #300003; color: #300004; color: #300005; color: #300006; color: #300007; color: #300008; color: #300009; color: #30000a; color: #30000b; color: #30000c; color: #30000d; color: #30000e; color: #30000f;
+color: #300100; color: #300101; color: #300102; color: #300103; color: #300104; color: #300105; color: #300106; color: #300107; color: #300108; color: #300109; color: #30010a; color: #30010b; color: #30010c; color: #30010d; color: #30010e; color: #30010f;
+color: #300200; color: #300201; color: #300202; color: #300203; color: #300204; color: #300205; color: #300206; color: #300207; color: #300208; color: #300209; color: #30020a; color: #30020b; color: #30020c; color: #30020d; color: #30020e; color: #30020f;
+color: #300300; color: #300301; color: #300302; color: #300303; color: #300304; color: #300305; color: #300306; color: #300307; color: #300308; color: #300309; color: #30030a; color: #30030b; color: #30030c; color: #30030d; color: #30030e; color: #30030f;
+color: #300400; color: #300401; color: #300402; color: #300403; color: #300404; color: #300405; color: #300406; color: #300407; color: #300408; color: #300409; color: #30040a; color: #30040b; color: #30040c; color: #30040d; color: #30040e; color: #30040f;
+color: #300500; color: #300501; color: #300502; color: #300503; color: #300504; color: #300505; color: #300506; color: #300507; color: #300508; color: #300509; color: #30050a; color: #30050b; color: #30050c; color: #30050d; color: #30050e; color: #30050f;
+color: #300600; color: #300601; color: #300602; color: #300603; color: #300604; color: #300605; color: #300606; color: #300607; color: #300608; color: #300609; color: #30060a; color: #30060b; color: #30060c; color: #30060d; color: #30060e; color: #30060f;
+color: #300700; color: #300701; color: #300702; color: #300703; color: #300704; color: #300705; color: #300706; color: #300707; color: #300708; color: #300709; color: #30070a; color: #30070b; color: #30070c; color: #30070d; color: #30070e; color: #30070f;
+color: #300800; color: #300801; color: #300802; color: #300803; color: #300804; color: #300805; color: #300806; color: #300807; color: #300808; color: #300809; color: #30080a; color: #30080b; color: #30080c; color: #30080d; color: #30080e; color: #30080f;
+color: #300900; color: #300901; color: #300902; color: #300903; color: #300904; color: #300905; color: #300906; color: #300907; color: #300908; color: #300909; color: #30090a; color: #30090b; color: #30090c; color: #30090d; color: #30090e; color: #30090f;
+color: #300a00; color: #300a01; color: #300a02; color: #300a03; color: #300a04; color: #300a05; color: #300a06; color: #300a07; color: #300a08; color: #300a09; color: #300a0a; color: #300a0b; color: #300a0c; color: #300a0d; color: #300a0e; color: #300a0f;
+color: #300b00; color: #300b01; color: #300b02; color: #300b03; color: #300b04; color: #300b05; color: #300b06; color: #300b07; color: #300b08; color: #300b09; color: #300b0a; color: #300b0b; color: #300b0c; color: #300b0d; color: #300b0e; color: #300b0f;
+color: #300c00; color: #300c01; color: #300c02; color: #300c03; color: #300c04; color: #300c05; color: #300c06; color: #300c07; color: #300c08; color: #300c09; color: #300c0a; color: #300c0b; color: #300c0c; color: #300c0d; color: #300c0e; color: #300c0f;
+color: #300d00; color: #300d01; color: #300d02; color: #300d03; color: #300d04; color: #300d05; color: #300d06; color: #300d07; color: #300d08; color: #300d09; color: #300d0a; color: #300d0b; color: #300d0c; color: #300d0d; color: #300d0e; color: #300d0f;
+color: #300e00; color: #300e01; color: #300e02; color: #300e03; color: #300e04; color: #300e05; color: #300e06; color: #300e07; color: #300e08; color: #300e09; color: #300e0a; color: #300e0b; color: #300e0c; color: #300e0d; color: #300e0e; color: #300e0f;
+color: #300f00; color: #300f01; color: #300f02; color: #300f03; color: #300f04; color: #300f05; color: #300f06; color: #300f07; color: #300f08; color: #300f09; color: #300f0a; color: #300f0b; color: #300f0c; color: #300f0d; color: #300f0e; color: #300f0f;
+color: #301000; color: #301001; color: #301002; color: #301003; color: #301004; color: #301005; color: #301006; color: #301007; color: #301008; color: #301009; color: #30100a; color: #30100b; color: #30100c; color: #30100d; color: #30100e; color: #30100f;
+color: #301100; color: #301101; color: #301102; color: #301103; color: #301104; color: #301105; color: #301106; color: #301107; color: #301108; color: #301109; color: #30110a; color: #30110b; color: #30110c; color: #30110d; color: #30110e; color: #30110f;
+color: #301200; color: #301201; color: #301202; color: #301203; color: #301204; color: #301205; color: #301206; color: #301207; color: #301208; color: #301209; color: #30120a; color: #30120b; color: #30120c; color: #30120d; color: #30120e; color: #30120f;
+color: #301300; color: #301301; color: #301302; color: #301303; color: #301304; color: #301305; color: #301306; color: #301307; color: #301308; color: #301309; color: #30130a; color: #30130b; color: #30130c; color: #30130d; color: #30130e; color: #30130f;
+color: #301400; color: #301401; color: #301402; color: #301403; color: #301404; color: #301405; color: #301406; color: #301407; color: #301408; color: #301409; color: #30140a; color: #30140b; color: #30140c; color: #30140d; color: #30140e; color: #30140f;
+color: #301500; color: #301501; color: #301502; color: #301503; color: #301504; color: #301505; color: #301506; color: #301507; color: #301508; color: #301509; color: #30150a; color: #30150b; color: #30150c; color: #30150d; color: #30150e; color: #30150f;
+color: #301600; color: #301601; color: #301602; color: #301603; color: #301604; color: #301605; color: #301606; color: #301607; color: #301608; color: #301609; color: #30160a; color: #30160b; color: #30160c; color: #30160d; color: #30160e; color: #30160f;
+color: #301700; color: #301701; color: #301702; color: #301703; color: #301704; color: #301705; color: #301706; color: #301707; color: #301708; color: #301709; color: #30170a; color: #30170b; color: #30170c; color: #30170d; color: #30170e; color: #30170f;
+color: #301800; color: #301801; color: #301802; color: #301803; color: #301804; color: #301805; color: #301806; color: #301807; color: #301808; color: #301809; color: #30180a; color: #30180b; color: #30180c; color: #30180d; color: #30180e; color: #30180f;
+color: #301900; color: #301901; color: #301902; color: #301903; color: #301904; color: #301905; color: #301906; color: #301907; color: #301908; color: #301909; color: #30190a; color: #30190b; color: #30190c; color: #30190d; color: #30190e; color: #30190f;
+color: #301a00; color: #301a01; color: #301a02; color: #301a03; color: #301a04; color: #301a05; color: #301a06; color: #301a07; color: #301a08; color: #301a09; color: #301a0a; color: #301a0b; color: #301a0c; color: #301a0d; color: #301a0e; color: #301a0f;
+color: #301b00; color: #301b01; color: #301b02; color: #301b03; color: #301b04; color: #301b05; color: #301b06; color: #301b07; color: #301b08; color: #301b09; color: #301b0a; color: #301b0b; color: #301b0c; color: #301b0d; color: #301b0e; color: #301b0f;
+color: #301c00; color: #301c01; color: #301c02; color: #301c03; color: #301c04; color: #301c05; color: #301c06; color: #301c07; color: #301c08; color: #301c09; color: #301c0a; color: #301c0b; color: #301c0c; color: #301c0d; color: #301c0e; color: #301c0f;
+color: #301d00; color: #301d01; color: #301d02; color: #301d03; color: #301d04; color: #301d05; color: #301d06; color: #301d07; color: #301d08; color: #301d09; color: #301d0a; color: #301d0b; color: #301d0c; color: #301d0d; color: #301d0e; color: #301d0f;
+color: #301e00; color: #301e01; color: #301e02; color: #301e03; color: #301e04; color: #301e05; color: #301e06; color: #301e07; color: #301e08; color: #301e09; color: #301e0a; color: #301e0b; color: #301e0c; color: #301e0d; color: #301e0e; color: #301e0f;
+color: #301f00; color: #301f01; color: #301f02; color: #301f03; color: #301f04; color: #301f05; color: #301f06; color: #301f07; color: #301f08; color: #301f09; color: #301f0a; color: #301f0b; color: #301f0c; color: #301f0d; color: #301f0e; color: #301f0f;
+color: #302000; color: #302001; color: #302002; color: #302003; color: #302004; color: #302005; color: #302006; color: #302007; color: #302008; color: #302009; color: #30200a; color: #30200b; color: #30200c; color: #30200d; color: #30200e; color: #30200f;
+color: #302100; color: #302101; color: #302102; color: #302103; color: #302104; color: #302105; color: #302106; color: #302107; color: #302108; color: #302109; color: #30210a; color: #30210b; color: #30210c; color: #30210d; color: #30210e; color: #30210f;
+color: #302200; color: #302201; color: #302202; color: #302203; color: #302204; color: #302205; color: #302206; color: #302207; color: #302208; color: #302209; color: #30220a; color: #30220b; color: #30220c; color: #30220d; color: #30220e; color: #30220f;
+color: #302300; color: #302301; color: #302302; color: #302303; color: #302304; color: #302305; color: #302306; color: #302307; color: #302308; color: #302309; color: #30230a; color: #30230b; color: #30230c; color: #30230d; color: #30230e; color: #30230f;
+color: #302400; color: #302401; color: #302402; color: #302403; color: #302404; color: #302405; color: #302406; color: #302407; color: #302408; color: #302409; color: #30240a; color: #30240b; color: #30240c; color: #30240d; color: #30240e; color: #30240f;
+color: #302500; color: #302501; color: #302502; color: #302503; color: #302504; color: #302505; color: #302506; color: #302507; color: #302508; color: #302509; color: #30250a; color: #30250b; color: #30250c; color: #30250d; color: #30250e; color: #30250f;
+color: #302600; color: #302601; color: #302602; color: #302603; color: #302604; color: #302605; color: #302606; color: #302607; color: #302608; color: #302609; color: #30260a; color: #30260b; color: #30260c; color: #30260d; color: #30260e; color: #30260f;
+color: #302700; color: #302701; color: #302702; color: #302703; color: #302704; color: #302705; color: #302706; color: #302707; color: #302708; color: #302709; color: #30270a; color: #30270b; color: #30270c; color: #30270d; color: #30270e; color: #30270f;
+color: #302800; color: #302801; color: #302802; color: #302803; color: #302804; color: #302805; color: #302806; color: #302807; color: #302808; color: #302809; color: #30280a; color: #30280b; color: #30280c; color: #30280d; color: #30280e; color: #30280f;
+color: #302900; color: #302901; color: #302902; color: #302903; color: #302904; color: #302905; color: #302906; color: #302907; color: #302908; color: #302909; color: #30290a; color: #30290b; color: #30290c; color: #30290d; color: #30290e; color: #30290f;
+color: #302a00; color: #302a01; color: #302a02; color: #302a03; color: #302a04; color: #302a05; color: #302a06; color: #302a07; color: #302a08; color: #302a09; color: #302a0a; color: #302a0b; color: #302a0c; color: #302a0d; color: #302a0e; color: #302a0f;
+color: #302b00; color: #302b01; color: #302b02; color: #302b03; color: #302b04; color: #302b05; color: #302b06; color: #302b07; color: #302b08; color: #302b09; color: #302b0a; color: #302b0b; color: #302b0c; color: #302b0d; color: #302b0e; color: #302b0f;
+color: #302c00; color: #302c01; color: #302c02; color: #302c03; color: #302c04; color: #302c05; color: #302c06; color: #302c07; color: #302c08; color: #302c09; color: #302c0a; color: #302c0b; color: #302c0c; color: #302c0d; color: #302c0e; color: #302c0f;
+color: #302d00; color: #302d01; color: #302d02; color: #302d03; color: #302d04; color: #302d05; color: #302d06; color: #302d07; color: #302d08; color: #302d09; color: #302d0a; color: #302d0b; color: #302d0c; color: #302d0d; color: #302d0e; color: #302d0f;
+color: #302e00; color: #302e01; color: #302e02; color: #302e03; color: #302e04; color: #302e05; color: #302e06; color: #302e07; color: #302e08; color: #302e09; color: #302e0a; color: #302e0b; color: #302e0c; color: #302e0d; color: #302e0e; color: #302e0f;
+color: #302f00; color: #302f01; color: #302f02; color: #302f03; color: #302f04; color: #302f05; color: #302f06; color: #302f07; color: #302f08; color: #302f09; color: #302f0a; color: #302f0b; color: #302f0c; color: #302f0d; color: #302f0e; color: #302f0f;
+color: #303000; color: #303001; color: #303002; color: #303003; color: #303004; color: #303005; color: #303006; color: #303007; color: #303008; color: #303009; color: #30300a; color: #30300b; color: #30300c; color: #30300d; color: #30300e; color: #30300f;
+color: #303100; color: #303101; color: #303102; color: #303103; color: #303104; color: #303105; color: #303106; color: #303107; color: #303108; color: #303109; color: #30310a; color: #30310b; color: #30310c; color: #30310d; color: #30310e; color: #30310f;
+color: #303200; color: #303201; color: #303202; color: #303203; color: #303204; color: #303205; color: #303206; color: #303207; color: #303208; color: #303209; color: #30320a; color: #30320b; color: #30320c; color: #30320d; color: #30320e; color: #30320f;
+color: #303300; color: #303301; color: #303302; color: #303303; color: #303304; color: #303305; color: #303306; color: #303307; color: #303308; color: #303309; color: #30330a; color: #30330b; color: #30330c; color: #30330d; color: #30330e; color: #30330f;
+color: #303400; color: #303401; color: #303402; color: #303403; color: #303404; color: #303405; color: #303406; color: #303407; color: #303408; color: #303409; color: #30340a; color: #30340b; color: #30340c; color: #30340d; color: #30340e; color: #30340f;
+color: #303500; color: #303501; color: #303502; color: #303503; color: #303504; color: #303505; color: #303506; color: #303507; color: #303508; color: #303509; color: #30350a; color: #30350b; color: #30350c; color: #30350d; color: #30350e; color: #30350f;
+color: #303600; color: #303601; color: #303602; color: #303603; color: #303604; color: #303605; color: #303606; color: #303607; color: #303608; color: #303609; color: #30360a; color: #30360b; color: #30360c; color: #30360d; color: #30360e; color: #30360f;
+color: #303700; color: #303701; color: #303702; color: #303703; color: #303704; color: #303705; color: #303706; color: #303707; color: #303708; color: #303709; color: #30370a; color: #30370b; color: #30370c; color: #30370d; color: #30370e; color: #30370f;
+color: #303800; color: #303801; color: #303802; color: #303803; color: #303804; color: #303805; color: #303806; color: #303807; color: #303808; color: #303809; color: #30380a; color: #30380b; color: #30380c; color: #30380d; color: #30380e; color: #30380f;
+color: #303900; color: #303901; color: #303902; color: #303903; color: #303904; color: #303905; color: #303906; color: #303907; color: #303908; color: #303909; color: #30390a; color: #30390b; color: #30390c; color: #30390d; color: #30390e; color: #30390f;
+color: #303a00; color: #303a01; color: #303a02; color: #303a03; color: #303a04; color: #303a05; color: #303a06; color: #303a07; color: #303a08; color: #303a09; color: #303a0a; color: #303a0b; color: #303a0c; color: #303a0d; color: #303a0e; color: #303a0f;
+color: #303b00; color: #303b01; color: #303b02; color: #303b03; color: #303b04; color: #303b05; color: #303b06; color: #303b07; color: #303b08; color: #303b09; color: #303b0a; color: #303b0b; color: #303b0c; color: #303b0d; color: #303b0e; color: #303b0f;
+color: #303c00; color: #303c01; color: #303c02; color: #303c03; color: #303c04; color: #303c05; color: #303c06; color: #303c07; color: #303c08; color: #303c09; color: #303c0a; color: #303c0b; color: #303c0c; color: #303c0d; color: #303c0e; color: #303c0f;
+color: #303d00; color: #303d01; color: #303d02; color: #303d03; color: #303d04; color: #303d05; color: #303d06; color: #303d07; color: #303d08; color: #303d09; color: #303d0a; color: #303d0b; color: #303d0c; color: #303d0d; color: #303d0e; color: #303d0f;
+color: #303e00; color: #303e01; color: #303e02; color: #303e03; color: #303e04; color: #303e05; color: #303e06; color: #303e07; color: #303e08; color: #303e09; color: #303e0a; color: #303e0b; color: #303e0c; color: #303e0d; color: #303e0e; color: #303e0f;
+color: #303f00; color: #303f01; color: #303f02; color: #303f03; color: #303f04; color: #303f05; color: #303f06; color: #303f07; color: #303f08; color: #303f09; color: #303f0a; color: #303f0b; color: #303f0c; color: #303f0d; color: #303f0e; color: #303f0f;
+color: #304000; color: #304001; color: #304002; color: #304003; color: #304004; color: #304005; color: #304006; color: #304007; color: #304008; color: #304009; color: #30400a; color: #30400b; color: #30400c; color: #30400d; color: #30400e; color: #30400f;
+color: #304100; color: #304101; color: #304102; color: #304103; color: #304104; color: #304105; color: #304106; color: #304107; color: #304108; color: #304109; color: #30410a; color: #30410b; color: #30410c; color: #30410d; color: #30410e; color: #30410f;
+color: #304200; color: #304201; color: #304202; color: #304203; color: #304204; color: #304205; color: #304206; color: #304207; color: #304208; color: #304209; color: #30420a; color: #30420b; color: #30420c; color: #30420d; color: #30420e; color: #30420f;
+color: #304300; color: #304301; color: #304302; color: #304303; color: #304304; color: #304305; color: #304306; color: #304307; color: #304308; color: #304309; color: #30430a; color: #30430b; color: #30430c; color: #30430d; color: #30430e; color: #30430f;
+color: #304400; color: #304401; color: #304402; color: #304403; color: #304404; color: #304405; color: #304406; color: #304407; color: #304408; color: #304409; color: #30440a; color: #30440b; color: #30440c; color: #30440d; color: #30440e; color: #30440f;
+color: #304500; color: #304501; color: #304502; color: #304503; color: #304504; color: #304505; color: #304506; color: #304507; color: #304508; color: #304509; color: #30450a; color: #30450b; color: #30450c; color: #30450d; color: #30450e; color: #30450f;
+color: #304600; color: #304601; color: #304602; color: #304603; color: #304604; color: #304605; color: #304606; color: #304607; color: #304608; color: #304609; color: #30460a; color: #30460b; color: #30460c; color: #30460d; color: #30460e; color: #30460f;
+color: #304700; color: #304701; color: #304702; color: #304703; color: #304704; color: #304705; color: #304706; color: #304707; color: #304708; color: #304709; color: #30470a; color: #30470b; color: #30470c; color: #30470d; color: #30470e; color: #30470f;
+color: #304800; color: #304801; color: #304802; color: #304803; color: #304804; color: #304805; color: #304806; color: #304807; color: #304808; color: #304809; color: #30480a; color: #30480b; color: #30480c; color: #30480d; color: #30480e; color: #30480f;
+color: #304900; color: #304901; color: #304902; color: #304903; color: #304904; color: #304905; color: #304906; color: #304907; color: #304908; color: #304909; color: #30490a; color: #30490b; color: #30490c; color: #30490d; color: #30490e; color: #30490f;
+color: #304a00; color: #304a01; color: #304a02; color: #304a03; color: #304a04; color: #304a05; color: #304a06; color: #304a07; color: #304a08; color: #304a09; color: #304a0a; color: #304a0b; color: #304a0c; color: #304a0d; color: #304a0e; color: #304a0f;
+color: #304b00; color: #304b01; color: #304b02; color: #304b03; color: #304b04; color: #304b05; color: #304b06; color: #304b07; color: #304b08; color: #304b09; color: #304b0a; color: #304b0b; color: #304b0c; color: #304b0d; color: #304b0e; color: #304b0f;
+color: #304c00; color: #304c01; color: #304c02; color: #304c03; color: #304c04; color: #304c05; color: #304c06; color: #304c07; color: #304c08; color: #304c09; color: #304c0a; color: #304c0b; color: #304c0c; color: #304c0d; color: #304c0e; color: #304c0f;
+color: #304d00; color: #304d01; color: #304d02; color: #304d03; color: #304d04; color: #304d05; color: #304d06; color: #304d07; color: #304d08; color: #304d09; color: #304d0a; color: #304d0b; color: #304d0c; color: #304d0d; color: #304d0e; color: #304d0f;
+color: #304e00; color: #304e01; color: #304e02; color: #304e03; color: #304e04; color: #304e05; color: #304e06; color: #304e07; color: #304e08; color: #304e09; color: #304e0a; color: #304e0b; color: #304e0c; color: #304e0d; color: #304e0e; color: #304e0f;
+color: #304f00; color: #304f01; color: #304f02; color: #304f03; color: #304f04; color: #304f05; color: #304f06; color: #304f07; color: #304f08; color: #304f09; color: #304f0a; color: #304f0b; color: #304f0c; color: #304f0d; color: #304f0e; color: #304f0f;
+color: #305000; color: #305001; color: #305002; color: #305003; color: #305004; color: #305005; color: #305006; color: #305007; color: #305008; color: #305009; color: #30500a; color: #30500b; color: #30500c; color: #30500d; color: #30500e; color: #30500f;
+color: #305100; color: #305101; color: #305102; color: #305103; color: #305104; color: #305105; color: #305106; color: #305107; color: #305108; color: #305109; color: #30510a; color: #30510b; color: #30510c; color: #30510d; color: #30510e; color: #30510f;
+color: #305200; color: #305201; color: #305202; color: #305203; color: #305204; color: #305205; color: #305206; color: #305207; color: #305208; color: #305209; color: #30520a; color: #30520b; color: #30520c; color: #30520d; color: #30520e; color: #30520f;
+color: #305300; color: #305301; color: #305302; color: #305303; color: #305304; color: #305305; color: #305306; color: #305307; color: #305308; color: #305309; color: #30530a; color: #30530b; color: #30530c; color: #30530d; color: #30530e; color: #30530f;
+color: #305400; color: #305401; color: #305402; color: #305403; color: #305404; color: #305405; color: #305406; color: #305407; color: #305408; color: #305409; color: #30540a; color: #30540b; color: #30540c; color: #30540d; color: #30540e; color: #30540f;
+color: #305500; color: #305501; color: #305502; color: #305503; color: #305504; color: #305505; color: #305506; color: #305507; color: #305508; color: #305509; color: #30550a; color: #30550b; color: #30550c; color: #30550d; color: #30550e; color: #30550f;
+color: #305600; color: #305601; color: #305602; color: #305603; color: #305604; color: #305605; color: #305606; color: #305607; color: #305608; color: #305609; color: #30560a; color: #30560b; color: #30560c; color: #30560d; color: #30560e; color: #30560f;
+color: #305700; color: #305701; color: #305702; color: #305703; color: #305704; color: #305705; color: #305706; color: #305707; color: #305708; color: #305709; color: #30570a; color: #30570b; color: #30570c; color: #30570d; color: #30570e; color: #30570f;
+color: #305800; color: #305801; color: #305802; color: #305803; color: #305804; color: #305805; color: #305806; color: #305807; color: #305808; color: #305809; color: #30580a; color: #30580b; color: #30580c; color: #30580d; color: #30580e; color: #30580f;
+color: #305900; color: #305901; color: #305902; color: #305903; color: #305904; color: #305905; color: #305906; color: #305907; color: #305908; color: #305909; color: #30590a; color: #30590b; color: #30590c; color: #30590d; color: #30590e; color: #30590f;
+color: #305a00; color: #305a01; color: #305a02; color: #305a03; color: #305a04; color: #305a05; color: #305a06; color: #305a07; color: #305a08; color: #305a09; color: #305a0a; color: #305a0b; color: #305a0c; color: #305a0d; color: #305a0e; color: #305a0f;
+color: #305b00; color: #305b01; color: #305b02; color: #305b03; color: #305b04; color: #305b05; color: #305b06; color: #305b07; color: #305b08; color: #305b09; color: #305b0a; color: #305b0b; color: #305b0c; color: #305b0d; color: #305b0e; color: #305b0f;
+color: #305c00; color: #305c01; color: #305c02; color: #305c03; color: #305c04; color: #305c05; color: #305c06; color: #305c07; color: #305c08; color: #305c09; color: #305c0a; color: #305c0b; color: #305c0c; color: #305c0d; color: #305c0e; color: #305c0f;
+color: #305d00; color: #305d01; color: #305d02; color: #305d03; color: #305d04; color: #305d05; color: #305d06; color: #305d07; color: #305d08; color: #305d09; color: #305d0a; color: #305d0b; color: #305d0c; color: #305d0d; color: #305d0e; color: #305d0f;
+color: #305e00; color: #305e01; color: #305e02; color: #305e03; color: #305e04; color: #305e05; color: #305e06; color: #305e07; color: #305e08; color: #305e09; color: #305e0a; color: #305e0b; color: #305e0c; color: #305e0d; color: #305e0e; color: #305e0f;
+color: #305f00; color: #305f01; color: #305f02; color: #305f03; color: #305f04; color: #305f05; color: #305f06; color: #305f07; color: #305f08; color: #305f09; color: #305f0a; color: #305f0b; color: #305f0c; color: #305f0d; color: #305f0e; color: #305f0f;
+color: #306000; color: #306001; color: #306002; color: #306003; color: #306004; color: #306005; color: #306006; color: #306007; color: #306008; color: #306009; color: #30600a; color: #30600b; color: #30600c; color: #30600d; color: #30600e; color: #30600f;
+color: #306100; color: #306101; color: #306102; color: #306103; color: #306104; color: #306105; color: #306106; color: #306107; color: #306108; color: #306109; color: #30610a; color: #30610b; color: #30610c; color: #30610d; color: #30610e; color: #30610f;
+color: #306200; color: #306201; color: #306202; color: #306203; color: #306204; color: #306205; color: #306206; color: #306207; color: #306208; color: #306209; color: #30620a; color: #30620b; color: #30620c; color: #30620d; color: #30620e; color: #30620f;
+color: #306300; color: #306301; color: #306302; color: #306303; color: #306304; color: #306305; color: #306306; color: #306307; color: #306308; color: #306309; color: #30630a; color: #30630b; color: #30630c; color: #30630d; color: #30630e; color: #30630f;
+color: #306400; color: #306401; color: #306402; color: #306403; color: #306404; color: #306405; color: #306406; color: #306407; color: #306408; color: #306409; color: #30640a; color: #30640b; color: #30640c; color: #30640d; color: #30640e; color: #30640f;
+color: #306500; color: #306501; color: #306502; color: #306503; color: #306504; color: #306505; color: #306506; color: #306507; color: #306508; color: #306509; color: #30650a; color: #30650b; color: #30650c; color: #30650d; color: #30650e; color: #30650f;
+color: #306600; color: #306601; color: #306602; color: #306603; color: #306604; color: #306605; color: #306606; color: #306607; color: #306608; color: #306609; color: #30660a; color: #30660b; color: #30660c; color: #30660d; color: #30660e; color: #30660f;
+color: #306700; color: #306701; color: #306702; color: #306703; color: #306704; color: #306705; color: #306706; color: #306707; color: #306708; color: #306709; color: #30670a; color: #30670b; color: #30670c; color: #30670d; color: #30670e; color: #30670f;
+color: #306800; color: #306801; color: #306802; color: #306803; color: #306804; color: #306805; color: #306806; color: #306807; color: #306808; color: #306809; color: #30680a; color: #30680b; color: #30680c; color: #30680d; color: #30680e; color: #30680f;
+color: #306900; color: #306901; color: #306902; color: #306903; color: #306904; color: #306905; color: #306906; color: #306907; color: #306908; color: #306909; color: #30690a; color: #30690b; color: #30690c; color: #30690d; color: #30690e; color: #30690f;
+color: #306a00; color: #306a01; color: #306a02; color: #306a03; color: #306a04; color: #306a05; color: #306a06; color: #306a07; color: #306a08; color: #306a09; color: #306a0a; color: #306a0b; color: #306a0c; color: #306a0d; color: #306a0e; color: #306a0f;
+color: #306b00; color: #306b01; color: #306b02; color: #306b03; color: #306b04; color: #306b05; color: #306b06; color: #306b07; color: #306b08; color: #306b09; color: #306b0a; color: #306b0b; color: #306b0c; color: #306b0d; color: #306b0e; color: #306b0f;
+color: #306c00; color: #306c01; color: #306c02; color: #306c03; color: #306c04; color: #306c05; color: #306c06; color: #306c07; color: #306c08; color: #306c09; color: #306c0a; color: #306c0b; color: #306c0c; color: #306c0d; color: #306c0e; color: #306c0f;
+color: #306d00; color: #306d01; color: #306d02; color: #306d03; color: #306d04; color: #306d05; color: #306d06; color: #306d07; color: #306d08; color: #306d09; color: #306d0a; color: #306d0b; color: #306d0c; color: #306d0d; color: #306d0e; color: #306d0f;
+color: #306e00; color: #306e01; color: #306e02; color: #306e03; color: #306e04; color: #306e05; color: #306e06; color: #306e07; color: #306e08; color: #306e09; color: #306e0a; color: #306e0b; color: #306e0c; color: #306e0d; color: #306e0e; color: #306e0f;
+color: #306f00; color: #306f01; color: #306f02; color: #306f03; color: #306f04; color: #306f05; color: #306f06; color: #306f07; color: #306f08; color: #306f09; color: #306f0a; color: #306f0b; color: #306f0c; color: #306f0d; color: #306f0e; color: #306f0f;
+color: #307000; color: #307001; color: #307002; color: #307003; color: #307004; color: #307005; color: #307006; color: #307007; color: #307008; color: #307009; color: #30700a; color: #30700b; color: #30700c; color: #30700d; color: #30700e; color: #30700f;
+color: #307100; color: #307101; color: #307102; color: #307103; color: #307104; color: #307105; color: #307106; color: #307107; color: #307108; color: #307109; color: #30710a; color: #30710b; color: #30710c; color: #30710d; color: #30710e; color: #30710f;
+color: #307200; color: #307201; color: #307202; color: #307203; color: #307204; color: #307205; color: #307206; color: #307207; color: #307208; color: #307209; color: #30720a; color: #30720b; color: #30720c; color: #30720d; color: #30720e; color: #30720f;
+color: #307300; color: #307301; color: #307302; color: #307303; color: #307304; color: #307305; color: #307306; color: #307307; color: #307308; color: #307309; color: #30730a; color: #30730b; color: #30730c; color: #30730d; color: #30730e; color: #30730f;
+color: #307400; color: #307401; color: #307402; color: #307403; color: #307404; color: #307405; color: #307406; color: #307407; color: #307408; color: #307409; color: #30740a; color: #30740b; color: #30740c; color: #30740d; color: #30740e; color: #30740f;
+color: #307500; color: #307501; color: #307502; color: #307503; color: #307504; color: #307505; color: #307506; color: #307507; color: #307508; color: #307509; color: #30750a; color: #30750b; color: #30750c; color: #30750d; color: #30750e; color: #30750f;
+color: #307600; color: #307601; color: #307602; color: #307603; color: #307604; color: #307605; color: #307606; color: #307607; color: #307608; color: #307609; color: #30760a; color: #30760b; color: #30760c; color: #30760d; color: #30760e; color: #30760f;
+color: #307700; color: #307701; color: #307702; color: #307703; color: #307704; color: #307705; color: #307706; color: #307707; color: #307708; color: #307709; color: #30770a; color: #30770b; color: #30770c; color: #30770d; color: #30770e; color: #30770f;
+color: #307800; color: #307801; color: #307802; color: #307803; color: #307804; color: #307805; color: #307806; color: #307807; color: #307808; color: #307809; color: #30780a; color: #30780b; color: #30780c; color: #30780d; color: #30780e; color: #30780f;
+color: #307900; color: #307901; color: #307902; color: #307903; color: #307904; color: #307905; color: #307906; color: #307907; color: #307908; color: #307909; color: #30790a; color: #30790b; color: #30790c; color: #30790d; color: #30790e; color: #30790f;
+color: #307a00; color: #307a01; color: #307a02; color: #307a03; color: #307a04; color: #307a05; color: #307a06; color: #307a07; color: #307a08; color: #307a09; color: #307a0a; color: #307a0b; color: #307a0c; color: #307a0d; color: #307a0e; color: #307a0f;
+color: #307b00; color: #307b01; color: #307b02; color: #307b03; color: #307b04; color: #307b05; color: #307b06; color: #307b07; color: #307b08; color: #307b09; color: #307b0a; color: #307b0b; color: #307b0c; color: #307b0d; color: #307b0e; color: #307b0f;
+color: #307c00; color: #307c01; color: #307c02; color: #307c03; color: #307c04; color: #307c05; color: #307c06; color: #307c07; color: #307c08; color: #307c09; color: #307c0a; color: #307c0b; color: #307c0c; color: #307c0d; color: #307c0e; color: #307c0f;
+color: #307d00; color: #307d01; color: #307d02; color: #307d03; color: #307d04; color: #307d05; color: #307d06; color: #307d07; color: #307d08; color: #307d09; color: #307d0a; color: #307d0b; color: #307d0c; color: #307d0d; color: #307d0e; color: #307d0f;
+color: #307e00; color: #307e01; color: #307e02; color: #307e03; color: #307e04; color: #307e05; color: #307e06; color: #307e07; color: #307e08; color: #307e09; color: #307e0a; color: #307e0b; color: #307e0c; color: #307e0d; color: #307e0e; color: #307e0f;
+color: #307f00; color: #307f01; color: #307f02; color: #307f03; color: #307f04; color: #307f05; color: #307f06; color: #307f07; color: #307f08; color: #307f09; color: #307f0a; color: #307f0b; color: #307f0c; color: #307f0d; color: #307f0e; color: #307f0f;
+color: #308000; color: #308001; color: #308002; color: #308003; color: #308004; color: #308005; color: #308006; color: #308007; color: #308008; color: #308009; color: #30800a; color: #30800b; color: #30800c; color: #30800d; color: #30800e; color: #30800f;
+color: #308100; color: #308101; color: #308102; color: #308103; color: #308104; color: #308105; color: #308106; color: #308107; color: #308108; color: #308109; color: #30810a; color: #30810b; color: #30810c; color: #30810d; color: #30810e; color: #30810f;
+color: #308200; color: #308201; color: #308202; color: #308203; color: #308204; color: #308205; color: #308206; color: #308207; color: #308208; color: #308209; color: #30820a; color: #30820b; color: #30820c; color: #30820d; color: #30820e; color: #30820f;
+color: #308300; color: #308301; color: #308302; color: #308303; color: #308304; color: #308305; color: #308306; color: #308307; color: #308308; color: #308309; color: #30830a; color: #30830b; color: #30830c; color: #30830d; color: #30830e; color: #30830f;
+color: #308400; color: #308401; color: #308402; color: #308403; color: #308404; color: #308405; color: #308406; color: #308407; color: #308408; color: #308409; color: #30840a; color: #30840b; color: #30840c; color: #30840d; color: #30840e; color: #30840f;
+color: #308500; color: #308501; color: #308502; color: #308503; color: #308504; color: #308505; color: #308506; color: #308507; color: #308508; color: #308509; color: #30850a; color: #30850b; color: #30850c; color: #30850d; color: #30850e; color: #30850f;
+color: #308600; color: #308601; color: #308602; color: #308603; color: #308604; color: #308605; color: #308606; color: #308607; color: #308608; color: #308609; color: #30860a; color: #30860b; color: #30860c; color: #30860d; color: #30860e; color: #30860f;
+color: #308700; color: #308701; color: #308702; color: #308703; color: #308704; color: #308705; color: #308706; color: #308707; color: #308708; color: #308709; color: #30870a; color: #30870b; color: #30870c; color: #30870d; color: #30870e; color: #30870f;
+color: #308800; color: #308801; color: #308802; color: #308803; color: #308804; color: #308805; color: #308806; color: #308807; color: #308808; color: #308809; color: #30880a; color: #30880b; color: #30880c; color: #30880d; color: #30880e; color: #30880f;
+color: #308900; color: #308901; color: #308902; color: #308903; color: #308904; color: #308905; color: #308906; color: #308907; color: #308908; color: #308909; color: #30890a; color: #30890b; color: #30890c; color: #30890d; color: #30890e; color: #30890f;
+color: #308a00; color: #308a01; color: #308a02; color: #308a03; color: #308a04; color: #308a05; color: #308a06; color: #308a07; color: #308a08; color: #308a09; color: #308a0a; color: #308a0b; color: #308a0c; color: #308a0d; color: #308a0e; color: #308a0f;
+color: #308b00; color: #308b01; color: #308b02; color: #308b03; color: #308b04; color: #308b05; color: #308b06; color: #308b07; color: #308b08; color: #308b09; color: #308b0a; color: #308b0b; color: #308b0c; color: #308b0d; color: #308b0e; color: #308b0f;
+color: #308c00; color: #308c01; color: #308c02; color: #308c03; color: #308c04; color: #308c05; color: #308c06; color: #308c07; color: #308c08; color: #308c09; color: #308c0a; color: #308c0b; color: #308c0c; color: #308c0d; color: #308c0e; color: #308c0f;
+color: #308d00; color: #308d01; color: #308d02; color: #308d03; color: #308d04; color: #308d05; color: #308d06; color: #308d07; color: #308d08; color: #308d09; color: #308d0a; color: #308d0b; color: #308d0c; color: #308d0d; color: #308d0e; color: #308d0f;
+color: #308e00; color: #308e01; color: #308e02; color: #308e03; color: #308e04; color: #308e05; color: #308e06; color: #308e07; color: #308e08; color: #308e09; color: #308e0a; color: #308e0b; color: #308e0c; color: #308e0d; color: #308e0e; color: #308e0f;
+color: #308f00; color: #308f01; color: #308f02; color: #308f03; color: #308f04; color: #308f05; color: #308f06; color: #308f07; color: #308f08; color: #308f09; color: #308f0a; color: #308f0b; color: #308f0c; color: #308f0d; color: #308f0e; color: #308f0f;
+color: #309000; color: #309001; color: #309002; color: #309003; color: #309004; color: #309005; color: #309006; color: #309007; color: #309008; color: #309009; color: #30900a; color: #30900b; color: #30900c; color: #30900d; color: #30900e; color: #30900f;
+color: #309100; color: #309101; color: #309102; color: #309103; color: #309104; color: #309105; color: #309106; color: #309107; color: #309108; color: #309109; color: #30910a; color: #30910b; color: #30910c; color: #30910d; color: #30910e; color: #30910f;
+color: #309200; color: #309201; color: #309202; color: #309203; color: #309204; color: #309205; color: #309206; color: #309207; color: #309208; color: #309209; color: #30920a; color: #30920b; color: #30920c; color: #30920d; color: #30920e; color: #30920f;
+color: #309300; color: #309301; color: #309302; color: #309303; color: #309304; color: #309305; color: #309306; color: #309307; color: #309308; color: #309309; color: #30930a; color: #30930b; color: #30930c; color: #30930d; color: #30930e; color: #30930f;
+color: #309400; color: #309401; color: #309402; color: #309403; color: #309404; color: #309405; color: #309406; color: #309407; color: #309408; color: #309409; color: #30940a; color: #30940b; color: #30940c; color: #30940d; color: #30940e; color: #30940f;
+color: #309500; color: #309501; color: #309502; color: #309503; color: #309504; color: #309505; color: #309506; color: #309507; color: #309508; color: #309509; color: #30950a; color: #30950b; color: #30950c; color: #30950d; color: #30950e; color: #30950f;
+color: #309600; color: #309601; color: #309602; color: #309603; color: #309604; color: #309605; color: #309606; color: #309607; color: #309608; color: #309609; color: #30960a; color: #30960b; color: #30960c; color: #30960d; color: #30960e; color: #30960f;
+color: #309700; color: #309701; color: #309702; color: #309703; color: #309704; color: #309705; color: #309706; color: #309707; color: #309708; color: #309709; color: #30970a; color: #30970b; color: #30970c; color: #30970d; color: #30970e; color: #30970f;
+color: #309800; color: #309801; color: #309802; color: #309803; color: #309804; color: #309805; color: #309806; color: #309807; color: #309808; color: #309809; color: #30980a; color: #30980b; color: #30980c; color: #30980d; color: #30980e; color: #30980f;
+color: #309900; color: #309901; color: #309902; color: #309903; color: #309904; color: #309905; color: #309906; color: #309907; color: #309908; color: #309909; color: #30990a; color: #30990b; color: #30990c; color: #30990d; color: #30990e; color: #30990f;
+color: #309a00; color: #309a01; color: #309a02; color: #309a03; color: #309a04; color: #309a05; color: #309a06; color: #309a07; color: #309a08; color: #309a09; color: #309a0a; color: #309a0b; color: #309a0c; color: #309a0d; color: #309a0e; color: #309a0f;
+color: #309b00; color: #309b01; color: #309b02; color: #309b03; color: #309b04; color: #309b05; color: #309b06; color: #309b07; color: #309b08; color: #309b09; color: #309b0a; color: #309b0b; color: #309b0c; color: #309b0d; color: #309b0e; color: #309b0f;
+color: #309c00; color: #309c01; color: #309c02; color: #309c03; color: #309c04; color: #309c05; color: #309c06; color: #309c07; color: #309c08; color: #309c09; color: #309c0a; color: #309c0b; color: #309c0c; color: #309c0d; color: #309c0e; color: #309c0f;
+color: #309d00; color: #309d01; color: #309d02; color: #309d03; color: #309d04; color: #309d05; color: #309d06; color: #309d07; color: #309d08; color: #309d09; color: #309d0a; color: #309d0b; color: #309d0c; color: #309d0d; color: #309d0e; color: #309d0f;
+color: #309e00; color: #309e01; color: #309e02; color: #309e03; color: #309e04; color: #309e05; color: #309e06; color: #309e07; color: #309e08; color: #309e09; color: #309e0a; color: #309e0b; color: #309e0c; color: #309e0d; color: #309e0e; color: #309e0f;
+color: #309f00; color: #309f01; color: #309f02; color: #309f03; color: #309f04; color: #309f05; color: #309f06; color: #309f07; color: #309f08; color: #309f09; color: #309f0a; color: #309f0b; color: #309f0c; color: #309f0d; color: #309f0e; color: #309f0f;
+color: #30a000; color: #30a001; color: #30a002; color: #30a003; color: #30a004; color: #30a005; color: #30a006; color: #30a007; color: #30a008; color: #30a009; color: #30a00a; color: #30a00b; color: #30a00c; color: #30a00d; color: #30a00e; color: #30a00f;
+color: #30a100; color: #30a101; color: #30a102; color: #30a103; color: #30a104; color: #30a105; color: #30a106; color: #30a107; color: #30a108; color: #30a109; color: #30a10a; color: #30a10b; color: #30a10c; color: #30a10d; color: #30a10e; color: #30a10f;
+color: #30a200; color: #30a201; color: #30a202; color: #30a203; color: #30a204; color: #30a205; color: #30a206; color: #30a207; color: #30a208; color: #30a209; color: #30a20a; color: #30a20b; color: #30a20c; color: #30a20d; color: #30a20e; color: #30a20f;
+color: #30a300; color: #30a301; color: #30a302; color: #30a303; color: #30a304; color: #30a305; color: #30a306; color: #30a307; color: #30a308; color: #30a309; color: #30a30a; color: #30a30b; color: #30a30c; color: #30a30d; color: #30a30e; color: #30a30f;
+color: #30a400; color: #30a401; color: #30a402; color: #30a403; color: #30a404; color: #30a405; color: #30a406; color: #30a407; color: #30a408; color: #30a409; color: #30a40a; color: #30a40b; color: #30a40c; color: #30a40d; color: #30a40e; color: #30a40f;
+color: #30a500; color: #30a501; color: #30a502; color: #30a503; color: #30a504; color: #30a505; color: #30a506; color: #30a507; color: #30a508; color: #30a509; color: #30a50a; color: #30a50b; color: #30a50c; color: #30a50d; color: #30a50e; color: #30a50f;
+color: #30a600; color: #30a601; color: #30a602; color: #30a603; color: #30a604; color: #30a605; color: #30a606; color: #30a607; color: #30a608; color: #30a609; color: #30a60a; color: #30a60b; color: #30a60c; color: #30a60d; color: #30a60e; color: #30a60f;
+color: #30a700; color: #30a701; color: #30a702; color: #30a703; color: #30a704; color: #30a705; color: #30a706; color: #30a707; color: #30a708; color: #30a709; color: #30a70a; color: #30a70b; color: #30a70c; color: #30a70d; color: #30a70e; color: #30a70f;
+color: #30a800; color: #30a801; color: #30a802; color: #30a803; color: #30a804; color: #30a805; color: #30a806; color: #30a807; color: #30a808; color: #30a809; color: #30a80a; color: #30a80b; color: #30a80c; color: #30a80d; color: #30a80e; color: #30a80f;
+color: #30a900; color: #30a901; color: #30a902; color: #30a903; color: #30a904; color: #30a905; color: #30a906; color: #30a907; color: #30a908; color: #30a909; color: #30a90a; color: #30a90b; color: #30a90c; color: #30a90d; color: #30a90e; color: #30a90f;
+color: #30aa00; color: #30aa01; color: #30aa02; color: #30aa03; color: #30aa04; color: #30aa05; color: #30aa06; color: #30aa07; color: #30aa08; color: #30aa09; color: #30aa0a; color: #30aa0b; color: #30aa0c; color: #30aa0d; color: #30aa0e; color: #30aa0f;
+color: #30ab00; color: #30ab01; color: #30ab02; color: #30ab03; color: #30ab04; color: #30ab05; color: #30ab06; color: #30ab07; color: #30ab08; color: #30ab09; color: #30ab0a; color: #30ab0b; color: #30ab0c; color: #30ab0d; color: #30ab0e; color: #30ab0f;
+color: #30ac00; color: #30ac01; color: #30ac02; color: #30ac03; color: #30ac04; color: #30ac05; color: #30ac06; color: #30ac07; color: #30ac08; color: #30ac09; color: #30ac0a; color: #30ac0b; color: #30ac0c; color: #30ac0d; color: #30ac0e; color: #30ac0f;
+color: #30ad00; color: #30ad01; color: #30ad02; color: #30ad03; color: #30ad04; color: #30ad05; color: #30ad06; color: #30ad07; color: #30ad08; color: #30ad09; color: #30ad0a; color: #30ad0b; color: #30ad0c; color: #30ad0d; color: #30ad0e; color: #30ad0f;
+color: #30ae00; color: #30ae01; color: #30ae02; color: #30ae03; color: #30ae04; color: #30ae05; color: #30ae06; color: #30ae07; color: #30ae08; color: #30ae09; color: #30ae0a; color: #30ae0b; color: #30ae0c; color: #30ae0d; color: #30ae0e; color: #30ae0f;
+color: #30af00; color: #30af01; color: #30af02; color: #30af03; color: #30af04; color: #30af05; color: #30af06; color: #30af07; color: #30af08; color: #30af09; color: #30af0a; color: #30af0b; color: #30af0c; color: #30af0d; color: #30af0e; color: #30af0f;
+color: #30b000; color: #30b001; color: #30b002; color: #30b003; color: #30b004; color: #30b005; color: #30b006; color: #30b007; color: #30b008; color: #30b009; color: #30b00a; color: #30b00b; color: #30b00c; color: #30b00d; color: #30b00e; color: #30b00f;
+color: #30b100; color: #30b101; color: #30b102; color: #30b103; color: #30b104; color: #30b105; color: #30b106; color: #30b107; color: #30b108; color: #30b109; color: #30b10a; color: #30b10b; color: #30b10c; color: #30b10d; color: #30b10e; color: #30b10f;
+color: #30b200; color: #30b201; color: #30b202; color: #30b203; color: #30b204; color: #30b205; color: #30b206; color: #30b207; color: #30b208; color: #30b209; color: #30b20a; color: #30b20b; color: #30b20c; color: #30b20d; color: #30b20e; color: #30b20f;
+color: #30b300; color: #30b301; color: #30b302; color: #30b303; color: #30b304; color: #30b305; color: #30b306; color: #30b307; color: #30b308; color: #30b309; color: #30b30a; color: #30b30b; color: #30b30c; color: #30b30d; color: #30b30e; color: #30b30f;
+color: #30b400; color: #30b401; color: #30b402; color: #30b403; color: #30b404; color: #30b405; color: #30b406; color: #30b407; color: #30b408; color: #30b409; color: #30b40a; color: #30b40b; color: #30b40c; color: #30b40d; color: #30b40e; color: #30b40f;
+color: #30b500; color: #30b501; color: #30b502; color: #30b503; color: #30b504; color: #30b505; color: #30b506; color: #30b507; color: #30b508; color: #30b509; color: #30b50a; color: #30b50b; color: #30b50c; color: #30b50d; color: #30b50e; color: #30b50f;
+color: #30b600; color: #30b601; color: #30b602; color: #30b603; color: #30b604; color: #30b605; color: #30b606; color: #30b607; color: #30b608; color: #30b609; color: #30b60a; color: #30b60b; color: #30b60c; color: #30b60d; color: #30b60e; color: #30b60f;
+color: #30b700; color: #30b701; color: #30b702; color: #30b703; color: #30b704; color: #30b705; color: #30b706; color: #30b707; color: #30b708; color: #30b709; color: #30b70a; color: #30b70b; color: #30b70c; color: #30b70d; color: #30b70e; color: #30b70f;
+color: #30b800; color: #30b801; color: #30b802; color: #30b803; color: #30b804; color: #30b805; color: #30b806; color: #30b807; color: #30b808; color: #30b809; color: #30b80a; color: #30b80b; color: #30b80c; color: #30b80d; color: #30b80e; color: #30b80f;
+color: #30b900; color: #30b901; color: #30b902; color: #30b903; color: #30b904; color: #30b905; color: #30b906; color: #30b907; color: #30b908; color: #30b909; color: #30b90a; color: #30b90b; color: #30b90c; color: #30b90d; color: #30b90e; color: #30b90f;
+color: #30ba00; color: #30ba01; color: #30ba02; color: #30ba03; color: #30ba04; color: #30ba05; color: #30ba06; color: #30ba07; color: #30ba08; color: #30ba09; color: #30ba0a; color: #30ba0b; color: #30ba0c; color: #30ba0d; color: #30ba0e; color: #30ba0f;
+color: #30bb00; color: #30bb01; color: #30bb02; color: #30bb03; color: #30bb04; color: #30bb05; color: #30bb06; color: #30bb07; color: #30bb08; color: #30bb09; color: #30bb0a; color: #30bb0b; color: #30bb0c; color: #30bb0d; color: #30bb0e; color: #30bb0f;
+color: #30bc00; color: #30bc01; color: #30bc02; color: #30bc03; color: #30bc04; color: #30bc05; color: #30bc06; color: #30bc07; color: #30bc08; color: #30bc09; color: #30bc0a; color: #30bc0b; color: #30bc0c; color: #30bc0d; color: #30bc0e; color: #30bc0f;
+color: #30bd00; color: #30bd01; color: #30bd02; color: #30bd03; color: #30bd04; color: #30bd05; color: #30bd06; color: #30bd07; color: #30bd08; color: #30bd09; color: #30bd0a; color: #30bd0b; color: #30bd0c; color: #30bd0d; color: #30bd0e; color: #30bd0f;
+color: #30be00; color: #30be01; color: #30be02; color: #30be03; color: #30be04; color: #30be05; color: #30be06; color: #30be07; color: #30be08; color: #30be09; color: #30be0a; color: #30be0b; color: #30be0c; color: #30be0d; color: #30be0e; color: #30be0f;
+color: #30bf00; color: #30bf01; color: #30bf02; color: #30bf03; color: #30bf04; color: #30bf05; color: #30bf06; color: #30bf07; color: #30bf08; color: #30bf09; color: #30bf0a; color: #30bf0b; color: #30bf0c; color: #30bf0d; color: #30bf0e; color: #30bf0f;
+color: #30c000; color: #30c001; color: #30c002; color: #30c003; color: #30c004; color: #30c005; color: #30c006; color: #30c007; color: #30c008; color: #30c009; color: #30c00a; color: #30c00b; color: #30c00c; color: #30c00d; color: #30c00e; color: #30c00f;
+color: #30c100; color: #30c101; color: #30c102; color: #30c103; color: #30c104; color: #30c105; color: #30c106; color: #30c107; color: #30c108; color: #30c109; color: #30c10a; color: #30c10b; color: #30c10c; color: #30c10d; color: #30c10e; color: #30c10f;
+color: #30c200; color: #30c201; color: #30c202; color: #30c203; color: #30c204; color: #30c205; color: #30c206; color: #30c207; color: #30c208; color: #30c209; color: #30c20a; color: #30c20b; color: #30c20c; color: #30c20d; color: #30c20e; color: #30c20f;
+color: #30c300; color: #30c301; color: #30c302; color: #30c303; color: #30c304; color: #30c305; color: #30c306; color: #30c307; color: #30c308; color: #30c309; color: #30c30a; color: #30c30b; color: #30c30c; color: #30c30d; color: #30c30e; color: #30c30f;
+color: #30c400; color: #30c401; color: #30c402; color: #30c403; color: #30c404; color: #30c405; color: #30c406; color: #30c407; color: #30c408; color: #30c409; color: #30c40a; color: #30c40b; color: #30c40c; color: #30c40d; color: #30c40e; color: #30c40f;
+color: #30c500; color: #30c501; color: #30c502; color: #30c503; color: #30c504; color: #30c505; color: #30c506; color: #30c507; color: #30c508; color: #30c509; color: #30c50a; color: #30c50b; color: #30c50c; color: #30c50d; color: #30c50e; color: #30c50f;
+color: #30c600; color: #30c601; color: #30c602; color: #30c603; color: #30c604; color: #30c605; color: #30c606; color: #30c607; color: #30c608; color: #30c609; color: #30c60a; color: #30c60b; color: #30c60c; color: #30c60d; color: #30c60e; color: #30c60f;
+color: #30c700; color: #30c701; color: #30c702; color: #30c703; color: #30c704; color: #30c705; color: #30c706; color: #30c707; color: #30c708; color: #30c709; color: #30c70a; color: #30c70b; color: #30c70c; color: #30c70d; color: #30c70e; color: #30c70f;
+color: #30c800; color: #30c801; color: #30c802; color: #30c803; color: #30c804; color: #30c805; color: #30c806; color: #30c807; color: #30c808; color: #30c809; color: #30c80a; color: #30c80b; color: #30c80c; color: #30c80d; color: #30c80e; color: #30c80f;
+color: #30c900; color: #30c901; color: #30c902; color: #30c903; color: #30c904; color: #30c905; color: #30c906; color: #30c907; color: #30c908; color: #30c909; color: #30c90a; color: #30c90b; color: #30c90c; color: #30c90d; color: #30c90e; color: #30c90f;
+color: #30ca00; color: #30ca01; color: #30ca02; color: #30ca03; color: #30ca04; color: #30ca05; color: #30ca06; color: #30ca07; color: #30ca08; color: #30ca09; color: #30ca0a; color: #30ca0b; color: #30ca0c; color: #30ca0d; color: #30ca0e; color: #30ca0f;
+color: #30cb00; color: #30cb01; color: #30cb02; color: #30cb03; color: #30cb04; color: #30cb05; color: #30cb06; color: #30cb07; color: #30cb08; color: #30cb09; color: #30cb0a; color: #30cb0b; color: #30cb0c; color: #30cb0d; color: #30cb0e; color: #30cb0f;
+color: #30cc00; color: #30cc01; color: #30cc02; color: #30cc03; color: #30cc04; color: #30cc05; color: #30cc06; color: #30cc07; color: #30cc08; color: #30cc09; color: #30cc0a; color: #30cc0b; color: #30cc0c; color: #30cc0d; color: #30cc0e; color: #30cc0f;
+color: #30cd00; color: #30cd01; color: #30cd02; color: #30cd03; color: #30cd04; color: #30cd05; color: #30cd06; color: #30cd07; color: #30cd08; color: #30cd09; color: #30cd0a; color: #30cd0b; color: #30cd0c; color: #30cd0d; color: #30cd0e; color: #30cd0f;
+color: #30ce00; color: #30ce01; color: #30ce02; color: #30ce03; color: #30ce04; color: #30ce05; color: #30ce06; color: #30ce07; color: #30ce08; color: #30ce09; color: #30ce0a; color: #30ce0b; color: #30ce0c; color: #30ce0d; color: #30ce0e; color: #30ce0f;
+color: #30cf00; color: #30cf01; color: #30cf02; color: #30cf03; color: #30cf04; color: #30cf05; color: #30cf06; color: #30cf07; color: #30cf08; color: #30cf09; color: #30cf0a; color: #30cf0b; color: #30cf0c; color: #30cf0d; color: #30cf0e; color: #30cf0f;
+color: #30d000; color: #30d001; color: #30d002; color: #30d003; color: #30d004; color: #30d005; color: #30d006; color: #30d007; color: #30d008; color: #30d009; color: #30d00a; color: #30d00b; color: #30d00c; color: #30d00d; color: #30d00e; color: #30d00f;
+color: #30d100; color: #30d101; color: #30d102; color: #30d103; color: #30d104; color: #30d105; color: #30d106; color: #30d107; color: #30d108; color: #30d109; color: #30d10a; color: #30d10b; color: #30d10c; color: #30d10d; color: #30d10e; color: #30d10f;
+color: #30d200; color: #30d201; color: #30d202; color: #30d203; color: #30d204; color: #30d205; color: #30d206; color: #30d207; color: #30d208; color: #30d209; color: #30d20a; color: #30d20b; color: #30d20c; color: #30d20d; color: #30d20e; color: #30d20f;
+color: #30d300; color: #30d301; color: #30d302; color: #30d303; color: #30d304; color: #30d305; color: #30d306; color: #30d307; color: #30d308; color: #30d309; color: #30d30a; color: #30d30b; color: #30d30c; color: #30d30d; color: #30d30e; color: #30d30f;
+color: #30d400; color: #30d401; color: #30d402; color: #30d403; color: #30d404; color: #30d405; color: #30d406; color: #30d407; color: #30d408; color: #30d409; color: #30d40a; color: #30d40b; color: #30d40c; color: #30d40d; color: #30d40e; color: #30d40f;
+color: #30d500; color: #30d501; color: #30d502; color: #30d503; color: #30d504; color: #30d505; color: #30d506; color: #30d507; color: #30d508; color: #30d509; color: #30d50a; color: #30d50b; color: #30d50c; color: #30d50d; color: #30d50e; color: #30d50f;
+color: #30d600; color: #30d601; color: #30d602; color: #30d603; color: #30d604; color: #30d605; color: #30d606; color: #30d607; color: #30d608; color: #30d609; color: #30d60a; color: #30d60b; color: #30d60c; color: #30d60d; color: #30d60e; color: #30d60f;
+color: #30d700; color: #30d701; color: #30d702; color: #30d703; color: #30d704; color: #30d705; color: #30d706; color: #30d707; color: #30d708; color: #30d709; color: #30d70a; color: #30d70b; color: #30d70c; color: #30d70d; color: #30d70e; color: #30d70f;
+color: #30d800; color: #30d801; color: #30d802; color: #30d803; color: #30d804; color: #30d805; color: #30d806; color: #30d807; color: #30d808; color: #30d809; color: #30d80a; color: #30d80b; color: #30d80c; color: #30d80d; color: #30d80e; color: #30d80f;
+color: #30d900; color: #30d901; color: #30d902; color: #30d903; color: #30d904; color: #30d905; color: #30d906; color: #30d907; color: #30d908; color: #30d909; color: #30d90a; color: #30d90b; color: #30d90c; color: #30d90d; color: #30d90e; color: #30d90f;
+color: #30da00; color: #30da01; color: #30da02; color: #30da03; color: #30da04; color: #30da05; color: #30da06; color: #30da07; color: #30da08; color: #30da09; color: #30da0a; color: #30da0b; color: #30da0c; color: #30da0d; color: #30da0e; color: #30da0f;
+color: #30db00; color: #30db01; color: #30db02; color: #30db03; color: #30db04; color: #30db05; color: #30db06; color: #30db07; color: #30db08; color: #30db09; color: #30db0a; color: #30db0b; color: #30db0c; color: #30db0d; color: #30db0e; color: #30db0f;
+color: #30dc00; color: #30dc01; color: #30dc02; color: #30dc03; color: #30dc04; color: #30dc05; color: #30dc06; color: #30dc07; color: #30dc08; color: #30dc09; color: #30dc0a; color: #30dc0b; color: #30dc0c; color: #30dc0d; color: #30dc0e; color: #30dc0f;
+color: #30dd00; color: #30dd01; color: #30dd02; color: #30dd03; color: #30dd04; color: #30dd05; color: #30dd06; color: #30dd07; color: #30dd08; color: #30dd09; color: #30dd0a; color: #30dd0b; color: #30dd0c; color: #30dd0d; color: #30dd0e; color: #30dd0f;
+color: #30de00; color: #30de01; color: #30de02; color: #30de03; color: #30de04; color: #30de05; color: #30de06; color: #30de07; color: #30de08; color: #30de09; color: #30de0a; color: #30de0b; color: #30de0c; color: #30de0d; color: #30de0e; color: #30de0f;
+color: #30df00; color: #30df01; color: #30df02; color: #30df03; color: #30df04; color: #30df05; color: #30df06; color: #30df07; color: #30df08; color: #30df09; color: #30df0a; color: #30df0b; color: #30df0c; color: #30df0d; color: #30df0e; color: #30df0f;
+color: #30e000; color: #30e001; color: #30e002; color: #30e003; color: #30e004; color: #30e005; color: #30e006; color: #30e007; color: #30e008; color: #30e009; color: #30e00a; color: #30e00b; color: #30e00c; color: #30e00d; color: #30e00e; color: #30e00f;
+color: #30e100; color: #30e101; color: #30e102; color: #30e103; color: #30e104; color: #30e105; color: #30e106; color: #30e107; color: #30e108; color: #30e109; color: #30e10a; color: #30e10b; color: #30e10c; color: #30e10d; color: #30e10e; color: #30e10f;
+color: #30e200; color: #30e201; color: #30e202; color: #30e203; color: #30e204; color: #30e205; color: #30e206; color: #30e207; color: #30e208; color: #30e209; color: #30e20a; color: #30e20b; color: #30e20c; color: #30e20d; color: #30e20e; color: #30e20f;
+color: #30e300; color: #30e301; color: #30e302; color: #30e303; color: #30e304; color: #30e305; color: #30e306; color: #30e307; color: #30e308; color: #30e309; color: #30e30a; color: #30e30b; color: #30e30c; color: #30e30d; color: #30e30e; color: #30e30f;
+color: #30e400; color: #30e401; color: #30e402; color: #30e403; color: #30e404; color: #30e405; color: #30e406; color: #30e407; color: #30e408; color: #30e409; color: #30e40a; color: #30e40b; color: #30e40c; color: #30e40d; color: #30e40e; color: #30e40f;
+color: #30e500; color: #30e501; color: #30e502; color: #30e503; color: #30e504; color: #30e505; color: #30e506; color: #30e507; color: #30e508; color: #30e509; color: #30e50a; color: #30e50b; color: #30e50c; color: #30e50d; color: #30e50e; color: #30e50f;
+color: #30e600; color: #30e601; color: #30e602; color: #30e603; color: #30e604; color: #30e605; color: #30e606; color: #30e607; color: #30e608; color: #30e609; color: #30e60a; color: #30e60b; color: #30e60c; color: #30e60d; color: #30e60e; color: #30e60f;
+color: #30e700; color: #30e701; color: #30e702; color: #30e703; color: #30e704; color: #30e705; color: #30e706; color: #30e707; color: #30e708; color: #30e709; color: #30e70a; color: #30e70b; color: #30e70c; color: #30e70d; color: #30e70e; color: #30e70f;
+color: #30e800; color: #30e801; color: #30e802; color: #30e803; color: #30e804; color: #30e805; color: #30e806; color: #30e807; color: #30e808; color: #30e809; color: #30e80a; color: #30e80b; color: #30e80c; color: #30e80d; color: #30e80e; color: #30e80f;
+color: #30e900; color: #30e901; color: #30e902; color: #30e903; color: #30e904; color: #30e905; color: #30e906; color: #30e907; color: #30e908; color: #30e909; color: #30e90a; color: #30e90b; color: #30e90c; color: #30e90d; color: #30e90e; color: #30e90f;
+color: #30ea00; color: #30ea01; color: #30ea02; color: #30ea03; color: #30ea04; color: #30ea05; color: #30ea06; color: #30ea07; color: #30ea08; color: #30ea09; color: #30ea0a; color: #30ea0b; color: #30ea0c; color: #30ea0d; color: #30ea0e; color: #30ea0f;
+color: #30eb00; color: #30eb01; color: #30eb02; color: #30eb03; color: #30eb04; color: #30eb05; color: #30eb06; color: #30eb07; color: #30eb08; color: #30eb09; color: #30eb0a; color: #30eb0b; color: #30eb0c; color: #30eb0d; color: #30eb0e; color: #30eb0f;
+color: #30ec00; color: #30ec01; color: #30ec02; color: #30ec03; color: #30ec04; color: #30ec05; color: #30ec06; color: #30ec07; color: #30ec08; color: #30ec09; color: #30ec0a; color: #30ec0b; color: #30ec0c; color: #30ec0d; color: #30ec0e; color: #30ec0f;
+color: #30ed00; color: #30ed01; color: #30ed02; color: #30ed03; color: #30ed04; color: #30ed05; color: #30ed06; color: #30ed07; color: #30ed08; color: #30ed09; color: #30ed0a; color: #30ed0b; color: #30ed0c; color: #30ed0d; color: #30ed0e; color: #30ed0f;
+color: #30ee00; color: #30ee01; color: #30ee02; color: #30ee03; color: #30ee04; color: #30ee05; color: #30ee06; color: #30ee07; color: #30ee08; color: #30ee09; color: #30ee0a; color: #30ee0b; color: #30ee0c; color: #30ee0d; color: #30ee0e; color: #30ee0f;
+color: #30ef00; color: #30ef01; color: #30ef02; color: #30ef03; color: #30ef04; color: #30ef05; color: #30ef06; color: #30ef07; color: #30ef08; color: #30ef09; color: #30ef0a; color: #30ef0b; color: #30ef0c; color: #30ef0d; color: #30ef0e; color: #30ef0f;
+color: #30f000; color: #30f001; color: #30f002; color: #30f003; color: #30f004; color: #30f005; color: #30f006; color: #30f007; color: #30f008; color: #30f009; color: #30f00a; color: #30f00b; color: #30f00c; color: #30f00d; color: #30f00e; color: #30f00f;
+color: #30f100; color: #30f101; color: #30f102; color: #30f103; color: #30f104; color: #30f105; color: #30f106; color: #30f107; color: #30f108; color: #30f109; color: #30f10a; color: #30f10b; color: #30f10c; color: #30f10d; color: #30f10e; color: #30f10f;
+color: #30f200; color: #30f201; color: #30f202; color: #30f203; color: #30f204; color: #30f205; color: #30f206; color: #30f207; color: #30f208; color: #30f209; color: #30f20a; color: #30f20b; color: #30f20c; color: #30f20d; color: #30f20e; color: #30f20f;
+color: #30f300; color: #30f301; color: #30f302; color: #30f303; color: #30f304; color: #30f305; color: #30f306; color: #30f307; color: #30f308; color: #30f309; color: #30f30a; color: #30f30b; color: #30f30c; color: #30f30d; color: #30f30e; color: #30f30f;
+color: #30f400; color: #30f401; color: #30f402; color: #30f403; color: #30f404; color: #30f405; color: #30f406; color: #30f407; color: #30f408; color: #30f409; color: #30f40a; color: #30f40b; color: #30f40c; color: #30f40d; color: #30f40e; color: #30f40f;
+color: #30f500; color: #30f501; color: #30f502; color: #30f503; color: #30f504; color: #30f505; color: #30f506; color: #30f507; color: #30f508; color: #30f509; color: #30f50a; color: #30f50b; color: #30f50c; color: #30f50d; color: #30f50e; color: #30f50f;
+color: #30f600; color: #30f601; color: #30f602; color: #30f603; color: #30f604; color: #30f605; color: #30f606; color: #30f607; color: #30f608; color: #30f609; color: #30f60a; color: #30f60b; color: #30f60c; color: #30f60d; color: #30f60e; color: #30f60f;
+color: #30f700; color: #30f701; color: #30f702; color: #30f703; color: #30f704; color: #30f705; color: #30f706; color: #30f707; color: #30f708; color: #30f709; color: #30f70a; color: #30f70b; color: #30f70c; color: #30f70d; color: #30f70e; color: #30f70f;
+color: #30f800; color: #30f801; color: #30f802; color: #30f803; color: #30f804; color: #30f805; color: #30f806; color: #30f807; color: #30f808; color: #30f809; color: #30f80a; color: #30f80b; color: #30f80c; color: #30f80d; color: #30f80e; color: #30f80f;
+color: #30f900; color: #30f901; color: #30f902; color: #30f903; color: #30f904; color: #30f905; color: #30f906; color: #30f907; color: #30f908; color: #30f909; color: #30f90a; color: #30f90b; color: #30f90c; color: #30f90d; color: #30f90e; color: #30f90f;
+color: #30fa00; color: #30fa01; color: #30fa02; color: #30fa03; color: #30fa04; color: #30fa05; color: #30fa06; color: #30fa07; color: #30fa08; color: #30fa09; color: #30fa0a; color: #30fa0b; color: #30fa0c; color: #30fa0d; color: #30fa0e; color: #30fa0f;
+color: #30fb00; color: #30fb01; color: #30fb02; color: #30fb03; color: #30fb04; color: #30fb05; color: #30fb06; color: #30fb07; color: #30fb08; color: #30fb09; color: #30fb0a; color: #30fb0b; color: #30fb0c; color: #30fb0d; color: #30fb0e; color: #30fb0f;
+color: #30fc00; color: #30fc01; color: #30fc02; color: #30fc03; color: #30fc04; color: #30fc05; color: #30fc06; color: #30fc07; color: #30fc08; color: #30fc09; color: #30fc0a; color: #30fc0b; color: #30fc0c; color: #30fc0d; color: #30fc0e; color: #30fc0f;
+color: #30fd00; color: #30fd01; color: #30fd02; color: #30fd03; color: #30fd04; color: #30fd05; color: #30fd06; color: #30fd07; color: #30fd08; color: #30fd09; color: #30fd0a; color: #30fd0b; color: #30fd0c; color: #30fd0d; color: #30fd0e; color: #30fd0f;
+color: #30fe00; color: #30fe01; color: #30fe02; color: #30fe03; color: #30fe04; color: #30fe05; color: #30fe06; color: #30fe07; color: #30fe08; color: #30fe09; color: #30fe0a; color: #30fe0b; color: #30fe0c; color: #30fe0d; color: #30fe0e; color: #30fe0f;
+color: #30ff00; color: #30ff01; color: #30ff02; color: #30ff03; color: #30ff04; color: #30ff05; color: #30ff06; color: #30ff07; color: #30ff08; color: #30ff09; color: #30ff0a; color: #30ff0b; color: #30ff0c; color: #30ff0d; color: #30ff0e; color: #30ff0f; }
diff --git a/.vim/pack/default/start/gruvbox/autoload/airline/themes/gruvbox.vim b/.vim/pack/default/start/gruvbox/autoload/airline/themes/gruvbox.vim
new file mode 100644
index 0000000..6862a81
--- /dev/null
+++ b/.vim/pack/default/start/gruvbox/autoload/airline/themes/gruvbox.vim
@@ -0,0 +1,79 @@
+" -----------------------------------------------------------------------------
+" File: gruvbox.vim
+" Description: Retro groove color scheme for Airline
+" Author: morhetz <morhetz@gmail.com>
+" Source: https://github.com/morhetz/gruvbox
+" Last Modified: 12 Aug 2017
+" -----------------------------------------------------------------------------
+
+let g:airline#themes#gruvbox#palette = {}
+
+function! airline#themes#gruvbox#refresh()
+
+  let M0 = airline#themes#get_highlight('Identifier')
+  let accents_group = airline#themes#get_highlight('Special')
+  let modified_group = [M0[0], '', M0[2], '', '']
+  let warning_group = airline#themes#get_highlight2(['Normal', 'bg'], ['Question', 'fg'])
+  let error_group = airline#themes#get_highlight2(['Normal', 'bg'], ['WarningMsg', 'fg'])
+
+  let s:N1 = airline#themes#get_highlight2(['Normal', 'bg'], ['StatusLineNC', 'bg'])
+  let s:N2 = airline#themes#get_highlight2(['StatusLineNC', 'bg'], ['Pmenu', 'bg'])
+  let s:N3 = airline#themes#get_highlight2(['StatusLineNC', 'bg'], ['CursorLine', 'bg'])
+  let g:airline#themes#gruvbox#palette.normal = airline#themes#generate_color_map(s:N1, s:N2, s:N3)
+  let g:airline#themes#gruvbox#palette.normal_modified = { 'airline_c': modified_group }
+  let g:airline#themes#gruvbox#palette.normal.airline_warning = warning_group
+  let g:airline#themes#gruvbox#palette.normal_modified.airline_warning = warning_group
+  let g:airline#themes#gruvbox#palette.normal.airline_error = error_group
+  let g:airline#themes#gruvbox#palette.normal_modified.airline_error = error_group
+
+  let s:I1 = airline#themes#get_highlight2(['Normal', 'bg'], ['Identifier', 'fg'])
+  let s:I2 = s:N2
+  let s:I3 = airline#themes#get_highlight2(['Normal', 'fg'], ['Pmenu', 'bg'])
+  let g:airline#themes#gruvbox#palette.insert = airline#themes#generate_color_map(s:I1, s:I2, s:I3)
+  let g:airline#themes#gruvbox#palette.insert_modified = g:airline#themes#gruvbox#palette.normal_modified
+  let g:airline#themes#gruvbox#palette.insert.airline_warning = g:airline#themes#gruvbox#palette.normal.airline_warning
+  let g:airline#themes#gruvbox#palette.insert_modified.airline_warning = g:airline#themes#gruvbox#palette.normal_modified.airline_warning
+  let g:airline#themes#gruvbox#palette.insert.airline_error = g:airline#themes#gruvbox#palette.normal.airline_error
+  let g:airline#themes#gruvbox#palette.insert_modified.airline_error = g:airline#themes#gruvbox#palette.normal_modified.airline_error
+
+  let s:R1 = airline#themes#get_highlight2(['Normal', 'bg'], ['Structure', 'fg'])
+  let s:R2 = s:I2
+  let s:R3 = s:I3
+  let g:airline#themes#gruvbox#palette.replace = airline#themes#generate_color_map(s:R1, s:R2, s:R3)
+  let g:airline#themes#gruvbox#palette.replace_modified = g:airline#themes#gruvbox#palette.normal_modified
+  let g:airline#themes#gruvbox#palette.replace.airline_warning = g:airline#themes#gruvbox#palette.normal.airline_warning
+  let g:airline#themes#gruvbox#palette.replace_modified.airline_warning = g:airline#themes#gruvbox#palette.normal_modified.airline_warning
+  let g:airline#themes#gruvbox#palette.replace.airline_error = g:airline#themes#gruvbox#palette.normal.airline_error
+  let g:airline#themes#gruvbox#palette.replace_modified.airline_error = g:airline#themes#gruvbox#palette.normal_modified.airline_error
+
+  let s:V1 = airline#themes#get_highlight2(['Normal', 'bg'], ['Question', 'fg'])
+  let s:V2 = s:N2
+  let s:V3 = airline#themes#get_highlight2(['Normal', 'bg'], ['TabLine', 'fg'])
+  let g:airline#themes#gruvbox#palette.visual = airline#themes#generate_color_map(s:V1, s:V2, s:V3)
+  let g:airline#themes#gruvbox#palette.visual_modified = { 'airline_c': [ s:V3[0], '', s:V3[2], '', '' ] }
+  let g:airline#themes#gruvbox#palette.visual.airline_warning = g:airline#themes#gruvbox#palette.normal.airline_warning
+  let g:airline#themes#gruvbox#palette.visual_modified.airline_warning = g:airline#themes#gruvbox#palette.normal_modified.airline_warning
+  let g:airline#themes#gruvbox#palette.visual.airline_error = g:airline#themes#gruvbox#palette.normal.airline_error
+  let g:airline#themes#gruvbox#palette.visual_modified.airline_error = g:airline#themes#gruvbox#palette.normal_modified.airline_error
+
+  let s:IA = airline#themes#get_highlight2(['TabLine', 'fg'], ['CursorLine', 'bg'])
+  let g:airline#themes#gruvbox#palette.inactive = airline#themes#generate_color_map(s:IA, s:IA, s:IA)
+  let g:airline#themes#gruvbox#palette.inactive_modified = { 'airline_c': modified_group }
+
+  let g:airline#themes#gruvbox#palette.accents = { 'red': accents_group }
+
+  let s:TF = airline#themes#get_highlight2(['Normal', 'bg'], ['Normal', 'bg'])
+  let g:airline#themes#gruvbox#palette.tabline = {
+    \ 'airline_tab':  s:N2,
+    \ 'airline_tabsel':  s:N1,
+    \ 'airline_tabtype':  s:V1,
+    \ 'airline_tabfill':  s:TF,
+    \ 'airline_tabhid':  s:IA,
+    \ 'airline_tabmod':  s:I1
+    \ }
+
+endfunction
+
+call airline#themes#gruvbox#refresh()
+
+" vim: set sw=2 ts=2 sts=2 et tw=80 ft=vim fdm=marker:
diff --git a/.vim/pack/default/start/gruvbox/autoload/gruvbox.vim b/.vim/pack/default/start/gruvbox/autoload/gruvbox.vim
new file mode 100644
index 0000000..44bec6e
--- /dev/null
+++ b/.vim/pack/default/start/gruvbox/autoload/gruvbox.vim
@@ -0,0 +1,41 @@
+" -----------------------------------------------------------------------------
+" File: gruvbox.vim
+" Description: Retro groove color scheme for Vim
+" Author: morhetz <morhetz@gmail.com>
+" Source: https://github.com/morhetz/gruvbox
+" Last Modified: 09 Apr 2014
+" -----------------------------------------------------------------------------
+
+function! gruvbox#invert_signs_toggle()
+  if g:gruvbox_invert_signs == 0
+    let g:gruvbox_invert_signs=1
+  else
+    let g:gruvbox_invert_signs=0
+  endif
+
+  colorscheme gruvbox
+endfunction
+
+" Search Highlighting {{{
+
+function! gruvbox#hls_show()
+  set hlsearch
+  call GruvboxHlsShowCursor()
+endfunction
+
+function! gruvbox#hls_hide()
+  set nohlsearch
+  call GruvboxHlsHideCursor()
+endfunction
+
+function! gruvbox#hls_toggle()
+  if &hlsearch
+    call gruvbox#hls_hide()
+  else
+    call gruvbox#hls_show()
+  endif
+endfunction
+
+" }}}
+
+" vim: set sw=2 ts=2 sts=2 et tw=80 ft=vim fdm=marker:
diff --git a/.vim/pack/default/start/gruvbox/autoload/lightline/colorscheme/gruvbox.vim b/.vim/pack/default/start/gruvbox/autoload/lightline/colorscheme/gruvbox.vim
new file mode 100644
index 0000000..4730c09
--- /dev/null
+++ b/.vim/pack/default/start/gruvbox/autoload/lightline/colorscheme/gruvbox.vim
@@ -0,0 +1,57 @@
+" -----------------------------------------------------------------------------
+" File: gruvbox.vim
+" Description: Gruvbox colorscheme for Lightline (itchyny/lightline.vim)
+" Author: gmoe <me@griffinmoe.com>
+" Source: https://github.com/morhetz/gruvbox
+" Last Modified: 20 Sep 2017
+" -----------------------------------------------------------------------------
+
+function! s:getGruvColor(group)
+  let guiColor = synIDattr(hlID(a:group), "fg", "gui") 
+  let termColor = synIDattr(hlID(a:group), "fg", "cterm") 
+  return [ guiColor, termColor ]
+endfunction
+
+if exists('g:lightline')
+
+  let s:bg0  = s:getGruvColor('GruvboxBg0')
+  let s:bg1  = s:getGruvColor('GruvboxBg1')
+  let s:bg2  = s:getGruvColor('GruvboxBg2')
+  let s:bg4  = s:getGruvColor('GruvboxBg4')
+  let s:fg1  = s:getGruvColor('GruvboxFg1')
+  let s:fg4  = s:getGruvColor('GruvboxFg4')
+
+  let s:yellow = s:getGruvColor('GruvboxYellow')
+  let s:blue   = s:getGruvColor('GruvboxBlue')
+  let s:aqua   = s:getGruvColor('GruvboxAqua')
+  let s:orange = s:getGruvColor('GruvboxOrange')
+  let s:green = s:getGruvColor('GruvboxGreen')
+
+  let s:p = {'normal':{}, 'inactive':{}, 'insert':{}, 'replace':{}, 'visual':{}, 'tabline':{}, 'terminal':{}}
+  let s:p.normal.left = [ [ s:bg0, s:fg4, 'bold' ], [ s:fg4, s:bg2 ] ]
+  let s:p.normal.right = [ [ s:bg0, s:fg4 ], [ s:fg4, s:bg2 ] ]
+  let s:p.normal.middle = [ [ s:fg4, s:bg1 ] ]
+  let s:p.inactive.right = [ [ s:bg4, s:bg1 ], [ s:bg4, s:bg1 ] ]
+  let s:p.inactive.left =  [ [ s:bg4, s:bg1 ], [ s:bg4, s:bg1 ] ]
+  let s:p.inactive.middle = [ [ s:bg4, s:bg1 ] ]
+  let s:p.insert.left = [ [ s:bg0, s:blue, 'bold' ], [ s:fg1, s:bg2 ] ]
+  let s:p.insert.right = [ [ s:bg0, s:blue ], [ s:fg1, s:bg2 ] ]
+  let s:p.insert.middle = [ [ s:fg4, s:bg2 ] ]
+  let s:p.terminal.left = [ [ s:bg0, s:green, 'bold' ], [ s:fg1, s:bg2 ] ]
+  let s:p.terminal.right = [ [ s:bg0, s:green ], [ s:fg1, s:bg2 ] ]
+  let s:p.terminal.middle = [ [ s:fg4, s:bg2 ] ]
+  let s:p.replace.left = [ [ s:bg0, s:aqua, 'bold' ], [ s:fg1, s:bg2 ] ]
+  let s:p.replace.right = [ [ s:bg0, s:aqua ], [ s:fg1, s:bg2 ] ]
+  let s:p.replace.middle = [ [ s:fg4, s:bg2 ] ]
+  let s:p.visual.left = [ [ s:bg0, s:orange, 'bold' ], [ s:bg0, s:bg4 ] ]
+  let s:p.visual.right = [ [ s:bg0, s:orange ], [ s:bg0, s:bg4 ] ]
+  let s:p.visual.middle = [ [ s:fg4, s:bg1 ] ]
+  let s:p.tabline.left = [ [ s:fg4, s:bg2 ] ]
+  let s:p.tabline.tabsel = [ [ s:bg0, s:fg4 ] ]
+  let s:p.tabline.middle = [ [ s:bg0, s:bg0 ] ]
+  let s:p.tabline.right = [ [ s:bg0, s:orange ] ]
+  let s:p.normal.error = [ [ s:bg0, s:orange ] ]
+  let s:p.normal.warning = [ [ s:bg2, s:yellow ] ]
+
+  let g:lightline#colorscheme#gruvbox#palette = lightline#colorscheme#flatten(s:p)
+endif
diff --git a/.vim/pack/default/start/gruvbox/colors/gruvbox.vim b/.vim/pack/default/start/gruvbox/colors/gruvbox.vim
new file mode 100644
index 0000000..66246fb
--- /dev/null
+++ b/.vim/pack/default/start/gruvbox/colors/gruvbox.vim
@@ -0,0 +1,1418 @@
+" -----------------------------------------------------------------------------
+" File: gruvbox.vim
+" Description: Retro groove color scheme for Vim
+" Author: morhetz <morhetz@gmail.com>
+" Source: https://github.com/morhetz/gruvbox
+" Last Modified: 12 Aug 2017
+" -----------------------------------------------------------------------------
+
+" Supporting code -------------------------------------------------------------
+" Initialisation: {{{
+
+if version > 580
+  hi clear
+  if exists("syntax_on")
+    syntax reset
+  endif
+endif
+
+let g:colors_name='gruvbox'
+
+if !(has('termguicolors') && &termguicolors) && !has('gui_running') && &t_Co != 256
+  finish
+endif
+
+" }}}
+" Global Settings: {{{
+
+if !exists('g:gruvbox_bold')
+  let g:gruvbox_bold=1
+endif
+if !exists('g:gruvbox_italic')
+  if has('gui_running') || $TERM_ITALICS == 'true'
+    let g:gruvbox_italic=1
+  else
+    let g:gruvbox_italic=0
+  endif
+endif
+if !exists('g:gruvbox_undercurl')
+  let g:gruvbox_undercurl=1
+endif
+if !exists('g:gruvbox_underline')
+  let g:gruvbox_underline=1
+endif
+if !exists('g:gruvbox_inverse')
+  let g:gruvbox_inverse=1
+endif
+
+if !exists('g:gruvbox_guisp_fallback') || index(['fg', 'bg'], g:gruvbox_guisp_fallback) == -1
+  let g:gruvbox_guisp_fallback='NONE'
+endif
+
+if !exists('g:gruvbox_improved_strings')
+  let g:gruvbox_improved_strings=0
+endif
+
+if !exists('g:gruvbox_improved_warnings')
+  let g:gruvbox_improved_warnings=0
+endif
+
+if !exists('g:gruvbox_termcolors')
+  let g:gruvbox_termcolors=256
+endif
+
+if !exists('g:gruvbox_invert_indent_guides')
+  let g:gruvbox_invert_indent_guides=0
+endif
+
+if exists('g:gruvbox_contrast')
+  echo 'g:gruvbox_contrast is deprecated; use g:gruvbox_contrast_light and g:gruvbox_contrast_dark instead'
+endif
+
+if !exists('g:gruvbox_contrast_dark')
+  let g:gruvbox_contrast_dark='medium'
+endif
+
+if !exists('g:gruvbox_contrast_light')
+  let g:gruvbox_contrast_light='medium'
+endif
+
+let s:is_dark=(&background == 'dark')
+
+" }}}
+" Palette: {{{
+
+" setup palette dictionary
+let s:gb = {}
+
+" fill it with absolute colors
+let s:gb.dark0_hard  = ['#1d2021', 234]     " 29-32-33
+let s:gb.dark0       = ['#282828', 235]     " 40-40-40
+let s:gb.dark0_soft  = ['#32302f', 236]     " 50-48-47
+let s:gb.dark1       = ['#3c3836', 237]     " 60-56-54
+let s:gb.dark2       = ['#504945', 239]     " 80-73-69
+let s:gb.dark3       = ['#665c54', 241]     " 102-92-84
+let s:gb.dark4       = ['#7c6f64', 243]     " 124-111-100
+let s:gb.dark4_256   = ['#7c6f64', 243]     " 124-111-100
+
+let s:gb.gray_245    = ['#928374', 245]     " 146-131-116
+let s:gb.gray_244    = ['#928374', 244]     " 146-131-116
+
+let s:gb.light0_hard = ['#f9f5d7', 230]     " 249-245-215
+let s:gb.light0      = ['#fbf1c7', 229]     " 253-244-193
+let s:gb.light0_soft = ['#f2e5bc', 228]     " 242-229-188
+let s:gb.light1      = ['#ebdbb2', 223]     " 235-219-178
+let s:gb.light2      = ['#d5c4a1', 250]     " 213-196-161
+let s:gb.light3      = ['#bdae93', 248]     " 189-174-147
+let s:gb.light4      = ['#a89984', 246]     " 168-153-132
+let s:gb.light4_256  = ['#a89984', 246]     " 168-153-132
+
+let s:gb.bright_red     = ['#fb4934', 167]     " 251-73-52
+let s:gb.bright_green   = ['#b8bb26', 142]     " 184-187-38
+let s:gb.bright_yellow  = ['#fabd2f', 214]     " 250-189-47
+let s:gb.bright_blue    = ['#83a598', 109]     " 131-165-152
+let s:gb.bright_purple  = ['#d3869b', 175]     " 211-134-155
+let s:gb.bright_aqua    = ['#8ec07c', 108]     " 142-192-124
+let s:gb.bright_orange  = ['#fe8019', 208]     " 254-128-25
+
+let s:gb.neutral_red    = ['#cc241d', 124]     " 204-36-29
+let s:gb.neutral_green  = ['#98971a', 106]     " 152-151-26
+let s:gb.neutral_yellow = ['#d79921', 172]     " 215-153-33
+let s:gb.neutral_blue   = ['#458588', 66]      " 69-133-136
+let s:gb.neutral_purple = ['#b16286', 132]     " 177-98-134
+let s:gb.neutral_aqua   = ['#689d6a', 72]      " 104-157-106
+let s:gb.neutral_orange = ['#d65d0e', 166]     " 214-93-14
+
+let s:gb.faded_red      = ['#9d0006', 88]      " 157-0-6
+let s:gb.faded_green    = ['#79740e', 100]     " 121-116-14
+let s:gb.faded_yellow   = ['#b57614', 136]     " 181-118-20
+let s:gb.faded_blue     = ['#076678', 24]      " 7-102-120
+let s:gb.faded_purple   = ['#8f3f71', 96]      " 143-63-113
+let s:gb.faded_aqua     = ['#427b58', 66]      " 66-123-88
+let s:gb.faded_orange   = ['#af3a03', 130]     " 175-58-3
+
+" }}}
+" Setup Emphasis: {{{
+
+let s:bold = 'bold,'
+if g:gruvbox_bold == 0
+  let s:bold = ''
+endif
+
+let s:italic = 'italic,'
+if g:gruvbox_italic == 0
+  let s:italic = ''
+endif
+
+let s:underline = 'underline,'
+if g:gruvbox_underline == 0
+  let s:underline = ''
+endif
+
+let s:undercurl = 'undercurl,'
+if g:gruvbox_undercurl == 0
+  let s:undercurl = ''
+endif
+
+let s:inverse = 'inverse,'
+if g:gruvbox_inverse == 0
+  let s:inverse = ''
+endif
+
+" }}}
+" Setup Colors: {{{
+
+let s:vim_bg = ['bg', 'bg']
+let s:vim_fg = ['fg', 'fg']
+let s:none = ['NONE', 'NONE']
+
+" determine relative colors
+if s:is_dark
+  let s:bg0  = s:gb.dark0
+  if g:gruvbox_contrast_dark == 'soft'
+    let s:bg0  = s:gb.dark0_soft
+  elseif g:gruvbox_contrast_dark == 'hard'
+    let s:bg0  = s:gb.dark0_hard
+  endif
+
+  let s:bg1  = s:gb.dark1
+  let s:bg2  = s:gb.dark2
+  let s:bg3  = s:gb.dark3
+  let s:bg4  = s:gb.dark4
+
+  let s:gray = s:gb.gray_245
+
+  let s:fg0 = s:gb.light0
+  let s:fg1 = s:gb.light1
+  let s:fg2 = s:gb.light2
+  let s:fg3 = s:gb.light3
+  let s:fg4 = s:gb.light4
+
+  let s:fg4_256 = s:gb.light4_256
+
+  let s:red    = s:gb.bright_red
+  let s:green  = s:gb.bright_green
+  let s:yellow = s:gb.bright_yellow
+  let s:blue   = s:gb.bright_blue
+  let s:purple = s:gb.bright_purple
+  let s:aqua   = s:gb.bright_aqua
+  let s:orange = s:gb.bright_orange
+else
+  let s:bg0  = s:gb.light0
+  if g:gruvbox_contrast_light == 'soft'
+    let s:bg0  = s:gb.light0_soft
+  elseif g:gruvbox_contrast_light == 'hard'
+    let s:bg0  = s:gb.light0_hard
+  endif
+
+  let s:bg1  = s:gb.light1
+  let s:bg2  = s:gb.light2
+  let s:bg3  = s:gb.light3
+  let s:bg4  = s:gb.light4
+
+  let s:gray = s:gb.gray_244
+
+  let s:fg0 = s:gb.dark0
+  let s:fg1 = s:gb.dark1
+  let s:fg2 = s:gb.dark2
+  let s:fg3 = s:gb.dark3
+  let s:fg4 = s:gb.dark4
+
+  let s:fg4_256 = s:gb.dark4_256
+
+  let s:red    = s:gb.faded_red
+  let s:green  = s:gb.faded_green
+  let s:yellow = s:gb.faded_yellow
+  let s:blue   = s:gb.faded_blue
+  let s:purple = s:gb.faded_purple
+  let s:aqua   = s:gb.faded_aqua
+  let s:orange = s:gb.faded_orange
+endif
+
+" reset to 16 colors fallback
+if g:gruvbox_termcolors == 16
+  let s:bg0[1]    = 0
+  let s:fg4[1]    = 7
+  let s:gray[1]   = 8
+  let s:red[1]    = 9
+  let s:green[1]  = 10
+  let s:yellow[1] = 11
+  let s:blue[1]   = 12
+  let s:purple[1] = 13
+  let s:aqua[1]   = 14
+  let s:fg1[1]    = 15
+endif
+
+" save current relative colors back to palette dictionary
+let s:gb.bg0 = s:bg0
+let s:gb.bg1 = s:bg1
+let s:gb.bg2 = s:bg2
+let s:gb.bg3 = s:bg3
+let s:gb.bg4 = s:bg4
+
+let s:gb.gray = s:gray
+
+let s:gb.fg0 = s:fg0
+let s:gb.fg1 = s:fg1
+let s:gb.fg2 = s:fg2
+let s:gb.fg3 = s:fg3
+let s:gb.fg4 = s:fg4
+
+let s:gb.fg4_256 = s:fg4_256
+
+let s:gb.red    = s:red
+let s:gb.green  = s:green
+let s:gb.yellow = s:yellow
+let s:gb.blue   = s:blue
+let s:gb.purple = s:purple
+let s:gb.aqua   = s:aqua
+let s:gb.orange = s:orange
+
+" }}}
+" Setup Terminal Colors For Neovim: {{{
+
+if has('nvim')
+  let g:terminal_color_0 = s:bg0[0]
+  let g:terminal_color_8 = s:gray[0]
+
+  let g:terminal_color_1 = s:gb.neutral_red[0]
+  let g:terminal_color_9 = s:red[0]
+
+  let g:terminal_color_2 = s:gb.neutral_green[0]
+  let g:terminal_color_10 = s:green[0]
+
+  let g:terminal_color_3 = s:gb.neutral_yellow[0]
+  let g:terminal_color_11 = s:yellow[0]
+
+  let g:terminal_color_4 = s:gb.neutral_blue[0]
+  let g:terminal_color_12 = s:blue[0]
+
+  let g:terminal_color_5 = s:gb.neutral_purple[0]
+  let g:terminal_color_13 = s:purple[0]
+
+  let g:terminal_color_6 = s:gb.neutral_aqua[0]
+  let g:terminal_color_14 = s:aqua[0]
+
+  let g:terminal_color_7 = s:fg4[0]
+  let g:terminal_color_15 = s:fg1[0]
+endif
+
+" }}}
+" Overload Setting: {{{
+
+let s:hls_cursor = s:orange
+if exists('g:gruvbox_hls_cursor')
+  let s:hls_cursor = get(s:gb, g:gruvbox_hls_cursor)
+endif
+
+let s:number_column = s:none
+if exists('g:gruvbox_number_column')
+  let s:number_column = get(s:gb, g:gruvbox_number_column)
+endif
+
+let s:sign_column = s:bg1
+
+if exists('g:gitgutter_override_sign_column_highlight') &&
+      \ g:gitgutter_override_sign_column_highlight == 1
+  let s:sign_column = s:number_column
+else
+  let g:gitgutter_override_sign_column_highlight = 0
+
+  if exists('g:gruvbox_sign_column')
+    let s:sign_column = get(s:gb, g:gruvbox_sign_column)
+  endif
+endif
+
+let s:color_column = s:bg1
+if exists('g:gruvbox_color_column')
+  let s:color_column = get(s:gb, g:gruvbox_color_column)
+endif
+
+let s:vert_split = s:bg0
+if exists('g:gruvbox_vert_split')
+  let s:vert_split = get(s:gb, g:gruvbox_vert_split)
+endif
+
+let s:invert_signs = ''
+if exists('g:gruvbox_invert_signs')
+  if g:gruvbox_invert_signs == 1
+    let s:invert_signs = s:inverse
+  endif
+endif
+
+let s:invert_selection = s:inverse
+if exists('g:gruvbox_invert_selection')
+  if g:gruvbox_invert_selection == 0
+    let s:invert_selection = ''
+  endif
+endif
+
+let s:invert_tabline = ''
+if exists('g:gruvbox_invert_tabline')
+  if g:gruvbox_invert_tabline == 1
+    let s:invert_tabline = s:inverse
+  endif
+endif
+
+let s:italicize_comments = s:italic
+if exists('g:gruvbox_italicize_comments')
+  if g:gruvbox_italicize_comments == 0
+    let s:italicize_comments = ''
+  endif
+endif
+
+let s:italicize_strings = ''
+if exists('g:gruvbox_italicize_strings')
+  if g:gruvbox_italicize_strings == 1
+    let s:italicize_strings = s:italic
+  endif
+endif
+
+" }}}
+" Highlighting Function: {{{
+
+function! s:HL(group, fg, ...)
+  " Arguments: group, guifg, guibg, gui, guisp
+
+  " foreground
+  let fg = a:fg
+
+  " background
+  if a:0 >= 1
+    let bg = a:1
+  else
+    let bg = s:none
+  endif
+
+  " emphasis
+  if a:0 >= 2 && strlen(a:2)
+    let emstr = a:2
+  else
+    let emstr = 'NONE,'
+  endif
+
+  " special fallback
+  if a:0 >= 3
+    if g:gruvbox_guisp_fallback != 'NONE'
+      let fg = a:3
+    endif
+
+    " bg fallback mode should invert higlighting
+    if g:gruvbox_guisp_fallback == 'bg'
+      let emstr .= 'inverse,'
+    endif
+  endif
+
+  let histring = [ 'hi', a:group,
+        \ 'guifg=' . fg[0], 'ctermfg=' . fg[1],
+        \ 'guibg=' . bg[0], 'ctermbg=' . bg[1],
+        \ 'gui=' . emstr[:-2], 'cterm=' . emstr[:-2]
+        \ ]
+
+  " special
+  if a:0 >= 3
+    call add(histring, 'guisp=' . a:3[0])
+  endif
+
+  execute join(histring, ' ')
+endfunction
+
+" }}}
+" Gruvbox Hi Groups: {{{
+
+" memoize common hi groups
+call s:HL('GruvboxFg0', s:fg0)
+call s:HL('GruvboxFg1', s:fg1)
+call s:HL('GruvboxFg2', s:fg2)
+call s:HL('GruvboxFg3', s:fg3)
+call s:HL('GruvboxFg4', s:fg4)
+call s:HL('GruvboxGray', s:gray)
+call s:HL('GruvboxBg0', s:bg0)
+call s:HL('GruvboxBg1', s:bg1)
+call s:HL('GruvboxBg2', s:bg2)
+call s:HL('GruvboxBg3', s:bg3)
+call s:HL('GruvboxBg4', s:bg4)
+
+call s:HL('GruvboxRed', s:red)
+call s:HL('GruvboxRedBold', s:red, s:none, s:bold)
+call s:HL('GruvboxGreen', s:green)
+call s:HL('GruvboxGreenBold', s:green, s:none, s:bold)
+call s:HL('GruvboxYellow', s:yellow)
+call s:HL('GruvboxYellowBold', s:yellow, s:none, s:bold)
+call s:HL('GruvboxBlue', s:blue)
+call s:HL('GruvboxBlueBold', s:blue, s:none, s:bold)
+call s:HL('GruvboxPurple', s:purple)
+call s:HL('GruvboxPurpleBold', s:purple, s:none, s:bold)
+call s:HL('GruvboxAqua', s:aqua)
+call s:HL('GruvboxAquaBold', s:aqua, s:none, s:bold)
+call s:HL('GruvboxOrange', s:orange)
+call s:HL('GruvboxOrangeBold', s:orange, s:none, s:bold)
+
+call s:HL('GruvboxRedSign', s:red, s:sign_column, s:invert_signs)
+call s:HL('GruvboxGreenSign', s:green, s:sign_column, s:invert_signs)
+call s:HL('GruvboxYellowSign', s:yellow, s:sign_column, s:invert_signs)
+call s:HL('GruvboxBlueSign', s:blue, s:sign_column, s:invert_signs)
+call s:HL('GruvboxPurpleSign', s:purple, s:sign_column, s:invert_signs)
+call s:HL('GruvboxAquaSign', s:aqua, s:sign_column, s:invert_signs)
+call s:HL('GruvboxOrangeSign', s:orange, s:sign_column, s:invert_signs)
+
+" }}}
+
+" Vanilla colorscheme ---------------------------------------------------------
+" General UI: {{{
+
+" Normal text
+call s:HL('Normal', s:fg1, s:bg0)
+
+" Correct background (see issue #7):
+" --- Problem with changing between dark and light on 256 color terminal
+" --- https://github.com/morhetz/gruvbox/issues/7
+if s:is_dark
+  set background=dark
+else
+  set background=light
+endif
+
+if version >= 700
+  " Screen line that the cursor is
+  call s:HL('CursorLine',   s:none, s:bg1)
+  " Screen column that the cursor is
+  hi! link CursorColumn CursorLine
+
+  " Tab pages line filler
+  call s:HL('TabLineFill', s:bg4, s:bg1, s:invert_tabline)
+  " Active tab page label
+  call s:HL('TabLineSel', s:green, s:bg1, s:invert_tabline)
+  " Not active tab page label
+  hi! link TabLine TabLineFill
+
+  " Match paired bracket under the cursor
+  call s:HL('MatchParen', s:none, s:bg3, s:bold)
+endif
+
+if version >= 703
+  " Highlighted screen columns
+  call s:HL('ColorColumn',  s:none, s:color_column)
+
+  " Concealed element: \lambda → λ
+  call s:HL('Conceal', s:blue, s:none)
+
+  " Line number of CursorLine
+  call s:HL('CursorLineNr', s:yellow, s:bg1)
+endif
+
+hi! link NonText GruvboxBg2
+hi! link SpecialKey GruvboxBg2
+
+call s:HL('Visual',    s:none,  s:bg3, s:invert_selection)
+hi! link VisualNOS Visual
+
+call s:HL('Search',    s:yellow, s:bg0, s:inverse)
+call s:HL('IncSearch', s:hls_cursor, s:bg0, s:inverse)
+
+call s:HL('Underlined', s:blue, s:none, s:underline)
+
+call s:HL('StatusLine',   s:bg2, s:fg1, s:inverse)
+call s:HL('StatusLineNC', s:bg1, s:fg4, s:inverse)
+
+" The column separating vertically split windows
+call s:HL('VertSplit', s:bg3, s:vert_split)
+
+" Current match in wildmenu completion
+call s:HL('WildMenu', s:blue, s:bg2, s:bold)
+
+" Directory names, special names in listing
+hi! link Directory GruvboxGreenBold
+
+" Titles for output from :set all, :autocmd, etc.
+hi! link Title GruvboxGreenBold
+
+" Error messages on the command line
+call s:HL('ErrorMsg',   s:bg0, s:red, s:bold)
+" More prompt: -- More --
+hi! link MoreMsg GruvboxYellowBold
+" Current mode message: -- INSERT --
+hi! link ModeMsg GruvboxYellowBold
+" 'Press enter' prompt and yes/no questions
+hi! link Question GruvboxOrangeBold
+" Warning messages
+hi! link WarningMsg GruvboxRedBold
+
+" }}}
+" Gutter: {{{
+
+" Line number for :number and :# commands
+call s:HL('LineNr', s:bg4, s:number_column)
+
+" Column where signs are displayed
+call s:HL('SignColumn', s:none, s:sign_column)
+
+" Line used for closed folds
+call s:HL('Folded', s:gray, s:bg1, s:italic)
+" Column where folds are displayed
+call s:HL('FoldColumn', s:gray, s:bg1)
+
+" }}}
+" Cursor: {{{
+
+" Character under cursor
+call s:HL('Cursor', s:none, s:none, s:inverse)
+" Visual mode cursor, selection
+hi! link vCursor Cursor
+" Input moder cursor
+hi! link iCursor Cursor
+" Language mapping cursor
+hi! link lCursor Cursor
+
+" }}}
+" Syntax Highlighting: {{{
+
+if g:gruvbox_improved_strings == 0
+  hi! link Special GruvboxOrange
+else
+  call s:HL('Special', s:orange, s:bg1, s:italicize_strings)
+endif
+
+call s:HL('Comment', s:gray, s:none, s:italicize_comments)
+call s:HL('Todo', s:vim_fg, s:vim_bg, s:bold . s:italic)
+call s:HL('Error', s:red, s:vim_bg, s:bold . s:inverse)
+
+" Generic statement
+hi! link Statement GruvboxRed
+" if, then, else, endif, swicth, etc.
+hi! link Conditional GruvboxRed
+" for, do, while, etc.
+hi! link Repeat GruvboxRed
+" case, default, etc.
+hi! link Label GruvboxRed
+" try, catch, throw
+hi! link Exception GruvboxRed
+" sizeof, "+", "*", etc.
+hi! link Operator Normal
+" Any other keyword
+hi! link Keyword GruvboxRed
+
+" Variable name
+hi! link Identifier GruvboxBlue
+" Function name
+hi! link Function GruvboxGreenBold
+
+" Generic preprocessor
+hi! link PreProc GruvboxAqua
+" Preprocessor #include
+hi! link Include GruvboxAqua
+" Preprocessor #define
+hi! link Define GruvboxAqua
+" Same as Define
+hi! link Macro GruvboxAqua
+" Preprocessor #if, #else, #endif, etc.
+hi! link PreCondit GruvboxAqua
+
+" Generic constant
+hi! link Constant GruvboxPurple
+" Character constant: 'c', '/n'
+hi! link Character GruvboxPurple
+" String constant: "this is a string"
+if g:gruvbox_improved_strings == 0
+  call s:HL('String',  s:green, s:none, s:italicize_strings)
+else
+  call s:HL('String',  s:fg1, s:bg1, s:italicize_strings)
+endif
+" Boolean constant: TRUE, false
+hi! link Boolean GruvboxPurple
+" Number constant: 234, 0xff
+hi! link Number GruvboxPurple
+" Floating point constant: 2.3e10
+hi! link Float GruvboxPurple
+
+" Generic type
+hi! link Type GruvboxYellow
+" static, register, volatile, etc
+hi! link StorageClass GruvboxOrange
+" struct, union, enum, etc.
+hi! link Structure GruvboxAqua
+" typedef
+hi! link Typedef GruvboxYellow
+
+" }}}
+" Completion Menu: {{{
+
+if version >= 700
+  " Popup menu: normal item
+  call s:HL('Pmenu', s:fg1, s:bg2)
+  " Popup menu: selected item
+  call s:HL('PmenuSel', s:bg2, s:blue, s:bold)
+  " Popup menu: scrollbar
+  call s:HL('PmenuSbar', s:none, s:bg2)
+  " Popup menu: scrollbar thumb
+  call s:HL('PmenuThumb', s:none, s:bg4)
+endif
+
+" }}}
+" Diffs: {{{
+
+call s:HL('DiffDelete', s:red, s:bg0, s:inverse)
+call s:HL('DiffAdd',    s:green, s:bg0, s:inverse)
+"call s:HL('DiffChange', s:bg0, s:blue)
+"call s:HL('DiffText',   s:bg0, s:yellow)
+
+" Alternative setting
+call s:HL('DiffChange', s:aqua, s:bg0, s:inverse)
+call s:HL('DiffText',   s:yellow, s:bg0, s:inverse)
+
+" }}}
+" Spelling: {{{
+
+if has("spell")
+  " Not capitalised word, or compile warnings
+  if g:gruvbox_improved_warnings == 0
+    call s:HL('SpellCap',   s:none, s:none, s:undercurl, s:red)
+  else
+    call s:HL('SpellCap',   s:green, s:none, s:bold . s:italic)
+  endif
+  " Not recognized word
+  call s:HL('SpellBad',   s:none, s:none, s:undercurl, s:blue)
+  " Wrong spelling for selected region
+  call s:HL('SpellLocal', s:none, s:none, s:undercurl, s:aqua)
+  " Rare word
+  call s:HL('SpellRare',  s:none, s:none, s:undercurl, s:purple)
+endif
+
+" }}}
+
+" Plugin specific -------------------------------------------------------------
+" EasyMotion: {{{
+
+hi! link EasyMotionTarget Search
+hi! link EasyMotionShade Comment
+
+" }}}
+" Sneak: {{{
+
+hi! link Sneak Search
+hi! link SneakLabel Search
+
+" }}}
+" Indent Guides: {{{
+
+if !exists('g:indent_guides_auto_colors')
+  let g:indent_guides_auto_colors = 0
+endif
+
+if g:indent_guides_auto_colors == 0
+  if g:gruvbox_invert_indent_guides == 0
+    call s:HL('IndentGuidesOdd', s:vim_bg, s:bg2)
+    call s:HL('IndentGuidesEven', s:vim_bg, s:bg1)
+  else
+    call s:HL('IndentGuidesOdd', s:vim_bg, s:bg2, s:inverse)
+    call s:HL('IndentGuidesEven', s:vim_bg, s:bg3, s:inverse)
+  endif
+endif
+
+" }}}
+" IndentLine: {{{
+
+if !exists('g:indentLine_color_term')
+  let g:indentLine_color_term = s:bg2[1]
+endif
+if !exists('g:indentLine_color_gui')
+  let g:indentLine_color_gui = s:bg2[0]
+endif
+
+" }}}
+" Rainbow Parentheses: {{{
+
+if !exists('g:rbpt_colorpairs')
+  let g:rbpt_colorpairs =
+    \ [
+      \ ['blue', '#458588'], ['magenta', '#b16286'],
+      \ ['red',  '#cc241d'], ['166',     '#d65d0e']
+    \ ]
+endif
+
+let g:rainbow_guifgs = [ '#d65d0e', '#cc241d', '#b16286', '#458588' ]
+let g:rainbow_ctermfgs = [ '166', 'red', 'magenta', 'blue' ]
+
+if !exists('g:rainbow_conf')
+   let g:rainbow_conf = {}
+endif
+if !has_key(g:rainbow_conf, 'guifgs')
+   let g:rainbow_conf['guifgs'] = g:rainbow_guifgs
+endif
+if !has_key(g:rainbow_conf, 'ctermfgs')
+   let g:rainbow_conf['ctermfgs'] = g:rainbow_ctermfgs
+endif
+
+let g:niji_dark_colours = g:rbpt_colorpairs
+let g:niji_light_colours = g:rbpt_colorpairs
+
+"}}}
+" GitGutter: {{{
+
+hi! link GitGutterAdd GruvboxGreenSign
+hi! link GitGutterChange GruvboxAquaSign
+hi! link GitGutterDelete GruvboxRedSign
+hi! link GitGutterChangeDelete GruvboxAquaSign
+
+" }}}
+" GitCommit: "{{{
+
+hi! link gitcommitSelectedFile GruvboxGreen
+hi! link gitcommitDiscardedFile GruvboxRed
+
+" }}}
+" Signify: {{{
+
+hi! link SignifySignAdd GruvboxGreenSign
+hi! link SignifySignChange GruvboxAquaSign
+hi! link SignifySignDelete GruvboxRedSign
+
+" }}}
+" Syntastic: {{{
+
+call s:HL('SyntasticError', s:none, s:none, s:undercurl, s:red)
+call s:HL('SyntasticWarning', s:none, s:none, s:undercurl, s:yellow)
+
+hi! link SyntasticErrorSign GruvboxRedSign
+hi! link SyntasticWarningSign GruvboxYellowSign
+
+" }}}
+" Signature: {{{
+hi! link SignatureMarkText   GruvboxBlueSign
+hi! link SignatureMarkerText GruvboxPurpleSign
+
+" }}}
+" ShowMarks: {{{
+
+hi! link ShowMarksHLl GruvboxBlueSign
+hi! link ShowMarksHLu GruvboxBlueSign
+hi! link ShowMarksHLo GruvboxBlueSign
+hi! link ShowMarksHLm GruvboxBlueSign
+
+" }}}
+" CtrlP: {{{
+
+hi! link CtrlPMatch GruvboxYellow
+hi! link CtrlPNoEntries GruvboxRed
+hi! link CtrlPPrtBase GruvboxBg2
+hi! link CtrlPPrtCursor GruvboxBlue
+hi! link CtrlPLinePre GruvboxBg2
+
+call s:HL('CtrlPMode1', s:blue, s:bg2, s:bold)
+call s:HL('CtrlPMode2', s:bg0, s:blue, s:bold)
+call s:HL('CtrlPStats', s:fg4, s:bg2, s:bold)
+
+" }}}
+" Startify: {{{
+
+hi! link StartifyBracket GruvboxFg3
+hi! link StartifyFile GruvboxFg1
+hi! link StartifyNumber GruvboxBlue
+hi! link StartifyPath GruvboxGray
+hi! link StartifySlash GruvboxGray
+hi! link StartifySection GruvboxYellow
+hi! link StartifySpecial GruvboxBg2
+hi! link StartifyHeader GruvboxOrange
+hi! link StartifyFooter GruvboxBg2
+
+" }}}
+" Vimshell: {{{
+
+let g:vimshell_escape_colors = [
+  \ s:bg4[0], s:red[0], s:green[0], s:yellow[0],
+  \ s:blue[0], s:purple[0], s:aqua[0], s:fg4[0],
+  \ s:bg0[0], s:red[0], s:green[0], s:orange[0],
+  \ s:blue[0], s:purple[0], s:aqua[0], s:fg0[0]
+  \ ]
+
+" }}}
+" BufTabLine: {{{
+
+call s:HL('BufTabLineCurrent', s:bg0, s:fg4)
+call s:HL('BufTabLineActive', s:fg4, s:bg2)
+call s:HL('BufTabLineHidden', s:bg4, s:bg1)
+call s:HL('BufTabLineFill', s:bg0, s:bg0)
+
+" }}}
+" Asynchronous Lint Engine: {{{
+
+call s:HL('ALEError', s:none, s:none, s:undercurl, s:red)
+call s:HL('ALEWarning', s:none, s:none, s:undercurl, s:yellow)
+call s:HL('ALEInfo', s:none, s:none, s:undercurl, s:blue)
+
+hi! link ALEErrorSign GruvboxRedSign
+hi! link ALEWarningSign GruvboxYellowSign
+hi! link ALEInfoSign GruvboxBlueSign
+
+" }}}
+" Dirvish: {{{
+
+hi! link DirvishPathTail GruvboxAqua
+hi! link DirvishArg GruvboxYellow
+
+" }}}
+" Netrw: {{{
+
+hi! link netrwDir GruvboxAqua
+hi! link netrwClassify GruvboxAqua
+hi! link netrwLink GruvboxGray
+hi! link netrwSymLink GruvboxFg1
+hi! link netrwExe GruvboxYellow
+hi! link netrwComment GruvboxGray
+hi! link netrwList GruvboxBlue
+hi! link netrwHelpCmd GruvboxAqua
+hi! link netrwCmdSep GruvboxFg3
+hi! link netrwVersion GruvboxGreen
+
+" }}}
+" NERDTree: {{{
+
+hi! link NERDTreeDir GruvboxAqua
+hi! link NERDTreeDirSlash GruvboxAqua
+
+hi! link NERDTreeOpenable GruvboxOrange
+hi! link NERDTreeClosable GruvboxOrange
+
+hi! link NERDTreeFile GruvboxFg1
+hi! link NERDTreeExecFile GruvboxYellow
+
+hi! link NERDTreeUp GruvboxGray
+hi! link NERDTreeCWD GruvboxGreen
+hi! link NERDTreeHelp GruvboxFg1
+
+hi! link NERDTreeToggleOn GruvboxGreen
+hi! link NERDTreeToggleOff GruvboxRed
+
+" }}}
+" Vim Multiple Cursors: {{{
+
+call s:HL('multiple_cursors_cursor', s:none, s:none, s:inverse)
+call s:HL('multiple_cursors_visual', s:none, s:bg2)
+
+" }}}
+" coc.nvim: {{{
+
+hi! link CocErrorSign GruvboxRedSign
+hi! link CocWarningSign GruvboxOrangeSign
+hi! link CocInfoSign GruvboxYellowSign
+hi! link CocHintSign GruvboxBlueSign
+hi! link CocErrorFloat GruvboxRed
+hi! link CocWarningFloat GruvboxOrange
+hi! link CocInfoFloat GruvboxYellow
+hi! link CocHintFloat GruvboxBlue
+hi! link CocDiagnosticsError GruvboxRed
+hi! link CocDiagnosticsWarning GruvboxOrange
+hi! link CocDiagnosticsInfo GruvboxYellow
+hi! link CocDiagnosticsHint GruvboxBlue
+
+hi! link CocSelectedText GruvboxRed
+hi! link CocCodeLens GruvboxGray
+
+call s:HL('CocErrorHighlight', s:none, s:none, s:undercurl, s:red)
+call s:HL('CocWarningHighlight', s:none, s:none, s:undercurl, s:orange)
+call s:HL('CocInfoHighlight', s:none, s:none, s:undercurl, s:yellow)
+call s:HL('CocHintHighlight', s:none, s:none, s:undercurl, s:blue)
+
+" }}}
+
+" Filetype specific -----------------------------------------------------------
+" Diff: {{{
+
+hi! link diffAdded GruvboxGreen
+hi! link diffRemoved GruvboxRed
+hi! link diffChanged GruvboxAqua
+
+hi! link diffFile GruvboxOrange
+hi! link diffNewFile GruvboxYellow
+
+hi! link diffLine GruvboxBlue
+
+" }}}
+" Html: {{{
+
+hi! link htmlTag GruvboxBlue
+hi! link htmlEndTag GruvboxBlue
+
+hi! link htmlTagName GruvboxAquaBold
+hi! link htmlArg GruvboxAqua
+
+hi! link htmlScriptTag GruvboxPurple
+hi! link htmlTagN GruvboxFg1
+hi! link htmlSpecialTagName GruvboxAquaBold
+
+call s:HL('htmlLink', s:fg4, s:none, s:underline)
+
+hi! link htmlSpecialChar GruvboxOrange
+
+call s:HL('htmlBold', s:vim_fg, s:vim_bg, s:bold)
+call s:HL('htmlBoldUnderline', s:vim_fg, s:vim_bg, s:bold . s:underline)
+call s:HL('htmlBoldItalic', s:vim_fg, s:vim_bg, s:bold . s:italic)
+call s:HL('htmlBoldUnderlineItalic', s:vim_fg, s:vim_bg, s:bold . s:underline . s:italic)
+
+call s:HL('htmlUnderline', s:vim_fg, s:vim_bg, s:underline)
+call s:HL('htmlUnderlineItalic', s:vim_fg, s:vim_bg, s:underline . s:italic)
+call s:HL('htmlItalic', s:vim_fg, s:vim_bg, s:italic)
+
+" }}}
+" Xml: {{{
+
+hi! link xmlTag GruvboxBlue
+hi! link xmlEndTag GruvboxBlue
+hi! link xmlTagName GruvboxBlue
+hi! link xmlEqual GruvboxBlue
+hi! link docbkKeyword GruvboxAquaBold
+
+hi! link xmlDocTypeDecl GruvboxGray
+hi! link xmlDocTypeKeyword GruvboxPurple
+hi! link xmlCdataStart GruvboxGray
+hi! link xmlCdataCdata GruvboxPurple
+hi! link dtdFunction GruvboxGray
+hi! link dtdTagName GruvboxPurple
+
+hi! link xmlAttrib GruvboxAqua
+hi! link xmlProcessingDelim GruvboxGray
+hi! link dtdParamEntityPunct GruvboxGray
+hi! link dtdParamEntityDPunct GruvboxGray
+hi! link xmlAttribPunct GruvboxGray
+
+hi! link xmlEntity GruvboxOrange
+hi! link xmlEntityPunct GruvboxOrange
+" }}}
+" Vim: {{{
+
+call s:HL('vimCommentTitle', s:fg4_256, s:none, s:bold . s:italicize_comments)
+
+hi! link vimNotation GruvboxOrange
+hi! link vimBracket GruvboxOrange
+hi! link vimMapModKey GruvboxOrange
+hi! link vimFuncSID GruvboxFg3
+hi! link vimSetSep GruvboxFg3
+hi! link vimSep GruvboxFg3
+hi! link vimContinue GruvboxFg3
+
+" }}}
+" Clojure: {{{
+
+hi! link clojureKeyword GruvboxBlue
+hi! link clojureCond GruvboxOrange
+hi! link clojureSpecial GruvboxOrange
+hi! link clojureDefine GruvboxOrange
+
+hi! link clojureFunc GruvboxYellow
+hi! link clojureRepeat GruvboxYellow
+hi! link clojureCharacter GruvboxAqua
+hi! link clojureStringEscape GruvboxAqua
+hi! link clojureException GruvboxRed
+
+hi! link clojureRegexp GruvboxAqua
+hi! link clojureRegexpEscape GruvboxAqua
+call s:HL('clojureRegexpCharClass', s:fg3, s:none, s:bold)
+hi! link clojureRegexpMod clojureRegexpCharClass
+hi! link clojureRegexpQuantifier clojureRegexpCharClass
+
+hi! link clojureParen GruvboxFg3
+hi! link clojureAnonArg GruvboxYellow
+hi! link clojureVariable GruvboxBlue
+hi! link clojureMacro GruvboxOrange
+
+hi! link clojureMeta GruvboxYellow
+hi! link clojureDeref GruvboxYellow
+hi! link clojureQuote GruvboxYellow
+hi! link clojureUnquote GruvboxYellow
+
+" }}}
+" C: {{{
+
+hi! link cOperator GruvboxPurple
+hi! link cStructure GruvboxOrange
+
+" }}}
+" Python: {{{
+
+hi! link pythonBuiltin GruvboxOrange
+hi! link pythonBuiltinObj GruvboxOrange
+hi! link pythonBuiltinFunc GruvboxOrange
+hi! link pythonFunction GruvboxAqua
+hi! link pythonDecorator GruvboxRed
+hi! link pythonInclude GruvboxBlue
+hi! link pythonImport GruvboxBlue
+hi! link pythonRun GruvboxBlue
+hi! link pythonCoding GruvboxBlue
+hi! link pythonOperator GruvboxRed
+hi! link pythonException GruvboxRed
+hi! link pythonExceptions GruvboxPurple
+hi! link pythonBoolean GruvboxPurple
+hi! link pythonDot GruvboxFg3
+hi! link pythonConditional GruvboxRed
+hi! link pythonRepeat GruvboxRed
+hi! link pythonDottedName GruvboxGreenBold
+
+" }}}
+" CSS: {{{
+
+hi! link cssBraces GruvboxBlue
+hi! link cssFunctionName GruvboxYellow
+hi! link cssIdentifier GruvboxOrange
+hi! link cssClassName GruvboxGreen
+hi! link cssColor GruvboxBlue
+hi! link cssSelectorOp GruvboxBlue
+hi! link cssSelectorOp2 GruvboxBlue
+hi! link cssImportant GruvboxGreen
+hi! link cssVendor GruvboxFg1
+
+hi! link cssTextProp GruvboxAqua
+hi! link cssAnimationProp GruvboxAqua
+hi! link cssUIProp GruvboxYellow
+hi! link cssTransformProp GruvboxAqua
+hi! link cssTransitionProp GruvboxAqua
+hi! link cssPrintProp GruvboxAqua
+hi! link cssPositioningProp GruvboxYellow
+hi! link cssBoxProp GruvboxAqua
+hi! link cssFontDescriptorProp GruvboxAqua
+hi! link cssFlexibleBoxProp GruvboxAqua
+hi! link cssBorderOutlineProp GruvboxAqua
+hi! link cssBackgroundProp GruvboxAqua
+hi! link cssMarginProp GruvboxAqua
+hi! link cssListProp GruvboxAqua
+hi! link cssTableProp GruvboxAqua
+hi! link cssFontProp GruvboxAqua
+hi! link cssPaddingProp GruvboxAqua
+hi! link cssDimensionProp GruvboxAqua
+hi! link cssRenderProp GruvboxAqua
+hi! link cssColorProp GruvboxAqua
+hi! link cssGeneratedContentProp GruvboxAqua
+
+" }}}
+" JavaScript: {{{
+
+hi! link javaScriptBraces GruvboxFg1
+hi! link javaScriptFunction GruvboxAqua
+hi! link javaScriptIdentifier GruvboxRed
+hi! link javaScriptMember GruvboxBlue
+hi! link javaScriptNumber GruvboxPurple
+hi! link javaScriptNull GruvboxPurple
+hi! link javaScriptParens GruvboxFg3
+
+" }}}
+" YAJS: {{{
+
+hi! link javascriptImport GruvboxAqua
+hi! link javascriptExport GruvboxAqua
+hi! link javascriptClassKeyword GruvboxAqua
+hi! link javascriptClassExtends GruvboxAqua
+hi! link javascriptDefault GruvboxAqua
+
+hi! link javascriptClassName GruvboxYellow
+hi! link javascriptClassSuperName GruvboxYellow
+hi! link javascriptGlobal GruvboxYellow
+
+hi! link javascriptEndColons GruvboxFg1
+hi! link javascriptFuncArg GruvboxFg1
+hi! link javascriptGlobalMethod GruvboxFg1
+hi! link javascriptNodeGlobal GruvboxFg1
+hi! link javascriptBOMWindowProp GruvboxFg1
+hi! link javascriptArrayMethod GruvboxFg1
+hi! link javascriptArrayStaticMethod GruvboxFg1
+hi! link javascriptCacheMethod GruvboxFg1
+hi! link javascriptDateMethod GruvboxFg1
+hi! link javascriptMathStaticMethod GruvboxFg1
+
+" hi! link javascriptProp GruvboxFg1
+hi! link javascriptURLUtilsProp GruvboxFg1
+hi! link javascriptBOMNavigatorProp GruvboxFg1
+hi! link javascriptDOMDocMethod GruvboxFg1
+hi! link javascriptDOMDocProp GruvboxFg1
+hi! link javascriptBOMLocationMethod GruvboxFg1
+hi! link javascriptBOMWindowMethod GruvboxFg1
+hi! link javascriptStringMethod GruvboxFg1
+
+hi! link javascriptVariable GruvboxOrange
+" hi! link javascriptVariable GruvboxRed
+" hi! link javascriptIdentifier GruvboxOrange
+" hi! link javascriptClassSuper GruvboxOrange
+hi! link javascriptIdentifier GruvboxOrange
+hi! link javascriptClassSuper GruvboxOrange
+
+" hi! link javascriptFuncKeyword GruvboxOrange
+" hi! link javascriptAsyncFunc GruvboxOrange
+hi! link javascriptFuncKeyword GruvboxAqua
+hi! link javascriptAsyncFunc GruvboxAqua
+hi! link javascriptClassStatic GruvboxOrange
+
+hi! link javascriptOperator GruvboxRed
+hi! link javascriptForOperator GruvboxRed
+hi! link javascriptYield GruvboxRed
+hi! link javascriptExceptions GruvboxRed
+hi! link javascriptMessage GruvboxRed
+
+hi! link javascriptTemplateSB GruvboxAqua
+hi! link javascriptTemplateSubstitution GruvboxFg1
+
+" hi! link javascriptLabel GruvboxBlue
+" hi! link javascriptObjectLabel GruvboxBlue
+" hi! link javascriptPropertyName GruvboxBlue
+hi! link javascriptLabel GruvboxFg1
+hi! link javascriptObjectLabel GruvboxFg1
+hi! link javascriptPropertyName GruvboxFg1
+
+hi! link javascriptLogicSymbols GruvboxFg1
+hi! link javascriptArrowFunc GruvboxYellow
+
+hi! link javascriptDocParamName GruvboxFg4
+hi! link javascriptDocTags GruvboxFg4
+hi! link javascriptDocNotation GruvboxFg4
+hi! link javascriptDocParamType GruvboxFg4
+hi! link javascriptDocNamedParamType GruvboxFg4
+
+hi! link javascriptBrackets GruvboxFg1
+hi! link javascriptDOMElemAttrs GruvboxFg1
+hi! link javascriptDOMEventMethod GruvboxFg1
+hi! link javascriptDOMNodeMethod GruvboxFg1
+hi! link javascriptDOMStorageMethod GruvboxFg1
+hi! link javascriptHeadersMethod GruvboxFg1
+
+hi! link javascriptAsyncFuncKeyword GruvboxRed
+hi! link javascriptAwaitFuncKeyword GruvboxRed
+
+" }}}
+" PanglossJS: {{{
+
+hi! link jsClassKeyword GruvboxAqua
+hi! link jsExtendsKeyword GruvboxAqua
+hi! link jsExportDefault GruvboxAqua
+hi! link jsTemplateBraces GruvboxAqua
+hi! link jsGlobalNodeObjects GruvboxFg1
+hi! link jsGlobalObjects GruvboxFg1
+hi! link jsFunction GruvboxAqua
+hi! link jsFuncParens GruvboxFg3
+hi! link jsParens GruvboxFg3
+hi! link jsNull GruvboxPurple
+hi! link jsUndefined GruvboxPurple
+hi! link jsClassDefinition GruvboxYellow
+
+" }}}
+" TypeScript: {{{
+
+hi! link typeScriptReserved GruvboxAqua
+hi! link typeScriptLabel GruvboxAqua
+hi! link typeScriptFuncKeyword GruvboxAqua
+hi! link typeScriptIdentifier GruvboxOrange
+hi! link typeScriptBraces GruvboxFg1
+hi! link typeScriptEndColons GruvboxFg1
+hi! link typeScriptDOMObjects GruvboxFg1
+hi! link typeScriptAjaxMethods GruvboxFg1
+hi! link typeScriptLogicSymbols GruvboxFg1
+hi! link typeScriptDocSeeTag Comment
+hi! link typeScriptDocParam Comment
+hi! link typeScriptDocTags vimCommentTitle
+hi! link typeScriptGlobalObjects GruvboxFg1
+hi! link typeScriptParens GruvboxFg3
+hi! link typeScriptOpSymbols GruvboxFg3
+hi! link typeScriptHtmlElemProperties GruvboxFg1
+hi! link typeScriptNull GruvboxPurple
+hi! link typeScriptInterpolationDelimiter GruvboxAqua
+
+" }}}
+" PureScript: {{{
+
+hi! link purescriptModuleKeyword GruvboxAqua
+hi! link purescriptModuleName GruvboxFg1
+hi! link purescriptWhere GruvboxAqua
+hi! link purescriptDelimiter GruvboxFg4
+hi! link purescriptType GruvboxFg1
+hi! link purescriptImportKeyword GruvboxAqua
+hi! link purescriptHidingKeyword GruvboxAqua
+hi! link purescriptAsKeyword GruvboxAqua
+hi! link purescriptStructure GruvboxAqua
+hi! link purescriptOperator GruvboxBlue
+
+hi! link purescriptTypeVar GruvboxFg1
+hi! link purescriptConstructor GruvboxFg1
+hi! link purescriptFunction GruvboxFg1
+hi! link purescriptConditional GruvboxOrange
+hi! link purescriptBacktick GruvboxOrange
+
+" }}}
+" CoffeeScript: {{{
+
+hi! link coffeeExtendedOp GruvboxFg3
+hi! link coffeeSpecialOp GruvboxFg3
+hi! link coffeeCurly GruvboxOrange
+hi! link coffeeParen GruvboxFg3
+hi! link coffeeBracket GruvboxOrange
+
+" }}}
+" Ruby: {{{
+
+hi! link rubyStringDelimiter GruvboxGreen
+hi! link rubyInterpolationDelimiter GruvboxAqua
+
+" }}}
+" ObjectiveC: {{{
+
+hi! link objcTypeModifier GruvboxRed
+hi! link objcDirective GruvboxBlue
+
+" }}}
+" Go: {{{
+
+hi! link goDirective GruvboxAqua
+hi! link goConstants GruvboxPurple
+hi! link goDeclaration GruvboxRed
+hi! link goDeclType GruvboxBlue
+hi! link goBuiltins GruvboxOrange
+
+" }}}
+" Lua: {{{
+
+hi! link luaIn GruvboxRed
+hi! link luaFunction GruvboxAqua
+hi! link luaTable GruvboxOrange
+
+" }}}
+" MoonScript: {{{
+
+hi! link moonSpecialOp GruvboxFg3
+hi! link moonExtendedOp GruvboxFg3
+hi! link moonFunction GruvboxFg3
+hi! link moonObject GruvboxYellow
+
+" }}}
+" Java: {{{
+
+hi! link javaAnnotation GruvboxBlue
+hi! link javaDocTags GruvboxAqua
+hi! link javaCommentTitle vimCommentTitle
+hi! link javaParen GruvboxFg3
+hi! link javaParen1 GruvboxFg3
+hi! link javaParen2 GruvboxFg3
+hi! link javaParen3 GruvboxFg3
+hi! link javaParen4 GruvboxFg3
+hi! link javaParen5 GruvboxFg3
+hi! link javaOperator GruvboxOrange
+
+hi! link javaVarArg GruvboxGreen
+
+" }}}
+" Elixir: {{{
+
+hi! link elixirDocString Comment
+
+hi! link elixirStringDelimiter GruvboxGreen
+hi! link elixirInterpolationDelimiter GruvboxAqua
+
+hi! link elixirModuleDeclaration GruvboxYellow
+
+" }}}
+" Scala: {{{
+
+" NB: scala vim syntax file is kinda horrible
+hi! link scalaNameDefinition GruvboxFg1
+hi! link scalaCaseFollowing GruvboxFg1
+hi! link scalaCapitalWord GruvboxFg1
+hi! link scalaTypeExtension GruvboxFg1
+
+hi! link scalaKeyword GruvboxRed
+hi! link scalaKeywordModifier GruvboxRed
+
+hi! link scalaSpecial GruvboxAqua
+hi! link scalaOperator GruvboxFg1
+
+hi! link scalaTypeDeclaration GruvboxYellow
+hi! link scalaTypeTypePostDeclaration GruvboxYellow
+
+hi! link scalaInstanceDeclaration GruvboxFg1
+hi! link scalaInterpolation GruvboxAqua
+
+" }}}
+" Markdown: {{{
+
+call s:HL('markdownItalic', s:fg3, s:none, s:italic)
+
+hi! link markdownH1 GruvboxGreenBold
+hi! link markdownH2 GruvboxGreenBold
+hi! link markdownH3 GruvboxYellowBold
+hi! link markdownH4 GruvboxYellowBold
+hi! link markdownH5 GruvboxYellow
+hi! link markdownH6 GruvboxYellow
+
+hi! link markdownCode GruvboxAqua
+hi! link markdownCodeBlock GruvboxAqua
+hi! link markdownCodeDelimiter GruvboxAqua
+
+hi! link markdownBlockquote GruvboxGray
+hi! link markdownListMarker GruvboxGray
+hi! link markdownOrderedListMarker GruvboxGray
+hi! link markdownRule GruvboxGray
+hi! link markdownHeadingRule GruvboxGray
+
+hi! link markdownUrlDelimiter GruvboxFg3
+hi! link markdownLinkDelimiter GruvboxFg3
+hi! link markdownLinkTextDelimiter GruvboxFg3
+
+hi! link markdownHeadingDelimiter GruvboxOrange
+hi! link markdownUrl GruvboxPurple
+hi! link markdownUrlTitleDelimiter GruvboxGreen
+
+call s:HL('markdownLinkText', s:gray, s:none, s:underline)
+hi! link markdownIdDeclaration markdownLinkText
+
+" }}}
+" Haskell: {{{
+
+" hi! link haskellType GruvboxYellow
+" hi! link haskellOperators GruvboxOrange
+" hi! link haskellConditional GruvboxAqua
+" hi! link haskellLet GruvboxOrange
+"
+hi! link haskellType GruvboxFg1
+hi! link haskellIdentifier GruvboxFg1
+hi! link haskellSeparator GruvboxFg1
+hi! link haskellDelimiter GruvboxFg4
+hi! link haskellOperators GruvboxBlue
+"
+hi! link haskellBacktick GruvboxOrange
+hi! link haskellStatement GruvboxOrange
+hi! link haskellConditional GruvboxOrange
+
+hi! link haskellLet GruvboxAqua
+hi! link haskellDefault GruvboxAqua
+hi! link haskellWhere GruvboxAqua
+hi! link haskellBottom GruvboxAqua
+hi! link haskellBlockKeywords GruvboxAqua
+hi! link haskellImportKeywords GruvboxAqua
+hi! link haskellDeclKeyword GruvboxAqua
+hi! link haskellDeriving GruvboxAqua
+hi! link haskellAssocType GruvboxAqua
+
+hi! link haskellNumber GruvboxPurple
+hi! link haskellPragma GruvboxPurple
+
+hi! link haskellString GruvboxGreen
+hi! link haskellChar GruvboxGreen
+
+" }}}
+" Json: {{{
+
+hi! link jsonKeyword GruvboxGreen
+hi! link jsonQuote GruvboxGreen
+hi! link jsonBraces GruvboxFg1
+hi! link jsonString GruvboxFg1
+
+" }}}
+
+
+" Functions -------------------------------------------------------------------
+" Search Highlighting Cursor {{{
+
+function! GruvboxHlsShowCursor()
+  call s:HL('Cursor', s:bg0, s:hls_cursor)
+endfunction
+
+function! GruvboxHlsHideCursor()
+  call s:HL('Cursor', s:none, s:none, s:inverse)
+endfunction
+
+" }}}
+
+" vim: set sw=2 ts=2 sts=2 et tw=80 ft=vim fdm=marker:
diff --git a/.vim/pack/default/start/gruvbox/gruvbox_256palette.sh b/.vim/pack/default/start/gruvbox/gruvbox_256palette.sh
new file mode 100755
index 0000000..c7fd190
--- /dev/null
+++ b/.vim/pack/default/start/gruvbox/gruvbox_256palette.sh
@@ -0,0 +1,118 @@
+#!/bin/sh
+
+if [ "${TERM%%-*}" = "screen" ]; then
+  if [ -n "$TMUX" ]; then
+    printf "\033Ptmux;\033\033]4;236;rgb:32/30/2f\007\033\\"
+    printf "\033Ptmux;\033\033]4;234;rgb:1d/20/21\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;235;rgb:28/28/28\007\033\\"
+    printf "\033Ptmux;\033\033]4;237;rgb:3c/38/36\007\033\\"
+    printf "\033Ptmux;\033\033]4;239;rgb:50/49/45\007\033\\"
+    printf "\033Ptmux;\033\033]4;241;rgb:66/5c/54\007\033\\"
+    printf "\033Ptmux;\033\033]4;243;rgb:7c/6f/64\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;244;rgb:92/83/74\007\033\\"
+    printf "\033Ptmux;\033\033]4;245;rgb:92/83/74\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;228;rgb:f2/e5/bc\007\033\\"
+    printf "\033Ptmux;\033\033]4;230;rgb:f9/f5/d7\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;229;rgb:fb/f1/c7\007\033\\"
+    printf "\033Ptmux;\033\033]4;223;rgb:eb/db/b2\007\033\\"
+    printf "\033Ptmux;\033\033]4;250;rgb:d5/c4/a1\007\033\\"
+    printf "\033Ptmux;\033\033]4;248;rgb:bd/ae/93\007\033\\"
+    printf "\033Ptmux;\033\033]4;246;rgb:a8/99/84\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;167;rgb:fb/49/34\007\033\\"
+    printf "\033Ptmux;\033\033]4;142;rgb:b8/bb/26\007\033\\"
+    printf "\033Ptmux;\033\033]4;214;rgb:fa/bd/2f\007\033\\"
+    printf "\033Ptmux;\033\033]4;109;rgb:83/a5/98\007\033\\"
+    printf "\033Ptmux;\033\033]4;175;rgb:d3/86/9b\007\033\\"
+    printf "\033Ptmux;\033\033]4;108;rgb:8e/c0/7c\007\033\\"
+    printf "\033Ptmux;\033\033]4;208;rgb:fe/80/19\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;88;rgb:9d/00/06\007\033\\"
+    printf "\033Ptmux;\033\033]4;100;rgb:79/74/0e\007\033\\"
+    printf "\033Ptmux;\033\033]4;136;rgb:b5/76/14\007\033\\"
+    printf "\033Ptmux;\033\033]4;24;rgb:07/66/78\007\033\\"
+    printf "\033Ptmux;\033\033]4;96;rgb:8f/3f/71\007\033\\"
+    printf "\033Ptmux;\033\033]4;66;rgb:42/7b/58\007\033\\"
+    printf "\033Ptmux;\033\033]4;130;rgb:af/3a/03\007\033\\"
+  else
+    printf "\033P\033]4;236;rgb:32/30/2f\007\033\\"
+    printf "\033P\033]4;234;rgb:1d/20/21\007\033\\"
+
+    printf "\033P\033]4;235;rgb:28/28/28\007\033\\"
+    printf "\033P\033]4;237;rgb:3c/38/36\007\033\\"
+    printf "\033P\033]4;239;rgb:50/49/45\007\033\\"
+    printf "\033P\033]4;241;rgb:66/5c/54\007\033\\"
+    printf "\033P\033]4;243;rgb:7c/6f/64\007\033\\"
+
+    printf "\033P\033]4;244;rgb:92/83/74\007\033\\"
+    printf "\033P\033]4;245;rgb:92/83/74\007\033\\"
+
+    printf "\033P\033]4;228;rgb:f2/e5/bc\007\033\\"
+    printf "\033P\033]4;230;rgb:f9/f5/d7\007\033\\"
+
+    printf "\033P\033]4;229;rgb:fb/f1/c7\007\033\\"
+    printf "\033P\033]4;223;rgb:eb/db/b2\007\033\\"
+    printf "\033P\033]4;250;rgb:d5/c4/a1\007\033\\"
+    printf "\033P\033]4;248;rgb:bd/ae/93\007\033\\"
+    printf "\033P\033]4;246;rgb:a8/99/84\007\033\\"
+
+    printf "\033P\033]4;167;rgb:fb/49/34\007\033\\"
+    printf "\033P\033]4;142;rgb:b8/bb/26\007\033\\"
+    printf "\033P\033]4;214;rgb:fa/bd/2f\007\033\\"
+    printf "\033P\033]4;109;rgb:83/a5/98\007\033\\"
+    printf "\033P\033]4;175;rgb:d3/86/9b\007\033\\"
+    printf "\033P\033]4;108;rgb:8e/c0/7c\007\033\\"
+    printf "\033P\033]4;208;rgb:fe/80/19\007\033\\"
+
+    printf "\033P\033]4;88;rgb:9d/00/06\007\033\\"
+    printf "\033P\033]4;100;rgb:79/74/0e\007\033\\"
+    printf "\033P\033]4;136;rgb:b5/76/14\007\033\\"
+    printf "\033P\033]4;24;rgb:07/66/78\007\033\\"
+    printf "\033P\033]4;96;rgb:8f/3f/71\007\033\\"
+    printf "\033P\033]4;66;rgb:42/7b/58\007\033\\"
+    printf "\033P\033]4;130;rgb:af/3a/03\007\033\\"
+  fi
+
+elif [ "$TERM" != "linux" ] && [ "$TERM" != "vt100" ] && [ "$TERM" != "vt220" ]; then
+
+  printf "\033]4;236;rgb:32/30/2f\033\\"
+  printf "\033]4;234;rgb:1d/20/21\033\\"
+
+  printf "\033]4;235;rgb:28/28/28\033\\"
+  printf "\033]4;237;rgb:3c/38/36\033\\"
+  printf "\033]4;239;rgb:50/49/45\033\\"
+  printf "\033]4;241;rgb:66/5c/54\033\\"
+  printf "\033]4;243;rgb:7c/6f/64\033\\"
+
+  printf "\033]4;244;rgb:92/83/74\033\\"
+  printf "\033]4;245;rgb:92/83/74\033\\"
+
+  printf "\033]4;228;rgb:f2/e5/bc\033\\"
+  printf "\033]4;230;rgb:f9/f5/d7\033\\"
+
+  printf "\033]4;229;rgb:fb/f1/c7\033\\"
+  printf "\033]4;223;rgb:eb/db/b2\033\\"
+  printf "\033]4;250;rgb:d5/c4/a1\033\\"
+  printf "\033]4;248;rgb:bd/ae/93\033\\"
+  printf "\033]4;246;rgb:a8/99/84\033\\"
+
+  printf "\033]4;167;rgb:fb/49/34\033\\"
+  printf "\033]4;142;rgb:b8/bb/26\033\\"
+  printf "\033]4;214;rgb:fa/bd/2f\033\\"
+  printf "\033]4;109;rgb:83/a5/98\033\\"
+  printf "\033]4;175;rgb:d3/86/9b\033\\"
+  printf "\033]4;108;rgb:8e/c0/7c\033\\"
+  printf "\033]4;208;rgb:fe/80/19\033\\"
+
+  printf "\033]4;88;rgb:9d/00/06\033\\"
+  printf "\033]4;100;rgb:79/74/0e\033\\"
+  printf "\033]4;136;rgb:b5/76/14\033\\"
+  printf "\033]4;24;rgb:07/66/78\033\\"
+  printf "\033]4;96;rgb:8f/3f/71\033\\"
+  printf "\033]4;66;rgb:42/7b/58\033\\"
+  printf "\033]4;130;rgb:af/3a/03\033\\"
+fi
diff --git a/.vim/pack/default/start/gruvbox/gruvbox_256palette_osx.sh b/.vim/pack/default/start/gruvbox/gruvbox_256palette_osx.sh
new file mode 100755
index 0000000..ad5111a
--- /dev/null
+++ b/.vim/pack/default/start/gruvbox/gruvbox_256palette_osx.sh
@@ -0,0 +1,116 @@
+#!/bin/sh
+
+if [ "${TERM%%-*}" = "screen" ]; then
+  if [ -n "$TMUX" ]; then
+    printf "\033Ptmux;\033\033]4;236;rgb:26/24/23\007\033\\"
+    printf "\033Ptmux;\033\033]4;234;rgb:16/18/19\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;235;rgb:1e/1e/1e\007\033\\"
+    printf "\033Ptmux;\033\033]4;237;rgb:2e/2a/29\007\033\\"
+    printf "\033Ptmux;\033\033]4;239;rgb:3f/39/35\007\033\\"
+    printf "\033Ptmux;\033\033]4;241;rgb:53/4a/42\007\033\\"
+    printf "\033Ptmux;\033\033]4;243;rgb:68/5c/51\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;244;rgb:7f/70/61\007\033\\"
+    printf "\033Ptmux;\033\033]4;245;rgb:7f/70/61\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;228;rgb:ef/df/ae\007\033\\"
+    printf "\033Ptmux;\033\033]4;230;rgb:f8/f4/cd\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;229;rgb:fa/ee/bb\007\033\\"
+    printf "\033Ptmux;\033\033]4;223;rgb:e6/d4/a3\007\033\\"
+    printf "\033Ptmux;\033\033]4;250;rgb:cb/b8/90\007\033\\"
+    printf "\033Ptmux;\033\033]4;248;rgb:af/9f/81\007\033\\"
+    printf "\033Ptmux;\033\033]4;246;rgb:97/87/71\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;167;rgb:f7/30/28\007\033\\"
+    printf "\033Ptmux;\033\033]4;142;rgb:aa/b0/1e\007\033\\"
+    printf "\033Ptmux;\033\033]4;214;rgb:f7/b1/25\007\033\\"
+    printf "\033Ptmux;\033\033]4;109;rgb:71/95/86\007\033\\"
+    printf "\033Ptmux;\033\033]4;175;rgb:c7/70/89\007\033\\"
+    printf "\033Ptmux;\033\033]4;108;rgb:7d/b6/69\007\033\\"
+    printf "\033Ptmux;\033\033]4;208;rgb:fb/6a/16\007\033\\"
+
+    printf "\033Ptmux;\033\033]4;88;rgb:89/00/09\007\033\\"
+    printf "\033Ptmux;\033\033]4;100;rgb:66/62/0d\007\033\\"
+    printf "\033Ptmux;\033\033]4;136;rgb:a5/63/11\007\033\\"
+    printf "\033Ptmux;\033\033]4;24;rgb:0e/53/65\007\033\\"
+    printf "\033Ptmux;\033\033]4;96;rgb:7b/2b/5e\007\033\\"
+    printf "\033Ptmux;\033\033]4;66;rgb:35/6a/46\007\033\\"
+    printf "\033Ptmux;\033\033]4;130;rgb:9d/28/07\007\033\\"
+  else
+    printf "\033P\033]4;236;rgb:26/24/23\007\033\\"
+    printf "\033P\033]4;234;rgb:16/18/19\007\033\\"
+
+    printf "\033P\033]4;235;rgb:1e/1e/1e\007\033\\"
+    printf "\033P\033]4;237;rgb:2e/2a/29\007\033\\"
+    printf "\033P\033]4;239;rgb:3f/39/35\007\033\\"
+    printf "\033P\033]4;241;rgb:53/4a/42\007\033\\"
+    printf "\033P\033]4;243;rgb:68/5c/51\007\033\\"
+
+    printf "\033P\033]4;244;rgb:7f/70/61\007\033\\"
+    printf "\033P\033]4;245;rgb:7f/70/61\007\033\\"
+
+    printf "\033P\033]4;228;rgb:ef/df/ae\007\033\\"
+    printf "\033P\033]4;230;rgb:f8/f4/cd\007\033\\"
+
+    printf "\033P\033]4;229;rgb:fa/ee/bb\007\033\\"
+    printf "\033P\033]4;223;rgb:e6/d4/a3\007\033\\"
+    printf "\033P\033]4;250;rgb:cb/b8/90\007\033\\"
+    printf "\033P\033]4;248;rgb:af/9f/81\007\033\\"
+    printf "\033P\033]4;246;rgb:97/87/71\007\033\\"
+
+    printf "\033P\033]4;167;rgb:f7/30/28\007\033\\"
+    printf "\033P\033]4;142;rgb:aa/b0/1e\007\033\\"
+    printf "\033P\033]4;214;rgb:f7/b1/25\007\033\\"
+    printf "\033P\033]4;109;rgb:71/95/86\007\033\\"
+    printf "\033P\033]4;175;rgb:c7/70/89\007\033\\"
+    printf "\033P\033]4;108;rgb:7d/b6/69\007\033\\"
+    printf "\033P\033]4;208;rgb:fb/6a/16\007\033\\"
+
+    printf "\033P\033]4;88;rgb:89/00/09\007\033\\"
+    printf "\033P\033]4;100;rgb:66/62/0d\007\033\\"
+    printf "\033P\033]4;136;rgb:a5/63/11\007\033\\"
+    printf "\033P\033]4;24;rgb:0e/53/65\007\033\\"
+    printf "\033P\033]4;96;rgb:7b/2b/5e\007\033\\"
+    printf "\033P\033]4;66;rgb:35/6a/46\007\033\\"
+    printf "\033P\033]4;130;rgb:9d/28/07\007\033\\"
+  fi
+else
+  printf "\033]4;236;rgb:26/24/23\033\\"
+  printf "\033]4;234;rgb:16/18/19\033\\"
+
+  printf "\033]4;235;rgb:1e/1e/1e\033\\"
+  printf "\033]4;237;rgb:2e/2a/29\033\\"
+  printf "\033]4;239;rgb:3f/39/35\033\\"
+  printf "\033]4;241;rgb:53/4a/42\033\\"
+  printf "\033]4;243;rgb:68/5c/51\033\\"
+
+  printf "\033]4;244;rgb:7f/70/61\033\\"
+  printf "\033]4;245;rgb:7f/70/61\033\\"
+
+  printf "\033]4;228;rgb:ef/df/ae\033\\"
+  printf "\033]4;230;rgb:f8/f4/cd\033\\"
+
+  printf "\033]4;229;rgb:fa/ee/bb\033\\"
+  printf "\033]4;223;rgb:e6/d4/a3\033\\"
+  printf "\033]4;250;rgb:cb/b8/90\033\\"
+  printf "\033]4;248;rgb:af/9f/81\033\\"
+  printf "\033]4;246;rgb:97/87/71\033\\"
+
+  printf "\033]4;167;rgb:f7/30/28\033\\"
+  printf "\033]4;142;rgb:aa/b0/1e\033\\"
+  printf "\033]4;214;rgb:f7/b1/25\033\\"
+  printf "\033]4;109;rgb:71/95/86\033\\"
+  printf "\033]4;175;rgb:c7/70/89\033\\"
+  printf "\033]4;108;rgb:7d/b6/69\033\\"
+  printf "\033]4;208;rgb:fb/6a/16\033\\"
+
+  printf "\033]4;88;rgb:89/00/09\033\\"
+  printf "\033]4;100;rgb:66/62/0d\033\\"
+  printf "\033]4;136;rgb:a5/63/11\033\\"
+  printf "\033]4;24;rgb:0e/53/65\033\\"
+  printf "\033]4;96;rgb:7b/2b/5e\033\\"
+  printf "\033]4;66;rgb:35/6a/46\033\\"
+  printf "\033]4;130;rgb:9d/28/07\033\\"
+fi
diff --git a/.vim/pack/vendor/start/nerdtree/autoload/nerdtree.vim b/.vim/pack/vendor/start/nerdtree/autoload/nerdtree.vim
new file mode 100644
index 0000000..ba70871
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/autoload/nerdtree.vim
@@ -0,0 +1,249 @@
+if exists('g:loaded_nerdtree_autoload')
+    finish
+endif
+let g:loaded_nerdtree_autoload = 1
+
+let s:rootNERDTreePath = resolve(expand('<sfile>:p:h:h'))
+
+"FUNCTION: nerdtree#version(...) {{{1
+"  If any value is given as an argument, the entire line of text from the
+"  change log is shown for the current version; otherwise, only the version
+"  number is shown.
+function! nerdtree#version(...) abort
+    let l:text = 'Unknown'
+    try
+        let l:changelog = readfile(join([s:rootNERDTreePath, 'CHANGELOG.md'], nerdtree#slash()))
+        let l:line = 0
+        while l:line <= len(l:changelog)
+            if l:changelog[l:line] =~# '\d\+\.\d\+'
+                let l:text = substitute(l:changelog[l:line], '.*\(\d\+.\d\+\).*', '\1', '')
+                let l:text .= substitute(l:changelog[l:line+1], '^.\{-}\(\.\d\+\).\{-}:\(.*\)', a:0>0 ? '\1:\2' : '\1', '')
+                break
+            endif
+            let l:line += 1
+        endwhile
+    catch
+    endtry
+    return l:text
+endfunction
+
+" SECTION: General Functions {{{1
+"============================================================
+
+" FUNCTION: nerdtree#closeTreeOnOpen() {{{2
+function! nerdtree#closeTreeOnOpen() abort
+    return g:NERDTreeQuitOnOpen == 1 || g:NERDTreeQuitOnOpen == 3
+endfunction
+
+" FUNCTION: nerdtree#closeBookmarksOnOpen() {{{2
+function! nerdtree#closeBookmarksOnOpen() abort
+    return g:NERDTreeQuitOnOpen == 2 || g:NERDTreeQuitOnOpen == 3
+endfunction
+
+" FUNCTION: nerdtree#slash() {{{2
+" Return the path separator used by the underlying file system.  Special
+" consideration is taken for the use of the 'shellslash' option on Windows
+" systems.
+function! nerdtree#slash() abort
+    if nerdtree#runningWindows()
+        if exists('+shellslash') && &shellslash
+            return '/'
+        endif
+
+        return '\'
+    endif
+
+    return '/'
+endfunction
+
+"FUNCTION: nerdtree#checkForBrowse(dir) {{{2
+"inits a window tree in the current buffer if appropriate
+function! nerdtree#checkForBrowse(dir) abort
+    if !isdirectory(a:dir)
+        return
+    endif
+
+    if s:reuseWin(a:dir)
+        return
+    endif
+
+    call g:NERDTreeCreator.CreateWindowTree(a:dir)
+endfunction
+
+"FUNCTION: s:reuseWin(dir) {{{2
+"finds a NERDTree buffer with root of dir, and opens it.
+function! s:reuseWin(dir) abort
+    let path = g:NERDTreePath.New(fnamemodify(a:dir, ':p'))
+
+    for i in range(1, bufnr('$'))
+        unlet! nt
+        let nt = getbufvar(i, 'NERDTree')
+        if empty(nt)
+            continue
+        endif
+
+        if nt.isWinTree() && nt.root.path.equals(path)
+            call nt.setPreviousBuf(bufnr('#'))
+            exec 'buffer ' . i
+            return 1
+        endif
+    endfor
+
+    return 0
+endfunction
+
+" FUNCTION: nerdtree#completeBookmarks(A,L,P) {{{2
+" completion function for the bookmark commands
+function! nerdtree#completeBookmarks(A,L,P) abort
+    return filter(g:NERDTreeBookmark.BookmarkNames(), 'v:val =~# "^' . a:A . '"')
+endfunction
+
+"FUNCTION: nerdtree#compareNodes(n1, n2) {{{2
+function! nerdtree#compareNodes(n1, n2) abort
+    return nerdtree#compareNodePaths(a:n1.path, a:n2.path)
+endfunction
+
+"FUNCTION: nerdtree#compareNodePaths(p1, p2) {{{2
+function! nerdtree#compareNodePaths(p1, p2) abort
+    let sortKey1 = a:p1.getSortKey()
+    let sortKey2 = a:p2.getSortKey()
+    let i = 0
+    while i < min([len(sortKey1), len(sortKey2)])
+        " Compare chunks upto common length.
+        " If chunks have different type, the one which has
+        " integer type is the lesser.
+        if type(sortKey1[i]) == type(sortKey2[i])
+            if sortKey1[i] <# sortKey2[i]
+                return - 1
+            elseif sortKey1[i] ># sortKey2[i]
+                return 1
+            endif
+        elseif type(sortKey1[i]) == type(0)
+            return -1
+        elseif type(sortKey2[i]) == type(0)
+            return 1
+        endif
+        let i += 1
+    endwhile
+
+    " Keys are identical upto common length.
+    " The key which has smaller chunks is the lesser one.
+    if len(sortKey1) < len(sortKey2)
+        return -1
+    elseif len(sortKey1) > len(sortKey2)
+        return 1
+    else
+        return 0
+    endif
+endfunction
+
+" FUNCTION: nerdtree#deprecated(func, [msg]) {{{2
+" Issue a deprecation warning for a:func. If a second arg is given, use this
+" as the deprecation message
+function! nerdtree#deprecated(func, ...) abort
+    let msg = a:0 ? a:func . ' ' . a:1 : a:func . ' is deprecated'
+
+    if !exists('s:deprecationWarnings')
+        let s:deprecationWarnings = {}
+    endif
+    if !has_key(s:deprecationWarnings, a:func)
+        let s:deprecationWarnings[a:func] = 1
+        echomsg msg
+    endif
+endfunction
+
+" FUNCTION: nerdtree#exec(cmd, ignoreAll) {{{2
+" Same as :exec cmd but, if ignoreAll is TRUE, set eventignore=all for the duration
+function! nerdtree#exec(cmd, ignoreAll) abort
+    let old_ei = &eventignore
+    if a:ignoreAll
+        set eventignore=all
+    endif
+    try
+        exec a:cmd
+    finally
+        let &eventignore = old_ei
+    endtry
+endfunction
+
+" FUNCTION: nerdtree#has_opt(options, name) {{{2
+function! nerdtree#has_opt(options, name) abort
+    return has_key(a:options, a:name) && a:options[a:name] ==# 1
+endfunction
+
+" FUNCTION: nerdtree#loadClassFiles() {{{2
+function! nerdtree#loadClassFiles() abort
+    runtime lib/nerdtree/path.vim
+    runtime lib/nerdtree/menu_controller.vim
+    runtime lib/nerdtree/menu_item.vim
+    runtime lib/nerdtree/key_map.vim
+    runtime lib/nerdtree/bookmark.vim
+    runtime lib/nerdtree/tree_file_node.vim
+    runtime lib/nerdtree/tree_dir_node.vim
+    runtime lib/nerdtree/opener.vim
+    runtime lib/nerdtree/creator.vim
+    runtime lib/nerdtree/flag_set.vim
+    runtime lib/nerdtree/nerdtree.vim
+    runtime lib/nerdtree/ui.vim
+    runtime lib/nerdtree/event.vim
+    runtime lib/nerdtree/notifier.vim
+endfunction
+
+" FUNCTION: nerdtree#postSourceActions() {{{2
+function! nerdtree#postSourceActions() abort
+    call g:NERDTreeBookmark.CacheBookmarks(1)
+    call nerdtree#ui_glue#createDefaultBindings()
+
+    "load all nerdtree plugins
+    runtime! nerdtree_plugin/**/*.vim
+endfunction
+
+"FUNCTION: nerdtree#runningWindows(dir) {{{2
+function! nerdtree#runningWindows() abort
+    return has('win16') || has('win32') || has('win64')
+endfunction
+
+"FUNCTION: nerdtree#runningCygwin(dir) {{{2
+function! nerdtree#runningCygwin() abort
+    return has('win32unix')
+endfunction
+
+" SECTION: View Functions {{{1
+"============================================================
+
+"FUNCTION: nerdtree#echo  {{{2
+"A wrapper for :echo. Appends 'NERDTree:' on the front of all messages
+"
+"Args:
+"msg: the message to echo
+function! nerdtree#echo(msg) abort
+    redraw
+    echomsg empty(a:msg) ? '' : ('NERDTree: ' . a:msg)
+endfunction
+
+"FUNCTION: nerdtree#echoError {{{2
+"Wrapper for nerdtree#echo, sets the message type to errormsg for this message
+"Args:
+"msg: the message to echo
+function! nerdtree#echoError(msg) abort
+    echohl errormsg
+    call nerdtree#echo(a:msg)
+    echohl normal
+endfunction
+
+"FUNCTION: nerdtree#echoWarning {{{2
+"Wrapper for nerdtree#echo, sets the message type to warningmsg for this message
+"Args:
+"msg: the message to echo
+function! nerdtree#echoWarning(msg) abort
+    echohl warningmsg
+    call nerdtree#echo(a:msg)
+    echohl normal
+endfunction
+
+"FUNCTION: nerdtree#renderView {{{2
+function! nerdtree#renderView() abort
+    call b:NERDTree.render()
+endfunction
+
+" vim: set sw=4 sts=4 et fdm=marker:
diff --git a/.vim/pack/vendor/start/nerdtree/autoload/nerdtree/ui_glue.vim b/.vim/pack/vendor/start/nerdtree/autoload/nerdtree/ui_glue.vim
new file mode 100644
index 0000000..fc22f21
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/autoload/nerdtree/ui_glue.vim
@@ -0,0 +1,732 @@
+if exists('g:loaded_nerdtree_ui_glue_autoload')
+    finish
+endif
+let g:loaded_nerdtree_ui_glue_autoload = 1
+
+" FUNCTION: nerdtree#ui_glue#createDefaultBindings() {{{1
+function! nerdtree#ui_glue#createDefaultBindings() abort
+    let s = '<SNR>' . s:SID() . '_'
+
+    call NERDTreeAddKeyMap({ 'key': '<MiddleMouse>', 'scope': 'all', 'callback': s . 'handleMiddleMouse' })
+    call NERDTreeAddKeyMap({ 'key': '<LeftRelease>', 'scope': 'all', 'callback': s.'handleLeftClick' })
+    call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': 'DirNode', 'callback': s.'activateDirNode' })
+    call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': 'FileNode', 'callback': s.'activateFileNode' })
+    call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': 'Bookmark', 'callback': s.'activateBookmark' })
+    call NERDTreeAddKeyMap({ 'key': '<2-LeftMouse>', 'scope': 'all', 'callback': s.'activateAll' })
+
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCustomOpen, 'scope':'FileNode', 'callback': s.'customOpenFile'})
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCustomOpen, 'scope':'DirNode', 'callback': s.'customOpenDir'})
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCustomOpen, 'scope':'Bookmark', 'callback': s.'customOpenBookmark'})
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCustomOpen, 'scope':'all', 'callback': s.'activateAll' })
+
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': 'DirNode', 'callback': s.'activateDirNode' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': 'FileNode', 'callback': s.'activateFileNode' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': 'Bookmark', 'callback': s.'activateBookmark' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreview, 'scope': 'Bookmark', 'callback': s.'previewBookmark' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapActivateNode, 'scope': 'all', 'callback': s.'activateAll' })
+
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenSplit, 'scope': 'FileNode', 'callback': s.'openHSplit' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenSplit, 'scope': 'Bookmark', 'callback': s.'openHSplitBookmark' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenVSplit, 'scope': 'FileNode', 'callback': s.'openVSplit' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenVSplit, 'scope': 'Bookmark', 'callback': s.'openVSplitBookmark' })
+
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreview, 'scope': 'FileNode', 'callback': s.'previewNodeCurrent' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewSplit, 'scope': 'FileNode', 'callback': s.'previewNodeHSplit' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewSplit, 'scope': 'Bookmark', 'callback': s.'previewNodeHSplitBookmark' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewVSplit, 'scope': 'FileNode', 'callback': s.'previewNodeVSplit' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapPreviewVSplit, 'scope': 'Bookmark', 'callback': s.'previewNodeVSplitBookmark' })
+
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenRecursively, 'scope': 'DirNode', 'callback': s.'openNodeRecursively' })
+
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapUpdir, 'scope': 'all', 'callback': s . 'upDirCurrentRootClosed' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapUpdirKeepOpen, 'scope': 'all', 'callback': s . 'upDirCurrentRootOpen' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapChangeRoot, 'scope': 'Node', 'callback': s . 'chRoot' })
+
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapChdir, 'scope': 'Node', 'callback': s.'chCwd' })
+
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapQuit, 'scope': 'all', 'callback': s.'closeTreeWindow' })
+
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCWD, 'scope': 'all', 'callback': 'nerdtree#ui_glue#chRootCwd' })
+
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapRefreshRoot, 'scope': 'all', 'callback': s.'refreshRoot' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapRefresh, 'scope': 'Node', 'callback': s.'refreshCurrent' })
+
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapHelp, 'scope': 'all', 'callback': s.'displayHelp' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleZoom, 'scope': 'all', 'callback': s.'toggleZoom' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleHidden, 'scope': 'all', 'callback': s.'toggleShowHidden' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleFilters, 'scope': 'all', 'callback': s.'toggleIgnoreFilter' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleFiles, 'scope': 'all', 'callback': s.'toggleShowFiles' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapToggleBookmarks, 'scope': 'all', 'callback': s.'toggleShowBookmarks' })
+
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCloseDir, 'scope': 'Node', 'callback': s.'closeCurrentDir' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapCloseChildren, 'scope': 'DirNode', 'callback': s.'closeChildren' })
+
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapMenu, 'scope': 'Node', 'callback': s.'showMenu' })
+
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpParent, 'scope': 'Node', 'callback': s.'jumpToParent' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpFirstChild, 'scope': 'Node', 'callback': s.'jumpToFirstChild' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpLastChild, 'scope': 'Node', 'callback': s.'jumpToLastChild' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpRoot, 'scope': 'all', 'callback': s.'jumpToRoot' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpNextSibling, 'scope': 'Node', 'callback': s.'jumpToNextSibling' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapJumpPrevSibling, 'scope': 'Node', 'callback': s.'jumpToPrevSibling' })
+
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTab, 'scope': 'Node', 'callback': s . 'openInNewTab' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTabSilent, 'scope': 'Node', 'callback': s . 'openInNewTabSilent' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTab, 'scope': 'Bookmark', 'callback': s . 'openInNewTab' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenInTabSilent, 'scope': 'Bookmark', 'callback': s . 'openInNewTabSilent' })
+
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenExpl, 'scope': 'DirNode', 'callback': s.'openExplorer' })
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapOpenExpl, 'scope': 'FileNode', 'callback': s.'openExplorer' })
+
+    call NERDTreeAddKeyMap({ 'key': g:NERDTreeMapDeleteBookmark, 'scope': 'Bookmark', 'callback': s.'deleteBookmark' })
+endfunction
+
+
+"SECTION: Interface bindings {{{1
+"============================================================
+
+"FUNCTION: s:customOpenFile() {{{1
+" Open file node with the 'custom' key, initially <CR>.
+function! s:customOpenFile(node) abort
+    call a:node.activate(s:initCustomOpenArgs().file)
+endfunction
+
+"FUNCTION: s:customOpenDir() {{{1
+" Open directory node with the 'custom' key, initially <CR>.
+function! s:customOpenDir(node) abort
+    call s:activateDirNode(a:node, s:initCustomOpenArgs().dir)
+endfunction
+
+"FUNCTION: s:customOpenBookmark() {{{1
+" Open bookmark node with the 'custom' key, initially <CR>.
+function! s:customOpenBookmark(node) abort
+    if a:node.path.isDirectory
+        call a:node.activate(b:NERDTree, s:initCustomOpenArgs().dir)
+    else
+        call a:node.activate(b:NERDTree, s:initCustomOpenArgs().file)
+    endif
+endfunction
+
+"FUNCTION: s:initCustomOpenArgs() {{{1
+function! s:initCustomOpenArgs() abort
+    let l:defaultOpenArgs = {'file': {'reuse': 'all', 'where': 'p', 'keepopen':!nerdtree#closeTreeOnOpen()}, 'dir': {}}
+    try
+        let g:NERDTreeCustomOpenArgs = get(g:, 'NERDTreeCustomOpenArgs', {})
+        call  extend(g:NERDTreeCustomOpenArgs, l:defaultOpenArgs, 'keep')
+    catch /^Vim(\a\+):E712:/
+        call nerdtree#echoWarning('g:NERDTreeCustomOpenArgs is not set properly. Using default value.')
+        let g:NERDTreeCustomOpenArgs = l:defaultOpenArgs
+    finally
+        return g:NERDTreeCustomOpenArgs
+    endtry
+endfunction
+
+"FUNCTION: s:activateAll() {{{1
+"handle the user activating the updir line
+function! s:activateAll() abort
+    if getline('.') ==# g:NERDTreeUI.UpDirLine()
+        return nerdtree#ui_glue#upDir(0)
+    endif
+endfunction
+
+" FUNCTION: s:activateDirNode(directoryNode, options) {{{1
+" Open a directory with optional options
+function! s:activateDirNode(directoryNode, ...) abort
+
+    if a:directoryNode.isRoot() && a:directoryNode.isOpen
+        call nerdtree#echo('cannot close tree root')
+        return
+    endif
+
+    call a:directoryNode.activate((a:0 > 0) ? a:1 : {})
+endfunction
+
+"FUNCTION: s:activateFileNode() {{{1
+"handle the user activating a tree node
+function! s:activateFileNode(node) abort
+    call a:node.activate({'reuse': 'all', 'where': 'p', 'keepopen': !nerdtree#closeTreeOnOpen()})
+endfunction
+
+"FUNCTION: s:activateBookmark(bookmark) {{{1
+"handle the user activating a bookmark
+function! s:activateBookmark(bm) abort
+    call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'p', 'keepopen': !nerdtree#closeTreeOnOpen()} : {})
+endfunction
+
+" FUNCTION: nerdtree#ui_glue#bookmarkNode(name) {{{1
+" Associate the current node with the given name
+function! nerdtree#ui_glue#bookmarkNode(...) abort
+    let currentNode = g:NERDTreeFileNode.GetSelected()
+    if currentNode !=# {}
+        let name = a:1
+        if empty(name)
+            let name = currentNode.path.getLastPathComponent(0)
+        endif
+        try
+            call currentNode.bookmark(name)
+            call b:NERDTree.render()
+        catch /^NERDTree.IllegalBookmarkNameError/
+            call nerdtree#echo('bookmark names must not contain spaces')
+        endtry
+    else
+        call nerdtree#echo('select a node first')
+    endif
+endfunction
+
+" FUNCTION: s:chCwd(node) {{{1
+function! s:chCwd(node) abort
+    try
+        call a:node.path.changeToDir()
+    catch /^NERDTree.PathChangeError/
+        call nerdtree#echoWarning('could not change cwd')
+    endtry
+endfunction
+
+" FUNCTION: s:chRoot(node) {{{1
+" changes the current root to the selected one
+function! s:chRoot(node) abort
+    call b:NERDTree.changeRoot(a:node)
+endfunction
+
+" FUNCTION: s:nerdtree#ui_glue#chRootCwd() {{{1
+" Change the NERDTree root to match the current working directory.
+function! nerdtree#ui_glue#chRootCwd() abort
+    NERDTreeCWD
+endfunction
+
+" FUNCTION: nnerdtree#ui_glue#clearBookmarks(bookmarks) {{{1
+function! nerdtree#ui_glue#clearBookmarks(bookmarks) abort
+    if a:bookmarks ==# ''
+        let currentNode = g:NERDTreeFileNode.GetSelected()
+        if currentNode !=# {}
+            call currentNode.clearBookmarks()
+        endif
+    else
+        for name in split(a:bookmarks, ' ')
+            let bookmark = g:NERDTreeBookmark.BookmarkFor(name)
+            call bookmark.delete()
+        endfor
+    endif
+    call b:NERDTree.root.refresh()
+    call b:NERDTree.render()
+endfunction
+
+" FUNCTION: s:closeChildren(node) {{{1
+" closes all childnodes of the current node
+function! s:closeChildren(node) abort
+    call a:node.closeChildren()
+    call b:NERDTree.render()
+    call a:node.putCursorHere(0, 0)
+endfunction
+
+" FUNCTION: s:closeCurrentDir(node) {{{1
+" Close the parent directory of the current node.
+function! s:closeCurrentDir(node) abort
+
+    if a:node.isRoot()
+        call nerdtree#echo('cannot close parent of tree root')
+        return
+    endif
+
+    let l:parent = a:node.parent
+
+    while l:parent.isCascadable()
+        let l:parent = l:parent.parent
+    endwhile
+
+    if l:parent.isRoot()
+        call nerdtree#echo('cannot close tree root')
+        return
+    endif
+
+    call l:parent.close()
+    call b:NERDTree.render()
+    call l:parent.putCursorHere(0, 0)
+endfunction
+
+" FUNCTION: s:closeTreeWindow() {{{1
+" close the tree window
+function! s:closeTreeWindow() abort
+    if b:NERDTree.isWinTree() && b:NERDTree.previousBuf() !=# -1
+        exec 'buffer ' . b:NERDTree.previousBuf()
+    else
+        if winnr('$') > 1
+            call g:NERDTree.Close()
+        else
+            call nerdtree#echo('Cannot close last window')
+        endif
+    endif
+endfunction
+
+" FUNCTION: s:deleteBookmark(bookmark) {{{1
+" Prompt the user to confirm the deletion of the selected bookmark.
+function! s:deleteBookmark(bookmark) abort
+    let l:message = 'Delete the bookmark "' . a:bookmark.name
+                \ . '" from the bookmark list?'
+
+    let l:choices = "&Yes\n&No"
+
+    echo | redraw
+    let l:selection = confirm(l:message, l:choices, 1, 'Warning')
+
+    if l:selection !=# 1
+        call nerdtree#echo('bookmark not deleted')
+        return
+    endif
+
+    try
+        call a:bookmark.delete()
+        silent call b:NERDTree.root.refresh()
+        call b:NERDTree.render()
+        echo | redraw
+    catch /^NERDTree/
+        call nerdtree#echoWarning('could not remove bookmark')
+    endtry
+endfunction
+
+" FUNCTION: s:displayHelp() {{{1
+" toggles the help display
+function! s:displayHelp() abort
+    call b:NERDTree.ui.toggleHelp()
+    call b:NERDTree.render()
+    call b:NERDTree.ui.centerView()
+endfunction
+
+" FUNCTION: s:findAndRevealPath(pathStr) {{{1
+function! s:findAndRevealPath(pathStr) abort
+    let l:pathStr = !empty(a:pathStr) ? a:pathStr : expand('%:p')
+    let l:revealOpts = {}
+
+    if empty(l:pathStr)
+        call nerdtree#echoWarning('no file for the current buffer')
+        return
+    endif
+
+    if !filereadable(l:pathStr)
+        let l:pathStr = fnamemodify(l:pathStr, ':h')
+        let l:revealOpts['open'] = 1
+    endif
+
+    try
+        let l:pathStr = g:NERDTreePath.Resolve(l:pathStr)
+        let l:pathObj = g:NERDTreePath.New(l:pathStr)
+    catch /^NERDTree.InvalidArgumentsError/
+        call nerdtree#echoWarning('invalid path')
+        return
+    endtry
+
+    if !g:NERDTree.ExistsForTab()
+        try
+            let l:cwd = g:NERDTreePath.New(getcwd())
+        catch /^NERDTree.InvalidArgumentsError/
+            call nerdtree#echo('current directory does not exist.')
+            let l:cwd = l:pathObj.getParent()
+        endtry
+
+        if l:pathObj.isUnder(l:cwd)
+            call g:NERDTreeCreator.CreateTabTree(l:cwd.str())
+        else
+            call g:NERDTreeCreator.CreateTabTree(l:pathObj.getParent().str())
+        endif
+    else
+        NERDTreeFocus
+
+        if !l:pathObj.isUnder(b:NERDTree.root.path)
+            call s:chRoot(g:NERDTreeDirNode.New(l:pathObj.getParent(), b:NERDTree))
+        endif
+    endif
+
+    if l:pathObj.isHiddenUnder(b:NERDTree.root.path)
+        call b:NERDTree.ui.setShowHidden(1)
+    endif
+
+    let l:node = b:NERDTree.root.reveal(l:pathObj, l:revealOpts)
+    call b:NERDTree.render()
+    call l:node.putCursorHere(1, 0)
+endfunction
+
+"FUNCTION: s:handleLeftClick() {{{1
+"Checks if the click should open the current node
+function! s:handleLeftClick() abort
+    let currentNode = g:NERDTreeFileNode.GetSelected()
+    if currentNode !=# {}
+
+        "the dir arrows are multibyte chars, and vim's string functions only
+        "deal with single bytes - so split the line up with the hack below and
+        "take the line substring manually
+        let line = split(getline(line('.')), '\zs')
+        let startToCur = ''
+        for i in range(0,len(line)-1)
+            let startToCur .= line[i]
+        endfor
+
+        if currentNode.path.isDirectory
+            if startToCur =~# g:NERDTreeUI.MarkupReg() && startToCur =~# '[+~'.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsible.'] \?$'
+                call currentNode.activate()
+                return
+            endif
+        endif
+
+        if (g:NERDTreeMouseMode ==# 2 && currentNode.path.isDirectory) || g:NERDTreeMouseMode ==# 3
+            let char = strpart(startToCur, strlen(startToCur)-1, 1)
+            if char !~# g:NERDTreeUI.MarkupReg()
+                if currentNode.path.isDirectory
+                    call currentNode.activate()
+                else
+                    call currentNode.activate({'reuse': 'all', 'where': 'p', 'keepopen':!nerdtree#closeTreeOnOpen()})
+                endif
+                return
+            endif
+        endif
+    endif
+endfunction
+
+" FUNCTION: s:handleMiddleMouse() {{{1
+function! s:handleMiddleMouse() abort
+
+    " A middle mouse click does not automatically position the cursor as one
+    " would expect. Forcing the execution of a regular left mouse click here
+    " fixes this problem.
+    execute "normal! \<LeftMouse>"
+
+    let l:currentNode = g:NERDTreeFileNode.GetSelected()
+    if empty(l:currentNode)
+        call nerdtree#echoError('use the pointer to select a node')
+        return
+    endif
+
+    if l:currentNode.path.isDirectory
+        call l:currentNode.openExplorer()
+    else
+        call l:currentNode.open({'where': 'h'})
+    endif
+endfunction
+
+" FUNCTION: nerdtree#ui_glue#invokeKeyMap(key) {{{1
+"this is needed since I cant figure out how to invoke dict functions from a
+"key map
+function! nerdtree#ui_glue#invokeKeyMap(key) abort
+    call g:NERDTreeKeyMap.Invoke(a:key)
+endfunction
+
+" FUNCTION: s:jumpToFirstChild(node) {{{1
+function! s:jumpToFirstChild(node) abort
+    call s:jumpToChild(a:node, 0)
+endfunction
+
+" FUNCTION: s:jumpToLastChild(node) {{{1
+function! s:jumpToLastChild(node) abort
+    call s:jumpToChild(a:node, 1)
+endfunction
+
+" FUNCTION: s:jumpToChild(node, last) {{{1
+" Jump to the first or last child node at the same file system level.
+"
+" Args:
+" node: the node on which the cursor currently sits
+" last: 1 (true) if jumping to last child, 0 (false) if jumping to first
+function! s:jumpToChild(node, last) abort
+    let l:node = a:node.path.isDirectory ? a:node.getCascadeRoot() : a:node
+
+    if l:node.isRoot()
+        return
+    endif
+
+    let l:parent = l:node.parent
+    let l:children = l:parent.getVisibleChildren()
+
+    let l:target = a:last ? l:children[len(l:children) - 1] : l:children[0]
+
+    call l:target.putCursorHere(1, 0)
+    call b:NERDTree.ui.centerView()
+endfunction
+
+" FUNCTION: s:jumpToParent(node) {{{1
+" Move the cursor to the parent of the specified node.  For a cascade, move to
+" the parent of the cascade's first node.  At the root node, do nothing.
+function! s:jumpToParent(node) abort
+    let l:node = a:node.path.isDirectory ? a:node.getCascadeRoot() : a:node
+
+    if l:node.isRoot()
+        return
+    endif
+
+    if empty(l:node.parent)
+        call nerdtree#echo('could not jump to parent node')
+        return
+    endif
+
+    call l:node.parent.putCursorHere(1, 0)
+    call b:NERDTree.ui.centerView()
+endfunction
+
+" FUNCTION: s:jumpToRoot() {{{1
+" moves the cursor to the root node
+function! s:jumpToRoot() abort
+    call b:NERDTree.root.putCursorHere(1, 0)
+    call b:NERDTree.ui.centerView()
+endfunction
+
+" FUNCTION: s:jumpToNextSibling(node) {{{1
+function! s:jumpToNextSibling(node) abort
+    call s:jumpToSibling(a:node, 1)
+endfunction
+
+" FUNCTION: s:jumpToPrevSibling(node) {{{1
+function! s:jumpToPrevSibling(node) abort
+    call s:jumpToSibling(a:node, 0)
+endfunction
+
+" FUNCTION: s:jumpToSibling(node, forward) {{{1
+" Move the cursor to the next or previous node at the same file system level.
+"
+" Args:
+" node: the node on which the cursor currently sits
+" forward: 0 to jump to previous sibling, 1 to jump to next sibling
+function! s:jumpToSibling(node, forward) abort
+    let l:node = a:node.path.isDirectory ? a:node.getCascadeRoot() : a:node
+    let l:sibling = l:node.findSibling(a:forward)
+
+    if empty(l:sibling)
+        return
+    endif
+
+    call l:sibling.putCursorHere(1, 0)
+    call b:NERDTree.ui.centerView()
+endfunction
+
+" FUNCTION: nerdtree#ui_glue#openBookmark(name) {{{1
+" Open the Bookmark that has the specified name. This function provides the
+" implementation for the :OpenBookmark command.
+function! nerdtree#ui_glue#openBookmark(name) abort
+    try
+        let l:bookmark = g:NERDTreeBookmark.BookmarkFor(a:name)
+    catch /^NERDTree.BookmarkNotFoundError/
+        call nerdtree#echoError('bookmark "' . a:name . '" not found')
+        return
+    endtry
+    if l:bookmark.path.isDirectory
+        call l:bookmark.open(b:NERDTree)
+        return
+    endif
+
+    call l:bookmark.open(b:NERDTree, s:initCustomOpenArgs().file)
+endfunction
+
+" FUNCTION: s:openHSplit(target) {{{1
+function! s:openHSplit(target) abort
+    call a:target.activate({'where': 'h', 'keepopen': !nerdtree#closeTreeOnOpen()})
+endfunction
+
+" FUNCTION: s:openVSplit(target) {{{1
+function! s:openVSplit(target) abort
+    call a:target.activate({'where': 'v', 'keepopen': !nerdtree#closeTreeOnOpen()})
+endfunction
+
+"FUNCTION: s:openHSplitBookmark(bookmark) {{{1
+"handle the user activating a bookmark
+function! s:openHSplitBookmark(bm) abort
+    call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'h', 'keepopen': !nerdtree#closeTreeOnOpen()} : {})
+endfunction
+
+"FUNCTION: s:openVSplitBookmark(bookmark) {{{1
+"handle the user activating a bookmark
+function! s:openVSplitBookmark(bm) abort
+    call a:bm.activate(b:NERDTree, !a:bm.path.isDirectory ? {'where': 'v', 'keepopen': !nerdtree#closeTreeOnOpen()} : {})
+endfunction
+
+" FUNCTION: s:previewHSplitBookmark(bookmark) {{{1
+function! s:previewNodeHSplitBookmark(bookmark) abort
+    call a:bookmark.activate(b:NERDTree, !a:bookmark.path.isDirectory ? {'stay': 1, 'where': 'h', 'keepopen': 1} : {})
+endfunction
+
+" FUNCTION: s:previewVSplitBookmark(bookmark) {{{1
+function! s:previewNodeVSplitBookmark(bookmark) abort
+    call a:bookmark.activate(b:NERDTree, !a:bookmark.path.isDirectory ? {'stay': 1, 'where': 'v', 'keepopen': 1} : {})
+endfunction
+
+" FUNCTION: s:openExplorer(node) {{{1
+function! s:openExplorer(node) abort
+    call a:node.openExplorer()
+endfunction
+
+" FUNCTION: s:openInNewTab(target) {{{1
+function! s:openInNewTab(target) abort
+    let l:opener = g:NERDTreeOpener.New(a:target.path, {'where': 't', 'keepopen': !nerdtree#closeTreeOnOpen()})
+    call l:opener.open(a:target)
+endfunction
+
+" FUNCTION: s:openInNewTabSilent(target) {{{1
+function! s:openInNewTabSilent(target) abort
+    let l:opener = g:NERDTreeOpener.New(a:target.path, {'where': 't', 'keepopen': !nerdtree#closeTreeOnOpen(), 'stay': 1})
+    call l:opener.open(a:target)
+endfunction
+
+" FUNCTION: s:openNodeRecursively(node) {{{1
+function! s:openNodeRecursively(node) abort
+    call nerdtree#echo('Recursively opening node. Please wait...')
+    call a:node.openRecursively()
+    call b:NERDTree.render()
+    call nerdtree#echo('')
+endfunction
+
+" FUNCTION: s:previewBookmark(bookmark) {{{1
+function! s:previewBookmark(bookmark) abort
+    if a:bookmark.path.isDirectory
+        execute 'NERDTreeFind '.a:bookmark.path.str()
+    else
+        call a:bookmark.activate(b:NERDTree, {'stay': 1, 'where': 'p', 'keepopen': 1})
+    endif
+endfunction
+
+"FUNCTION: s:previewNodeCurrent(node) {{{1
+function! s:previewNodeCurrent(node) abort
+    call a:node.open({'stay': 1, 'where': 'p', 'keepopen': 1})
+endfunction
+
+"FUNCTION: s:previewNodeHSplit(node) {{{1
+function! s:previewNodeHSplit(node) abort
+    call a:node.open({'stay': 1, 'where': 'h', 'keepopen': 1})
+endfunction
+
+"FUNCTION: s:previewNodeVSplit(node) {{{1
+function! s:previewNodeVSplit(node) abort
+    call a:node.open({'stay': 1, 'where': 'v', 'keepopen': 1})
+endfunction
+
+" FUNCTION: nerdtree#ui_glue#revealBookmark(name) {{{1
+" put the cursor on the node associate with the given name
+function! nerdtree#ui_glue#revealBookmark(name) abort
+    try
+        let targetNode = g:NERDTreeBookmark.GetNodeForName(a:name, 0, b:NERDTree)
+        call targetNode.putCursorHere(0, 1)
+    catch /^NERDTree.BookmarkNotFoundError/
+        call nerdtree#echo('Bookmark isn''t cached under the current root')
+    endtry
+endfunction
+
+" FUNCTION: s:refreshRoot() {{{1
+" Reloads the current root. All nodes below this will be lost and the root dir
+" will be reloaded.
+function! s:refreshRoot() abort
+    if !g:NERDTree.IsOpen()
+        return
+    endif
+    call nerdtree#echo('Refreshing the root node. This could take a while...')
+
+    let l:curWin = winnr()
+    call nerdtree#exec(g:NERDTree.GetWinNum() . 'wincmd w', 1)
+    call b:NERDTree.root.refresh()
+    call b:NERDTree.render()
+    redraw
+    call nerdtree#exec(l:curWin . 'wincmd w', 1)
+    call nerdtree#echo('')
+endfunction
+
+" FUNCTION: s:refreshCurrent(node) {{{1
+" refreshes the root for the current node
+function! s:refreshCurrent(node) abort
+    let node = a:node
+    if !node.path.isDirectory
+        let node = node.parent
+    endif
+
+    call nerdtree#echo('Refreshing node. This could take a while...')
+    call node.refresh()
+    call b:NERDTree.render()
+    call nerdtree#echo('')
+endfunction
+
+" FUNCTION: nerdtree#ui_glue#setupCommands() {{{1
+function! nerdtree#ui_glue#setupCommands() abort
+    command! -n=? -complete=dir -bar NERDTree :call g:NERDTreeCreator.CreateTabTree('<args>')
+    command! -n=? -complete=dir -bar NERDTreeToggle :call g:NERDTreeCreator.ToggleTabTree('<args>')
+    command! -n=0 -bar NERDTreeClose :call g:NERDTree.Close()
+    command! -n=1 -complete=customlist,nerdtree#completeBookmarks -bar NERDTreeFromBookmark call g:NERDTreeCreator.CreateTabTree('<args>')
+    command! -n=0 -bar NERDTreeMirror call g:NERDTreeCreator.CreateMirror()
+    command! -n=? -complete=file -bar NERDTreeFind call s:findAndRevealPath('<args>')
+    command! -n=0 -bar NERDTreeRefreshRoot call s:refreshRoot()
+    command! -n=0 -bar NERDTreeFocus call NERDTreeFocus()
+    command! -n=0 -bar NERDTreeCWD call NERDTreeCWD()
+endfunction
+
+" Function: s:SID()   {{{1
+function! s:SID() abort
+    if !exists('s:sid')
+        let s:sid = matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze_SID$')
+    endif
+    return s:sid
+endfun
+
+" FUNCTION: s:showMenu(node) {{{1
+function! s:showMenu(node) abort
+    let mc = g:NERDTreeMenuController.New(g:NERDTreeMenuItem.AllEnabled())
+    call mc.showMenu()
+endfunction
+
+" FUNCTION: s:toggleIgnoreFilter() {{{1
+function! s:toggleIgnoreFilter() abort
+    call b:NERDTree.ui.toggleIgnoreFilter()
+endfunction
+
+" FUNCTION: s:toggleShowBookmarks() {{{1
+function! s:toggleShowBookmarks() abort
+    call b:NERDTree.ui.toggleShowBookmarks()
+endfunction
+
+" FUNCTION: s:toggleShowFiles() {{{1
+function! s:toggleShowFiles() abort
+    call b:NERDTree.ui.toggleShowFiles()
+endfunction
+
+" FUNCTION: s:toggleShowHidden() {{{1
+" toggles the display of hidden files
+function! s:toggleShowHidden() abort
+    call b:NERDTree.ui.toggleShowHidden()
+endfunction
+
+" FUNCTION: s:toggleZoom() {{{1
+function! s:toggleZoom() abort
+    call b:NERDTree.ui.toggleZoom()
+endfunction
+
+" FUNCTION: nerdtree#ui_glue#upDir(preserveState) {{{1
+" Move the NERDTree up one level.
+"
+" Args:
+" preserveState: if 1, the current root is left open when the new tree is
+" rendered; if 0, the current root node is closed
+function! nerdtree#ui_glue#upDir(preserveState) abort
+
+    try
+        call b:NERDTree.root.cacheParent()
+    catch /^NERDTree.CannotCacheParentError/
+        call nerdtree#echo('already at root directory')
+        return
+    endtry
+
+    let l:oldRoot = b:NERDTree.root
+    let l:newRoot = b:NERDTree.root.parent
+
+    call l:newRoot.open()
+    call l:newRoot.transplantChild(l:oldRoot)
+
+    if !a:preserveState
+        call l:oldRoot.close()
+    endif
+
+    call b:NERDTree.changeRoot(l:newRoot)
+    call l:oldRoot.putCursorHere(0, 0)
+endfunction
+
+" FUNCTION: s:upDirCurrentRootOpen() {{{1
+function! s:upDirCurrentRootOpen() abort
+    call nerdtree#ui_glue#upDir(1)
+endfunction
+
+" FUNCTION: s:upDirCurrentRootClosed() {{{1
+function! s:upDirCurrentRootClosed() abort
+    call nerdtree#ui_glue#upDir(0)
+endfunction
+
+" vim: set sw=4 sts=4 et fdm=marker:
diff --git a/.vim/pack/vendor/start/nerdtree/doc/NERDTree.txt b/.vim/pack/vendor/start/nerdtree/doc/NERDTree.txt
new file mode 100644
index 0000000..55c25cd
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/doc/NERDTree.txt
@@ -0,0 +1,1534 @@
+*NERDTree.txt*   A tree explorer plugin to rule the Vim world. Bwahahaha!!
+
+                                    # #### ####                                ~
+                                  ### \/#|### |/####                           ~
+   d8   888                      ##\/#/ \||/##/_/##/_#                         ~
+  d88   888 ee   ,e e,         ###  \/###|/ \/ # ###                           ~
+ d88888 888 88b d88 88b      ##_\_#\_\## | #/###_/_####                        ~
+  888   888 888 888   ,     ## #### # \ #| /  #### ##/##                       ~
+  888   888 888  "YeeP"     __#_--###`. |{,###---###-~                         ~
+                                     \ % @%                                    ~
+  Y88b Y88 888'Y88 888 88e  888 88e   \%@%  88P'888'Y88                        ~
+   Y88b Y8 888 ,'Y 888 888D 888 888b   %o%  P'  888  'Y 888,8,  ,e e,   ,e e,  ~
+  b Y88b Y 888C8   888 88"  888 8888D  %@%      888     888 "  d88 88b d88 88b ~
+  8b Y88b  888 ",d 888 b,   888 888P   %@%      888     888    888   , 888   , ~
+  88b Y88b 888,d88 888 88b, 888 88"    %@%      888     888     "YeeP"  "YeeP" ~
+                                 , -=-%{@%-^- _                                ~
+                                   ejm `}               Reference Manual       ~
+                                        {                                      ~
+==============================================================================
+CONTENTS                                                     *NERDTree-contents*
+
+    1.Intro...................................|NERDTree|
+    2.Functionality provided..................|NERDTreeFunctionality|
+        2.1.Global commands...................|NERDTreeGlobalCommands|
+        2.2.Bookmarks.........................|NERDTreeBookmarks|
+            2.2.1.The bookmark table..........|NERDTreeBookmarkTable|
+            2.2.2.Bookmark commands...........|NERDTreeBookmarkCommands|
+            2.2.3.Invalid bookmarks...........|NERDTreeInvalidBookmarks|
+        2.3.NERDTree mappings.................|NERDTreeMappings|
+        2.4.The NERDTree menu.................|NERDTreeMenu|
+    3.Settings................................|NERDTreeSettings|
+        3.1.Settings summary..................|NERDTreeSettingsSummary|
+        3.2.Settings details..................|NERDTreeSettingsDetails|
+    4.The NERDTree API........................|NERDTreeAPI|
+        4.1.Key map API.......................|NERDTreeKeymapAPI|
+        4.2.Menu API..........................|NERDTreeMenuAPI|
+        4.3.Menu API..........................|NERDTreeAddPathFilter()|
+        4.4.Path Listener API.................|NERDTreePathListenerAPI|
+    5.About...................................|NERDTreeAbout|
+    6.License.................................|NERDTreeLicense|
+
+==============================================================================
+1. Intro                                                              *NERDTree*
+
+What is this "NERDTree"??
+
+The NERDTree allows you to explore your filesystem and to open files and
+directories. It presents the filesystem to you in the form of a tree which you
+manipulate with the keyboard and/or mouse. It also allows you to perform
+simple filesystem operations.
+
+The following features and functionality are provided by the NERDTree:
+    * Files and directories are displayed in a hierarchical tree structure
+    * Different highlighting is provided for the following types of nodes:
+        * files
+        * directories
+        * sym-links
+        * windows .lnk files
+        * read-only files
+        * executable files
+    * Many (customisable) mappings are provided to manipulate the tree:
+        * Mappings to open/close/explore directory nodes
+        * Mappings to open files in new/existing windows/tabs
+        * Mappings to change the current root of the tree
+        * Mappings to navigate around the tree
+        * ...
+    * Directories and files can be bookmarked.
+    * Most NERDTree navigation can also be done with the mouse
+    * Filtering of tree content (can be toggled at runtime)
+        * custom file filters to prevent e.g. vim backup files being displayed
+        * optional displaying of hidden files (. files)
+        * files can be "turned off" so that only directories are displayed
+    * The position and size of the NERDTree window can be customised
+    * The order in which the nodes in the tree are listed can be customised.
+    * A model of your filesystem is created/maintained as you explore it. This
+      has several advantages:
+        * All filesystem information is cached and is only re-read on demand
+        * If you revisit a part of the tree that you left earlier in your
+          session, the directory nodes will be opened/closed as you left them
+    * The script remembers the cursor position and window position in the NERD
+      tree so you can toggle it off (or just close the tree window) and then
+      reopen it (with NERDTreeToggle) the NERDTree window will appear exactly
+      as you left it
+    * You can have a separate NERDTree for each tab, share trees across tabs,
+      or a mix of both.
+    * By default the script overrides the default file browser (netrw), so if
+      you :edit a directory a (slightly modified) NERDTree will appear in the
+      current window
+    * A programmable menu system is provided (simulates right clicking on a
+      node)
+        * one default menu plugin is provided to perform basic filesystem
+          operations (create/delete/move/copy files/directories)
+    * There's an API for adding your own keymappings
+
+
+==============================================================================
+2. Functionality provided                                *NERDTreeFunctionality*
+
+------------------------------------------------------------------------------
+2.1. Global Commands                                    *NERDTreeGlobalCommands*
+
+:NERDTree [<start-directory> | <bookmark>]                           *:NERDTree*
+    Opens a fresh NERDTree. The root of the tree depends on the argument
+    given. There are 3 cases: If no argument is given, the current directory
+    will be used.  If a directory is given, that will be used. If a bookmark
+    name is given, the corresponding directory will be used.  For example: >
+        :NERDTree /home/marty/vim7/src
+        :NERDTree foo   (foo is the name of a bookmark)
+<
+:NERDTreeVCS [<start-directory> | <bookmark>]                     *:NERDTreeVCS*
+    Like |:NERDTree|, but searches up the directory tree to find the top of
+    the version control system repository, and roots the NERDTree there. It
+    works with Git, Subversion, Mercurial, Bazaar, and Darcs repositories. A
+    couple of examples: >
+        :NERDTreeVCS /home/marty/nerdtree/doc  (opens /home/marty/nerdtree)
+        :NERDTreeVCS              (opens root of repository containing CWD)
+<
+:NERDTreeFromBookmark <bookmark>                         *:NERDTreeFromBookmark*
+    Opens a fresh NERDTree with the root initialized to the directory for
+    <bookmark>.  The only reason to use this command over :NERDTree is for
+    the completion (which is for bookmarks rather than directories).
+
+:NERDTreeToggle [<start-directory> | <bookmark>]               *:NERDTreeToggle*
+    If a NERDTree already exists for this tab, it is reopened and rendered
+    again. If <start-directory> or <bookmark> is given, the root of NERDTree
+    is set to that path. If no NERDTree exists for this tab then this command
+    acts the same as the |:NERDTree| command.
+
+:NERDTreeToggleVCS [<start-directory> | <bookmark>]         *:NERDTreeToggleVCS*
+    Like |:NERDTreeToggle|, but searches up the directory tree to find the top of
+    the version control system repository, and roots the NERDTree there. It
+    works with Git, Subversion, Mercurial, Bazaar, and Darcs repositories. A
+    couple of examples: >
+        :NERDTreeToggleVCS /home/marty/nerdtree/doc  (opens /home/marty/nerdtree)
+        :NERDTreeToggleVCS              (opens root of repository containing CWD)
+
+:NERDTreeFocus                                                  *:NERDTreeFocus*
+    Opens (or reopens) the NERDTree if it is not currently visible;
+    otherwise, the cursor is moved to the already-open NERDTree.
+
+:NERDTreeMirror                                                *:NERDTreeMirror*
+    Shares an existing NERDTree, from another tab, in the current tab.
+    Changes made to one tree are reflected in both as they are actually the
+    same buffer.
+
+    If only one other NERDTree exists, that tree is automatically mirrored.
+    If more than one exists, the script will ask which tree to mirror.
+
+:NERDTreeClose                                                  *:NERDTreeClose*
+    Close the NERDTree in this tab.
+
+:NERDTreeFind [<path>]                                           *:NERDTreeFind*
+    Without the optional argument, find and reveal the file for the active
+    buffer in the NERDTree window.  With the <path> argument, find and
+    reveal the specified path.
+
+    Focus will be shifted to the NERDTree window, and the cursor will be
+    placed on the tree node for the determined path.  If a NERDTree for the
+    current tab does not exist, a new one will be initialized.
+
+:NERDTreeCWD                                                      *:NERDTreeCWD*
+    Change the NERDTree root to the current working directory.  If no
+    NERDTree exists for this tab, a new one is opened.
+
+:NERDTreeRefreshRoot                                      *:NERDTreeRefreshRoot*
+    Refreshes the NERDTree root node.
+
+------------------------------------------------------------------------------
+2.2. Bookmarks                                               *NERDTreeBookmarks*
+
+Bookmarks in the NERDTree are a way to tag files or directories of interest.
+For example, you could use bookmarks to tag all of your project directories.
+
+------------------------------------------------------------------------------
+2.2.1. The Bookmark Table                                *NERDTreeBookmarkTable*
+
+If the bookmark table is active (see |NERDTree-B| and
+|NERDTreeShowBookmarks|), it will be rendered above the tree. You can double
+click bookmarks or use the |NERDTree-o| mapping to activate them. See also,
+|NERDTree-t| and |NERDTree-T|
+
+------------------------------------------------------------------------------
+2.2.2. Bookmark commands                              *NERDTreeBookmarkCommands*
+
+Note: The following commands are only available within the NERDTree buffer.
+
+:Bookmark [<name>]
+    Bookmark the current node as <name>. If there is already a <name>
+    bookmark, it is overwritten. <name> must not contain spaces.
+    If <name> is not provided, it defaults to the file or directory name.
+    For directories, a trailing slash is present.
+
+:BookmarkToRoot <bookmark>
+    Make the directory corresponding to <bookmark> the new root. If a treenode
+    corresponding to <bookmark> is already cached somewhere in the tree then
+    the current tree will be used, otherwise a fresh tree will be opened.
+    Note that if <bookmark> points to a file then its parent will be used
+    instead.
+
+:RevealBookmark <bookmark>
+    If the node is cached under the current root then it will be revealed
+    (i.e. directory nodes above it will be opened) and the cursor will be
+    placed on it.
+
+:OpenBookmark <name>
+    The Bookmark named <name> is opened as if |NERDTree-o| was applied to
+    its entry in the Bookmark table. If the Bookmark points to a directory,
+    it is made the new root of the current NERDTree. If the Bookmark points
+    to a file, that file is opened for editing in another window.
+
+:ClearBookmarks [<bookmarks>]
+    Remove all the given bookmarks. If no bookmarks are given then remove all
+    bookmarks on the current node.
+
+:ClearAllBookmarks
+    Remove all bookmarks.
+
+:EditBookmarks
+    Opens the bookmarks file for manual editing, e.g. for removing invalid
+    bookmarks.
+
+:ReadBookmarks
+    Re-read the bookmarks in the |NERDTreeBookmarksFile|.
+
+See also |:NERDTree| and |:NERDTreeFromBookmark|.
+
+------------------------------------------------------------------------------
+2.2.3. Invalid Bookmarks                              *NERDTreeInvalidBookmarks*
+
+If invalid bookmarks are detected, the script will issue an error message and
+the invalid bookmarks will become unavailable for use.
+
+These bookmarks will still be stored in the bookmarks file (see
+|NERDTreeBookmarksFile|), down at the bottom. There will always be a blank line
+after the valid bookmarks but before the invalid ones.
+
+Each line in the bookmarks file represents one bookmark. The proper format is:
+<bookmark name><space><full path to the bookmark location>
+
+You can use the :EditBookmarks command to open the bookmarks file for editing.
+After you have corrected any invalid bookmarks, either restart vim, or run
+:ReadBookmarks from the NERDTree window.
+
+------------------------------------------------------------------------------
+2.3. NERDTree Mappings                                        *NERDTreeMappings*
+
+Default~
+Key      Description                                                  help-tag~
+
+o........Open files, directories and bookmarks......................|NERDTree-o|
+go.......Open selected file, but leave cursor in the NERDTree......|NERDTree-go|
+         Find selected bookmark directory in current NERDTree
+t........Open selected node/bookmark in a new tab...................|NERDTree-t|
+T........Same as 't' but keep the focus on the current tab..........|NERDTree-T|
+i........Open selected file in a split window.......................|NERDTree-i|
+gi.......Same as i, but leave the cursor on the NERDTree...........|NERDTree-gi|
+s........Open selected file in a new vsplit.........................|NERDTree-s|
+gs.......Same as s, but leave the cursor on the NERDTree...........|NERDTree-gs|
+<CR>.....User-definable custom open action.......................|NERDTree-<CR>|
+O........Recursively open the selected directory....................|NERDTree-O|
+x........Close the current nodes parent.............................|NERDTree-x|
+X........Recursively close all children of the current node.........|NERDTree-X|
+e........Edit the current directory.................................|NERDTree-e|
+
+double-click....same as |NERDTree-o|.
+middle-click....same as |NERDTree-i| for files, and |NERDTree-e| for directories.
+
+D........Delete the current bookmark ...............................|NERDTree-D|
+
+P........Jump to the root node......................................|NERDTree-P|
+p........Jump to current nodes parent...............................|NERDTree-p|
+K........Jump up inside directories at the current tree depth.......|NERDTree-K|
+J........Jump down inside directories at the current tree depth.....|NERDTree-J|
+<C-J>....Jump down to next sibling of the current directory.......|NERDTree-C-J|
+<C-K>....Jump up to previous sibling of the current directory.....|NERDTree-C-K|
+
+C........Change the tree root to the selected directory.............|NERDTree-C|
+u........Move the tree root up one directory........................|NERDTree-u|
+U........Same as 'u' except the old root node is left open..........|NERDTree-U|
+r........Recursively refresh the current directory..................|NERDTree-r|
+R........Recursively refresh the current root.......................|NERDTree-R|
+m........Display the NERDTree menu..................................|NERDTree-m|
+cd.......Change the CWD to the directory of the selected node......|NERDTree-cd|
+CD.......Change tree root to the CWD...............................|NERDTree-CD|
+
+I........Toggle whether hidden files displayed......................|NERDTree-I|
+f........Toggle whether the file filters are used...................|NERDTree-f|
+F........Toggle whether files are displayed.........................|NERDTree-F|
+B........Toggle whether the bookmark table is displayed.............|NERDTree-B|
+
+q........Close the NERDTree window..................................|NERDTree-q|
+A........Zoom (maximize/minimize) the NERDTree window...............|NERDTree-A|
+?........Toggle the display of the quick help.......................|NERDTree-?|
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-o*
+Default key: o
+Map setting: NERDTreeMapActivateNode
+Applies to: files and directories.
+
+If a file node is selected, it is opened in the previous window.
+
+If a directory is selected it is opened or closed depending on its current
+state.
+
+If a bookmark that links to a directory is selected then that directory
+becomes the new root.
+
+If a bookmark that links to a file is selected then that file is opened in the
+previous window.
+
+------------------------------------------------------------------------------
+                                                                   *NERDTree-go*
+Default key: go
+Map setting: NERDTreeMapPreview
+Applies to: files.
+
+If a file node or a bookmark that links to a file is selected, it is opened in
+the previous window, but the cursor does not move.
+
+If a bookmark that links to a directory is selected then that directory
+becomes the new root.
+
+The default key combo for this mapping is "g" + NERDTreeMapActivateNode (see
+|NERDTree-o|).
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-t*
+Default key: t
+Map setting: *NERDTreeMapOpenInTab*
+Applies to: files and directories.
+
+Opens the selected file in a new tab. If a directory is selected, a fresh
+NERDTree for that directory is opened in a new tab.
+
+If a bookmark which points to a directory is selected, open a NERDTree for
+that directory in a new tab. If the bookmark points to a file, open that file
+in a new tab.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-T*
+Default key: T
+Map setting: *NERDTreeMapOpenInTabSilent*
+Applies to: files and directories.
+
+The same as |NERDTree-t| except that the focus is kept in the current tab.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-i*
+Default key: i
+Map setting: *NERDTreeMapOpenSplit*
+Applies to: files, and bookmarks pointing to files.
+
+Opens the selected file in a new split window and puts the cursor in the new
+window.
+
+------------------------------------------------------------------------------
+                                                                   *NERDTree-gi*
+Default key: gi
+Map setting: *NERDTreeMapPreviewSplit*
+Applies to: files, and bookmarks pointing to files.
+
+The same as |NERDTree-i| except that the cursor is not moved.
+
+The default key combo for this mapping is "g" + NERDTreeMapOpenSplit (see
+|NERDTree-i|).
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-s*
+Default key: s
+Map setting: *NERDTreeMapOpenVSplit*
+Applies to: files, and bookmarks pointing to files.
+
+Opens the selected file in a new vertically split window and puts the cursor
+in the new window.
+
+------------------------------------------------------------------------------
+                                                                   *NERDTree-gs*
+Default key: gs
+Map setting: *NERDTreeMapPreviewVSplit*
+Applies to: files, and bookmarks pointing to files.
+
+The same as |NERDTree-s| except that the cursor is not moved.
+
+The default key combo for this mapping is "g" + NERDTreeMapOpenVSplit (see
+|NERDTree-s|).
+
+------------------------------------------------------------------------------
+                                                                 *NERDTree-<CR>*
+Default key: <CR>
+Map setting: *NERDTreeMapCustomOpen*
+Applies to: files, directories, and bookmarks
+
+Performs a customized open action on the selected node. This allows the user
+to define an action that behaves differently from any of the standard
+keys. See |NERDTreeCustomOpenArgs| for more details.
+------------------------------------------------------------------------------
+                                                                    *NERDTree-O*
+Default key: O
+Map setting: *NERDTreeMapOpenRecursively*
+Applies to: directories.
+
+Recursively opens the selected directory.
+
+All files and directories are cached, but if a directory would not be
+displayed due to file filters (see |NERDTreeIgnore| |NERDTree-f|) or the
+hidden file filter (see |NERDTreeShowHidden|) then its contents are not
+cached. This is handy, especially if you have .svn directories.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-x*
+Default key: x
+Map setting: *NERDTreeMapCloseDir*
+Applies to: files and directories.
+
+Closes the parent of the selected node.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-X*
+Default key: X
+Map setting: *NERDTreeMapCloseChildren*
+Applies to: directories.
+
+Recursively closes all children of the selected directory.
+
+Tip: To quickly "reset" the tree, use |NERDTree-P| with this mapping.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-e*
+Default key: e
+Map setting: *NERDTreeMapOpenExpl*
+Applies to: files and directories.
+
+|:edit|s the selected directory, or the selected file's directory. This could
+result in a NERDTree or a netrw being opened, depending on
+|NERDTreeHijackNetrw|.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-D*
+Default key: D
+Map setting: *NERDTreeMapDeleteBookmark*
+Applies to: lines in the bookmarks table
+
+Deletes the currently selected bookmark.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-P*
+Default key: P
+Map setting: *NERDTreeMapJumpRoot*
+Applies to: no restrictions.
+
+Jump to the tree root.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-p*
+Default key: p
+Map setting: *NERDTreeMapJumpParent*
+Applies to: files and directories.
+
+Jump to the parent node of the selected node.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-K*
+Default key: K
+Map setting: *NERDTreeMapJumpFirstChild*
+Applies to: files and directories.
+
+Jump to the first child of the current nodes parent.
+
+If the cursor is already on the first node then do the following:
+    * loop back thru the siblings of the current nodes parent until we find an
+      open directory with children
+    * go to the first child of that node
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-J*
+Default key: J
+Map setting: *NERDTreeMapJumpLastChild*
+Applies to: files and directories.
+
+Jump to the last child of the current nodes parent.
+
+If the cursor is already on the last node then do the following:
+    * loop forward thru the siblings of the current nodes parent until we find
+      an open directory with children
+    * go to the last child of that node
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-C-J*
+Default key: <C-J>
+Map setting: *NERDTreeMapJumpNextSibling*
+Applies to: files and directories.
+
+Jump to the next sibling of the selected node.
+
+------------------------------------------------------------------------------
+                                                                  *NERDTree-C-K*
+Default key: <C-K>
+Map setting: *NERDTreeMapJumpPrevSibling*
+Applies to: files and directories.
+
+Jump to the previous sibling of the selected node.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-C*
+Default key: C
+Map setting: *NERDTreeMapChangeRoot*
+Applies to: files and directories.
+
+Make the selected directory node the new tree root. If a file is selected, its
+parent is used.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-u*
+Default key: u
+Map setting: *NERDTreeMapUpdir*
+Applies to: no restrictions.
+
+Move the tree root up a directory (like doing a "cd ..").
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-U*
+Default key: U
+Map setting: *NERDTreeMapUpdirKeepOpen*
+Applies to: no restrictions.
+
+Like |NERDTree-u| except that the old tree root is kept open.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-r*
+Default key: r
+Map setting: *NERDTreeMapRefresh*
+Applies to: files and directories.
+
+If a directory is selected, recursively refresh that directory, i.e. scan the
+filesystem for changes and represent them in the tree.
+
+If a file node is selected then the above is done on it's parent.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-R*
+Default key: R
+Map setting: *NERDTreeMapRefreshRoot*
+Applies to: no restrictions.
+
+Recursively refresh the tree root.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-m*
+Default key: m
+Map setting: *NERDTreeMapMenu*
+Applies to: files and directories.
+
+Display the NERDTree menu. See |NERDTreeMenu| for details.
+
+------------------------------------------------------------------------------
+                                                                   *NERDTree-cd*
+Default key: cd
+Map setting: *NERDTreeMapChdir*
+Applies to: files and directories.
+
+Change Vim's current working directory to that of the selected node.
+
+------------------------------------------------------------------------------
+                                                                   *NERDTree-CD*
+Default key: CD
+Map setting: *NERDTreeMapCWD*
+Applies to: no restrictions.
+
+Change the NERDTree root to Vim's current working directory.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-I*
+Default key: I
+Map setting: *NERDTreeMapToggleHidden*
+Applies to: no restrictions.
+
+Toggles whether hidden files (i.e. "dot files") are displayed.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-f*
+Default key: f
+Map setting: *NERDTreeMapToggleFilters*
+Applies to: no restrictions.
+
+Toggles whether file filters are used. See |NERDTreeIgnore| for details.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-F*
+Default key: F
+Map setting: *NERDTreeMapToggleFiles*
+Applies to: no restrictions.
+
+Toggles whether file nodes are displayed.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-B*
+Default key: B
+Map setting: *NERDTreeMapToggleBookmarks*
+Applies to: no restrictions.
+
+Toggles whether the bookmarks table is displayed.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-q*
+Default key: q
+Map setting: *NERDTreeMapQuit*
+Applies to: no restrictions.
+
+Closes the NERDTree window.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-A*
+Default key: A
+Map setting: *NERDTreeMapToggleZoom*
+Applies to: no restrictions.
+
+Maximize (zoom) and minimize the NERDTree window.
+
+------------------------------------------------------------------------------
+                                                                    *NERDTree-?*
+Default key: ?
+Map setting: *NERDTreeMapHelp*
+Applies to: no restrictions.
+
+Toggles whether the quickhelp is displayed.
+
+------------------------------------------------------------------------------
+ 2.3. The NERDTree menu                                           *NERDTreeMenu*
+
+The NERDTree has a menu that can be programmed via the an API (see
+|NERDTreeMenuAPI|). The idea is to simulate the "right click" menus that most
+file explorers have.
+
+The script comes with two default menu plugins: exec_menuitem.vim and
+fs_menu.vim. fs_menu.vim adds some basic filesystem operations to the menu for
+creating/deleting/moving/copying files and directories. exec_menuitem.vim
+provides a menu item to execute executable files.
+
+Related tags: |NERDTree-m| |NERDTreeApi|
+
+------------------------------------------------------------------------------
+                                                                *NERDTreeMenu-j*
+Default key: j
+Map option: *NERDTreeMenuDown*
+Applies to: The NERDTree menu.
+
+Moves the cursor down.
+
+------------------------------------------------------------------------------
+                                                                *NERDTreeMenu-k*
+Default key: k
+Map option: *NERDTreeMenuUp*
+Applies to: The NERDTree menu.
+
+Moves the cursor up.
+
+==============================================================================
+3. Customisation                                              *NERDTreeSettings*
+
+
+------------------------------------------------------------------------------
+3.1. Customisation summary                             *NERDTreeSettingsSummary*
+
+The plugin provides the following settings that can customise the behaviour
+the NERDTree. These settings should be set in your vimrc, using `:let`.
+
+|loaded_nerd_tree|            Turns off the script.
+
+|NERDTreeAutoCenter|          Controls whether the NERDTree window centers
+                            when the cursor moves within a specified
+                            distance to the top/bottom of the window.
+
+|NERDTreeAutoCenterThreshold| Controls the sensitivity of autocentering.
+
+|NERDTreeCaseSensitiveSort|   Tells the NERDTree whether to be case
+                            sensitive or not when sorting nodes.
+
+|NERDTreeNaturalSort|         Tells the NERDTree whether to use natural sort
+                            order or not when sorting nodes.
+
+|NERDTreeSortHiddenFirst|     Tells the NERDTree whether to take the dot at
+                            the beginning of the hidden file names into
+                            account when sorting nodes.
+
+|NERDTreeChDirMode|           Tells the NERDTree if/when it should change
+                            vim's current working directory.
+
+|NERDTreeHighlightCursorline| Tell the NERDTree whether to highlight the
+                            current cursor line.
+
+|NERDTreeHijackNetrw|         Tell the NERDTree whether to replace the netrw
+                            autocommands for exploring local directories.
+
+|NERDTreeIgnore|              Tells the NERDTree which files to ignore.
+
+|NERDTreeRespectWildIgnore|   Tells the NERDTree to respect `'wildignore'`.
+
+|NERDTreeBookmarksFile|       Where the bookmarks are stored.
+
+|NERDTreeBookmarksSort|       Control how the Bookmark table is sorted.
+
+|NERDTreeMarkBookmarks|       Render bookmarked nodes with markers.
+
+|NERDTreeMouseMode|           Manage the interpretation of mouse clicks.
+
+|NERDTreeQuitOnOpen|          Closes the tree window or bookmark table after
+                            opening a file.
+
+|NERDTreeShowBookmarks|       Tells the NERDTree whether to display the
+                            bookmarks table on startup.
+
+|NERDTreeShowFiles|           Tells the NERDTree whether to display files in
+                            the tree on startup.
+
+|NERDTreeShowHidden|          Tells the NERDTree whether to display hidden
+                            files on startup.
+
+|NERDTreeShowLineNumbers|     Tells the NERDTree whether to display line
+                            numbers in the tree window.
+
+|NERDTreeSortOrder|           Tell the NERDTree how to sort the nodes in the
+                            tree.
+
+|NERDTreeStatusline|          Set a statusline for NERDTree windows.
+
+|NERDTreeWinPos|              Tells the script where to put the NERDTree
+                            window.
+
+|NERDTreeWinSize|             Sets the window size when the NERDTree is
+                            opened.
+
+|NERDTreeWinSizeMax|          Sets the maximum window size when the NERDTree
+                            is zoomed.
+
+|NERDTreeMinimalUI|           Disables display of the 'Bookmarks' label and
+                            'Press ? for help' text.
+
+|NERDTreeMinimalMenu|         Use a compact menu that fits on a single line
+                            for adding, copying, deleting, etc
+
+|NERDTreeCascadeSingleChildDir|
+                            Collapses on the same line directories that have
+                            only one child directory.
+
+|NERDTreeCascadeOpenSingleChildDir|
+                            Cascade open while selected directory has only
+                            one child that also is a directory.
+
+|NERDTreeAutoDeleteBuffer|    Tells the NERDTree to automatically remove a
+                            buffer when a file is being deleted or renamed
+                            via a context menu command.
+
+|NERDTreeCreatePrefix|        Specify a prefix to be used when creating the
+                            NERDTree window.
+
+|NERDTreeRemoveFileCmd|       Specify a custom shell command to be used when
+                            deleting files. Note that it should include one
+                            space character at the end of the command and it
+                            applies only to files.
+
+|NERDTreeRemoveDirCmd|        Specify a custom shell command to be used when
+                            deleting directories. Note that it should
+                            include one space character at the end of the
+                            command and it applies only to directories.
+
+|NERDTreeDirArrowCollapsible| These characters indicate when a directory is
+|NERDTreeDirArrowExpandable|  either collapsible or expandable.
+
+|NERDTreeNodeDelimiter|       A single character that is used to separate the
+                            file or directory name from the rest of the
+                            characters on the line of text.
+
+|NERDTreeCustomOpenArgs|      A dictionary with values that control how a node
+                            is opened with the |NERDTree-<CR>| key.
+
+------------------------------------------------------------------------------
+3.2. Customisation details                             *NERDTreeSettingsDetails*
+
+To enable any of the below settings you should put an appropriate >
+    let <setting>=<value>
+<line in your ~/.vimrc.
+
+                                                              *loaded_nerd_tree*
+If this plugin is making you feel homicidal, it may be a good idea to turn it
+off with this line in your vimrc: >
+    let loaded_nerd_tree=1
+<
+------------------------------------------------------------------------------
+                                                            *NERDTreeAutoCenter*
+Values: 0 or 1.
+Default: 1
+
+If set to 1, the NERDTree window will center around the cursor if it moves to
+within |NERDTreeAutoCenterThreshold| lines of the top/bottom of the window.
+
+This is ONLY done in response to tree navigation mappings,
+i.e. |NERDTree-J| |NERDTree-K| |NERDTree-C-J| |NERDTree-C-K| |NERDTree-p|
+|NERDTree-P|
+
+The centering is done with a |zz| operation.
+
+------------------------------------------------------------------------------
+                                                   *NERDTreeAutoCenterThreshold*
+Values: Any natural number.
+Default: 3
+
+This setting controls the "sensitivity" of the NERDTree auto centering. See
+|NERDTreeAutoCenter| for details.
+
+------------------------------------------------------------------------------
+                                                     *NERDTreeCaseSensitiveSort*
+Values: 0 or 1.
+Default: 0.
+
+By default the NERDTree does not sort nodes case sensitively, i.e. nodes
+could appear like this: >
+    bar.c
+    Baz.c
+    blarg.c
+    boner.c
+    Foo.c
+<
+But, if you set this setting to 1 then the case of the nodes will be taken
+into account. The above nodes would then be sorted like this: >
+    Baz.c
+    Foo.c
+    bar.c
+    blarg.c
+    boner.c
+<
+------------------------------------------------------------------------------
+                                                           *NERDTreeNaturalSort*
+Values: 0 or 1.
+Default: 0.
+
+By default the NERDTree does not sort nodes in natural sort order, i.e. nodes
+could appear like this: >
+    z1.txt
+    z10.txt
+    z100.txt
+    z11.txt
+    z110.txt
+    z2.txt
+    z20.txt
+    z3.txt
+<
+But if you set this setting to 1 then the natural sort order will be used. The
+above nodes would then be sorted like this: >
+    z1.txt
+    z2.txt
+    z3.txt
+    z10.txt
+    z11.txt
+    z20.txt
+    z100.txt
+    z110.txt
+<
+------------------------------------------------------------------------------
+                                                                *NERDTreeUseTCD*
+Values: 0 or 1.
+Default: 0.
+
+By default, NERDTree will use the `:cd` command to change the current working
+directory. If this setting is turned on, and the `:tcd` command is available, it
+will be used instead.
+
+------------------------------------------------------------------------------
+                                                             *NERDTreeChDirMode*
+Values: 0, 1, 2, or 3.
+Default: 0.
+
+Use this setting to tell the script when (if at all) to change the current
+working directory (CWD) for vim.
+
+If it is set to 0 then the CWD is never changed by the NERDTree.
+
+If set to 1 then the CWD is changed when the NERDTree is first loaded to the
+directory it is initialized in. For example, if you start the NERDTree with >
+    :NERDTree /home/marty/foobar
+<
+then the CWD will be changed to /home/marty/foobar and will not be changed
+again unless you init another NERDTree with a similar command.
+
+If the setting is set to 2 then it behaves the same as if set to 1 except that
+the CWD is changed whenever the tree root is changed. For example, if the CWD
+is /home/marty/foobar and you make the node for /home/marty/foobar/baz the new
+root then the CWD will become /home/marty/foobar/baz.
+
+If the set to 3, then it behaves the same as if set to 2, and the CWD is
+changed whenever changing tabs to whatever the tree root is on that tab.
+
+------------------------------------------------------------------------------
+                                                   *NERDTreeHighlightCursorline*
+Values: 0 or 1.
+Default: 1.
+
+If set to 1, the current cursor line in the NERDTree buffer will be
+highlighted. This is done using the `'cursorline'` Vim option.
+
+------------------------------------------------------------------------------
+                                                           *NERDTreeHijackNetrw*
+Values: 0 or 1.
+Default: 1.
+
+If set to 1, doing a >
+    :edit <some directory>
+<
+will open up a window level NERDTree instead of a netrw in the target window.
+
+Window level trees behaves slightly different from a regular trees in the
+following respects:
+    1. 'o' will open the selected file in the same window as the tree,
+       replacing it.
+    2. you can have one tree per window - instead of per tab.
+
+------------------------------------------------------------------------------
+                                                                *NERDTreeIgnore*
+Values: a list of regular expressions.
+Default: ['\~$'].
+
+This setting is used to specify which files the NERDTree should ignore.  It
+must be a list of regular expressions. When the NERDTree is rendered, any
+files/directories that match any of the regex's in NERDTreeIgnore won't be
+displayed.
+
+For example if you put the following line in your vimrc: >
+    let NERDTreeIgnore=['\.vim$', '\~$']
+<
+then all files ending in .vim or ~ will be ignored.
+
+There are 3 magic flags that can be appended to the end of each regular
+expression to specify that the regex should match only filenames, only lowest
+level directories, or a full path. These flags are "[[dir]]", "[[file]]", and
+"[[path]]". Example: >
+    let NERDTreeIgnore=['\.d$[[dir]]', '\.o$[[file]]', 'tmp/cache$[[path]]']
+<
+This will cause all directories ending in ".d" to be ignored, all files ending
+in ".o" to be ignored, and the "cache" subdirectory of any "tmp" directory to
+be ignored. All other "cache" directories will be displayed.
+
+When using the "[[path]]" tag on Windows, make sure you use escaped
+backslashes for the separators in the regex, eg. 'Temp\\cache$[[path]]'
+
+Note: to tell the NERDTree not to ignore any files you must use the following
+line: >
+    let NERDTreeIgnore=[]
+<
+The file filters can be turned on and off dynamically with the |NERDTree-f|
+mapping.
+
+------------------------------------------------------------------------------
+                                                     *NERDTreeRespectWildIgnore*
+Values: 0 or 1.
+Default: 0.
+
+If set to 1, the `'wildignore'` setting is respected.
+
+------------------------------------------------------------------------------
+                                                         *NERDTreeBookmarksFile*
+Values: a path
+Default: $HOME/.NERDTreeBookmarks
+
+This is where bookmarks are saved. See |NERDTreeBookmarkCommands|.
+
+------------------------------------------------------------------------------
+                                                         *NERDTreeBookmarksSort*
+Values: 0, 1, or 2
+Default: 1
+
+This setting controls the method by which the list of user bookmarks is
+sorted. When sorted, bookmarks will render in alphabetical order by name.
+
+If set to 0, the bookmarks list is not sorted.
+If set to 1, the bookmarks list is sorted in a case-insensitive manner.
+If set to 2, the bookmarks list is sorted in a case-sensitive manner.
+
+------------------------------------------------------------------------------
+                                                         *NERDTreeMarkBookmarks*
+Values: 0 or 1
+Default: 1
+
+If set to 1, Bookmarks will be specially marked whenever the NERDTree is
+rendered. Users of the |NERDTreeMinimalUI| setting may prefer to disable
+this setting for even less visual clutter.
+
+------------------------------------------------------------------------------
+                                                             *NERDTreeMouseMode*
+Values: 1, 2 or 3.
+Default: 1.
+
+If set to 1 then a double click on a node is required to open it.
+If set to 2 then a single click will open directory nodes, while a double
+click will still be required for file nodes.
+If set to 3 then a single click will open any node.
+
+Note: a double click anywhere on a line that a tree node is on will
+activate it, but all single-click activations must be done on name of the node
+itself. For example, if you have the following node: >
+    | | |-application.rb
+<
+then (to single click activate it) you must click somewhere in
+'application.rb'.
+
+------------------------------------------------------------------------------
+                                                            *NERDTreeQuitOnOpen*
+Values: 0,1,2 or 3.
+Default: 0
+
+This setting governs whether the NERDTree window or the bookmarks table closes
+after opening a file with the |NERDTree-o|, |NERDTree-i|, |NERDTree-t| and
+|NERDTree-T| mappings.
+
+ Value  | NERDTree Window Behavior
+ -------+-------------------------------------------------------
+ 0      | No change
+ 1      | Closes after opening a file
+ 2      | Closes the bookmark table after opening a bookmark
+ 3(1+2) | Same as both 1 and 2
+
+------------------------------------------------------------------------------
+                                                         *NERDTreeShowBookmarks*
+Values: 0 or 1.
+Default: 0.
+
+If this setting is set to 1 then the bookmarks table will be displayed.
+
+This setting can be toggled dynamically, per tree, with the |NERDTree-B|
+mapping.
+
+------------------------------------------------------------------------------
+                                                             *NERDTreeShowFiles*
+Values: 0 or 1.
+Default: 1.
+
+If this setting is set to 1 then files are displayed in the NERDTree. If it
+is set to 0 then only directories are displayed.
+
+This setting can be toggled dynamically, per tree, with the |NERDTree-F|
+mapping and is useful for drastically shrinking the tree when you are
+navigating to a different part of the tree.
+
+------------------------------------------------------------------------------
+                                                            *NERDTreeShowHidden*
+Values: 0 or 1.
+Default: 0.
+
+This setting tells vim whether to display hidden files by default. This
+setting can be dynamically toggled, per tree, with the |NERDTree-I| mapping.
+Use one of the follow lines for this setting: >
+    let NERDTreeShowHidden=0
+    let NERDTreeShowHidden=1
+<
+------------------------------------------------------------------------------
+                                                       *NERDTreeShowLineNumbers*
+Values: 0 or 1.
+Default: 0.
+
+This setting tells vim whether to display line numbers for the NERDTree
+window.  Use one of the follow lines for this setting: >
+    let NERDTreeShowLineNumbers=0
+    let NERDTreeShowLineNumbers=1
+<
+------------------------------------------------------------------------------
+                                                             *NERDTreeSortOrder*
+Values: a list of regular expressions.
+Default: ['\/$', '*', '\.swp$',  '\.bak$', '\~$']
+
+This setting is a list of regular expressions which are used to group or sort
+the nodes under their parent.
+
+For example, if the setting is: >
+    ['\.vim$', '\.c$', '\.h$', '*', 'foobar']
+<
+then all .vim files will be grouped at the top, followed by all .c files then
+all .h files. All files containing the string 'foobar' will be placed at the
+end.  The star is a special flag: it tells the script that every node that
+doesn't match any of the other regexps should be placed here.
+
+If no star is present in NERDTreeSortOrder, then one is automatically
+appended to the end of the list.
+
+The regex '\/$' should be used to match directory nodes.
+
+Files can also be sorted by 1) the modification timestamp, 2) the size, or 3)
+the extension. Directories are always sorted by name. To accomplish this, the
+following special flags are used:
+  [[timestamp]]   [[-timestamp]]   [[size]]   [[-size]]   [[extension]]
+The hyphen specifies a descending sort; extensions are sorted in ascending
+order only. If placed at the beginning of the list, files are sorted according
+to these flags first, and then grouped by the remaining items in the list. If
+the flags are in any other position of the list, this special sorting is done
+secondarily. See examples 4, 5, and 6 below.
+
+After this sorting is done, the files in each group are sorted alphabetically.
+
+Examples: >
+    (1) ['*', '\/$']
+    (2) []
+    (3) ['\/$', '\.rb$', '\.php$', '*', '\.swp$',  '\.bak$', '\~$']
+    (4) ['[[-size]]']
+    (5) ['\/$', '*', '[[timestamp]]']
+    (6) ['foo','\/$','[[extension]]']
+<
+1. Directories will appear last, everything else will appear above.
+2. Everything will simply appear in alphabetical order.
+3. Directories will appear first, then ruby and php. Swap files, bak files
+   and vim backup files will appear last with everything else preceding them.
+4. Everything is sorted by size, largest to smallest, with directories
+   considered to have size 0 bytes.
+5. Directories will appear first alphabetically, followed by files, sorted by
+   timestamp, oldest first.
+6. Files and directories matching 'foo' first, followed by other directories,
+   then all other files. Each section of files is sorted by file extension.
+
+------------------------------------------------------------------------------
+                                                            *NERDTreeStatusline*
+Values: Any valid `'statusline'` setting.
+Default: %{exists('b:NERDTree')?b:NERDTree.root.path.str():''}
+
+Defines the value for the `'statusline'` setting in NERDTree windows.
+
+Note: The setting is actually applied using |:let-&|, not |:set|, so
+escaping spaces is not necessary.
+
+Setting this to -1 will deactivate it so that your global `'statusline'`
+setting is used.
+
+------------------------------------------------------------------------------
+                                                                *NERDTreeWinPos*
+Values: "left" or "right"
+Default: "left".
+
+This setting is used to determine where NERDTree window is placed on the
+screen.
+
+This setting makes it possible to use two different explorer plugins
+simultaneously. For example, you could have the taglist plugin on the left of
+the window and the NERDTree on the right.
+
+------------------------------------------------------------------------------
+                                                               *NERDTreeWinSize*
+Values: a positive integer.
+Default: 31.
+
+This setting is used to change the size of the NERDTree when it is loaded.
+
+------------------------------------------------------------------------------
+                                                             *NERDTreeMinimalUI*
+Values: 0 or 1
+Default: 0
+
+This setting disables the 'Bookmarks' label 'Press ? for help' text. Use one
+of the following lines for this setting: >
+    let NERDTreeMinimalUI=0
+    let NERDTreeMinimalUI=1
+<
+------------------------------------------------------------------------------
+                                                           *NERDTreeMinimalMenu*
+Values: 0 or 1
+Default: 0
+
+This setting makes NERDTree use a smaller, more compact menu for adding,
+copying, deleting nodes. This menu fits on a single line so Vim doesn't need to
+scroll down to present it. This setting is recommended for users already
+familiar with the menu items. It will look similar to this:
+
+  Menu: [ (a)dd ,m,d,r,o,q,c,l] (Use j/k/enter or shortcut):
+
+An action can be selected with its shortcut key or with the NERDTreeMenuUp and
+NERDTreeMenuDown keys, then pressing enter.
+
+Use one of the following lines for this setting: >
+    let NERDTreeMinimalMenu=0
+    let NERDTreeMinimalMenu=1
+<
+------------------------------------------------------------------------------
+                                                 *NERDTreeCascadeSingleChildDir*
+Values: 0 or 1
+Default: 1.
+
+When displaying directory nodes, this setting tells NERDTree to collapse
+directories that have only one child. Use one of the following lines for this
+setting: >
+    let NERDTreeCascadeSingleChildDir=0
+    let NERDTreeCascadeSingleChildDir=1
+<
+------------------------------------------------------------------------------
+                                             *NERDTreeCascadeOpenSingleChildDir*
+Values: 0 or 1
+Default: 1.
+
+When opening directory nodes, this setting tells NERDTree to recursively open
+directories that have only one child which is also a directory. NERDTree will
+stop when it finds a directory that contains anything but another single
+directory. This setting also causes the |NERDTree-x| mapping to close
+directories in the same manner. This setting may be useful for Java projects.
+Use one of the following lines for this setting: >
+    let NERDTreeCascadeOpenSingleChildDir=0
+    let NERDTreeCascadeOpenSingleChildDir=1
+<
+------------------------------------------------------------------------------
+                                                      *NERDTreeAutoDeleteBuffer*
+Values: 0 or 1
+Default: 0.
+
+When using a context menu to delete or rename a file you may also want to
+delete the buffer which is no more valid. If the setting is not set you will
+see a confirmation if you really want to delete an old buffer. If you always
+press 'y' then it's worth it to set this setting to 1. Use one of the
+following lines for this setting: >
+    let NERDTreeAutoDeleteBuffer=0
+    let NERDTreeAutoDeleteBuffer=1
+<
+------------------------------------------------------------------------------
+                                                          *NERDTreeCreatePrefix*
+Values: Any valid command prefix.
+Default: "silent".
+
+Internally, NERDTree uses the |:edit| command to create a buffer in which to
+display its tree view. You can augment this behavior by specifying a prefix
+string such as "keepalt" or similar. For example, to have NERDTree create its
+tree window using `silent keepalt keepjumps edit`: >
+    let NERDTreeCreatePrefix='silent keepalt keepjumps'
+<
+------------------------------------------------------------------------------
+                        *NERDTreeDirArrowCollapsible* *NERDTreeDirArrowExpandable*
+Values: Any single character.
+Defaults:   Windows: ~ and +    Others: ▾ and ▸
+
+These characters indicate whether a directory is collapsible or expandable.
+Example: >
+    let NERDTreeDirArrowExpandable=">"
+    let NERDTreeDirArrowCollapsible="v"
+<
+They can be set to "\u00a0" to replace the arrows with a non-breaking space.
+If you do this you may need to change the node delimiter. See
+|NERDTreeNodeDelimiter|. You cannot use the same character for both the arrows
+and the delimiter.
+
+Alternatively, they can be set to '' (an empty string). This removes the
+arrows and the single space that follows them, shifting the entire tree two
+character positions to the left.
+
+------------------------------------------------------------------------------
+                                                         *NERDTreeNodeDelimiter*
+Values: Any single character.
+Default: varies (see below)
+
+This character is used to separate the file or directory name from the rest of
+the characters in the line of text. It allows filenames to contain special
+characters that are otherwise used in the NERDTree, such as square brackets,
+braces, trailing asterisk, and leading space. For more details, see the
+responsible pull request: https://github.com/preservim/nerdtree/pull/868.
+
+The default value of this variable depends on the features compiled into your
+vim and the values of |NERDTreeDirArrowCollapsible| and
+|NERDTreeDirArrowExpandable|.
+  * If your vim is compiled with the +conceal feature, it is the "\x07"
+    (BEL) character, and it is hidden by setting 'conceallevel' to 2. If you
+    use autocommands, make sure none of them change that setting in the
+    NERD_Tree_* buffers.
+  * If your vim does NOT have the +conceal feature and you're using "\u00a0"
+    (non-breaking space) to hide the directory arrows, "\u00b7" (middle dot)
+    is used as the default delimiter.
+  * If neither condition above applies, NERDTree uses "\u00a0" (non-breaking
+    space) as the default delimiter.
+
+In the 2nd and 3rd cases, NERDTree will use the Ignore highlight group to
+"hide" the delimiter. It should appear as an empty space.
+
+Other plugins can interfere with these defaults, so if you need to change the
+delimiter, be sure to choose a character that won't appear in your filenames
+or any of the flags set by your installed NERDTree plugins. The suggestions
+below are but a few of the many possibilities. Remember to use double quotes
+when specifying by hex or Unicode. >
+    let NERDTreeNodeDelimiter="\x07"     "bell
+    let NERDTreeNodeDelimiter="\u00b7"   "middle dot
+    let NERDTreeNodeDelimiter="\u00a0"   "non-breaking space
+    let NERDTreeNodeDelimiter="😀"       "smiley face
+<
+------------------------------------------------------------------------------
+                                                        *NERDTreeCustomOpenArgs*
+Values: A nested dictionary, as described below
+Default: {'file': {'reuse': 'all', 'where': 'p'}, 'dir': {}}
+
+This dictionary contains two keys, 'file' and 'dir', whose values each are
+another dictionary. The inner dictionary is a set of parameters used by
+|NERDTree-<CR>| to open a file or directory. Setting these parameters allows you
+to customize the way the node is opened. The default value matches what
+|NERDTree-o| does. To change that behavior, use these keys and
+values in the inner dictionaries:
+
+'where':    specifies whether the node should be opened in a new split ("h" or
+            "v"), in a new tab ("t") or, in the last window ("p").
+'reuse':    if file is already shown in a window, jump there; takes values
+            "all", "currenttab", or empty
+'keepopen': boolean (0 or 1); if true, the tree window will not be closed
+'stay':     boolean (0 or 1); if true, remain in tree window after opening
+
+For example:
+To open files and directories (creating a new NERDTree) in a new tab, >
+    {'file':{'where': 't'}, 'dir':{'where':'t'}}
+<
+To open a file always in the current tab, and expand directories in place, >
+    {'file': {'reuse':'currenttab', 'where':'p', 'keepopen':1, 'stay':1}}
+<
+==============================================================================
+4. The NERDTree API                                                *NERDTreeAPI*
+
+The NERDTree script allows you to add custom key mappings and menu items via
+a set of API calls. Any scripts that use this API should be placed in
+~/.vim/nerdtree_plugin/ (*nix) or ~/vimfiles/nerdtree_plugin (windows).
+
+The script exposes some prototype objects that can be used to manipulate the
+tree and/or get information from it: >
+    g:NERDTreePath
+    g:NERDTreeDirNode
+    g:NERDTreeFileNode
+    g:NERDTreeBookmark
+<
+See the code/comments in NERD_tree.vim to find how to use these objects. The
+following code conventions are used:
+    * class members start with a capital letter
+    * instance members start with a lower case letter
+    * private members start with an underscore
+
+See this blog post for more details:
+ http://got-ravings.blogspot.com/2008/09/vim-pr0n-prototype-based-objects.html
+
+A number of API functions take a callback argument to call. The callback can
+be either a string with the name of a function to call, or a |Funcref| object
+which will be called directly.
+
+------------------------------------------------------------------------------
+4.1. Key map API                                             *NERDTreeKeymapAPI*
+
+NERDTreeAddKeyMap({options})                               *NERDTreeAddKeyMap()*
+    Adds a new keymapping for all NERDTree buffers.
+    {options} must be a dictionary, and must contain the following keys:
+    "key" - the trigger key for the new mapping
+    "callback" - the function the new mapping will be bound to
+    "quickhelpText" - the text that will appear in the quickhelp (see
+    |NERDTree-?|)
+    "override" - if 1 then this new mapping will override whatever previous
+    mapping was defined for the key/scope combo. Useful for overriding the
+    default mappings.
+
+    Additionally, a "scope" argument may be supplied. This constrains the
+    mapping so that it is only activated if the cursor is on a certain object.
+    That object is then passed into the handling method. Possible values are:
+
+      "FileNode" .... a file node
+      "DirNode" ..... a directory node
+      "Node" ........ a file node OR a directory node
+      "Bookmark" .... a bookmark
+      "all" ......... global scope; handler receives no arguments (default)
+
+    Example: >
+        call NERDTreeAddKeyMap({
+               \ 'key': 'foo',
+               \ 'callback': 'NERDTreeEchoPathHandler',
+               \ 'quickhelpText': 'echo full path of current node',
+               \ 'scope': 'DirNode' })
+
+        function! NERDTreeEchoPathHandler(dirnode)
+            echo a:dirnode.path.str()
+        endfunction
+<
+    This code should sit in a file like ~/.vim/nerdtree_plugin/mymapping.vim.
+    It adds a (redundant) mapping on 'foo' which changes vim's CWD to that of
+    the current directory node. Note this mapping will only fire when the
+    cursor is on a directory node.
+
+------------------------------------------------------------------------------
+4.2. Menu API                                                  *NERDTreeMenuAPI*
+
+NERDTreeAddSubmenu({options})                             *NERDTreeAddSubmenu()*
+    Creates and returns a new submenu.
+
+    {options} must be a dictionary and must contain the following keys:
+    "text" - the text of the submenu that the user will see
+    "shortcut" - a shortcut key for the submenu (need not be unique)
+
+    The following keys are optional:
+    "isActiveCallback" - a function that will be called to determine whether
+    this submenu item will be displayed or not. The callback function must
+    return 0 or 1.
+    "parent" - the parent submenu of the new submenu (returned from a previous
+    invocation of NERDTreeAddSubmenu()). If this key is left out then the new
+    submenu will sit under the top level menu.
+
+    See below for an example.
+
+NERDTreeAddMenuItem({options})                           *NERDTreeAddMenuItem()*
+    Adds a new menu item to the NERDTree menu (see |NERDTreeMenu|).
+
+    {options} must be a dictionary and must contain the
+    following keys:
+    "text" - the text of the menu item which the user will see
+    "shortcut" - a shortcut key for the menu item (need not be unique)
+    "callback" - the function that will be called when the user activates the
+    menu item.
+
+    The following keys are optional:
+    "isActiveCallback" - a function that will be called to determine whether
+    this menu item will be displayed or not. The callback function must return
+    0 or 1.
+    "parent" - if the menu item belongs under a submenu then this key must be
+    specified. This value for this key will be the object that
+    was returned when the submenu was created with |NERDTreeAddSubmenu()|.
+
+    See below for an example.
+
+NERDTreeAddMenuSeparator([{options}])               *NERDTreeAddMenuSeparator()*
+    Adds a menu separator (a row of dashes).
+
+    {options} is an optional dictionary that may contain the following keys:
+    "isActiveCallback" - see description in |NERDTreeAddMenuItem()|.
+
+Below is an example of the menu API in action. >
+    call NERDTreeAddMenuSeparator()
+
+    call NERDTreeAddMenuItem({
+                \ 'text': 'a (t)op level menu item',
+                \ 'shortcut': 't',
+                \ 'callback': 'SomeFunction' })
+
+    let submenu = NERDTreeAddSubmenu({
+                \ 'text': 'a (s)ub menu',
+                \ 'shortcut': 's' })
+
+    call NERDTreeAddMenuItem({
+                \ 'text': '(n)ested item 1',
+                \ 'shortcut': 'n',
+                \ 'callback': 'SomeFunction',
+                \ 'parent': submenu })
+
+    call NERDTreeAddMenuItem({
+                \ 'text': '(n)ested item 2',
+                \ 'shortcut': 'n',
+                \ 'callback': 'SomeFunction',
+                \ 'parent': submenu })
+<
+This will create the following menu: >
+  --------------------
+  a (t)op level menu item
+  a (s)ub menu
+<
+Where selecting "a (s)ub menu" will lead to a second menu: >
+  (n)ested item 1
+  (n)ested item 2
+<
+When any of the 3 concrete menu items are selected the function "SomeFunction"
+will be called.
+
+------------------------------------------------------------------------------
+4.3 NERDTreeAddPathFilter(callback)                    *NERDTreeAddPathFilter()*
+
+Path filters are essentially a more powerful version of  |NERDTreeIgnore|.
+If the simple regex matching in |NERDTreeIgnore| is not enough then use
+|NERDTreeAddPathFilter()| to add a callback function that paths will be
+checked against when the decision to ignore them is made. Example >
+
+    call NERDTreeAddPathFilter('MyFilter')
+
+    function! MyFilter(params)
+        "params is a dict containing keys: 'nerdtree' and 'path' which are
+        "g:NERDTree and g:NERDTreePath objects
+
+        "return 1 to ignore params['path'] or 0 otherwise
+    endfunction
+<
+------------------------------------------------------------------------------
+4.4 Path Listener API                                  *NERDTreePathListenerAPI*
+
+Use this API if you want to run a callback for events on Path objects. E.G >
+
+    call g:NERDTreePathNotifier.AddListener("init", "MyListener")
+
+    "....
+
+    function! MyListener(event)
+        "This function will be called whenever a Path object is created.
+
+        "a:event is an object that contains a bunch of relevant info -
+        "including the affected path. See lib/nerdtree/event.vim for details.
+    endfunction
+<
+Current events supported:
+  init ~
+  refresh ~
+  refreshFlags ~
+
+------------------------------------------------------------------------------
+NERDTreeRender()                                              *NERDTreeRender()*
+    Re-renders the NERDTree buffer. Useful if you change the state of the
+    tree and you want to it to be reflected in the UI.
+
+==============================================================================
+5. About                                                         *NERDTreeAbout*
+
+The author of the NERDTree is a terrible terrible monster called Martyzilla
+who gobbles up small children with milk and sugar for breakfast.
+
+He can be reached at martin.grenfell at gmail dot com. He would love to hear
+from you, so feel free to send him suggestions and/or comments about this
+plugin.  Don't be shy --- the worst he can do is slaughter you and stuff you
+in the fridge for later ;)
+
+Martyzilla recruited two other unwitting accomplices to become his minions in
+his quest to conquer the Vim plugin world. While he may still love to receive
+your emails, the best way to send suggestions, bug reports, and questions is
+to submit an issue at http://github.com/preservim/nerdtree/issues.
+
+The latest stable and development versions are on Github.
+    Stable: http://github.com/preservim/nerdtree (master branch)
+    Development: http://github.com/preservim/nerdtree/branches
+
+Title Credit:
+  * http://ascii.co.uk/art/tree
+
+  * Patrick Gillespie's Text ASCII Art Generator
+    http://patorjk.com/software/taag
+    http://patorjk.com/software/taag/#p=display&f=Rozzo&t=the%20NERD%20Tree
+
+==============================================================================
+6. License                                                     *NERDTreeLicense*
+
+The NERDTree is released under the wtfpl.
+See http://sam.zoy.org/wtfpl/COPYING.
+
+------------------------------------------------------------------------------
+ vim:tw=78:ts=8:ft=help:noet:nospell
diff --git a/.vim/pack/vendor/start/nerdtree/doc/tags b/.vim/pack/vendor/start/nerdtree/doc/tags
new file mode 100644
index 0000000..c1135b2
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/doc/tags
@@ -0,0 +1,143 @@
+:NERDTree	NERDTree.txt	/*:NERDTree*
+:NERDTreeCWD	NERDTree.txt	/*:NERDTreeCWD*
+:NERDTreeClose	NERDTree.txt	/*:NERDTreeClose*
+:NERDTreeFind	NERDTree.txt	/*:NERDTreeFind*
+:NERDTreeFocus	NERDTree.txt	/*:NERDTreeFocus*
+:NERDTreeFromBookmark	NERDTree.txt	/*:NERDTreeFromBookmark*
+:NERDTreeMirror	NERDTree.txt	/*:NERDTreeMirror*
+:NERDTreeRefreshRoot	NERDTree.txt	/*:NERDTreeRefreshRoot*
+:NERDTreeToggle	NERDTree.txt	/*:NERDTreeToggle*
+:NERDTreeToggleVCS	NERDTree.txt	/*:NERDTreeToggleVCS*
+:NERDTreeVCS	NERDTree.txt	/*:NERDTreeVCS*
+NERDTree	NERDTree.txt	/*NERDTree*
+NERDTree-<CR>	NERDTree.txt	/*NERDTree-<CR>*
+NERDTree-?	NERDTree.txt	/*NERDTree-?*
+NERDTree-A	NERDTree.txt	/*NERDTree-A*
+NERDTree-B	NERDTree.txt	/*NERDTree-B*
+NERDTree-C	NERDTree.txt	/*NERDTree-C*
+NERDTree-C-J	NERDTree.txt	/*NERDTree-C-J*
+NERDTree-C-K	NERDTree.txt	/*NERDTree-C-K*
+NERDTree-CD	NERDTree.txt	/*NERDTree-CD*
+NERDTree-D	NERDTree.txt	/*NERDTree-D*
+NERDTree-F	NERDTree.txt	/*NERDTree-F*
+NERDTree-I	NERDTree.txt	/*NERDTree-I*
+NERDTree-J	NERDTree.txt	/*NERDTree-J*
+NERDTree-K	NERDTree.txt	/*NERDTree-K*
+NERDTree-O	NERDTree.txt	/*NERDTree-O*
+NERDTree-P	NERDTree.txt	/*NERDTree-P*
+NERDTree-R	NERDTree.txt	/*NERDTree-R*
+NERDTree-T	NERDTree.txt	/*NERDTree-T*
+NERDTree-U	NERDTree.txt	/*NERDTree-U*
+NERDTree-X	NERDTree.txt	/*NERDTree-X*
+NERDTree-cd	NERDTree.txt	/*NERDTree-cd*
+NERDTree-contents	NERDTree.txt	/*NERDTree-contents*
+NERDTree-e	NERDTree.txt	/*NERDTree-e*
+NERDTree-f	NERDTree.txt	/*NERDTree-f*
+NERDTree-gi	NERDTree.txt	/*NERDTree-gi*
+NERDTree-go	NERDTree.txt	/*NERDTree-go*
+NERDTree-gs	NERDTree.txt	/*NERDTree-gs*
+NERDTree-i	NERDTree.txt	/*NERDTree-i*
+NERDTree-m	NERDTree.txt	/*NERDTree-m*
+NERDTree-o	NERDTree.txt	/*NERDTree-o*
+NERDTree-p	NERDTree.txt	/*NERDTree-p*
+NERDTree-q	NERDTree.txt	/*NERDTree-q*
+NERDTree-r	NERDTree.txt	/*NERDTree-r*
+NERDTree-s	NERDTree.txt	/*NERDTree-s*
+NERDTree-t	NERDTree.txt	/*NERDTree-t*
+NERDTree-u	NERDTree.txt	/*NERDTree-u*
+NERDTree-x	NERDTree.txt	/*NERDTree-x*
+NERDTree.txt	NERDTree.txt	/*NERDTree.txt*
+NERDTreeAPI	NERDTree.txt	/*NERDTreeAPI*
+NERDTreeAbout	NERDTree.txt	/*NERDTreeAbout*
+NERDTreeAddKeyMap()	NERDTree.txt	/*NERDTreeAddKeyMap()*
+NERDTreeAddMenuItem()	NERDTree.txt	/*NERDTreeAddMenuItem()*
+NERDTreeAddMenuSeparator()	NERDTree.txt	/*NERDTreeAddMenuSeparator()*
+NERDTreeAddPathFilter()	NERDTree.txt	/*NERDTreeAddPathFilter()*
+NERDTreeAddSubmenu()	NERDTree.txt	/*NERDTreeAddSubmenu()*
+NERDTreeAutoCenter	NERDTree.txt	/*NERDTreeAutoCenter*
+NERDTreeAutoCenterThreshold	NERDTree.txt	/*NERDTreeAutoCenterThreshold*
+NERDTreeAutoDeleteBuffer	NERDTree.txt	/*NERDTreeAutoDeleteBuffer*
+NERDTreeBookmarkCommands	NERDTree.txt	/*NERDTreeBookmarkCommands*
+NERDTreeBookmarkTable	NERDTree.txt	/*NERDTreeBookmarkTable*
+NERDTreeBookmarks	NERDTree.txt	/*NERDTreeBookmarks*
+NERDTreeBookmarksFile	NERDTree.txt	/*NERDTreeBookmarksFile*
+NERDTreeBookmarksSort	NERDTree.txt	/*NERDTreeBookmarksSort*
+NERDTreeCascadeOpenSingleChildDir	NERDTree.txt	/*NERDTreeCascadeOpenSingleChildDir*
+NERDTreeCascadeSingleChildDir	NERDTree.txt	/*NERDTreeCascadeSingleChildDir*
+NERDTreeCaseSensitiveSort	NERDTree.txt	/*NERDTreeCaseSensitiveSort*
+NERDTreeChDirMode	NERDTree.txt	/*NERDTreeChDirMode*
+NERDTreeCreatePrefix	NERDTree.txt	/*NERDTreeCreatePrefix*
+NERDTreeCustomOpenArgs	NERDTree.txt	/*NERDTreeCustomOpenArgs*
+NERDTreeDirArrowCollapsible	NERDTree.txt	/*NERDTreeDirArrowCollapsible*
+NERDTreeDirArrowExpandable	NERDTree.txt	/*NERDTreeDirArrowExpandable*
+NERDTreeFunctionality	NERDTree.txt	/*NERDTreeFunctionality*
+NERDTreeGlobalCommands	NERDTree.txt	/*NERDTreeGlobalCommands*
+NERDTreeHighlightCursorline	NERDTree.txt	/*NERDTreeHighlightCursorline*
+NERDTreeHijackNetrw	NERDTree.txt	/*NERDTreeHijackNetrw*
+NERDTreeIgnore	NERDTree.txt	/*NERDTreeIgnore*
+NERDTreeInvalidBookmarks	NERDTree.txt	/*NERDTreeInvalidBookmarks*
+NERDTreeKeymapAPI	NERDTree.txt	/*NERDTreeKeymapAPI*
+NERDTreeLicense	NERDTree.txt	/*NERDTreeLicense*
+NERDTreeMapCWD	NERDTree.txt	/*NERDTreeMapCWD*
+NERDTreeMapChangeRoot	NERDTree.txt	/*NERDTreeMapChangeRoot*
+NERDTreeMapChdir	NERDTree.txt	/*NERDTreeMapChdir*
+NERDTreeMapCloseChildren	NERDTree.txt	/*NERDTreeMapCloseChildren*
+NERDTreeMapCloseDir	NERDTree.txt	/*NERDTreeMapCloseDir*
+NERDTreeMapCustomOpen	NERDTree.txt	/*NERDTreeMapCustomOpen*
+NERDTreeMapDeleteBookmark	NERDTree.txt	/*NERDTreeMapDeleteBookmark*
+NERDTreeMapHelp	NERDTree.txt	/*NERDTreeMapHelp*
+NERDTreeMapJumpFirstChild	NERDTree.txt	/*NERDTreeMapJumpFirstChild*
+NERDTreeMapJumpLastChild	NERDTree.txt	/*NERDTreeMapJumpLastChild*
+NERDTreeMapJumpNextSibling	NERDTree.txt	/*NERDTreeMapJumpNextSibling*
+NERDTreeMapJumpParent	NERDTree.txt	/*NERDTreeMapJumpParent*
+NERDTreeMapJumpPrevSibling	NERDTree.txt	/*NERDTreeMapJumpPrevSibling*
+NERDTreeMapJumpRoot	NERDTree.txt	/*NERDTreeMapJumpRoot*
+NERDTreeMapMenu	NERDTree.txt	/*NERDTreeMapMenu*
+NERDTreeMapOpenExpl	NERDTree.txt	/*NERDTreeMapOpenExpl*
+NERDTreeMapOpenInTab	NERDTree.txt	/*NERDTreeMapOpenInTab*
+NERDTreeMapOpenInTabSilent	NERDTree.txt	/*NERDTreeMapOpenInTabSilent*
+NERDTreeMapOpenRecursively	NERDTree.txt	/*NERDTreeMapOpenRecursively*
+NERDTreeMapOpenSplit	NERDTree.txt	/*NERDTreeMapOpenSplit*
+NERDTreeMapOpenVSplit	NERDTree.txt	/*NERDTreeMapOpenVSplit*
+NERDTreeMapPreviewSplit	NERDTree.txt	/*NERDTreeMapPreviewSplit*
+NERDTreeMapPreviewVSplit	NERDTree.txt	/*NERDTreeMapPreviewVSplit*
+NERDTreeMapQuit	NERDTree.txt	/*NERDTreeMapQuit*
+NERDTreeMapRefresh	NERDTree.txt	/*NERDTreeMapRefresh*
+NERDTreeMapRefreshRoot	NERDTree.txt	/*NERDTreeMapRefreshRoot*
+NERDTreeMapToggleBookmarks	NERDTree.txt	/*NERDTreeMapToggleBookmarks*
+NERDTreeMapToggleFiles	NERDTree.txt	/*NERDTreeMapToggleFiles*
+NERDTreeMapToggleFilters	NERDTree.txt	/*NERDTreeMapToggleFilters*
+NERDTreeMapToggleHidden	NERDTree.txt	/*NERDTreeMapToggleHidden*
+NERDTreeMapToggleZoom	NERDTree.txt	/*NERDTreeMapToggleZoom*
+NERDTreeMapUpdir	NERDTree.txt	/*NERDTreeMapUpdir*
+NERDTreeMapUpdirKeepOpen	NERDTree.txt	/*NERDTreeMapUpdirKeepOpen*
+NERDTreeMappings	NERDTree.txt	/*NERDTreeMappings*
+NERDTreeMarkBookmarks	NERDTree.txt	/*NERDTreeMarkBookmarks*
+NERDTreeMenu	NERDTree.txt	/*NERDTreeMenu*
+NERDTreeMenu-j	NERDTree.txt	/*NERDTreeMenu-j*
+NERDTreeMenu-k	NERDTree.txt	/*NERDTreeMenu-k*
+NERDTreeMenuAPI	NERDTree.txt	/*NERDTreeMenuAPI*
+NERDTreeMenuDown	NERDTree.txt	/*NERDTreeMenuDown*
+NERDTreeMenuUp	NERDTree.txt	/*NERDTreeMenuUp*
+NERDTreeMinimalMenu	NERDTree.txt	/*NERDTreeMinimalMenu*
+NERDTreeMinimalUI	NERDTree.txt	/*NERDTreeMinimalUI*
+NERDTreeMouseMode	NERDTree.txt	/*NERDTreeMouseMode*
+NERDTreeNaturalSort	NERDTree.txt	/*NERDTreeNaturalSort*
+NERDTreeNodeDelimiter	NERDTree.txt	/*NERDTreeNodeDelimiter*
+NERDTreePathListenerAPI	NERDTree.txt	/*NERDTreePathListenerAPI*
+NERDTreeQuitOnOpen	NERDTree.txt	/*NERDTreeQuitOnOpen*
+NERDTreeRender()	NERDTree.txt	/*NERDTreeRender()*
+NERDTreeRespectWildIgnore	NERDTree.txt	/*NERDTreeRespectWildIgnore*
+NERDTreeSettings	NERDTree.txt	/*NERDTreeSettings*
+NERDTreeSettingsDetails	NERDTree.txt	/*NERDTreeSettingsDetails*
+NERDTreeSettingsSummary	NERDTree.txt	/*NERDTreeSettingsSummary*
+NERDTreeShowBookmarks	NERDTree.txt	/*NERDTreeShowBookmarks*
+NERDTreeShowFiles	NERDTree.txt	/*NERDTreeShowFiles*
+NERDTreeShowHidden	NERDTree.txt	/*NERDTreeShowHidden*
+NERDTreeShowLineNumbers	NERDTree.txt	/*NERDTreeShowLineNumbers*
+NERDTreeSortOrder	NERDTree.txt	/*NERDTreeSortOrder*
+NERDTreeStatusline	NERDTree.txt	/*NERDTreeStatusline*
+NERDTreeUseTCD	NERDTree.txt	/*NERDTreeUseTCD*
+NERDTreeWinPos	NERDTree.txt	/*NERDTreeWinPos*
+NERDTreeWinSize	NERDTree.txt	/*NERDTreeWinSize*
+loaded_nerd_tree	NERDTree.txt	/*loaded_nerd_tree*
diff --git a/.vim/pack/vendor/start/nerdtree/lib/nerdtree/bookmark.vim b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/bookmark.vim
new file mode 100644
index 0000000..37be451
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/bookmark.vim
@@ -0,0 +1,365 @@
+" ============================================================================
+" CLASS: Bookmark
+"
+" The Bookmark class serves two purposes:
+"   (1) It is the top-level prototype for new, concrete Bookmark objects.
+"   (2) It provides an interface for client code to query and manipulate the
+"       global list of Bookmark objects within the current Vim session.
+" ============================================================================
+
+
+let s:Bookmark = {}
+let g:NERDTreeBookmark = s:Bookmark
+
+" FUNCTION: Bookmark.activate(nerdtree) {{{1
+function! s:Bookmark.activate(nerdtree, ...)
+    call self.open(a:nerdtree, a:0 ? a:1 : {})
+endfunction
+
+" FUNCTION: Bookmark.AddBookmark(name, path) {{{1
+" Class method to add a new bookmark to the list, if a previous bookmark exists
+" with the same name, just update the path for that bookmark
+function! s:Bookmark.AddBookmark(name, path)
+    for i in s:Bookmark.Bookmarks()
+        if i.name ==# a:name
+            let i.path = a:path
+            return
+        endif
+    endfor
+    call add(s:Bookmark.Bookmarks(), s:Bookmark.New(a:name, a:path))
+endfunction
+
+" FUNCTION: Bookmark.Bookmarks() {{{1
+" Class method to get all bookmarks. Lazily initializes the bookmarks global
+" variable
+function! s:Bookmark.Bookmarks()
+    if !exists('g:NERDTreeBookmarks')
+        let g:NERDTreeBookmarks = []
+    endif
+    return g:NERDTreeBookmarks
+endfunction
+
+" FUNCTION: Bookmark.BookmarkExistsFor(name) {{{1
+" class method that returns 1 if a bookmark with the given name is found, 0
+" otherwise
+function! s:Bookmark.BookmarkExistsFor(name)
+    try
+        call s:Bookmark.BookmarkFor(a:name)
+        return 1
+    catch /^NERDTree.BookmarkNotFoundError/
+        return 0
+    endtry
+endfunction
+
+" FUNCTION: Bookmark.BookmarkFor(name) {{{1
+" Class method that returns the Bookmark object having the specified name.
+" Throws NERDTree.BookmarkNotFoundError if no Bookmark is found.
+function! s:Bookmark.BookmarkFor(name)
+    let l:result = {}
+    for l:bookmark in s:Bookmark.Bookmarks()
+        if l:bookmark.name ==# a:name
+            let l:result = l:bookmark
+            break
+        endif
+    endfor
+    if empty(l:result)
+        throw 'NERDTree.BookmarkNotFoundError: "' . a:name  . '" not found'
+    endif
+    return l:result
+endfunction
+
+" FUNCTION: Bookmark.BookmarkNames() {{{1
+" Class method to return an array of all bookmark names
+function! s:Bookmark.BookmarkNames()
+    let names = []
+    for i in s:Bookmark.Bookmarks()
+        call add(names, i.name)
+    endfor
+    return names
+endfunction
+
+" FUNCTION: Bookmark.CacheBookmarks(silent) {{{1
+" Class method to read all bookmarks from the bookmarks file initialize
+" bookmark objects for each one.
+"
+" Args:
+" silent - dont echo an error msg if invalid bookmarks are found
+function! s:Bookmark.CacheBookmarks(silent)
+    if filereadable(g:NERDTreeBookmarksFile)
+        let g:NERDTreeBookmarks = []
+        let g:NERDTreeInvalidBookmarks = []
+        let bookmarkStrings = readfile(g:NERDTreeBookmarksFile)
+        let invalidBookmarksFound = 0
+        for i in bookmarkStrings
+
+            "ignore blank lines
+            if i !=# ''
+
+                let name = substitute(i, '^\(.\{-}\) .*$', '\1', '')
+                let path = substitute(i, '^.\{-} \(.*\)$', '\1', '')
+                let path = fnamemodify(path, ':p')
+
+                try
+                    let bookmark = s:Bookmark.New(name, g:NERDTreePath.New(path))
+                    call add(g:NERDTreeBookmarks, bookmark)
+                catch /^NERDTree.InvalidArgumentsError/
+                    call add(g:NERDTreeInvalidBookmarks, i)
+                    let invalidBookmarksFound += 1
+                endtry
+            endif
+        endfor
+        if invalidBookmarksFound
+            call s:Bookmark.Write()
+            if !a:silent
+                call nerdtree#echo(invalidBookmarksFound . ' invalid bookmarks were read. See :help NERDTreeInvalidBookmarks for info.')
+            endif
+        endif
+    endif
+endfunction
+
+" FUNCTION: Bookmark.CompareBookmarksByName(firstBookmark, secondBookmark) {{{1
+" Class method that indicates the relative position of two bookmarks when
+" placed in alphabetical order by name. Case-sensitivity is determined by an
+" option. Supports the s:Bookmark.SortBookmarksList() method.
+function! s:Bookmark.CompareBookmarksByName(firstBookmark, secondBookmark)
+    let l:result = 0
+    if g:NERDTreeBookmarksSort ==# 1
+        if a:firstBookmark.name <? a:secondBookmark.name
+            let l:result = -1
+        elseif a:firstBookmark.name >? a:secondBookmark.name
+            let l:result = 1
+        endif
+    elseif g:NERDTreeBookmarksSort ==# 2
+        if a:firstBookmark.name <# a:secondBookmark.name
+            let l:result = -1
+        elseif a:firstBookmark.name ># a:secondBookmark.name
+            let l:result = 1
+        endif
+    endif
+    return l:result
+endfunction
+
+" FUNCTION: Bookmark.ClearAll() {{{1
+" Class method to delete all bookmarks.
+function! s:Bookmark.ClearAll()
+    for i in s:Bookmark.Bookmarks()
+        call i.delete()
+    endfor
+    call s:Bookmark.Write()
+endfunction
+
+" FUNCTION: Bookmark.delete() {{{1
+" Delete this bookmark. If the node for this bookmark is under the current
+" root, then recache bookmarks for its Path object
+function! s:Bookmark.delete()
+    call remove(s:Bookmark.Bookmarks(), index(s:Bookmark.Bookmarks(), self))
+    call s:Bookmark.Write()
+endfunction
+
+" FUNCTION: s:Edit() {{{1
+" opens the NERDTreeBookmarks file for manual editing
+function! s:Bookmark.Edit()
+    call nerdtree#exec('wincmd w', 1)
+    call nerdtree#exec('edit '.g:NERDTreeBookmarksFile, 1)
+endfunction
+
+" FUNCTION: Bookmark.getNode(nerdtree, searchFromAbsoluteRoot) {{{1
+" Returns the tree node object associated with this Bookmark.
+" Throws NERDTree.BookmarkedNodeNotFoundError if the node is not found.
+"
+" Args:
+" searchFromAbsoluteRoot: boolean flag, search from the highest cached node
+"   if true and from the current tree root if false
+function! s:Bookmark.getNode(nerdtree, searchFromAbsoluteRoot)
+    if a:searchFromAbsoluteRoot
+        let l:searchRoot = a:nerdtree.root.AbsoluteTreeRoot()
+    else
+        let l:searchRoot = a:nerdtree.root
+    endif
+    let l:targetNode = l:searchRoot.findNode(self.path)
+    if empty(l:targetNode)
+        throw 'NERDTree.BookmarkedNodeNotFoundError: node for bookmark "' . self.name . '" not found'
+    endif
+    return l:targetNode
+endfunction
+
+" FUNCTION: Bookmark.GetNodeForName(name, searchFromAbsoluteRoot, nerdtree) {{{1
+" Class method that returns the tree node object for the Bookmark with the
+" given name. Throws NERDTree.BookmarkNotFoundError if a Bookmark with the
+" name does not exist. Throws NERDTree.BookmarkedNodeNotFoundError if a
+" tree node for the named Bookmark could not be found.
+function! s:Bookmark.GetNodeForName(name, searchFromAbsoluteRoot, nerdtree)
+    let l:bookmark = s:Bookmark.BookmarkFor(a:name)
+    return l:bookmark.getNode(a:nerdtree, a:searchFromAbsoluteRoot)
+endfunction
+
+" FUNCTION: Bookmark.GetSelected() {{{1
+" returns the Bookmark the cursor is over, or {}
+function! s:Bookmark.GetSelected()
+    let line = getline('.')
+    let name = substitute(line, '^>\(.\{-}\) .\+$', '\1', '')
+    if name !=# line
+        try
+            return s:Bookmark.BookmarkFor(name)
+        catch /^NERDTree.BookmarkNotFoundError/
+            return {}
+        endtry
+    endif
+    return {}
+endfunction
+
+" FUNCTION: Bookmark.InvalidBookmarks() {{{1
+" Class method to get all invalid bookmark strings read from the bookmarks
+" file
+function! s:Bookmark.InvalidBookmarks()
+    if !exists('g:NERDTreeInvalidBookmarks')
+        let g:NERDTreeInvalidBookmarks = []
+    endif
+    return g:NERDTreeInvalidBookmarks
+endfunction
+
+" FUNCTION: Bookmark.mustExist() {{{1
+function! s:Bookmark.mustExist()
+    if !self.path.exists()
+        call s:Bookmark.CacheBookmarks(1)
+        throw 'NERDTree.BookmarkPointsToInvalidLocationError: the bookmark "'.
+            \ self.name .'" points to a non existing location: "'. self.path.str()
+    endif
+endfunction
+
+" FUNCTION: Bookmark.New(name, path) {{{1
+" Create a new bookmark object with the given name and path object
+function! s:Bookmark.New(name, path)
+    if a:name =~# ' '
+        throw 'NERDTree.IllegalBookmarkNameError: illegal name:' . a:name
+    endif
+
+    let newBookmark = copy(self)
+    let newBookmark.name = a:name
+    let newBookmark.path = a:path
+    return newBookmark
+endfunction
+
+" FUNCTION: Bookmark.open(nerdtree, [options]) {{{1
+"Args:
+"
+"nerdtree: the tree to load open the bookmark in
+"
+"A dictionary containing the following keys (all optional):
+"  'where': Specifies whether the node should be opened in new split/tab or in
+"           the previous window. Can be either 'v' (vertical split), 'h'
+"           (horizontal split), 't' (new tab) or 'p' (previous window).
+"  'reuse': if a window is displaying the file then jump the cursor there
+"  'keepopen': dont close the tree window
+"  'stay': open the file, but keep the cursor in the tree win
+"
+function! s:Bookmark.open(nerdtree, ...)
+    let opts = a:0 ? a:1 : {}
+
+    if nerdtree#closeBookmarksOnOpen()
+        call a:nerdtree.ui.toggleShowBookmarks()
+    endif
+
+    if self.path.isDirectory && !has_key(opts, 'where')
+        call self.toRoot(a:nerdtree)
+    else
+        let opener = g:NERDTreeOpener.New(self.path, opts)
+        call opener.open(self)
+    endif
+endfunction
+
+" FUNCTION: Bookmark.openInNewTab(options) {{{1
+" Create a new bookmark object with the given name and path object
+function! s:Bookmark.openInNewTab(options)
+    call nerdtree#deprecated('Bookmark.openInNewTab', 'is deprecated, use open() instead')
+    call self.open(a:options)
+endfunction
+
+" FUNCTION: Bookmark.setPath(path) {{{1
+" makes this bookmark point to the given path
+function! s:Bookmark.setPath(path)
+    let self.path = a:path
+endfunction
+
+" FUNCTION: Bookmark.SortBookmarksList() {{{1
+" Class method that sorts the global list of bookmarks alphabetically by name.
+" Note that case-sensitivity is determined by a user option.
+function! s:Bookmark.SortBookmarksList()
+    call sort(s:Bookmark.Bookmarks(), s:Bookmark.CompareBookmarksByName, s:Bookmark)
+endfunction
+
+" FUNCTION: Bookmark.str() {{{1
+" Get the string that should be rendered in the view for this bookmark
+function! s:Bookmark.str()
+    let pathStrMaxLen = winwidth(g:NERDTree.GetWinNum()) - 4 - strdisplaywidth(self.name)
+    if &number
+        let pathStrMaxLen = pathStrMaxLen - &numberwidth
+    endif
+
+    let pathStr = self.path.str({'format': 'UI'})
+    if strdisplaywidth(pathStr) > pathStrMaxLen
+        while strdisplaywidth(pathStr) > pathStrMaxLen && strchars(pathStr) > 0
+            let pathStr = substitute(pathStr, '^.', '', '')
+        endwhile
+        let pathStr = '<' . pathStr
+    endif
+    return '>' . self.name . ' ' . pathStr
+endfunction
+
+" FUNCTION: Bookmark.toRoot(nerdtree) {{{1
+" Set the root of the given NERDTree to the node for this Bookmark. If a node
+" for this Bookmark does not exist, a new one is initialized.
+function! s:Bookmark.toRoot(nerdtree)
+    if self.validate()
+        try
+            let l:targetNode = self.getNode(a:nerdtree, 1)
+            call l:targetNode.closeChildren()
+        catch /^NERDTree.BookmarkedNodeNotFoundError/
+            let l:targetNode = g:NERDTreeFileNode.New(s:Bookmark.BookmarkFor(self.name).path, a:nerdtree)
+        endtry
+        call a:nerdtree.changeRoot(l:targetNode)
+    endif
+endfunction
+
+" FUNCTION: Bookmark.ToRoot(name, nerdtree) {{{1
+" Class method that makes the Bookmark with the given name the root of
+" specified NERDTree.
+function! s:Bookmark.ToRoot(name, nerdtree)
+    let l:bookmark = s:Bookmark.BookmarkFor(a:name)
+    call l:bookmark.toRoot(a:nerdtree)
+endfunction
+
+" FUNCTION: Bookmark.validate() {{{1
+function! s:Bookmark.validate()
+    if self.path.exists()
+        return 1
+    else
+        call s:Bookmark.CacheBookmarks(1)
+        call nerdtree#echo(self.name . 'now points to an invalid location. See :help NERDTreeInvalidBookmarks for info.')
+        return 0
+    endif
+endfunction
+
+" FUNCTION: Bookmark.Write() {{{1
+" Class method to write all bookmarks to the bookmarks file
+function! s:Bookmark.Write()
+    let bookmarkStrings = []
+    for i in s:Bookmark.Bookmarks()
+        call add(bookmarkStrings, i.name . ' ' . fnamemodify(i.path.str(), ':~'))
+    endfor
+
+    "add a blank line before the invalid ones
+    call add(bookmarkStrings, '')
+
+    for j in s:Bookmark.InvalidBookmarks()
+        call add(bookmarkStrings, j)
+    endfor
+
+    try
+        call writefile(bookmarkStrings, g:NERDTreeBookmarksFile)
+    catch
+        call nerdtree#echoError('Failed to write bookmarks file. Make sure g:NERDTreeBookmarksFile points to a valid location.')
+    endtry
+endfunction
+
+" vim: set sw=4 sts=4 et fdm=marker:
diff --git a/.vim/pack/vendor/start/nerdtree/lib/nerdtree/creator.vim b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/creator.vim
new file mode 100644
index 0000000..b9d45dc
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/creator.vim
@@ -0,0 +1,402 @@
+" ============================================================================
+" CLASS: Creator
+"
+" This class is responsible for creating NERDTree instances.  The new NERDTree
+" may be a tab tree, a window tree, or a mirrored tree.  In the process of
+" creating a NERDTree, it sets up all of the window and buffer options and key
+" mappings etc.
+" ============================================================================
+
+
+let s:Creator = {}
+let g:NERDTreeCreator = s:Creator
+
+" FUNCTION: s:Creator._bindMappings() {{{1
+function! s:Creator._bindMappings()
+    call g:NERDTreeKeyMap.BindAll()
+
+    command! -buffer -nargs=? Bookmark :call nerdtree#ui_glue#bookmarkNode('<args>')
+    command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=1 RevealBookmark :call nerdtree#ui_glue#revealBookmark('<args>')
+    command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=1 OpenBookmark call nerdtree#ui_glue#openBookmark('<args>')
+    command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=* ClearBookmarks call nerdtree#ui_glue#clearBookmarks('<args>')
+    command! -buffer -complete=customlist,nerdtree#completeBookmarks -nargs=+ BookmarkToRoot call g:NERDTreeBookmark.ToRoot('<args>', b:NERDTree)
+    command! -buffer -nargs=0 ClearAllBookmarks call g:NERDTreeBookmark.ClearAll() <bar> call b:NERDTree.render()
+    command! -buffer -nargs=0 ReadBookmarks call g:NERDTreeBookmark.CacheBookmarks(0) <bar> call b:NERDTree.render()
+    command! -buffer -nargs=0 WriteBookmarks call g:NERDTreeBookmark.Write()
+    command! -buffer -nargs=0 EditBookmarks call g:NERDTreeBookmark.Edit()
+endfunction
+
+" FUNCTION: s:Creator._broadcastInitEvent() {{{1
+function! s:Creator._broadcastInitEvent()
+    if exists('#User#NERDTreeInit')
+        doautocmd User NERDTreeInit
+    endif
+endfunction
+
+" FUNCTION: s:Creator.BufNamePrefix() {{{1
+function! s:Creator.BufNamePrefix()
+    return 'NERD_tree_'
+endfunction
+
+" FUNCTION: s:Creator.CreateTabTree(a:name) {{{1
+function! s:Creator.CreateTabTree(name)
+    let creator = s:Creator.New()
+    call creator.createTabTree(a:name)
+endfunction
+
+" FUNCTION: s:Creator.createTabTree(a:name) {{{1
+" name: the name of a bookmark or a directory
+function! s:Creator.createTabTree(name)
+    let l:path = self._pathForString(a:name)
+
+    " Abort if an exception was thrown (i.e., if the bookmark or directory
+    " does not exist).
+    if empty(l:path)
+        return
+    endif
+
+    " Obey the user's preferences for changing the working directory.
+    if g:NERDTreeChDirMode != 0
+        call l:path.changeToDir()
+    endif
+
+    if g:NERDTree.ExistsForTab()
+        call g:NERDTree.Close()
+        call self._removeTreeBufForTab()
+    endif
+
+    call self._createTreeWin()
+    call self._createNERDTree(l:path, 'tab')
+    call b:NERDTree.render()
+    call b:NERDTree.root.putCursorHere(0, 0)
+
+    call self._broadcastInitEvent()
+endfunction
+
+" FUNCTION: s:Creator.CreateWindowTree(dir) {{{1
+function! s:Creator.CreateWindowTree(dir)
+    let creator = s:Creator.New()
+    call creator.createWindowTree(a:dir)
+endfunction
+
+" FUNCTION: s:Creator.createWindowTree(dir) {{{1
+function! s:Creator.createWindowTree(dir)
+    try
+        let path = g:NERDTreePath.New(a:dir)
+    catch /^NERDTree.InvalidArgumentsError/
+        call nerdtree#echo('Invalid directory name:' . a:dir)
+        return
+    endtry
+
+    "we want the directory buffer to disappear when we do the :edit below
+    setlocal bufhidden=wipe
+
+    let previousBuf = expand('#')
+
+    "we need a unique name for each window tree buffer to ensure they are
+    "all independent
+    exec g:NERDTreeCreatePrefix . ' edit ' . self._nextBufferName()
+
+    call self._createNERDTree(path, 'window')
+    let b:NERDTree._previousBuf = bufnr(previousBuf)
+    call self._setCommonBufOptions()
+
+    call b:NERDTree.render()
+
+    call self._broadcastInitEvent()
+endfunction
+
+" FUNCTION: s:Creator._createNERDTree(path) {{{1
+function! s:Creator._createNERDTree(path, type)
+    let b:NERDTree = g:NERDTree.New(a:path, a:type)
+
+    " TODO: This assignment is kept for compatibility reasons.  Many other
+    " plugins use b:NERDTreeRoot instead of b:NERDTree.root.  Remove this
+    " assignment in the future.
+    let b:NERDTreeRoot = b:NERDTree.root
+
+    call b:NERDTree.root.open()
+endfunction
+
+" FUNCTION: s:Creator.CreateMirror() {{{1
+function! s:Creator.CreateMirror()
+    let creator = s:Creator.New()
+    call creator.createMirror()
+endfunction
+
+" FUNCTION: s:Creator.createMirror() {{{1
+function! s:Creator.createMirror()
+    "get the names off all the nerd tree buffers
+    let treeBufNames = []
+    for i in range(1, tabpagenr('$'))
+        let nextName = self._tabpagevar(i, 'NERDTreeBufName')
+        if nextName != -1 && (!exists('t:NERDTreeBufName') || nextName != t:NERDTreeBufName)
+            call add(treeBufNames, nextName)
+        endif
+    endfor
+    let treeBufNames = self._uniq(treeBufNames)
+
+    "map the option names (that the user will be prompted with) to the nerd
+    "tree buffer names
+    let options = {}
+    let i = 0
+    while i < len(treeBufNames)
+        let bufName = treeBufNames[i]
+        let treeRoot = getbufvar(bufName, 'NERDTree').root
+        let options[i+1 . '. ' . treeRoot.path.str() . '  (buf name: ' . bufName . ')'] = bufName
+        let i = i + 1
+    endwhile
+
+    "work out which tree to mirror, if there is more than 1 then ask the user
+    let bufferName = ''
+    if len(keys(options)) > 1
+        let choices = ['Choose a tree to mirror']
+        let choices = extend(choices, sort(keys(options)))
+        let choice = inputlist(choices)
+        if choice < 1 || choice > len(options) || choice ==# ''
+            return
+        endif
+
+        let bufferName = options[sort(keys(options))[choice-1]]
+    elseif len(keys(options)) ==# 1
+        let bufferName = values(options)[0]
+    else
+        call nerdtree#echo('No trees to mirror')
+        return
+    endif
+
+    if g:NERDTree.ExistsForTab() && g:NERDTree.IsOpen()
+        call g:NERDTree.Close()
+    endif
+
+    let t:NERDTreeBufName = bufferName
+    call self._createTreeWin()
+    exec 'buffer ' .  bufferName
+    call b:NERDTree.ui.restoreScreenState()
+    if !&hidden
+        call b:NERDTree.render()
+    endif
+endfunction
+
+" FUNCTION: s:Creator._createTreeWin() {{{1
+" Initialize the NERDTree window.  Open the window, size it properly, set all
+" local options, etc.
+function! s:Creator._createTreeWin()
+    let l:splitLocation = g:NERDTreeWinPos ==# 'left' ? 'topleft ' : 'botright '
+    let l:splitSize = g:NERDTreeWinSize
+
+    if !g:NERDTree.ExistsForTab()
+        let t:NERDTreeBufName = self._nextBufferName()
+        silent! execute l:splitLocation . 'vertical ' . l:splitSize . ' new'
+        silent! execute 'edit ' . t:NERDTreeBufName
+        silent! execute 'vertical resize '. l:splitSize
+    else
+        silent! execute l:splitLocation . 'vertical ' . l:splitSize . ' split'
+        silent! execute 'buffer ' . t:NERDTreeBufName
+    endif
+
+    setlocal winfixwidth
+
+    call self._setCommonBufOptions()
+
+    if has('patch-7.4.1925')
+        clearjumps
+    endif
+
+endfunction
+
+" FUNCTION: s:Creator._isBufHidden(nr) {{{1
+function! s:Creator._isBufHidden(nr)
+    redir => bufs
+    silent ls!
+    redir END
+
+    return bufs =~ a:nr . '..h'
+endfunction
+
+" FUNCTION: s:Creator.New() {{{1
+function! s:Creator.New()
+    let newCreator = copy(self)
+    return newCreator
+endfunction
+
+" FUNCTION: s:Creator._nextBufferName() {{{1
+" returns the buffer name for the next nerd tree
+function! s:Creator._nextBufferName()
+    let name = s:Creator.BufNamePrefix() . self._nextBufferNumber()
+    return name
+endfunction
+
+" FUNCTION: s:Creator._nextBufferNumber() {{{1
+" the number to add to the nerd tree buffer name to make the buf name unique
+function! s:Creator._nextBufferNumber()
+    if !exists('s:Creator._NextBufNum')
+        let s:Creator._NextBufNum = 1
+    else
+        let s:Creator._NextBufNum += 1
+    endif
+
+    return s:Creator._NextBufNum
+endfunction
+
+" FUNCTION: s:Creator._pathForString(str) {{{1
+" find a bookmark or adirectory for the given string
+function! s:Creator._pathForString(str)
+    let path = {}
+    if g:NERDTreeBookmark.BookmarkExistsFor(a:str)
+        let path = g:NERDTreeBookmark.BookmarkFor(a:str).path
+    else
+        let dir = a:str ==# '' ? getcwd() : a:str
+
+        "hack to get an absolute path if a relative path is given
+        if dir =~# '^\.'
+            let dir = getcwd() . nerdtree#slash() . dir
+        endif
+
+        "hack to prevent removing slash if dir is the root of the file system.
+        if dir !=# '/'
+            let dir = g:NERDTreePath.Resolve(dir)
+        endif
+
+        try
+            let path = g:NERDTreePath.New(dir)
+        catch /^NERDTree.InvalidArgumentsError/
+            call nerdtree#echo('No bookmark or directory found for: ' . a:str)
+            return {}
+        endtry
+    endif
+    if !path.isDirectory
+        let path = path.getParent()
+    endif
+
+    return path
+endfunction
+
+" Function: s:Creator._removeTreeBufForTab()   {{{1
+function! s:Creator._removeTreeBufForTab()
+    let buf = bufnr(t:NERDTreeBufName)
+
+    "if &hidden is not set then it will already be gone
+    if buf != -1
+
+        "nerdtree buf may be mirrored/displayed elsewhere
+        if self._isBufHidden(buf)
+            exec 'bwipeout ' . buf
+        endif
+
+    endif
+
+    unlet t:NERDTreeBufName
+endfunction
+
+" FUNCTION: s:Creator._setCommonBufOptions() {{{1
+function! s:Creator._setCommonBufOptions()
+
+    " Options for a non-file/control buffer.
+    setlocal bufhidden=hide
+    setlocal buftype=nofile
+    setlocal noswapfile
+
+    " Options for controlling buffer/window appearance.
+    setlocal foldcolumn=0
+    setlocal foldmethod=manual
+    setlocal nobuflisted
+    setlocal nofoldenable
+    setlocal nolist
+    setlocal nospell
+    setlocal nowrap
+
+    if g:NERDTreeShowLineNumbers
+        setlocal number
+    else
+        setlocal nonumber
+        if v:version >= 703
+            setlocal norelativenumber
+        endif
+    endif
+
+    iabc <buffer>
+
+    if g:NERDTreeHighlightCursorline
+        setlocal cursorline
+    endif
+
+    call self._setupStatusline()
+    call self._bindMappings()
+
+    setlocal filetype=nerdtree
+endfunction
+
+" FUNCTION: s:Creator._setupStatusline() {{{1
+function! s:Creator._setupStatusline()
+    if g:NERDTreeStatusline != -1
+        let &l:statusline = g:NERDTreeStatusline
+    endif
+endfunction
+
+" FUNCTION: s:Creator._tabpagevar(tabnr, var) {{{1
+function! s:Creator._tabpagevar(tabnr, var)
+    let currentTab = tabpagenr()
+    let old_ei = &eventignore
+    set eventignore=all
+
+    try
+        exec 'tabnext ' . a:tabnr
+        let v = -1
+        if exists('t:' . a:var)
+            exec 'let v = t:' . a:var
+        endif
+        exec 'tabnext ' . currentTab
+
+    finally
+        let &eventignore = old_ei
+    endtry
+
+    return v
+endfunction
+
+" FUNCTION: s:Creator.ToggleTabTree(dir) {{{1
+function! s:Creator.ToggleTabTree(dir)
+    let creator = s:Creator.New()
+    call creator.toggleTabTree(a:dir)
+endfunction
+
+" FUNCTION: s:Creator.toggleTabTree(dir) {{{1
+" Toggles the NERD tree. I.e if the NERD tree is open, it is closed. If it is
+" closed, it is restored or initialized. If dir is not empty, it will be set
+" as the new root.
+"
+" Args:
+" dir: the full path for the root node (is used if the NERD tree is being
+" initialized, or to change the root to a new dir.)
+function! s:Creator.toggleTabTree(dir)
+    if g:NERDTree.ExistsForTab()
+        if !g:NERDTree.IsOpen()
+            call self._createTreeWin()
+            if !empty(a:dir) && a:dir !=# b:NERDTree.root.path.str()
+                call self.createTabTree(a:dir)
+            elseif !&hidden
+                call b:NERDTree.render()
+            endif
+            call b:NERDTree.ui.restoreScreenState()
+        else
+            call g:NERDTree.Close()
+        endif
+    else
+        call self.createTabTree(a:dir)
+    endif
+endfunction
+
+" Function: s:Creator._uniq(list)   {{{1
+" returns a:list without duplicates
+function! s:Creator._uniq(list)
+  let uniqlist = []
+  for elem in a:list
+    if index(uniqlist, elem) ==# -1
+      let uniqlist += [elem]
+    endif
+  endfor
+  return uniqlist
+endfunction
+
+" vim: set sw=4 sts=4 et fdm=marker:
diff --git a/.vim/pack/vendor/start/nerdtree/lib/nerdtree/event.vim b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/event.vim
new file mode 100644
index 0000000..964e8ff
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/event.vim
@@ -0,0 +1,13 @@
+"CLASS: Event
+"============================================================
+let s:Event = {}
+let g:NERDTreeEvent = s:Event
+
+function! s:Event.New(nerdtree, subject, action, params) abort
+    let newObj = copy(self)
+    let newObj.nerdtree = a:nerdtree
+    let newObj.subject = a:subject
+    let newObj.action = a:action
+    let newObj.params = a:params
+    return newObj
+endfunction
diff --git a/.vim/pack/vendor/start/nerdtree/lib/nerdtree/flag_set.vim b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/flag_set.vim
new file mode 100644
index 0000000..7552867
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/flag_set.vim
@@ -0,0 +1,58 @@
+"CLASS: FlagSet
+"============================================================
+let s:FlagSet = {}
+let g:NERDTreeFlagSet = s:FlagSet
+
+"FUNCTION: FlagSet.addFlag(scope, flag) {{{1
+function! s:FlagSet.addFlag(scope, flag)
+    let flags = self._flagsForScope(a:scope)
+    if index(flags, a:flag) == -1
+        call add(flags, a:flag)
+    end
+endfunction
+
+"FUNCTION: FlagSet.clearFlags(scope) {{{1
+function! s:FlagSet.clearFlags(scope)
+    let self._flags[a:scope] = []
+endfunction
+
+"FUNCTION: FlagSet._flagsForScope(scope) {{{1
+function! s:FlagSet._flagsForScope(scope)
+    if !has_key(self._flags, a:scope)
+        let self._flags[a:scope] = []
+    endif
+    return self._flags[a:scope]
+endfunction
+
+"FUNCTION: FlagSet.New() {{{1
+function! s:FlagSet.New()
+    let newObj = copy(self)
+    let newObj._flags = {}
+    return newObj
+endfunction
+
+"FUNCTION: FlagSet.removeFlag(scope, flag) {{{1
+function! s:FlagSet.removeFlag(scope, flag)
+    let flags = self._flagsForScope(a:scope)
+
+    let i = index(flags, a:flag)
+    if i >= 0
+        call remove(flags, i)
+    endif
+endfunction
+
+"FUNCTION: FlagSet.renderToString() {{{1
+function! s:FlagSet.renderToString()
+    let flagstring = ''
+    for i in values(self._flags)
+        let flagstring .= join(i)
+    endfor
+
+    if len(flagstring) == 0
+        return ''
+    endif
+
+    return '[' . flagstring . ']'
+endfunction
+
+" vim: set sw=4 sts=4 et fdm=marker:
diff --git a/.vim/pack/vendor/start/nerdtree/lib/nerdtree/key_map.vim b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/key_map.vim
new file mode 100644
index 0000000..ed79167
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/key_map.vim
@@ -0,0 +1,164 @@
+"CLASS: KeyMap
+"============================================================
+let s:KeyMap = {}
+let g:NERDTreeKeyMap = s:KeyMap
+let s:keyMaps = {}
+
+"FUNCTION: KeyMap.All() {{{1
+function! s:KeyMap.All()
+    let sortedKeyMaps = values(s:keyMaps)
+    call sort(sortedKeyMaps, s:KeyMap.Compare, s:KeyMap)
+
+    return sortedKeyMaps
+endfunction
+
+"FUNCTION: KeyMap.Compare(keyMap1, keyMap2) {{{1
+function! s:KeyMap.Compare(keyMap1, keyMap2)
+
+    if a:keyMap1.key >? a:keyMap2.key
+        return 1
+    endif
+
+    if a:keyMap1.key <? a:keyMap2.key
+        return -1
+    endif
+
+    return 0
+endfunction
+
+"FUNCTION: KeyMap.FindFor(key, scope) {{{1
+function! s:KeyMap.FindFor(key, scope)
+    return get(s:keyMaps, a:key . a:scope, {})
+endfunction
+
+"FUNCTION: KeyMap.BindAll() {{{1
+function! s:KeyMap.BindAll()
+    for i in values(s:keyMaps)
+        call i.bind()
+    endfor
+endfunction
+
+"FUNCTION: KeyMap.bind() {{{1
+function! s:KeyMap.bind()
+    " If the key sequence we're trying to map contains any '<>' notation, we
+    " must replace each of the '<' characters with '<lt>' to ensure the string
+    " is not translated into its corresponding keycode during the later part
+    " of the map command below
+    " :he <>
+    let specialNotationRegex = '\m<\([[:alnum:]_-]\+>\)'
+    if self.key =~# specialNotationRegex
+        let keymapInvokeString = substitute(self.key, specialNotationRegex, '<lt>\1', 'g')
+    else
+        let keymapInvokeString = self.key
+    endif
+    let keymapInvokeString = escape(keymapInvokeString, '\"')
+
+    let premap = self.key ==# '<LeftRelease>' ? ' <LeftRelease>' : ' '
+
+    exec 'nnoremap <buffer> <silent> '. self.key . premap . ':call nerdtree#ui_glue#invokeKeyMap("'. keymapInvokeString .'")<cr>'
+endfunction
+
+"FUNCTION: KeyMap.Remove(key, scope) {{{1
+function! s:KeyMap.Remove(key, scope)
+    return remove(s:keyMaps, a:key . a:scope)
+endfunction
+
+"FUNCTION: KeyMap.invoke() {{{1
+"Call the KeyMaps callback function
+function! s:KeyMap.invoke(...)
+    let l:Callback = type(self.callback) ==# type(function('tr')) ? self.callback : function(self.callback)
+    if a:0
+        call l:Callback(a:1)
+    else
+        call l:Callback()
+    endif
+endfunction
+
+"FUNCTION: KeyMap.Invoke() {{{1
+"Find a keymapping for a:key and the current scope invoke it.
+"
+"Scope is determined as follows:
+"   * if the cursor is on a dir node then DirNode
+"   * if the cursor is on a file node then FileNode
+"   * if the cursor is on a bookmark then Bookmark
+"
+"If a keymap has the scope of 'all' then it will be called if no other keymap
+"is found for a:key and the scope.
+function! s:KeyMap.Invoke(key)
+
+    "required because clicking the command window below another window still
+    "invokes the <LeftRelease> mapping - but changes the window cursor
+    "is in first
+    "
+    "TODO: remove this check when the vim bug is fixed
+    if !g:NERDTree.ExistsForBuf()
+        return {}
+    endif
+
+    let node = g:NERDTreeFileNode.GetSelected()
+    if !empty(node)
+
+        "try file node
+        if !node.path.isDirectory
+            let km = s:KeyMap.FindFor(a:key, 'FileNode')
+            if !empty(km)
+                return km.invoke(node)
+            endif
+        endif
+
+        "try dir node
+        if node.path.isDirectory
+            let km = s:KeyMap.FindFor(a:key, 'DirNode')
+            if !empty(km)
+                return km.invoke(node)
+            endif
+        endif
+
+        "try generic node
+        let km = s:KeyMap.FindFor(a:key, 'Node')
+        if !empty(km)
+            return km.invoke(node)
+        endif
+
+    endif
+
+    "try bookmark
+    let bm = g:NERDTreeBookmark.GetSelected()
+    if !empty(bm)
+        let km = s:KeyMap.FindFor(a:key, 'Bookmark')
+        if !empty(km)
+            return km.invoke(bm)
+        endif
+    endif
+
+    "try all
+    let km = s:KeyMap.FindFor(a:key, 'all')
+    if !empty(km)
+        return km.invoke()
+    endif
+endfunction
+
+"FUNCTION: KeyMap.Create(options) {{{1
+function! s:KeyMap.Create(options)
+    let opts = extend({'scope': 'all', 'quickhelpText': ''}, copy(a:options))
+
+    "dont override other mappings unless the 'override' option is given
+    if get(opts, 'override', 0) ==# 0 && !empty(s:KeyMap.FindFor(opts['key'], opts['scope']))
+        return
+    end
+
+    let newKeyMap = copy(self)
+    let newKeyMap.key = opts['key']
+    let newKeyMap.quickhelpText = opts['quickhelpText']
+    let newKeyMap.callback = opts['callback']
+    let newKeyMap.scope = opts['scope']
+
+    call s:KeyMap.Add(newKeyMap)
+endfunction
+
+"FUNCTION: KeyMap.Add(keymap) {{{1
+function! s:KeyMap.Add(keymap)
+    let s:keyMaps[a:keymap.key . a:keymap.scope] = a:keymap
+endfunction
+
+" vim: set sw=4 sts=4 et fdm=marker:
diff --git a/.vim/pack/vendor/start/nerdtree/lib/nerdtree/menu_controller.vim b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/menu_controller.vim
new file mode 100644
index 0000000..952c67b
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/menu_controller.vim
@@ -0,0 +1,211 @@
+"CLASS: MenuController
+"============================================================
+let s:MenuController = {}
+let g:NERDTreeMenuController = s:MenuController
+
+"FUNCTION: MenuController.New(menuItems) {{{1
+"create a new menu controller that operates on the given menu items
+function! s:MenuController.New(menuItems)
+    let newMenuController =  copy(self)
+    if a:menuItems[0].isSeparator()
+        let newMenuController.menuItems = a:menuItems[1:-1]
+    else
+        let newMenuController.menuItems = a:menuItems
+    endif
+    return newMenuController
+endfunction
+
+" FUNCTION: s:MenuController.isMinimal() {{{1
+function! s:MenuController.isMinimal()
+    return g:NERDTreeMinimalMenu
+endfunction
+
+" FUNCTION: MenuController.showMenu() {{{1
+" Enter the main loop of the NERDTree menu, prompting the user to select
+" a menu item.
+function! s:MenuController.showMenu()
+    call self._saveOptions()
+
+    try
+        let self.selection = 0
+        let l:done = 0
+
+        while !l:done
+            if has('nvim')
+                mode
+            else
+                redraw!
+            endif
+            call self._echoPrompt()
+
+            let l:key = nr2char(getchar())
+            let l:done = self._handleKeypress(l:key)
+        endwhile
+    finally
+        call self._restoreOptions()
+
+        " Redraw when Ctrl-C or Esc is received.
+        if !l:done || self.selection ==# -1
+            redraw!
+        endif
+    endtry
+
+    if self.selection !=# -1
+        let l:m = self._current()
+        call l:m.execute()
+    endif
+endfunction
+
+"FUNCTION: MenuController._echoPrompt() {{{1
+function! s:MenuController._echoPrompt()
+    let navHelp = 'Use ' . g:NERDTreeMenuDown . '/' . g:NERDTreeMenuUp . '/enter'
+
+    if self.isMinimal()
+        let selection = self.menuItems[self.selection].text
+        let keyword = matchstr(selection, '[^ ]*([^ ]*')
+
+        let shortcuts = map(copy(self.menuItems), "v:val['shortcut']")
+        let shortcuts[self.selection] = ' ' . keyword . ' '
+
+        echo 'Menu: [' . join(shortcuts, ',') . '] (' . navHelp . ' or shortcut): '
+    else
+        echo 'NERDTree Menu. ' . navHelp . ', or the shortcuts indicated'
+        echo '========================================================='
+
+        for i in range(0, len(self.menuItems)-1)
+            if self.selection ==# i
+                echo '> ' . self.menuItems[i].text
+            else
+                echo '  ' . self.menuItems[i].text
+            endif
+        endfor
+    endif
+endfunction
+
+"FUNCTION: MenuController._current(key) {{{1
+"get the MenuItem that is currently selected
+function! s:MenuController._current()
+    return self.menuItems[self.selection]
+endfunction
+
+"FUNCTION: MenuController._handleKeypress(key) {{{1
+"change the selection (if appropriate) and return 1 if the user has made
+"their choice, 0 otherwise
+function! s:MenuController._handleKeypress(key)
+    if a:key ==# g:NERDTreeMenuDown
+        call self._cursorDown()
+    elseif a:key ==# g:NERDTreeMenuUp
+        call self._cursorUp()
+    elseif a:key ==# nr2char(27) "escape
+        let self.selection = -1
+        return 1
+    elseif a:key ==# "\r" || a:key ==# "\n" "enter and ctrl-j
+        return 1
+    else
+        let index = self._nextIndexFor(a:key)
+        if index !=# -1
+            let self.selection = index
+            if len(self._allIndexesFor(a:key)) ==# 1
+                return 1
+            endif
+        endif
+    endif
+
+    return 0
+endfunction
+
+"FUNCTION: MenuController._allIndexesFor(shortcut) {{{1
+"get indexes to all menu items with the given shortcut
+function! s:MenuController._allIndexesFor(shortcut)
+    let toReturn = []
+
+    for i in range(0, len(self.menuItems)-1)
+        if self.menuItems[i].shortcut ==# a:shortcut
+            call add(toReturn, i)
+        endif
+    endfor
+
+    return toReturn
+endfunction
+
+"FUNCTION: MenuController._nextIndexFor(shortcut) {{{1
+"get the index to the next menu item with the given shortcut, starts from the
+"current cursor location and wraps around to the top again if need be
+function! s:MenuController._nextIndexFor(shortcut)
+    for i in range(self.selection+1, len(self.menuItems)-1)
+        if self.menuItems[i].shortcut ==# a:shortcut
+            return i
+        endif
+    endfor
+
+    for i in range(0, self.selection)
+        if self.menuItems[i].shortcut ==# a:shortcut
+            return i
+        endif
+    endfor
+
+    return -1
+endfunction
+
+"FUNCTION: MenuController._setCmdheight() {{{1
+"sets &cmdheight to whatever is needed to display the menu
+function! s:MenuController._setCmdheight()
+    if self.isMinimal()
+        let &cmdheight = 1
+    else
+        let &cmdheight = len(self.menuItems) + 3
+    endif
+endfunction
+
+"FUNCTION: MenuController._saveOptions() {{{1
+"set any vim options that are required to make the menu work (saving their old
+"values)
+function! s:MenuController._saveOptions()
+    let self._oldLazyredraw = &lazyredraw
+    let self._oldCmdheight = &cmdheight
+    set nolazyredraw
+    call self._setCmdheight()
+endfunction
+
+"FUNCTION: MenuController._restoreOptions() {{{1
+"restore the options we saved in _saveOptions()
+function! s:MenuController._restoreOptions()
+    let &cmdheight = self._oldCmdheight
+    let &lazyredraw = self._oldLazyredraw
+endfunction
+
+"FUNCTION: MenuController._cursorDown() {{{1
+"move the cursor to the next menu item, skipping separators
+function! s:MenuController._cursorDown()
+    let done = 0
+    while !done
+        if self.selection < len(self.menuItems)-1
+            let self.selection += 1
+        else
+            let self.selection = 0
+        endif
+
+        if !self._current().isSeparator()
+            let done = 1
+        endif
+    endwhile
+endfunction
+
+"FUNCTION: MenuController._cursorUp() {{{1
+"move the cursor to the previous menu item, skipping separators
+function! s:MenuController._cursorUp()
+    let done = 0
+    while !done
+        if self.selection > 0
+            let self.selection -= 1
+        else
+            let self.selection = len(self.menuItems)-1
+        endif
+
+        if !self._current().isSeparator()
+            let done = 1
+        endif
+    endwhile
+endfunction
+
+" vim: set sw=4 sts=4 et fdm=marker:
diff --git a/.vim/pack/vendor/start/nerdtree/lib/nerdtree/menu_item.vim b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/menu_item.vim
new file mode 100644
index 0000000..7f25917
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/menu_item.vim
@@ -0,0 +1,118 @@
+"CLASS: MenuItem
+"============================================================
+let s:MenuItem = {}
+let g:NERDTreeMenuItem = s:MenuItem
+
+"FUNCTION: MenuItem.All() {{{1
+"get all top level menu items
+function! s:MenuItem.All()
+    if !exists('s:menuItems')
+        let s:menuItems = []
+    endif
+    return s:menuItems
+endfunction
+
+"FUNCTION: MenuItem.AllEnabled() {{{1
+"get all top level menu items that are currently enabled
+function! s:MenuItem.AllEnabled()
+    let toReturn = []
+    for i in s:MenuItem.All()
+        if i.enabled()
+            call add(toReturn, i)
+        endif
+    endfor
+    return toReturn
+endfunction
+
+"FUNCTION: MenuItem.Create(options) {{{1
+"make a new menu item and add it to the global list
+function! s:MenuItem.Create(options)
+    let newMenuItem = copy(self)
+
+    let newMenuItem.text = a:options['text']
+    let newMenuItem.shortcut = a:options['shortcut']
+    let newMenuItem.children = []
+
+    let newMenuItem.isActiveCallback = -1
+    if has_key(a:options, 'isActiveCallback')
+        let newMenuItem.isActiveCallback = a:options['isActiveCallback']
+    endif
+
+    let newMenuItem.callback = -1
+    if has_key(a:options, 'callback')
+        let newMenuItem.callback = a:options['callback']
+    endif
+
+    if has_key(a:options, 'parent')
+        call add(a:options['parent'].children, newMenuItem)
+    else
+        call add(s:MenuItem.All(), newMenuItem)
+    endif
+
+    return newMenuItem
+endfunction
+
+"FUNCTION: MenuItem.CreateSeparator(options) {{{1
+"make a new separator menu item and add it to the global list
+function! s:MenuItem.CreateSeparator(options)
+    let standard_options = { 'text': '--------------------',
+                \ 'shortcut': -1,
+                \ 'callback': -1 }
+    let options = extend(a:options, standard_options, 'force')
+
+    return s:MenuItem.Create(options)
+endfunction
+
+"FUNCTION: MenuItem.CreateSubmenu(options) {{{1
+"make a new submenu and add it to global list
+function! s:MenuItem.CreateSubmenu(options)
+    let standard_options = { 'callback': -1 }
+    let options = extend(a:options, standard_options, 'force')
+
+    return s:MenuItem.Create(options)
+endfunction
+
+"FUNCTION: MenuItem.enabled() {{{1
+"return 1 if this menu item should be displayed
+"
+"delegates off to the isActiveCallback, and defaults to 1 if no callback was
+"specified
+function! s:MenuItem.enabled()
+    if self.isActiveCallback != -1
+        return type(self.isActiveCallback) == type(function('tr')) ? self.isActiveCallback() : {self.isActiveCallback}()
+    endif
+    return 1
+endfunction
+
+"FUNCTION: MenuItem.execute() {{{1
+"perform the action behind this menu item, if this menuitem has children then
+"display a new menu for them, otherwise deletegate off to the menuitem's
+"callback
+function! s:MenuItem.execute()
+    if len(self.children)
+        let mc = g:NERDTreeMenuController.New(self.children)
+        call mc.showMenu()
+    else
+        if self.callback != -1
+            if type(self.callback) == type(function('tr'))
+                call self.callback()
+            else
+                call {self.callback}()
+            endif
+        endif
+    endif
+endfunction
+
+"FUNCTION: MenuItem.isSeparator() {{{1
+"return 1 if this menuitem is a separator
+function! s:MenuItem.isSeparator()
+    return self.callback == -1 && self.children == []
+endfunction
+
+"FUNCTION: MenuItem.isSubmenu() {{{1
+"return 1 if this menuitem is a submenu
+function! s:MenuItem.isSubmenu()
+    return self.callback == -1 && !empty(self.children)
+endfunction
+
+" vim: set sw=4 sts=4 et fdm=marker:
diff --git a/.vim/pack/vendor/start/nerdtree/lib/nerdtree/nerdtree.vim b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/nerdtree.vim
new file mode 100644
index 0000000..61a11a9
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/nerdtree.vim
@@ -0,0 +1,209 @@
+"CLASS: NERDTree
+"============================================================
+let s:NERDTree = {}
+let g:NERDTree = s:NERDTree
+
+"FUNCTION: s:NERDTree.AddPathFilter() {{{1
+function! s:NERDTree.AddPathFilter(callback)
+    call add(s:NERDTree.PathFilters(), a:callback)
+endfunction
+
+"FUNCTION: s:NERDTree.changeRoot(node) {{{1
+function! s:NERDTree.changeRoot(node)
+    if a:node.path.isDirectory
+        let self.root = a:node
+    else
+        call a:node.cacheParent()
+        let self.root = a:node.parent
+    endif
+
+    call self.root.open()
+
+    "change dir to the dir of the new root if instructed to
+    if g:NERDTreeChDirMode >= 2
+        call self.root.path.changeToDir()
+    endif
+
+    call self.render()
+    call self.root.putCursorHere(0, 0)
+
+    if exists('#User#NERDTreeNewRoot')
+        doautocmd User NERDTreeNewRoot
+    endif
+endfunction
+
+"FUNCTION: s:NERDTree.Close() {{{1
+"Closes the tab tree window for this tab
+function! s:NERDTree.Close()
+    if !s:NERDTree.IsOpen()
+        return
+    endif
+
+    if winnr('$') !=# 1
+        " Use the window ID to identify the currently active window or fall
+        " back on the buffer ID if win_getid/win_gotoid are not available, in
+        " which case we'll focus an arbitrary window showing the buffer.
+        let l:useWinId = exists('*win_getid') && exists('*win_gotoid')
+
+        if winnr() ==# s:NERDTree.GetWinNum()
+            call nerdtree#exec('wincmd p', 1)
+            let l:activeBufOrWin = l:useWinId ? win_getid() : bufnr('')
+            call nerdtree#exec('wincmd p', 1)
+        else
+            let l:activeBufOrWin = l:useWinId ? win_getid() : bufnr('')
+        endif
+
+        call nerdtree#exec(s:NERDTree.GetWinNum() . ' wincmd w', 1)
+        call nerdtree#exec('close', 0)
+        if l:useWinId
+            call nerdtree#exec('call win_gotoid(' . l:activeBufOrWin . ')', 0)
+        else
+            call nerdtree#exec(bufwinnr(l:activeBufOrWin) . ' wincmd w', 0)
+        endif
+    else
+        close
+    endif
+endfunction
+
+"FUNCTION: s:NERDTree.CursorToBookmarkTable(){{{1
+"Places the cursor at the top of the bookmarks table
+function! s:NERDTree.CursorToBookmarkTable()
+    if !b:NERDTree.ui.getShowBookmarks()
+        throw 'NERDTree.IllegalOperationError: cant find bookmark table, bookmarks arent active'
+    endif
+
+    if g:NERDTreeMinimalUI
+        return cursor(1, 2)
+    endif
+
+    let rootNodeLine = b:NERDTree.ui.getRootLineNum()
+
+    let line = 1
+    while getline(line) !~# '^>-\+Bookmarks-\+$'
+        let line = line + 1
+        if line >= rootNodeLine
+            throw 'NERDTree.BookmarkTableNotFoundError: didnt find the bookmarks table'
+        endif
+    endwhile
+    call cursor(line, 2)
+endfunction
+
+"FUNCTION: s:NERDTree.CursorToTreeWin(){{{1
+"Places the cursor in the nerd tree window
+function! s:NERDTree.CursorToTreeWin(...)
+    call g:NERDTree.MustBeOpen()
+    call nerdtree#exec(g:NERDTree.GetWinNum() . 'wincmd w', a:0 >0 ? a:1 : 1)
+endfunction
+
+" Function: s:NERDTree.ExistsForBuffer()   {{{1
+" Returns 1 if a nerd tree root exists in the current buffer
+function! s:NERDTree.ExistsForBuf()
+    return exists('b:NERDTree')
+endfunction
+
+" Function: s:NERDTree.ExistsForTab()   {{{1
+" Returns 1 if a nerd tree root exists in the current tab
+function! s:NERDTree.ExistsForTab()
+    if !exists('t:NERDTreeBufName')
+        return
+    end
+
+    "check b:NERDTree is still there and hasn't been e.g. :bdeleted
+    return !empty(getbufvar(bufnr(t:NERDTreeBufName), 'NERDTree'))
+endfunction
+
+function! s:NERDTree.ForCurrentBuf()
+    if s:NERDTree.ExistsForBuf()
+        return b:NERDTree
+    else
+        return {}
+    endif
+endfunction
+
+"FUNCTION: s:NERDTree.ForCurrentTab() {{{1
+function! s:NERDTree.ForCurrentTab()
+    if !s:NERDTree.ExistsForTab()
+        return
+    endif
+
+    let bufnr = bufnr(t:NERDTreeBufName)
+    return getbufvar(bufnr, 'NERDTree')
+endfunction
+
+"FUNCTION: s:NERDTree.getRoot() {{{1
+function! s:NERDTree.getRoot()
+    return self.root
+endfunction
+
+"FUNCTION: s:NERDTree.GetWinNum() {{{1
+"gets the nerd tree window number for this tab
+function! s:NERDTree.GetWinNum()
+    if exists('t:NERDTreeBufName')
+        return bufwinnr(t:NERDTreeBufName)
+    endif
+
+    " If WindowTree, there is no t:NERDTreeBufName variable. Search all windows.
+    for w in range(1,winnr('$'))
+        if bufname(winbufnr(w)) =~# '^' . g:NERDTreeCreator.BufNamePrefix() . '\d\+$'
+            return w
+        endif
+    endfor
+
+    return -1
+endfunction
+
+"FUNCTION: s:NERDTree.IsOpen() {{{1
+function! s:NERDTree.IsOpen()
+    return s:NERDTree.GetWinNum() !=# -1
+endfunction
+
+"FUNCTION: s:NERDTree.isTabTree() {{{1
+function! s:NERDTree.isTabTree()
+    return self._type ==# 'tab'
+endfunction
+
+"FUNCTION: s:NERDTree.isWinTree() {{{1
+function! s:NERDTree.isWinTree()
+    return self._type ==# 'window'
+endfunction
+
+"FUNCTION: s:NERDTree.MustBeOpen() {{{1
+function! s:NERDTree.MustBeOpen()
+    if !s:NERDTree.IsOpen()
+        throw 'NERDTree.TreeNotOpen'
+    endif
+endfunction
+
+"FUNCTION: s:NERDTree.New() {{{1
+function! s:NERDTree.New(path, type)
+    let newObj = copy(self)
+    let newObj.ui = g:NERDTreeUI.New(newObj)
+    let newObj.root = g:NERDTreeDirNode.New(a:path, newObj)
+    let newObj._type = a:type
+    return newObj
+endfunction
+
+"FUNCTION: s:NERDTree.PathFilters() {{{1
+function! s:NERDTree.PathFilters()
+    if !exists('s:NERDTree._PathFilters')
+        let s:NERDTree._PathFilters = []
+    endif
+    return s:NERDTree._PathFilters
+endfunction
+
+"FUNCTION: s:NERDTree.previousBuf() {{{1
+function! s:NERDTree.previousBuf()
+    return self._previousBuf
+endfunction
+
+function! s:NERDTree.setPreviousBuf(bnum)
+    let self._previousBuf = a:bnum
+endfunction
+
+"FUNCTION: s:NERDTree.render() {{{1
+"A convenience function - since this is called often
+function! s:NERDTree.render()
+    call self.ui.render()
+endfunction
+
+" vim: set sw=4 sts=4 et fdm=marker:
diff --git a/.vim/pack/vendor/start/nerdtree/lib/nerdtree/notifier.vim b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/notifier.vim
new file mode 100644
index 0000000..ffa2853
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/notifier.vim
@@ -0,0 +1,35 @@
+"CLASS: Notifier
+"============================================================
+let s:Notifier = {}
+
+function! s:Notifier.AddListener(event, funcname)
+    let listeners = s:Notifier.GetListenersForEvent(a:event)
+    if listeners == []
+        let listenersMap = s:Notifier.GetListenersMap()
+        let listenersMap[a:event] = listeners
+    endif
+    call add(listeners, a:funcname)
+endfunction
+
+function! s:Notifier.NotifyListeners(event, path, nerdtree, params)
+    let event = g:NERDTreeEvent.New(a:nerdtree, a:path, a:event, a:params)
+
+    for Listener in s:Notifier.GetListenersForEvent(a:event)
+        let l:Callback = type(Listener) == type(function('tr')) ? Listener : function(Listener)
+        call l:Callback(event)
+    endfor
+endfunction
+
+function! s:Notifier.GetListenersMap()
+    if !exists('s:refreshListenersMap')
+        let s:refreshListenersMap = {}
+    endif
+    return s:refreshListenersMap
+endfunction
+
+function! s:Notifier.GetListenersForEvent(name)
+    let listenersMap = s:Notifier.GetListenersMap()
+    return get(listenersMap, a:name, [])
+endfunction
+
+let g:NERDTreePathNotifier = deepcopy(s:Notifier)
diff --git a/.vim/pack/vendor/start/nerdtree/lib/nerdtree/opener.vim b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/opener.vim
new file mode 100644
index 0000000..27993ac
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/opener.vim
@@ -0,0 +1,326 @@
+" ============================================================================
+" CLASS: Opener
+"
+" The Opener class defines an API for 'opening' operations.
+" ============================================================================
+
+
+let s:Opener = {}
+let g:NERDTreeOpener = s:Opener
+
+" FUNCTION: s:Opener._bufInWindows(bnum) {{{1
+" [[STOLEN FROM VTREEEXPLORER.VIM]]
+" Determine the number of windows open to this buffer number.
+" Care of Yegappan Lakshman.  Thanks!
+"
+" Args:
+" bnum: the subject buffers buffer number
+function! s:Opener._bufInWindows(bnum)
+    let cnt = 0
+    let winnum = 1
+    while 1
+        let bufnum = winbufnr(winnum)
+        if bufnum < 0
+            break
+        endif
+        if bufnum ==# a:bnum
+            let cnt = cnt + 1
+        endif
+        let winnum = winnum + 1
+    endwhile
+
+    return cnt
+endfunction
+
+" FUNCTION: Opener._checkToCloseTree(newtab) {{{1
+" Check the class options to see if the tree should be closed now.
+"
+" Args:
+" a:newtab - boolean. If set, only close the tree now if we are opening the
+" target in a new tab. This is needed because we have to close tree before we
+" leave the tab
+function! s:Opener._checkToCloseTree(newtab)
+    if self._keepopen
+        return
+    endif
+
+    if (a:newtab && self._where ==# 't') || !a:newtab
+        call g:NERDTree.Close()
+    endif
+endfunction
+
+" FUNCTION: s:Opener._firstUsableWindow() {{{1
+" find the window number of the first normal window
+function! s:Opener._firstUsableWindow()
+    let i = 1
+    while i <= winnr('$')
+        let bnum = winbufnr(i)
+        if bnum !=# -1 && getbufvar(bnum, '&buftype') ==# ''
+                    \ && !getwinvar(i, '&previewwindow')
+                    \ && (!getbufvar(bnum, '&modified') || &hidden)
+            return i
+        endif
+
+        let i += 1
+    endwhile
+    return -1
+endfunction
+
+" FUNCTION: Opener._gotoTargetWin() {{{1
+function! s:Opener._gotoTargetWin()
+    if b:NERDTree.isWinTree()
+        if self._where ==# 'v'
+            call self._newVSplit()
+        elseif self._where ==# 'h'
+            call self._newSplit()
+        elseif self._where ==# 't'
+            tabnew
+        endif
+    else
+        call self._checkToCloseTree(1)
+
+        if self._where ==# 'v'
+            call self._newVSplit()
+        elseif self._where ==# 'h'
+            call self._newSplit()
+        elseif self._where ==# 't'
+            tabnew
+        elseif self._where ==# 'p'
+            call self._previousWindow()
+        endif
+
+        call self._checkToCloseTree(0)
+    endif
+endfunction
+
+" FUNCTION: s:Opener._isWindowUsable(winnumber) {{{1
+" Returns 0 if opening a file from the tree in the given window requires it to
+" be split, 1 otherwise
+"
+" Args:
+" winnumber: the number of the window in question
+function! s:Opener._isWindowUsable(winnumber)
+    "gotta split if theres only one window (i.e. the NERD tree)
+    if winnr('$') ==# 1
+        return 0
+    endif
+
+    let oldwinnr = winnr()
+    call nerdtree#exec(a:winnumber . 'wincmd p', 1)
+    let specialWindow = getbufvar('%', '&buftype') !=# '' || getwinvar('%', '&previewwindow')
+    let modified = &modified
+    call nerdtree#exec(oldwinnr . 'wincmd p', 1)
+
+    "if its a special window e.g. quickfix or another explorer plugin then we
+    "have to split
+    if specialWindow
+        return 0
+    endif
+
+    if &hidden
+        return 1
+    endif
+
+    return !modified || self._bufInWindows(winbufnr(a:winnumber)) >= 2
+endfunction
+
+" FUNCTION: Opener.New(path, opts) {{{1
+" Instantiate a new NERDTreeOpener object.
+" Args:
+" a:path: the path object that is to be opened
+" a:opts: a dictionary containing the following optional keys...
+"   'where': specifies whether the node should be opened in new split, in
+"            a new tab or, in the last window; takes values 'v', 'h', or 't'
+"   'reuse': if file is already shown in a window, jump there; takes values
+"            'all', 'currenttab', or empty
+"   'keepopen': boolean (0 or 1); if true, the tree window will not be closed
+"   'stay': boolean (0 or 1); if true, remain in tree window after opening
+function! s:Opener.New(path, opts)
+    let l:newOpener = copy(self)
+
+    let l:newOpener._keepopen = nerdtree#has_opt(a:opts, 'keepopen')
+    let l:newOpener._nerdtree = b:NERDTree
+    let l:newOpener._path = a:path
+    let l:newOpener._reuse = has_key(a:opts, 'reuse') ? a:opts['reuse'] : ''
+    let l:newOpener._stay = nerdtree#has_opt(a:opts, 'stay')
+    let l:newOpener._where = has_key(a:opts, 'where') ? a:opts['where'] : ''
+
+    call l:newOpener._saveCursorPos()
+
+    return l:newOpener
+endfunction
+
+" FUNCTION: Opener._newSplit() {{{1
+function! s:Opener._newSplit()
+    let onlyOneWin = (winnr('$') ==# 1)
+    let savesplitright = &splitright
+    if onlyOneWin
+        let &splitright = (g:NERDTreeWinPos ==# 'left')
+    endif
+    " If only one window (ie. NERDTree), split vertically instead.
+    let splitMode = onlyOneWin ? 'vertical' : ''
+
+    " Open the new window
+    try
+        call nerdtree#exec('wincmd p', 1)
+        call nerdtree#exec(splitMode . ' split',1)
+    catch /^Vim\%((\a\+)\)\=:E37/
+        call g:NERDTree.CursorToTreeWin()
+        throw 'NERDTree.FileAlreadyOpenAndModifiedError: '. self._path.str() .' is already open and modified.'
+    catch /^Vim\%((\a\+)\)\=:/
+        "do nothing
+    endtry
+
+    "resize the tree window if no other window was open before
+    if onlyOneWin
+        call nerdtree#exec('wincmd p', 1)
+        call nerdtree#exec('silent '. splitMode .' resize '. g:NERDTreeWinSize, 1)
+        call nerdtree#exec('wincmd p', 0)
+    endif
+
+    let &splitright=savesplitright
+endfunction
+
+" FUNCTION: Opener._newVSplit() {{{1
+function! s:Opener._newVSplit()
+    let l:winwidth = winwidth('.')
+
+    let onlyOneWin = (winnr('$') ==# 1)
+    let savesplitright = &splitright
+    if onlyOneWin
+        let &splitright = (g:NERDTreeWinPos ==# 'left')
+        let l:winwidth = g:NERDTreeWinSize
+    endif
+
+    call nerdtree#exec('wincmd p', 1)
+    call nerdtree#exec('vsplit', 1)
+
+    let l:currentWindowNumber = winnr()
+
+    " Restore the NERDTree to its original width.
+    call g:NERDTree.CursorToTreeWin()
+    execute 'silent vertical resize ' . l:winwidth
+
+    call nerdtree#exec(l:currentWindowNumber . 'wincmd w', 0)
+    let &splitright=savesplitright
+endfunction
+
+" FUNCTION: Opener.open(target) {{{1
+function! s:Opener.open(target)
+    if self._path.isDirectory
+        call self._openDirectory(a:target)
+        return
+    endif
+
+    call self._openFile()
+endfunction
+
+" FUNCTION: Opener._openFile() {{{1
+function! s:Opener._openFile()
+    if !self._stay && self._keepopen && get(b:, 'NERDTreeZoomed', 0)
+        call b:NERDTree.ui.toggleZoom()
+    endif
+
+    if self._reuseWindow()
+        return
+    endif
+
+    call self._gotoTargetWin()
+
+    if self._stay
+        silent call self._path.edit()
+        call self._restoreCursorPos()
+        return
+    endif
+
+    call self._path.edit()
+endfunction
+
+" FUNCTION: Opener._openDirectory(node) {{{1
+function! s:Opener._openDirectory(node)
+    call self._gotoTargetWin()
+
+    if self._nerdtree.isWinTree()
+        call g:NERDTreeCreator.CreateWindowTree(a:node.path.str())
+    else
+        if empty(self._where)
+            call b:NERDTree.changeRoot(a:node)
+        elseif self._where ==# 't'
+            call g:NERDTreeCreator.CreateTabTree(a:node.path.str())
+        else
+            call g:NERDTreeCreator.CreateWindowTree(a:node.path.str())
+        endif
+    endif
+
+    if self._stay
+        call self._restoreCursorPos()
+    endif
+endfunction
+
+" FUNCTION: Opener._previousWindow() {{{1
+function! s:Opener._previousWindow()
+    if !self._isWindowUsable(winnr('#')) && self._firstUsableWindow() ==# -1
+        call self._newSplit()
+    else
+        try
+            if !self._isWindowUsable(winnr('#'))
+                call nerdtree#exec(self._firstUsableWindow() . 'wincmd w', 1)
+            else
+                call nerdtree#exec('wincmd p', 1)
+            endif
+        catch /^Vim\%((\a\+)\)\=:E37/
+            call g:NERDTree.CursorToTreeWin()
+            throw 'NERDTree.FileAlreadyOpenAndModifiedError: '. self._path.str() .' is already open and modified.'
+        catch /^Vim\%((\a\+)\)\=:/
+            echo v:exception
+        endtry
+    endif
+endfunction
+
+" FUNCTION: Opener._restoreCursorPos() {{{1
+function! s:Opener._restoreCursorPos()
+    call nerdtree#exec(self._tabnr . 'tabnext', 1)
+    call nerdtree#exec(bufwinnr(self._bufnr) . 'wincmd w', 1)
+endfunction
+
+" FUNCTION: Opener._reuseWindow() {{{1
+" put the cursor in the first window we find for this file
+"
+" return 1 if we were successful
+function! s:Opener._reuseWindow()
+    if empty(self._reuse)
+        return 0
+    endif
+
+    "check the current tab for the window
+    let winnr = bufwinnr('^' . self._path.str() . '$')
+    if winnr !=# -1
+        call nerdtree#exec(winnr . 'wincmd w', 0)
+        call self._checkToCloseTree(0)
+        return 1
+    endif
+
+    if self._reuse ==# 'currenttab'
+        return 0
+    endif
+
+    "check other tabs
+    let tabnr = self._path.tabnr()
+    if tabnr
+        call self._checkToCloseTree(1)
+        call nerdtree#exec(tabnr . 'tabnext', 1)
+        let winnr = bufwinnr('^' . self._path.str() . '$')
+        call nerdtree#exec(winnr . 'wincmd w', 0)
+        return 1
+    endif
+
+    return 0
+endfunction
+
+" FUNCTION: Opener._saveCursorPos() {{{1
+function! s:Opener._saveCursorPos()
+    let self._bufnr = bufnr('')
+    let self._tabnr = tabpagenr()
+endfunction
+
+" vim: set sw=4 sts=4 et fdm=marker:
diff --git a/.vim/pack/vendor/start/nerdtree/lib/nerdtree/path.vim b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/path.vim
new file mode 100644
index 0000000..997abf3
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/path.vim
@@ -0,0 +1,852 @@
+" ============================================================================
+" CLASS: Path
+"
+" The Path class provides an abstracted representation of a file system
+" pathname.  Various operations on pathnames are provided and a number of
+" representations of a given path name can be accessed here.
+" ============================================================================
+
+
+let s:Path = {}
+let g:NERDTreePath = s:Path
+
+" FUNCTION: Path.AbsolutePathFor(pathStr) {{{1
+function! s:Path.AbsolutePathFor(pathStr)
+    let l:prependWorkingDir = 0
+
+    if nerdtree#runningWindows()
+        let l:prependWorkingDir = a:pathStr !~# '^.:\(\\\|\/\)\?' && a:pathStr !~# '^\(\\\\\|\/\/\)'
+    else
+        let l:prependWorkingDir = a:pathStr !~# '^/'
+    endif
+
+    let l:result = a:pathStr
+
+    if l:prependWorkingDir
+        let l:result = getcwd()
+
+        if l:result[-1:] == nerdtree#slash()
+            let l:result = l:result . a:pathStr
+        else
+            let l:result = l:result . nerdtree#slash() . a:pathStr
+        endif
+    endif
+
+    return l:result
+endfunction
+
+" FUNCTION: Path.bookmarkNames() {{{1
+function! s:Path.bookmarkNames()
+    if !exists('self._bookmarkNames')
+        call self.cacheDisplayString()
+    endif
+    return self._bookmarkNames
+endfunction
+
+" FUNCTION: Path.cacheDisplayString() {{{1
+function! s:Path.cacheDisplayString() abort
+    let self.cachedDisplayString = g:NERDTreeNodeDelimiter . self.getLastPathComponent(1)
+
+    if self.isExecutable
+        let self.cachedDisplayString = self.addDelimiter(self.cachedDisplayString) . '*'
+    endif
+
+    let self._bookmarkNames = []
+    for i in g:NERDTreeBookmark.Bookmarks()
+        if i.path.equals(self)
+            call add(self._bookmarkNames, i.name)
+        endif
+    endfor
+    if !empty(self._bookmarkNames) && g:NERDTreeMarkBookmarks ==# 1
+        let self.cachedDisplayString = self.addDelimiter(self.cachedDisplayString) . ' {' . join(self._bookmarkNames) . '}'
+    endif
+
+    if self.isSymLink
+        let self.cachedDisplayString = self.addDelimiter(self.cachedDisplayString) . ' -> ' . self.symLinkDest
+    endif
+
+    if self.isReadOnly
+        let self.cachedDisplayString = self.addDelimiter(self.cachedDisplayString) . ' ['.g:NERDTreeGlyphReadOnly.']'
+    endif
+endfunction
+
+" FUNCTION: Path.addDelimiter() {{{1
+function! s:Path.addDelimiter(line)
+    if a:line =~# '\(.*' . g:NERDTreeNodeDelimiter . '\)\{2}'
+        return a:line
+    else
+        return a:line . g:NERDTreeNodeDelimiter
+    endif
+endfunction
+
+" FUNCTION: Path.changeToDir() {{{1
+function! s:Path.changeToDir()
+    let dir = self.str({'format': 'Cd'})
+    if self.isDirectory ==# 0
+        let dir = self.getParent().str({'format': 'Cd'})
+    endif
+
+    try
+        if g:NERDTreeUseTCD && exists(':tcd') ==# 2
+            execute 'tcd ' . dir
+            call nerdtree#echo("Tab's CWD is now: " . getcwd())
+        else
+            execute 'cd ' . dir
+            call nerdtree#echo('CWD is now: ' . getcwd())
+        endif
+    catch
+        throw 'NERDTree.PathChangeError: cannot change CWD to ' . dir
+    endtry
+endfunction
+
+" FUNCTION: Path.Create(fullpath) {{{1
+"
+" Factory method.
+"
+" Creates a path object with the given path. The path is also created on the
+" filesystem. If the path already exists, a NERDTree.Path.Exists exception is
+" thrown. If any other errors occur, a NERDTree.Path exception is thrown.
+"
+" Args:
+" fullpath: the full filesystem path to the file/dir to create
+function! s:Path.Create(fullpath)
+    "bail if the a:fullpath already exists
+    if isdirectory(a:fullpath) || filereadable(a:fullpath)
+        throw "NERDTree.CreatePathError: Directory Exists: '" . a:fullpath . "'"
+    endif
+
+    try
+
+        "if it ends with a slash, assume its a dir create it
+        if a:fullpath =~# '\(\\\|\/\)$'
+            "whack the trailing slash off the end if it exists
+            let fullpath = substitute(a:fullpath, '\(\\\|\/\)$', '', '')
+
+            call mkdir(fullpath, 'p')
+
+        "assume its a file and create
+        else
+            call s:Path.createParentDirectories(a:fullpath)
+            call writefile([], a:fullpath)
+        endif
+    catch
+        throw "NERDTree.CreatePathError: Could not create path: '" . a:fullpath . "'"
+    endtry
+
+    return s:Path.New(a:fullpath)
+endfunction
+
+" FUNCTION: Path.copy(dest) {{{1
+"
+" Copies the file/dir represented by this Path to the given location
+"
+" Args:
+" dest: the location to copy this dir/file to
+function! s:Path.copy(dest)
+    if !s:Path.CopyingSupported()
+        throw 'NERDTree.CopyingNotSupportedError: Copying is not supported on this OS'
+    endif
+
+    call s:Path.createParentDirectories(a:dest)
+
+    if exists('g:NERDTreeCopyCmd')
+        let cmd_prefix = g:NERDTreeCopyCmd
+    else
+        let cmd_prefix = (self.isDirectory ? g:NERDTreeCopyDirCmd : g:NERDTreeCopyFileCmd)
+    endif
+
+    let cmd = cmd_prefix . ' ' . shellescape(self.str()) . ' ' . shellescape(a:dest)
+    let success = system(cmd)
+    if v:shell_error !=# 0
+        throw "NERDTree.CopyError: Could not copy '". self.str() ."' to: '" . a:dest . "'"
+    endif
+endfunction
+
+" FUNCTION: Path.CopyingSupported() {{{1
+"
+" returns 1 if copying is supported for this OS
+function! s:Path.CopyingSupported()
+    return exists('g:NERDTreeCopyCmd') || (exists('g:NERDTreeCopyDirCmd') && exists('g:NERDTreeCopyFileCmd'))
+endfunction
+
+" FUNCTION: Path.copyingWillOverwrite(dest) {{{1
+"
+" returns 1 if copy this path to the given location will cause files to
+" overwritten
+"
+" Args:
+" dest: the location this path will be copied to
+function! s:Path.copyingWillOverwrite(dest)
+    if filereadable(a:dest)
+        return 1
+    endif
+
+    if isdirectory(a:dest)
+        let path = s:Path.JoinPathStrings(a:dest, self.getLastPathComponent(0))
+        if filereadable(path)
+            return 1
+        endif
+    endif
+endfunction
+
+" FUNCTION: Path.createParentDirectories(path) {{{1
+"
+" create parent directories for this path if needed
+" without throwing any errors if those directories already exist
+"
+" Args:
+" path: full path of the node whose parent directories may need to be created
+function! s:Path.createParentDirectories(path)
+    let dir_path = fnamemodify(a:path, ':h')
+    if !isdirectory(dir_path)
+        call mkdir(dir_path, 'p')
+    endif
+endfunction
+
+" FUNCTION: Path.delete() {{{1
+"
+" Deletes the file or directory represented by this path.
+"
+" Throws NERDTree.Path.Deletion exceptions
+function! s:Path.delete()
+    if self.isDirectory
+
+        let cmd = g:NERDTreeRemoveDirCmd . self.str({'escape': 1})
+        let success = system(cmd)
+
+        if v:shell_error !=# 0
+            throw "NERDTree.PathDeletionError: Could not delete directory: '" . self.str() . "'"
+        endif
+    else
+        if exists('g:NERDTreeRemoveFileCmd')
+            let cmd = g:NERDTreeRemoveFileCmd . self.str({'escape': 1})
+            let success = system(cmd)
+        else
+            let success = delete(self.str())
+        endif
+
+        if success !=# 0
+            throw "NERDTree.PathDeletionError: Could not delete file: '" . self.str() . "'"
+        endif
+    endif
+
+    "delete all bookmarks for this path
+    for i in self.bookmarkNames()
+        let bookmark = g:NERDTreeBookmark.BookmarkFor(i)
+        call bookmark.delete()
+    endfor
+endfunction
+
+" FUNCTION: Path.displayString() {{{1
+"
+" Returns a string that specifies how the path should be represented as a
+" string
+function! s:Path.displayString()
+    if self.cachedDisplayString ==# ''
+        call self.cacheDisplayString()
+    endif
+
+    return self.cachedDisplayString
+endfunction
+
+" FUNCTION: Path.edit() {{{1
+function! s:Path.edit()
+    let l:bufname = self.str({'format': 'Edit'})
+    if bufname('%') !=# l:bufname
+        exec 'edit ' . l:bufname
+    endif
+endfunction
+
+" FUNCTION: Path.extractDriveLetter(fullpath) {{{1
+"
+" If running windows, cache the drive letter for this path
+function! s:Path.extractDriveLetter(fullpath)
+    if nerdtree#runningWindows()
+        if a:fullpath =~# '^\(\\\\\|\/\/\)'
+            "For network shares, the 'drive' consists of the first two parts of the path, i.e. \\boxname\share
+            let self.drive = substitute(a:fullpath, '^\(\(\\\\\|\/\/\)[^\\\/]*\(\\\|\/\)[^\\\/]*\).*', '\1', '')
+            let self.drive = substitute(self.drive, '/', '\', 'g')
+        else
+            let self.drive = substitute(a:fullpath, '\(^[a-zA-Z]:\).*', '\1', '')
+        endif
+    else
+        let self.drive = ''
+    endif
+
+endfunction
+
+" FUNCTION: Path.exists() {{{1
+" return 1 if this path points to a location that is readable or is a directory
+function! s:Path.exists()
+    let p = self.str()
+    return filereadable(p) || isdirectory(p)
+endfunction
+
+" FUNCTION: Path._escChars() {{{1
+function! s:Path._escChars()
+    if nerdtree#runningWindows()
+        return " `\|\"#%&,?()\*^<>$"
+    endif
+
+    return " \\`\|\"#%&,?()\*^<>[]{}$"
+endfunction
+
+" FUNCTION: Path.getDir() {{{1
+"
+" Returns this path if it is a directory, else this paths parent.
+"
+" Return:
+" a Path object
+function! s:Path.getDir()
+    if self.isDirectory
+        return self
+    else
+        return self.getParent()
+    endif
+endfunction
+
+" FUNCTION: Path.getParent() {{{1
+"
+" Returns a new path object for this paths parent
+"
+" Return:
+" a new Path object
+function! s:Path.getParent()
+    if nerdtree#runningWindows()
+        let path = self.drive . '\' . join(self.pathSegments[0:-2], '\')
+    else
+        let path = '/'. join(self.pathSegments[0:-2], '/')
+    endif
+
+    return s:Path.New(path)
+endfunction
+
+" FUNCTION: Path.getLastPathComponent(dirSlash) {{{1
+"
+" Gets the last part of this path.
+"
+" Args:
+" dirSlash: if 1 then a trailing slash will be added to the returned value for
+" directory nodes.
+function! s:Path.getLastPathComponent(dirSlash)
+    if empty(self.pathSegments)
+        return ''
+    endif
+    let toReturn = self.pathSegments[-1]
+    if a:dirSlash && self.isDirectory
+        let toReturn = toReturn . '/'
+    endif
+    return toReturn
+endfunction
+
+" FUNCTION: Path.getSortOrderIndex() {{{1
+" returns the index of the pattern in g:NERDTreeSortOrder that this path matches
+function! s:Path.getSortOrderIndex()
+    let i = 0
+    while i < len(g:NERDTreeSortOrder)
+        if g:NERDTreeSortOrder[i] !~? '\[\[-\?\(timestamp\|size\|extension\)\]\]' &&
+        \ self.getLastPathComponent(1) =~# g:NERDTreeSortOrder[i]
+            return i
+        endif
+        let i = i + 1
+    endwhile
+
+    return index(g:NERDTreeSortOrder, '*')
+endfunction
+
+" FUNCTION: Path._splitChunks(path) {{{1
+" returns a list of path chunks
+function! s:Path._splitChunks(path)
+    let chunks = split(a:path, '\(\D\+\|\d\+\)\zs')
+    let i = 0
+    while i < len(chunks)
+        "convert number literals to numbers
+        if match(chunks[i], '^\d\+$') ==# 0
+            let chunks[i] = str2nr(chunks[i])
+        endif
+        let i = i + 1
+    endwhile
+    return chunks
+endfunction
+
+" FUNCTION: Path.getSortKey() {{{1
+" returns a key used in compare function for sorting
+function! s:Path.getSortKey()
+    if !exists('self._sortKey') || g:NERDTreeSortOrder !=# g:NERDTreeOldSortOrder
+        " Look for file metadata tags: [[timestamp]], [[extension]], [[size]]
+        let metadata = []
+        for tag in g:NERDTreeSortOrder
+            if tag =~? '\[\[-\?timestamp\]\]'
+                let metadata += [self.isDirectory ? 0 : getftime(self.str()) * (tag =~# '-' ? -1 : 1)]
+            elseif tag =~? '\[\[-\?size\]\]'
+                let metadata += [self.isDirectory ? 0 : getfsize(self.str()) * (tag =~# '-' ? -1 : 1)]
+            elseif tag =~? '\[\[extension\]\]'
+                let extension = matchstr(self.getLastPathComponent(0), '[^.]\+\.\zs[^.]\+$')
+                let metadata += [self.isDirectory ? '' : (extension ==# '' ? nr2char(str2nr('0x10ffff',16)) : extension)]
+            endif
+        endfor
+
+        if g:NERDTreeSortOrder[0] =~# '\[\[.*\]\]'
+            " Apply tags' sorting first if specified first.
+            let self._sortKey = metadata + [self.getSortOrderIndex()]
+        else
+            " Otherwise, do regex grouping first.
+            let self._sortKey = [self.getSortOrderIndex()] + metadata
+        endif
+
+        let path = self.getLastPathComponent(0)
+        if !g:NERDTreeSortHiddenFirst
+            let path = substitute(path, '^[._]', '', '')
+        endif
+        if !g:NERDTreeCaseSensitiveSort
+            let path = tolower(path)
+        endif
+
+        call extend(self._sortKey, (g:NERDTreeNaturalSort ? self._splitChunks(path) : [path]))
+    endif
+    return self._sortKey
+endfunction
+
+" FUNCTION: Path.isHiddenUnder(path) {{{1
+function! s:Path.isHiddenUnder(path)
+
+    if !self.isUnder(a:path)
+        return 0
+    endif
+
+    let l:startIndex = len(a:path.pathSegments)
+    let l:segments = self.pathSegments[l:startIndex : ]
+
+    for l:segment in l:segments
+
+        if l:segment =~# '^\.'
+            return 1
+        endif
+    endfor
+
+    return 0
+endfunction
+
+" FUNCTION: Path.isUnixHiddenFile() {{{1
+" check for unix hidden files
+function! s:Path.isUnixHiddenFile()
+    return self.getLastPathComponent(0) =~# '^\.'
+endfunction
+
+" FUNCTION: Path.isUnixHiddenPath() {{{1
+" check for unix path with hidden components
+function! s:Path.isUnixHiddenPath()
+    if self.getLastPathComponent(0) =~# '^\.'
+        return 1
+    else
+        for segment in self.pathSegments
+            if segment =~# '^\.'
+                return 1
+            endif
+        endfor
+        return 0
+    endif
+endfunction
+
+" FUNCTION: Path.ignore(nerdtree) {{{1
+" returns true if this path should be ignored
+function! s:Path.ignore(nerdtree)
+    "filter out the user specified paths to ignore
+    if a:nerdtree.ui.isIgnoreFilterEnabled()
+        for i in g:NERDTreeIgnore
+            if self._ignorePatternMatches(i)
+                return 1
+            endif
+        endfor
+
+        for l:Callback in g:NERDTree.PathFilters()
+            let l:Callback = type(l:Callback) ==# type(function('tr')) ? l:Callback : function(l:Callback)
+            if l:Callback({'path': self, 'nerdtree': a:nerdtree})
+               return 1
+            endif
+        endfor
+    endif
+
+    "dont show hidden files unless instructed to
+    if !a:nerdtree.ui.getShowHidden() && self.isUnixHiddenFile()
+        return 1
+    endif
+
+    if a:nerdtree.ui.getShowFiles() ==# 0 && self.isDirectory ==# 0
+        return 1
+    endif
+
+    return 0
+endfunction
+
+" FUNCTION: Path._ignorePatternMatches(pattern) {{{1
+" returns true if this path matches the given ignore pattern
+function! s:Path._ignorePatternMatches(pattern)
+    let pat = a:pattern
+    if strpart(pat,len(pat)-8) ==# '[[path]]'
+        let pat = strpart(pat,0, len(pat)-8)
+        return self.str() =~# pat
+    elseif strpart(pat,len(pat)-7) ==# '[[dir]]'
+        if !self.isDirectory
+            return 0
+        endif
+        let pat = strpart(pat,0, len(pat)-7)
+    elseif strpart(pat,len(pat)-8) ==# '[[file]]'
+        if self.isDirectory
+            return 0
+        endif
+        let pat = strpart(pat,0, len(pat)-8)
+    endif
+
+    return self.getLastPathComponent(0) =~# pat
+endfunction
+
+" FUNCTION: Path.isAncestor(path) {{{1
+" return 1 if this path is somewhere above the given path in the filesystem.
+"
+" a:path should be a dir
+function! s:Path.isAncestor(child)
+    return a:child.isUnder(self)
+endfunction
+
+" FUNCTION: Path.isUnder(path) {{{1
+" return 1 if this path is somewhere under the given path in the filesystem.
+function! s:Path.isUnder(parent)
+    if a:parent.isDirectory ==# 0
+        return 0
+    endif
+    if nerdtree#runningWindows() && a:parent.drive !=# self.drive
+        return 0
+    endif
+    let l:this_count = len(self.pathSegments)
+    if l:this_count ==# 0
+        return 0
+    endif
+    let l:that_count = len(a:parent.pathSegments)
+    if l:that_count ==# 0
+        return 1
+    endif
+    if l:that_count >= l:this_count
+        return 0
+    endif
+    for i in range(0, l:that_count-1)
+        if self.pathSegments[i] !=# a:parent.pathSegments[i]
+            return 0
+        endif
+    endfor
+    return 1
+endfunction
+
+" FUNCTION: Path.JoinPathStrings(...) {{{1
+function! s:Path.JoinPathStrings(...)
+    let components = []
+    for i in a:000
+        let components = extend(components, split(i, '/'))
+    endfor
+    return '/' . join(components, '/')
+endfunction
+
+" FUNCTION: Path.equals() {{{1
+"
+" Determines whether 2 path objects are "equal".
+" They are equal if the paths they represent are the same
+"
+" Args:
+" path: the other path obj to compare this with
+function! s:Path.equals(path)
+    if nerdtree#runningWindows()
+        return self.str() ==? a:path.str()
+    else
+        return self.str() ==# a:path.str()
+    endif
+endfunction
+
+" FUNCTION: Path.New(pathStr) {{{1
+function! s:Path.New(pathStr)
+    let l:newPath = copy(self)
+
+    call l:newPath.readInfoFromDisk(s:Path.AbsolutePathFor(a:pathStr))
+
+    let l:newPath.cachedDisplayString = ''
+    let l:newPath.flagSet = g:NERDTreeFlagSet.New()
+
+    return l:newPath
+endfunction
+
+" FUNCTION: Path.Resolve() {{{1
+" Invoke the vim resolve() function and return the result
+" This is necessary because in some versions of vim resolve() removes trailing
+" slashes while in other versions it doesn't.  This always removes the trailing
+" slash
+function! s:Path.Resolve(path)
+    let tmp = resolve(a:path)
+    return tmp =~# '.\+/$' ? substitute(tmp, '/$', '', '') : tmp
+endfunction
+
+" FUNCTION: Path.readInfoFromDisk(fullpath) {{{1
+"
+"
+" Throws NERDTree.Path.InvalidArguments exception.
+function! s:Path.readInfoFromDisk(fullpath)
+    call self.extractDriveLetter(a:fullpath)
+
+    let fullpath = s:Path.WinToUnixPath(a:fullpath)
+
+    if getftype(fullpath) ==# 'fifo'
+        throw 'NERDTree.InvalidFiletypeError: Cant handle FIFO files: ' . a:fullpath
+    endif
+
+    let self.pathSegments = filter(split(fullpath, '/'), '!empty(v:val)')
+
+    let self.isReadOnly = 0
+    if isdirectory(a:fullpath)
+        let self.isDirectory = 1
+    elseif filereadable(a:fullpath)
+        let self.isDirectory = 0
+        let self.isReadOnly = filewritable(a:fullpath) ==# 0
+    else
+        throw 'NERDTree.InvalidArgumentsError: Invalid path = ' . a:fullpath
+    endif
+
+    let self.isExecutable = 0
+    if !self.isDirectory
+        let self.isExecutable = getfperm(a:fullpath) =~# 'x'
+    endif
+
+    "grab the last part of the path (minus the trailing slash)
+    let lastPathComponent = self.getLastPathComponent(0)
+
+    "get the path to the new node with the parent dir fully resolved
+    let hardPath = s:Path.Resolve(self.strTrunk()) . '/' . lastPathComponent
+
+    "if  the last part of the path is a symlink then flag it as such
+    let self.isSymLink = (s:Path.Resolve(hardPath) !=# hardPath)
+    if self.isSymLink
+        let self.symLinkDest = s:Path.Resolve(fullpath)
+
+        "if the link is a dir then slap a / on the end of its dest
+        if isdirectory(self.symLinkDest)
+
+            "we always wanna treat MS windows shortcuts as files for
+            "simplicity
+            if hardPath !~# '\.lnk$'
+
+                let self.symLinkDest = self.symLinkDest . '/'
+            endif
+        endif
+    endif
+endfunction
+
+" FUNCTION: Path.refresh(nerdtree) {{{1
+function! s:Path.refresh(nerdtree)
+    call self.readInfoFromDisk(self.str())
+    call g:NERDTreePathNotifier.NotifyListeners('refresh', self, a:nerdtree, {})
+    call self.cacheDisplayString()
+endfunction
+
+" FUNCTION: Path.refreshFlags(nerdtree) {{{1
+function! s:Path.refreshFlags(nerdtree)
+    call g:NERDTreePathNotifier.NotifyListeners('refreshFlags', self, a:nerdtree, {})
+    call self.cacheDisplayString()
+endfunction
+
+" FUNCTION: Path.rename() {{{1
+"
+" Renames this node on the filesystem
+function! s:Path.rename(newPath)
+    if a:newPath ==# ''
+        throw 'NERDTree.InvalidArgumentsError: Invalid newPath for renaming = '. a:newPath
+    endif
+
+    call s:Path.createParentDirectories(a:newPath)
+
+    let success =  rename(self.str(), a:newPath)
+    if success !=# 0
+        throw "NERDTree.PathRenameError: Could not rename: '" . self.str() . "'" . 'to:' . a:newPath
+    endif
+    call self.readInfoFromDisk(a:newPath)
+
+    for i in self.bookmarkNames()
+        let b = g:NERDTreeBookmark.BookmarkFor(i)
+        call b.setPath(copy(self))
+    endfor
+    call g:NERDTreeBookmark.Write()
+endfunction
+
+" FUNCTION: Path.str() {{{1
+" Return a string representation of this Path object.
+"
+" Args:
+" This function takes a single dictionary (optional) with keys and values that
+" specify how the returned pathname should be formatted.
+"
+" The dictionary may have the following keys:
+"  'format'
+"  'escape'
+"  'truncateTo'
+"
+" The 'format' key may have a value of:
+"  'Cd' - a string to be used with ":cd" and similar commands
+"  'Edit' - a string to be used with ":edit" and similar commands
+"  'UI' - a string to be displayed in the NERDTree user interface
+"
+" The 'escape' key, if specified, will cause the output to be escaped with
+" Vim's internal "shellescape()" function.
+"
+" The 'truncateTo' key shortens the length of the path to that given by the
+" value associated with 'truncateTo'. A '<' is prepended.
+function! s:Path.str(...)
+    let options = a:0 ? a:1 : {}
+    let toReturn = ''
+
+    if has_key(options, 'format')
+        let format = options['format']
+        if has_key(self, '_strFor' . format)
+            exec 'let toReturn = self._strFor' . format . '()'
+        else
+            throw 'NERDTree.UnknownFormatError: unknown format "'. format .'"'
+        endif
+    else
+        let toReturn = self._str()
+    endif
+
+    if nerdtree#has_opt(options, 'escape')
+        let toReturn = shellescape(toReturn)
+    endif
+
+    if has_key(options, 'truncateTo')
+        let limit = options['truncateTo']
+        if strdisplaywidth(toReturn) > limit-1
+            while strdisplaywidth(toReturn) > limit-1 && strchars(toReturn) > 0
+                let toReturn = substitute(toReturn, '^.', '', '')
+            endwhile
+            if len(split(toReturn, '/')) > 1
+                let toReturn = '</' . join(split(toReturn, '/')[1:], '/') . '/'
+            else
+                let toReturn = '<' . toReturn
+            endif
+        endif
+    endif
+
+    return toReturn
+endfunction
+
+" FUNCTION: Path._strForUI() {{{1
+function! s:Path._strForUI()
+    let toReturn = '/' . join(self.pathSegments, '/')
+    if self.isDirectory && toReturn !=# '/'
+        let toReturn  = toReturn . '/'
+    endif
+    return toReturn
+endfunction
+
+" FUNCTION: Path._strForCd() {{{1
+" Return a string representation of this Path that is suitable for use as an
+" argument to Vim's internal ":cd" command.
+function! s:Path._strForCd()
+    return fnameescape(self.str())
+endfunction
+
+" FUNCTION: Path._strForEdit() {{{1
+" Return a string representation of this Path that is suitable for use as an
+" argument to Vim's internal ":edit" command.
+function! s:Path._strForEdit()
+
+    " Make the path relative to the current working directory, if possible.
+    let l:result = fnamemodify(self.str(), ':.')
+
+    " On Windows, the drive letter may be removed by "fnamemodify()".  Add it
+    " back, if necessary.
+    if nerdtree#runningWindows() && l:result[0] == nerdtree#slash()
+        let l:result = self.drive . l:result
+    endif
+
+    let l:result = fnameescape(l:result)
+
+    if empty(l:result)
+        let l:result = '.'
+    endif
+
+    return l:result
+endfunction
+
+" FUNCTION: Path._strForGlob() {{{1
+function! s:Path._strForGlob()
+    let lead = nerdtree#slash()
+
+    "if we are running windows then slap a drive letter on the front
+    if nerdtree#runningWindows()
+        let lead = self.drive . '\'
+    endif
+
+    let toReturn = lead . join(self.pathSegments, nerdtree#slash())
+
+    if !nerdtree#runningWindows()
+        let toReturn = escape(toReturn, self._escChars())
+    endif
+    return toReturn
+endfunction
+
+" FUNCTION: Path._str() {{{1
+" Return the absolute pathname associated with this Path object.  The pathname
+" returned is appropriate for the underlying file system.
+function! s:Path._str()
+    let l:separator = nerdtree#slash()
+    let l:leader = l:separator
+
+    if nerdtree#runningWindows()
+        let l:leader = self.drive . l:separator
+    endif
+
+    return l:leader . join(self.pathSegments, l:separator)
+endfunction
+
+" FUNCTION: Path.strTrunk() {{{1
+" Gets the path without the last segment on the end.
+function! s:Path.strTrunk()
+    return self.drive . '/' . join(self.pathSegments[0:-2], '/')
+endfunction
+
+" FUNCTION: Path.tabnr() {{{1
+" return the number of the first tab that is displaying this file
+"
+" return 0 if no tab was found
+function! s:Path.tabnr()
+    let str = self.str()
+    for t in range(tabpagenr('$'))
+        for b in tabpagebuflist(t+1)
+            if str ==# expand('#' . b . ':p')
+                return t+1
+            endif
+        endfor
+    endfor
+    return 0
+endfunction
+
+" FUNCTION: Path.WinToUnixPath(pathstr){{{1
+" Takes in a windows path and returns the unix equiv
+"
+" A class level method
+"
+" Args:
+" pathstr: the windows path to convert
+function! s:Path.WinToUnixPath(pathstr)
+    if !nerdtree#runningWindows()
+        return a:pathstr
+    endif
+
+    let toReturn = a:pathstr
+
+    "remove the x:\ of the front
+    let toReturn = substitute(toReturn, '^.*:\(\\\|/\)\?', '/', '')
+
+    "remove the \\ network share from the front
+    let toReturn = substitute(toReturn, '^\(\\\\\|\/\/\)[^\\\/]*\(\\\|\/\)[^\\\/]*\(\\\|\/\)\?', '/', '')
+
+    "convert all \ chars to /
+    let toReturn = substitute(toReturn, '\', '/', 'g')
+
+    return toReturn
+endfunction
+
+" vim: set sw=4 sts=4 et fdm=marker:
diff --git a/.vim/pack/vendor/start/nerdtree/lib/nerdtree/tree_dir_node.vim b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/tree_dir_node.vim
new file mode 100644
index 0000000..f5f7682
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/tree_dir_node.vim
@@ -0,0 +1,706 @@
+" ============================================================================
+" CLASS: TreeDirNode
+"
+" A subclass of NERDTreeFileNode.
+"
+" The 'composite' part of the file/dir composite.
+" ============================================================================
+
+
+let s:TreeDirNode = copy(g:NERDTreeFileNode)
+let g:NERDTreeDirNode = s:TreeDirNode
+
+" FUNCTION: TreeDirNode.AbsoluteTreeRoot(){{{1
+" Class method that returns the highest cached ancestor of the current root.
+function! s:TreeDirNode.AbsoluteTreeRoot()
+    let currentNode = b:NERDTree.root
+    while currentNode.parent !=# {}
+        let currentNode = currentNode.parent
+    endwhile
+    return currentNode
+endfunction
+
+" FUNCTION: TreeDirNode.activate([options]) {{{1
+function! s:TreeDirNode.activate(...)
+    let l:options = (a:0 > 0) ? a:1 : {}
+
+    call self.toggleOpen(l:options)
+
+    " Note that we only re-render the NERDTree for this node if we did NOT
+    " create a new node and render it in a new window or tab.  In the latter
+    " case, rendering the NERDTree for this node could overwrite the text of
+    " the new NERDTree!
+    if !has_key(l:options, 'where') || empty(l:options['where'])
+        call self.getNerdtree().render()
+        call self.putCursorHere(0, 0)
+    endif
+endfunction
+
+" FUNCTION: TreeDirNode.addChild(treenode, inOrder) {{{1
+" Adds the given treenode to the list of children for this node
+"
+" Args:
+" -treenode: the node to add
+" -inOrder: 1 if the new node should be inserted in sorted order
+function! s:TreeDirNode.addChild(treenode, inOrder)
+    call add(self.children, a:treenode)
+    let a:treenode.parent = self
+
+    if a:inOrder
+        call self.sortChildren()
+    endif
+endfunction
+
+" FUNCTION: TreeDirNode.close() {{{1
+" Mark this TreeDirNode as closed.
+function! s:TreeDirNode.close()
+
+    " Close all directories in this directory node's cascade. This is
+    " necessary to ensure consistency when cascades are rendered.
+    for l:dirNode in self.getCascade()
+        let l:dirNode.isOpen = 0
+    endfor
+endfunction
+
+" FUNCTION: TreeDirNode.closeChildren() {{{1
+" Recursively close any directory nodes that are descendants of this node.
+function! s:TreeDirNode.closeChildren()
+    for l:child in self.children
+        if l:child.path.isDirectory
+            call l:child.close()
+            call l:child.closeChildren()
+        endif
+    endfor
+endfunction
+
+" FUNCTION: TreeDirNode.createChild(path, inOrder) {{{1
+" Instantiates a new child node for this node with the given path. The new
+" nodes parent is set to this node.
+"
+" Args:
+" path: a Path object that this node will represent/contain
+" inOrder: 1 if the new node should be inserted in sorted order
+"
+" Returns:
+" the newly created node
+function! s:TreeDirNode.createChild(path, inOrder)
+    let newTreeNode = g:NERDTreeFileNode.New(a:path, self.getNerdtree())
+    call self.addChild(newTreeNode, a:inOrder)
+    return newTreeNode
+endfunction
+
+" FUNCTION: TreeDirNode.displayString() {{{1
+" Assemble and return a string that can represent this TreeDirNode object in
+" the NERDTree window.
+function! s:TreeDirNode.displayString()
+    let l:result = ''
+
+    " Build a label that identifies this TreeDirNode.
+    let l:label = ''
+    let l:cascade = self.getCascade()
+    for l:dirNode in l:cascade
+        let l:next = l:dirNode.path.displayString()
+        let l:label .= l:label ==# '' ? l:next : substitute(l:next,'^.','','')
+    endfor
+
+    " Select the appropriate open/closed status indicator symbol.
+    let l:symbol = (l:cascade[-1].isOpen ? g:NERDTreeDirArrowCollapsible : g:NERDTreeDirArrowExpandable )
+    let l:symbol .= (g:NERDTreeDirArrowExpandable ==# '' ? '' : ' ')
+    let l:flags = l:cascade[-1].path.flagSet.renderToString()
+
+    return l:symbol . l:flags . l:label
+endfunction
+
+" FUNCTION: TreeDirNode.findNode(path) {{{1
+" Will find one of the children (recursively) that has the given path
+"
+" Args:
+" path: a path object
+unlet s:TreeDirNode.findNode
+function! s:TreeDirNode.findNode(path)
+    if a:path.equals(self.path)
+        return self
+    endif
+    if stridx(a:path.str(), self.path.str(), 0) ==# -1
+        return {}
+    endif
+
+    if self.path.isDirectory
+        for i in self.children
+            let retVal = i.findNode(a:path)
+            if retVal !=# {}
+                return retVal
+            endif
+        endfor
+    endif
+    return {}
+endfunction
+
+" FUNCTION: TreeDirNode.getCascade() {{{1
+" Return an array of dir nodes (starting from self) that can be cascade opened.
+function! s:TreeDirNode.getCascade()
+    if !self.isCascadable()
+        return [self]
+    endif
+
+    let vc = self.getVisibleChildren()
+    let visChild = vc[0]
+
+    return [self] + visChild.getCascade()
+endfunction
+
+" FUNCTION: TreeDirNode.getCascadeRoot() {{{1
+" Return the first directory node in the cascade in which this directory node
+" is rendered.
+function! s:TreeDirNode.getCascadeRoot()
+
+    " Don't search above the current NERDTree root node.
+    if self.isRoot()
+        return self
+    endif
+
+    let l:cascadeRoot = self
+    let l:parent = self.parent
+
+    while !empty(l:parent) && !l:parent.isRoot()
+
+        if index(l:parent.getCascade(), self) ==# -1
+            break
+        endif
+
+        let l:cascadeRoot = l:parent
+        let l:parent = l:parent.parent
+    endwhile
+
+    return l:cascadeRoot
+endfunction
+
+" FUNCTION: TreeDirNode.getChildCount() {{{1
+" Returns the number of children this node has
+function! s:TreeDirNode.getChildCount()
+    return len(self.children)
+endfunction
+
+" FUNCTION: TreeDirNode.getChild(path) {{{1
+" Returns child node of this node that has the given path or {} if no such node
+" exists.
+"
+" This function doesnt not recurse into child dir nodes
+"
+" Args:
+" path: a path object
+function! s:TreeDirNode.getChild(path)
+    if stridx(a:path.str(), self.path.str(), 0) ==# -1
+        return {}
+    endif
+
+    let index = self.getChildIndex(a:path)
+    if index ==# -1
+        return {}
+    else
+        return self.children[index]
+    endif
+
+endfunction
+
+" FUNCTION: TreeDirNode.getChildByIndex(indx, visible) {{{1
+" returns the child at the given index
+"
+" Args:
+" indx: the index to get the child from
+" visible: 1 if only the visible children array should be used, 0 if all the
+" children should be searched.
+function! s:TreeDirNode.getChildByIndex(indx, visible)
+    let array_to_search = a:visible? self.getVisibleChildren() : self.children
+    if a:indx > len(array_to_search)
+        throw 'NERDTree.InvalidArgumentsError: Index is out of bounds.'
+    endif
+    return array_to_search[a:indx]
+endfunction
+
+" FUNCTION: TreeDirNode.getChildIndex(path) {{{1
+" Returns the index of the child node of this node that has the given path or
+" -1 if no such node exists.
+"
+" This function doesnt not recurse into child dir nodes
+"
+" Args:
+" path: a path object
+function! s:TreeDirNode.getChildIndex(path)
+    if stridx(a:path.str(), self.path.str(), 0) ==# -1
+        return -1
+    endif
+
+    "do a binary search for the child
+    let a = 0
+    let z = self.getChildCount()
+    while a < z
+        let mid = (a+z)/2
+        let diff = nerdtree#compareNodePaths(a:path, self.children[mid].path)
+
+        if diff ==# -1
+            let z = mid
+        elseif diff ==# 1
+            let a = mid+1
+        else
+            return mid
+        endif
+    endwhile
+    return -1
+endfunction
+
+" FUNCTION: TreeDirNode.getDirChildren() {{{1
+" Return a list of all child nodes from 'self.children' that are of type
+" TreeDirNode. This function supports http://github.com/scrooloose/nerdtree-project-plugin.git.
+function! s:TreeDirNode.getDirChildren()
+    return filter(copy(self.children), 'v:val.path.isDirectory ==# 1')
+endfunction
+
+" FUNCTION: TreeDirNode._glob(pattern, all) {{{1
+" Return a list of strings naming the descendants of the directory in this
+" TreeDirNode object that match the specified glob pattern.
+"
+" Args:
+" pattern: (string) the glob pattern to apply
+" all: (0 or 1) if 1, include '.' and '..' if they match 'pattern'; if 0,
+"      always exclude them
+"
+" Note: If the pathnames in the result list are below the working directory,
+" they are returned as pathnames relative to that directory. This is because
+" this function, internally, attempts to obey 'wildignore' rules that use
+" relative paths.
+function! s:TreeDirNode._glob(pattern, all)
+
+    " Construct a path specification such that globpath() will return
+    " relative pathnames, if possible.
+    if self.path.str() ==# getcwd()
+        let l:pathSpec = ','
+    else
+        let l:pathSpec = escape(fnamemodify(self.path.str({'format': 'Glob'}), ':.'), ',')
+
+        " On Windows, the drive letter may be removed by "fnamemodify()".
+        if nerdtree#runningWindows() && l:pathSpec[0] == nerdtree#slash()
+            let l:pathSpec = self.path.drive . l:pathSpec
+        endif
+    endif
+
+    let l:globList = []
+
+    " See ':h version7.txt' and ':h version8.txt' for details on the
+    " development of the glob() and globpath() functions.
+    if v:version > 704 || (v:version ==# 704 && has('patch654'))
+        let l:globList = globpath(l:pathSpec, a:pattern, !g:NERDTreeRespectWildIgnore, 1, 0)
+    elseif v:version ==# 704 && has('patch279')
+        let l:globList = globpath(l:pathSpec, a:pattern, !g:NERDTreeRespectWildIgnore, 1)
+    elseif v:version > 702 || (v:version ==# 702 && has('patch051'))
+        let l:globString = globpath(l:pathSpec, a:pattern, !g:NERDTreeRespectWildIgnore)
+        let l:globList = split(l:globString, "\n")
+    else
+        let l:globString = globpath(l:pathSpec, a:pattern)
+        let l:globList = split(l:globString, "\n")
+    endif
+
+    " If a:all is false, filter '.' and '..' from the output.
+    if !a:all
+        let l:toRemove = []
+
+        for l:file in l:globList
+            let l:tail = fnamemodify(l:file, ':t')
+
+            " If l:file has a trailing slash, then its :tail will be ''. Use
+            " :h to drop the slash and the empty string after it; then use :t
+            " to get the directory name.
+            if l:tail ==# ''
+                let l:tail = fnamemodify(l:file, ':h:t')
+            endif
+
+            if l:tail ==# '.' || l:tail ==# '..'
+                call add(l:toRemove, l:file)
+                if len(l:toRemove) ==# 2
+                    break
+                endif
+            endif
+        endfor
+
+        for l:file in l:toRemove
+            call remove(l:globList, index(l:globList, l:file))
+        endfor
+    endif
+
+    return l:globList
+endfunction
+
+" FUNCTION: TreeDirNode.GetSelected() {{{1
+" Returns the current node if it is a dir node, or else returns the current
+" nodes parent
+unlet s:TreeDirNode.GetSelected
+function! s:TreeDirNode.GetSelected()
+    let currentDir = g:NERDTreeFileNode.GetSelected()
+    if currentDir !=# {} && !currentDir.isRoot()
+        if currentDir.path.isDirectory ==# 0
+            let currentDir = currentDir.parent
+        endif
+    endif
+    return currentDir
+endfunction
+
+" FUNCTION: TreeDirNode.getVisibleChildCount() {{{1
+" Returns the number of visible children this node has
+function! s:TreeDirNode.getVisibleChildCount()
+    return len(self.getVisibleChildren())
+endfunction
+
+" FUNCTION: TreeDirNode.getVisibleChildren() {{{1
+" Returns a list of children to display for this node, in the correct order
+"
+" Return:
+" an array of treenodes
+function! s:TreeDirNode.getVisibleChildren()
+    let toReturn = []
+    for i in self.children
+        if i.path.ignore(self.getNerdtree()) ==# 0
+            call add(toReturn, i)
+        endif
+    endfor
+    return toReturn
+endfunction
+
+" FUNCTION: TreeDirNode.hasVisibleChildren() {{{1
+" returns 1 if this node has any childre, 0 otherwise..
+function! s:TreeDirNode.hasVisibleChildren()
+    return self.getVisibleChildCount() !=# 0
+endfunction
+
+" FUNCTION: TreeDirNode.isCascadable() {{{1
+" true if this dir has only one visible child that is also a dir
+" false if this dir is bookmarked or symlinked. Why? Two reasons:
+"  1. If cascaded, we don't know which dir is bookmarked or is a symlink.
+"  2. If the parent is a symlink or is bookmarked, you end up with unparsable
+"     text, and NERDTree cannot get the path of any child node.
+" Also, return false if this directory is the tree root, which should never be
+" part of a cascade.
+function! s:TreeDirNode.isCascadable()
+    if g:NERDTreeCascadeSingleChildDir ==# 0
+        return 0
+    endif
+
+    if self.isRoot()
+        return 0
+    endif
+
+    if self.path.isSymLink
+        return 0
+    endif
+
+    for i in g:NERDTreeBookmark.Bookmarks()
+        if i.path.equals(self.path)
+            return 0
+        endif
+    endfor
+
+    let c = self.getVisibleChildren()
+    return len(c) ==# 1 && c[0].path.isDirectory
+endfunction
+
+" FUNCTION: TreeDirNode._initChildren() {{{1
+" Removes all childen from this node and re-reads them
+"
+" Args:
+" silent: 1 if the function should not echo any 'please wait' messages for
+" large directories
+"
+" Return: the number of child nodes read
+function! s:TreeDirNode._initChildren(silent)
+    "remove all the current child nodes
+    let self.children = []
+
+    let files = self._glob('*', 1) + self._glob('.*', 0)
+
+    if !a:silent && len(files) > g:NERDTreeNotificationThreshold
+        call nerdtree#echo('Please wait, caching a large dir ...')
+    endif
+
+    let invalidFilesFound = 0
+    for i in files
+        try
+            let path = g:NERDTreePath.New(i)
+            call self.createChild(path, 0)
+            call g:NERDTreePathNotifier.NotifyListeners('init', path, self.getNerdtree(), {})
+        catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/
+            let invalidFilesFound += 1
+        endtry
+    endfor
+
+    let g:NERDTreeOldSortOrder = g:NERDTreeSortOrder
+    call self.sortChildren()
+
+    call nerdtree#echo('')
+
+    if invalidFilesFound
+        call nerdtree#echoWarning(invalidFilesFound . ' file(s) could not be loaded into the NERD tree')
+    endif
+    return self.getChildCount()
+endfunction
+
+" FUNCTION: TreeDirNode.New(path, nerdtree) {{{1
+" Return a new TreeDirNode object with the given path and parent.
+"
+" Args:
+" path: dir that the node represents
+" nerdtree: the tree the node belongs to
+function! s:TreeDirNode.New(path, nerdtree)
+    if a:path.isDirectory !=# 1
+        throw 'NERDTree.InvalidArgumentsError: A TreeDirNode object must be instantiated with a directory Path object.'
+    endif
+
+    let newTreeNode = copy(self)
+    let newTreeNode.path = a:path
+
+    let newTreeNode.isOpen = 0
+    let newTreeNode.children = []
+
+    let newTreeNode.parent = {}
+    let newTreeNode._nerdtree = a:nerdtree
+
+    return newTreeNode
+endfunction
+
+" FUNCTION: TreeDirNode.open([options]) {{{1
+" Open this directory node in the current tree or elsewhere if special options
+" are provided. Return 0 if options were processed. Otherwise, return the
+" number of new cached nodes.
+function! s:TreeDirNode.open(...)
+    let l:options = a:0 ? a:1 : {}
+
+    " If special options were specified, process them and return.
+    if has_key(l:options, 'where') && !empty(l:options['where'])
+        let l:opener = g:NERDTreeOpener.New(self.path, l:options)
+        call l:opener.open(self)
+        return 0
+    endif
+
+    " Open any ancestors of this node that render within the same cascade.
+    let l:parent = self.parent
+    while !empty(l:parent) && !l:parent.isRoot()
+        if index(l:parent.getCascade(), self) >= 0
+            let l:parent.isOpen = 1
+            let l:parent = l:parent.parent
+        else
+            break
+        endif
+    endwhile
+
+    let self.isOpen = 1
+
+    let l:numChildrenCached = 0
+    if empty(self.children)
+        let l:numChildrenCached = self._initChildren(0)
+    endif
+
+    return l:numChildrenCached
+endfunction
+
+" FUNCTION: TreeDirNode.openAlong([opts]) {{{1
+" recursive open the dir if it has only one directory child.
+"
+" return the level of opened directories.
+function! s:TreeDirNode.openAlong(...)
+    let opts = a:0 ? a:1 : {}
+    let level = 0
+
+    let node = self
+    while node.path.isDirectory
+        call node.open(opts)
+        let level += 1
+        if node.getVisibleChildCount() ==# 1
+            let node = node.getChildByIndex(0, 1)
+        else
+            break
+        endif
+    endwhile
+    return level
+endfunction
+
+" FUNCTION: TreeDirNode.openExplorer() {{{1
+" Open an explorer window for this node in the previous window. The explorer
+" can be a NERDTree window or a netrw window.
+function! s:TreeDirNode.openExplorer()
+    execute 'wincmd p'
+    execute 'edit '.self.path.str({'format':'Edit'})
+endfunction
+
+" FUNCTION: TreeDirNode.openInNewTab(options) {{{1
+unlet s:TreeDirNode.openInNewTab
+function! s:TreeDirNode.openInNewTab(options)
+    call nerdtree#deprecated('TreeDirNode.openInNewTab', 'is deprecated, use open() instead')
+    call self.open({'where': 't'})
+endfunction
+
+" FUNCTION: TreeDirNode._openInNewTab() {{{1
+function! s:TreeDirNode._openInNewTab()
+    tabnew
+    call g:NERDTreeCreator.CreateTabTree(self.path.str())
+endfunction
+
+" FUNCTION: TreeDirNode.openRecursively() {{{1
+" Open this directory node and any descendant directory nodes whose pathnames
+" are not ignored.
+function! s:TreeDirNode.openRecursively()
+    silent call self.open()
+
+    for l:child in self.children
+        if l:child.path.isDirectory && !l:child.path.ignore(l:child.getNerdtree())
+            call l:child.openRecursively()
+        endif
+    endfor
+endfunction
+
+" FUNCTION: TreeDirNode.refresh() {{{1
+function! s:TreeDirNode.refresh()
+    call self.path.refresh(self.getNerdtree())
+
+    "if this node was ever opened, refresh its children
+    if self.isOpen || !empty(self.children)
+        let files = self._glob('*', 1) + self._glob('.*', 0)
+        let newChildNodes = []
+        let invalidFilesFound = 0
+        for i in files
+            try
+                "create a new path and see if it exists in this nodes children
+                let path = g:NERDTreePath.New(i)
+                let newNode = self.getChild(path)
+                if newNode !=# {}
+                    call newNode.refresh()
+                    call add(newChildNodes, newNode)
+
+                "the node doesnt exist so create it
+                else
+                    let newNode = g:NERDTreeFileNode.New(path, self.getNerdtree())
+                    let newNode.parent = self
+                    call add(newChildNodes, newNode)
+                endif
+            catch /^NERDTree.\(InvalidArguments\|InvalidFiletype\)Error/
+                let invalidFilesFound = 1
+            endtry
+        endfor
+
+        "swap this nodes children out for the children we just read/refreshed
+        let self.children = newChildNodes
+        call self.sortChildren()
+
+        if invalidFilesFound
+            call nerdtree#echoWarning('some files could not be loaded into the NERD tree')
+        endif
+    endif
+endfunction
+
+" FUNCTION: TreeDirNode.refreshFlags() {{{1
+unlet s:TreeDirNode.refreshFlags
+function! s:TreeDirNode.refreshFlags()
+    call self.path.refreshFlags(self.getNerdtree())
+    for i in self.children
+        call i.refreshFlags()
+    endfor
+endfunction
+
+" FUNCTION: TreeDirNode.refreshDirFlags() {{{1
+function! s:TreeDirNode.refreshDirFlags()
+    call self.path.refreshFlags(self.getNerdtree())
+endfunction
+
+" FUNCTION: TreeDirNode.reveal(path) {{{1
+" reveal the given path, i.e. cache and open all treenodes needed to display it
+" in the UI
+" Returns the revealed node
+function! s:TreeDirNode.reveal(path, ...)
+    let opts = a:0 ? a:1 : {}
+
+    if !a:path.isUnder(self.path)
+        throw 'NERDTree.InvalidArgumentsError: ' . a:path.str() . ' should be under ' . self.path.str()
+    endif
+
+    call self.open()
+
+    if self.path.equals(a:path.getParent())
+        let n = self.findNode(a:path)
+        " We may be looking for a newly-saved file that isn't in the tree yet.
+        if n ==# {}
+            call self.refresh()
+            let n = self.findNode(a:path)
+        endif
+        if has_key(opts, 'open')
+            call n.open()
+        endif
+        return n
+    endif
+
+    let p = a:path
+    while !p.getParent().equals(self.path)
+        let p = p.getParent()
+    endwhile
+
+    let n = self.findNode(p)
+    return n.reveal(a:path, opts)
+endfunction
+
+" FUNCTION: TreeDirNode.removeChild(treenode) {{{1
+" Remove the given treenode from self.children.
+" Throws NERDTree.ChildNotFoundError if the node is not found.
+"
+" Args:
+" treenode: the node object to remove
+function! s:TreeDirNode.removeChild(treenode)
+    for i in range(0, self.getChildCount()-1)
+        if self.children[i].equals(a:treenode)
+            call remove(self.children, i)
+            return
+        endif
+    endfor
+
+    throw 'NERDTree.ChildNotFoundError: child node was not found'
+endfunction
+
+" FUNCTION: TreeDirNode.sortChildren() {{{1
+" Sort self.children by alphabetical order and directory priority.
+function! s:TreeDirNode.sortChildren()
+    if count(g:NERDTreeSortOrder, '*') < 1
+        call add(g:NERDTreeSortOrder, '*')
+    endif
+    let CompareFunc = function('nerdtree#compareNodes')
+    call sort(self.children, CompareFunc)
+    let g:NERDTreeOldSortOrder = g:NERDTreeSortOrder
+endfunction
+
+" FUNCTION: TreeDirNode.toggleOpen([options]) {{{1
+" Opens this directory if it is closed and vice versa
+function! s:TreeDirNode.toggleOpen(...)
+    let opts = a:0 ? a:1 : {}
+    if self.isOpen ==# 1
+        call self.close()
+    else
+        if g:NERDTreeCascadeOpenSingleChildDir ==# 0
+            call self.open(opts)
+        else
+            call self.openAlong(opts)
+        endif
+    endif
+endfunction
+
+" FUNCTION: TreeDirNode.transplantChild(newNode) {{{1
+" Replaces the child of this with the given node (where the child node's full
+" path matches a:newNode's fullpath). The search for the matching node is
+" non-recursive
+"
+" Arg:
+" newNode: the node to graft into the tree
+function! s:TreeDirNode.transplantChild(newNode)
+    for i in range(0, self.getChildCount()-1)
+        if self.children[i].equals(a:newNode)
+            let self.children[i] = a:newNode
+            let a:newNode.parent = self
+            break
+        endif
+    endfor
+endfunction
+
+" vim: set sw=4 sts=4 et fdm=marker:
diff --git a/.vim/pack/vendor/start/nerdtree/lib/nerdtree/tree_file_node.vim b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/tree_file_node.vim
new file mode 100644
index 0000000..957b98a
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/tree_file_node.vim
@@ -0,0 +1,349 @@
+" ============================================================================
+" CLASS: TreeFileNode
+"
+" This class is the parent of the TreeDirNode class and is the 'Component'
+" part of the composite design pattern between the NERDTree node classes.
+" ============================================================================
+
+
+let s:TreeFileNode = {}
+let g:NERDTreeFileNode = s:TreeFileNode
+
+" FUNCTION: TreeFileNode.activate(...) {{{1
+function! s:TreeFileNode.activate(...)
+    call self.open(a:0 ? a:1 : {})
+endfunction
+
+" FUNCTION: TreeFileNode.bookmark(name) {{{1
+" bookmark this node with a:name
+function! s:TreeFileNode.bookmark(name)
+
+    " if a bookmark exists with the same name and the node is cached then save
+    " it so we can update its display string
+    let oldMarkedNode = {}
+    try
+        let oldMarkedNode = g:NERDTreeBookmark.GetNodeForName(a:name, 1, self.getNerdtree())
+    catch /^NERDTree.BookmarkNotFoundError/
+    catch /^NERDTree.BookmarkedNodeNotFoundError/
+    endtry
+
+    call g:NERDTreeBookmark.AddBookmark(a:name, self.path)
+    call self.path.cacheDisplayString()
+    call g:NERDTreeBookmark.Write()
+
+    if !empty(oldMarkedNode)
+        call oldMarkedNode.path.cacheDisplayString()
+    endif
+endfunction
+
+" FUNCTION: TreeFileNode.cacheParent() {{{1
+" initializes self.parent if it isnt already
+function! s:TreeFileNode.cacheParent()
+    if empty(self.parent)
+        let parentPath = self.path.getParent()
+        if parentPath.equals(self.path)
+            throw 'NERDTree.CannotCacheParentError: already at root'
+        endif
+        let self.parent = s:TreeFileNode.New(parentPath, self.getNerdtree())
+    endif
+endfunction
+
+" FUNCTION: TreeFileNode.clearBookmarks() {{{1
+function! s:TreeFileNode.clearBookmarks()
+    for i in g:NERDTreeBookmark.Bookmarks()
+        if i.path.equals(self.path)
+            call i.delete()
+        end
+    endfor
+    call self.path.cacheDisplayString()
+endfunction
+
+" FUNCTION: TreeFileNode.copy(dest) {{{1
+function! s:TreeFileNode.copy(dest)
+    call self.path.copy(a:dest)
+    let newPath = g:NERDTreePath.New(a:dest)
+    let parent = self.getNerdtree().root.findNode(newPath.getParent())
+    if !empty(parent)
+        call parent.refresh()
+        return parent.findNode(newPath)
+    else
+        return {}
+    endif
+endfunction
+
+" FUNCTION: TreeFileNode.delete {{{1
+" Removes this node from the tree and calls the Delete method for its path obj
+function! s:TreeFileNode.delete()
+    call self.path.delete()
+    call self.parent.removeChild(self)
+endfunction
+
+" FUNCTION: TreeFileNode.displayString() {{{1
+"
+" Returns a string that specifies how the node should be represented as a
+" string
+"
+" Return:
+" a string that can be used in the view to represent this node
+function! s:TreeFileNode.displayString()
+    return self.path.flagSet.renderToString() . self.path.displayString()
+endfunction
+
+" FUNCTION: TreeFileNode.equals(treenode) {{{1
+"
+" Compares this treenode to the input treenode and returns 1 if they are the
+" same node.
+"
+" Use this method instead of ==  because sometimes when the treenodes contain
+" many children, vim seg faults when doing ==
+"
+" Args:
+" treenode: the other treenode to compare to
+function! s:TreeFileNode.equals(treenode)
+    return self.path.str() ==# a:treenode.path.str()
+endfunction
+
+" FUNCTION: TreeFileNode.findNode(path) {{{1
+" Returns self if this node.path.Equals the given path.
+" Returns {} if not equal.
+"
+" Args:
+" path: the path object to compare against
+function! s:TreeFileNode.findNode(path)
+    if a:path.equals(self.path)
+        return self
+    endif
+    return {}
+endfunction
+
+" FUNCTION: TreeFileNode.findSibling(direction) {{{1
+" Find the next or previous sibling of this node.
+"
+" Args:
+" direction: 0 for previous, 1 for next
+"
+" Return:
+" The next/previous TreeFileNode object or an empty dictionary if not found.
+function! s:TreeFileNode.findSibling(direction)
+
+    " There can be no siblings if there is no parent.
+    if empty(self.parent)
+        return {}
+    endif
+
+    let l:nodeIndex = self.parent.getChildIndex(self.path)
+
+    if l:nodeIndex == -1
+        return {}
+    endif
+
+    " Get the next index to begin the search.
+    let l:nodeIndex += a:direction ? 1 : -1
+
+    while 0 <= l:nodeIndex && l:nodeIndex < self.parent.getChildCount()
+
+        " Return the next node if it is not ignored.
+        if !self.parent.children[l:nodeIndex].path.ignore(self.getNerdtree())
+            return self.parent.children[l:nodeIndex]
+        endif
+
+        let l:nodeIndex += a:direction ? 1 : -1
+    endwhile
+
+    return {}
+endfunction
+
+" FUNCTION: TreeFileNode.getNerdtree(){{{1
+function! s:TreeFileNode.getNerdtree()
+    return self._nerdtree
+endfunction
+
+" FUNCTION: TreeFileNode.GetRootForTab(){{{1
+" get the root node for this tab
+function! s:TreeFileNode.GetRootForTab()
+    if g:NERDTree.ExistsForTab()
+        return getbufvar(t:NERDTreeBufName, 'NERDTree').root
+    end
+    return {}
+endfunction
+
+" FUNCTION: TreeFileNode.GetSelected() {{{1
+" If the cursor is currently positioned on a tree node, return the node.
+" Otherwise, return the empty dictionary.
+function! s:TreeFileNode.GetSelected()
+
+    try
+        let l:path = b:NERDTree.ui.getPath(line('.'))
+
+        if empty(l:path)
+            return {}
+        endif
+
+        return b:NERDTree.root.findNode(l:path)
+    catch
+        return {}
+    endtry
+endfunction
+
+" FUNCTION: TreeFileNode.isVisible() {{{1
+" returns 1 if this node should be visible according to the tree filters and
+" hidden file filters (and their on/off status)
+function! s:TreeFileNode.isVisible()
+    return !self.path.ignore(self.getNerdtree())
+endfunction
+
+" FUNCTION: TreeFileNode.isRoot() {{{1
+function! s:TreeFileNode.isRoot()
+    if !g:NERDTree.ExistsForBuf()
+        throw 'NERDTree.NoTreeError: No tree exists for the current buffer'
+    endif
+
+    return self.equals(self.getNerdtree().root)
+endfunction
+
+" FUNCTION: TreeFileNode.New(path, nerdtree) {{{1
+" Returns a new TreeNode object with the given path and parent
+"
+" Args:
+" path: file/dir that the node represents
+" nerdtree: the tree the node belongs to
+function! s:TreeFileNode.New(path, nerdtree)
+    if a:path.isDirectory
+        return g:NERDTreeDirNode.New(a:path, a:nerdtree)
+    else
+        let newTreeNode = copy(self)
+        let newTreeNode.path = a:path
+        let newTreeNode.parent = {}
+        let newTreeNode._nerdtree = a:nerdtree
+        return newTreeNode
+    endif
+endfunction
+
+" FUNCTION: TreeFileNode.open() {{{1
+function! s:TreeFileNode.open(...)
+    let opts = a:0 ? a:1 : {}
+    let opener = g:NERDTreeOpener.New(self.path, opts)
+    call opener.open(self)
+endfunction
+
+" FUNCTION: TreeFileNode.openSplit() {{{1
+" Open this node in a new window
+function! s:TreeFileNode.openSplit()
+    call nerdtree#deprecated('TreeFileNode.openSplit', 'is deprecated, use .open() instead.')
+    call self.open({'where': 'h'})
+endfunction
+
+" FUNCTION: TreeFileNode.openVSplit() {{{1
+" Open this node in a new vertical window
+function! s:TreeFileNode.openVSplit()
+    call nerdtree#deprecated('TreeFileNode.openVSplit', 'is deprecated, use .open() instead.')
+    call self.open({'where': 'v'})
+endfunction
+
+" FUNCTION: TreeFileNode.openInNewTab(options) {{{1
+function! s:TreeFileNode.openInNewTab(options)
+    call nerdtree#deprecated('TreeFileNode.openinNewTab', 'is deprecated, use .open() instead.')
+    call self.open(extend({'where': 't'}, a:options))
+endfunction
+
+" FUNCTION: TreeFileNode.openExplorer()
+function! s:TreeFileNode.openExplorer()
+    execute 'wincmd p'
+    execute 'edit '.self.path.getParent().str({'format':'Edit'})
+endfunction
+
+" FUNCTION: TreeFileNode.putCursorHere(isJump, recurseUpward){{{1
+" Places the cursor on the line number this node is rendered on
+"
+" Args:
+" isJump: 1 if this cursor movement should be counted as a jump by vim
+" recurseUpward: try to put the cursor on the parent if the this node isnt
+" visible
+function! s:TreeFileNode.putCursorHere(isJump, recurseUpward)
+    let ln = self.getNerdtree().ui.getLineNum(self)
+    if ln != -1
+        if a:isJump
+            mark '
+        endif
+        call cursor(ln, col('.'))
+    else
+        if a:recurseUpward
+            let node = self
+            while node != {} && self.getNerdtree().ui.getLineNum(node) ==# -1
+                let node = node.parent
+                call node.open()
+            endwhile
+            call self._nerdtree.render()
+            call node.putCursorHere(a:isJump, 0)
+        endif
+    endif
+endfunction
+
+" FUNCTION: TreeFileNode.refresh() {{{1
+function! s:TreeFileNode.refresh()
+    call self.path.refresh(self.getNerdtree())
+endfunction
+
+" FUNCTION: TreeFileNode.refreshFlags() {{{1
+function! s:TreeFileNode.refreshFlags()
+    call self.path.refreshFlags(self.getNerdtree())
+endfunction
+
+" FUNCTION: TreeFileNode.rename() {{{1
+" Calls the rename method for this nodes path obj
+function! s:TreeFileNode.rename(newName)
+    let newName = substitute(a:newName, '\(\\\|\/\)$', '', '')
+    call self.path.rename(newName)
+    call self.parent.removeChild(self)
+
+    let parentPath = self.path.getParent()
+    let newParent = self.getNerdtree().root.findNode(parentPath)
+
+    if newParent != {}
+        call newParent.createChild(self.path, 1)
+        call newParent.refresh()
+    endif
+endfunction
+
+" FUNCTION: TreeFileNode.renderToString {{{1
+" returns a string representation for this tree to be rendered in the view
+function! s:TreeFileNode.renderToString()
+    return self._renderToString(0, 0)
+endfunction
+
+" Args:
+" depth: the current depth in the tree for this call
+" drawText: 1 if we should actually draw the line for this node (if 0 then the
+" child nodes are rendered only)
+" for each depth in the tree
+function! s:TreeFileNode._renderToString(depth, drawText)
+    let output = ''
+    if a:drawText ==# 1
+
+        let treeParts = repeat('  ', a:depth - 1)
+        let treeParts .= (self.path.isDirectory || g:NERDTreeDirArrowExpandable ==# '' ? '' : '  ')
+
+        let line = treeParts . self.displayString()
+        let output = output . line . "\n"
+    endif
+
+    " if the node is an open dir, draw its children
+    if self.path.isDirectory ==# 1 && self.isOpen ==# 1
+
+        let childNodesToDraw = self.getVisibleChildren()
+
+        if self.isCascadable() && a:depth > 0
+
+            let output = output . childNodesToDraw[0]._renderToString(a:depth, 0)
+
+        elseif len(childNodesToDraw) > 0
+            for i in childNodesToDraw
+                let output = output . i._renderToString(a:depth + 1, 1)
+            endfor
+        endif
+    endif
+
+    return output
+endfunction
+
+" vim: set sw=4 sts=4 et fdm=marker:
diff --git a/.vim/pack/vendor/start/nerdtree/lib/nerdtree/ui.vim b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/ui.vim
new file mode 100644
index 0000000..a481ba4
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/lib/nerdtree/ui.vim
@@ -0,0 +1,532 @@
+" ============================================================================
+" CLASS: UI
+" ============================================================================
+
+
+let s:UI = {}
+let g:NERDTreeUI = s:UI
+
+" FUNCTION: s:UI.centerView() {{{1
+" centers the nerd tree window around the cursor (provided the nerd tree
+" options permit)
+function! s:UI.centerView()
+    if g:NERDTreeAutoCenter
+        let current_line = winline()
+        let lines_to_top = current_line
+        let lines_to_bottom = winheight(g:NERDTree.GetWinNum()) - current_line
+        if lines_to_top < g:NERDTreeAutoCenterThreshold || lines_to_bottom < g:NERDTreeAutoCenterThreshold
+            normal! zz
+        endif
+    endif
+endfunction
+
+" FUNCTION: s:UI._dumpHelp  {{{1
+" prints out the quick help
+function! s:UI._dumpHelp()
+    if self.getShowHelp()
+        let help  = "\" NERDTree (" . nerdtree#version() . ") quickhelp~\n"
+        let help .= "\" ============================\n"
+        let help .= "\" File node mappings~\n"
+        let help .= '" '. (g:NERDTreeMouseMode ==# 3 ? 'single' : 'double') ."-click,\n"
+        if self.nerdtree.isTabTree()
+            let help .= '" '. g:NERDTreeMapActivateNode .": open in prev window\n"
+        else
+            let help .= '" '. g:NERDTreeMapActivateNode .": open in current window\n"
+        endif
+        if self.nerdtree.isTabTree()
+            let help .= '" '. g:NERDTreeMapPreview .": preview\n"
+        endif
+        let help .= '" '. g:NERDTreeMapOpenInTab.": open in new tab\n"
+        let help .= '" '. g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n"
+        let help .= "\" middle-click,\n"
+        let help .= '" '. g:NERDTreeMapOpenSplit .": open split\n"
+        let help .= '" '. g:NERDTreeMapPreviewSplit .": preview split\n"
+        let help .= '" '. g:NERDTreeMapOpenVSplit .": open vsplit\n"
+        let help .= '" '. g:NERDTreeMapPreviewVSplit .": preview vsplit\n"
+        let help .= '" '. g:NERDTreeMapCustomOpen .": custom open\n"
+
+        let help .= "\"\n\" ----------------------------\n"
+        let help .= "\" Directory node mappings~\n"
+        let help .= '" '. (g:NERDTreeMouseMode ==# 1 ? 'double' : 'single') ."-click,\n"
+        let help .= '" '. g:NERDTreeMapActivateNode .": open & close node\n"
+        let help .= '" '. g:NERDTreeMapOpenRecursively .": recursively open node\n"
+        let help .= '" '. g:NERDTreeMapOpenInTab.": open in new tab\n"
+        let help .= '" '. g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n"
+        let help .= '" '. g:NERDTreeMapCustomOpen .": custom open\n"
+        let help .= '" '. g:NERDTreeMapCloseDir .": close parent of node\n"
+        let help .= '" '. g:NERDTreeMapCloseChildren .": close all child nodes of\n"
+        let help .= "\"    current node recursively\n"
+        let help .= "\" middle-click,\n"
+        let help .= '" '. g:NERDTreeMapOpenExpl.": explore selected dir\n"
+
+        let help .= "\"\n\" ----------------------------\n"
+        let help .= "\" Bookmark table mappings~\n"
+        let help .= "\" double-click,\n"
+        let help .= '" '. g:NERDTreeMapActivateNode .": open bookmark\n"
+        let help .= '" '. g:NERDTreeMapPreview .": preview file\n"
+        let help .= '" '. g:NERDTreeMapPreview .": find dir in tree\n"
+        let help .= '" '. g:NERDTreeMapOpenInTab.": open in new tab\n"
+        let help .= '" '. g:NERDTreeMapOpenInTabSilent .": open in new tab silently\n"
+        let help .= '" '. g:NERDTreeMapOpenSplit .": open split\n"
+        let help .= '" '. g:NERDTreeMapPreviewSplit .": preview split\n"
+        let help .= '" '. g:NERDTreeMapOpenVSplit .": open vsplit\n"
+        let help .= '" '. g:NERDTreeMapPreviewVSplit .": preview vsplit\n"
+        let help .= '" '. g:NERDTreeMapCustomOpen .": custom open\n"
+        let help .= '" '. g:NERDTreeMapDeleteBookmark .": delete bookmark\n"
+
+        let help .= "\"\n\" ----------------------------\n"
+        let help .= "\" Tree navigation mappings~\n"
+        let help .= '" '. g:NERDTreeMapJumpRoot .": go to root\n"
+        let help .= '" '. g:NERDTreeMapJumpParent .": go to parent\n"
+        let help .= '" '. g:NERDTreeMapJumpFirstChild  .": go to first child\n"
+        let help .= '" '. g:NERDTreeMapJumpLastChild   .": go to last child\n"
+        let help .= '" '. g:NERDTreeMapJumpNextSibling .": go to next sibling\n"
+        let help .= '" '. g:NERDTreeMapJumpPrevSibling .": go to prev sibling\n"
+
+        let help .= "\"\n\" ----------------------------\n"
+        let help .= "\" Filesystem mappings~\n"
+        let help .= '" '. g:NERDTreeMapChangeRoot .": change tree root to the\n"
+        let help .= "\"    selected dir\n"
+        let help .= '" '. g:NERDTreeMapUpdir .": move tree root up a dir\n"
+        let help .= '" '. g:NERDTreeMapUpdirKeepOpen .": move tree root up a dir\n"
+        let help .= "\"    but leave old root open\n"
+        let help .= '" '. g:NERDTreeMapRefresh .": refresh cursor dir\n"
+        let help .= '" '. g:NERDTreeMapRefreshRoot .": refresh current root\n"
+        let help .= '" '. g:NERDTreeMapMenu .": Show menu\n"
+        let help .= '" '. g:NERDTreeMapChdir .":change the CWD to the\n"
+        let help .= "\"    selected dir\n"
+        let help .= '" '. g:NERDTreeMapCWD .":change tree root to CWD\n"
+
+        let help .= "\"\n\" ----------------------------\n"
+        let help .= "\" Tree filtering mappings~\n"
+        let help .= '" '. g:NERDTreeMapToggleHidden .': hidden files (' . (self.getShowHidden() ? 'on' : 'off') . ")\n"
+        let help .= '" '. g:NERDTreeMapToggleFilters .': file filters (' . (self.isIgnoreFilterEnabled() ? 'on' : 'off') . ")\n"
+        let help .= '" '. g:NERDTreeMapToggleFiles .': files (' . (self.getShowFiles() ? 'on' : 'off') . ")\n"
+        let help .= '" '. g:NERDTreeMapToggleBookmarks .': bookmarks (' . (self.getShowBookmarks() ? 'on' : 'off') . ")\n"
+
+        " add quickhelp entries for each custom key map
+        let help .= "\"\n\" ----------------------------\n"
+        let help .= "\" Custom mappings~\n"
+        for i in g:NERDTreeKeyMap.All()
+            if !empty(i.quickhelpText)
+                let help .= '" '. i.key .': '. i.quickhelpText ."\n"
+            endif
+        endfor
+
+        let help .= "\"\n\" ----------------------------\n"
+        let help .= "\" Other mappings~\n"
+        let help .= '" '. g:NERDTreeMapQuit .": Close the NERDTree window\n"
+        let help .= '" '. g:NERDTreeMapToggleZoom .": Zoom (maximize-minimize)\n"
+        let help .= "\"    the NERDTree window\n"
+        let help .= '" '. g:NERDTreeMapHelp .": toggle help\n"
+        let help .= "\"\n\" ----------------------------\n"
+        let help .= "\" Bookmark commands~\n"
+        let help .= "\" :Bookmark [<name>]\n"
+        let help .= "\" :BookmarkToRoot <name>\n"
+        let help .= "\" :RevealBookmark <name>\n"
+        let help .= "\" :OpenBookmark <name>\n"
+        let help .= "\" :ClearBookmarks [<names>]\n"
+        let help .= "\" :ClearAllBookmarks\n"
+        let help .= "\" :ReadBookmarks\n"
+        let help .= "\" :WriteBookmarks\n"
+        let help .= "\" :EditBookmarks\n"
+        silent! put =help
+    elseif !self.isMinimal()
+        let help ='" Press '. g:NERDTreeMapHelp ." for help\n"
+        silent! put =help
+    endif
+endfunction
+
+
+" FUNCTION: s:UI.new(nerdtree) {{{1
+function! s:UI.New(nerdtree)
+    let newObj = copy(self)
+    let newObj.nerdtree = a:nerdtree
+    let newObj._showHelp = 0
+    let newObj._ignoreEnabled = 1
+    let newObj._showFiles = g:NERDTreeShowFiles
+    let newObj._showHidden = g:NERDTreeShowHidden
+    let newObj._showBookmarks = g:NERDTreeShowBookmarks
+
+    return newObj
+endfunction
+
+" FUNCTION: s:UI.getPath(ln) {{{1
+" Return the Path object for the node that is rendered on the given line
+" number.  If the 'up a dir' line is selected, return the Path object for
+" the parent of the root.  Return the empty dictionary if the given line
+" does not reference a tree node.
+function! s:UI.getPath(ln)
+    let line = getline(a:ln)
+
+    let rootLine = self.getRootLineNum()
+
+    if a:ln ==# rootLine
+        return self.nerdtree.root.path
+    endif
+
+    if line ==# s:UI.UpDirLine()
+        return self.nerdtree.root.path.getParent()
+    endif
+
+    if a:ln < rootLine
+        return {}
+    endif
+
+    let indent = self._indentLevelFor(line)
+
+    " remove the tree parts and the leading space
+    let curFile = self._stripMarkup(line)
+
+    let dir = ''
+    let lnum = a:ln
+    while lnum > 0
+        let lnum = lnum - 1
+        let curLine = getline(lnum)
+        let curLineStripped = self._stripMarkup(curLine)
+
+        " have we reached the top of the tree?
+        if lnum ==# rootLine
+            let dir = self.nerdtree.root.path.str({'format': 'UI'}) . dir
+            break
+        endif
+        if curLineStripped =~# '/$'
+            let lpindent = self._indentLevelFor(curLine)
+            if lpindent < indent
+                let indent = indent - 1
+
+                let dir = substitute (curLineStripped,'^\\', '', '') . dir
+                continue
+            endif
+        endif
+    endwhile
+    let curFile = self.nerdtree.root.path.drive . dir . curFile
+    let toReturn = g:NERDTreePath.New(curFile)
+    return toReturn
+endfunction
+
+" FUNCTION: s:UI.getLineNum(node) {{{1
+" Return the line number where the given node is rendered.  Return -1 if the
+" given node is not visible.
+function! s:UI.getLineNum(node)
+
+    if a:node.isRoot()
+        return self.getRootLineNum()
+    endif
+
+    let l:pathComponents = [substitute(self.nerdtree.root.path.str({'format': 'UI'}), '/\s*$', '', '')]
+    let l:currentPathComponent = 1
+
+    let l:fullPath = a:node.path.str({'format': 'UI'})
+
+    for l:lineNumber in range(self.getRootLineNum() + 1, line('$'))
+        let l:currentLine = getline(l:lineNumber)
+        let l:indentLevel = self._indentLevelFor(l:currentLine)
+
+        if l:indentLevel !=# l:currentPathComponent
+            continue
+        endif
+
+        let l:currentLine = self._stripMarkup(l:currentLine)
+        let l:currentPath =  join(l:pathComponents, '/') . '/' . l:currentLine
+
+        " Directories: If the current path 'starts with' the full path, then
+        " either the paths are equal or the line is a cascade containing the
+        " full path.
+        if l:fullPath[-1:] ==# '/' && stridx(l:currentPath, l:fullPath) ==# 0
+            return l:lineNumber
+        endif
+
+        " Files: The paths must exactly match.
+        if l:fullPath ==# l:currentPath
+            return l:lineNumber
+        endif
+
+        " Otherwise: If the full path starts with the current path and the
+        " current path is a directory, we add a new path component.
+        if stridx(l:fullPath, l:currentPath) ==# 0 && l:currentPath[-1:] ==# '/'
+            let l:currentLine = substitute(l:currentLine, '/\s*$', '', '')
+            call add(l:pathComponents, l:currentLine)
+            let l:currentPathComponent += 1
+        endif
+    endfor
+
+    return -1
+endfunction
+
+" FUNCTION: s:UI.getRootLineNum(){{{1
+" gets the line number of the root node
+function! s:UI.getRootLineNum()
+    let rootLine = 1
+    while rootLine <= line('$') && getline(rootLine) !~# '^\(/\|<\)'
+        let rootLine = rootLine + 1
+    endwhile
+    return rootLine
+endfunction
+
+" FUNCTION: s:UI.getShowBookmarks() {{{1
+function! s:UI.getShowBookmarks()
+    return self._showBookmarks
+endfunction
+
+" FUNCTION: s:UI.getShowFiles() {{{1
+function! s:UI.getShowFiles()
+    return self._showFiles
+endfunction
+
+" FUNCTION: s:UI.getShowHelp() {{{1
+function! s:UI.getShowHelp()
+    return self._showHelp
+endfunction
+
+" FUNCTION: s:UI.getShowHidden() {{{1
+function! s:UI.getShowHidden()
+    return self._showHidden
+endfunction
+
+" FUNCTION: s:UI._indentLevelFor(line) {{{1
+function! s:UI._indentLevelFor(line)
+    " Replace multi-character DirArrows with a single space so the
+    " indentation calculation doesn't get messed up.
+    if g:NERDTreeDirArrowExpandable ==# ''
+        let l:line = '  '.a:line
+    else
+        let l:line = substitute(substitute(a:line, '\V'.g:NERDTreeDirArrowExpandable, ' ', ''), '\V'.g:NERDTreeDirArrowCollapsible, ' ', '')
+    endif
+    let leadChars = match(l:line, '\M\[^ ]')
+    return leadChars / s:UI.IndentWid()
+endfunction
+
+" FUNCTION: s:UI.IndentWid() {{{1
+function! s:UI.IndentWid()
+    return 2
+endfunction
+
+" FUNCTION: s:UI.isIgnoreFilterEnabled() {{{1
+function! s:UI.isIgnoreFilterEnabled()
+    return self._ignoreEnabled ==# 1
+endfunction
+
+" FUNCTION: s:UI.isMinimal() {{{1
+function! s:UI.isMinimal()
+    return g:NERDTreeMinimalUI
+endfunction
+
+" FUNCTION: s:UI.MarkupReg() {{{1
+function! s:UI.MarkupReg()
+    return '^ *['.g:NERDTreeDirArrowExpandable.g:NERDTreeDirArrowCollapsible.']\? '
+endfunction
+
+" FUNCTION: s:UI._renderBookmarks {{{1
+function! s:UI._renderBookmarks()
+
+    if !self.isMinimal()
+        call setline(line('.')+1, '>----------Bookmarks----------')
+        call cursor(line('.')+1, col('.'))
+    endif
+
+    if g:NERDTreeBookmarksSort ==# 1 || g:NERDTreeBookmarksSort ==# 2
+        call g:NERDTreeBookmark.SortBookmarksList()
+    endif
+
+    for i in g:NERDTreeBookmark.Bookmarks()
+        call setline(line('.')+1, i.str())
+        call cursor(line('.')+1, col('.'))
+    endfor
+
+    call setline(line('.')+1, '')
+    call cursor(line('.')+1, col('.'))
+endfunction
+
+" FUNCTION: s:UI.restoreScreenState() {{{1
+"
+" Sets the screen state back to what it was when nerdtree#saveScreenState was last
+" called.
+"
+" Assumes the cursor is in the NERDTree window
+function! s:UI.restoreScreenState()
+    if !has_key(self, '_screenState')
+        return
+    endif
+    call nerdtree#exec('silent vertical resize ' . self._screenState['oldWindowSize'], 1)
+
+    let old_scrolloff=&scrolloff
+    let &scrolloff=0
+    call cursor(self._screenState['oldTopLine'], 0)
+    normal! zt
+    call setpos('.', self._screenState['oldPos'])
+    let &scrolloff=old_scrolloff
+endfunction
+
+" FUNCTION: s:UI.saveScreenState() {{{1
+" Saves the current cursor position in the current buffer and the window
+" scroll position
+function! s:UI.saveScreenState()
+    let win = winnr()
+    let self._screenState = {}
+    try
+        call g:NERDTree.CursorToTreeWin()
+        let self._screenState['oldPos'] = getpos('.')
+        let self._screenState['oldTopLine'] = line('w0')
+        let self._screenState['oldWindowSize'] = winnr('$')==1 ? g:NERDTreeWinSize : winwidth('')
+        call nerdtree#exec(win . 'wincmd w', 1)
+    catch
+    endtry
+endfunction
+
+" FUNCTION: s:UI.setShowHidden(val) {{{1
+function! s:UI.setShowHidden(val)
+    let self._showHidden = a:val
+endfunction
+
+" FUNCTION: s:UI._stripMarkup(line){{{1
+" find the filename in the given line, and return it.
+"
+" Args:
+" line: the subject line
+function! s:UI._stripMarkup(line)
+    let l:line = substitute(a:line, '^.\{-}' . g:NERDTreeNodeDelimiter, '', '')
+    return substitute(l:line, g:NERDTreeNodeDelimiter.'.*$', '', '')
+endfunction
+
+" FUNCTION: s:UI.render() {{{1
+function! s:UI.render()
+    setlocal noreadonly modifiable
+
+    " remember the top line of the buffer and the current line so we can
+    " restore the view exactly how it was
+    let curLine = line('.')
+    let curCol = col('.')
+    let topLine = line('w0')
+
+    " delete all lines in the buffer (being careful not to clobber a register)
+    silent 1,$delete _
+
+    call self._dumpHelp()
+
+    " delete the blank line before the help and add one after it
+    if !self.isMinimal()
+        call setline(line('.')+1, '')
+        call cursor(line('.')+1, col('.'))
+    endif
+
+    if self.getShowBookmarks()
+        call self._renderBookmarks()
+    endif
+
+    " add the 'up a dir' line
+    if !self.isMinimal()
+        call setline(line('.')+1, s:UI.UpDirLine())
+        call cursor(line('.')+1, col('.'))
+    endif
+
+    " draw the header line
+    let header = self.nerdtree.root.path.str({'format': 'UI', 'truncateTo': winwidth(0)})
+    call setline(line('.')+1, header)
+    call cursor(line('.')+1, col('.'))
+
+    " draw the tree
+    silent put =self.nerdtree.root.renderToString()
+
+    " delete the blank line at the top of the buffer
+    silent 1,1delete _
+
+    " restore the view
+    let old_scrolloff=&scrolloff
+    let &scrolloff=0
+    call cursor(topLine, 1)
+    normal! zt
+    call cursor(curLine, curCol)
+    let &scrolloff = old_scrolloff
+
+    setlocal readonly nomodifiable
+endfunction
+
+
+" FUNCTION: UI.renderViewSavingPosition {{{1
+" Renders the tree and ensures the cursor stays on the current node or the
+" current nodes parent if it is no longer available upon re-rendering
+function! s:UI.renderViewSavingPosition()
+    let currentNode = g:NERDTreeFileNode.GetSelected()
+
+    " go up the tree till we find a node that will be visible or till we run
+    " out of nodes
+    while currentNode !=# {} && !currentNode.isVisible() && !currentNode.isRoot()
+        let currentNode = currentNode.parent
+    endwhile
+
+    call self.render()
+
+    if currentNode !=# {}
+        call currentNode.putCursorHere(0, 0)
+    endif
+endfunction
+
+" FUNCTION: s:UI.toggleHelp() {{{1
+function! s:UI.toggleHelp()
+    let self._showHelp = !self._showHelp
+endfunction
+
+" FUNCTION: s:UI.toggleIgnoreFilter() {{{1
+" toggles the use of the NERDTreeIgnore option
+function! s:UI.toggleIgnoreFilter()
+    let self._ignoreEnabled = !self._ignoreEnabled
+    call self.renderViewSavingPosition()
+    call self.centerView()
+endfunction
+
+" FUNCTION: s:UI.toggleShowBookmarks() {{{1
+" Toggle the visibility of the Bookmark table.
+function! s:UI.toggleShowBookmarks()
+    let self._showBookmarks = !self._showBookmarks
+
+    if self.getShowBookmarks()
+        call self.nerdtree.render()
+        call g:NERDTree.CursorToBookmarkTable()
+    else
+
+        if empty(g:NERDTreeFileNode.GetSelected())
+            call b:NERDTree.root.putCursorHere(0, 0)
+            normal! 0
+        endif
+
+        call self.renderViewSavingPosition()
+    endif
+
+    call self.centerView()
+endfunction
+
+" FUNCTION: s:UI.toggleShowFiles() {{{1
+" toggles the display of hidden files
+function! s:UI.toggleShowFiles()
+    let self._showFiles = !self._showFiles
+    call self.renderViewSavingPosition()
+    call self.centerView()
+endfunction
+
+" FUNCTION: s:UI.toggleShowHidden() {{{1
+" toggles the display of hidden files
+function! s:UI.toggleShowHidden()
+    let self._showHidden = !self._showHidden
+    call self.renderViewSavingPosition()
+    call self.centerView()
+endfunction
+
+" FUNCTION: s:UI.toggleZoom() {{{1
+" zoom (maximize/minimize) the NERDTree window
+function! s:UI.toggleZoom()
+    if exists('b:NERDTreeZoomed') && b:NERDTreeZoomed
+        call nerdtree#exec('silent vertical resize '. g:NERDTreeWinSize, 1)
+        let b:NERDTreeZoomed = 0
+    else
+        call nerdtree#exec('vertical resize '. get(g:, 'NERDTreeWinSizeMax', ''), 1)
+        let b:NERDTreeZoomed = 1
+    endif
+endfunction
+
+" FUNCTION: s:UI.UpDirLine() {{{1
+function! s:UI.UpDirLine()
+    return '.. (up a dir)'
+endfunction
+
+" vim: set sw=4 sts=4 et fdm=marker:
diff --git a/.vim/pack/vendor/start/nerdtree/nerdtree_plugin/exec_menuitem.vim b/.vim/pack/vendor/start/nerdtree/nerdtree_plugin/exec_menuitem.vim
new file mode 100644
index 0000000..fb6c486
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/nerdtree_plugin/exec_menuitem.vim
@@ -0,0 +1,40 @@
+" ============================================================================
+" File:        exec_menuitem.vim
+" Description: plugin for NERD Tree that provides an execute file menu item
+" Maintainer:  Martin Grenfell <martin.grenfell at gmail dot com>
+" License:     This program is free software. It comes without any warranty,
+"              to the extent permitted by applicable law. You can redistribute
+"              it and/or modify it under the terms of the Do What The Fuck You
+"              Want To Public License, Version 2, as published by Sam Hocevar.
+"              See http://sam.zoy.org/wtfpl/COPYING for more details.
+"
+" ============================================================================
+if exists('g:loaded_nerdtree_exec_menuitem')
+    finish
+endif
+let g:loaded_nerdtree_exec_menuitem = 1
+
+call NERDTreeAddMenuItem({
+            \ 'text': '(!)Execute file',
+            \ 'shortcut': '!',
+            \ 'callback': 'NERDTreeExecFile',
+            \ 'isActiveCallback': 'NERDTreeExecFileActive' })
+
+function! NERDTreeExecFileActive()
+    let node = g:NERDTreeFileNode.GetSelected()
+    return !node.path.isDirectory && node.path.isExecutable
+endfunction
+
+function! NERDTreeExecFile()
+    let treenode = g:NERDTreeFileNode.GetSelected()
+    echo "==========================================================\n"
+    echo "Complete the command to execute (add arguments etc):\n"
+    let cmd = treenode.path.str({'escape': 1})
+    let cmd = input(':!', cmd . ' ')
+
+    if cmd !=# ''
+        exec ':!' . cmd
+    else
+        echo 'Aborted'
+    endif
+endfunction
diff --git a/.vim/pack/vendor/start/nerdtree/nerdtree_plugin/fs_menu.vim b/.vim/pack/vendor/start/nerdtree/nerdtree_plugin/fs_menu.vim
new file mode 100644
index 0000000..05bee60
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/nerdtree_plugin/fs_menu.vim
@@ -0,0 +1,484 @@
+" ============================================================================
+" File:        fs_menu.vim
+" Description: plugin for the NERD Tree that provides a file system menu
+" Maintainer:  Martin Grenfell <martin.grenfell at gmail dot com>
+" License:     This program is free software. It comes without any warranty,
+"              to the extent permitted by applicable law. You can redistribute
+"              it and/or modify it under the terms of the Do What The Fuck You
+"              Want To Public License, Version 2, as published by Sam Hocevar.
+"              See http://sam.zoy.org/wtfpl/COPYING for more details.
+"
+" ============================================================================
+if exists('g:loaded_nerdtree_fs_menu')
+    finish
+endif
+let g:loaded_nerdtree_fs_menu = 1
+
+"Automatically delete the buffer after deleting or renaming a file
+if !exists('g:NERDTreeAutoDeleteBuffer')
+    let g:NERDTreeAutoDeleteBuffer = 0
+endif
+
+call NERDTreeAddMenuItem({'text': '(a)dd a childnode', 'shortcut': 'a', 'callback': 'NERDTreeAddNode'})
+call NERDTreeAddMenuItem({'text': '(m)ove the current node', 'shortcut': 'm', 'callback': 'NERDTreeMoveNode'})
+call NERDTreeAddMenuItem({'text': '(d)elete the current node', 'shortcut': 'd', 'callback': 'NERDTreeDeleteNode'})
+
+if has('gui_mac') || has('gui_macvim') || has('mac')
+    call NERDTreeAddMenuItem({'text': '(r)eveal in Finder the current node', 'shortcut': 'r', 'callback': 'NERDTreeRevealInFinder'})
+    call NERDTreeAddMenuItem({'text': '(o)pen the current node with system editor', 'shortcut': 'o', 'callback': 'NERDTreeExecuteFile'})
+    call NERDTreeAddMenuItem({'text': '(q)uicklook the current node', 'shortcut': 'q', 'callback': 'NERDTreeQuickLook'})
+endif
+
+if executable('xdg-open')
+    call NERDTreeAddMenuItem({'text': '(r)eveal the current node in file manager', 'shortcut': 'r', 'callback': 'NERDTreeRevealFileLinux'})
+    call NERDTreeAddMenuItem({'text': '(o)pen the current node with system editor', 'shortcut': 'o', 'callback': 'NERDTreeExecuteFileLinux'})
+endif
+
+if nerdtree#runningWindows()
+    call NERDTreeAddMenuItem({'text': '(o)pen the current node with system editor', 'shortcut': 'o', 'callback': 'NERDTreeExecuteFileWindows'})
+endif
+
+if g:NERDTreePath.CopyingSupported()
+    call NERDTreeAddMenuItem({'text': '(c)opy the current node', 'shortcut': 'c', 'callback': 'NERDTreeCopyNode'})
+endif
+call NERDTreeAddMenuItem({'text': (has('clipboard')?'copy (p)ath to clipboard':'print (p)ath to screen'), 'shortcut': 'p', 'callback': 'NERDTreeCopyPath'})
+
+if has('unix') || has('osx')
+    call NERDTreeAddMenuItem({'text': '(l)ist the current node', 'shortcut': 'l', 'callback': 'NERDTreeListNode'})
+else
+    call NERDTreeAddMenuItem({'text': '(l)ist the current node', 'shortcut': 'l', 'callback': 'NERDTreeListNodeWin32'})
+endif
+
+if exists('*system')
+    call NERDTreeAddMenuItem({'text': 'Run (s)ystem command in this directory', 'shortcut':'s', 'callback': 'NERDTreeSystemCommand'})
+endif
+
+"FUNCTION: s:inputPrompt(action){{{1
+"returns the string that should be prompted to the user for the given action
+"
+"Args:
+"action: the action that is being performed, e.g. 'delete'
+function! s:inputPrompt(action)
+    if a:action ==# 'add'
+        let title = 'Add a childnode'
+        let info = "Enter the dir/file name to be created. Dirs end with a '/'"
+        let minimal = 'Add node:'
+
+    elseif a:action ==# 'copy'
+        let title = 'Copy the current node'
+        let info = 'Enter the new path to copy the node to:'
+        let minimal = 'Copy to:'
+
+    elseif a:action ==# 'delete'
+        let title = 'Delete the current node'
+        let info = 'Are you sure you wish to delete the node:'
+        let minimal = 'Delete?'
+
+    elseif a:action ==# 'deleteNonEmpty'
+        let title = 'Delete the current node'
+        let info =  "STOP! Directory is not empty! To delete, type 'yes'"
+        let minimal = 'Delete directory?'
+
+    elseif a:action ==# 'move'
+        let title = 'Rename the current node'
+        let info = 'Enter the new path for the node:'
+        let minimal = 'Move to:'
+    endif
+
+    if g:NERDTreeMenuController.isMinimal()
+        redraw! " Clear the menu
+        return minimal . ' '
+    else
+        let divider = '=========================================================='
+        return title . "\n" . divider . "\n" . info . "\n"
+    end
+endfunction
+
+"FUNCTION: s:promptToDelBuffer(bufnum, msg){{{1
+"prints out the given msg and, if the user responds by pushing 'y' then the
+"buffer with the given bufnum is deleted
+"
+"Args:
+"bufnum: the buffer that may be deleted
+"msg: a message that will be echoed to the user asking them if they wish to
+"     del the buffer
+function! s:promptToDelBuffer(bufnum, msg)
+    echo a:msg
+    if g:NERDTreeAutoDeleteBuffer || nr2char(getchar()) ==# 'y'
+        " 1. ensure that all windows which display the just deleted filename
+        " now display an empty buffer (so a layout is preserved).
+        " Is not it better to close single tabs with this file only ?
+        let s:originalTabNumber = tabpagenr()
+        let s:originalWindowNumber = winnr()
+        " Go to the next buffer in buffer list if at least one extra buffer is listed
+        " Otherwise open a new empty buffer
+        if v:version >= 800
+            let l:listedBufferCount = len(getbufinfo({'buflisted':1}))
+        elseif v:version >= 702
+            let l:listedBufferCount = len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))
+        else
+            " Ignore buffer count in this case to make sure we keep the old
+            " behavior
+            let l:listedBufferCount = 0
+        endif
+        if l:listedBufferCount > 1
+            call nerdtree#exec('tabdo windo if winbufnr(0) ==# ' . a:bufnum . " | exec ':bnext! ' | endif", 1)
+        else
+            call nerdtree#exec('tabdo windo if winbufnr(0) ==# ' . a:bufnum . " | exec ':enew! ' | endif", 1)
+        endif
+        call nerdtree#exec('tabnext ' . s:originalTabNumber, 1)
+        call nerdtree#exec(s:originalWindowNumber . 'wincmd w', 1)
+        " 3. We don't need a previous buffer anymore
+        call nerdtree#exec('bwipeout! ' . a:bufnum, 0)
+    endif
+endfunction
+
+"FUNCTION: s:renameBuffer(bufNum, newNodeName, isDirectory){{{1
+"The buffer with the given bufNum is replaced with a new one
+"
+"Args:
+"bufNum: the buffer that may be deleted
+"newNodeName: the name given to the renamed node
+"isDirectory: determines how to do the create the new filenames
+function! s:renameBuffer(bufNum, newNodeName, isDirectory)
+    if a:isDirectory
+        let quotedFileName = fnameescape(a:newNodeName . '/' . fnamemodify(bufname(a:bufNum),':t'))
+        let editStr = g:NERDTreePath.New(a:newNodeName . '/' . fnamemodify(bufname(a:bufNum),':t')).str({'format': 'Edit'})
+    else
+        let quotedFileName = fnameescape(a:newNodeName)
+        let editStr = g:NERDTreePath.New(a:newNodeName).str({'format': 'Edit'})
+    endif
+    " 1. ensure that a new buffer is loaded
+    call nerdtree#exec('badd ' . quotedFileName, 0)
+    " 2. ensure that all windows which display the just deleted filename
+    " display a buffer for a new filename.
+    let s:originalTabNumber = tabpagenr()
+    let s:originalWindowNumber = winnr()
+    call nerdtree#exec('tabdo windo if winbufnr(0) ==# ' . a:bufNum . " | exec ':e! " . editStr . "' | endif", 0)
+    call nerdtree#exec('tabnext ' . s:originalTabNumber, 1)
+    call nerdtree#exec(s:originalWindowNumber . 'wincmd w', 1)
+    " 3. We don't need a previous buffer anymore
+    try
+        call nerdtree#exec('confirm bwipeout ' . a:bufNum, 0)
+    catch
+        " This happens when answering Cancel if confirmation is needed. Do nothing.
+    endtry
+endfunction
+
+"FUNCTION: NERDTreeAddNode(){{{1
+function! NERDTreeAddNode()
+    let curDirNode = g:NERDTreeDirNode.GetSelected()
+    let prompt = s:inputPrompt('add')
+    let newNodeName = substitute(input(prompt, curDirNode.path.str() . nerdtree#slash(), 'file'), '\(^\s*\|\s*$\)', '', 'g')
+
+    if newNodeName ==# ''
+        call nerdtree#echo('Node Creation Aborted.')
+        return
+    endif
+
+    try
+        let newPath = g:NERDTreePath.Create(newNodeName)
+        let parentNode = b:NERDTree.root.findNode(newPath.getParent())
+
+        let newTreeNode = g:NERDTreeFileNode.New(newPath, b:NERDTree)
+        " Emptying g:NERDTreeOldSortOrder forces the sort to
+        " recalculate the cached sortKey so nodes sort correctly.
+        let g:NERDTreeOldSortOrder = []
+        if empty(parentNode)
+            call b:NERDTree.root.refresh()
+            call b:NERDTree.render()
+        elseif parentNode.isOpen || !empty(parentNode.children)
+            call parentNode.addChild(newTreeNode, 1)
+            call NERDTreeRender()
+            call newTreeNode.putCursorHere(1, 0)
+        endif
+
+        redraw!
+    catch /^NERDTree/
+        call nerdtree#echoWarning('Node Not Created.')
+    endtry
+endfunction
+
+"FUNCTION: NERDTreeMoveNode(){{{1
+function! NERDTreeMoveNode()
+    let curNode = g:NERDTreeFileNode.GetSelected()
+    let prompt = s:inputPrompt('move')
+    let newNodePath = input(prompt, curNode.path.str(), 'file')
+    while filereadable(newNodePath)
+        call nerdtree#echoWarning('This destination already exists. Try again.')
+        let newNodePath = substitute(input(prompt, curNode.path.str(), 'file'), '\(^\s*\|\s*$\)', '', 'g')
+    endwhile
+
+
+    if newNodePath ==# ''
+        call nerdtree#echo('Node Renaming Aborted.')
+        return
+    endif
+
+    try
+        if curNode.path.isDirectory
+            let l:curPath = escape(curNode.path.str(),'\') . (nerdtree#runningWindows()?'\\':'/') . '.*'
+            let l:openBuffers = filter(range(1,bufnr('$')),'bufexists(v:val) && fnamemodify(bufname(v:val),":p") =~# "'.escape(l:curPath,'\').'"')
+        else
+            let l:openBuffers = filter(range(1,bufnr('$')),'bufexists(v:val) && fnamemodify(bufname(v:val),":p") ==# curNode.path.str()')
+        endif
+
+        call curNode.rename(newNodePath)
+        " Emptying g:NERDTreeOldSortOrder forces the sort to
+        " recalculate the cached sortKey so nodes sort correctly.
+        let g:NERDTreeOldSortOrder = []
+        call b:NERDTree.root.refresh()
+        call NERDTreeRender()
+
+        " If the file node is open, or files under the directory node are
+        " open, ask the user if they want to replace the file(s) with the
+        " renamed files.
+        if !empty(l:openBuffers)
+            if curNode.path.isDirectory
+                echo "\nDirectory renamed.\n\nFiles with the old directory name are open in buffers " . join(l:openBuffers, ', ') . '. Replace these buffers with the new files? (yN)'
+            else
+                echo "\nFile renamed.\n\nThe old file is open in buffer " . l:openBuffers[0] . '. Replace this buffer with the new file? (yN)'
+            endif
+            if g:NERDTreeAutoDeleteBuffer || nr2char(getchar()) ==# 'y'
+                for bufNum in l:openBuffers
+                    call s:renameBuffer(bufNum, newNodePath, curNode.path.isDirectory)
+                endfor
+            endif
+        endif
+
+        call curNode.putCursorHere(1, 0)
+
+        redraw!
+    catch /^NERDTree/
+        call nerdtree#echoWarning('Node Not Renamed.')
+    endtry
+endfunction
+
+" FUNCTION: NERDTreeDeleteNode() {{{1
+function! NERDTreeDeleteNode()
+    let currentNode = g:NERDTreeFileNode.GetSelected()
+    let confirmed = 0
+
+    if currentNode.path.isDirectory && ((currentNode.isOpen && currentNode.getChildCount() > 0) ||
+                                      \ (len(currentNode._glob('*', 1)) > 0))
+        let prompt = s:inputPrompt('deleteNonEmpty') . currentNode.path.str() . ': '
+        let choice = input(prompt)
+        let confirmed = choice ==# 'yes'
+    else
+        let prompt = s:inputPrompt('delete') . currentNode.path.str() . ' (yN): '
+        echo prompt
+        let choice = nr2char(getchar())
+        let confirmed = choice ==# 'y'
+    endif
+
+    if confirmed
+        try
+            call currentNode.delete()
+            call NERDTreeRender()
+
+            "if the node is open in a buffer, ask the user if they want to
+            "close that buffer
+            let bufnum = bufnr('^'.currentNode.path.str().'$')
+            if buflisted(bufnum)
+                let prompt = "\nNode deleted.\n\nThe file is open in buffer ". bufnum . (bufwinnr(bufnum) ==# -1 ? ' (hidden)' : '') .'. Delete this buffer? (yN)'
+                call s:promptToDelBuffer(bufnum, prompt)
+            endif
+
+            redraw!
+        catch /^NERDTree/
+            call nerdtree#echoWarning('Could not remove node')
+        endtry
+    else
+        call nerdtree#echo('delete aborted')
+    endif
+endfunction
+
+" FUNCTION: NERDTreeListNode() {{{1
+function! NERDTreeListNode()
+    let treenode = g:NERDTreeFileNode.GetSelected()
+    if !empty(treenode)
+        let s:uname = system('uname')
+        let stat_cmd = 'stat -c "%s" '
+
+        if s:uname =~? 'Darwin'
+            let stat_cmd = 'stat -f "%z" '
+        endif
+
+        let cmd = 'size=$(' . stat_cmd . shellescape(treenode.path.str()) . ') && ' .
+        \         'size_with_commas=$(echo $size | sed -e :a -e "s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta") && ' .
+        \         'ls -ld ' . shellescape(treenode.path.str()) . ' | sed -e "s/ $size / $size_with_commas /"'
+
+        let metadata = split(system(cmd),'\n')
+        call nerdtree#echo(metadata[0])
+    else
+        call nerdtree#echo('No information available')
+    endif
+endfunction
+
+" FUNCTION: NERDTreeListNodeWin32() {{{1
+function! NERDTreeListNodeWin32()
+    let l:node = g:NERDTreeFileNode.GetSelected()
+
+    if !empty(l:node)
+        let l:path = l:node.path.str()
+        call nerdtree#echo(printf('%s:%s  MOD:%s  BYTES:%d  PERMISSIONS:%s',
+                    \ toupper(getftype(l:path)),
+                    \ fnamemodify(l:path, ':t'),
+                    \ strftime('%c', getftime(l:path)),
+                    \ getfsize(l:path),
+                    \ getfperm(l:path)))
+        return
+    endif
+
+    call nerdtree#echo('node not recognized')
+endfunction
+
+" FUNCTION: NERDTreeCopyNode() {{{1
+function! NERDTreeCopyNode()
+    let currentNode = g:NERDTreeFileNode.GetSelected()
+    let prompt = s:inputPrompt('copy')
+    let newNodePath = substitute(input(prompt, currentNode.path.str(), 'file'), '\(^\s*\|\s*$\)', '', 'g')
+
+    if newNodePath !=# ''
+        "strip trailing slash
+        let newNodePath = substitute(newNodePath, '\/$', '', '')
+
+        let confirmed = 1
+        if currentNode.path.copyingWillOverwrite(newNodePath)
+            call nerdtree#echo('Warning: copying may overwrite files! Continue? (yN)')
+            let choice = nr2char(getchar())
+            let confirmed = choice ==# 'y'
+        endif
+
+        if confirmed
+            try
+                let newNode = currentNode.copy(newNodePath)
+                " Emptying g:NERDTreeOldSortOrder forces the sort to
+                " recalculate the cached sortKey so nodes sort correctly.
+                let g:NERDTreeOldSortOrder = []
+                if empty(newNode)
+                    call b:NERDTree.root.refresh()
+                    call b:NERDTree.render()
+                else
+                    call NERDTreeRender()
+                    call newNode.putCursorHere(0, 0)
+                endif
+            catch /^NERDTree/
+                call nerdtree#echoWarning('Could not copy node')
+            endtry
+        endif
+    else
+        call nerdtree#echo('Copy aborted.')
+    endif
+    redraw!
+endfunction
+
+" FUNCTION: NERDTreeCopyPath() {{{1
+function! NERDTreeCopyPath()
+    let l:nodePath = g:NERDTreeFileNode.GetSelected().path.str()
+    if has('clipboard')
+        if &clipboard ==# 'unnamedplus'
+            let @+ = l:nodePath
+        else
+            let @* = l:nodePath
+        endif
+        call nerdtree#echo('The path [' . l:nodePath . '] was copied to your clipboard.')
+    else
+        call nerdtree#echo('The full path is: ' . l:nodePath)
+    endif
+endfunction
+
+" FUNCTION: NERDTreeQuickLook() {{{1
+function! NERDTreeQuickLook()
+    let l:node = g:NERDTreeFileNode.GetSelected()
+
+    if empty(l:node)
+        return
+    endif
+
+    call system('qlmanage -p 2>/dev/null ' . shellescape(l:node.path.str()))
+endfunction
+
+" FUNCTION: NERDTreeRevealInFinder() {{{1
+function! NERDTreeRevealInFinder()
+    let l:node = g:NERDTreeFileNode.GetSelected()
+
+    if empty(l:node)
+        return
+    endif
+
+    call system('open -R ' . shellescape(l:node.path.str()))
+endfunction
+
+" FUNCTION: NERDTreeExecuteFile() {{{1
+function! NERDTreeExecuteFile()
+    let l:node = g:NERDTreeFileNode.GetSelected()
+
+    if empty(l:node)
+        return
+    endif
+
+    call system('open ' . shellescape(l:node.path.str()))
+endfunction
+
+" FUNCTION: NERDTreeRevealFileLinux() {{{1
+function! NERDTreeRevealFileLinux()
+    let l:node = g:NERDTreeFileNode.GetSelected()
+
+    if empty(l:node)
+        return
+    endif
+
+    " Handle the edge case of "/", which has no parent.
+    if l:node.path.str() ==# '/'
+        call system('xdg-open /')
+        return
+    endif
+
+    if empty(l:node.parent)
+        return
+    endif
+
+    call system('xdg-open ' . shellescape(l:node.parent.path.str()))
+endfunction
+
+" FUNCTION: NERDTreeExecuteFileLinux() {{{1
+function! NERDTreeExecuteFileLinux()
+    let l:node = g:NERDTreeFileNode.GetSelected()
+
+    if empty(l:node)
+        return
+    endif
+
+    call system('xdg-open ' . shellescape(l:node.path.str()))
+endfunction
+
+" FUNCTION: NERDTreeExecuteFileWindows() {{{1
+function! NERDTreeExecuteFileWindows()
+    let l:node = g:NERDTreeFileNode.GetSelected()
+
+    if empty(l:node)
+        return
+    endif
+
+    call system('cmd.exe /c start "" ' . shellescape(l:node.path.str()))
+endfunction
+
+" FUNCTION: NERDTreeSystemCommand() {{{1
+function! NERDTreeSystemCommand()
+    let l:node = g:NERDTreeFileNode.GetSelected()
+
+    if empty(l:node)
+        return
+    endif
+
+    let l:cwd = getcwd()
+    let l:directory = l:node.path.isDirectory ? l:node.path.str() : l:node.parent.path.str()
+    execute 'cd '.l:directory
+
+    let l:nl = nr2char(10)
+    echo l:nl . system(input(l:directory . (nerdtree#runningWindows() ? '> ' : ' $ ')))
+    execute 'cd '.l:cwd
+endfunction
+
+" vim: set sw=4 sts=4 et fdm=marker:
diff --git a/.vim/pack/vendor/start/nerdtree/nerdtree_plugin/vcs.vim b/.vim/pack/vendor/start/nerdtree/nerdtree_plugin/vcs.vim
new file mode 100644
index 0000000..d20e35e
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/nerdtree_plugin/vcs.vim
@@ -0,0 +1,47 @@
+" ============================================================================
+" File:        vcs.vim
+" Description: NERDTree plugin that provides a command to open on the root of
+"              a version control system repository.
+" Maintainer:  Phil Runninger
+" License:     This program is free software. It comes without any warranty,
+"              to the extent permitted by applicable law. You can redistribute
+"              it and/or modify it under the terms of the Do What The Fuck You
+"              Want To Public License, Version 2, as published by Sam Hocevar.
+"              See http://sam.zoy.org/wtfpl/COPYING for more details.
+"
+" ============================================================================
+command! -n=? -complete=dir -bar NERDTreeVCS :call <SID>CreateTabTreeVCS('<args>')
+command! -n=? -complete=dir -bar NERDTreeToggleVCS :call <SID>ToggleTabTreeVCS('<args>')
+
+" FUNCTION: s:CreateTabTreeVCS(a:name) {{{1
+function! s:CreateTabTreeVCS(name)
+    let l:path = g:NERDTreeCreator._pathForString(a:name)
+    let l:path = s:FindParentVCSRoot(l:path)
+    call g:NERDTreeCreator.createTabTree(empty(l:path) ? '' : l:path._str())
+endfunction
+
+" FUNCTION: s:ToggleTabTreeVCS(a:name) {{{1
+" Behaves the same as ToggleTabTree except roots directory at VCS root
+function! s:ToggleTabTreeVCS(name)
+    let l:path = g:NERDTreeCreator._pathForString(a:name)
+    let l:path = s:FindParentVCSRoot(l:path)
+    call g:NERDTreeCreator.toggleTabTree(empty(l:path) ? '' : l:path._str())
+endfunction
+
+" FUNCTION: s:FindParentVCSRoot(a:path) {{{1
+" Finds the root version control system folder of the given path. If a:path is
+" not part of a repository, return the original path.
+function! s:FindParentVCSRoot(path)
+    let l:path = a:path
+    while !empty(l:path) &&
+        \ l:path._str() !~# '^\(\a:[\\\/]\|\/\)$' &&
+        \ !isdirectory(l:path._str() . '/.git') &&
+        \ !isdirectory(l:path._str() . '/.svn') &&
+        \ !isdirectory(l:path._str() . '/.hg') &&
+        \ !isdirectory(l:path._str() . '/.bzr') &&
+        \ !isdirectory(l:path._str() . '/_darcs')
+        let l:path = l:path.getParent()
+    endwhile
+    return (empty(l:path) || l:path._str() =~# '^\(\a:[\\\/]\|\/\)$') ? a:path : l:path
+endfunction
+
diff --git a/.vim/pack/vendor/start/nerdtree/plugin/NERD_tree.vim b/.vim/pack/vendor/start/nerdtree/plugin/NERD_tree.vim
new file mode 100644
index 0000000..ef60cca
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/plugin/NERD_tree.vim
@@ -0,0 +1,234 @@
+" ============================================================================
+" File:        NERD_tree.vim
+" Maintainer:  Martin Grenfell <martin.grenfell at gmail dot com>
+" License:     This program is free software. It comes without any warranty,
+"              to the extent permitted by applicable law. You can redistribute
+"              it and/or modify it under the terms of the Do What The Fuck You
+"              Want To Public License, Version 2, as published by Sam Hocevar.
+"              See http://sam.zoy.org/wtfpl/COPYING for more details.
+"
+" ============================================================================
+"
+" SECTION: Script init stuff {{{1
+"============================================================
+scriptencoding utf-8
+
+if exists('loaded_nerd_tree')
+    finish
+endif
+if v:version < 703
+    echoerr "NERDTree: this plugin requires vim >= 7.3. DOWNLOAD IT! You'll thank me later!"
+    finish
+endif
+let loaded_nerd_tree = 1
+
+"for line continuation - i.e dont want C in &cpoptions
+let s:old_cpo = &cpoptions
+set cpoptions&vim
+
+"SECTION: Initialize variable calls and other random constants {{{2
+let g:NERDTreeAutoCenter            = get(g:, 'NERDTreeAutoCenter',            1)
+let g:NERDTreeAutoCenterThreshold   = get(g:, 'NERDTreeAutoCenterThreshold',   3)
+let g:NERDTreeCaseSensitiveSort     = get(g:, 'NERDTreeCaseSensitiveSort',     0)
+let g:NERDTreeNaturalSort           = get(g:, 'NERDTreeNaturalSort',           0)
+let g:NERDTreeSortHiddenFirst       = get(g:, 'NERDTreeSortHiddenFirst',       1)
+let g:NERDTreeUseTCD                = get(g:, 'NERDTreeUseTCD',                0)
+let g:NERDTreeChDirMode             = get(g:, 'NERDTreeChDirMode',             0)
+let g:NERDTreeCreatePrefix          = get(g:, 'NERDTreeCreatePrefix',          'silent')
+let g:NERDTreeMinimalUI             = get(g:, 'NERDTreeMinimalUI',             0)
+let g:NERDTreeMinimalMenu           = get(g:, 'NERDTreeMinimalMenu',           0)
+let g:NERDTreeIgnore                = get(g:, 'NERDTreeIgnore',                ['\~$'])
+let g:NERDTreeBookmarksFile         = get(g:, 'NERDTreeBookmarksFile',         expand('$HOME') . '/.NERDTreeBookmarks')
+let g:NERDTreeBookmarksSort         = get(g:, 'NERDTreeBookmarksSort',         1)
+let g:NERDTreeHighlightCursorline   = get(g:, 'NERDTreeHighlightCursorline',   1)
+let g:NERDTreeHijackNetrw           = get(g:, 'NERDTreeHijackNetrw',           1)
+let g:NERDTreeMarkBookmarks         = get(g:, 'NERDTreeMarkBookmarks',         1)
+let g:NERDTreeMouseMode             = get(g:, 'NERDTreeMouseMode',             1)
+let g:NERDTreeNotificationThreshold = get(g:, 'NERDTreeNotificationThreshold', 100)
+let g:NERDTreeQuitOnOpen            = get(g:, 'NERDTreeQuitOnOpen',            0)
+let g:NERDTreeRespectWildIgnore     = get(g:, 'NERDTreeRespectWildIgnore',     0)
+let g:NERDTreeShowBookmarks         = get(g:, 'NERDTreeShowBookmarks',         0)
+let g:NERDTreeShowFiles             = get(g:, 'NERDTreeShowFiles',             1)
+let g:NERDTreeShowHidden            = get(g:, 'NERDTreeShowHidden',            0)
+let g:NERDTreeShowLineNumbers       = get(g:, 'NERDTreeShowLineNumbers',       0)
+let g:NERDTreeSortDirs              = get(g:, 'NERDTreeSortDirs',              1)
+
+if !nerdtree#runningWindows() && !nerdtree#runningCygwin()
+    let g:NERDTreeDirArrowExpandable  = get(g:, 'NERDTreeDirArrowExpandable',  '▸')
+    let g:NERDTreeDirArrowCollapsible = get(g:, 'NERDTreeDirArrowCollapsible', '▾')
+else
+    let g:NERDTreeDirArrowExpandable  = get(g:, 'NERDTreeDirArrowExpandable',  '+')
+    let g:NERDTreeDirArrowCollapsible = get(g:, 'NERDTreeDirArrowCollapsible', '~')
+endif
+
+let g:NERDTreeCascadeOpenSingleChildDir = get(g:, 'NERDTreeCascadeOpenSingleChildDir', 1)
+let g:NERDTreeCascadeSingleChildDir     = get(g:, 'NERDTreeCascadeSingleChildDir',     1)
+
+let g:NERDTreeSortOrder    = get(g:, 'NERDTreeSortOrder', ['\/$', '*', '\.swp$', '\.bak$', '\~$'])
+let g:NERDTreeOldSortOrder = []
+
+let g:NERDTreeGlyphReadOnly = get(g:, 'NERDTreeGlyphReadOnly', 'RO')
+
+if has('conceal')
+    let g:NERDTreeNodeDelimiter = get(g:, 'NERDTreeNodeDelimiter', "\x07")
+elseif (g:NERDTreeDirArrowExpandable ==# "\u00a0" || g:NERDTreeDirArrowCollapsible ==# "\u00a0")
+    let g:NERDTreeNodeDelimiter = get(g:, 'NERDTreeNodeDelimiter', "\u00b7")
+else
+    let g:NERDTreeNodeDelimiter = get(g:, 'NERDTreeNodeDelimiter', "\u00a0")
+endif
+
+"the exists() crap here is a hack to stop vim spazzing out when
+"loading a session that was created with an open nerd tree. It spazzes
+"because it doesnt store b:NERDTree(its a b: var, and its a hash)
+let g:NERDTreeStatusline = get(g:, 'NERDTreeStatusline', "%{exists('b:NERDTree')?b:NERDTree.root.path.str():''}")
+
+let g:NERDTreeWinPos  = get(g:, 'NERDTreeWinPos', 'left')
+let g:NERDTreeWinSize = get(g:, 'NERDTreeWinSize', 31)
+
+"init the shell commands that will be used to copy nodes, and remove dir trees
+"Note: the space after the command is important
+if nerdtree#runningWindows()
+    let g:NERDTreeRemoveDirCmd = get(g:, 'NERDTreeRemoveDirCmd', 'rmdir /s /q ')
+    let g:NERDTreeCopyDirCmd   = get(g:, 'NERDTreeCopyDirCmd',   'xcopy /s /e /i /y /q ')
+    let g:NERDTreeCopyFileCmd  = get(g:, 'NERDTreeCopyFileCmd',  'copy /y ')
+else
+    let g:NERDTreeRemoveDirCmd = get(g:, 'NERDTreeRemoveDirCmd', 'rm -rf ')
+    let g:NERDTreeCopyCmd      = get(g:, 'NERDTreeCopyCmd',      'cp -r ')
+endif
+
+"SECTION: Init variable calls for key mappings {{{2
+let g:NERDTreeMapCustomOpen      = get(g:, 'NERDTreeMapCustomOpen',      '<CR>')
+let g:NERDTreeMapActivateNode    = get(g:, 'NERDTreeMapActivateNode',    'o')
+let g:NERDTreeMapChangeRoot      = get(g:, 'NERDTreeMapChangeRoot',      'C')
+let g:NERDTreeMapChdir           = get(g:, 'NERDTreeMapChdir',           'cd')
+let g:NERDTreeMapCloseChildren   = get(g:, 'NERDTreeMapCloseChildren',   'X')
+let g:NERDTreeMapCloseDir        = get(g:, 'NERDTreeMapCloseDir',        'x')
+let g:NERDTreeMapDeleteBookmark  = get(g:, 'NERDTreeMapDeleteBookmark',  'D')
+let g:NERDTreeMapMenu            = get(g:, 'NERDTreeMapMenu',            'm')
+let g:NERDTreeMapHelp            = get(g:, 'NERDTreeMapHelp',            '?')
+let g:NERDTreeMapJumpFirstChild  = get(g:, 'NERDTreeMapJumpFirstChild',  'K')
+let g:NERDTreeMapJumpLastChild   = get(g:, 'NERDTreeMapJumpLastChild',   'J')
+let g:NERDTreeMapJumpNextSibling = get(g:, 'NERDTreeMapJumpNextSibling', '<C-j>')
+let g:NERDTreeMapJumpParent      = get(g:, 'NERDTreeMapJumpParent',      'p')
+let g:NERDTreeMapJumpPrevSibling = get(g:, 'NERDTreeMapJumpPrevSibling', '<C-k>')
+let g:NERDTreeMapJumpRoot        = get(g:, 'NERDTreeMapJumpRoot',        'P')
+let g:NERDTreeMapOpenExpl        = get(g:, 'NERDTreeMapOpenExpl',        'e')
+let g:NERDTreeMapOpenInTab       = get(g:, 'NERDTreeMapOpenInTab',       't')
+let g:NERDTreeMapOpenInTabSilent = get(g:, 'NERDTreeMapOpenInTabSilent', 'T')
+let g:NERDTreeMapOpenRecursively = get(g:, 'NERDTreeMapOpenRecursively', 'O')
+let g:NERDTreeMapOpenSplit       = get(g:, 'NERDTreeMapOpenSplit',       'i')
+let g:NERDTreeMapOpenVSplit      = get(g:, 'NERDTreeMapOpenVSplit',      's')
+let g:NERDTreeMapPreview         = get(g:, 'NERDTreeMapPreview',         'g'.NERDTreeMapActivateNode)
+let g:NERDTreeMapPreviewSplit    = get(g:, 'NERDTreeMapPreviewSplit',    'g'.NERDTreeMapOpenSplit)
+let g:NERDTreeMapPreviewVSplit   = get(g:, 'NERDTreeMapPreviewVSplit',   'g'.NERDTreeMapOpenVSplit)
+let g:NERDTreeMapQuit            = get(g:, 'NERDTreeMapQuit',            'q')
+let g:NERDTreeMapRefresh         = get(g:, 'NERDTreeMapRefresh',         'r')
+let g:NERDTreeMapRefreshRoot     = get(g:, 'NERDTreeMapRefreshRoot',     'R')
+let g:NERDTreeMapToggleBookmarks = get(g:, 'NERDTreeMapToggleBookmarks', 'B')
+let g:NERDTreeMapToggleFiles     = get(g:, 'NERDTreeMapToggleFiles',     'F')
+let g:NERDTreeMapToggleFilters   = get(g:, 'NERDTreeMapToggleFilters',   'f')
+let g:NERDTreeMapToggleHidden    = get(g:, 'NERDTreeMapToggleHidden',    'I')
+let g:NERDTreeMapToggleZoom      = get(g:, 'NERDTreeMapToggleZoom',      'A')
+let g:NERDTreeMapUpdir           = get(g:, 'NERDTreeMapUpdir',           'u')
+let g:NERDTreeMapUpdirKeepOpen   = get(g:, 'NERDTreeMapUpdirKeepOpen',   'U')
+let g:NERDTreeMapCWD             = get(g:, 'NERDTreeMapCWD',             'CD')
+let g:NERDTreeMenuDown           = get(g:, 'NERDTreeMenuDown',           'j')
+let g:NERDTreeMenuUp             = get(g:, 'NERDTreeMenuUp',             'k')
+
+"SECTION: Load class files{{{2
+call nerdtree#loadClassFiles()
+
+" SECTION: Commands {{{1
+"============================================================
+call nerdtree#ui_glue#setupCommands()
+
+" SECTION: Auto commands {{{1
+"============================================================
+augroup NERDTree
+    "Save the cursor position whenever we close the nerd tree
+    exec 'autocmd BufLeave,WinLeave '. g:NERDTreeCreator.BufNamePrefix() .'* if g:NERDTree.IsOpen() | call b:NERDTree.ui.saveScreenState() | endif'
+
+    "disallow insert mode in the NERDTree
+    exec 'autocmd BufEnter,WinEnter '. g:NERDTreeCreator.BufNamePrefix() .'* stopinsert'
+augroup END
+
+if g:NERDTreeHijackNetrw
+    augroup NERDTreeHijackNetrw
+        autocmd VimEnter * silent! autocmd! FileExplorer
+        au BufEnter,VimEnter * call nerdtree#checkForBrowse(expand('<amatch>'))
+    augroup END
+endif
+
+if g:NERDTreeChDirMode ==# 3
+    augroup NERDTreeChDirOnTabSwitch
+        autocmd TabEnter * if g:NERDTree.ExistsForTab()|call g:NERDTree.ForCurrentTab().getRoot().path.changeToDir()|endif
+    augroup END
+endif
+
+" SECTION: Public API {{{1
+"============================================================
+function! NERDTreeAddMenuItem(options)
+    call g:NERDTreeMenuItem.Create(a:options)
+endfunction
+
+function! NERDTreeAddMenuSeparator(...)
+    let opts = a:0 ? a:1 : {}
+    call g:NERDTreeMenuItem.CreateSeparator(opts)
+endfunction
+
+function! NERDTreeAddSubmenu(options)
+    return g:NERDTreeMenuItem.Create(a:options)
+endfunction
+
+function! NERDTreeAddKeyMap(options)
+    call g:NERDTreeKeyMap.Create(a:options)
+endfunction
+
+function! NERDTreeRender()
+    call nerdtree#renderView()
+endfunction
+
+function! NERDTreeFocus()
+    if g:NERDTree.IsOpen()
+        call g:NERDTree.CursorToTreeWin(0)
+    else
+        call g:NERDTreeCreator.ToggleTabTree('')
+    endif
+endfunction
+
+function! NERDTreeCWD()
+
+    if empty(getcwd())
+        call nerdtree#echoWarning('current directory does not exist')
+        return
+    endif
+
+    try
+        let l:cwdPath = g:NERDTreePath.New(getcwd())
+    catch /^NERDTree.InvalidArgumentsError/
+        call nerdtree#echoWarning('current directory does not exist')
+        return
+    endtry
+
+    call NERDTreeFocus()
+
+    if b:NERDTree.root.path.equals(l:cwdPath)
+        return
+    endif
+
+    let l:newRoot = g:NERDTreeFileNode.New(l:cwdPath, b:NERDTree)
+    call b:NERDTree.changeRoot(l:newRoot)
+    normal! ^
+endfunction
+
+function! NERDTreeAddPathFilter(callback)
+    call g:NERDTree.AddPathFilter(a:callback)
+endfunction
+
+" SECTION: Post Source Actions {{{1
+call nerdtree#postSourceActions()
+
+"reset &cpoptions back to users setting
+let &cpoptions = s:old_cpo
+
+" vim: set sw=4 sts=4 et fdm=marker:
diff --git a/.vim/pack/vendor/start/nerdtree/syntax/nerdtree.vim b/.vim/pack/vendor/start/nerdtree/syntax/nerdtree.vim
new file mode 100644
index 0000000..c4197ee
--- /dev/null
+++ b/.vim/pack/vendor/start/nerdtree/syntax/nerdtree.vim
@@ -0,0 +1,97 @@
+let s:tree_up_dir_line = '.. (up a dir)'
+syn match NERDTreeIgnore #\~#
+exec 'syn match NERDTreeIgnore #\['.g:NERDTreeGlyphReadOnly.'\]#'
+
+"highlighting for the .. (up dir) line at the top of the tree
+execute "syn match NERDTreeUp #\\V". s:tree_up_dir_line .'#'
+
+"quickhelp syntax elements
+syn match NERDTreeHelpKey #" \{1,2\}[^ ]*:#ms=s+2,me=e-1
+syn match NERDTreeHelpKey #" \{1,2\}[^ ]*,#ms=s+2,me=e-1
+syn match NERDTreeHelpTitle #" .*\~$#ms=s+2,me=e-1
+syn match NERDTreeToggleOn #(on)#ms=s+1,he=e-1
+syn match NERDTreeToggleOff #(off)#ms=e-3,me=e-1
+syn match NERDTreeHelpCommand #" :.\{-}\>#hs=s+3
+syn match NERDTreeHelp  #^".*# contains=NERDTreeHelpKey,NERDTreeHelpTitle,NERDTreeIgnore,NERDTreeToggleOff,NERDTreeToggleOn,NERDTreeHelpCommand
+
+"highlighting for sym links
+syn match NERDTreeLinkTarget #->.*# containedin=NERDTreeDir,NERDTreeFile
+syn match NERDTreeLinkFile #.* ->#me=e-3 containedin=NERDTreeFile
+syn match NERDTreeLinkDir #.*/ ->#me=e-3 containedin=NERDTreeDir
+
+"highlighting to conceal the delimiter around the file/dir name
+if has('conceal')
+    exec 'syn match NERDTreeNodeDelimiters #\%d' . char2nr(g:NERDTreeNodeDelimiter) . '# conceal containedin=ALL'
+    setlocal conceallevel=2 concealcursor=nvic
+else
+    exec 'syn match NERDTreeNodeDelimiters #\%d' . char2nr(g:NERDTreeNodeDelimiter) . '# containedin=ALL'
+    hi! link NERDTreeNodeDelimiters Ignore
+endif
+
+"highlighing for directory nodes and file nodes
+syn match NERDTreeDirSlash #/# containedin=NERDTreeDir
+
+if g:NERDTreeDirArrowExpandable !=# ''
+    exec 'syn match NERDTreeClosable #' . escape(g:NERDTreeDirArrowCollapsible, '~') . '\ze .*/# containedin=NERDTreeDir,NERDTreeFile'
+    exec 'syn match NERDTreeOpenable #' . escape(g:NERDTreeDirArrowExpandable, '~') . '\ze .*/# containedin=NERDTreeDir,NERDTreeFile'
+    let s:dirArrows = escape(g:NERDTreeDirArrowCollapsible, '~]\-').escape(g:NERDTreeDirArrowExpandable, '~]\-')
+    exec 'syn match NERDTreeDir #[^'.s:dirArrows.' ].*/#'
+    exec 'syn match NERDTreeExecFile #^.*'.g:NERDTreeNodeDelimiter.'\*\($\| \)# contains=NERDTreeRO,NERDTreeBookmarkName'
+    exec 'syn match NERDTreeFile  #^[^"\.'.s:dirArrows.'] *[^'.s:dirArrows.']*# contains=NERDTreeLink,NERDTreeRO,NERDTreeBookmarkName,NERDTreeExecFile'
+else
+    exec 'syn match NERDTreeDir #[^'.g:NERDTreeNodeDelimiter.']\{-}/\ze\($\|'.g:NERDTreeNodeDelimiter.'\)#'
+    exec 'syn match NERDTreeExecFile #[^'.g:NERDTreeNodeDelimiter.']\{-}'.g:NERDTreeNodeDelimiter.'\*\($\| \)# contains=NERDTreeRO,NERDTreeBookmarkName'
+    exec 'syn match NERDTreeFile     #^.*'.g:NERDTreeNodeDelimiter.'.*[^\/]\($\|'.g:NERDTreeNodeDelimiter.'.*\)# contains=NERDTreeLink,NERDTreeRO,NERDTreeBookmarkName,NERDTreeExecFile'
+endif
+
+"highlighting for readonly files
+exec 'syn match NERDTreeRO #.*'.g:NERDTreeNodeDelimiter.'\zs.*\ze'.g:NERDTreeNodeDelimiter.'.*\['.g:NERDTreeGlyphReadOnly.'\]# contains=NERDTreeIgnore,NERDTreeBookmarkName,NERDTreeFile'
+
+exec 'syn match NERDTreeFlags #\[[^\]]*\]\ze'.g:NERDTreeNodeDelimiter.'# containedin=NERDTreeFile,NERDTreeExecFile,NERDTreeLinkFile,NERDTreeRO,NERDTreeDir'
+
+syn match NERDTreeCWD #^[</].*$#
+
+"highlighting for bookmarks
+syn match NERDTreeBookmarkName # {.*}#hs=s+2,he=e-1
+
+"highlighting for the bookmarks table
+syn match NERDTreeBookmarksLeader #^>#
+syn match NERDTreeBookmarksHeader #^>-\+Bookmarks-\+$# contains=NERDTreeBookmarksLeader
+syn match NERDTreeBookmarkName #^>.\{-} #he=e-1 contains=NERDTreeBookmarksLeader
+syn match NERDTreeBookmark #^>.*$# contains=NERDTreeBookmarksLeader,NERDTreeBookmarkName,NERDTreeBookmarksHeader
+
+hi def link NERDTreePart Special
+hi def link NERDTreePartFile Type
+hi def link NERDTreeExecFile Title
+hi def link NERDTreeDirSlash Identifier
+
+hi def link NERDTreeBookmarksHeader statement
+hi def link NERDTreeBookmarksLeader ignore
+hi def link NERDTreeBookmarkName Identifier
+hi def link NERDTreeBookmark normal
+
+hi def link NERDTreeHelp String
+hi def link NERDTreeHelpKey Identifier
+hi def link NERDTreeHelpCommand Identifier
+hi def link NERDTreeHelpTitle Macro
+hi def link NERDTreeToggleOn Question
+hi def link NERDTreeToggleOff WarningMsg
+
+hi def link NERDTreeLinkTarget Type
+hi def link NERDTreeLinkFile Macro
+hi def link NERDTreeLinkDir Macro
+
+hi def link NERDTreeDir Directory
+hi def link NERDTreeUp Directory
+hi def link NERDTreeFile Normal
+hi def link NERDTreeCWD Statement
+hi def link NERDTreeOpenable Directory
+hi def link NERDTreeClosable Directory
+hi def link NERDTreeIgnore ignore
+hi def link NERDTreeRO WarningMsg
+hi def link NERDTreeBookmark Statement
+hi def link NERDTreeFlags Number
+
+hi def link NERDTreeCurrentNode Search
+
+hi NERDTreeFile ctermbg=NONE guibg=NONE
diff --git a/.vim/pack/vendor/start/vim-devicons/autoload/airline/extensions/tabline/formatters/webdevicons.vim b/.vim/pack/vendor/start/vim-devicons/autoload/airline/extensions/tabline/formatters/webdevicons.vim
new file mode 100644
index 0000000..c298025
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/autoload/airline/extensions/tabline/formatters/webdevicons.vim
@@ -0,0 +1,14 @@
+" Version: 0.11.0
+" Webpage: https://github.com/ryanoasis/vim-devicons
+" Maintainer: Ryan McIntyre <ryanoasis@gmail.com>
+" License: see LICENSE
+
+function! airline#extensions#tabline#formatters#webdevicons#format(bufnr, buffers) abort
+  " Call original formatter.
+  let originalFormatter = airline#extensions#tabline#formatters#{g:_webdevicons_airline_orig_formatter}#format(a:bufnr, a:buffers)
+  return originalFormatter . g:WebDevIconsTabAirLineBeforeGlyphPadding .
+         \ WebDevIconsGetFileTypeSymbol(bufname(a:bufnr)) . g:WebDevIconsTabAirLineAfterGlyphPadding
+endfunction
+
+" modeline syntax:
+" vim: fdm=marker tabstop=2 softtabstop=2 shiftwidth=2 expandtab:
diff --git a/.vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/ctrlp.vim b/.vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/ctrlp.vim
new file mode 100644
index 0000000..1ea4898
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/ctrlp.vim
@@ -0,0 +1,30 @@
+" Initialize for up to date ctrlp fork: ctrlpvim/ctrlp.vim
+" Support for kien/ctrlp.vim deprecated since v0.7.0
+" @TODO implementation for CtrlP buffer and find file mode
+
+function! devicons#plugins#ctrlp#init() abort
+  let l:ctrlp_warning_message = 'vim-devicons: https://github.com/kien/ctrlp.vim is deprecated since v0.7.0, please use https://github.com/ctrlpvim/ctrlp.vim'
+  let l:ctrlp_warned_file = webdevicons#pluginHome() . '/status_warned_ctrlp'
+
+  if exists('g:loaded_ctrlp') && g:webdevicons_enable_ctrlp
+    let l:forkedCtrlp = exists('g:ctrlp_mruf_map_string')
+
+    if l:forkedCtrlp
+      if !exists('g:ctrlp_formatline_func')
+        " logic for ctrlpvim/ctrlp.vim:
+        let g:ctrlp_formatline_func = 's:formatline(s:curtype() == "buf" ? v:val : WebDevIconsGetFileTypeSymbol(v:val) . " " . v:val) '
+      endif
+    elseif empty(glob(l:ctrlp_warned_file))
+      " logic for kien/ctrlp.vim:
+      echohl WarningMsg |
+            \ echomsg l:ctrlp_warning_message
+      " only warn first time, do not warn again:
+      try
+        execute writefile(['File automatically generated after warning about CtrlP once', l:ctrlp_warning_message], l:ctrlp_warned_file)
+      catch
+      endtry
+    endif
+  endif
+endfunction
+
+" vim: tabstop=2 softtabstop=2 shiftwidth=2 expandtab:
diff --git a/.vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/denite.vim b/.vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/denite.vim
new file mode 100644
index 0000000..5884644
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/denite.vim
@@ -0,0 +1,10 @@
+function! devicons#plugins#denite#init() abort
+  let s:denite_ver = (exists('*denite#get_status_mode') ? 2 : 3)
+  if s:denite_ver == 3
+    call denite#custom#source('file,file/rec,file_mru,file/old,buffer,directory/rec,directory_mru', 'converters', ['devicons_denite_converter'])
+  else
+    call denite#custom#source('file,file_rec,file_mru,file_old,buffer,directory_rec,directory_mru', 'converters', ['devicons_denite_converter'])
+  endif
+endfunction
+
+" vim: tabstop=2 softtabstop=2 shiftwidth=2 expandtab:
diff --git a/.vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/flagship.vim b/.vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/flagship.vim
new file mode 100644
index 0000000..f67103c
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/flagship.vim
@@ -0,0 +1,15 @@
+function! devicons#plugins#flagship#init() abort
+  if g:webdevicons_enable_flagship_statusline
+    augroup webdevicons_flagship_filetype
+      autocmd User Flags call Hoist('buffer', 'WebDevIconsGetFileTypeSymbol')
+    augroup END
+  endif
+
+  if g:webdevicons_enable_flagship_statusline_fileformat_symbols
+    augroup webdevicons_flagship_filesymbol
+      autocmd User Flags call Hoist('buffer', 'WebDevIconsGetFileFormatSymbol')
+    augroup END
+  endif
+endfunction
+
+" vim: tabstop=2 softtabstop=2 shiftwidth=2 expandtab:
diff --git a/.vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/startify.vim b/.vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/startify.vim
new file mode 100644
index 0000000..f3c2d12
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/startify.vim
@@ -0,0 +1,6 @@
+
+function! devicons#plugins#startify#init() abort
+  exec ":function! StartifyEntryFormat() abort \n return 'WebDevIconsGetFileTypeSymbol(absolute_path) .\" \". entry_path' \n endfunction"
+endfunction
+
+" vim: tabstop=2 softtabstop=2 shiftwidth=2 expandtab:
diff --git a/.vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/unite.vim b/.vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/unite.vim
new file mode 100644
index 0000000..c40924a
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/unite.vim
@@ -0,0 +1,37 @@
+function! devicons#plugins#unite#init() abort
+  let s:filters = {
+    \ 'name': 'devicons_unite_converter'
+  \ }
+
+  function! s:filters.filter(candidates, context) abort
+    for candidate in a:candidates
+
+      if has_key(candidate, 'action__buffer_nr')
+        let bufname = bufname(candidate.action__buffer_nr)
+        let filename = fnamemodify(bufname, ':p:t')
+        let path = fnamemodify(bufname, ':p:h')
+      elseif has_key(candidate, 'word') && has_key(candidate, 'action__path')
+        let path = candidate.action__path
+        let filename = candidate.word
+      endif
+
+      let icon = WebDevIconsGetFileTypeSymbol(filename, isdirectory(filename))
+
+      " prevent filenames of buffers getting 'lost'
+      if filename != path
+        let path = printf('%s', filename)
+      endif
+
+      " Customize output format.
+      let candidate.abbr = printf('%s %s', icon, path)
+    endfor
+    return a:candidates
+  endfunction
+
+  call unite#define_filter(s:filters)
+  unlet s:filters
+
+  call unite#custom#source('file,file_rec,buffer,file_rec/async,file_rec/neovim,file_rec/neovim2,file_rec/git', 'converters', 'devicons_unite_converter')
+endfunction
+
+" vim: tabstop=2 softtabstop=2 shiftwidth=2 expandtab:
diff --git a/.vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/vimfiler.vim b/.vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/vimfiler.vim
new file mode 100644
index 0000000..62e6c3d
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/autoload/devicons/plugins/vimfiler.vim
@@ -0,0 +1,8 @@
+function! devicons#plugins#vimfiler#init() abort
+  call vimfiler#custom#profile('default', 'context', {
+    \ 'columns': 'devicons:size:time',
+    \ 'explorer_columns': 'devicons'
+  \ })
+endfunction
+
+" vim: tabstop=2 softtabstop=2 shiftwidth=2 expandtab:
diff --git a/.vim/pack/vendor/start/vim-devicons/autoload/vimfiler/columns/devicons.vim b/.vim/pack/vendor/start/vim-devicons/autoload/vimfiler/columns/devicons.vim
new file mode 100644
index 0000000..d11ee22
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/autoload/vimfiler/columns/devicons.vim
@@ -0,0 +1,80 @@
+"=============================================================================
+" FILE: devicons.vim
+" Version: 0.11.0
+" Webpage: https://github.com/ryanoasis/vim-devicons
+" Maintainer: Ryan McIntyre <ryanoasis@gmail.com>
+" License: MIT license  {{{
+"     Permission is hereby granted, free of charge, to any person obtaining
+"     a copy of this software and associated documentation files (the
+"     "Software"), to deal in the Software without restriction, including
+"     without limitation the rights to use, copy, modify, merge, publish,
+"     distribute, sublicense, and/or sell copies of the Software, and to
+"     permit persons to whom the Software is furnished to do so, subject to
+"     the following conditions:
+"
+"     The above copyright notice and this permission notice shall be included
+"     in all copies or substantial portions of the Software.
+"
+"     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+"     OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+"     MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+"     IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+"     CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+"     TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+"     SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+" }}}
+"=============================================================================
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+function! vimfiler#columns#devicons#define() abort
+  return s:column
+endfunction
+
+let s:column = {
+      \ 'name' : 'devicons',
+      \ 'description' : 'get devicon glyph',
+      \ 'syntax' : 'vimfilerColumn__devicons',
+      \ }
+
+function! s:column.length(files, context) abort
+  return 3
+endfunction
+
+function! s:column.define_syntax(context) abort "{{{
+  syntax match   vimfilerColumn__TypeText       '\[T\]'
+        \ contained containedin=vimfilerColumn__Type
+  syntax match   vimfilerColumn__TypeImage      '\[I\]'
+        \ contained containedin=vimfilerColumn__Type
+  syntax match   vimfilerColumn__TypeArchive    '\[A\]'
+        \ contained containedin=vimfilerColumn__Type
+  syntax match   vimfilerColumn__TypeExecute    '\[X\]'
+        \ contained containedin=vimfilerColumn__Type
+  syntax match   vimfilerColumn__TypeMultimedia '\[M\]'
+        \ contained containedin=vimfilerColumn__Type
+  syntax match   vimfilerColumn__TypeDirectory  '\[do\]'
+        \ contained containedin=vimfilerColumn__Type
+  syntax match   vimfilerColumn__TypeSystem     '\[S\]'
+        \ contained containedin=vimfilerColumn__Type
+  syntax match   vimfilerColumn__TypeLink       '\[L\]'
+        \ contained containedin=vimfilerColumn__Type
+
+  highlight def link vimfilerColumn__TypeText Constant
+  highlight def link vimfilerColumn__TypeImage Type
+  highlight def link vimfilerColumn__TypeArchive Special
+  highlight def link vimfilerColumn__TypeExecute Statement
+  highlight def link vimfilerColumn__TypeMultimedia Identifier
+  highlight def link vimfilerColumn__TypeDirectory Preproc
+  highlight def link vimfilerColumn__TypeSystem Comment
+  highlight def link vimfilerColumn__TypeLink Comment
+endfunction"}}}
+
+function! s:column.get(file, context) abort
+  return WebDevIconsGetFileTypeSymbol(strpart(a:file.action__path, strridx(a:file.action__path, '/')), a:file.vimfiler__is_directory)
+endfunction
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim: foldmethod=marker
diff --git a/.vim/pack/vendor/start/vim-devicons/doc/webdevicons.txt b/.vim/pack/vendor/start/vim-devicons/doc/webdevicons.txt
new file mode 100644
index 0000000..c1f5db1
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/doc/webdevicons.txt
@@ -0,0 +1,1078 @@
+*devicons*
+
+===============================================================================
+Contents ~
+
+ 1. Introduction                                        |devicons-introduction|
+ 2. Features                                                |devicons-features|
+ 3. Installation                                        |devicons-installation|
+ 4. Developers                                            |devicons-developers|
+ 5. Troubleshooting                                  |devicons-troubleshooting|
+ 6. Contributing                                        |devicons-contributing|
+  1. Code of Conduct [22]                         |devicons-code-of-conduct-22|
+  2. Contributing Guide [23]                   |devicons-contributing-guide-23|
+  3. Promotion                                             |devicons-promotion|
+ 7. Acknowledgments                                  |devicons-acknowledgments|
+ 8. License                                                  |devicons-license|
+ 9. Detailed Installation                      |devicons-detailed-installation|
+  1. Step 1 'Nerd Font'                                             |Nerd-Font|
+  2. Step 2 'VimDevIcons Plugin'                           |VimDevIcons-Plugin|
+   1. Pathogen [38]                                      |devicons-pathogen-38|
+   2. NeoBundle [39]                                    |devicons-neobundle-39|
+   3. Vundle [40]                                          |devicons-vundle-40|
+   4. Manual                                                  |devicons-manual|
+  3. Step 3 'Configure Vim'                                     |Configure-Vim|
+   1. Set Encoding                                      |devicons-set-encoding|
+   2. Set Font                                              |devicons-set-font|
+   3. vim-airline                                        |devicons-vim-airline|
+   4. vimrc examples                                  |devicons-vimrc-examples|
+  4. That's it! You're done.                    |devicons-thats-it-youre-done.|
+ 10. Usage                                                     |devicons-usage|
+  1. NERDTree                                               |devicons-nerdtree|
+  2. Unite                                                     |devicons-unite|
+  3. Denite                                                   |devicons-denite|
+  4. Vimfiler                                               |devicons-vimfiler|
+  5. CtrlP                                                     |devicons-ctrlp|
+  6. Airline                                                 |devicons-airline|
+  7. Startify                                               |devicons-startify|
+  8. Lightline Setup                                 |devicons-lightline-setup|
+  9. Powerline Setup                                 |devicons-powerline-setup|
+  10. Flagship                                              |devicons-flagship|
+ 11. Detailed Features                             |devicons-detailed-features|
+ 12. Extra Configuration                         |devicons-extra-configuration|
+  1. Character Mappings                           |devicons-character-mappings|
+  2. API                                                         |devicons-api|
+   1. Public Methods                                  |devicons-public-methods|
+   2. API Examples                                      |devicons-api-examples|
+    1. Status line                                       |devicons-status-line|
+    2. Simple function call                     |devicons-simple-function-call|
+   3. Integration with other plugins  |devicons-integration-with-other-plugins|
+    1. vim-startify                                     |devicons-vim-startify|
+ 13. FAQ                                                         |devicons-faq|
+  1. Why isn't it working? How come I don't see any icons? |devicons-why-isnt-it-working-how-come-i-dont-see-any-icons|
+  2. How did you get color matching based on file type in NERDtree? |devicons-how-did-you-get-color-matching-based-on-file-type-in-nerdtree|
+  3. How did you get color matching on just the glyph/icon in NERDtree? |devicons-how-did-you-get-color-matching-on-just-glyph-icon-in-nerdtree|
+  4. How do I solve issues after re-sourcing my |vimrc|?
+  5. Why do I have artifacts after (or instead) of icons? |devicons-why-do-i-have-artifacts-after-of-icons|
+  6. Square brackets around icons       |devicons-square-brackets-around-icons|
+   1. from terminal                                    |devicons-from-terminal|
+  7. Do I have to use a patched font such as Nerd Fonts? |devicons-do-i-have-to-use-patched-font-such-as-nerd-fonts|
+  8. Rationale: Why does this exist? How did this start? |devicons-rationale-why-does-this-exist-how-did-this-start|
+ 14. References                                           |devicons-references|
+
+===============================================================================
+                                                        *devicons-introduction*
+Introduction ~
+>
+   _    ___           ____            ____                     
+  | |  / (_____ ___  / __ \___ _   __/  _/________  ____  _____
+  | | / / / __ `__ \/ / / / _ | | / // // ___/ __ \/ __ \/ ___/
+  | |/ / / / / / / / /_/ /  __| |/ _/ // /__/ /_/ / / / (__  ) 
+  |___/_/_/ /_/ /_/_____/\___/|___/___/\___/\____/_/ /_/____/  
+<
+**VimDevIcons**
+
+Adds Icons to Your Plugins
+
+Supports plugins such as NERDTree [1], vim-airline [2], CtrlP [3], powerline
+[4], denite [5], unite [6], lightline.vim [7], vim-startify [8], vimfiler [9],
+vim-workspace [10] and flagship [11].
+
+See Screenshots [12] for more.
+
+===============================================================================
+                                                            *devicons-features*
+Features ~
+
+- Adds filetype glyphs (icons) to various vim plugins.
+- Supports byte order marker (BOM).
+- Customizable and extendable glyphs settings.
+- Supports a wide range of file type extensions.
+- Supports popular full filenames, like '.gitignore', 'node_modules',
+  '.vimrc'.
+- Works with patched fonts, especially Nerd Fonts [13].
+
+See Detailed Features [14] for more.
+
+See Configuration [15] for a list of configuration and customization options.
+
+===============================================================================
+                                                        *devicons-installation*
+Installation ~
+
+1. Install a Nerd Font compatible font [16] or patch your own [17]. Then set
+   your terminal font (or 'guifont' if you are using GUI version of Vim).
+
+2. Install the Vim plugin with your favorite plugin manager, e.g. vim-plug
+   [18]:
+
+   "vim Plug 'ryanoasis/vim-devicons'"
+
+   Always load the vim-devicons as the very last one.
+
+3. Configure Vim
+
+   'vim set encoding=UTF-8'
+
+   No need to set explicitly under Neovim: always uses UTF-8 as the default
+   encoding.
+
+See Installation [19] for detailed setup instructions
+
+Use ':help devicons' for further configuration.
+
+===============================================================================
+                                                          *devicons-developers*
+Developers ~
+
+See DEVELOPER [20] for how to use the API.
+
+===============================================================================
+                                                     *devicons-troubleshooting*
+Troubleshooting ~
+
+See FAQ [21].
+
+===============================================================================
+                                                        *devicons-contributing*
+Contributing ~
+
+-------------------------------------------------------------------------------
+                                                  *devicons-code-of-conduct-22*
+Code of Conduct [22] ~
+
+This project has adopted a Code of Conduct that we expect project participants
+to adhere to. Check out code of conduct [22] for further details.
+
+-------------------------------------------------------------------------------
+                                               *devicons-contributing-guide-23*
+Contributing Guide [23] ~
+
+Read our contributing [23] guide to learn about how to send pull requests,
+creating issues properly.
+
+-------------------------------------------------------------------------------
+                                                           *devicons-promotion*
+Promotion ~
+
+You can help us by simply giving a star or voting on vim.org. It will ensure
+continued development going forward.
+
+- Star this repository on GitHub [24].
+- Vote for it on vim.org [25].
+
+===============================================================================
+                                                     *devicons-acknowledgments*
+Acknowledgments ~
+
+Thanks goes to these people for inspiration and helping with sending PRs.
+
+- vim-airline [2]
+- nerdtree [1]
+- nerdtree-git-plugin [26] by @Xuyuanp [27]
+- seti-ui [28] by @jesseweed [29]
+- devicons [30] by @vorillaz [31]
+- development.svg.icons [32] by @benatespina [33]
+- Learn Vimscript the Hard Way [34] book by Steve Losh [35]
+- All contributors [36]
+
+===============================================================================
+                                                             *devicons-license*
+License ~
+
+MIT [37]
+
+===============================================================================
+                                               *devicons-detailed-installation*
+Detailed Installation ~
+
+-------------------------------------------------------------------------------
+                                                                    *Nerd-Font*
+Step 1 'Nerd Font' ~
+
+Get a **Nerd Font!** [16] or patch your own. [17] Without this, things break
+
+-------------------------------------------------------------------------------
+                                                           *VimDevIcons-Plugin*
+Step 2 'VimDevIcons Plugin' ~
+
+**Set VimDevIcons to load _after_ these plugins!**
+
+NERDTree [1] | vim-airline [2] | CtrlP [3] | powerline [4] | Denite [5] | unite
+[6] | lightline.vim [7] | vim-startify [8] | vimfiler [9] | flagship [11]
+
+Choose your favorite plugin manager
+
+-------------------------------------------------------------------------------
+                                                         *devicons-pathogen-38*
+Pathogen [38] ~
+
+- 'git clone https://github.com/ryanoasis/vim-devicons ~/.vim/bundle/vim-
+  devicons'
+
+-------------------------------------------------------------------------------
+                                                        *devicons-neobundle-39*
+NeoBundle [39] ~
+
+- Add to vimrc:
+
+  "vim NeoBundle 'ryanoasis/vim-devicons'" * And install it:
+
+  'vim :so ~/.vimrc :NeoBundleInstall'
+
+-------------------------------------------------------------------------------
+                                                           *devicons-vundle-40*
+Vundle [40] ~
+
+- Add to vimrc:
+
+  "vim Plugin 'ryanoasis/vim-devicons'" * And install it:
+
+  'vim :so ~/.vimrc :PlugInstall'
+
+-------------------------------------------------------------------------------
+                                                              *devicons-manual*
+Manual ~
+
+- copy all of the files into your '~/.vim' directory
+
+-------------------------------------------------------------------------------
+                                                                *Configure-Vim*
+Step 3 'Configure Vim' ~
+
+Add the following in your '.vimrc' or '.gvimrc':
+
+-------------------------------------------------------------------------------
+                                                        *devicons-set-encoding*
+Set Encoding ~
+
+**Set encoding to UTF-8 to show glyphs**
+
+'vim set encoding=utf8'
+
+-------------------------------------------------------------------------------
+                                                            *devicons-set-font*
+Set Font ~
+
+**Set Vim font to a Nerd Font**
+
+Linux 'vim set guifont='
+>
+  set guifont=DroidSansMono\ Nerd\ Font\ 11
+<
+macOS (OS X) and Windows
+>
+  set guifont=:h
+<
+
+>
+  set guifont=DroidSansMono\ Nerd\ Font:h11
+  " or:
+  set guifont=DroidSansMono_Nerd_Font:h11
+<
+**Note:** if you don't set 'guifont' then you'll have to set your terminal's
+font, else things break!
+
+-------------------------------------------------------------------------------
+                                                         *devicons-vim-airline*
+vim-airline ~
+
+**If you use vim-airline you need this:**
+
+'vim let g:airline_powerline_fonts = 1'
+
+-------------------------------------------------------------------------------
+                                                      *devicons-vimrc-examples*
+vimrc examples ~
+
+- Sample Windows vimrc configuration 1 [41]
+- Sample Linux vimrc configuration 1 [42]
+
+-------------------------------------------------------------------------------
+                                                *devicons-thats-it-youre-done.*
+That's it! You're done. ~
+
+===============================================================================
+                                                               *devicons-usage*
+Usage ~
+
+If you installed and setup things correctly you should now see icons in the
+supported plugins!
+
+**Notes on include order:** _for support of these plugins: NERDTree [1], vim-
+airline [2], CtrlP [3], powerline [4], Denite [5], unite [6], vimfiler [9],
+flagship [11] you **must** configure vim to load those plugins__before_ vim-
+devicons loads. for better nerdtree-git-plugin [26] support, you _should_
+configure vim to load nerdtree-git-plugin **_before_** VimDevIcons loads. * if
+you are lazy loading Denite [5] using the Dein plugin manager, you will need to
+source VimDevIcons before Denite loads.
+
+Lightline Setup and Powerline Setup require some extra setup as shown below:
+
+-------------------------------------------------------------------------------
+                                                            *devicons-nerdtree*
+NERDTree ~
+
+Should work "out of the box", no particular configuration should be needed.
+>
+  " Can be enabled or disabled
+  let g:webdevicons_enable_nerdtree = 1
+<
+
+>
+  " whether or not to show the nerdtree brackets around flags
+  let g:webdevicons_conceal_nerdtree_brackets = 1
+<
+-------------------------------------------------------------------------------
+                                                               *devicons-unite*
+Unite ~
+
+Should work "out of the box", no particular configuration should be needed.
+>
+  " Can be enabled or disabled
+  " adding the custom source to unite
+  let g:webdevicons_enable_unite = 1
+<
+-------------------------------------------------------------------------------
+                                                              *devicons-denite*
+Denite ~
+
+Should work "out of the box", no particular configuration should be needed.
+>
+  " Can be enabled or disabled
+  " Adding the custom source to denite
+  let g:webdevicons_enable_denite = 1
+<
+-------------------------------------------------------------------------------
+                                                            *devicons-vimfiler*
+Vimfiler ~
+
+Should work "out of the box", no particular configuration should be needed.
+>
+  " Can be enabled or disabled
+  " adding the column to vimfiler
+  let g:webdevicons_enable_vimfiler = 1
+<
+-------------------------------------------------------------------------------
+                                                               *devicons-ctrlp*
+CtrlP ~
+
+Should work "out of the box", no particular configuration should be needed.
+>
+  " Can be enabled or disabled
+  " add glyphs to all modes
+  let g:webdevicons_enable_ctrlp = 1
+<
+-------------------------------------------------------------------------------
+                                                             *devicons-airline*
+Airline ~
+
+Should work "out of the box", no particular configuration should be needed.
+>
+  " adding to vim-airline's tabline
+  let g:webdevicons_enable_airline_tabline = 1
+<
+
+>
+  " adding to vim-airline's statusline
+  let g:webdevicons_enable_airline_statusline = 1
+<
+-------------------------------------------------------------------------------
+                                                            *devicons-startify*
+Startify ~
+
+Should work "out of the box", no particular configuration should be needed.
+>
+  " Can be enabled or disabled
+  " adding to vim-startify screen
+  let g:webdevicons_enable_startify = 1
+<
+-------------------------------------------------------------------------------
+                                                     *devicons-lightline-setup*
+Lightline Setup ~
+
+To add the appropriate icon to lightline [7], call the function
+'WebDevIconsGetFileTypeSymbol()' and/or 'WebDevIconsGetFileFormatSymbol()' in
+your '.vimrc'. For example, you could set your sections to:
+>
+  let g:lightline = {
+        \ 'component_function': {
+        \   'filetype': 'MyFiletype',
+        \   'fileformat': 'MyFileformat',
+        \ }
+        \ }
+  
+  function! MyFiletype()
+    return winwidth(0) > 70 ? (strlen(&filetype) ? &filetype . ' ' . WebDevIconsGetFileTypeSymbol() : 'no ft') : ''
+  endfunction
+  
+  function! MyFileformat()
+    return winwidth(0) > 70 ? (&fileformat . ' ' . WebDevIconsGetFileFormatSymbol()) : ''
+  endfunction
+<
+-------------------------------------------------------------------------------
+                                                     *devicons-powerline-setup*
+Powerline Setup ~
+
+- _Note this is for the current Powerline [4] not the deprecated vim-
+  powerline [43]_
+
+To enable for Powerline [4] some |vimrc| and powerline configuration changes
+are needed:
+
+|vimrc| changes (only required if you don't already have powerline setup for
+vim):
+>
+  set rtp+=$HOME/.local/lib/python2.7/site-packages/powerline/bindings/vim/
+  
+  " Always show statusline
+  set laststatus=2
+  
+  " Use 256 colours (Use this setting only if your terminal supports 256 colours)
+  set t_Co=256
+<
+powerline configuration changes:
+
+file type segment
+>
+  {
+      "function": "vim_devicons.powerline.segments.webdevicons",
+      "priority": 10,
+      "draw_soft_divider": false,
+      "after": "  "
+  }
+<
+file format segment
+>
+  {
+      "function": "vim_devicons.powerline.segments.webdevicons_file_format",
+      "draw_soft_divider": false,
+      "exclude_modes": ["nc"],
+      "priority": 90
+   }
+<
+for full example see sample file [44]
+
+-------------------------------------------------------------------------------
+                                                            *devicons-flagship*
+Flagship ~
+
+Should work "out of the box", no particular configuration should be needed.
+>
+  " Can be enabled or disabled
+  " adding to flagship's statusline
+  let g:webdevicons_enable_flagship_statusline = 1
+<
+===============================================================================
+                                                   *devicons-detailed-features*
+Detailed Features ~
+
+- Adds filetype glyphs (icons) to various vim plugins, currently supports:
+
+- NERDTree [1]
+
+  - Using the version hosted on vimscripts [45] in favor of GitHub will
+    lead to a outdated message, and icons will fail to show.
+
+- vim-airline [2] (statusline and tabline)
+
+- CtrlP [3]  (All modes now supported)
+
+  - Using the version hosted on vimscripts [46] in favor of GitHub will
+    lead to a outdated message, and icons will fail to show.
+
+- powerline [4]  (statusline)
+
+  - see: powerline setup
+
+- Denite [5]
+
+  - Currently supports 'file_rec', 'file_old', 'buffer', and
+    'directory_rec'
+
+- unite [6]
+
+  - Currently supports 'file', 'file_rec', 'buffer', 'file_rec/async', and
+    'file_rec/neovim'
+
+- lightline.vim [7]  (statusline)
+
+  - see: lightline setup
+
+- vim-startify [8]
+
+- vimfiler [9]
+
+- flagship [11]
+
+  - Support is **experimental** because the API may be changing [47]
+
+- vim-workspace [10]
+
+- Supports byte order marker (BOM)
+
+- Customizable and extendable glyphs (icons) settings
+
+- ability to override defaults and use your own characters or glyphs
+
+- Supports a wide range of file type extensions by default:
+
+- 'styl, sass, scss, htm, html, slim, ejs, css, less, md, rmd, json, js, jsx,
+  rb, php, py, pyc, pyd, pyo, coffee, mustache, hbs, conf, ini, yml, yaml,
+  bat, jpg, jpeg, bmp, png, gif, twig, cpp, c++, cxx, cc, cp, c, h, hpp, hxx,
+  hs, lhs, lua, java, sh, bash, zsh, ksh, csh, awk, ps1, fish, diff, db, clj,
+  cljs, edn, scala, go, dart, xul, sln, suo, pl, pm, t, rss, f#, fsscript,
+  fsx, fs, fsi, rs, rlib, d, erl, hrl, vim, ai, psd, psb, ts, jl, pp, vue,
+  swift, eex, ex, exs'
+
+- Supports a few full filename matches, by default:
+
+- 'gruntfile.coffee, gruntfile.js, gruntfile.ls, gulpfile.coffee,
+  gulpfile.js, gulpfile.ls, dropbox, .ds_store, .gitconfig, .gitignore,
+  .bashrc, .zshrc, .vimrc, .bashprofile, favicon.ico, license, node_modules,
+  react.jsx, procfile'
+
+- Supports a few library pattern matches, by default:
+
+- 'jquery, angular, backbone, requirejs, materialize, mootools, Vagrantfile'
+
+- Works with patched fonts, especially Nerd Fonts [13]
+
+===============================================================================
+                                                 *devicons-extra-configuration*
+Extra Configuration ~
+
+- These options can be defined in your |vimrc| or 'gvimrc'
+
+- Most options are enabled **'1'** by default but can be disabled with
+  **'0'**
+
+- You _should_**not** need to configure anything, however, the following
+  options are provided for customizing or changing the defaults:
+>
+  " loading the plugin
+  let g:webdevicons_enable = 1
+<
+
+>
+  " adding the flags to NERDTree
+  let g:webdevicons_enable_nerdtree = 1
+<
+
+>
+  " adding the custom source to unite
+  let g:webdevicons_enable_unite = 1
+<
+
+>
+  " adding the column to vimfiler
+  let g:webdevicons_enable_vimfiler = 1
+<
+
+>
+  " adding to vim-airline's tabline
+  let g:webdevicons_enable_airline_tabline = 1
+<
+
+>
+  " adding to vim-airline's statusline
+  let g:webdevicons_enable_airline_statusline = 1
+<
+
+>
+  " ctrlp glyphs
+  let g:webdevicons_enable_ctrlp = 1
+<
+
+>
+  " adding to vim-startify screen
+  let g:webdevicons_enable_startify = 1
+<
+
+>
+  " adding to flagship's statusline
+  let g:webdevicons_enable_flagship_statusline = 1
+<
+
+>
+  " turn on/off file node glyph decorations (not particularly useful)
+  let g:WebDevIconsUnicodeDecorateFileNodes = 1
+<
+
+>
+  " use double-width(1) or single-width(0) glyphs
+  " only manipulates padding, has no effect on terminal or set(guifont) font
+  let g:WebDevIconsUnicodeGlyphDoubleWidth = 1
+<
+
+>
+  " whether or not to show the nerdtree brackets around flags
+  let g:webdevicons_conceal_nerdtree_brackets = 1
+<
+
+>
+  " the amount of space to use after the glyph character (default ' ')
+  let g:WebDevIconsNerdTreeAfterGlyphPadding = '  '
+<
+
+>
+  " Force extra padding in NERDTree so that the filetype icons line up vertically
+  let g:WebDevIconsNerdTreeGitPluginForceVAlign = 1
+<
+
+>
+  " Adding the custom source to denite
+  let g:webdevicons_enable_denite = 1
+
+
+
+  " the amount of space to use after the glyph character in vim-airline
+	tabline(default '')
+  let g:WebDevIconsTabAirLineAfterGlyphPadding = ' '
+
+
+
+  " the amount of space to use before the glyph character in vim-airline
+	tabline(default ' ')
+  let g:WebDevIconsTabAirLineBeforeGlyphPadding = ' '
+<
+-------------------------------------------------------------------------------
+                                                  *devicons-character-mappings*
+Character Mappings ~
+
+- 'ƛ' is used as an example below, substitute for the glyph you **actually**
+  want to use
+>
+  " change the default character when no match found
+  let g:WebDevIconsUnicodeDecorateFileNodesDefaultSymbol = 'ƛ'
+<
+
+>
+  " set a byte character marker (BOM) utf-8 symbol when retrieving file encoding
+  " disabled by default with no value
+  let g:WebDevIconsUnicodeByteOrderMarkerDefaultSymbol = ''
+<
+
+>
+  " enable folder/directory glyph flag (disabled by default with 0)
+  let g:WebDevIconsUnicodeDecorateFolderNodes = 1
+<
+
+>
+  " enable open and close folder/directory glyph flags (disabled by default with 0)
+  let g:DevIconsEnableFoldersOpenClose = 1
+<
+
+>
+  " enable pattern matching glyphs on folder/directory (enabled by default with 1)
+  let g:DevIconsEnableFolderPatternMatching = 1
+<
+
+>
+  " enable file extension pattern matching glyphs on folder/directory (disabled by default with 0)
+  let g:DevIconsEnableFolderExtensionPatternMatching = 0
+<
+
+>
+  " disable showing the distribution for unix file encoding (enabled by default with 1)
+  let g:DevIconsEnableDistro = 0
+<
+
+>
+  " enable custom folder/directory glyph exact matching
+  " (enabled by default when g:WebDevIconsUnicodeDecorateFolderNodes is set to 1)
+  let WebDevIconsUnicodeDecorateFolderNodesExactMatches = 1
+<
+
+>
+  " change the default folder/directory glyph/icon
+  let g:WebDevIconsUnicodeDecorateFolderNodesDefaultSymbol = 'ƛ'
+<
+
+>
+  " change the default open folder/directory glyph/icon (default is '')
+  let g:DevIconsDefaultFolderOpenSymbol = 'ƛ'
+<
+
+>
+  " change the default dictionary mappings for file extension matches
+  
+  let g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols = {} " needed
+  let g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols['js'] = 'ƛ'
+<
+
+>
+  " change the default dictionary mappings for exact file node matches
+  
+  let g:WebDevIconsUnicodeDecorateFileNodesExactSymbols = {} " needed
+  let g:WebDevIconsUnicodeDecorateFileNodesExactSymbols['MyReallyCoolFile.okay'] = 'ƛ'
+<
+
+>
+  " add or override individual additional filetypes
+  
+  let g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols = {} " needed
+  let g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols['myext'] = 'ƛ'
+<
+
+>
+  " add or override pattern matches for filetypes
+  " these take precedence over the file extensions
+  
+  let g:WebDevIconsUnicodeDecorateFileNodesPatternSymbols = {} " needed
+  let g:WebDevIconsUnicodeDecorateFileNodesPatternSymbols['.*jquery.*\.js$'] = 'ƛ'
+<
+specify OS to decide an icon for unix fileformat (_not_ defined by default) -
+this is useful for avoiding unnecessary 'system()' call. see #135 [48] for
+further details.
+>
+  let g:WebDevIconsOS = 'Darwin'
+<
+-------------------------------------------------------------------------------
+                                                                 *devicons-api*
+API ~
+>
+  " returns the font character that represents the icon
+  " parameters: a:1 (filename), a:2 (isDirectory)
+  " both parameters optional
+  " by default without parameters uses buffer name
+  WebDevIconsGetFileTypeSymbol(...)
+  
+  " returns the font character that represents
+  " the file format as an icon (windows, linux, mac)
+  WebDevIconsGetFileFormatSymbol()
+<
+-------------------------------------------------------------------------------
+                                                      *devicons-public-methods*
+Public Methods ~
+>
+  " Returns the current version of the plugin
+  webdevicons#version()
+<
+
+>
+  " Calls webdevicons#softRefresh()
+  " basically a backwards compatibility convenience
+  webdevicons#refresh()
+<
+
+>
+  " Does a 'hard' refresh of NERDTree
+  " resets vim-devicons syntax and closes and reopens NERDTree
+  webdevicons#hardRefresh()
+<
+
+>
+  " Does a 'soft' refresh of NERDTree
+  " resets vim-devicons syntax and toggles NERDTree to the same state
+  webdevicons#softRefresh()
+<
+-------------------------------------------------------------------------------
+                                                        *devicons-api-examples*
+API Examples ~
+
+-------------------------------------------------------------------------------
+                                                         *devicons-status-line*
+Status line ~
+
+Custom vim status line (not relying on vim-airline or lightline):
+>
+  set statusline=%f\ %{WebDevIconsGetFileTypeSymbol()}\ %h%w%m%r\ %=%(%l,%c%V\ %Y\ %=\ %P%)
+<
+-------------------------------------------------------------------------------
+                                                *devicons-simple-function-call*
+Simple function call ~
+>
+  echo WebDevIconsGetFileFormatSymbol()
+<
+-------------------------------------------------------------------------------
+                                      *devicons-integration-with-other-plugins*
+Integration with other plugins ~
+
+-------------------------------------------------------------------------------
+                                                        *devicons-vim-startify*
+vim-startify ~
+>
+  let entry_format = "'   ['. index .']'. repeat(' ', (3 - strlen(index)))"
+  
+  if exists('*WebDevIconsGetFileTypeSymbol')  " support for vim-devicons
+    let entry_format .= ". WebDevIconsGetFileTypeSymbol(entry_path) .' '.  entry_path"
+  else
+    let entry_format .= '. entry_path'
+  endif
+<
+===============================================================================
+                                                                 *devicons-faq*
+FAQ ~
+
+**Table of Contents:**
+
+**It's not working at all:**
+
+- **Why isn't it working? How come I don't see any icons?**
+
+**Syntax or color highlighting:**
+
+- **How did you get color matching based on file type in NERDtree?**
+- **How did you get color matching on just the glyph/icon in NERDtree?**
+
+**Re-sourcing |vimrc|:**
+
+- **How do I solve issues after re-sourcing my |vimrc|?**
+
+**Weird artifacts after/on the glyphs:**
+
+- **Why do I have artifacts after (or instead) of icons?**
+- **Square brackets around icons?**
+
+**Fonts:**
+
+- **Do I have to use a patched font such as Nerd Fonts?**
+
+**Why does this exist? How did this start?**
+
+-------------------------------------------------------------------------------
+                   *devicons-why-isnt-it-working-how-come-i-dont-see-any-icons*
+Why isn't it working? How come I don't see any icons? ~
+
+- Are you using the patched font provided in the separate repo (Nerd Fonts
+  [13]) or are you patching your own?
+
+- _NOTE:_ if running vim and no font set it will default to the terminal font
+  that is set
+
+- check what the vim/gvim font is set to, from ex mode:
+
+  'vim :set guifont?'
+
+- check if the plugin is loaded (should give '1'), from ex mode:
+
+  'vim :echo loaded_webdevicons'
+
+- check if the plugin is enabled (should give '1'), from ex mode:
+
+  'vim :echo g:webdevicons_enable'
+
+- check if the plugin is enabled for NERDTree (should give '1'), from ex
+  mode:
+
+  - this should _NOT_ need to be set under normal circumstances
+
+  'vim :echo g:webdevicons_enable_nerdtree'
+
+- check if you are able to see the characters, from ex mode:
+
+  'vim :echo g:WebDevIconsUnicodeDecorateFileNodesDefaultSymbol'
+
+- if all this looks correct you may try this to see if any files show flags
+
+  - last resort, see if you can even set the default symbol and have it
+    display anywhere (NERDTree, vim-airline's statusline, vim-airlines's
+    tabline), from ex mode:
+
+  "vim :let g:WebDevIconsUnicodeDecorateFileNodesDefaultSymbol='x'"
+
+-------------------------------------------------------------------------------
+       *devicons-how-did-you-get-color-matching-based-on-file-type-in-nerdtree*
+How did you get color matching based on file type in NERDtree? ~
+
+- You can either use this additional plugin: vim-nerdtree-syntax-highlight
+  [49] created by @tiagofumo [50]
+
+- Or you can use my current settings from:
+  https://github.com/scrooloose/nerdtree/issues/201#issuecomment-9954740
+
+  ```vim " NERDTress File highlighting function!
+  NERDTreeHighlightFile(extension, fg, bg, guifg, guibg) exec 'autocmd
+  FileType nerdtree highlight ' . a:extension .' ctermbg='. a:bg .'
+  ctermfg='. a:fg .' guibg='. a:guibg .' guifg='. a:guifg exec 'autocmd
+  FileType nerdtree syn match ' . a:extension .' #^\s+.*'. a:extension .'$#'
+  endfunction
+
+  call NERDTreeHighlightFile('jade', 'green', 'none', 'green', '#151515')
+  call NERDTreeHighlightFile('ini', 'yellow', 'none', 'yellow', '#151515')
+  call NERDTreeHighlightFile('md', 'blue', 'none', '#3366FF', '#151515') call
+  NERDTreeHighlightFile('yml', 'yellow', 'none', 'yellow', '#151515') call
+  NERDTreeHighlightFile('config', 'yellow', 'none', 'yellow', '#151515') call
+  NERDTreeHighlightFile('conf', 'yellow', 'none', 'yellow', '#151515') call
+  NERDTreeHighlightFile('json', 'yellow', 'none', 'yellow', '#151515') call
+  NERDTreeHighlightFile('html', 'yellow', 'none', 'yellow', '#151515') call
+  NERDTreeHighlightFile('styl', 'cyan', 'none', 'cyan', '#151515') call
+  NERDTreeHighlightFile('css', 'cyan', 'none', 'cyan', '#151515') call
+  NERDTreeHighlightFile('coffee', 'Red', 'none', 'red', '#151515') call
+  NERDTreeHighlightFile('js', 'Red', 'none', '#ffa500', '#151515') call
+  NERDTreeHighlightFile('php', 'Magenta', 'none', '#ff00ff', '#151515') call
+  NERDTreeHighlightFile('ds_store', 'Gray', 'none', '#686868', '#151515')
+  call NERDTreeHighlightFile('gitconfig', 'Gray', 'none', '#686868',
+  '#151515') call NERDTreeHighlightFile('gitignore', 'Gray', 'none',
+  '#686868', '#151515') call NERDTreeHighlightFile('bashrc', 'Gray', 'none',
+  '#686868', '#151515') call NERDTreeHighlightFile('bashprofile', 'Gray',
+  'none', '#686868', '#151515') 'Note: If the colors still are not
+  highlighting, try invoking such as:' autocmd VimEnter * call
+  NERDTreeHighlightFile('jade', 'green', 'none', 'green', '#151515') ``` per:
+  https://github.com/ryanoasis/vim-devicons/issues/49#issuecomment-101753558
+
+-------------------------------------------------------------------------------
+       *devicons-how-did-you-get-color-matching-on-just-glyph-icon-in-nerdtree*
+How did you get color matching on just the glyph/icon in NERDtree? ~
+
+- You can add something like this to your |vimrc|
+
+  ```vim " NERDTress File highlighting only the glyph/icon " test highlight
+  just the glyph (icons) in nerdtree: autocmd filetype nerdtree highlight
+  haskell_icon ctermbg=none ctermfg=Red guifg=#ffa500 autocmd filetype
+  nerdtree highlight html_icon ctermbg=none ctermfg=Red guifg=#ffa500 autocmd
+  filetype nerdtree highlight go_icon ctermbg=none ctermfg=Red guifg=#ffa500
+
+  autocmd filetype nerdtree syn match haskell_icon ##
+  containedin=NERDTreeFile " if you are using another syn highlight for a
+  given line (e.g. " NERDTreeHighlightFile) need to give that name in the
+  'containedin' for this " other highlight to work with it autocmd filetype
+  nerdtree syn match html_icon ## containedin=NERDTreeFile,html autocmd
+  filetype nerdtree syn match go_icon ## containedin=NERDTreeFile ```
+
+-------------------------------------------------------------------------------
+How do I solve issues after re-sourcing my *vimrc*?
+
+- Try adding this to the bottom of your |vimrc|
+
+  'vim if exists("g:loaded_webdevicons") call webdevicons#refresh() endif'
+
+-------------------------------------------------------------------------------
+                              *devicons-why-do-i-have-artifacts-after-of-icons*
+Why do I have artifacts after (or instead) of icons? ~
+
+- Dots after icons in NERDTree (on GVim), try:
+
+'vim autocmd FileType nerdtree setlocal nolist'
+
+source: Issue #110 [51]
+
+- Newly created files in NERDTree are slow to show the glyph (icon)
+- check your current setting of ':updatetime?'
+- try setting 'updatetime' in your |vimrc| to a lower value like '250', for
+  more info see: Issue #153 [52]
+
+-------------------------------------------------------------------------------
+                                        *devicons-square-brackets-around-icons*
+Square brackets around icons ~
+
+- By default if your Vim supports conceal you should not see these, debug
+  steps:
+
+  - Check if the plugin feature is set (should be '1'):
+
+  'vim echo g:webdevicons_conceal_nerdtree_brackets'
+
+  - Check that your vim was compiled with the 'conceal' feature (should be
+    '+conceal'):
+
+  ```shell
+
+-------------------------------------------------------------------------------
+                                                       *devicons-from-terminal*
+    from terminal ~
+
+  vim --version | grep conceal ```
+
+  - Check the 'conceallevel' (should be '3'):
+
+  'vim set conceallevel?'
+
+-------------------------------------------------------------------------------
+                    *devicons-do-i-have-to-use-patched-font-such-as-nerd-fonts*
+Do I have to use a patched font such as Nerd Fonts? ~
+
+VimDevIcons was desired to work with Nerd Fonts [13], however you do _not_ have
+to use a patched font or even Nerd Fonts specified glyphs. You have 2 main
+options:
+
+fontconfig fallback
+
+1. Install the NERD Font symbol fonts:
+
+2. Symbols Nerd Font:style=1000-em [53]
+
+3. Symbols Nerd Font:style=2048-em [54]
+
+4. Install 10-nerd-font-symbols.conf [55] for Fontconfig
+
+5. for additional information see: Issue #124 [56] and [Nerd Fonts
+   'fontconfig']
+
+Use your own glyph codepoints
+
+- specify your own glyphs and/or use your own font (see: Character Mappings
+  [57])
+
+-------------------------------------------------------------------------------
+                    *devicons-rationale-why-does-this-exist-how-did-this-start*
+Rationale: Why does this exist? How did this start? ~
+
+After seeing the awesome theme for Atom (seti-ui) and the awesome plugins work
+done for NERDTree and vim-airline and wanting something like this for Vim I
+decided to create my first plugin.
+
+===============================================================================
+                                                          *devicons-references*
+References ~
+
+[1] https://github.com/scrooloose/nerdtree
+[2] https://github.com/vim-airline/vim-airline
+[3] https://github.com/ctrlpvim/ctrlp.vim
+[4] https://github.com/powerline/powerline
+[5] https://github.com/Shougo/denite.nvim
+[6] https://github.com/Shougo/unite.vim
+[7] https://github.com/itchyny/lightline.vim
+[8] https://github.com/mhinz/vim-startify
+[9] https://github.com/Shougo/vimfiler.vim
+[10] https://github.com/bagrat/vim-workspace
+[11] https://github.com/tpope/vim-flagship
+[12] https://github.com/ryanoasis/vim-devicons/wiki/screenshots
+[13] https://github.com/ryanoasis/nerd-fonts
+[14] https://github.com/ryanoasis/vim-devicons/wiki/Detailed-Features
+[15] https://github.com/ryanoasis/vim-devicons/wiki/Extra-Configuration
+[16] https://github.com/ryanoasis/nerd-fonts#font-installation
+[17] https://github.com/ryanoasis/nerd-fonts#font-patcher
+[18] https://github.com/junegunn/vim-plug
+[19] https://github.com/ryanoasis/vim-devicons/wiki/Installation
+[20] DEVELOPER.md
+[21] https://github.com/ryanoasis/vim-devicons/wiki/FAQ-&-Troubleshooting
+[22] CODE_OF_CONDUCT.md
+[23] CONTRIBUTING.md
+[24] https://github.com/ryanoasis/vim-devicons
+[25] http://www.vim.org/scripts/script.php?script_id=5114
+[26] https://github.com/Xuyuanp/nerdtree-git-plugin
+[27] https://github.com/Xuyuanp
+[28] https://atom.io/themes/seti-ui
+[29] https://github.com/jesseweed
+[30] http://vorillaz.github.io/devicons
+[31] https://github.com/vorillaz
+[32] https://github.com/benatespina/development.svg.icons
+[33] https://github.com/benatespina
+[34] http://learnvimscriptthehardway.stevelosh.com/
+[35] http://stevelosh.com/
+[36] https://github.com/ryanoasis/vim-devicons/graphs/contributors
+[37] LICENSE
+[38] https://github.com/tpope/vim-pathogen
+[39] https://github.com/Shougo/neobundle.vim
+[40] https://github.com/gmarik/vundle
+[41] https://github.com/ryanoasis/vim-devicons/wiki/samples/v0.10.x/.vimrc-windows-1
+[42] https://github.com/ryanoasis/vim-devicons/wiki/samples/v0.10.x/.vimrc-linux-1
+[43] https://github.com/Lokaltog/vim-powerline
+[44] https://github.com/ryanoasis/vim-devicons/wiki/samples/v0.10.x/powerline/themes/vim/default.json
+[45] http://www.vim.org/scripts/script.php?script_id=1658
+[46] http://www.vim.org/scripts/script.php?script_id=3736
+[47] https://github.com/tpope/vim-flagship/issues/6#issuecomment-116121220
+[48] https://github.com/ryanoasis/vim-devicons/pull/135
+[49] https://github.com/tiagofumo/vim-nerdtree-syntax-highlight
+[50] https://github.com/tiagofumo
+[51] https://github.com/ryanoasis/vim-devicons/issues/110#issue-103801335
+[52] https://github.com/ryanoasis/vim-devicons/issues/153
+[53] https://github.com/ryanoasis/nerd-fonts/blob/master/src/glyphs/Symbols-1000-em%20Nerd%20Font%20Complete.ttf
+[54] https://github.com/ryanoasis/nerd-fonts/blob/master/src/glyphs/Symbols-2048-em%20Nerd%20Font%20Complete.ttf
+[55] https://github.com/ryanoasis/nerd-fonts/blob/master/10-nerd-font-symbols.conf
+[56] https://github.com/ryanoasis/vim-devicons/issues/124
+[57] https://github.com/ryanoasis/vim-devicons#character-mappings
+
+vim: ft=help
diff --git a/.vim/pack/vendor/start/vim-devicons/nerdtree_plugin/webdevicons.vim b/.vim/pack/vendor/start/vim-devicons/nerdtree_plugin/webdevicons.vim
new file mode 100644
index 0000000..7c1f9f7
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/nerdtree_plugin/webdevicons.vim
@@ -0,0 +1,389 @@
+" Version: 0.11.0
+" Webpage: https://github.com/ryanoasis/vim-devicons
+" Maintainer: Ryan McIntyre <ryanoasis@gmail.com>
+" License: see LICENSE
+
+" @todo fix duplicate global variable initialize here:
+if !exists('g:webdevicons_enable')
+  let g:webdevicons_enable = 1
+endif
+
+if !exists('g:webdevicons_enable_nerdtree')
+  let g:webdevicons_enable_nerdtree = 1
+endif
+
+if !exists('g:DevIconsEnableFoldersOpenClose')
+  let g:DevIconsEnableFoldersOpenClose = 0
+endif
+
+if !exists('g:DevIconsEnableFolderPatternMatching')
+  let g:DevIconsEnableFolderPatternMatching = 1
+endif
+
+if !exists('g:DevIconsEnableFolderExtensionPatternMatching')
+  let g:DevIconsEnableFolderExtensionPatternMatching = 0
+endif
+
+" end @todo duplicate global variables
+
+" Temporary (hopefully) fix for glyph issues in gvim (proper fix is with the
+" actual font patcher)
+if !exists('g:webdevicons_gui_glyph_fix')
+  if has('gui_running')
+    let g:webdevicons_gui_glyph_fix = 1
+  else
+    let g:webdevicons_gui_glyph_fix = 0
+  endif
+endif
+
+if !exists('g:DevIconsEnableNERDTreeRedraw')
+  if has('gui_running')
+    let g:DevIconsEnableNERDTreeRedraw = 1
+  else
+    let g:DevIconsEnableNERDTreeRedraw = 0
+  endif
+endif
+
+if g:webdevicons_enable_nerdtree == 1
+  if !exists('g:loaded_nerd_tree')
+     echohl WarningMsg |
+       \ echomsg 'vim-webdevicons requires NERDTree to be loaded before vim-webdevicons.'
+  endif
+
+  if exists('g:loaded_nerd_tree') && g:loaded_nerd_tree == 1 && !exists('g:NERDTreePathNotifier')
+     let g:webdevicons_enable_nerdtree = 0
+     echohl WarningMsg |
+        \ echomsg 'vim-webdevicons requires a newer version of NERDTree to show glyphs in NERDTree - consider updating NERDTree.'
+  endif
+
+  " @todo I don't even want this to execute UNLESS the user has the
+  " 'nerdtree-git-plugin' INSTALLED (not LOADED)
+  " As it currently functions this warning will display even if the user does
+  " not have nerdtree-git-plugin not just if it isn't loaded yet 
+  " (not what we want)
+  "if !exists('g:loaded_nerdtree_git_status')
+  "   echohl WarningMsg |
+  "     \ echomsg 'vim-webdevicons works better when 'nerdtree-git-plugin' is loaded before vim-webdevicons (small refresh issues otherwise).'
+  "endif
+endif
+
+if !exists('g:webdevicons_enable_airline_tabline')
+  let g:webdevicons_enable_airline_tabline = 1
+endif
+
+if !exists('g:webdevicons_enable_airline_statusline')
+  let g:webdevicons_enable_airline_statusline = 1
+endif
+
+function! s:SetupListeners()
+  call g:NERDTreePathNotifier.AddListener('init', 'NERDTreeWebDevIconsRefreshListener')
+  call g:NERDTreePathNotifier.AddListener('refresh', 'NERDTreeWebDevIconsRefreshListener')
+  call g:NERDTreePathNotifier.AddListener('refreshFlags', 'NERDTreeWebDevIconsRefreshListener')
+endfunction
+
+" util like helpers
+" scope: local
+function! s:Refresh()
+  call b:NERDTree.root.refreshFlags()
+  call NERDTreeRender()
+endfunction
+
+" Temporary (hopefully) fix for glyph issues in gvim (proper fix is with the
+" actual font patcher)
+
+" NERDTree-C
+" scope: global
+function! WebDevIconsNERDTreeChangeRootHandler(node)
+  call b:NERDTree.changeRoot(a:node)
+  call NERDTreeRender()
+  call a:node.putCursorHere(0, 0)
+  if g:DevIconsEnableNERDTreeRedraw ==# 1
+    redraw!
+  endif
+endfunction
+
+" NERDTree-u
+" scope: global
+function! WebDevIconsNERDTreeUpDirCurrentRootClosedHandler()
+  call nerdtree#ui_glue#upDir(0)
+  if g:DevIconsEnableNERDTreeRedraw ==# 1
+    redraw!
+  endif
+endfunction
+
+function! WebDevIconsNERDTreeDirUpdateFlags(node, glyph)
+  let path = a:node.path
+  let isOpen = a:node.isOpen
+  let postPadding = g:WebDevIconsNerdTreeAfterGlyphPadding
+  let prePadding = g:WebDevIconsNerdTreeBeforeGlyphPadding
+  let hasGitFlags = (len(path.flagSet._flagsForScope('git')) > 0)
+  let hasGitNerdTreePlugin = (exists('g:loaded_nerdtree_git_status') == 1)
+  let collapsesToSameLine = (exists('g:NERDTreeCascadeSingleChildDir') == 1)
+  let dirHasOnlyOneChildDir = 0
+
+  if collapsesToSameLine
+    " need to call to determin children:
+    call a:node._initChildren(1)
+    let dirHasOnlyOneChildDir = (a:node.getChildCount() ==# 1 && a:node.children[0].path.isDirectory)
+  endif
+
+  " properly set collapsed/combined directory display to opened glyph
+  if collapsesToSameLine && dirHasOnlyOneChildDir
+    call WebDevIconsNERDTreeDirOpen(a:node.children[0])
+  endif
+
+  " align vertically at the same level: non git-flag nodes with git-flag nodes
+  if g:WebDevIconsNerdTreeGitPluginForceVAlign && !hasGitFlags && hasGitNerdTreePlugin
+    let prePadding .= '  '
+  endif
+
+  let flag = prePadding . a:glyph . postPadding
+
+  call a:node.path.flagSet.clearFlags('webdevicons')
+
+  if flag !=? ''
+    call a:node.path.flagSet.addFlag('webdevicons', flag)
+    "echom "added flag of " . flag
+    call a:node.path.refreshFlags(b:NERDTree)
+    "echom "flagset is now " . string(a:node.path.flagSet)
+  endif
+endfunction
+
+function! WebDevIconsNERDTreeDirClose(node)
+  let a:node.path.isOpen = 0
+  let glyph = g:WebDevIconsUnicodeDecorateFolderNodesDefaultSymbol
+  call WebDevIconsNERDTreeDirUpdateFlags(a:node, glyph)
+endfunction
+
+function! WebDevIconsNERDTreeDirOpen(node)
+  let a:node.path.isOpen = 1
+  let glyph = g:DevIconsDefaultFolderOpenSymbol
+  call WebDevIconsNERDTreeDirUpdateFlags(a:node, glyph)
+endfunction
+
+function! WebDevIconsNERDTreeDirOpenRecursively(node)
+  call WebDevIconsNERDTreeDirOpen(a:node)
+  for i in a:node.children
+    if i.path.isDirectory ==# 1
+      call WebDevIconsNERDTreeDirOpenRecursively(i)
+    endif
+  endfor
+endfunction
+
+function! WebDevIconsNERDTreeDirCloseRecursively(node)
+  call WebDevIconsNERDTreeDirClose(a:node)
+  for i in a:node.children
+    if i.path.isDirectory ==# 1
+      call WebDevIconsNERDTreeDirCloseRecursively(i)
+    endif
+  endfor
+endfunction
+
+function! WebDevIconsNERDTreeDirCloseChildren(node)
+  for i in a:node.children
+    if i.path.isDirectory ==# 1
+      call WebDevIconsNERDTreeDirClose(i)
+    endif
+  endfor
+endfunction
+
+" NERDTreeMapActivateNode and <2-LeftMouse>
+" handle the user activating a tree node
+" scope: global
+function! WebDevIconsNERDTreeMapActivateNode(node)
+  let isOpen = a:node.isOpen
+  if isOpen
+    let glyph = g:WebDevIconsUnicodeDecorateFolderNodesDefaultSymbol
+  else
+    let glyph = g:DevIconsDefaultFolderOpenSymbol
+  endif
+  let a:node.path.isOpen = !isOpen
+  call WebDevIconsNERDTreeDirUpdateFlags(a:node, glyph)
+  " continue with normal activate logic
+  call a:node.activate()
+  " glyph change possible artifact clean-up
+  if g:DevIconsEnableNERDTreeRedraw ==# 1
+    redraw!
+  endif
+endfunction
+
+" NERDTreeMapActivateNodeSingleMode 
+" handle the user activating a tree node if NERDTreeMouseMode is setted to 3
+" scope: global
+function! WebDevIconsNERDTreeMapActivateNodeSingleMode(node)
+  if g:NERDTreeMouseMode == 3
+    let isOpen = a:node.isOpen
+    if isOpen
+      let glyph = g:WebDevIconsUnicodeDecorateFolderNodesDefaultSymbol
+    else
+      let glyph = g:DevIconsDefaultFolderOpenSymbol
+    endif
+    let a:node.path.isOpen = !isOpen
+    call WebDevIconsNERDTreeDirUpdateFlags(a:node, glyph)
+    " continue with normal activate logic
+    call a:node.activate()
+    " glyph change possible artifact clean-up
+    if g:DevIconsEnableNERDTreeRedraw ==# 1
+      redraw!
+    endif
+  endif
+endfunction
+
+function! WebDevIconsNERDTreeMapOpenRecursively(node)
+  " normal original logic:
+  call nerdtree#echo('Recursively opening node. Please wait...')
+  call WebDevIconsNERDTreeDirOpenRecursively(a:node)
+  call a:node.openRecursively()
+  " continue with normal original logic:
+  call b:NERDTree.render()
+  " glyph change possible artifact clean-up
+  if g:DevIconsEnableNERDTreeRedraw ==# 1
+    redraw!
+  endif
+  call nerdtree#echo('Recursively opening node. Please wait... DONE')
+endfunction
+
+function! WebDevIconsNERDTreeMapCloseChildren(node)
+  " close children but not current node:
+  call WebDevIconsNERDTreeDirCloseChildren(a:node)
+  " continue with normal original logic:
+  call a:node.closeChildren()
+  call b:NERDTree.render()
+  call a:node.putCursorHere(0, 0)
+  " glyph change possible artifact clean-up
+  if g:DevIconsEnableNERDTreeRedraw ==# 1
+    redraw!
+  endif
+endfunction
+
+function! WebDevIconsNERDTreeMapCloseDir(node)
+  " continue with normal original logic:
+  let parent = a:node.parent
+  while g:NERDTreeCascadeOpenSingleChildDir && !parent.isRoot()
+    let childNodes = parent.getVisibleChildren()
+    if len(childNodes) == 1 && childNodes[0].path.isDirectory
+      let parent = parent.parent
+    else
+      break
+    endif
+  endwhile
+  if parent ==# {} || parent.isRoot()
+    call nerdtree#echo('cannot close tree root')
+  else
+    call parent.close()
+    " update the glyph
+    call WebDevIconsNERDTreeDirClose(parent)
+    call b:NERDTree.render()
+    call parent.putCursorHere(0, 0)
+    " glyph change possible artifact clean-up
+    if g:DevIconsEnableNERDTreeRedraw ==# 1
+      redraw!
+    endif
+  endif
+endfunction
+
+function! WebDevIconsNERDTreeMapUpdirKeepOpen()
+  call WebDevIconsNERDTreeDirOpen(b:NERDTree.root)
+  " continue with normal logic:
+  call nerdtree#ui_glue#upDir(1)
+  call s:Refresh()
+  " glyph change possible artifact clean-up
+  if g:DevIconsEnableNERDTreeRedraw ==# 1
+    redraw!
+  endif
+endfunction
+
+if g:webdevicons_enable == 1 && g:webdevicons_enable_nerdtree == 1
+  call s:SetupListeners()
+
+  if g:DevIconsEnableFoldersOpenClose
+
+    " These overrides are needed because we cannot
+    " simply use AddListener for reliably updating
+    " the folder open/close glyphs because the event
+    " path has no access to the 'isOpen' property
+    " some of these are a little more brittle/fragile
+    " than others
+    " TODO FIXME better way to reliably update
+    " open/close glyphs in NERDTreeWebDevIconsRefreshListener
+
+    " NERDTreeMapActivateNode
+    call NERDTreeAddKeyMap({
+      \ 'key': g:NERDTreeMapActivateNode,
+      \ 'callback': 'WebDevIconsNERDTreeMapActivateNode',
+      \ 'override': 1,
+      \ 'scope': 'DirNode' })
+
+    " NERDTreeMapCustomOpen
+    call NERDTreeAddKeyMap({
+      \ 'key': g:NERDTreeMapCustomOpen,
+      \ 'callback': 'WebDevIconsNERDTreeMapActivateNode',
+      \ 'override': 1,
+      \ 'scope': 'DirNode' })
+
+    " NERDTreeMapOpenRecursively
+    call NERDTreeAddKeyMap({
+      \ 'key': g:NERDTreeMapOpenRecursively,
+      \ 'callback': 'WebDevIconsNERDTreeMapOpenRecursively',
+      \ 'override': 1,
+      \ 'scope': 'DirNode' })
+
+    " NERDTreeMapCloseChildren
+    call NERDTreeAddKeyMap({
+      \ 'key': g:NERDTreeMapCloseChildren,
+      \ 'callback': 'WebDevIconsNERDTreeMapCloseChildren',
+      \ 'override': 1,
+      \ 'scope': 'DirNode' })
+
+    " NERDTreeMapCloseChildren
+    call NERDTreeAddKeyMap({
+      \ 'key': g:NERDTreeMapCloseDir,
+      \ 'callback': 'WebDevIconsNERDTreeMapCloseDir',
+      \ 'override': 1,
+      \ 'scope': 'Node' })
+
+    " <2-LeftMouse>
+    call NERDTreeAddKeyMap({
+      \ 'key': '<2-LeftMouse>',
+      \ 'callback': 'WebDevIconsNERDTreeMapActivateNode',
+      \ 'override': 1,
+      \ 'scope': 'DirNode' })
+
+    " <LeftRelease>
+    call NERDTreeAddKeyMap({
+      \ 'key': '<LeftRelease>',
+      \ 'callback': 'WebDevIconsNERDTreeMapActivateNodeSingleMode',
+      \ 'override': 1,
+      \ 'scope': 'DirNode' })
+
+    " NERDTreeMapUpdirKeepOpen
+    call NERDTreeAddKeyMap({
+      \ 'key': g:NERDTreeMapUpdirKeepOpen,
+      \ 'callback': 'WebDevIconsNERDTreeMapUpdirKeepOpen',
+      \ 'override': 1,
+      \ 'scope': 'all' })
+
+  endif
+
+  " Temporary (hopefully) fix for glyph issues in gvim (proper fix is with the
+  " actual font patcher)
+  if g:webdevicons_gui_glyph_fix ==# 1
+    call NERDTreeAddKeyMap({
+      \ 'key': g:NERDTreeMapChangeRoot,
+      \ 'callback': 'WebDevIconsNERDTreeChangeRootHandler',
+      \ 'override': 1,
+      \ 'quickhelpText': "change tree root to the\n\"    selected dir\n\"    plus devicons redraw\n\"    hack fix",
+      \ 'scope': 'Node' })
+
+    call NERDTreeAddKeyMap({
+      \ 'key': g:NERDTreeMapUpdir,
+      \ 'callback': 'WebDevIconsNERDTreeUpDirCurrentRootClosedHandler',
+      \ 'override': 1,
+      \ 'quickhelpText': "move tree root up a dir\n\"    plus devicons redraw\n\"    hack fix",
+      \ 'scope': 'all' })
+  endif
+
+endif
+
+" modeline syntax:
+" vim: fdm=marker tabstop=2 softtabstop=2 shiftwidth=2 expandtab:
diff --git a/.vim/pack/vendor/start/vim-devicons/plugin/webdevicons.vim b/.vim/pack/vendor/start/vim-devicons/plugin/webdevicons.vim
new file mode 100644
index 0000000..596ec68
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/plugin/webdevicons.vim
@@ -0,0 +1,703 @@
+" Version: 0.11.0
+" Webpage: https://github.com/ryanoasis/vim-devicons
+" Maintainer: Ryan McIntyre <ryanoasis@gmail.com>
+" License: see LICENSE
+
+let s:version = '0.11.0'
+let s:plugin_home = expand('<sfile>:p:h:h')
+
+" set scriptencoding after 'encoding' and when using multibyte chars
+scriptencoding utf-8
+
+" standard fix/safety: line continuation (avoiding side effects) {{{1
+"========================================================================
+let s:save_cpo = &cpo
+set cpo&vim
+
+" standard loading / not loading {{{1
+"========================================================================
+
+if exists('g:loaded_webdevicons')
+  finish
+endif
+
+let g:loaded_webdevicons = 1
+
+" config enable / disable settings {{{1
+"========================================================================
+
+""
+" Set the variable to the default value, only if variable is not defined.
+"
+" @param {string} var Variable name with its scope.
+" @param {*} default Default value for variable.
+""
+function! s:set(var, default) abort
+  if !exists(a:var)
+    if type(a:default)
+      execute 'let' a:var '=' string(a:default)
+    else
+      execute 'let' a:var '=' a:default
+    endif
+  endif
+endfunction
+
+call s:set('g:webdevicons_enable', 1)
+call s:set('g:webdevicons_enable_nerdtree', 1)
+call s:set('g:webdevicons_enable_unite ', 1)
+call s:set('g:webdevicons_enable_denite', 1)
+call s:set('g:webdevicons_enable_vimfiler', 1)
+call s:set('g:webdevicons_enable_ctrlp', 1)
+call s:set('g:webdevicons_enable_airline_tabline', 1)
+call s:set('g:webdevicons_enable_airline_statusline', 1)
+call s:set('g:webdevicons_enable_airline_statusline_fileformat_symbols', 1)
+call s:set('g:webdevicons_enable_flagship_statusline', 1)
+call s:set('g:webdevicons_enable_flagship_statusline_fileformat_symbols', 1)
+call s:set('g:webdevicons_enable_startify', 1)
+call s:set('g:webdevicons_conceal_nerdtree_brackets', 1)
+call s:set('g:DevIconsAppendArtifactFix', has('gui_running') ? 1 : 0)
+call s:set('g:DevIconsArtifactFixChar', ' ')
+
+" config options {{{1
+"========================================================================
+
+call s:set('g:WebDevIconsUnicodeDecorateFileNodes', 1)
+call s:set('g:WebDevIconsUnicodeDecorateFolderNodes', 1)
+call s:set('g:DevIconsEnableFoldersOpenClose', 0)
+call s:set('g:DevIconsEnableFolderPatternMatching', 1)
+call s:set('g:DevIconsEnableFolderExtensionPatternMatching', 0)
+call s:set('g:DevIconsEnableDistro', 1)
+call s:set('g:WebDevIconsUnicodeDecorateFolderNodesExactMatches', 1)
+call s:set('g:WebDevIconsUnicodeGlyphDoubleWidth', 1)
+call s:set('g:WebDevIconsNerdTreeBeforeGlyphPadding', ' ')
+call s:set('g:WebDevIconsNerdTreeAfterGlyphPadding', ' ')
+call s:set('g:WebDevIconsNerdTreeGitPluginForceVAlign', 1)
+call s:set('g:NERDTreeUpdateOnCursorHold', 1) " Obsolete: For backward compatibility
+call s:set('g:NERDTreeGitStatusUpdateOnCursorHold', 1)
+call s:set('g:WebDevIconsTabAirLineBeforeGlyphPadding', ' ')
+call s:set('g:WebDevIconsTabAirLineAfterGlyphPadding', '')
+
+" config defaults {{{1
+"========================================================================
+
+call s:set('g:WebDevIconsUnicodeDecorateFileNodesDefaultSymbol', '')
+call s:set('g:WebDevIconsUnicodeByteOrderMarkerDefaultSymbol', '')
+call s:set('g:WebDevIconsUnicodeDecorateFolderNodesDefaultSymbol', g:DevIconsEnableFoldersOpenClose ? '' : '')
+call s:set('g:WebDevIconsUnicodeDecorateFolderNodesSymlinkSymbol',  '')
+call s:set('g:DevIconsDefaultFolderOpenSymbol', '')
+
+" functions {{{1
+"========================================================================
+
+" local functions {{{2
+"========================================================================
+
+" scope: local
+function s:getDistro()
+  if exists('s:distro')
+    return s:distro
+  endif
+
+  if has('bsd')
+    let s:distro = ''
+    return s:distro
+  endif
+
+  if g:DevIconsEnableDistro && executable('lsb_release')
+    let s:lsb = system('lsb_release -i')
+    if s:lsb =~# 'Arch'
+      let s:distro = ''
+    elseif s:lsb =~# 'Gentoo'
+      let s:distro = ''
+    elseif s:lsb =~# 'Ubuntu'
+      let s:distro = ''
+    elseif s:lsb =~# 'Cent'
+      let s:distro = ''
+    elseif s:lsb =~# 'Debian'
+      let s:distro = ''
+    elseif s:lsb =~# 'Dock'
+      let s:distro = ''
+    else
+      let s:distro = ''
+    endif
+    return s:distro
+  endif
+
+  let s:distro = ''
+  return s:distro
+endfunction
+
+" scope: local
+function s:isDarwin()
+  if exists('s:is_darwin')
+    return s:is_darwin
+  endif
+
+  if exists('g:WebDevIconsOS')
+    let s:is_darwin = g:WebDevIconsOS ==? 'Darwin'
+    return s:is_darwin
+  endif
+
+  if has('macunix')
+    let s:is_darwin = 1
+    return s:is_darwin
+  endif
+
+  if ! has('unix')
+    let s:is_darwin = 0
+    return s:is_darwin
+  endif
+
+  if system('uname -s') ==# "Darwin\n"
+    let s:is_darwin = 1
+  else
+    let s:is_darwin = 0
+  endif
+
+  return s:is_darwin
+endfunction
+
+" scope: local
+function! s:strip(input)
+  return substitute(a:input, '^\s*\(.\{-}\)\s*$', '\1', '')
+endfunction
+
+" scope: local
+function! s:setDictionaries()
+
+  let s:file_node_extensions = {
+        \ 'styl'     : '',
+        \ 'sass'     : '',
+        \ 'scss'     : '',
+        \ 'htm'      : '',
+        \ 'html'     : '',
+        \ 'slim'     : '',
+        \ 'haml'     : '',
+        \ 'ejs'      : '',
+        \ 'css'      : '',
+        \ 'less'     : '',
+        \ 'md'       : '',
+        \ 'mdx'      : '',
+        \ 'markdown' : '',
+        \ 'rmd'      : '',
+        \ 'json'     : '',
+        \ 'webmanifest' : '',
+        \ 'js'       : '',
+        \ 'mjs'      : '',
+        \ 'jsx'      : '',
+        \ 'rb'       : '',
+        \ 'gemspec'  : '',
+        \ 'rake'     : '',
+        \ 'php'      : '',
+        \ 'py'       : '',
+        \ 'pyc'      : '',
+        \ 'pyo'      : '',
+        \ 'pyd'      : '',
+        \ 'coffee'   : '',
+        \ 'mustache' : '',
+        \ 'hbs'      : '',
+        \ 'conf'     : '',
+        \ 'ini'      : '',
+        \ 'yml'      : '',
+        \ 'yaml'     : '',
+        \ 'toml'     : '',
+        \ 'bat'      : '',
+        \ 'mk'       : '',
+        \ 'jpg'      : '',
+        \ 'jpeg'     : '',
+        \ 'bmp'      : '',
+        \ 'png'      : '',
+        \ 'webp'     : '',
+        \ 'gif'      : '',
+        \ 'ico'      : '',
+        \ 'twig'     : '',
+        \ 'cpp'      : '',
+        \ 'c++'      : '',
+        \ 'cxx'      : '',
+        \ 'cc'       : '',
+        \ 'cp'       : '',
+        \ 'c'        : '',
+        \ 'cs'       : '',
+        \ 'h'        : '',
+        \ 'hh'       : '',
+        \ 'hpp'      : '',
+        \ 'hxx'      : '',
+        \ 'hs'       : '',
+        \ 'lhs'      : '',
+        \ 'nix'      : '',
+        \ 'lua'      : '',
+        \ 'java'     : '',
+        \ 'sh'       : '',
+        \ 'fish'     : '',
+        \ 'bash'     : '',
+        \ 'zsh'      : '',
+        \ 'ksh'      : '',
+        \ 'csh'      : '',
+        \ 'awk'      : '',
+        \ 'ps1'      : '',
+        \ 'ml'       : 'λ',
+        \ 'mli'      : 'λ',
+        \ 'diff'     : '',
+        \ 'db'       : '',
+        \ 'sql'      : '',
+        \ 'dump'     : '',
+        \ 'clj'      : '',
+        \ 'cljc'     : '',
+        \ 'cljs'     : '',
+        \ 'edn'      : '',
+        \ 'scala'    : '',
+        \ 'go'       : '',
+        \ 'dart'     : '',
+        \ 'xul'      : '',
+        \ 'sln'      : '',
+        \ 'suo'      : '',
+        \ 'pl'       : '',
+        \ 'pm'       : '',
+        \ 't'        : '',
+        \ 'rss'      : '',
+        \ 'f#'       : '',
+        \ 'fsscript' : '',
+        \ 'fsx'      : '',
+        \ 'fs'       : '',
+        \ 'fsi'      : '',
+        \ 'rs'       : '',
+        \ 'rlib'     : '',
+        \ 'd'        : '',
+        \ 'erl'      : '',
+        \ 'hrl'      : '',
+        \ 'ex'       : '',
+        \ 'exs'      : '',
+        \ 'eex'      : '',
+        \ 'leex'     : '',
+        \ 'heex'     : '',
+        \ 'vim'      : '',
+        \ 'ai'       : '',
+        \ 'psd'      : '',
+        \ 'psb'      : '',
+        \ 'ts'       : '',
+        \ 'tsx'      : '',
+        \ 'jl'       : '',
+        \ 'pp'       : '',
+        \ 'vue'      : '﵂',
+        \ 'elm'      : '',
+        \ 'swift'    : '',
+        \ 'xcplayground' : '',
+        \ 'tex'      : 'ﭨ',
+        \ 'r'        : 'ﳒ',
+        \ 'rproj'    : '鉶',
+        \ 'sol'      : 'ﲹ',
+        \ 'pem'      : ''
+        \}
+
+  let s:file_node_exact_matches = {
+        \ 'exact-match-case-sensitive-1.txt' : '1',
+        \ 'exact-match-case-sensitive-2'     : '2',
+        \ 'gruntfile.coffee'                 : '',
+        \ 'gruntfile.js'                     : '',
+        \ 'gruntfile.ls'                     : '',
+        \ 'gulpfile.coffee'                  : '',
+        \ 'gulpfile.js'                      : '',
+        \ 'gulpfile.ls'                      : '',
+        \ 'mix.lock'                         : '',
+        \ 'dropbox'                          : '',
+        \ '.ds_store'                        : '',
+        \ '.gitconfig'                       : '',
+        \ '.gitignore'                       : '',
+        \ '.gitattributes'                   : '',
+        \ '.gitlab-ci.yml'                   : '',
+        \ '.bashrc'                          : '',
+        \ '.zshrc'                           : '',
+        \ '.zshenv'                          : '',
+        \ '.zprofile'                        : '',
+        \ '.vimrc'                           : '',
+        \ '.gvimrc'                          : '',
+        \ '_vimrc'                           : '',
+        \ '_gvimrc'                          : '',
+        \ '.bashprofile'                     : '',
+        \ 'favicon.ico'                      : '',
+        \ 'license'                          : '',
+        \ 'node_modules'                     : '',
+        \ 'react.jsx'                        : '',
+        \ 'procfile'                         : '',
+        \ 'dockerfile'                       : '',
+        \ 'docker-compose.yml'               : '',
+        \ 'rakefile'                         : '',
+        \ 'config.ru'                        : '',
+        \ 'gemfile'                          : '',
+        \ 'makefile'                         : '',
+        \ 'cmakelists.txt'                   : '',
+        \ 'robots.txt'                       : 'ﮧ'
+        \}
+
+  let s:file_node_pattern_matches = {
+        \ '.*jquery.*\.js$'       : '',
+        \ '.*angular.*\.js$'      : '',
+        \ '.*backbone.*\.js$'     : '',
+        \ '.*require.*\.js$'      : '',
+        \ '.*materialize.*\.js$'  : '',
+        \ '.*materialize.*\.css$' : '',
+        \ '.*mootools.*\.js$'     : '',
+        \ '.*vimrc.*'             : '',
+        \ 'Vagrantfile$'          : ''
+        \}
+
+  if !exists('g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols')
+    let g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols = {}
+  endif
+
+  if !exists('g:WebDevIconsUnicodeDecorateFileNodesExactSymbols')
+    " do not remove: exact-match-case-sensitive-*
+    let g:WebDevIconsUnicodeDecorateFileNodesExactSymbols = {}
+  endif
+
+  if !exists('g:WebDevIconsUnicodeDecorateFileNodesPatternSymbols')
+    let g:WebDevIconsUnicodeDecorateFileNodesPatternSymbols = {}
+  endif
+
+  " iterate to fix allow user overriding of specific individual keys in vimrc (only gvimrc was working previously)
+  for [key, val] in items(s:file_node_extensions)
+    if !has_key(g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols, key)
+      let g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols[key] = val
+    endif
+  endfor
+
+  " iterate to fix allow user overriding of specific individual keys in vimrc (only gvimrc was working previously)
+  for [key, val] in items(s:file_node_exact_matches)
+    if !has_key(g:WebDevIconsUnicodeDecorateFileNodesExactSymbols, key)
+      let g:WebDevIconsUnicodeDecorateFileNodesExactSymbols[key] = val
+    endif
+  endfor
+
+  " iterate to fix allow user overriding of specific individual keys in vimrc (only gvimrc was working previously)
+  for [key, val] in items(s:file_node_pattern_matches)
+    if !has_key(g:WebDevIconsUnicodeDecorateFileNodesPatternSymbols, key)
+      let g:WebDevIconsUnicodeDecorateFileNodesPatternSymbols[key] = val
+    endif
+  endfor
+
+endfunction
+
+" scope: local
+function! s:setSyntax()
+  if g:webdevicons_enable_nerdtree == 1 && g:webdevicons_conceal_nerdtree_brackets == 1
+    augroup webdevicons_conceal_nerdtree_brackets
+      au!
+      autocmd FileType nerdtree syntax match hideBracketsInNerdTree "\]" contained conceal containedin=NERDTreeFlags
+      autocmd FileType nerdtree syntax match hideBracketsInNerdTree "\[" contained conceal containedin=NERDTreeFlags
+      autocmd FileType nerdtree syntax match hideBracketsInNerdTree "\]" contained conceal containedin=NERDTreeLinkFile
+      autocmd FileType nerdtree syntax match hideBracketsInNerdTree "\]" contained conceal containedin=NERDTreeLinkDir
+      autocmd FileType nerdtree syntax match hideBracketsInNerdTree "\[" contained conceal containedin=NERDTreeLinkFile
+      autocmd FileType nerdtree syntax match hideBracketsInNerdTree "\[" contained conceal containedin=NERDTreeLinkDir
+      autocmd FileType nerdtree setlocal conceallevel=3
+      autocmd FileType nerdtree setlocal concealcursor=nvic
+    augroup END
+  endif
+endfunction
+
+" scope: local
+" stole solution/idea from nerdtree-git-plugin :)
+function! s:setCursorHold()
+  if g:webdevicons_enable_nerdtree
+    augroup webdevicons_cursor_hold
+      autocmd CursorHold * silent! call s:CursorHoldUpdate()
+    augroup END
+  endif
+endfunction
+
+" scope: local
+" stole solution/idea from nerdtree-git-plugin :)
+function! s:CursorHoldUpdate()
+  if g:NERDTreeUpdateOnCursorHold != 1 || g:NERDTreeGitStatusUpdateOnCursorHold != 1
+    return
+  endif
+
+  if !exists('g:NERDTree') || !g:NERDTree.IsOpen()
+    return
+  endif
+
+  " Do not update when a special buffer is selected
+  if !empty(&l:buftype)
+    return
+  endif
+
+  " winnr need to make focus go to opened file
+  " CursorToTreeWin needed to avoid error on opening file
+  let l:winnr = winnr()
+  let l:altwinnr = winnr('#')
+
+  call g:NERDTree.CursorToTreeWin()
+  call b:NERDTree.root.refreshFlags()
+  call NERDTreeRender()
+
+  exec l:altwinnr . 'wincmd w'
+  exec l:winnr . 'wincmd w'
+endfunction
+
+" scope: local
+function! s:hardRefreshNerdTree()
+  if g:webdevicons_enable_nerdtree == 1 && g:webdevicons_conceal_nerdtree_brackets == 1 && g:NERDTree.IsOpen()
+    NERDTreeClose
+    NERDTree
+  endif
+endfunction
+
+" scope: local
+function! s:softRefreshNerdTree()
+  if g:webdevicons_enable_nerdtree == 1 && exists('g:NERDTree') && g:NERDTree.IsOpen()
+    NERDTreeToggle
+    NERDTreeToggle
+  endif
+endfunction
+
+" local initialization {{{2
+"========================================================================
+
+" scope: local
+function! s:initialize()
+  call s:setDictionaries()
+  call s:setSyntax()
+  call s:setCursorHold()
+
+  if exists('g:loaded_flagship') | call devicons#plugins#flagship#init() | endif
+  if exists('g:loaded_unite') && g:webdevicons_enable_unite | call devicons#plugins#unite#init() | endif
+  if exists('g:loaded_denite') && g:webdevicons_enable_denite | call devicons#plugins#denite#init() | endif
+  if exists('g:loaded_vimfiler') && g:webdevicons_enable_vimfiler | call devicons#plugins#vimfiler#init() | endif
+  if exists('g:loaded_ctrlp') && g:webdevicons_enable_ctrlp | call devicons#plugins#ctrlp#init() | endif
+  if exists('g:loaded_startify') && g:webdevicons_enable_startify | call devicons#plugins#startify#init() | endif
+endfunction
+
+
+" public functions {{{2
+"========================================================================
+
+" scope: public
+function! webdevicons#version()
+  return s:version
+endfunction
+
+" scope: public
+function! webdevicons#pluginHome()
+  return s:plugin_home
+endfunction
+
+" scope: public
+" allow the first version of refresh to now call softRefresh
+function! webdevicons#refresh()
+  call webdevicons#softRefresh()
+endfunction
+
+" scope: public
+function! webdevicons#hardRefresh()
+  call s:setSyntax()
+  call s:hardRefreshNerdTree()
+endfunction
+
+" scope: public
+function! webdevicons#softRefresh()
+  call s:setSyntax()
+  call s:softRefreshNerdTree()
+endfunction
+
+" a:1 (bufferName), a:2 (isDirectory)
+" scope: public
+function! WebDevIconsGetFileTypeSymbol(...) abort
+  if a:0 == 0
+    let fileNodeExtension = !empty(expand('%:e')) ? expand('%:e') : &filetype
+    let fileNode = expand('%:t')
+    let isDirectory = 0
+  else
+    let fileNodeExtension = fnamemodify(a:1, ':e')
+    let fileNode = fnamemodify(a:1, ':t')
+    if a:0 > 1
+      let isDirectory = a:2
+    else
+      let isDirectory = 0
+    endif
+  endif
+
+  if isDirectory == 0 || g:DevIconsEnableFolderPatternMatching
+
+    let symbol = g:WebDevIconsUnicodeDecorateFileNodesDefaultSymbol
+    let fileNodeExtension = tolower(fileNodeExtension)
+    let fileNode = tolower(fileNode)
+
+    for [pattern, glyph] in items(g:WebDevIconsUnicodeDecorateFileNodesPatternSymbols)
+      if match(fileNode, pattern) != -1
+        let symbol = glyph
+        break
+      endif
+    endfor
+
+    if symbol == g:WebDevIconsUnicodeDecorateFileNodesDefaultSymbol
+      if has_key(g:WebDevIconsUnicodeDecorateFileNodesExactSymbols, fileNode)
+        let symbol = g:WebDevIconsUnicodeDecorateFileNodesExactSymbols[fileNode]
+      elseif ((isDirectory == 1 && g:DevIconsEnableFolderExtensionPatternMatching) || isDirectory == 0) && has_key(g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols, fileNodeExtension)
+        let symbol = g:WebDevIconsUnicodeDecorateFileNodesExtensionSymbols[fileNodeExtension]
+      elseif isDirectory == 1
+        let symbol = g:WebDevIconsUnicodeDecorateFolderNodesDefaultSymbol
+      endif
+    endif
+
+  else
+    let symbol = g:WebDevIconsUnicodeDecorateFolderNodesDefaultSymbol
+  endif
+
+  let artifactFix = s:DevIconsGetArtifactFix()
+
+  return symbol . artifactFix
+
+endfunction
+
+" scope: local
+" Temporary (hopefully) fix for glyph issues in gvim (proper fix is with the
+" actual font patcher)
+function! s:DevIconsGetArtifactFix()
+  if g:DevIconsAppendArtifactFix == 1
+    let artifactFix = g:DevIconsArtifactFixChar
+  else
+    let artifactFix = ''
+  endif
+
+  return artifactFix
+endfunction
+
+" scope: public
+function! WebDevIconsGetFileFormatSymbol(...)
+  let fileformat = ''
+  let bomb = ''
+
+  if (&bomb && g:WebDevIconsUnicodeByteOrderMarkerDefaultSymbol !=? '')
+    let bomb = g:WebDevIconsUnicodeByteOrderMarkerDefaultSymbol . ' '
+  endif
+
+  if &fileformat ==? 'dos'
+    let fileformat = ''
+  elseif &fileformat ==? 'unix'
+    let fileformat = s:isDarwin() ? '' : s:getDistro()
+  elseif &fileformat ==? 'mac'
+    let fileformat = ''
+  endif
+
+  let artifactFix = s:DevIconsGetArtifactFix()
+
+  return bomb . fileformat . artifactFix
+endfunction
+
+" for airline plugin {{{3
+"========================================================================
+
+" scope: public
+function! AirlineWebDevIcons(...)
+  let w:airline_section_x = get(w:, 'airline_section_x',
+        \ get(g:, 'airline_section_x', ''))
+  let w:airline_section_x .= ' %{WebDevIconsGetFileTypeSymbol()} '
+  let hasFileFormatEncodingPart = airline#parts#ffenc() !=? ''
+  if g:webdevicons_enable_airline_statusline_fileformat_symbols && hasFileFormatEncodingPart
+    let w:airline_section_y = ' %{&fenc . " " . WebDevIconsGetFileFormatSymbol()} '
+  endif
+endfunction
+
+if g:webdevicons_enable == 1 && exists('g:loaded_airline') && g:loaded_airline == 1 && g:webdevicons_enable_airline_statusline
+  call airline#add_statusline_func('AirlineWebDevIcons')
+endif
+
+if g:webdevicons_enable == 1 && g:webdevicons_enable_airline_tabline
+  " Store original formatter.
+  let g:_webdevicons_airline_orig_formatter = get(g:, 'airline#extensions#tabline#formatter', 'default')
+  let g:airline#extensions#tabline#formatter = 'webdevicons'
+endif
+
+" for nerdtree plugin {{{3
+"========================================================================
+
+" scope: public
+function! NERDTreeWebDevIconsRefreshListener(event)
+  let path = a:event.subject
+  let postPadding = g:WebDevIconsNerdTreeAfterGlyphPadding
+  let prePadding = g:WebDevIconsNerdTreeBeforeGlyphPadding
+  let hasGitFlags = (len(path.flagSet._flagsForScope('git')) > 0)
+  let hasGitNerdTreePlugin = (exists('g:loaded_nerdtree_git_status') == 1)
+  let artifactFix = s:DevIconsGetArtifactFix()
+
+  " align vertically at the same level: non git-flag nodes with git-flag nodes
+  if g:WebDevIconsNerdTreeGitPluginForceVAlign && !hasGitFlags && hasGitNerdTreePlugin
+    let prePadding .= ' '
+  endif
+
+  if !path.isDirectory
+    " Hey we got a regular file, lets get it's proper icon
+    let flag = prePadding . WebDevIconsGetFileTypeSymbol(path.str()) . postPadding
+
+  elseif path.isDirectory && g:WebDevIconsUnicodeDecorateFolderNodes == 1
+    " Ok we got a directory, some more tests and checks
+    let directoryOpened = 0
+
+    if g:DevIconsEnableFoldersOpenClose && len(path.flagSet._flagsForScope('webdevicons')) > 0
+      " did the user set different icons for open and close?
+
+      " isOpen is not available on the path listener directly
+      " but we added one via overriding particular keymappings for NERDTree
+      if has_key(path, 'isOpen') && path.isOpen == 1
+        let directoryOpened = 1
+      endif
+    endif
+
+    if g:WebDevIconsUnicodeDecorateFolderNodesExactMatches == 1
+      " Did the user enable exact matching of folder type/names
+      " think node_modules
+      if g:DevIconsEnableFoldersOpenClose && directoryOpened
+        " the folder is open
+        let flag = prePadding . g:DevIconsDefaultFolderOpenSymbol . artifactFix . postPadding
+      else
+        " the folder is not open
+        if path.isSymLink
+          " We have a symlink
+          let flag = prePadding . g:WebDevIconsUnicodeDecorateFolderNodesSymlinkSymbol . artifactFix . postPadding
+        else
+          " We have a regular folder
+          let flag = prePadding . WebDevIconsGetFileTypeSymbol(path.str(), path.isDirectory) . postPadding
+        endif
+      endif
+
+    else
+      " the user did not enable exact matching
+      if g:DevIconsEnableFoldersOpenClose && directoryOpened
+        " the folder is open
+        let flag = prePadding . g:DevIconsDefaultFolderOpenSymbol . artifactFix . postPadding
+      else
+        " the folder is not open
+        if path.isSymLink
+          " We have a symlink
+          let flag = prePadding . g:WebDevIconsUnicodeDecorateFolderNodesSymlinkSymbol . artifactFix . postPadding
+        else
+          " We have a regular folder
+          let flag = prePadding . g:WebDevIconsUnicodeDecorateFolderNodesDefaultSymbol . artifactFix . postPadding
+        endif
+      endif
+
+    endif
+
+  else
+    let flag = prePadding . ' ' . artifactFix . postPadding
+  endif
+
+  call path.flagSet.clearFlags('webdevicons')
+
+  if flag !=? ''
+    call path.flagSet.addFlag('webdevicons', flag)
+  endif
+
+endfunction
+
+" call setup after processing all the functions (to avoid errors) {{{1
+"========================================================================
+" had some issues with VimEnter, for now using:
+call s:initialize()
+
+" standard fix/safety: line continuation (avoiding side effects) {{{1
+"========================================================================
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" modeline syntax:
+" vim: fdm=marker tabstop=2 softtabstop=2 shiftwidth=2 expandtab:
diff --git a/.vim/pack/vendor/start/vim-devicons/pythonx/vim_devicons/__init__.py b/.vim/pack/vendor/start/vim-devicons/pythonx/vim_devicons/__init__.py
new file mode 100644
index 0000000..ece379c
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/pythonx/vim_devicons/__init__.py
@@ -0,0 +1,2 @@
+import pkg_resources
+pkg_resources.declare_namespace(__name__)
diff --git a/.vim/pack/vendor/start/vim-devicons/pythonx/vim_devicons/powerline/__init__.py b/.vim/pack/vendor/start/vim-devicons/pythonx/vim_devicons/powerline/__init__.py
new file mode 100644
index 0000000..ece379c
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/pythonx/vim_devicons/powerline/__init__.py
@@ -0,0 +1,2 @@
+import pkg_resources
+pkg_resources.declare_namespace(__name__)
diff --git a/.vim/pack/vendor/start/vim-devicons/pythonx/vim_devicons/powerline/segments.py b/.vim/pack/vendor/start/vim-devicons/pythonx/vim_devicons/powerline/segments.py
new file mode 100644
index 0000000..f92f4ee
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/pythonx/vim_devicons/powerline/segments.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+# vim:se fenc=utf8 noet:
+from __future__ import (unicode_literals, division, absolute_import, print_function)
+
+try:
+	import vim
+except ImportError:
+	vim = {}
+
+from powerline.bindings.vim import (vim_get_func, buffer_name)
+from powerline.theme import requires_segment_info
+
+@requires_segment_info
+def webdevicons(pl, segment_info):
+	webdevicons = vim_get_func('WebDevIconsGetFileTypeSymbol')
+	name = buffer_name(segment_info)
+	return [] if not webdevicons else [{
+		'contents': webdevicons(name),
+		'highlight_groups': ['webdevicons', 'file_name'],
+		}]
+
+@requires_segment_info
+def webdevicons_file_format(pl, segment_info):
+	webdevicons_file_format = vim_get_func('WebDevIconsGetFileFormatSymbol')
+	return [] if not webdevicons_file_format else [{
+		'contents': webdevicons_file_format(),
+		'highlight_groups': ['webdevicons_file_format', 'file_format'],
+		}]
diff --git a/.vim/pack/vendor/start/vim-devicons/rplugin/python3/denite/filter/devicons_denite_converter.py b/.vim/pack/vendor/start/vim-devicons/rplugin/python3/denite/filter/devicons_denite_converter.py
new file mode 100644
index 0000000..6768009
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/rplugin/python3/denite/filter/devicons_denite_converter.py
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+# vim:se fenc=utf8 noet:
+from .base import Base
+from os.path import isdir
+
+
+class Filter(Base):
+
+	def __init__(self, vim):
+		super().__init__(vim)
+		self.name = 'devicons_denite_converter'
+		self.description = 'add devicons in front of candidates'
+
+	def filter(self, context):
+		for candidate in context['candidates']:
+
+			if 'bufnr' in candidate:
+				bufname = self.vim.funcs.bufname(candidate['bufnr'])
+				filename = self.vim.funcs.fnamemodify(bufname, ':p:t')
+			elif 'word' in candidate and 'action__path' in candidate:
+				filename = candidate['word']
+
+			icon = self.vim.funcs.WebDevIconsGetFileTypeSymbol(
+				filename, isdir(filename))
+
+			# Customize output format if not done already.
+			if icon not in candidate.get('abbr', '')[:10]:
+				candidate['abbr'] = ' {} {}'.format(
+					icon, candidate.get('abbr', candidate['word']))
+
+		return context['candidates']
diff --git a/.vim/pack/vendor/start/vim-devicons/test/.themisrc b/.vim/pack/vendor/start/vim-devicons/test/.themisrc
new file mode 100644
index 0000000..f59497a
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/test/.themisrc
@@ -0,0 +1 @@
+filetype plugin on
diff --git a/.vim/pack/vendor/start/vim-devicons/test/default_setting.vim b/.vim/pack/vendor/start/vim-devicons/test/default_setting.vim
new file mode 100644
index 0000000..b379948
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/test/default_setting.vim
@@ -0,0 +1,39 @@
+scriptencoding utf-8
+
+let s:suite = themis#suite('Webdevicons-default-value')
+let s:assert = themis#helper('assert')
+
+function! s:suite.ExtensionConfig()
+  call s:assert.equals(g:webdevicons_enable, 1)
+  call s:assert.equals(g:webdevicons_enable_nerdtree, 1)
+  call s:assert.equals(g:webdevicons_enable_unite, 1)
+  call s:assert.equals(g:webdevicons_enable_denite, 1)
+  call s:assert.equals(g:webdevicons_enable_vimfiler, 1)
+  call s:assert.equals(g:webdevicons_enable_ctrlp, 1)
+  call s:assert.equals(g:webdevicons_enable_airline_tabline, 1)
+  call s:assert.equals(g:webdevicons_enable_airline_statusline, 1)
+  call s:assert.equals(g:webdevicons_enable_airline_statusline_fileformat_symbols, 1)
+  call s:assert.equals(g:webdevicons_enable_flagship_statusline, 1)
+  call s:assert.equals(g:webdevicons_enable_flagship_statusline_fileformat_symbols, 1)
+  call s:assert.equals(g:webdevicons_enable_startify, 1)
+  call s:assert.equals(g:webdevicons_conceal_nerdtree_brackets, 1)
+endfunction
+
+function! s:suite.ConfigOptions()
+  call s:assert.equals(g:DevIconsAppendArtifactFix, 0)
+  call s:assert.equals(g:DevIconsArtifactFixChar, ' ')
+  call s:assert.equals(g:WebDevIconsUnicodeDecorateFileNodes, 1)
+  call s:assert.equals(g:WebDevIconsUnicodeDecorateFolderNodes, 1)
+  call s:assert.equals(g:DevIconsEnableFoldersOpenClose, 0)
+  call s:assert.equals(g:DevIconsEnableFolderPatternMatching, 1)
+  call s:assert.equals(g:DevIconsEnableFolderExtensionPatternMatching, 0)
+  call s:assert.equals(1, g:WebDevIconsUnicodeDecorateFolderNodesExactMatches, 1)
+  call s:assert.equals(1, g:WebDevIconsUnicodeGlyphDoubleWidth, 1)
+  call s:assert.equals(g:WebDevIconsNerdTreeBeforeGlyphPadding, ' ')
+  call s:assert.equals(g:WebDevIconsNerdTreeAfterGlyphPadding, ' ')
+  call s:assert.equals(g:WebDevIconsNerdTreeGitPluginForceVAlign, 1)
+  call s:assert.equals(g:NERDTreeUpdateOnCursorHold, 1) " Obsolete: for backward compatibility
+  call s:assert.equals(g:NERDTreeGitStatusUpdateOnCursorHold, 1)
+  call s:assert.equals(g:WebDevIconsTabAirLineBeforeGlyphPadding, ' ')
+  call s:assert.equals(g:WebDevIconsTabAirLineAfterGlyphPadding, '')
+endfunction
diff --git a/.vim/pack/vendor/start/vim-devicons/test/fileformat.vim b/.vim/pack/vendor/start/vim-devicons/test/fileformat.vim
new file mode 100644
index 0000000..170a27b
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/test/fileformat.vim
@@ -0,0 +1,29 @@
+scriptencoding utf-8
+
+" Please use nerd-font if you watch icon-font
+
+let s:suite = themis#suite('WebDevIconsGetFileFormatSymbol')
+let s:assert = themis#helper('assert')
+
+function! s:suite.UnixIcon()
+  set fileformat=unix
+  let os = system('uname -a')
+  if os =~# 'Darwin'
+    call s:assert.equals(WebDevIconsGetFileFormatSymbol(), '')
+  " It may return Ubuntu because github-actions's OS is Ubuntu
+  elseif os =~# 'Ubuntu'
+    call s:assert.equals(WebDevIconsGetFileFormatSymbol(), '')
+  else
+    call s:assert.skip('Skip testing except for Ubuntu and Mac.')
+  endif
+endfunction
+
+function! s:suite.WindowsIcon()
+  set fileformat=dos
+  call s:assert.equals(WebDevIconsGetFileFormatSymbol(), '')
+endfunction
+
+function! s:suite.MacIcon()
+  set fileformat=mac
+  call s:assert.equals(WebDevIconsGetFileFormatSymbol(), '')
+endfunction
diff --git a/.vim/pack/vendor/start/vim-devicons/test/filetype.vim b/.vim/pack/vendor/start/vim-devicons/test/filetype.vim
new file mode 100644
index 0000000..3669ad9
--- /dev/null
+++ b/.vim/pack/vendor/start/vim-devicons/test/filetype.vim
@@ -0,0 +1,344 @@
+scriptencoding utf-8
+
+" Please use nerd-font if you watch icon-font
+
+let s:suite = themis#suite('WebDevIconsGetFileTypeSymbol')
+let s:assert = themis#helper('assert')
+
+function! s:Assert(filename, icon)
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol(a:filename), a:icon)
+endfunction
+
+function! s:suite.NoArgument_GetDefaultIcon()
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol(), '')
+endfunction
+
+function! s:suite.__OneArgument_VimIcon__()
+  let targetfilenames = ['.vimrc', 'vimrc', '.gvimrc', '_gvimrc', 'test.vim']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_VimIcon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.__OneArgument_RubyIcon__()
+  let targetfilenames = ['test.rb', 'rakefile', 'RAKEFILE', 'Gemfile', 'config.ru']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_RubyIcon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.__OneArgument_MarkDownIcon__()
+  let targetfilenames = ['test.md', 'test.markdown', 'test.mdx', 'test.rmd']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_MarkDownIcon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.__OneArgument_PythonIcon__()
+  let targetfilenames = ['test.py', 'test.pyc', 'test.pyo', 'test.pyd']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_PythonIcon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.__OneArgument_ShellIcon__()
+  let targetfilenames = ['test.sh', 'test.fish', 'test.bash', 'test.ksh', 'test.csh', 'test.awk', 'test.ps1']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_ShellIcon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.__OneArgument_DBIcon__()
+  let targetfilenames = ['test.db', 'test.sql', 'test.dump']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_DBIcon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.__OneArgument_RustIcon__()
+  let targetfilenames = ['test.rs', 'test.rlib']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_RustIcon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.__OneArgument_DockerIcon__()
+  let targetfilenames = ['Dockerfile', 'docker-compose.yml']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_DockerIcon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.__OneArgument_JavaScriptIcon__()
+  let targetfilenames = ['test.js', 'test.mjs']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_JavaScriptIcon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.__OneArgument_ReactIcon__()
+  let targetfilenames = ['test.jsx', 'test.tsx', 'react.jsx']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_ReactIcon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.__OneArgument_JsonIcon__()
+  let targetfilenames = ['test.json', 'test.webmanifest']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_JsonIcon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.__OneArgument_GearIcon__()
+  let targetfilenames = ['.DS_Store', 'Makefile', 'test.mk', '.bashrc', '.zshrc', '.gitignore', '.gitattributes',  'cmakelists.txt', 'test.yaml', 'test.yml', 'test.toml', 'test.bat']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_GearIcon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.__OneArgument_ErlangIcon__()
+  let targetfilenames = ['test.erl', 'test.hrl']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_ErlangIcon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.__OneArgument_SwiftIcon__()
+  let targetfilenames = ['test.swift', 'test.xcplayground']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_SwiftIcon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.__OneArgument_HaskellIcon__()
+  let targetfilenames = ['test.hs', 'test.lhs']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_HaskellIcon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.__OneArgument_CppIcon__()
+  let targetfilenames = ['test.cpp', 'test.c++', 'test.cp', 'test.cxx', 'test.cc']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_C++Icon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.__OneArgument_ElixirIcon__()
+  let targetfilenames = ['test.ex', 'test.exs', 'test.eex', 'test.leex', 'test.heex']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_ElixirIcon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.__OneArgument_PerlIcon__()
+  let targetfilenames = ['test.pl', 'test.pm', 'test.t']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_PerlIcon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.__OneArgument_FSharpIcon__()
+  let targetfilenames = ['test.fs', 'test.fsx', 'test.fsi', 'test.fsscript']
+  let expecticon = ''
+  let child = themis#suite('OneArgument_FSharpIcon')
+
+  for targetfilename in targetfilenames
+    let child[targetfilename] = funcref('s:Assert', [targetfilename, expecticon])
+  endfor
+endfunction
+
+function! s:suite.OneArgument_GetTypeScriptIcon()
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol('test.ts'), '')
+endfunction
+
+function! s:suite.OneArgument_GetVueIcon()
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol('test.vue'), '﵂')
+endfunction
+
+function! s:suite.OneArgument_GetNodeModuleIcon()
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol('node_modules'), '')
+endfunction
+
+function! s:suite.OneArgument_GetDropboxIcon()
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol('Dropbox'), '')
+endfunction
+
+function! s:suite.OneArgument_GetRIcon()
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol('test.r'), 'ﳒ')
+endfunction
+
+function! s:suite.OneArgument_GetLuaIcon()
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol('test.lua'), '')
+endfunction
+
+function! s:suite.OneArgument_GetJavaIcon()
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol('test.java'), '')
+endfunction
+
+function! s:suite.OneArgument_GetCIcon()
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol('test.c'), '')
+endfunction
+
+function! s:suite.OneArgument_GetCSSIcon()
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol('test.cs'), '')
+endfunction
+
+function! s:suite.OneArgument_GetCSharpIcon()
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol('test.cs'), '')
+endfunction
+
+function! s:suite.OneArgument_GetElmIcon()
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol('test.elm'), '')
+endfunction
+
+function! s:suite.OneArgument_GetRssIcon()
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol('test.rss'), '')
+endfunction
+
+function! s:suite.OneArgument_GetDartIcon()
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol('test.dart'), '')
+endfunction
+
+function! s:suite.OneArgument_GetSolidityIcon()
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol('test.sol'), 'ﲹ')
+endfunction
+
+function! s:suite.OneArgument_GetGoIcon()
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol('test.go'), '')
+endfunction
+
+function! s:suite.OneArgument_GetPhpIcon()
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol('test.php'),'')
+endfunction
+
+function! s:suite.OneArgument_GetScalaIcon()
+  call s:assert.equals( WebDevIconsGetFileTypeSymbol('test.scala'), '')
+endfunction
+
+function! s:suite.OneArgument_GetTexIcon()
+  call s:assert.equals( WebDevIconsGetFileTypeSymbol('test.tex'), 'ﭨ')
+endfunction
+
+function! s:suite.OneArgument_GetLicenseIcon()
+  call s:assert.equals( WebDevIconsGetFileTypeSymbol('LICENSE'), '')
+endfunction
+
+function! s:suite.OneArgument_GetRobotIcon()
+  call s:assert.equals( WebDevIconsGetFileTypeSymbol('robots.txt'), 'ﮧ')
+endfunction
+
+function! s:suite.OneArgument_PemIcon()
+  call s:assert.equals( WebDevIconsGetFileTypeSymbol('test.pem'), '')
+endfunction
+
+function! s:suite.TwoArgument_zero_GetFileIcon()
+  call s:assert.equals( WebDevIconsGetFileTypeSymbol('test.vim', 0), '')
+endfunction
+
+function! s:suite.TwoArgument_one_GetFolderIcon()
+  call s:assert.equals( WebDevIconsGetFileTypeSymbol('test.vim', 1), '')
+endfunction
+
+function! s:suite.TwoArgument_two_GetDefaultIcon()
+  call s:assert.equals( WebDevIconsGetFileTypeSymbol('test.vim', 2), '')
+endfunction
+
+function! s:suite.TwoArgument_string_GetFileTypeIcon()
+  call s:assert.equals( WebDevIconsGetFileTypeSymbol('test.php', 'test.vim'), '')
+endfunction
+
+function! s:suite.NoArgument_OverWriteFileType_GetVimIcon()
+  set ft=vim
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol(), '')
+endfunction
+
+function! s:suite.NoArgument_EditVimFile_GetVimIcon()
+  edit! test.vim
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol(), '')
+endfunction
+
+function! s:suite.NoArgument_Editvimrc_GetVimIcon()
+  edit! vimrc
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol(), '')
+endfunction
+
+function! s:suite.NoArgument_EditPythonFile_GetPythonIcon()
+  edit! test.py
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol(), '')
+endfunction
+
+function! s:suite.NoArgument_EditjavaScriptFile_GetjavaScriptIcon()
+  edit! test.js
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol(), '')
+endfunction
+
+function! s:suite.NoArgument_EditRustFile_GetRustIcon()
+  edit! test.rs
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol(), '')
+endfunction
+
+function! s:suite.NoArgument_EditMKFile_GetGearIcon()
+  edit! test.mk
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol(), '')
+endfunction
+
+function! s:suite.OneArgument_EditPythonFile_GetRubyIcon()
+  edit! test.py
+  call s:assert.equals(WebDevIconsGetFileTypeSymbol('test.rb'), '')
+endfunction
diff --git a/.vim/plugin/python_autopep8.vim b/.vim/plugin/python_autopep8.vim
new file mode 100644
index 0000000..b7176e1
--- /dev/null
+++ b/.vim/plugin/python_autopep8.vim
@@ -0,0 +1,174 @@
+"=========================================================
+" File:        python_autopep8.vim
+" Author:      tell-k <ffk2005[at]gmail.com>
+" Last Change: 3-Jun-2018.
+" Version:     1.2.0
+" WebPage:     https://github.com/tell-k/vim-autopep8
+" License:     MIT Licence
+"==========================================================
+" see also README.rst
+
+" Only do this when not done yet for this buffer
+if exists("b:loaded_autopep8_ftplugin")
+    finish
+endif
+let b:loaded_autopep8_ftplugin=1
+let b:autopep8_current_cursor = [0, 1, 1, 0]
+
+if !exists("*Autopep8(...)")
+    function Autopep8(...) range
+
+        let l:args = get(a:, 1, '')
+
+        if exists("g:autopep8_cmd")
+            let autopep8_cmd=g:autopep8_cmd
+        else
+            let autopep8_cmd="autopep8"
+        endif
+
+        if !executable(autopep8_cmd)
+            echoerr "File " . autopep8_cmd . " not found. Please install it first."
+            return
+        endif
+
+        if exists("g:autopep8_ignore")
+            let autopep8_ignores=" --ignore=".g:autopep8_ignore
+        else
+            let autopep8_ignores=""
+        endif
+
+        if exists("g:autopep8_select")
+            let autopep8_selects=" --select=".g:autopep8_select
+        else
+            let autopep8_selects=""
+        endif
+
+        if exists("g:autopep8_pep8_passes")
+            let autopep8_pep8_passes=" --pep8-passes=".g:autopep8_pep8_passes
+        else
+            let autopep8_pep8_passes=""
+        endif
+
+        if exists("g:autopep8_max_line_length")
+            let autopep8_max_line_length=" --max-line-length=".g:autopep8_max_line_length
+        else
+            let autopep8_max_line_length=""
+        endif
+
+        let autopep8_range = ""
+        let current_cursor = b:autopep8_current_cursor
+        if l:args != ""
+            let autopep8_range = " ".l:args
+            let current_cursor = getpos(".")
+        elseif a:firstline == a:lastline
+            let autopep8_range = ""
+            let current_cursor = [0, a:firstline, 1, 0]
+        elseif a:firstline != 1 || a:lastline != line('$')
+            let autopep8_range = " --range ".a:firstline." ".a:lastline
+            let current_cursor = [0, a:firstline, 1, 0]
+        endif
+
+        if exists("g:autopep8_aggressive")
+            if g:autopep8_aggressive == 2
+               let autopep8_aggressive=" --aggressive --aggressive "
+            else
+               let autopep8_aggressive=" --aggressive "
+            endif
+        else
+            let autopep8_aggressive=""
+        endif
+
+        if exists("g:autopep8_indent_size")
+            let autopep8_indent_size=" --indent-size=".g:autopep8_indent_size
+        else
+            let autopep8_indent_size=""
+        endif
+
+        if exists("g:autopep8_diff_type") && g:autopep8_diff_type == "vertical"
+            let autopep8_diff_type="vertical"
+        else
+            let autopep8_diff_type="horizontal"
+        endif
+
+        let execmdline=autopep8_cmd.autopep8_pep8_passes.autopep8_selects.autopep8_ignores.autopep8_max_line_length.autopep8_aggressive.autopep8_indent_size.autopep8_range
+
+        " current cursor
+        " show diff if not explicitly disabled
+        if !exists("g:autopep8_disable_show_diff")
+            let tmpfile = tempname()
+            try
+               " write buffer contents to tmpfile because autopep8 --diff
+               " does not work with standard input
+               silent execute "0,$w! " . tmpfile
+               let diff_cmd = execmdline . " --diff \"" . tmpfile . "\""
+               let diff_output = system(diff_cmd)
+            finally
+               " file close
+               if filewritable(tmpfile)
+                 call delete(tmpfile)
+               endif
+            endtry
+        endif
+        " execute autopep8 passing buffer contents as standard input
+        silent execute "0,$!" . execmdline . " -"
+        " restore cursor
+        call setpos('.', current_cursor)
+
+        " show diff
+        if !exists("g:autopep8_disable_show_diff")
+          if autopep8_diff_type == "vertical"
+            vertical botright new autopep8
+          else
+            botright new autopep8
+          endif
+          setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap
+          silent execute ':put =diff_output'
+          setlocal nomodifiable
+          setlocal nu
+          setlocal filetype=diff
+        endif
+
+        hi Green ctermfg=green
+        echohl Green
+        echon "Fixed with autopep8 this file."
+        echohl
+
+    endfunction
+endif
+
+if !exists("no_plugin_maps") && !exists("no_autopep8_maps")
+    if !hasmapto('Autopep8(')
+        command! -range=% -nargs=? -bar Autopep8 let b:autopep8_current_cursor = getpos(".") | <line1>,<line2>call Autopep8(<f-args>)
+    endif
+endif
+
+
+" This function saves the current window state, and executes Autopep8() with
+" the user's existing options. After Autopep8 call, the initial window
+" settings are restored. Undo recording is also paused during Autopep8 call
+function! s:autopep8_on_save()
+	if get(g:, "autopep8_on_save", 0)
+
+		" Save cursor position and many other things.
+		let l:curw = winsaveview()
+
+		" stop undo recording
+		try | silent undojoin | catch | endtry
+
+		call Autopep8()
+
+		" close the fixes window automatically
+		silent execute ':q'
+
+		" Restore our cursor/windows positions.
+		call winrestview(l:curw)
+
+	endif
+endfunction
+
+" During every save, also reformat the file with respect to the existing
+" autopep8 settings.
+augroup vim-python-autopep8
+  	autocmd!
+	autocmd BufWritePre *.py call s:autopep8_on_save()
+augroup END
diff --git a/.vim/vimrc b/.vim/vimrc
index 7abab94..2f5d820 100644
--- a/.vim/vimrc
+++ b/.vim/vimrc
@@ -1,9 +1,7 @@
-" All system-wide defaults are set in $VIMRUNTIME/debian.vim and sourced by
-" the call to :runtime you can find below.  If you wish to change any of those
-" settings, you should do it in this file (/etc/vim/vimrc), since debian.vim
+" All system-wide defaults are set in $VIMRUNTIME/debian.vim and sourced by 
+" the call to :runtime you can find below.  If you wish to change any of those " settings, you should do it in this file (/etc/vim/vimrc), since debian.vim
 " will be overwritten everytime an upgrade of the vim packages is performed.
-" It is recommended to make changes after sourcing debian.vim since it alters
-" the value of the 'compatible' option.
+" It is recommended to make changes after sourcing debian.vim since it alters " the value of the 'compatible' option.
 
 " This line should not be removed as it ensures that various options are
 " properly set to work with the Vim-related packages available in Debian.
@@ -30,7 +28,7 @@ set background=dark
 
 " Uncomment the following to have Vim jump to the last position when
 " reopening a file
-"au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
+au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
 
 " Uncomment the following to have Vim load indentation rules and plugins
 " according to the detected filetype.
@@ -51,7 +49,13 @@ set number			" Enable line numbers
 set relativenumber	" Enable line numbers to be displayed relative to current position
 set tabstop=4		" Set default tab size to 4 spaces
 set autoindent		" Keep current tab depth on new line
-colorscheme slate
+
+" Colors
+let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
+let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
+" set termguicolors
+colorscheme gruvbox
+" hi Normal ctermbg=NONE cterm=NONE
 
 " Document compilation
 map <leader>c :!compile % <CR><CR> 
@@ -62,13 +66,13 @@ map <leader>s :setlocal spell! spelllang=en_us<CR>
 " Disable auto comment continuation
 autocmd filetype * set formatoptions-=cro
 
-
 " C mappings
 autocmd filetype c inoremap ;c /*  */<Left><Left><Left>
 autocmd filetype c inoremap ;p printf(" \n");<Esc>5hi
 
 " Python mappings
-autocmd filetype python noremap <C-m> i<Return><Return><Return>def main():<Return>pass<Return><Return><Return>if __name__ == '__main__':<Return>main()<Esc>gg
+" autocmd filetype python noremap <C-m> ggI#!/usr/bin/env python3<Return><Return>def main():<Return>pass<Return><Return><Return>if __name__ == '__main__':<Return>main()<Esc>ggji
+let g:autopep8_on_save = 1
 
 " Java 'IDE' remappings
 autocmd filetype java inoremap [p System.out.println();<Left><Left>
@@ -80,6 +84,21 @@ autocmd filetype nroff inoremap ;c .\"
 autocmd filetype nroff inoremap ;b \*[BOLDER]'\*[BOLDERX] <Esc>F'cl
 autocmd filetype nroff inoremap ;h .HEADING 
 
+" HTML Mappings
+autocmd filetype html inoremap ;; <Esc>/<++><Enter>"_c4l
+autocmd filetype html inoremap ;1 <h1></h1><Enter><++><Esc>FhT>i
+autocmd filetype html inoremap ;2 <h2>`</h2><Enter><++><Esc>k$F`"_cl
+autocmd filetype html inoremap ;3 <h3>`</h3><Enter><++><Esc>k$F`"_cl
+autocmd filetype html inoremap ;b <strong></strong> <++><Esc>F<F<i
+autocmd filetype html inoremap ;i <em></em> <++><Esc>F<F<i
+autocmd filetype html inoremap ;l <li></li> <++><Esc>F<F<i
+autocmd filetype html inoremap ;u <ul>`</ul><Enter><Enter><++><Esc>2k$F`"_cl
+autocmd filetype html inoremap ;p <p>`</p><Enter><Enter><++><Esc>2k$F`"_cl
+autocmd filetype html inoremap ;c <pre><code>`</code></pre><Enter><Enter><++><Esc>2k$F`"_cl
+
+" XML (for RSS)
+autocmd filetype xml inoremap ;i <item><Enter><title></title><Enter><guid></guid><Enter><link></link><Enter><pubDate></pubDate><Enter><description><![CDATA[]]></description><Enter></item><Esc>k$F[a
+
 " Restart sxhkd when config file is changed
 autocmd BufWritePost *sxhkdrc !pkill -SIGUSR1 sxhkd
 
@@ -95,10 +114,20 @@ autocmd BufWritePost ~/.config/x11/xresources !xrdb ~/.config/x11/xresources
 " Reload dunst after editing configuration file
 autocmd BufWritePost ~/.config/dunst/dunstrc !pkill dunst; setsid -f dunst
 
-"set completeopt =menuone,longest
+autocmd BufWritePost ~/.config/picom/picom.conf !pkill -SIGUSR1 picom
+
+autocmd BufWritePost ~/.local/bin/bar !pkill bar; setsid -f ~/.local/bin/bar
+
+set completeopt =menuone,longest
+
+" Start NERDTree and put the cursor back in the other window.
+autocmd VimEnter * NERDTree | wincmd p
+
+" Show hidden files in NERDTree
+let NERDTreeShowHidden=1
 
-" Source a global configuration file if available
-if filereadable("/etc/vim/vimrc.local")
-  source /etc/vim/vimrc.local
-endif
+" Exit Vim if NERDTree is the only window remaining in the only tab.
+autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif
 
+" Open the existing NERDTree on each new tab.
+autocmd BufWinEnter * if getcmdwintype() == '' | silent NERDTreeMirror | endif
-- 
cgit v1.2.3