From 301679861a2440a10c9eac746cec86459f445ef9 Mon Sep 17 00:00:00 2001
From: Zhiming Wang <zmwangx@gmail.com>
Date: Mon, 4 May 2015 14:55:10 -0700
Subject: remove all Octopress stuff

---
 .editorconfig                                      |  22 -
 .gitattributes                                     |   1 -
 .gitignore                                         |  15 -
 .powrc                                             |   5 -
 .slugignore                                        |   3 -
 .themes/classic/.editorconfig                      |  44 --
 .themes/classic/sass/_base.scss                    |   5 -
 .themes/classic/sass/_partials.scss                |   8 -
 .themes/classic/sass/base/_layout.scss             | 192 --------
 .themes/classic/sass/base/_solarized.scss          |  46 --
 .themes/classic/sass/base/_theme.scss              |  85 ----
 .themes/classic/sass/base/_typography.scss         | 164 -------
 .themes/classic/sass/base/_utilities.scss          |  28 --
 .themes/classic/sass/custom/_colors.scss           |  43 --
 .themes/classic/sass/custom/_fonts.scss            |  10 -
 .themes/classic/sass/custom/_layout.scss           |  21 -
 .themes/classic/sass/custom/_styles.scss           |   2 -
 .themes/classic/sass/partials/_archive.scss        |  72 ---
 .themes/classic/sass/partials/_blog.scss           | 141 ------
 .themes/classic/sass/partials/_footer.scss         |  19 -
 .themes/classic/sass/partials/_header.scss         |  18 -
 .themes/classic/sass/partials/_navigation.scss     | 137 ------
 .themes/classic/sass/partials/_sharing.scss        |   8 -
 .themes/classic/sass/partials/_sidebar.scss        |   4 -
 .themes/classic/sass/partials/_syntax.scss         | 261 -----------
 .themes/classic/sass/partials/sidebar/_base.scss   | 106 -----
 .../classic/sass/partials/sidebar/_delicious.scss  |   4 -
 .../classic/sass/partials/sidebar/_googleplus.scss |  26 --
 .../classic/sass/partials/sidebar/_pinboard.scss   |  12 -
 .themes/classic/sass/plugins/_plugins.scss         |   6 -
 .themes/classic/sass/screen.scss                   |  10 -
 .themes/classic/source/_includes/after_footer.html |   5 -
 .themes/classic/source/_includes/archive_post.html |   8 -
 .themes/classic/source/_includes/article.html      |  29 --
 .../classic/source/_includes/asides/delicious.html |   8 -
 .../classic/source/_includes/asides/github.html    |  30 --
 .../source/_includes/asides/googleplus.html        |  11 -
 .../classic/source/_includes/asides/pinboard.html  |  19 -
 .../source/_includes/asides/recent_posts.html      |  10 -
 .../source/_includes/custom/after_footer.html      |   3 -
 .../source/_includes/custom/asides/about.html      |   4 -
 .../source/_includes/custom/category_feed.xml      |  27 --
 .../classic/source/_includes/custom/footer.html    |   4 -
 .themes/classic/source/_includes/custom/head.html  |   3 -
 .../classic/source/_includes/custom/header.html    |   6 -
 .../source/_includes/custom/navigation.html        |   4 -
 .themes/classic/source/_includes/disqus.html       |  21 -
 .../classic/source/_includes/facebook_like.html    |  10 -
 .themes/classic/source/_includes/footer.html       |   1 -
 .../classic/source/_includes/google_analytics.html |  13 -
 .../classic/source/_includes/google_plus_one.html  |   9 -
 .themes/classic/source/_includes/head.html         |  30 --
 .themes/classic/source/_includes/header.html       |   1 -
 .themes/classic/source/_includes/navigation.html   |  15 -
 .themes/classic/source/_includes/post/author.html  |   8 -
 .../classic/source/_includes/post/categories.html  |  10 -
 .themes/classic/source/_includes/post/date.html    |   5 -
 .../source/_includes/post/disqus_thread.html       |   1 -
 .themes/classic/source/_includes/post/sharing.html |  11 -
 .../classic/source/_includes/twitter_sharing.html  |  11 -
 .../classic/source/_layouts/category_index.html    |  17 -
 .themes/classic/source/_layouts/default.html       |  14 -
 .themes/classic/source/_layouts/page.html          |  42 --
 .themes/classic/source/_layouts/post.html          |  43 --
 .../assets/jwplayer/glow/controlbar/background.png | Bin 141 -> 0 bytes
 .../jwplayer/glow/controlbar/blankButton.png       | Bin 82 -> 0 bytes
 .../assets/jwplayer/glow/controlbar/divider.png    | Bin 118 -> 0 bytes
 .../jwplayer/glow/controlbar/fullscreenButton.png  | Bin 203 -> 0 bytes
 .../glow/controlbar/fullscreenButtonOver.png       | Bin 636 -> 0 bytes
 .../assets/jwplayer/glow/controlbar/muteButton.png | Bin 343 -> 0 bytes
 .../jwplayer/glow/controlbar/muteButtonOver.png    | Bin 835 -> 0 bytes
 .../glow/controlbar/normalscreenButton.png         | Bin 210 -> 0 bytes
 .../glow/controlbar/normalscreenButtonOver.png     | Bin 664 -> 0 bytes
 .../jwplayer/glow/controlbar/pauseButton.png       | Bin 170 -> 0 bytes
 .../jwplayer/glow/controlbar/pauseButtonOver.png   | Bin 442 -> 0 bytes
 .../assets/jwplayer/glow/controlbar/playButton.png | Bin 251 -> 0 bytes
 .../jwplayer/glow/controlbar/playButtonOver.png    | Bin 553 -> 0 bytes
 .../jwplayer/glow/controlbar/timeSliderBuffer.png  | Bin 112 -> 0 bytes
 .../jwplayer/glow/controlbar/timeSliderCapLeft.png | Bin 94 -> 0 bytes
 .../glow/controlbar/timeSliderCapRight.png         | Bin 103 -> 0 bytes
 .../glow/controlbar/timeSliderProgress.png         | Bin 114 -> 0 bytes
 .../jwplayer/glow/controlbar/timeSliderRail.png    | Bin 116 -> 0 bytes
 .../jwplayer/glow/controlbar/unmuteButton.png      | Bin 264 -> 0 bytes
 .../jwplayer/glow/controlbar/unmuteButtonOver.png  | Bin 649 -> 0 bytes
 .../assets/jwplayer/glow/display/background.png    | Bin 686 -> 0 bytes
 .../assets/jwplayer/glow/display/bufferIcon.png    | Bin 816 -> 0 bytes
 .../assets/jwplayer/glow/display/muteIcon.png      | Bin 334 -> 0 bytes
 .../assets/jwplayer/glow/display/playIcon.png      | Bin 465 -> 0 bytes
 .../source/assets/jwplayer/glow/dock/button.png    | Bin 686 -> 0 bytes
 .../classic/source/assets/jwplayer/glow/glow.xml   | 115 -----
 .../source/assets/jwplayer/glow/playlist/item.png  | Bin 172 -> 0 bytes
 .../assets/jwplayer/glow/playlist/itemOver.png     | Bin 171 -> 0 bytes
 .../jwplayer/glow/playlist/sliderCapBottom.png     | Bin 108 -> 0 bytes
 .../assets/jwplayer/glow/playlist/sliderCapTop.png | Bin 105 -> 0 bytes
 .../assets/jwplayer/glow/playlist/sliderRail.png   | Bin 100 -> 0 bytes
 .../assets/jwplayer/glow/playlist/sliderThumb.png  | Bin 97 -> 0 bytes
 .../assets/jwplayer/glow/sharing/embedIcon.png     | Bin 749 -> 0 bytes
 .../assets/jwplayer/glow/sharing/embedScreen.png   | Bin 2579 -> 0 bytes
 .../assets/jwplayer/glow/sharing/shareIcon.png     | Bin 589 -> 0 bytes
 .../assets/jwplayer/glow/sharing/shareScreen.png   | Bin 4576 -> 0 bytes
 .themes/classic/source/assets/jwplayer/player.swf  | Bin 91375 -> 0 bytes
 .themes/classic/source/atom.xml                    |  27 --
 .themes/classic/source/blog/archives/index.html    |  18 -
 .themes/classic/source/favicon.png                 | Bin 400 -> 0 bytes
 .themes/classic/source/images/bird_32_gray.png     | Bin 1376 -> 0 bytes
 .../classic/source/images/bird_32_gray_fail.png    | Bin 615 -> 0 bytes
 .themes/classic/source/images/code_bg.png          | Bin 239 -> 0 bytes
 .themes/classic/source/images/dotted-border.png    | Bin 99 -> 0 bytes
 .themes/classic/source/images/email.png            | Bin 301 -> 0 bytes
 .themes/classic/source/images/line-tile.png        | Bin 636 -> 0 bytes
 .themes/classic/source/images/noise.png            | Bin 17742 -> 0 bytes
 .themes/classic/source/images/rss.png              | Bin 490 -> 0 bytes
 .themes/classic/source/images/search.png           | Bin 333 -> 0 bytes
 .themes/classic/source/index.html                  |  29 --
 .themes/classic/source/javascripts/github.js       |  32 --
 .themes/classic/source/javascripts/libs/jXHR.js    |  85 ----
 .../classic/source/javascripts/libs/jquery.min.js  |   5 -
 .../source/javascripts/libs/swfobject-dynamic.js   | 298 -------------
 .../classic/source/javascripts/modernizr-2.0.js    |   5 -
 .themes/classic/source/javascripts/octopress.js    | 151 -------
 .themes/classic/source/javascripts/pinboard.js     |  56 ---
 .themes/classic/source/javascripts/twitter.js      |  78 ----
 .themes/classic/source/robots.txt                  |   7 -
 .travis.yml                                        |   5 -
 CHANGELOG.markdown                                 |  29 --
 Gemfile                                            |  19 -
 README.markdown                                    |  41 --
 Rakefile                                           | 404 -----------------
 _config.yml                                        | 101 -----
 config.rb                                          |  19 -
 config.ru                                          |  25 --
 plugins/backtick_code_block.rb                     |  42 --
 plugins/blockquote.rb                              |  82 ----
 plugins/category_generator.rb                      | 193 --------
 plugins/code_block.rb                              |  92 ----
 plugins/config_tag.rb                              |  44 --
 plugins/gist_tag.rb                                | 130 ------
 plugins/haml.rb                                    |  24 -
 plugins/image_tag.rb                               |  50 ---
 plugins/include_array.rb                           |  58 ---
 plugins/include_code.rb                            |  71 ---
 plugins/jsfiddle.rb                                |  40 --
 plugins/octopress_filters.rb                       | 142 ------
 plugins/pullquote.rb                               |  45 --
 plugins/pygments_code.rb                           |  45 --
 plugins/raw.rb                                     |  40 --
 plugins/render_partial.rb                          |  69 ---
 plugins/rubypants.rb                               | 489 ---------------------
 plugins/titlecase.rb                               |  36 --
 plugins/video_tag.rb                               |  56 ---
 sass/_base.scss                                    |   5 -
 sass/_partials.scss                                |   8 -
 sass/base/_layout.scss                             | 192 --------
 sass/base/_solarized.scss                          |  46 --
 sass/base/_theme.scss                              |  85 ----
 sass/base/_typography.scss                         | 164 -------
 sass/base/_utilities.scss                          |  28 --
 sass/custom/_colors.scss                           |  43 --
 sass/custom/_fonts.scss                            |  10 -
 sass/custom/_layout.scss                           |  21 -
 sass/custom/_styles.scss                           |  10 -
 sass/partials/_archive.scss                        |  72 ---
 sass/partials/_blog.scss                           | 141 ------
 sass/partials/_footer.scss                         |  19 -
 sass/partials/_header.scss                         |  18 -
 sass/partials/_navigation.scss                     | 137 ------
 sass/partials/_sharing.scss                        |   8 -
 sass/partials/_sidebar.scss                        |   4 -
 sass/partials/_syntax.scss                         | 261 -----------
 sass/partials/sidebar/_base.scss                   | 106 -----
 sass/partials/sidebar/_delicious.scss              |   4 -
 sass/partials/sidebar/_googleplus.scss             |  26 --
 sass/partials/sidebar/_pinboard.scss               |  12 -
 sass/plugins/_plugins.scss                         |   6 -
 sass/screen.scss                                   |  10 -
 source/_includes/after_footer.html                 |   5 -
 source/_includes/archive_post.html                 |   8 -
 source/_includes/article.html                      |  29 --
 source/_includes/asides/delicious.html             |   8 -
 source/_includes/asides/github.html                |  30 --
 source/_includes/asides/googleplus.html            |  11 -
 source/_includes/asides/pinboard.html              |  19 -
 source/_includes/asides/recent_posts.html          |  10 -
 source/_includes/custom/after_footer.html          |   3 -
 source/_includes/custom/asides/about.html          |   4 -
 source/_includes/custom/category_feed.xml          |  27 --
 source/_includes/custom/footer.html                |   4 -
 source/_includes/custom/head.html                  |   3 -
 source/_includes/custom/header.html                |   6 -
 source/_includes/custom/navigation.html            |   4 -
 source/_includes/disqus.html                       |  21 -
 source/_includes/facebook_like.html                |  10 -
 source/_includes/footer.html                       |   1 -
 source/_includes/google_analytics.html             |  13 -
 source/_includes/google_plus_one.html              |   9 -
 source/_includes/head.html                         |  30 --
 source/_includes/header.html                       |   1 -
 source/_includes/navigation.html                   |  15 -
 source/_includes/post/author.html                  |   8 -
 source/_includes/post/categories.html              |  10 -
 source/_includes/post/date.html                    |   5 -
 source/_includes/post/disqus_thread.html           |   1 -
 source/_includes/post/sharing.html                 |  11 -
 source/_includes/twitter_sharing.html              |  11 -
 source/_layouts/category_index.html                |  17 -
 source/_layouts/default.html                       |  14 -
 source/_layouts/page.html                          |  42 --
 source/_layouts/post.html                          |  43 --
 source/_posts/2014-10-20-hello-octopress.md        |  35 --
 source/_posts/2014-10-20-help-mou-hit-1-dot-0.md   |  13 -
 source/_posts/2014-10-21-get-rolling.md            |  35 --
 ...14-10-23-ripping-copy-protected-dvd-with-mpv.md |  38 --
 ...14-10-24-charles-munger-donated-$65m-to-kitp.md |  23 -
 source/_posts/2014-10-25-os-x-package-receipts.md  |  20 -
 ...0-26-audio-cd-slash-dvd-to-iso-image-on-os-x.md |  30 --
 .../_posts/2014-10-26-disk-visualizer-daisydisk.md |  18 -
 .../_posts/2014-10-27-onedrive-goes-unlimited.md   |  23 -
 ...-28-google-drive-no-selective-subfolder-sync.md |  54 ---
 ...14-10-28-mou-1-dot-0-fundraiser-goal-reached.md |  17 -
 source/_posts/2014-10-29-fun.md                    |  15 -
 source/_posts/2014-11-02-vobcopy-dvdbackup-etc.md  |  90 ----
 .../2014-11-05-apple-is-pushing-yosemite-hard.md   |  32 --
 ...-11-05-list-youtube-playlist-with-youtube-dl.md |  71 ---
 ...-nobel-prize-in-physics-led-lights-seriously.md |  19 -
 source/_posts/2014-11-07-interstellar.md           |  16 -
 ...osts-ten-time-as-much-as-that-in-the-u-dot-k.md |  12 -
 ...-11-re-encoding-everything-for-iphone-6-plus.md |   8 -
 ...-11-19-convolution-of-irreducible-characters.md |  16 -
 source/_posts/2014-11-20-dropbot-for-geeks(r).md   |  26 --
 .../2014-11-24-iphone-photography-frustration.md   |  32 --
 ...why-i-abandoned-mathjax-and-fell-back-to-pdf.md |  12 -
 source/_posts/2014-11-25-i-got-16-gigs-of-ram.md   |  20 -
 ...014-11-26-original-images-in-day-one-journal.md |  42 --
 source/_posts/2014-11-28-given-infinite-time.md    |   8 -
 source/_posts/2014-11-28-going-diceware.md         |  12 -
 ...-style-advanced-keyboard-shortcuts-in-safari.md |  45 --
 .../_posts/2014-12-05-distraction-free-writing.md  |  34 --
 source/_posts/2014-12-05-python-3-and-unicode.md   |   8 -
 ...0-omnifocus-change-sync-behavior-mac-and-ios.md |  20 -
 source/_posts/2014-12-13-the-mac-like-evernote.md  |  16 -
 ...014-12-14-speeding-up-emacs-with-emacsclient.md |  36 --
 ...2014-12-14-the-google-chrome-comic-a-classic.md |  21 -
 .../_posts/2014-12-19-app-suggestion-dropzone-3.md |  12 -
 source/_posts/2014-12-22-10k-images-on-imgur.md    |   8 -
 source/_posts/2014-12-23-mpv-launcher.md           |  26 --
 ...15-01-01-os-x-system-ruby-encoding-annoyance.md |  43 --
 ...5-01-10-fonts-why-chinese-web-design-is-hard.md |  16 -
 .../2015-01-21-web-design-microsoft-vs-apple.md    |  19 -
 ...-monitor-progress-of-your-unix-pipes-with-pv.md |  60 ---
 ...icrosoft-is-getting-cool-but-not-its-website.md |  20 -
 .../2015-02-20-my-dock-and-updated-omnifocus.md    |  21 -
 source/_posts/2015-02-21-all-is-not-lost.md        |  20 -
 source/_posts/2015-02-24-the-new-onedrive-api.md   |  10 -
 source/_posts/2015-03-22-back-up-os-x-app-icons.md |  46 --
 .../2015-04-26-using-python-3-with-emacs-jedi.md   |  31 --
 ...015-05-03-why-oh-my-zsh-is-completely-broken.md | 150 -------
 .../assets/jwplayer/glow/controlbar/background.png | Bin 141 -> 0 bytes
 .../jwplayer/glow/controlbar/blankButton.png       | Bin 82 -> 0 bytes
 source/assets/jwplayer/glow/controlbar/divider.png | Bin 118 -> 0 bytes
 .../jwplayer/glow/controlbar/fullscreenButton.png  | Bin 203 -> 0 bytes
 .../glow/controlbar/fullscreenButtonOver.png       | Bin 636 -> 0 bytes
 .../assets/jwplayer/glow/controlbar/muteButton.png | Bin 343 -> 0 bytes
 .../jwplayer/glow/controlbar/muteButtonOver.png    | Bin 835 -> 0 bytes
 .../glow/controlbar/normalscreenButton.png         | Bin 210 -> 0 bytes
 .../glow/controlbar/normalscreenButtonOver.png     | Bin 664 -> 0 bytes
 .../jwplayer/glow/controlbar/pauseButton.png       | Bin 170 -> 0 bytes
 .../jwplayer/glow/controlbar/pauseButtonOver.png   | Bin 442 -> 0 bytes
 .../assets/jwplayer/glow/controlbar/playButton.png | Bin 251 -> 0 bytes
 .../jwplayer/glow/controlbar/playButtonOver.png    | Bin 553 -> 0 bytes
 .../jwplayer/glow/controlbar/timeSliderBuffer.png  | Bin 112 -> 0 bytes
 .../jwplayer/glow/controlbar/timeSliderCapLeft.png | Bin 94 -> 0 bytes
 .../glow/controlbar/timeSliderCapRight.png         | Bin 103 -> 0 bytes
 .../glow/controlbar/timeSliderProgress.png         | Bin 114 -> 0 bytes
 .../jwplayer/glow/controlbar/timeSliderRail.png    | Bin 116 -> 0 bytes
 .../jwplayer/glow/controlbar/unmuteButton.png      | Bin 264 -> 0 bytes
 .../jwplayer/glow/controlbar/unmuteButtonOver.png  | Bin 649 -> 0 bytes
 source/assets/jwplayer/glow/display/background.png | Bin 686 -> 0 bytes
 source/assets/jwplayer/glow/display/bufferIcon.png | Bin 816 -> 0 bytes
 source/assets/jwplayer/glow/display/muteIcon.png   | Bin 334 -> 0 bytes
 source/assets/jwplayer/glow/display/playIcon.png   | Bin 465 -> 0 bytes
 source/assets/jwplayer/glow/dock/button.png        | Bin 686 -> 0 bytes
 source/assets/jwplayer/glow/glow.xml               | 115 -----
 source/assets/jwplayer/glow/playlist/item.png      | Bin 172 -> 0 bytes
 source/assets/jwplayer/glow/playlist/itemOver.png  | Bin 171 -> 0 bytes
 .../jwplayer/glow/playlist/sliderCapBottom.png     | Bin 108 -> 0 bytes
 .../assets/jwplayer/glow/playlist/sliderCapTop.png | Bin 105 -> 0 bytes
 .../assets/jwplayer/glow/playlist/sliderRail.png   | Bin 100 -> 0 bytes
 .../assets/jwplayer/glow/playlist/sliderThumb.png  | Bin 97 -> 0 bytes
 source/assets/jwplayer/glow/sharing/embedIcon.png  | Bin 749 -> 0 bytes
 .../assets/jwplayer/glow/sharing/embedScreen.png   | Bin 2579 -> 0 bytes
 source/assets/jwplayer/glow/sharing/shareIcon.png  | Bin 589 -> 0 bytes
 .../assets/jwplayer/glow/sharing/shareScreen.png   | Bin 4576 -> 0 bytes
 source/assets/jwplayer/player.swf                  | Bin 91375 -> 0 bytes
 source/atom.xml                                    |  27 --
 source/blog/2014-10-20-hello-octopress.md          |  35 ++
 source/blog/2014-10-20-help-mou-hit-1-dot-0.md     |  13 +
 source/blog/2014-10-21-get-rolling.md              |  35 ++
 ...14-10-23-ripping-copy-protected-dvd-with-mpv.md |  38 ++
 ...14-10-24-charles-munger-donated-$65m-to-kitp.md |  23 +
 source/blog/2014-10-25-os-x-package-receipts.md    |  20 +
 ...0-26-audio-cd-slash-dvd-to-iso-image-on-os-x.md |  30 ++
 .../blog/2014-10-26-disk-visualizer-daisydisk.md   |  18 +
 source/blog/2014-10-27-onedrive-goes-unlimited.md  |  23 +
 ...-28-google-drive-no-selective-subfolder-sync.md |  54 +++
 ...14-10-28-mou-1-dot-0-fundraiser-goal-reached.md |  17 +
 source/blog/2014-10-29-fun.md                      |  15 +
 source/blog/2014-11-02-vobcopy-dvdbackup-etc.md    |  90 ++++
 .../2014-11-05-apple-is-pushing-yosemite-hard.md   |  32 ++
 ...-11-05-list-youtube-playlist-with-youtube-dl.md |  71 +++
 ...-nobel-prize-in-physics-led-lights-seriously.md |  19 +
 source/blog/2014-11-07-interstellar.md             |  16 +
 ...osts-ten-time-as-much-as-that-in-the-u-dot-k.md |  12 +
 ...-11-re-encoding-everything-for-iphone-6-plus.md |   8 +
 ...-11-19-convolution-of-irreducible-characters.md |  16 +
 source/blog/2014-11-20-dropbot-for-geeks(r).md     |  26 ++
 .../2014-11-24-iphone-photography-frustration.md   |  32 ++
 ...why-i-abandoned-mathjax-and-fell-back-to-pdf.md |  12 +
 source/blog/2014-11-25-i-got-16-gigs-of-ram.md     |  20 +
 ...014-11-26-original-images-in-day-one-journal.md |  42 ++
 source/blog/2014-11-28-given-infinite-time.md      |   8 +
 source/blog/2014-11-28-going-diceware.md           |  12 +
 ...-style-advanced-keyboard-shortcuts-in-safari.md |  45 ++
 source/blog/2014-12-05-distraction-free-writing.md |  34 ++
 source/blog/2014-12-05-python-3-and-unicode.md     |   8 +
 ...0-omnifocus-change-sync-behavior-mac-and-ios.md |  20 +
 source/blog/2014-12-13-the-mac-like-evernote.md    |  16 +
 ...014-12-14-speeding-up-emacs-with-emacsclient.md |  36 ++
 ...2014-12-14-the-google-chrome-comic-a-classic.md |  21 +
 .../blog/2014-12-19-app-suggestion-dropzone-3.md   |  12 +
 source/blog/2014-12-22-10k-images-on-imgur.md      |   8 +
 source/blog/2014-12-23-mpv-launcher.md             |  26 ++
 ...15-01-01-os-x-system-ruby-encoding-annoyance.md |  43 ++
 ...5-01-10-fonts-why-chinese-web-design-is-hard.md |  16 +
 .../2015-01-21-web-design-microsoft-vs-apple.md    |  19 +
 ...-monitor-progress-of-your-unix-pipes-with-pv.md |  60 +++
 ...icrosoft-is-getting-cool-but-not-its-website.md |  20 +
 .../2015-02-20-my-dock-and-updated-omnifocus.md    |  21 +
 source/blog/2015-02-21-all-is-not-lost.md          |  20 +
 source/blog/2015-02-24-the-new-onedrive-api.md     |  10 +
 source/blog/2015-03-22-back-up-os-x-app-icons.md   |  46 ++
 .../2015-04-26-using-python-3-with-emacs-jedi.md   |  31 ++
 ...015-05-03-why-oh-my-zsh-is-completely-broken.md | 150 +++++++
 source/blog/archives/index.html                    |  18 -
 source/favicon.png                                 | Bin 12532 -> 0 bytes
 source/images/bird_32_gray.png                     | Bin 1376 -> 0 bytes
 source/images/bird_32_gray_fail.png                | Bin 615 -> 0 bytes
 source/images/code_bg.png                          | Bin 239 -> 0 bytes
 source/images/dotted-border.png                    | Bin 99 -> 0 bytes
 source/images/email.png                            | Bin 301 -> 0 bytes
 source/images/line-tile.png                        | Bin 636 -> 0 bytes
 source/images/noise.png                            | Bin 17742 -> 0 bytes
 source/images/rss.png                              | Bin 490 -> 0 bytes
 source/images/search.png                           | Bin 333 -> 0 bytes
 source/index.html                                  |  29 --
 source/javascripts/github.js                       |  32 --
 source/javascripts/libs/jXHR.js                    |  85 ----
 source/javascripts/libs/jquery.min.js              |   5 -
 source/javascripts/libs/swfobject-dynamic.js       | 298 -------------
 source/javascripts/modernizr-2.0.js                |   5 -
 source/javascripts/octopress.js                    | 151 -------
 source/javascripts/pinboard.js                     |  56 ---
 source/javascripts/twitter.js                      |  78 ----
 362 files changed, 1399 insertions(+), 9415 deletions(-)
 delete mode 100644 .editorconfig
 delete mode 100644 .gitattributes
 delete mode 100644 .gitignore
 delete mode 100644 .powrc
 delete mode 100644 .slugignore
 delete mode 100644 .themes/classic/.editorconfig
 delete mode 100644 .themes/classic/sass/_base.scss
 delete mode 100644 .themes/classic/sass/_partials.scss
 delete mode 100644 .themes/classic/sass/base/_layout.scss
 delete mode 100644 .themes/classic/sass/base/_solarized.scss
 delete mode 100644 .themes/classic/sass/base/_theme.scss
 delete mode 100644 .themes/classic/sass/base/_typography.scss
 delete mode 100644 .themes/classic/sass/base/_utilities.scss
 delete mode 100644 .themes/classic/sass/custom/_colors.scss
 delete mode 100644 .themes/classic/sass/custom/_fonts.scss
 delete mode 100644 .themes/classic/sass/custom/_layout.scss
 delete mode 100644 .themes/classic/sass/custom/_styles.scss
 delete mode 100644 .themes/classic/sass/partials/_archive.scss
 delete mode 100644 .themes/classic/sass/partials/_blog.scss
 delete mode 100644 .themes/classic/sass/partials/_footer.scss
 delete mode 100644 .themes/classic/sass/partials/_header.scss
 delete mode 100644 .themes/classic/sass/partials/_navigation.scss
 delete mode 100644 .themes/classic/sass/partials/_sharing.scss
 delete mode 100644 .themes/classic/sass/partials/_sidebar.scss
 delete mode 100644 .themes/classic/sass/partials/_syntax.scss
 delete mode 100644 .themes/classic/sass/partials/sidebar/_base.scss
 delete mode 100644 .themes/classic/sass/partials/sidebar/_delicious.scss
 delete mode 100644 .themes/classic/sass/partials/sidebar/_googleplus.scss
 delete mode 100644 .themes/classic/sass/partials/sidebar/_pinboard.scss
 delete mode 100644 .themes/classic/sass/plugins/_plugins.scss
 delete mode 100644 .themes/classic/sass/screen.scss
 delete mode 100644 .themes/classic/source/_includes/after_footer.html
 delete mode 100644 .themes/classic/source/_includes/archive_post.html
 delete mode 100644 .themes/classic/source/_includes/article.html
 delete mode 100644 .themes/classic/source/_includes/asides/delicious.html
 delete mode 100644 .themes/classic/source/_includes/asides/github.html
 delete mode 100644 .themes/classic/source/_includes/asides/googleplus.html
 delete mode 100644 .themes/classic/source/_includes/asides/pinboard.html
 delete mode 100644 .themes/classic/source/_includes/asides/recent_posts.html
 delete mode 100644 .themes/classic/source/_includes/custom/after_footer.html
 delete mode 100644 .themes/classic/source/_includes/custom/asides/about.html
 delete mode 100644 .themes/classic/source/_includes/custom/category_feed.xml
 delete mode 100644 .themes/classic/source/_includes/custom/footer.html
 delete mode 100644 .themes/classic/source/_includes/custom/head.html
 delete mode 100644 .themes/classic/source/_includes/custom/header.html
 delete mode 100644 .themes/classic/source/_includes/custom/navigation.html
 delete mode 100644 .themes/classic/source/_includes/disqus.html
 delete mode 100644 .themes/classic/source/_includes/facebook_like.html
 delete mode 100644 .themes/classic/source/_includes/footer.html
 delete mode 100644 .themes/classic/source/_includes/google_analytics.html
 delete mode 100644 .themes/classic/source/_includes/google_plus_one.html
 delete mode 100644 .themes/classic/source/_includes/head.html
 delete mode 100644 .themes/classic/source/_includes/header.html
 delete mode 100644 .themes/classic/source/_includes/navigation.html
 delete mode 100644 .themes/classic/source/_includes/post/author.html
 delete mode 100644 .themes/classic/source/_includes/post/categories.html
 delete mode 100644 .themes/classic/source/_includes/post/date.html
 delete mode 100644 .themes/classic/source/_includes/post/disqus_thread.html
 delete mode 100644 .themes/classic/source/_includes/post/sharing.html
 delete mode 100644 .themes/classic/source/_includes/twitter_sharing.html
 delete mode 100644 .themes/classic/source/_layouts/category_index.html
 delete mode 100644 .themes/classic/source/_layouts/default.html
 delete mode 100644 .themes/classic/source/_layouts/page.html
 delete mode 100644 .themes/classic/source/_layouts/post.html
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/background.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/blankButton.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/divider.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/fullscreenButton.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/fullscreenButtonOver.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/muteButton.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/muteButtonOver.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/normalscreenButton.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/normalscreenButtonOver.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/pauseButton.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/pauseButtonOver.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/playButton.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/playButtonOver.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderBuffer.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderCapLeft.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderCapRight.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderProgress.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderRail.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/unmuteButton.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/controlbar/unmuteButtonOver.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/display/background.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/display/bufferIcon.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/display/muteIcon.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/display/playIcon.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/dock/button.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/glow.xml
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/playlist/item.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/playlist/itemOver.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/playlist/sliderCapBottom.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/playlist/sliderCapTop.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/playlist/sliderRail.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/playlist/sliderThumb.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/sharing/embedIcon.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/sharing/embedScreen.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/sharing/shareIcon.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/glow/sharing/shareScreen.png
 delete mode 100644 .themes/classic/source/assets/jwplayer/player.swf
 delete mode 100644 .themes/classic/source/atom.xml
 delete mode 100644 .themes/classic/source/blog/archives/index.html
 delete mode 100644 .themes/classic/source/favicon.png
 delete mode 100644 .themes/classic/source/images/bird_32_gray.png
 delete mode 100644 .themes/classic/source/images/bird_32_gray_fail.png
 delete mode 100644 .themes/classic/source/images/code_bg.png
 delete mode 100644 .themes/classic/source/images/dotted-border.png
 delete mode 100644 .themes/classic/source/images/email.png
 delete mode 100644 .themes/classic/source/images/line-tile.png
 delete mode 100644 .themes/classic/source/images/noise.png
 delete mode 100644 .themes/classic/source/images/rss.png
 delete mode 100644 .themes/classic/source/images/search.png
 delete mode 100644 .themes/classic/source/index.html
 delete mode 100644 .themes/classic/source/javascripts/github.js
 delete mode 100644 .themes/classic/source/javascripts/libs/jXHR.js
 delete mode 100644 .themes/classic/source/javascripts/libs/jquery.min.js
 delete mode 100644 .themes/classic/source/javascripts/libs/swfobject-dynamic.js
 delete mode 100644 .themes/classic/source/javascripts/modernizr-2.0.js
 delete mode 100644 .themes/classic/source/javascripts/octopress.js
 delete mode 100644 .themes/classic/source/javascripts/pinboard.js
 delete mode 100644 .themes/classic/source/javascripts/twitter.js
 delete mode 100644 .themes/classic/source/robots.txt
 delete mode 100644 .travis.yml
 delete mode 100644 CHANGELOG.markdown
 delete mode 100644 Gemfile
 delete mode 100644 README.markdown
 delete mode 100644 Rakefile
 delete mode 100644 _config.yml
 delete mode 100644 config.rb
 delete mode 100644 config.ru
 delete mode 100644 plugins/backtick_code_block.rb
 delete mode 100644 plugins/blockquote.rb
 delete mode 100644 plugins/category_generator.rb
 delete mode 100644 plugins/code_block.rb
 delete mode 100644 plugins/config_tag.rb
 delete mode 100644 plugins/gist_tag.rb
 delete mode 100644 plugins/haml.rb
 delete mode 100644 plugins/image_tag.rb
 delete mode 100644 plugins/include_array.rb
 delete mode 100644 plugins/include_code.rb
 delete mode 100644 plugins/jsfiddle.rb
 delete mode 100644 plugins/octopress_filters.rb
 delete mode 100644 plugins/pullquote.rb
 delete mode 100644 plugins/pygments_code.rb
 delete mode 100644 plugins/raw.rb
 delete mode 100644 plugins/render_partial.rb
 delete mode 100644 plugins/rubypants.rb
 delete mode 100644 plugins/titlecase.rb
 delete mode 100644 plugins/video_tag.rb
 delete mode 100644 sass/_base.scss
 delete mode 100644 sass/_partials.scss
 delete mode 100644 sass/base/_layout.scss
 delete mode 100644 sass/base/_solarized.scss
 delete mode 100644 sass/base/_theme.scss
 delete mode 100644 sass/base/_typography.scss
 delete mode 100644 sass/base/_utilities.scss
 delete mode 100644 sass/custom/_colors.scss
 delete mode 100644 sass/custom/_fonts.scss
 delete mode 100644 sass/custom/_layout.scss
 delete mode 100644 sass/custom/_styles.scss
 delete mode 100644 sass/partials/_archive.scss
 delete mode 100644 sass/partials/_blog.scss
 delete mode 100644 sass/partials/_footer.scss
 delete mode 100644 sass/partials/_header.scss
 delete mode 100644 sass/partials/_navigation.scss
 delete mode 100644 sass/partials/_sharing.scss
 delete mode 100644 sass/partials/_sidebar.scss
 delete mode 100644 sass/partials/_syntax.scss
 delete mode 100644 sass/partials/sidebar/_base.scss
 delete mode 100644 sass/partials/sidebar/_delicious.scss
 delete mode 100644 sass/partials/sidebar/_googleplus.scss
 delete mode 100644 sass/partials/sidebar/_pinboard.scss
 delete mode 100644 sass/plugins/_plugins.scss
 delete mode 100644 sass/screen.scss
 delete mode 100644 source/_includes/after_footer.html
 delete mode 100644 source/_includes/archive_post.html
 delete mode 100644 source/_includes/article.html
 delete mode 100644 source/_includes/asides/delicious.html
 delete mode 100644 source/_includes/asides/github.html
 delete mode 100644 source/_includes/asides/googleplus.html
 delete mode 100644 source/_includes/asides/pinboard.html
 delete mode 100644 source/_includes/asides/recent_posts.html
 delete mode 100644 source/_includes/custom/after_footer.html
 delete mode 100644 source/_includes/custom/asides/about.html
 delete mode 100644 source/_includes/custom/category_feed.xml
 delete mode 100644 source/_includes/custom/footer.html
 delete mode 100644 source/_includes/custom/head.html
 delete mode 100644 source/_includes/custom/header.html
 delete mode 100644 source/_includes/custom/navigation.html
 delete mode 100644 source/_includes/disqus.html
 delete mode 100644 source/_includes/facebook_like.html
 delete mode 100644 source/_includes/footer.html
 delete mode 100644 source/_includes/google_analytics.html
 delete mode 100644 source/_includes/google_plus_one.html
 delete mode 100644 source/_includes/head.html
 delete mode 100644 source/_includes/header.html
 delete mode 100644 source/_includes/navigation.html
 delete mode 100644 source/_includes/post/author.html
 delete mode 100644 source/_includes/post/categories.html
 delete mode 100644 source/_includes/post/date.html
 delete mode 100644 source/_includes/post/disqus_thread.html
 delete mode 100644 source/_includes/post/sharing.html
 delete mode 100644 source/_includes/twitter_sharing.html
 delete mode 100644 source/_layouts/category_index.html
 delete mode 100644 source/_layouts/default.html
 delete mode 100644 source/_layouts/page.html
 delete mode 100644 source/_layouts/post.html
 delete mode 100644 source/_posts/2014-10-20-hello-octopress.md
 delete mode 100644 source/_posts/2014-10-20-help-mou-hit-1-dot-0.md
 delete mode 100644 source/_posts/2014-10-21-get-rolling.md
 delete mode 100644 source/_posts/2014-10-23-ripping-copy-protected-dvd-with-mpv.md
 delete mode 100644 source/_posts/2014-10-24-charles-munger-donated-$65m-to-kitp.md
 delete mode 100644 source/_posts/2014-10-25-os-x-package-receipts.md
 delete mode 100644 source/_posts/2014-10-26-audio-cd-slash-dvd-to-iso-image-on-os-x.md
 delete mode 100644 source/_posts/2014-10-26-disk-visualizer-daisydisk.md
 delete mode 100644 source/_posts/2014-10-27-onedrive-goes-unlimited.md
 delete mode 100644 source/_posts/2014-10-28-google-drive-no-selective-subfolder-sync.md
 delete mode 100644 source/_posts/2014-10-28-mou-1-dot-0-fundraiser-goal-reached.md
 delete mode 100644 source/_posts/2014-10-29-fun.md
 delete mode 100644 source/_posts/2014-11-02-vobcopy-dvdbackup-etc.md
 delete mode 100644 source/_posts/2014-11-05-apple-is-pushing-yosemite-hard.md
 delete mode 100644 source/_posts/2014-11-05-list-youtube-playlist-with-youtube-dl.md
 delete mode 100644 source/_posts/2014-11-06-2014-nobel-prize-in-physics-led-lights-seriously.md
 delete mode 100644 source/_posts/2014-11-07-interstellar.md
 delete mode 100644 source/_posts/2014-11-10-average-phone-plan-in-the-u-dot-s-costs-ten-time-as-much-as-that-in-the-u-dot-k.md
 delete mode 100644 source/_posts/2014-11-11-re-encoding-everything-for-iphone-6-plus.md
 delete mode 100644 source/_posts/2014-11-19-convolution-of-irreducible-characters.md
 delete mode 100644 source/_posts/2014-11-20-dropbot-for-geeks(r).md
 delete mode 100644 source/_posts/2014-11-24-iphone-photography-frustration.md
 delete mode 100644 source/_posts/2014-11-24-why-i-abandoned-mathjax-and-fell-back-to-pdf.md
 delete mode 100644 source/_posts/2014-11-25-i-got-16-gigs-of-ram.md
 delete mode 100644 source/_posts/2014-11-26-original-images-in-day-one-journal.md
 delete mode 100644 source/_posts/2014-11-28-given-infinite-time.md
 delete mode 100644 source/_posts/2014-11-28-going-diceware.md
 delete mode 100644 source/_posts/2014-11-30-opera-style-advanced-keyboard-shortcuts-in-safari.md
 delete mode 100644 source/_posts/2014-12-05-distraction-free-writing.md
 delete mode 100644 source/_posts/2014-12-05-python-3-and-unicode.md
 delete mode 100644 source/_posts/2014-12-10-omnifocus-change-sync-behavior-mac-and-ios.md
 delete mode 100644 source/_posts/2014-12-13-the-mac-like-evernote.md
 delete mode 100644 source/_posts/2014-12-14-speeding-up-emacs-with-emacsclient.md
 delete mode 100644 source/_posts/2014-12-14-the-google-chrome-comic-a-classic.md
 delete mode 100644 source/_posts/2014-12-19-app-suggestion-dropzone-3.md
 delete mode 100644 source/_posts/2014-12-22-10k-images-on-imgur.md
 delete mode 100644 source/_posts/2014-12-23-mpv-launcher.md
 delete mode 100644 source/_posts/2015-01-01-os-x-system-ruby-encoding-annoyance.md
 delete mode 100644 source/_posts/2015-01-10-fonts-why-chinese-web-design-is-hard.md
 delete mode 100644 source/_posts/2015-01-21-web-design-microsoft-vs-apple.md
 delete mode 100644 source/_posts/2015-02-10-monitor-progress-of-your-unix-pipes-with-pv.md
 delete mode 100644 source/_posts/2015-02-17-microsoft-is-getting-cool-but-not-its-website.md
 delete mode 100644 source/_posts/2015-02-20-my-dock-and-updated-omnifocus.md
 delete mode 100644 source/_posts/2015-02-21-all-is-not-lost.md
 delete mode 100644 source/_posts/2015-02-24-the-new-onedrive-api.md
 delete mode 100644 source/_posts/2015-03-22-back-up-os-x-app-icons.md
 delete mode 100644 source/_posts/2015-04-26-using-python-3-with-emacs-jedi.md
 delete mode 100644 source/_posts/2015-05-03-why-oh-my-zsh-is-completely-broken.md
 delete mode 100644 source/assets/jwplayer/glow/controlbar/background.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/blankButton.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/divider.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/fullscreenButton.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/fullscreenButtonOver.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/muteButton.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/muteButtonOver.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/normalscreenButton.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/normalscreenButtonOver.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/pauseButton.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/pauseButtonOver.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/playButton.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/playButtonOver.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/timeSliderBuffer.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/timeSliderCapLeft.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/timeSliderCapRight.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/timeSliderProgress.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/timeSliderRail.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/unmuteButton.png
 delete mode 100644 source/assets/jwplayer/glow/controlbar/unmuteButtonOver.png
 delete mode 100644 source/assets/jwplayer/glow/display/background.png
 delete mode 100644 source/assets/jwplayer/glow/display/bufferIcon.png
 delete mode 100644 source/assets/jwplayer/glow/display/muteIcon.png
 delete mode 100644 source/assets/jwplayer/glow/display/playIcon.png
 delete mode 100644 source/assets/jwplayer/glow/dock/button.png
 delete mode 100644 source/assets/jwplayer/glow/glow.xml
 delete mode 100644 source/assets/jwplayer/glow/playlist/item.png
 delete mode 100644 source/assets/jwplayer/glow/playlist/itemOver.png
 delete mode 100644 source/assets/jwplayer/glow/playlist/sliderCapBottom.png
 delete mode 100644 source/assets/jwplayer/glow/playlist/sliderCapTop.png
 delete mode 100644 source/assets/jwplayer/glow/playlist/sliderRail.png
 delete mode 100644 source/assets/jwplayer/glow/playlist/sliderThumb.png
 delete mode 100644 source/assets/jwplayer/glow/sharing/embedIcon.png
 delete mode 100644 source/assets/jwplayer/glow/sharing/embedScreen.png
 delete mode 100644 source/assets/jwplayer/glow/sharing/shareIcon.png
 delete mode 100644 source/assets/jwplayer/glow/sharing/shareScreen.png
 delete mode 100644 source/assets/jwplayer/player.swf
 delete mode 100644 source/atom.xml
 create mode 100644 source/blog/2014-10-20-hello-octopress.md
 create mode 100644 source/blog/2014-10-20-help-mou-hit-1-dot-0.md
 create mode 100644 source/blog/2014-10-21-get-rolling.md
 create mode 100644 source/blog/2014-10-23-ripping-copy-protected-dvd-with-mpv.md
 create mode 100644 source/blog/2014-10-24-charles-munger-donated-$65m-to-kitp.md
 create mode 100644 source/blog/2014-10-25-os-x-package-receipts.md
 create mode 100644 source/blog/2014-10-26-audio-cd-slash-dvd-to-iso-image-on-os-x.md
 create mode 100644 source/blog/2014-10-26-disk-visualizer-daisydisk.md
 create mode 100644 source/blog/2014-10-27-onedrive-goes-unlimited.md
 create mode 100644 source/blog/2014-10-28-google-drive-no-selective-subfolder-sync.md
 create mode 100644 source/blog/2014-10-28-mou-1-dot-0-fundraiser-goal-reached.md
 create mode 100644 source/blog/2014-10-29-fun.md
 create mode 100644 source/blog/2014-11-02-vobcopy-dvdbackup-etc.md
 create mode 100644 source/blog/2014-11-05-apple-is-pushing-yosemite-hard.md
 create mode 100644 source/blog/2014-11-05-list-youtube-playlist-with-youtube-dl.md
 create mode 100644 source/blog/2014-11-06-2014-nobel-prize-in-physics-led-lights-seriously.md
 create mode 100644 source/blog/2014-11-07-interstellar.md
 create mode 100644 source/blog/2014-11-10-average-phone-plan-in-the-u-dot-s-costs-ten-time-as-much-as-that-in-the-u-dot-k.md
 create mode 100644 source/blog/2014-11-11-re-encoding-everything-for-iphone-6-plus.md
 create mode 100644 source/blog/2014-11-19-convolution-of-irreducible-characters.md
 create mode 100644 source/blog/2014-11-20-dropbot-for-geeks(r).md
 create mode 100644 source/blog/2014-11-24-iphone-photography-frustration.md
 create mode 100644 source/blog/2014-11-24-why-i-abandoned-mathjax-and-fell-back-to-pdf.md
 create mode 100644 source/blog/2014-11-25-i-got-16-gigs-of-ram.md
 create mode 100644 source/blog/2014-11-26-original-images-in-day-one-journal.md
 create mode 100644 source/blog/2014-11-28-given-infinite-time.md
 create mode 100644 source/blog/2014-11-28-going-diceware.md
 create mode 100644 source/blog/2014-11-30-opera-style-advanced-keyboard-shortcuts-in-safari.md
 create mode 100644 source/blog/2014-12-05-distraction-free-writing.md
 create mode 100644 source/blog/2014-12-05-python-3-and-unicode.md
 create mode 100644 source/blog/2014-12-10-omnifocus-change-sync-behavior-mac-and-ios.md
 create mode 100644 source/blog/2014-12-13-the-mac-like-evernote.md
 create mode 100644 source/blog/2014-12-14-speeding-up-emacs-with-emacsclient.md
 create mode 100644 source/blog/2014-12-14-the-google-chrome-comic-a-classic.md
 create mode 100644 source/blog/2014-12-19-app-suggestion-dropzone-3.md
 create mode 100644 source/blog/2014-12-22-10k-images-on-imgur.md
 create mode 100644 source/blog/2014-12-23-mpv-launcher.md
 create mode 100644 source/blog/2015-01-01-os-x-system-ruby-encoding-annoyance.md
 create mode 100644 source/blog/2015-01-10-fonts-why-chinese-web-design-is-hard.md
 create mode 100644 source/blog/2015-01-21-web-design-microsoft-vs-apple.md
 create mode 100644 source/blog/2015-02-10-monitor-progress-of-your-unix-pipes-with-pv.md
 create mode 100644 source/blog/2015-02-17-microsoft-is-getting-cool-but-not-its-website.md
 create mode 100644 source/blog/2015-02-20-my-dock-and-updated-omnifocus.md
 create mode 100644 source/blog/2015-02-21-all-is-not-lost.md
 create mode 100644 source/blog/2015-02-24-the-new-onedrive-api.md
 create mode 100644 source/blog/2015-03-22-back-up-os-x-app-icons.md
 create mode 100644 source/blog/2015-04-26-using-python-3-with-emacs-jedi.md
 create mode 100644 source/blog/2015-05-03-why-oh-my-zsh-is-completely-broken.md
 delete mode 100644 source/blog/archives/index.html
 delete mode 100644 source/favicon.png
 delete mode 100644 source/images/bird_32_gray.png
 delete mode 100644 source/images/bird_32_gray_fail.png
 delete mode 100644 source/images/code_bg.png
 delete mode 100644 source/images/dotted-border.png
 delete mode 100644 source/images/email.png
 delete mode 100644 source/images/line-tile.png
 delete mode 100644 source/images/noise.png
 delete mode 100644 source/images/rss.png
 delete mode 100644 source/images/search.png
 delete mode 100644 source/index.html
 delete mode 100644 source/javascripts/github.js
 delete mode 100644 source/javascripts/libs/jXHR.js
 delete mode 100644 source/javascripts/libs/jquery.min.js
 delete mode 100644 source/javascripts/libs/swfobject-dynamic.js
 delete mode 100644 source/javascripts/modernizr-2.0.js
 delete mode 100644 source/javascripts/octopress.js
 delete mode 100644 source/javascripts/pinboard.js
 delete mode 100644 source/javascripts/twitter.js

diff --git a/.editorconfig b/.editorconfig
deleted file mode 100644
index d359ca6f..00000000
--- a/.editorconfig
+++ /dev/null
@@ -1,22 +0,0 @@
-; This file is for unifying the coding style for different editors and IDEs.
-; More information at http://EditorConfig.org
-
-root = true
-
-; Use 2 spaces for indentation in all Ruby files
-
-[*.rb]
-indent_style = space
-indent_size = 2
-
-[Rakefile]
-indent_style = space
-indent_size = 2
-
-[Gemfile*]
-indent_style = space
-indent_size = 2
-
-[config.ru]
-indent_style = space
-indent_size = 2
diff --git a/.gitattributes b/.gitattributes
deleted file mode 100644
index 176a458f..00000000
--- a/.gitattributes
+++ /dev/null
@@ -1 +0,0 @@
-* text=auto
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 1768f4d7..00000000
--- a/.gitignore
+++ /dev/null
@@ -1,15 +0,0 @@
-.bundle
-.DS_Store
-.sass-cache
-.gist-cache
-.pygments-cache
-_deploy
-posts
-public
-sass.old
-source.old
-source/_stash
-source/stylesheets/screen.css
-vendor
-node_modules
-Gemfile.lock
diff --git a/.powrc b/.powrc
deleted file mode 100644
index 4777f08f..00000000
--- a/.powrc
+++ /dev/null
@@ -1,5 +0,0 @@
-if [ -f "$rvm_path/scripts/rvm" ] && [ -f ".rvmrc" ] ; then
-  source "$rvm_path/scripts/rvm"
-  source ".rvmrc"
-fi
-  
\ No newline at end of file
diff --git a/.slugignore b/.slugignore
deleted file mode 100644
index 0a41d013..00000000
--- a/.slugignore
+++ /dev/null
@@ -1,3 +0,0 @@
-plugins
-sass
-source
diff --git a/.themes/classic/.editorconfig b/.themes/classic/.editorconfig
deleted file mode 100644
index 940fea3e..00000000
--- a/.themes/classic/.editorconfig
+++ /dev/null
@@ -1,44 +0,0 @@
-; This file is for unifying the coding style for different editors and IDEs.
-; More information at http://EditorConfig.org
-
-
-; Use 2 spaces for indentation in SCSS, JavaScript, HTML, and XML
-
-[*.scss]
-indent_style = space
-indent_size = 2
-
-[*.js]
-indent_style = space
-indent_size = 2
-
-[*.html]
-indent_style = space
-indent_size = 2
-
-[*.xml]
-indent_style = space
-indent_size = 2
-
-
-; Use 4 spaces for indentation in Markdown files
-
-[*.md]
-indent_style = space
-indent_size = 4
-
-[*.markdown]
-indent_style = space
-indent_size = 4
-
-
-; Override default indentation for some library files
-
-[jwplayer/glow/glow.xml]
-indent_style = tab
-
-[libs/jXHR.js]
-indent_style = tab
-
-[libs/swfobject-dynamic.js]
-indent_style = tab
diff --git a/.themes/classic/sass/_base.scss b/.themes/classic/sass/_base.scss
deleted file mode 100644
index 05fdd005..00000000
--- a/.themes/classic/sass/_base.scss
+++ /dev/null
@@ -1,5 +0,0 @@
-@import "base/utilities";
-@import "base/solarized";
-@import "base/theme";
-@import "base/typography";
-@import "base/layout";
diff --git a/.themes/classic/sass/_partials.scss b/.themes/classic/sass/_partials.scss
deleted file mode 100644
index 99c28b63..00000000
--- a/.themes/classic/sass/_partials.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-@import "partials/header";
-@import "partials/navigation";
-@import "partials/blog";
-@import "partials/sharing";
-@import "partials/syntax";
-@import "partials/archive";
-@import "partials/sidebar";
-@import "partials/footer";
diff --git a/.themes/classic/sass/base/_layout.scss b/.themes/classic/sass/base/_layout.scss
deleted file mode 100644
index 81903428..00000000
--- a/.themes/classic/sass/base/_layout.scss
+++ /dev/null
@@ -1,192 +0,0 @@
-$max-width: 1200px !default;
-
-// Padding used for layout margins
-$pad-min: 18px !default;
-$pad-narrow: 25px !default;
-$pad-medium: 35px !default;
-$pad-wide: 55px !default;
-
-// Sidebar widths used in media queries
-$sidebar-width-medium: 240px !default;
-$sidebar-pad-medium: 15px !default;
-$sidebar-pad-wide: 20px !default;
-$sidebar-width-wide: 300px !default;
-
-$indented-lists: false !default;
-
-$header-font-size: 1em !default;
-$header-padding-top: 1.5em !default;
-$header-padding-bottom: 1.5em !default;
-
-.group { @include pie-clearfix; }
-
-@mixin collapse-sidebar {
-  float: none;
-  width: auto;
-  clear: left;
-  margin: 0;
-  padding: 0 $pad-medium 1px;
-  background-color: lighten($sidebar-bg, 2);
-  border-top: 1px solid lighten($sidebar-border, 4);
-  section {
-    &.odd, &.even { float: left; width: 48%; }
-    &.odd { margin-left: 0; }
-    &.even { margin-left: 4%; }
-  }
-  &.thirds section {
-    width: 30%;
-    margin-left: 5%;
-    &.first {
-      margin-left: 0;
-      clear: both;
-    }
-  }
-}
-
-body {
-  -webkit-text-size-adjust: none;
-  max-width: $max-width;
-  position: relative;
-  margin: 0 auto;
-  > header, > nav, > footer, #content > article, #content > div > article, #content > div > section {
-    @extend .group;
-    padding-left: $pad-min;
-    padding-right: $pad-min;
-    @media only screen and (min-width: 480px) {
-      padding-left: $pad-narrow;
-      padding-right: $pad-narrow;
-    }
-    @media only screen and (min-width: 768px) {
-      padding-left: $pad-medium;
-      padding-right: $pad-medium;
-    }
-    @media only screen and (min-width: 992px) {
-      padding-left: $pad-wide;
-      padding-right: $pad-wide;
-    }
-  }
-  div.pagination {
-    @extend .group;
-    margin-left: $pad-min;
-    margin-right: $pad-min;
-    @media only screen and (min-width: 480px) {
-      margin-left: $pad-narrow;
-      margin-right: $pad-narrow;
-    }
-    @media only screen and (min-width: 768px) {
-      margin-left: $pad-medium;
-      margin-right: $pad-medium;
-    }
-    @media only screen and (min-width: 992px) {
-      margin-left: $pad-wide;
-      margin-right: $pad-wide;
-    }
-  }
-  > header {
-    font-size: $header-font-size;
-    padding-top: $header-padding-top;
-    padding-bottom: $header-padding-bottom;
-  }
-}
-
-#content {
-  overflow: hidden;
-  > div, > article { width: 100%; }
-}
-
-aside.sidebar {
-  float: none;
-  padding: 0 $pad-min 1px;
-  background-color: lighten($sidebar-bg, 2);
-  border-top: 1px solid $sidebar-border;
-  @extend .group;
-}
-
-.flex-content { max-width: 100%; height: auto; }
-
-.basic-alignment {
-  &.left { float: left; margin-right: 1.5em; }
-  &.right { float: right; margin-left: 1.5em; }
-  &.center { display:block; margin: 0 auto 1.5em; }
-  &.left, &.right { margin-bottom: .8em; }
-}
-
-.toggle-sidebar { &, .no-sidebar & { display: none; }}
-
-body.sidebar-footer {
-  @media only screen and (min-width: 750px) {
-    aside.sidebar{ @include collapse-sidebar; }
-  }
-  #content { margin-right: 0px; }
-  .toggle-sidebar { display: none; }
-}
-
-@media only screen and (min-width: 550px) {
-  body > header { font-size: $header-font-size; }
-}
-@media only screen and (min-width: 750px) {
-  aside.sidebar { @include collapse-sidebar; }
-}
-#main, #content, .sidebar {
-  @extend .group;
-}
-@media only screen and (min-width: 768px) {
-  body { -webkit-text-size-adjust: auto; }
-  body > header { font-size: $header-font-size * 1.2; }
-  #main {
-    padding: 0;
-    margin: 0 auto;
-  }
-  #content {
-    overflow: visible;
-    margin-right: $sidebar-width-medium;
-    position: relative;
-    .no-sidebar & { margin-right: 0; border-right: 0; }
-    .collapse-sidebar & { margin-right: 20px; }
-    > div, > article {
-      padding-top: $pad-medium/2;
-      padding-bottom: $pad-medium/2;
-      float: left;
-    }
-  }
-  aside.sidebar {
-    width: $sidebar-width-medium - $sidebar-pad-medium*2;
-    padding: 0 $sidebar-pad-medium $sidebar-pad-medium;
-    background: none;
-    clear: none;
-    float: left;
-    margin: 0 -100% 0 0;
-    section {
-      width: auto; margin-left: 0;
-      &.odd, &.even { float: none; width: auto; margin-left: 0; }
-    }
-    .collapse-sidebar & {
-      @include collapse-sidebar;
-    }
-  }
-}
-
-@media only screen and (min-width: 992px) {
-  body > header { font-size: $header-font-size * 1.3; }
-  #content { margin-right: $sidebar-width-wide; }
-  #content {
-    > div, > article {
-      padding-top: $pad-wide/2;
-      padding-bottom: $pad-wide/2;
-    }
-  }
-  aside.sidebar {
-    width: $sidebar-width-wide - $sidebar-pad-wide*2;
-    padding: 1.2em $sidebar-pad-wide $sidebar-pad-wide;
-    .collapse-sidebar & {
-      padding: { left: $pad-wide; right: $pad-wide; }
-    }
-  }
-}
-
-@if $indented-lists == false {
-  @media only screen and (min-width: 768px) {
-    ul, ol { margin-left: 0; }
-  }
-}
-
diff --git a/.themes/classic/sass/base/_solarized.scss b/.themes/classic/sass/base/_solarized.scss
deleted file mode 100644
index 45d8fc5e..00000000
--- a/.themes/classic/sass/base/_solarized.scss
+++ /dev/null
@@ -1,46 +0,0 @@
-$base03:          #002b36 !default; //darkest blue
-$base02:          #073642 !default; //dark blue
-$base01:          #586e75 !default; //darkest gray
-$base00:          #657b83 !default; //dark gray
-$base0:           #839496 !default; //medium gray
-$base1:           #93a1a1 !default; //medium light gray
-$base2:           #eee8d5 !default; //cream
-$base3:           #fdf6e3 !default; //white
-$solar-yellow:    #b58900 !default;
-$solar-orange:    #cb4b16 !default;
-$solar-red:       #dc322f !default;
-$solar-magenta:   #d33682 !default;
-$solar-violet:    #6c71c4 !default;
-$solar-blue:      #268bd2 !default;
-$solar-cyan:      #2aa198 !default;
-$solar-green:     #859900 !default;
-
-$solarized: dark !default;
-
-@if $solarized == light {
-
-  $_base03: $base03;
-  $_base02: $base02;
-  $_base01: $base01;
-  $_base00: $base00;
-  $_base0:  $base0;
-  $_base1:  $base1;
-  $_base2:  $base2;
-  $_base3:  $base3;
-
-  $base03:  $_base3;
-  $base02:  $_base2;
-  $base01:  $_base1;
-  $base00:  $_base0;
-  $base0:   $_base00;
-  $base1:   $_base01;
-  $base2:   $_base02;
-  $base3:   $_base03;
-}
-
-/* non highlighted code colors */
-$pre-bg: $base03 !default;
-$pre-border: darken($base02, 5) !default;
-$pre-color: $base1 !default;
-
-
diff --git a/.themes/classic/sass/base/_theme.scss b/.themes/classic/sass/base/_theme.scss
deleted file mode 100644
index c35136d5..00000000
--- a/.themes/classic/sass/base/_theme.scss
+++ /dev/null
@@ -1,85 +0,0 @@
-$noise-bg: image-url('noise.png') top left !default;
-$img-border: inline-image('dotted-border.png') !default;
-
-// Main Link Colors
-$link-color: lighten(#165b94, 3) !default;
-$link-color-hover: adjust-color($link-color, $lightness: 10, $saturation: 25) !default;
-$link-color-visited: adjust-color($link-color, $hue: 80, $lightness: -4) !default;
-$link-color-active: adjust-color($link-color-hover, $lightness: -15) !default;
-
-// Main Section Colors
-$main-bg: #f8f8f8 !default;
-$page-bg: #252525 !default;
-$article-border: #eeeeee !default;
-
-$header-bg: #333 !default;
-$header-border: lighten($header-bg, 15) !default;
-$title-color: #f2f2f2 !default;
-$subtitle-color: #aaa !default;
-
-$text-color: #222 !default;
-$text-color-light: #aaa !default;
-$type-border: #ddd !default;
-
-/* Navigation */
-$nav-bg: #ccc !default;
-$nav-bg-front: image-url('noise.png') !default;
-$nav-bg-back: linear-gradient(lighten($nav-bg, 8), $nav-bg, darken($nav-bg, 11)) !default;
-$nav-color: darken($nav-bg, 38) !default;
-$nav-color-hover: darken($nav-color, 25) !default;
-$nav-placeholder: desaturate(darken($nav-bg, 10), 15) !default;
-$nav-border: darken($nav-bg, 10) !default;
-$nav-border-top: lighten($nav-bg, 15) !default;
-$nav-border-bottom: darken($nav-bg, 25) !default;
-$nav-border-left: darken($nav-bg, 11) !default;
-$nav-border-right: lighten($nav-bg, 7) !default;
-
-/* Sidebar colors */
-$sidebar-bg: #f2f2f2 !default;
-$sidebar-link-color: $text-color !default;
-$sidebar-link-color-hover: $link-color-hover !default;
-$sidebar-link-color-active: $link-color-active !default;
-$sidebar-color: change-color(mix($text-color, $sidebar-bg, 80), $hue: hue($sidebar-bg), $saturation: saturation($sidebar-bg)/2) !default;
-$sidebar-border: desaturate(darken($sidebar-bg, 7), 10) !default;
-$sidebar-border-hover: darken($sidebar-bg, 7) !default;
-$sidebar-link-color-subdued: lighten($sidebar-color, 20) !default;
-$sidebar-link-color-subdued-hover: $sidebar-link-color-hover !default;
-
-$footer-color: #888 !default;
-$footer-bg: #ccc !default;
-$footer-bg-front: image-url('noise.png') !default;
-$footer-bg-back: linear-gradient(lighten($footer-bg, 8), $footer-bg, darken($footer-bg, 11)) !default;
-$footer-color: darken($footer-bg, 38) !default;
-$footer-color-hover: darken($footer-color, 10) !default;
-$footer-border-top: lighten($footer-bg, 15) !default;
-$footer-border-bottom: darken($footer-bg, 15) !default;
-$footer-link-color: darken($footer-bg, 38) !default;
-$footer-link-color-hover: darken($footer-color, 25) !default;
-$page-border-bottom: darken($footer-bg, 5) !default;
-
-
-/* Core theme application */
-
-a {
-  @include link-colors($link-color, $hover: $link-color-hover, $focus: $link-color-hover, $visited: $link-color-visited, $active: $link-color-active);
-}
-aside.sidebar a {
-  @include link-colors($sidebar-link-color, $hover: $sidebar-link-color-hover, $focus: $sidebar-link-color-hover, $active: $sidebar-link-color-active);
-}
-a {
-  @include transition(color .3s);
-}
-
-html {
-  background: $page-bg image-url('line-tile.png') top left;
-}
-body {
-  > div {
-    background: $sidebar-bg $noise-bg;
-    border-bottom: 1px solid $page-border-bottom;
-    > div {
-      background: $main-bg $noise-bg;
-      border-right: 1px solid $sidebar-border;
-    }
-  }
-}
diff --git a/.themes/classic/sass/base/_typography.scss b/.themes/classic/sass/base/_typography.scss
deleted file mode 100644
index 9a6bbacd..00000000
--- a/.themes/classic/sass/base/_typography.scss
+++ /dev/null
@@ -1,164 +0,0 @@
-$blockquote: $type-border !default;
-$sans: "PT Sans", "Helvetica Neue", Arial, sans-serif !default;
-$serif: "PT Serif", Georgia, Times, "Times New Roman", serif !default;
-$mono: Menlo, Monaco, "Andale Mono", "lucida console", "Courier New", monospace !default;
-$heading-font-family: "PT Serif", "Georgia", "Helvetica Neue", Arial, sans-serif !default;
-$header-title-font-family: $heading-font-family !default;
-$header-subtitle-font-family: $heading-font-family !default;
-
-// Fonts
-.heading {
-  font-family: $heading-font-family;
-}
-.sans { font-family: $sans; }
-.serif { font-family: $serif; }
-.mono { font-family: $mono; }
-
-body > header h1 {
-  font-size: 2.2em;
-  @extend .heading;
-  font-family: $header-title-font-family;
-  font-weight: normal;
-  line-height: 1.2em;
-  margin-bottom: 0.6667em;
-}
-body > header h2 {
-  font-family: $header-subtitle-font-family;
-}
-
-body {
-  line-height: 1.5em;
-  color: $text-color;
-  @extend .serif;
-}
-h1 {
-  font-size: 2.2em;
-  line-height: 1.2em;
-}
-
-@media only screen and (min-width: 992px) {
-  body { font-size: 1.15em; }
-  h1 { font-size: 2.6em; line-height: 1.2em; }
-}
-
-#{headings()}{
-  @extend .heading;
-  text-rendering: optimizelegibility;
-  margin-bottom: 1em;
-  font-weight: bold;
-}
-h2, section h1 {
-  font-size: 1.5em;
-}
-h3, section h2, section section h1 {
-  font-size: 1.3em;
-}
-h4, section h3, section section h2, section section section h1 {
-  font-size: 1em;
-}
-h5, section h4, section section h3 {
-  font-size: .9em;
-}
-h6, section h5, section section h4, section section section h3 {
-  font-size: .8em;
-}
-
-p, article blockquote, ul, ol { margin-bottom: 1.5em; }
-
-ul { list-style-type: disc;
-  ul { list-style-type: circle; margin-bottom: 0px;
-    ul { list-style-type: square; margin-bottom: 0px; }}}
-
-ol { list-style-type: decimal;
-  ol { list-style-type: lower-alpha; margin-bottom: 0px;
-    ol { list-style-type: lower-roman; margin-bottom: 0px; }}}
-
-ul, ol { &, ul, ol { margin-left: 1.3em; }}
-ul, ol { ul, ol { margin-bottom: 0em; }}
-
-strong { font-weight: bold; }
-
-em { font-style: italic; }
-
-sup, sub { font-size: 0.75em; position: relative;  display: inline-block; padding: 0 .2em; line-height: .8em;}
-sup { top: -.5em; }
-sub { bottom: -.5em; }
-
-a[rev='footnote']{ font-size: .75em; padding: 0 .3em; line-height: 1; }
-
-q { font-style: italic;
-  &:before { content: "\201C"; }
-  &:after { content: "\201D"; }
-}
-
-em, dfn { font-style: italic; }
-
-strong, dfn { font-weight: bold; }
-
-del, s { text-decoration: line-through; }
-
-abbr, acronym { border-bottom: 1px dotted; cursor: help; }
-
-pre, code, tt { @extend .mono; }
-
-hr { margin-bottom: 0.2em; }
-
-small { font-size: .8em; }
-
-big { font-size: 1.2em; }
-
-article blockquote {
-  $bq-margin: 1.2em;
-  font-style: italic;
-  position: relative;
-  font-size: 1.2em;
-  line-height: 1.5em;
-  padding-left: 1em;
-  border-left: 4px solid rgba($text-color-light, .5);
-  cite {
-    font-style: italic;
-    a { color: $text-color-light !important; word-wrap: break-word; }
-    &:before { content: '\2014'; padding:{right: .3em; left: .3em;} color: $text-color-light; }
-  }
-  @media only screen and (min-width: 992px) {
-    padding-left: 1.5em;
-    border-left-width: 4px;
-  }
-}
-
-.pullquote-right:before,
-.pullquote-left:before {
-  /* Reset metrics. */
-  padding: 0;
-  border: none;
-
-  /* Content */
-  content: attr(data-pullquote);
-
-  /* Pull out to the right, modular scale based margins. */
-  float: right;
-  width: 45%;
-  margin: .5em 0 1em 1.5em;
-
-  /* Baseline correction */
-  position: relative;
-  top: 7px;
-  font-size: 1.4em;
-  line-height: 1.45em;
-}
-
-.pullquote-left:before {
-  /* Make left pullquotes align properly. */
-  float: left;
-  margin: .5em 1.5em 1em 0;
-}
-
-/* @extend this to force long lines of continuous text to wrap */
-.force-wrap {
-  white-space: -moz-pre-wrap;
-  white-space: -pre-wrap;
-  white-space: -o-pre-wrap;
-  white-space: pre-wrap;
-  word-wrap: break-word;
-}
-
diff --git a/.themes/classic/sass/base/_utilities.scss b/.themes/classic/sass/base/_utilities.scss
deleted file mode 100644
index 2d49e659..00000000
--- a/.themes/classic/sass/base/_utilities.scss
+++ /dev/null
@@ -1,28 +0,0 @@
-@mixin mask-image($img, $repeat: no-repeat){
-  @include experimental(mask-image, image-url($img), -webkit, -moz, -o, -ms);
-  @include experimental(mask-repeat, $repeat, -webkit, -moz, -o, -ms);
-  width: image-width($img);
-  height: image-height($img);
-}
-
-@mixin shadow-box($border: #fff .5em solid, $shadow: rgba(#000, .15) 0 1px 4px, $border-radius: .3em) {
-  @include border-radius($border-radius);
-  @include box-shadow($shadow);
-  @include box-sizing(border-box);
-  border: $border;
-}
-
-@mixin selection($bg, $color: inherit, $text-shadow: none){
-  * {
-    &::-moz-selection { background: $bg; color: $color; text-shadow: $text-shadow; }
-    &::-webkit-selection { background: $bg; color: $color; text-shadow: $text-shadow; }
-    &::selection { background: $bg; color: $color; text-shadow: $text-shadow; }
-  }
-}
-
-@function text-color($color, $dark: dark, $light: light){
-  $text-color: ( (red($color)*299) + (green($color)*587) + (blue($color)*114) ) / 1000;
-  $text-color: if($text-color >= 150, $dark, $light);
-  @return $text-color;
-}
-
diff --git a/.themes/classic/sass/custom/_colors.scss b/.themes/classic/sass/custom/_colors.scss
deleted file mode 100644
index 740266a8..00000000
--- a/.themes/classic/sass/custom/_colors.scss
+++ /dev/null
@@ -1,43 +0,0 @@
-// Here you can easily change your sites's color scheme.
-// To give it a try, uncomment some of the lines below rebuild your blog, and see how it works.
-// If you need a handy color picker try http://hslpicker.com
-
-//$header-bg: #263347;
-//$subtitle-color: lighten($header-bg, 58);
-//$nav-bg: desaturate(lighten(#8fc17a, 18), 5);
-//$nav-bg-front: image-url('noise.png');
-//$nav-bg-back: linear-gradient(lighten($nav-bg, 8), $nav-bg, darken($nav-bg, 11));
-//$sidebar-bg: desaturate(#eceff5, 8);
-//$sidebar-link-color: saturate(#526f9a, 10);
-//$sidebar-link-color-hover: darken(#7ab662, 9);
-//$footer-bg: #ccc !default;
-//$footer-bg-front: image-url('noise.png');
-//$footer-bg-back: linear-gradient(lighten($footer-bg, 8), $footer-bg, darken($footer-bg, 11));
-
-
-/* To use the light Solarized highlighting theme uncomment the following line */
-//$solarized: light;
-
-/* If you want to tweak the Solarized colors you can do that here */
-//$base03:          #002b36; //darkest blue
-//$base02:          #073642; //dark blue
-//$base01:          #586e75; //darkest gray
-//$base00:          #657b83; //dark gray
-//$base0:           #839496; //medium gray
-//$base1:           #93a1a1; //medium light gray
-//$base2:           #eee8d5; //cream
-//$base3:           #fdf6e3; //white
-//$solar-yellow:    #b58900;
-//$solar-orange:    #cb4b16;
-//$solar-red:       #dc322f;
-//$solar-magenta:   #d33682;
-//$solar-violet:    #6c71c4;
-//$solar-blue:      #268bd2;
-//$solar-cyan:      #2aa198;
-//$solar-green:     #859900;
-
-
-/* Non highlighted code colors */
-//$pre-bg: $base03;
-//$pre-border: darken($base02, 5);
-//$pre-color: $base1;
diff --git a/.themes/classic/sass/custom/_fonts.scss b/.themes/classic/sass/custom/_fonts.scss
deleted file mode 100644
index 1a6b2a06..00000000
--- a/.themes/classic/sass/custom/_fonts.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-// Here you can easily change font faces which are used in your site.
-// To give it a try, uncomment some of the lines below rebuild your blog, and see how it works. your sites's.
-// If you love to use Web Fonts, you also need to add some lines to source/_includes/custom/head.html
-
-//$sans: "Optima", sans-serif;
-//$serif: "Baskerville", serif;
-//$mono: "Courier", monospace;
-//$heading-font-family: "Verdana", sans-serif;
-//$header-title-font-family: "Futura", sans-serif;
-//$header-subtitle-font-family: "Futura", sans-serif;
diff --git a/.themes/classic/sass/custom/_layout.scss b/.themes/classic/sass/custom/_layout.scss
deleted file mode 100644
index 74c7de9d..00000000
--- a/.themes/classic/sass/custom/_layout.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-// Here you can easily change your sites's layout.
-// To give it a try, uncomment some of the lines below, make changes, rebuild your blog, and see how it works.
-
-//$header-font-size: 1em;
-//$header-padding-top: 1.5em;
-//$header-padding-bottom: 1.5em;
-
-//$max-width: 1350px;
-//$indented-lists: true;
-
-// Padding used for layout margins
-//$pad-min: 18px;
-//$pad-narrow: 25px;
-//$pad-medium: 35px;
-//$pad-wide: 55px;
-
-// Sidebar widths used in media queries
-//$sidebar-width-medium: 240px;
-//$sidebar-pad-medium: 15px;
-//$sidebar-pad-wide: 20px;
-//$sidebar-width-wide: 300px;
diff --git a/.themes/classic/sass/custom/_styles.scss b/.themes/classic/sass/custom/_styles.scss
deleted file mode 100644
index 91ffcccf..00000000
--- a/.themes/classic/sass/custom/_styles.scss
+++ /dev/null
@@ -1,2 +0,0 @@
-// This File is imported last, and will override other styles in the cascade
-// Add styles here to make changes without digging in too much
diff --git a/.themes/classic/sass/partials/_archive.scss b/.themes/classic/sass/partials/_archive.scss
deleted file mode 100644
index 9ef1e824..00000000
--- a/.themes/classic/sass/partials/_archive.scss
+++ /dev/null
@@ -1,72 +0,0 @@
-#archive {
-  #content > div { &, > article { padding-top: 0; } }
-}
-#blog-archives {
-  article {
-    padding: 1em 0 1em;
-    position: relative;
-    background: $img-border bottom left repeat-x;
-    &:last-child {
-      background: none;
-    }
-    footer { padding: 0; margin: 0;}
-  }
-  h1 { color: $text-color; margin-bottom: .3em; }
-  h2 { display: none; }
-  h1 {
-    font-size: 1.5em;
-    a {
-      @include hover-link;
-      color: inherit;
-      &:hover { color: $link-color-hover; }
-      font-weight: normal;
-      display: inline-block;
-    }
-  }
-  a.category, time {
-    @extend .sans;
-    color: $text-color-light;
-  }
-  color: $text-color-light;
-  .entry-content { display: none; }
-  time {
-    font-size: .9em;
-    line-height: 1.2em;
-    .month, .day { display: inline-block; }
-    .month { text-transform: uppercase; }
-  }
-  p { margin-bottom: 1em; }
-  &, .entry-content { a { @include link-colors(inherit, $link-color-hover); }}
-  a:hover { color: $link-color-hover; }
-  @media only screen and (min-width: 550px) {
-    article { margin-left: 5em; }
-    h2 {
-      margin-bottom: .3em;
-      font-weight: normal;
-      display: inline-block;
-      position: relative; top: -1px;
-      float: left;
-      &:first-child { padding-top: .75em; }
-    }
-    time {
-      position: absolute;
-      text-align: right;
-      left: 0em;
-      top: 1.8em;
-    }
-    .year { display: none; }
-    article {
-      padding:{left: 4.5em; bottom: .7em;}
-    }
-  a.category {
-    line-height: 1.1em;
-    }
-  }
-}
-#content > .category {
-  article {
-    margin-left: 0;
-    padding-left: 6.8em;
-  }
-  .year { display: inline; }
-}
diff --git a/.themes/classic/sass/partials/_blog.scss b/.themes/classic/sass/partials/_blog.scss
deleted file mode 100644
index 57fe7a8a..00000000
--- a/.themes/classic/sass/partials/_blog.scss
+++ /dev/null
@@ -1,141 +0,0 @@
-article {
-  padding-top: 1em;
-  a { @extend .force-wrap; }
-  header {
-    position: relative;
-    padding-top: 2em;
-    padding-bottom: 1em;
-    margin-bottom: 1em;
-    background: $img-border bottom left repeat-x;
-    h1 {
-      margin: 0;
-      a { text-decoration: none;
-        &:hover { text-decoration: underline; } }
-    }
-    p {
-      font-size: .9em;
-      color: $text-color-light;
-      margin: 0;
-      &.meta {
-        @extend .sans;
-        text-transform: uppercase;
-        position: absolute; top: 0;
-      }
-    }
-    @media only screen and (min-width: 768px) {
-      margin-bottom: 1.5em;
-      padding-bottom: 1em;
-      background: $img-border bottom left repeat-x;
-    }
-  }
-  h2 {
-    padding-top: 0.8em;
-    background: $img-border top left repeat-x;
-  }
-  .entry-content & h2:first-child, header + h2 { padding-top: 0; }
-  h2:first-child, header + h2 { background: none; }
-  .feature {
-    padding-top: .5em;
-    margin-bottom: 1em;
-    padding-bottom: 1em;
-    background: $img-border bottom left repeat-x;
-    font-size: 2.0em; font-style: italic;
-    line-height: 1.3em;
-  }
-  img, video, .flash-video {
-    @extend .flex-content;
-    @extend .basic-alignment;
-    @include shadow-box;
-  }
-  video, .flash-video { margin: 0 auto 1.5em; }
-  video { display: block; width: 100%; }
-  .flash-video {
-    > div {
-      position: relative;
-      display: block;
-      padding-bottom: 56.25%;
-      padding-top: 1px;
-      height: 0;
-      overflow: hidden;
-      iframe, object, embed {
-        position: absolute;
-        top: 0;
-        left: 0;
-        width: 100%;
-        height: 100%;
-      }
-    }
-  }
-  > footer {
-    padding-bottom: 2.5em;
-    margin-top: 2em;
-    @extend .sans;
-    p.meta {
-      margin-bottom: .8em;
-      font-size: .85em;
-      clear: both;
-      overflow: hidden;
-    }
-    .byline + time:before, time +time:before, .comments:before, .byline ~ .categories:before {
-      @extend .separator;
-    }
-  }
-
-}
-article + article {
-  .blog-index & {
-    background: $img-border top left repeat-x;
-  }
-}
-#content .blog-index {
-  padding: { top: 0; bottom: 0; }
-  article { padding-top: 2em; }
-  article header { background: none; padding-bottom: 0; }
-  article h1 {
-    font-size: 2.2em;
-    a { color: inherit; &:hover { color: $link-color-hover; } }
-  }
-  a[rel=full-article] {
-    background: darken($main-bg, 5);
-    display: inline-block;
-    padding: .4em .8em;
-    margin-right: .5em;
-    text-decoration: none;
-    color: mix($text-color, $text-color-light);
-    @extend .serif;
-    @include transition(background-color .5s);
-    &:hover {
-      background: $link-color-hover;
-      text-shadow: none;
-      color: $main-bg;
-    }
-  }
-  footer {
-    @extend .sans;
-    margin-top: 1em;
-  }
-}
-
-.separator {
-  content: "\2022 ";
-  padding: 0 .4em 0 .2em;
-  display: inline-block;
-}
-
-#content div.pagination {
-  text-align: center;
-  font-size: .95em;
-  position: relative;
-  background: $img-border top left repeat-x;
-  padding: {top: 1.5em; bottom: 1.5em;}
-  a {
-    text-decoration: none;
-    color: $text-color-light;
-    &.prev { position: absolute; left: 0; }
-    &.next { position: absolute; right: 0; }
-    &:hover { color: $link-color-hover; }
-    &[href*=archive] {
-      &:before, &:after { content: '\2014'; padding: 0 .3em; }
-    }
-  }
-}
diff --git a/.themes/classic/sass/partials/_footer.scss b/.themes/classic/sass/partials/_footer.scss
deleted file mode 100644
index 37411225..00000000
--- a/.themes/classic/sass/partials/_footer.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-body > footer {
-  @extend .sans;
-  font-size: .8em;
-  color: $footer-color;
-  text-shadow: lighten($footer-bg, 5) 0 1px;
-  background-color: $footer-bg;
-  @include background($footer-bg-front, $footer-bg-back);
-  border-top: 1px solid $footer-border-top;
-  position: relative;
-  padding-top: 1em;
-  padding-bottom: 1em;
-  margin-bottom: 3em;
-  @include border-bottom-radius(.4em);
-  z-index: 1;
-  a {
-    @include link-colors($footer-link-color, $footer-link-color-hover, $visited: $footer-link-color);
-  }
-  p:last-child { margin-bottom: 0; }
-}
diff --git a/.themes/classic/sass/partials/_header.scss b/.themes/classic/sass/partials/_header.scss
deleted file mode 100644
index e3c6c020..00000000
--- a/.themes/classic/sass/partials/_header.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-body > header {
-  background: $header-bg;
-  h1 {
-    display: inline-block;
-    margin: 0;
-    a, a:visited, a:hover {
-      color: $title_color;
-      text-decoration: none;
-    }
-  }
-  h2 {
-    margin: .2em 0 0;
-    @extend .sans;
-    font-size: 1em;
-    color: $subtitle-color;
-    font-weight: normal;
-  }
-}
diff --git a/.themes/classic/sass/partials/_navigation.scss b/.themes/classic/sass/partials/_navigation.scss
deleted file mode 100644
index 30fa011d..00000000
--- a/.themes/classic/sass/partials/_navigation.scss
+++ /dev/null
@@ -1,137 +0,0 @@
-body > nav {
-  position: relative;
-  background-color: $nav-bg;
-  @include background($nav-bg-front, $nav-bg-back);
-  border: {
-    top: 1px solid $nav-border-top;
-    bottom: 1px solid $nav-border-bottom; }
-  padding-top: .35em;
-  padding-bottom: .35em;
-  form {
-    @include background-clip(padding-box);
-    margin: 0; padding: 0;
-    .search {
-      padding: .3em .5em 0;
-      font-size: .85em;
-      font-family: $sans;
-      line-height: 1.1em;
-      width: 95%;
-      @include border-radius(.5em);
-      @include background-clip(padding-box);
-      @include box-shadow(lighten($nav-bg, 2) 0 1px);
-      background-color: lighten($nav-bg, 15);
-      border: 1px solid $nav-border;
-      color: #888;
-      &:focus {
-        color: #444;
-        border-color: #80b1df;
-        @include box-shadow(#80b1df 0 0 4px, #80b1df 0 0 3px inset);
-        background-color: #fff;
-        outline: none;
-      }
-    }
-  }
-  fieldset[role=search]{ float: right; width: 48%; }
-  fieldset.mobile-nav{ float: left; width: 48%;
-    select{ width: 100%; font-size: .8em; border: 1px solid #888;}
-  }
-  ul { display: none; }
-  @media only screen and (min-width: 550px) {
-    font-size: .9em;
-    ul {
-      @include horizontal-list(0);
-      float: left;
-      display: block;
-      padding-top: .15em;
-    }
-    ul.subscription {
-      margin-left: .8em;
-      float: right;
-      li:last-child a { padding-right: 0; }
-    }
-    ul li {
-      margin: 0;
-    }
-    a {
-      @include link-colors($nav-color, $nav-color-hover, $visited: $nav-color);
-      font-family: $sans;
-      text-shadow: lighten($nav-bg, 12) 0 1px;
-      float: left;
-      text-decoration: none;
-      font-size: 1.1em;
-      padding: .1em 0;
-      line-height: 1.5em;
-    }
-    li + li {
-      border-left: 1px solid $nav-border-left;
-      margin-left: .8em;
-      a {
-        padding-left: .8em;
-        border-left: 1px solid $nav-border-right;
-      }
-    }
-    form {
-      float: right;
-      text-align: left;
-      padding-left: .8em;
-      width: $sidebar-width-medium - $pad-medium*2 - $sidebar-pad-medium + 20px;
-      .search {
-        width: 93%;
-        font-size: .95em;
-        line-height: 1.2em;
-      }
-    }
-    ul[data-subscription$=email] + form {
-      width: $sidebar-width-medium - $pad-medium*2 - $sidebar-pad-medium - 58px;
-      .search { width: 91%; }
-    }
-    fieldset.mobile-nav { display: none; }
-    fieldset[role=search]{ width: 99%; }
-  }
-  @media only screen and (min-width: 992px) {
-    form {
-      width: $sidebar-width-wide - $pad-wide - $sidebar-pad-wide*2 + 10px;
-    }
-    ul[data-subscription$=email] + form {
-      width: $sidebar-width-wide - $pad-wide - $sidebar-pad-wide*2 - 58px;
-    }
-  }
-}
-.no-placeholder {
-  body > nav .search {
-    background: lighten($nav-bg, 15) image-url('search.png') .3em .25em no-repeat;
-    text-indent: 1.3em;
-  }
-}
-@mixin mask-subscription-nav($feed: 'rss.png'){
-  position: relative; top: 0px;
-  text-indent: -999999em;
-  background-color: $nav-border-right;
-  border: 0;
-  padding: 0;
-  &,&:after { @include mask-image($feed); }
-  &:after {
-    content: "";
-    position: absolute; top: -1px; left: 0;
-    background-color: lighten($nav-color, 25);
-  }
-  &:hover:after { background-color: lighten($nav-color, 20); }
-}
-.maskImage {
-  body > nav {
-    @media only screen and (min-width: 550px) {
-      ul[data-subscription$=email] + form {
-        width: $sidebar-width-medium - $pad-medium*2 - $sidebar-pad-medium - 32px;
-      }
-    }
-    @media only screen and (min-width: 992px) {
-      ul[data-subscription$=email] + form {
-        width: $sidebar-width-wide - $pad-wide - $sidebar-pad-wide*2 - 32px;
-      }
-    }
-  }
-  ul.subscription { position: relative; top: .2em; li, a { border: 0; padding: 0; }}
-  a[rel=subscribe-rss]{ @include mask-subscription-nav('rss.png'); }
-  a[rel=subscribe-email]{ @include mask-subscription-nav('email.png'); }
-}
-
diff --git a/.themes/classic/sass/partials/_sharing.scss b/.themes/classic/sass/partials/_sharing.scss
deleted file mode 100644
index 3eecb488..00000000
--- a/.themes/classic/sass/partials/_sharing.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-.sharing {
-  p.meta + & {
-    padding: { top: 1em; left: 0; }
-    background: $img-border top left repeat-x;
-  }
-}
-
-#fb-root { display: none; }
diff --git a/.themes/classic/sass/partials/_sidebar.scss b/.themes/classic/sass/partials/_sidebar.scss
deleted file mode 100644
index cd8c1ca2..00000000
--- a/.themes/classic/sass/partials/_sidebar.scss
+++ /dev/null
@@ -1,4 +0,0 @@
-@import "sidebar/base";
-@import "sidebar/googleplus";
-@import "sidebar/pinboard";
-@import "sidebar/delicious";
diff --git a/.themes/classic/sass/partials/_syntax.scss b/.themes/classic/sass/partials/_syntax.scss
deleted file mode 100644
index 5465286f..00000000
--- a/.themes/classic/sass/partials/_syntax.scss
+++ /dev/null
@@ -1,261 +0,0 @@
-.highlight, html .gist .gist-file .gist-syntax .gist-highlight {
-  table td.code { width: 100%; }
-  border: 1px solid $pre-border !important;
-}
-.highlight .line-numbers, html .gist .gist-file .gist-syntax .highlight .line_numbers {
-  text-align: right;
-  font-size: 13px;
-  line-height: 1.45em;
-  @if $solarized == light {
-    background: lighten($base03, 1) $noise-bg !important;
-    border-right: 1px solid darken($base02, 2) !important;
-    @include box-shadow(lighten($base03, 2) -1px 0 inset);
-    text-shadow: lighten($base02, 2) 0 -1px;
-  } @else {
-    background: $base02 $noise-bg !important;
-    border-right: 1px solid darken($base03, 2) !important;
-    @include box-shadow(lighten($base02, 2) -1px 0 inset);
-    text-shadow: darken($base02, 10) 0 -1px;
-  }
-  span { color: $base01 !important; }
-  padding: .8em !important;
-  @include border-radius(0);
-}
-
-figure.code, .gist-file, pre {
-  @include box-shadow(rgba(#000, .06) 0 0 10px);
-  .highlight pre { @include box-shadow(none); }
-}
-
-.gist .highlight, figure.code .highlight {
-  @include selection(adjust-color($base03, $lightness: 23%, $saturation: -65%), $text-shadow: $base03 0 1px);
-}
-html .gist .gist-file {
-  margin-bottom: 1.8em;
-  position: relative;
-  border: none;
-  padding-top: image-height("code_bg.png") !important;
-  .highlight {
-    margin-bottom: 0;
-  }
-  .gist-syntax {
-    border-bottom: 0 !important;
-    background: none !important;
-    .gist-highlight {
-      background: $base03 !important;
-    }
-    .highlight pre {
-      @extend .pre-code;
-      padding: 0;
-    }
-  }
-  .gist-meta {
-   padding: .6em 0.8em;
-   border: 1px solid lighten($base02, 2) !important;
-   color: $base01;
-   font-size: .7em !important;
-   @if $solarized == light {
-     background: lighten($base03, 2) $noise-bg;
-     border: 1px solid $pre-border !important;
-     border-top: 1px solid lighten($base03, 2) !important;
-   } @else {
-     background: $base02 $noise-bg;
-   }
-   @extend .sans;
-   line-height: 1.5em;
-    a {
-      color: mix($base1, $base01) !important;
-      @include hover-link;
-      &:hover { color: $base1 !important; }
-    }
-    a[href*='#file'] {
-      position: absolute; top: 0; left:0; right:-10px;
-      color: #474747 !important;
-      @extend .code-title;
-      &:hover { color: $link-color !important; }
-    }
-    a[href*=raw]{
-      @extend .download-source;
-      top: .4em;
-    }
-  }
-}
-pre {
-  background: $pre-bg $noise-bg;
-  @include border-radius(.4em);
-  @extend .mono;
-  border: 1px solid $pre-border;
-  line-height: 1.45em;
-  font-size: 13px;
-  margin-bottom: 2.1em;
-  padding: .8em 1em;
-  color: $pre-color;
-  overflow: auto;
-}
-h3.filename {
-  @extend .code-title;
-  + pre { @include border-top-radius(0px); }
-}
-
-p, li {
-  code {
-    @extend .mono;
-    display: inline-block;
-    white-space: no-wrap;
-    background: #fff;
-    font-size: .8em;
-    line-height: 1.5em;
-    color: #555;
-    border: 1px solid #ddd;
-    @include border-radius(.4em);
-    padding: 0 .3em;
-    margin: -1px 0;
-  }
-  pre code { font-size: 1em !important; background: none; border: none; }
-}
-
-.pre-code {
-  font-family: $mono !important;
-  overflow: scroll;
-  overflow-y: hidden;
-  display: block;
-  padding: .8em;
-  overflow-x: auto;
-  line-height: 1.45em;
-  background: $base03 $noise-bg !important;
-  color: $base1 !important;
-  span { color: $base1 !important; }
-  span { font-style: normal !important; font-weight: normal !important; }
-
-  .c      { color: $base01 !important; font-style: italic !important; }                     /* Comment */
-  .cm     { color: $base01 !important; font-style: italic !important; }                     /* Comment.Multiline */
-  .cp     { color: $base01 !important; font-style: italic !important;  }                     /* Comment.Preproc */
-  .c1     { color: $base01 !important; font-style: italic !important; }                     /* Comment.Single */
-  .cs     { color: $base01 !important; font-weight: bold !important; font-style: italic !important; }   /* Comment.Special */
-  .err    { color: $solar-red !important; background: none !important; }                                            /* Error */
-  .k      { color: $solar-orange !important; }                       /* Keyword */
-  .o      { color: $base1 !important; font-weight: bold !important; }                       /* Operator */
-  .p      { color: $base1 !important; }                                             /* Operator */
-  .ow     { color: $solar-cyan !important; font-weight: bold !important; }                       /* Operator.Word */
-  .gd     { color: $base1 !important; background-color: mix($solar-red, $base03, 25%) !important; display: inline-block; }               /* Generic.Deleted */
-  .gd .x  { color: $base1 !important; background-color: mix($solar-red, $base03, 35%) !important; display: inline-block; }               /* Generic.Deleted.Specific */
-  .ge     { color: $base1 !important; font-style: italic !important; }                      /* Generic.Emph */
-  //.gr     { color: #aa0000 }                                          /* Generic.Error */
-  .gh     { color: $base01 !important; }                                          /* Generic.Heading */
-  .gi     { color: $base1 !important; background-color: mix($solar-green, $base03, 20%) !important; display: inline-block; }               /* Generic.Inserted */
-  .gi .x  { color: $base1 !important; background-color: mix($solar-green, $base03, 40%) !important; display: inline-block; }               /* Generic.Inserted.Specific */
-  //.go     { color: #888888 }                                          /* Generic.Output */
-  //.gp     { color: #555555 }                                          /* Generic.Prompt */
-  .gs     { color: $base1 !important; font-weight: bold !important; }                                       /* Generic.Strong */
-  .gu     { color: $solar-violet !important; }                                          /* Generic.Subheading */
-  //.gt     { color: #aa0000 }                                          /* Generic.Traceback */
-  .kc     { color: $solar-green !important; font-weight: bold !important; }                       /* Keyword.Constant */
-  .kd     { color: $solar-blue !important; }                       /* Keyword.Declaration */
-  .kp     { color: $solar-orange !important; font-weight: bold !important; }                       /* Keyword.Pseudo */
-  .kr     { color: $solar-magenta !important; font-weight: bold !important; }                       /* Keyword.Reserved */
-  .kt     { color: $solar-cyan !important; }                       /* Keyword.Type */
-  .n      { color: $solar-blue !important; }
-  .na     { color: $solar-blue !important; }                                          /* Name.Attribute */
-  .nb     { color: $solar-green !important; }                                          /* Name.Builtin */
-  .nc     { color: $solar-magenta !important;}                                                   /* Name.Class */
-  .no     { color: $solar-yellow !important; }                                          /* Name.Constant */
-  //.ni     { color: #800080 }                                          /* Name.Entity */
-  .nl     { color: $solar-green !important; }
-  .ne     { color: $solar-blue !important; font-weight: bold !important; }                       /* Name.Exception */
-  .nf     { color: $solar-blue !important; font-weight: bold !important; }                       /* Name.Function */
-  .nn     { color: $solar-yellow !important; }                                          /* Name.Namespace */
-  .nt     { color: $solar-blue !important; font-weight: bold !important; }                                          /* Name.Tag */
-  .nx     { color: $solar-yellow !Important; }
-  //.bp     { color: #999999 }                                          /* Name.Builtin.Pseudo */
-  //.vc     { color: #008080 }                                          /* Name.Variable.Class */
-  .vg     { color: $solar-blue !important; }                                          /* Name.Variable.Global */
-  .vi     { color: $solar-blue !important; }                                          /* Name.Variable.Instance */
-  .nv     { color: $solar-blue !important; }                                          /* Name.Variable */
-  //.w      { color: #bbbbbb }                                          /* Text.Whitespace */
-  .mf     { color: $solar-cyan !important; }                                          /* Literal.Number.Float */
-  .m      { color: $solar-cyan !important; }                                          /* Literal.Number */
-  .mh     { color: $solar-cyan !important; }                                          /* Literal.Number.Hex */
-  .mi     { color: $solar-cyan !important; }                                          /* Literal.Number.Integer */
-  //.mo     { color: #009999 }                                          /* Literal.Number.Oct */
-  .s      { color: $solar-cyan !important; }                                             /* Literal.String */
-  //.sb     { color: #d14 }                                             /* Literal.String.Backtick */
-  //.sc     { color: #d14 }                                             /* Literal.String.Char */
-  .sd     { color: $solar-cyan !important; }                                             /* Literal.String.Doc */
-  .s2     { color: $solar-cyan !important; }                                             /* Literal.String.Double */
-  .se     { color: $solar-red !important; }                                             /* Literal.String.Escape */
-  //.sh     { color: #d14 }                                             /* Literal.String.Heredoc */
-  .si     { color: $solar-blue !important; }                                             /* Literal.String.Interpol */
-  //.sx     { color: #d14 }                                             /* Literal.String.Other */
-  .sr     { color: $solar-cyan !important; }                                          /* Literal.String.Regex */
-  .s1     { color: $solar-cyan !important; }                                             /* Literal.String.Single */
-  //.ss     { color: #990073 }                                          /* Literal.String.Symbol */
-  //.il     { color: #009999 }                                          /* Literal.Number.Integer.Long */
-  div { .gd, .gd .x, .gi, .gi .x { display: inline-block; width: 100%; }}
-}
-
-.highlight, .gist-highlight {
-  pre { background: none; @include border-radius(0px); border: none; padding: 0; margin-bottom: 0; }
-  margin-bottom: 1.8em;
-  background: $base03;
-  overflow-y: hidden;
-  overflow-x: auto;
-}
-
-$solar-scroll-bg: rgba(#fff, .15);
-$solar-scroll-thumb: rgba(#fff, .2);
-@if $solarized == light {
-  $solar-scroll-bg: rgba(#000, .15);
-  $solar-scroll-thumb: rgba(#000, .15);
-}
-
-pre, .highlight, .gist-highlight {
-  &::-webkit-scrollbar {  height: .5em; background: $solar-scroll-bg; }
-  &::-webkit-scrollbar-thumb:horizontal { background: $solar-scroll-thumb;  -webkit-border-radius: 4px; border-radius: 4px }
-}
-
-.highlight code { 
-  @extend .pre-code; background: #000;
-}
-figure.code {
-  background: none;
-  padding: 0;
-  border: 0;
-  margin-bottom: 1.5em;
-  pre { margin-bottom: 0; }
-  figcaption {
-    position: relative;
-    @extend .code-title;
-    a { @extend .download-source; }
-  }
-  .highlight {
-    margin-bottom: 0;
-  }
-}
-
-.code-title {
-  text-align: center;
-  font-size: 13px;
-  line-height: 2em;
-  text-shadow: #cbcccc 0 1px 0;
-  color: #474747;
-  font-weight: normal;
-  margin-bottom: 0;
-  @include border-top-radius(5px);
-  font-family: "Helvetica Neue", Arial, "Lucida Grande", "Lucida Sans Unicode", Lucida, sans-serif;
-  background: #aaaaaa image-url("code_bg.png") top repeat-x;
-  border: 1px solid #565656;
-  border-top-color: #cbcbcb;
-  border-left-color: #a5a5a5;
-  border-right-color: #a5a5a5;
-  border-bottom: 0;
-}
-
-.download-source {
-  position: absolute; right: .8em;
-  @include hover-link;
-  color: #666 !important;
-  z-index: 1;
-  font-size: 13px;
-  text-shadow: #cbcccc 0 1px 0;
-  padding-left: 3em;
-}
diff --git a/.themes/classic/sass/partials/sidebar/_base.scss b/.themes/classic/sass/partials/sidebar/_base.scss
deleted file mode 100644
index 5441304e..00000000
--- a/.themes/classic/sass/partials/sidebar/_base.scss
+++ /dev/null
@@ -1,106 +0,0 @@
-.side-shadow-border {
-  @include box-shadow(lighten($sidebar-bg, 5) 0 1px);
-}
-aside.sidebar {
-  overflow: hidden;
-  color: $sidebar-color;
-  text-shadow: lighten($sidebar-bg, 8) 0 1px;
-  a { @extend .force-wrap; }
-  section {
-    @extend .sans;
-    font-size: .8em;
-    line-height: 1.4em;
-    margin-bottom: 1.5em;
-    h1 {
-      margin: 1.5em 0 0;
-      padding-bottom: .2em;
-      border-bottom: 1px solid $sidebar-border;
-      @extend .side-shadow-border;
-      + p {
-        padding-top: .4em;
-      }
-    }
-  }
-  img {
-    @extend .flex-content;
-    @extend .basic-alignment;
-    @include shadow-box($border: #fff .3em solid);
-  }
-  ul {
-    margin-bottom: 0.5em;
-    margin-left: 0;
-  }
-  li {
-    list-style: none;
-    padding: .5em 0;
-    margin: 0;
-    border-bottom: 1px solid $sidebar-border;
-    @extend .side-shadow-border;
-    p:last-child {
-      margin-bottom: 0;
-    }
-  }
-  a {
-    color: inherit;
-    @include transition(color .5s);
-  }
-  &:hover a {
-    color: $sidebar-link-color;
-    &:hover { color: $sidebar-link-color-hover; }
-  }
-}
-.aside-alt-link {
-  color: $sidebar-link-color-subdued;
-  &:hover {
-    color: $sidebar-link-color-subdued-hover;
-  }
-}
-
-@media only screen and (min-width: 768px) {
-  .toggle-sidebar {
-    outline: none;
-    position: absolute; right: -10px; top: 0; bottom: 0;
-    display: inline-block;
-    text-decoration: none;
-    color: mix($text-color-light, $sidebar-bg);
-    width: 9px;
-    cursor: pointer;
-    &:hover {
-      background: mix($sidebar-border, $sidebar-bg);
-      @include background(linear-gradient(left, rgba($sidebar-border, .5), rgba($sidebar-border, 0)));
-    }
-    &:after {
-      position: absolute; right: -11px; top: 0;
-      width: 20px;
-      font-size: 1.2em;
-      line-height: 1.1em;
-      padding-bottom: .15em;
-      @include border-bottom-right-radius(.3em);
-      text-align: center;
-      background: $main-bg $noise-bg;
-      border-bottom: 1px solid $sidebar-border;
-      border-right: 1px solid $sidebar-border;
-      content: "\00BB";
-      text-indent: -1px;
-    }
-    .collapse-sidebar & {
-      text-indent: 0px;
-      right: -20px;
-      width: 19px;
-      &:hover {
-        background: mix($sidebar-border, $sidebar-bg);
-      }
-      &:after {
-        border-left: 1px solid $sidebar-border;
-        text-shadow: #fff 0 1px;
-        content: "\00AB";
-        left: 0px; right: 0;
-        text-align: center;
-        text-indent: 0;
-        border: 0;
-        border-right-width: 0;
-        background: none;
-      }
-    }
-  }
-}
diff --git a/.themes/classic/sass/partials/sidebar/_delicious.scss b/.themes/classic/sass/partials/sidebar/_delicious.scss
deleted file mode 100644
index e962702e..00000000
--- a/.themes/classic/sass/partials/sidebar/_delicious.scss
+++ /dev/null
@@ -1,4 +0,0 @@
-.delicious-posts {
-  a.delicious-link { margin-bottom: .5em; display: block; }
-  p { font-size: 1em; }
-}
diff --git a/.themes/classic/sass/partials/sidebar/_googleplus.scss b/.themes/classic/sass/partials/sidebar/_googleplus.scss
deleted file mode 100644
index c2a693ee..00000000
--- a/.themes/classic/sass/partials/sidebar/_googleplus.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-.googleplus {
-  h1 {
-       -moz-box-shadow: none !important;
-    -webkit-box-shadow: none !important;
-         -o-box-shadow: none !important;
-            box-shadow: none !important;
-    border-bottom: 0px none !important;
-  }
-  a {
-    text-decoration: none;
-    white-space: normal !important;
-    line-height: 32px;
-
-    img {
-      float: left;
-      margin-right: 0.5em;
-      border: 0 none;
-    }
-  }
-}
-
-.googleplus-hidden {
-  position: absolute;
-  top: -1000em;
-  left: -1000em;
-}
diff --git a/.themes/classic/sass/partials/sidebar/_pinboard.scss b/.themes/classic/sass/partials/sidebar/_pinboard.scss
deleted file mode 100644
index 9f9ab461..00000000
--- a/.themes/classic/sass/partials/sidebar/_pinboard.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-#pinboard_linkroll {
-  .pin-title, .pin-description {
-    display: block;
-    margin-bottom: .5em;
-  }
-  .pin-tag {
-    @include hover-link;
-    @extend .aside-alt-link;
-    &:after { content: ','; }
-    &:last-child:after { content: ''; }
-  }
-}
diff --git a/.themes/classic/sass/plugins/_plugins.scss b/.themes/classic/sass/plugins/_plugins.scss
deleted file mode 100644
index 3b4ba0b8..00000000
--- a/.themes/classic/sass/plugins/_plugins.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-/*
-  Add plugin stylesheets to this directory and they will be automatically
-  Imported. Load order is alphabetical and styles can be overriden in
-  custom/_style.scss which is loaded after all plugin stylesheets.
-*/
-
diff --git a/.themes/classic/sass/screen.scss b/.themes/classic/sass/screen.scss
deleted file mode 100644
index 75eac0a2..00000000
--- a/.themes/classic/sass/screen.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-@import "compass";
-@include global-reset;
-
-@import "custom/colors";
-@import "custom/fonts";
-@import "custom/layout";
-@import "base";
-@import "partials";
-@import "plugins/**/*";
-@import "custom/styles";
diff --git a/.themes/classic/source/_includes/after_footer.html b/.themes/classic/source/_includes/after_footer.html
deleted file mode 100644
index 08b8e340..00000000
--- a/.themes/classic/source/_includes/after_footer.html
+++ /dev/null
@@ -1,5 +0,0 @@
-{% include disqus.html %}
-{% include facebook_like.html %}
-{% include google_plus_one.html %}
-{% include twitter_sharing.html %}
-{% include custom/after_footer.html %}
diff --git a/.themes/classic/source/_includes/archive_post.html b/.themes/classic/source/_includes/archive_post.html
deleted file mode 100644
index 210dbbbe..00000000
--- a/.themes/classic/source/_includes/archive_post.html
+++ /dev/null
@@ -1,8 +0,0 @@
-{% capture category %}{{ post.categories | size }}{% endcapture %}
-<h1><a href="{{ root_url }}{{ post.url }}">{% if site.titlecase %}{{ post.title | titlecase }}{% else %}{{ post.title }}{% endif %}</a></h1>
-<time datetime="{{ post.date | datetime | date_to_xmlschema }}" pubdate>{{ post.date | date: "<span class='month'>%b</span> <span class='day'>%d</span> <span class='year'>%Y</span>"}}</time>
-{% if category != '0' %}
-<footer>
-  <span class="categories">posted in {{ post.categories | category_links }}</span>
-</footer>
-{% endif %}
diff --git a/.themes/classic/source/_includes/article.html b/.themes/classic/source/_includes/article.html
deleted file mode 100644
index 84279977..00000000
--- a/.themes/classic/source/_includes/article.html
+++ /dev/null
@@ -1,29 +0,0 @@
-{% unless page.no_header %}
-  <header>
-    {% if index %}
-      <h1 class="entry-title"><a href="{{ root_url }}{{ post.url }}">{% if site.titlecase %}{{ post.title | titlecase }}{% else %}{{ post.title }}{% endif %}</a></h1>
-    {% else %}
-      <h1 class="entry-title">{% if site.titlecase %}{{ page.title | titlecase }}{% else %}{{ page.title }}{% endif %}</h1>
-    {% endif %}
-    {% unless page.meta == false %}
-      <p class="meta">
-        {% include post/date.html %}{{ time }}
-        {% if site.disqus_short_name and page.comments != false and post.comments != false and site.disqus_show_comment_count == true %}
-           | <a href="{% if index %}{{ root_url }}{{ post.url }}{% endif %}#disqus_thread"
-             data-disqus-identifier="{% if post.meta.disqus_id %}{{ post.meta.disqus_id }}{% else %}{{ site.url }}{{ post.url }}{% endif %}">Comments</a>
-        {% endif %}
-      </p>
-    {% endunless %}
-  </header>
-{% endunless %}
-{% if index %}
-  <div class="entry-content">{{ content | excerpt }}</div>
-  {% capture excerpted %}{{ content | has_excerpt }}{% endcapture %}
-  {% if excerpted == 'true' %}
-    <footer>
-      <a rel="full-article" href="{{ root_url }}{{ post.url }}">{{ site.excerpt_link }}</a>
-    </footer>
-  {% endif %}
-{% else %}
-<div class="entry-content">{{ content }}</div>
-{% endif %}
diff --git a/.themes/classic/source/_includes/asides/delicious.html b/.themes/classic/source/_includes/asides/delicious.html
deleted file mode 100644
index 115cdcbc..00000000
--- a/.themes/classic/source/_includes/asides/delicious.html
+++ /dev/null
@@ -1,8 +0,0 @@
-{% if site.delicious_user %}
-<section>
-  <h1>On Delicious</h1>
-  <div id="delicious"></div>
-  <script type="text/javascript" src="http://feeds.delicious.com/v2/json/{{ site.delicious_user }}?count={{ site.delicious_count }}&amp;sort=date&amp;callback=renderDeliciousLinks"></script>
-  <p><a href="http://delicious.com/{{ site.delicious_user }}">My Delicious Bookmarks &raquo;</a></p>
-</section>
-{% endif %}
\ No newline at end of file
diff --git a/.themes/classic/source/_includes/asides/github.html b/.themes/classic/source/_includes/asides/github.html
deleted file mode 100644
index b0bf9596..00000000
--- a/.themes/classic/source/_includes/asides/github.html
+++ /dev/null
@@ -1,30 +0,0 @@
-{% if site.github_user %}
-<section>
-  <h1>GitHub Repos</h1>
-  <ul id="gh_repos">
-    <li class="loading">Status updating...</li>
-  </ul>
-  {% if site.github_show_profile_link %}
-  <a href="https://github.com/{{site.github_user}}">@{{site.github_user}}</a> on GitHub
-  {% endif %}
-  <script type="text/javascript">
-    $(document).ready(function(){
-        if (!window.jXHR){
-            var jxhr = document.createElement('script');
-            jxhr.type = 'text/javascript';
-            jxhr.src = '{{ root_url}}/javascripts/libs/jXHR.js';
-            var s = document.getElementsByTagName('script')[0];
-            s.parentNode.insertBefore(jxhr, s);
-        }
-
-        github.showRepos({
-            user: '{{site.github_user}}',
-            count: {{site.github_repo_count}},
-            skip_forks: {{site.github_skip_forks}},
-            target: '#gh_repos'
-        });
-    });
-  </script>
-  <script src="{{ root_url }}/javascripts/github.js" type="text/javascript"> </script>
-</section>
-{% endif %}
diff --git a/.themes/classic/source/_includes/asides/googleplus.html b/.themes/classic/source/_includes/asides/googleplus.html
deleted file mode 100644
index 00a0aa85..00000000
--- a/.themes/classic/source/_includes/asides/googleplus.html
+++ /dev/null
@@ -1,11 +0,0 @@
-{% if site.googleplus_user %}
-<section class="googleplus{% if site.googleplus_hidden %} googleplus-hidden{% endif %}">
-  <h1>
-    <a href="https://plus.google.com/{{ site.googleplus_user }}?rel=author">
-      <img src="http://www.google.com/images/icons/ui/gprofile_button-32.png" width="32" height="32">
-      Google+
-    </a>
-  </h1>
-</section>
-{% endif %}
-
diff --git a/.themes/classic/source/_includes/asides/pinboard.html b/.themes/classic/source/_includes/asides/pinboard.html
deleted file mode 100644
index c89c3e7b..00000000
--- a/.themes/classic/source/_includes/asides/pinboard.html
+++ /dev/null
@@ -1,19 +0,0 @@
-{% if site.pinboard_user %}
-<section>
-  <h1>My Pinboard</h1>
-  <ul id="pinboard_linkroll">Fetching linkroll...</ul>
-  <p><a href="http://pinboard.in/u:{{ site.pinboard_user }}">My Pinboard Bookmarks &raquo;</a></p>
-</section>
-<script type="text/javascript">
-  var linkroll = 'pinboard_linkroll'; //id target for pinboard list
-  var pinboard_user = "{{ site.pinboard_user }}"; //id target for pinboard list
-  var pinboard_count = {{ site.pinboard_count }}; //id target for pinboard list
-  (function(){
-    var pinboardInit = document.createElement('script');
-    pinboardInit.type = 'text/javascript';
-    pinboardInit.async = true;
-    pinboardInit.src = '{{ root_url }}/javascripts/pinboard.js';
-    document.getElementsByTagName('head')[0].appendChild(pinboardInit);
-  })();
-</script>
-{% endif %}
diff --git a/.themes/classic/source/_includes/asides/recent_posts.html b/.themes/classic/source/_includes/asides/recent_posts.html
deleted file mode 100644
index 4b108474..00000000
--- a/.themes/classic/source/_includes/asides/recent_posts.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<section>
-  <h1>Recent Posts</h1>
-  <ul id="recent_posts">
-    {% for post in site.posts limit: site.recent_posts %}
-      <li class="post">
-        <a href="{{ root_url }}{{ post.url }}">{% if site.titlecase %}{{ post.title | titlecase }}{% else %}{{ post.title }}{% endif %}</a>
-      </li>
-    {% endfor %}
-  </ul>
-</section>
diff --git a/.themes/classic/source/_includes/custom/after_footer.html b/.themes/classic/source/_includes/custom/after_footer.html
deleted file mode 100644
index bce25dd9..00000000
--- a/.themes/classic/source/_includes/custom/after_footer.html
+++ /dev/null
@@ -1,3 +0,0 @@
-{% comment %}
-  Add content to be output at the bottom of each page. (You might use this for analytics scripts, for example)
-{% endcomment %}
diff --git a/.themes/classic/source/_includes/custom/asides/about.html b/.themes/classic/source/_includes/custom/asides/about.html
deleted file mode 100644
index 59d309e4..00000000
--- a/.themes/classic/source/_includes/custom/asides/about.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<section>
-  <h1>About Me</h1>
-  <p>A little something about me.</p>
-</section>
diff --git a/.themes/classic/source/_includes/custom/category_feed.xml b/.themes/classic/source/_includes/custom/category_feed.xml
deleted file mode 100644
index 8c93ed39..00000000
--- a/.themes/classic/source/_includes/custom/category_feed.xml
+++ /dev/null
@@ -1,27 +0,0 @@
----
-layout: null
----
-<?xml version="1.0" encoding="utf-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom">
-
-  <title><![CDATA[{% if site.titlecase %}{{ page.title | titlecase | cdata_escape }}{% else %}{{ page.title | cdata_escape }}{% endif %} | {{ site.title | cdata_escape }}]]></title>
-  <link href="{{ site.url }}/{{ page.feed_url }}" rel="self"/>
-  <link href="{{ site.url }}/"/>
-  <updated>{{ site.time | date_to_xmlschema }}</updated>
-  <id>{{ site.url }}/</id>
-  <author>
-    <name><![CDATA[{{ site.author | strip_html }}]]></name>
-    {% if site.email %}<email><![CDATA[{{ site.email }}]]></email>{% endif %}
-  </author>
-  <generator uri="http://octopress.org/">Octopress</generator>
-
-  {% for post in site.categories[page.category] limit: 5 %}
-  <entry>
-    <title type="html"><![CDATA[{% if site.titlecase %}{{ post.title | titlecase | cdata_escape }}{% else %}{{ post.title | cdata_escape }}{% endif %}]]></title>
-    <link href="{{ site.url }}{{ post.url }}"/>
-    <updated>{{ post.date | date_to_xmlschema }}</updated>
-    <id>{{ site.url }}{{ post.id }}</id>
-    <content type="html"><![CDATA[{{ post.content | expand_urls: site.url | markdownify | cdata_escape }}]]></content>
-  </entry>
-  {% endfor %}
-</feed>
diff --git a/.themes/classic/source/_includes/custom/footer.html b/.themes/classic/source/_includes/custom/footer.html
deleted file mode 100644
index e12f0678..00000000
--- a/.themes/classic/source/_includes/custom/footer.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<p>
-  Copyright &copy; {{ site.time | date: "%Y" }} - {{ site.author }} -
-  <span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
-</p>
diff --git a/.themes/classic/source/_includes/custom/head.html b/.themes/classic/source/_includes/custom/head.html
deleted file mode 100644
index 824a41e7..00000000
--- a/.themes/classic/source/_includes/custom/head.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<!--Fonts from Google"s Web font directory at http://google.com/webfonts -->
-<link href="//fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css">
-<link href="//fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css">
diff --git a/.themes/classic/source/_includes/custom/header.html b/.themes/classic/source/_includes/custom/header.html
deleted file mode 100644
index 35f9c059..00000000
--- a/.themes/classic/source/_includes/custom/header.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<hgroup>
-  <h1><a href="{{ root_url }}/">{{ site.title }}</a></h1>
-  {% if site.subtitle %}
-    <h2>{{ site.subtitle }}</h2>
-  {% endif %}
-</hgroup>
diff --git a/.themes/classic/source/_includes/custom/navigation.html b/.themes/classic/source/_includes/custom/navigation.html
deleted file mode 100644
index d6bd4246..00000000
--- a/.themes/classic/source/_includes/custom/navigation.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<ul class="main-navigation">
-  <li><a href="{{ root_url }}/">Blog</a></li>
-  <li><a href="{{ root_url }}/blog/archives">Archives</a></li>
-</ul>
diff --git a/.themes/classic/source/_includes/disqus.html b/.themes/classic/source/_includes/disqus.html
deleted file mode 100644
index 49c6a29c..00000000
--- a/.themes/classic/source/_includes/disqus.html
+++ /dev/null
@@ -1,21 +0,0 @@
-{% comment %} Load script if disquss comments are enabled and `page.comments` is either empty (index) or set to true {% endcomment %}
-{% if site.disqus_short_name and page.comments != false %}
-<script type="text/javascript">
-      var disqus_shortname = '{{ site.disqus_short_name }}';
-      {% if page.comments == true %}
-        {% comment %} `page.comments` can be only be set to true on pages/posts, so we embed the comments here. {% endcomment %}
-        // var disqus_developer = 1;
-        var disqus_identifier = '{{ site.url }}{{ page.url }}';
-        var disqus_url = '{{ site.url }}{{ page.url }}';
-        var disqus_script = 'embed.js';
-      {% else %}
-        {% comment %} As `page.comments` is empty, we must be on the index page. {% endcomment %}
-        var disqus_script = 'count.js';
-      {% endif %}
-    (function () {
-      var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
-      dsq.src = '//' + disqus_shortname + '.disqus.com/' + disqus_script;
-      (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
-    }());
-</script>
-{% endif %}
diff --git a/.themes/classic/source/_includes/facebook_like.html b/.themes/classic/source/_includes/facebook_like.html
deleted file mode 100644
index d263e6d2..00000000
--- a/.themes/classic/source/_includes/facebook_like.html
+++ /dev/null
@@ -1,10 +0,0 @@
-{% if site.facebook_like %}
-<div id="fb-root"></div>
-<script>(function(d, s, id) {
-  var js, fjs = d.getElementsByTagName(s)[0];
-  if (d.getElementById(id)) {return;}
-  js = d.createElement(s); js.id = id; js.async = true;
-  js.src = "//connect.facebook.net/en_US/all.js#appId=212934732101925&xfbml=1";
-  fjs.parentNode.insertBefore(js, fjs);
-}(document, 'script', 'facebook-jssdk'));</script>
-{% endif %}
diff --git a/.themes/classic/source/_includes/footer.html b/.themes/classic/source/_includes/footer.html
deleted file mode 100644
index 3a8c7687..00000000
--- a/.themes/classic/source/_includes/footer.html
+++ /dev/null
@@ -1 +0,0 @@
-{% include custom/footer.html %}
diff --git a/.themes/classic/source/_includes/google_analytics.html b/.themes/classic/source/_includes/google_analytics.html
deleted file mode 100644
index 4d4d5969..00000000
--- a/.themes/classic/source/_includes/google_analytics.html
+++ /dev/null
@@ -1,13 +0,0 @@
-{% if site.google_analytics_tracking_id %}
-  <script type="text/javascript">
-    var _gaq = _gaq || [];
-    _gaq.push(['_setAccount', '{{ site.google_analytics_tracking_id }}']);
-    _gaq.push(['_trackPageview']);
-
-    (function() {
-      var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
-      ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
-      var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
-    })();
-  </script>
-{% endif %}
diff --git a/.themes/classic/source/_includes/google_plus_one.html b/.themes/classic/source/_includes/google_plus_one.html
deleted file mode 100644
index b69ddaeb..00000000
--- a/.themes/classic/source/_includes/google_plus_one.html
+++ /dev/null
@@ -1,9 +0,0 @@
-{% if site.google_plus_one %}
-  <script type="text/javascript">
-    (function() {
-      var script = document.createElement('script'); script.type = 'text/javascript'; script.async = true;
-      script.src = 'https://apis.google.com/js/plusone.js';
-      var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(script, s);
-    })();
-  </script>
-{% endif %}
diff --git a/.themes/classic/source/_includes/head.html b/.themes/classic/source/_includes/head.html
deleted file mode 100644
index 6b5412ca..00000000
--- a/.themes/classic/source/_includes/head.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
-<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
-<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
-<head>
-  <meta charset="utf-8">
-  <title>{% if page.title %}{% if site.titlecase %}{{ page.title | titlecase }}{% else %}{{ page.title }}{% endif %} - {% endif %}{{ site.title }}</title>
-  <meta name="author" content="{{ site.author }}">
-
-  {% capture description %}{% if page.description %}{{ page.description }}{% else %}{{ content | raw_content }}{% endif %}{% endcapture %}
-  <meta name="description" content="{{ description | strip_html | condense_spaces | truncate:150 }}">
-  {% if page.keywords %}<meta name="keywords" content="{{ page.keywords }}">{% endif %}
-
-  <!-- http://t.co/dKP3o1e -->
-  <meta name="HandheldFriendly" content="True">
-  <meta name="MobileOptimized" content="320">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-
-  {% capture canonical %}{{ site.url }}{% if site.permalink contains '.html' %}{{ page.url }}{% else %}{{ page.url | remove:'index.html' | strip_slash }}{% endif %}{% endcapture %}
-  <link rel="canonical" href="{{ canonical }}">
-  <link href="{{ root_url }}/favicon.png" rel="icon">
-  <link href="{{ root_url }}/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
-  <link href="{{ site.subscribe_rss }}" rel="alternate" title="{{site.title}}" type="application/atom+xml">
-  <script src="{{ root_url }}/javascripts/modernizr-2.0.js"></script>
-  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
-  <script>!window.jQuery && document.write(unescape('%3Cscript src="./javascripts/libs/jquery.min.js"%3E%3C/script%3E'))</script>
-  <script src="{{ root_url }}/javascripts/octopress.js" type="text/javascript"></script>
-  {% include custom/head.html %}
-  {% include google_analytics.html %}
-</head>
diff --git a/.themes/classic/source/_includes/header.html b/.themes/classic/source/_includes/header.html
deleted file mode 100644
index 524de651..00000000
--- a/.themes/classic/source/_includes/header.html
+++ /dev/null
@@ -1 +0,0 @@
-{% include custom/header.html %}
diff --git a/.themes/classic/source/_includes/navigation.html b/.themes/classic/source/_includes/navigation.html
deleted file mode 100644
index 2f0e6280..00000000
--- a/.themes/classic/source/_includes/navigation.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<ul class="subscription" data-subscription="rss{% if site.subscribe_email %} email{% endif %}">
-  <li><a href="{{ site.subscribe_rss }}" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
-  {% if site.subscribe_email %}
-    <li><a href="{{ site.subscribe_email }}" rel="subscribe-email" title="subscribe via email">Email</a></li>
-  {% endif %}
-</ul>
-  {% if site.simple_search %}
-<form action="{{ site.simple_search }}" method="get">
-  <fieldset role="search">
-    <input type="hidden" name="q" value="site:{{ site.url | shorthand_url }}" />
-    <input class="search" type="text" name="q" results="0" placeholder="Search"/>
-  </fieldset>
-</form>
-  {% endif %}
-{% include custom/navigation.html %}
diff --git a/.themes/classic/source/_includes/post/author.html b/.themes/classic/source/_includes/post/author.html
deleted file mode 100644
index 83dd6a89..00000000
--- a/.themes/classic/source/_includes/post/author.html
+++ /dev/null
@@ -1,8 +0,0 @@
-{% if post.author %}
-  {% assign author = post.author %}
-{% elsif page.author %}
-  {% assign author = page.author %}
-{% else %}
-  {% assign author = site.author %}
-{% endif %}
-{% if author %}<span class="byline author vcard">Posted by <span class="fn">{{ author }}</span></span>{% endif %}
diff --git a/.themes/classic/source/_includes/post/categories.html b/.themes/classic/source/_includes/post/categories.html
deleted file mode 100644
index 4a98b29d..00000000
--- a/.themes/classic/source/_includes/post/categories.html
+++ /dev/null
@@ -1,10 +0,0 @@
-{% capture category %}{% if post %}{{ post.categories | category_links | size }}{% else %}{{ page.categories | category_links | size }}{% endif %}{% endcapture %}
-{% unless category == '0' %}
-<span class="categories">
-  {% if post %}
-    {{ post.categories | category_links }}
-  {% else %}
-    {{ page.categories | category_links }}
-  {% endif %}
-</span>
-{% endunless %}
diff --git a/.themes/classic/source/_includes/post/date.html b/.themes/classic/source/_includes/post/date.html
deleted file mode 100644
index a86953c2..00000000
--- a/.themes/classic/source/_includes/post/date.html
+++ /dev/null
@@ -1,5 +0,0 @@
-{% if page.date %}{% capture time %}{{ page.date_time_html }}{% endcapture %}{% endif %}
-{% if post.date %}{% capture time %}{{ post.date_time_html }}{% endcapture %}{% endif %}
-
-{% if page.updated %}{% capture updated %}{{ page.date_time_updated_html }}{% endcapture %}{% endif %}
-{% if post.updated %}{% capture updated %}{{ post.date_time_updated_html }}{% endcapture %}{% endif %}
diff --git a/.themes/classic/source/_includes/post/disqus_thread.html b/.themes/classic/source/_includes/post/disqus_thread.html
deleted file mode 100644
index b1acd8cc..00000000
--- a/.themes/classic/source/_includes/post/disqus_thread.html
+++ /dev/null
@@ -1 +0,0 @@
-<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
diff --git a/.themes/classic/source/_includes/post/sharing.html b/.themes/classic/source/_includes/post/sharing.html
deleted file mode 100644
index d639faa1..00000000
--- a/.themes/classic/source/_includes/post/sharing.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<div class="sharing">
-  {% if site.twitter_tweet_button %}
-  <a href="//twitter.com/share" class="twitter-share-button" data-url="{{ site.url }}{{ page.url }}" data-via="{{ site.twitter_user }}" data-counturl="{{ site.url }}{{ page.url }}" >Tweet</a>
-  {% endif %}
-  {% if site.google_plus_one %}
-  <div class="g-plusone" data-size="{{ site.google_plus_one_size }}"></div>
-  {% endif %}
-  {% if site.facebook_like %}
-    <div class="fb-like" data-send="true" data-width="450" data-show-faces="false"></div>
-  {% endif %}
-</div>
diff --git a/.themes/classic/source/_includes/twitter_sharing.html b/.themes/classic/source/_includes/twitter_sharing.html
deleted file mode 100644
index 7cd5fbc2..00000000
--- a/.themes/classic/source/_includes/twitter_sharing.html
+++ /dev/null
@@ -1,11 +0,0 @@
-{% if site.twitter_follow_button or site.twitter_tweet_button %}
-  <script type="text/javascript">
-    (function(){
-      var twitterWidgets = document.createElement('script');
-      twitterWidgets.type = 'text/javascript';
-      twitterWidgets.async = true;
-      twitterWidgets.src = '//platform.twitter.com/widgets.js';
-      document.getElementsByTagName('head')[0].appendChild(twitterWidgets);
-    })();
-  </script>
-{% endif %}
diff --git a/.themes/classic/source/_layouts/category_index.html b/.themes/classic/source/_layouts/category_index.html
deleted file mode 100644
index 85a63072..00000000
--- a/.themes/classic/source/_layouts/category_index.html
+++ /dev/null
@@ -1,17 +0,0 @@
----
-layout: page
-footer: false
----
-
-<div id="blog-archives" class="category">
-{% for post in site.categories[page.category] %}
-{% capture this_year %}{{ post.date | date: "%Y" }}{% endcapture %}
-{% unless year == this_year %}
-  {% assign year = this_year %}
-  <h2>{{ year }}</h2>
-{% endunless %}
-<article>
-  {% include archive_post.html %}
-</article>
-{% endfor %}
-</div>
diff --git a/.themes/classic/source/_layouts/default.html b/.themes/classic/source/_layouts/default.html
deleted file mode 100644
index f23b07b8..00000000
--- a/.themes/classic/source/_layouts/default.html
+++ /dev/null
@@ -1,14 +0,0 @@
-{% capture root_url %}{{ site.root | strip_slash }}{% endcapture %}
-{% include head.html %}
-<body {% if page.body_id %} id="{{ page.body_id }}" {% endif %} {% if page.sidebar == false %} class="no-sidebar" {% endif %} {% if page.sidebar == 'collapse' or site.sidebar == 'collapse' %} class="collapse-sidebar sidebar-footer" {% endif %}>
-  <header role="banner">{% include header.html %}</header>
-  <nav role="navigation">{% include navigation.html %}</nav>
-  <div id="main">
-    <div id="content">
-      {{ content | expand_urls: root_url }}
-    </div>
-  </div>
-  <footer role="contentinfo">{% include footer.html %}</footer>
-  {% include after_footer.html %}
-</body>
-</html>
diff --git a/.themes/classic/source/_layouts/page.html b/.themes/classic/source/_layouts/page.html
deleted file mode 100644
index 8ba6ec94..00000000
--- a/.themes/classic/source/_layouts/page.html
+++ /dev/null
@@ -1,42 +0,0 @@
----
-layout: default
----
-
-<div>
-<article role="article">
-  {% if page.title %}
-  <header>
-    <h1 class="entry-title">{% if site.titlecase %}{{ page.title | titlecase }}{% else %}{{ page.title }}{% endif %}</h1>
-    {% if page.date %}<p class="meta">{% include post/date.html %}{{ time }}</p>{% endif %}
-  </header>
-  {% endif %}
-  {{ content }}
-  {% unless page.footer == false %}
-    <footer>
-      {% if page.date or page.author %}<p class="meta">
-        {% if page.author %}{% include post/author.html %}{% endif %}
-        {% include post/date.html %}{% if updated %}{{ updated }}{% else %}{{ time }}{% endif %}
-        {% if page.categories %}{% include post/categories.html %}{% endif %}
-      </p>{% endif %}
-      {% unless page.sharing == false %}
-        {% include post/sharing.html %}
-      {% endunless %}
-    </footer>
-  {% endunless %}
-</article>
-{% if site.disqus_short_name and page.comments == true %}
-  <section>
-    <h1>Comments</h1>
-    <div id="disqus_thread" aria-live="polite">{% include post/disqus_thread.html %}</div>
-  </section>
-{% endif %}
-</div>
-{% unless page.sidebar == false %}
-<aside class="sidebar">
-  {% if site.page_asides.size %}
-    {% include_array page_asides %}
-  {% else %}
-    {% include_array default_asides %}
-  {% endif %}
-</aside>
-{% endunless %}
diff --git a/.themes/classic/source/_layouts/post.html b/.themes/classic/source/_layouts/post.html
deleted file mode 100644
index b450681b..00000000
--- a/.themes/classic/source/_layouts/post.html
+++ /dev/null
@@ -1,43 +0,0 @@
----
-layout: default
-single: true
----
-
-<div>
-<article class="hentry" role="article">
-  {% include article.html %}
-  <footer>
-    <p class="meta">
-      {% include post/author.html %}
-      {% include post/date.html %}{{ time }}{% if updated %} {{ updated }}{% endif %}
-      {% include post/categories.html %}
-    </p>
-    {% unless page.sharing == false %}
-      {% include post/sharing.html %}
-    {% endunless %}
-    <p class="meta">
-      {% if page.previous.url %}
-        <a class="basic-alignment left" href="{{page.previous.url}}" title="Previous Post: {{page.previous.title}}">&laquo; {{page.previous.title}}</a>
-      {% endif %}
-      {% if page.next.url %}
-        <a class="basic-alignment right" href="{{page.next.url}}" title="Next Post: {{page.next.title}}">{{page.next.title}} &raquo;</a>
-      {% endif %}
-    </p>
-  </footer>
-</article>
-{% if site.disqus_short_name and page.comments == true %}
-  <section>
-    <h1>Comments</h1>
-    <div id="disqus_thread" aria-live="polite">{% include post/disqus_thread.html %}</div>
-  </section>
-{% endif %}
-</div>
-{% unless page.sidebar == false %}
-<aside class="sidebar">
-  {% if site.post_asides.size %}
-    {% include_array post_asides %}
-  {% else %}
-    {% include_array default_asides %}
-  {% endif %}
-</aside>
-{% endunless %}
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/background.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/background.png
deleted file mode 100644
index c2824cc4..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/background.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/blankButton.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/blankButton.png
deleted file mode 100644
index 010159f3..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/blankButton.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/divider.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/divider.png
deleted file mode 100644
index 77cd829a..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/divider.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/fullscreenButton.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/fullscreenButton.png
deleted file mode 100644
index e06aa50c..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/fullscreenButton.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/fullscreenButtonOver.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/fullscreenButtonOver.png
deleted file mode 100644
index d2bc4fc7..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/fullscreenButtonOver.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/muteButton.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/muteButton.png
deleted file mode 100644
index 40c40ab2..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/muteButton.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/muteButtonOver.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/muteButtonOver.png
deleted file mode 100644
index 96fe7bb0..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/muteButtonOver.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/normalscreenButton.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/normalscreenButton.png
deleted file mode 100644
index 22295074..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/normalscreenButton.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/normalscreenButtonOver.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/normalscreenButtonOver.png
deleted file mode 100644
index 15db44d4..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/normalscreenButtonOver.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/pauseButton.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/pauseButton.png
deleted file mode 100644
index e399bf34..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/pauseButton.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/pauseButtonOver.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/pauseButtonOver.png
deleted file mode 100644
index 409d89d2..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/pauseButtonOver.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/playButton.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/playButton.png
deleted file mode 100644
index f8d9a007..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/playButton.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/playButtonOver.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/playButtonOver.png
deleted file mode 100644
index 3fe28484..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/playButtonOver.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderBuffer.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderBuffer.png
deleted file mode 100644
index 73b371ab..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderBuffer.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderCapLeft.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderCapLeft.png
deleted file mode 100644
index 72322171..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderCapLeft.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderCapRight.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderCapRight.png
deleted file mode 100644
index 626444a6..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderCapRight.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderProgress.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderProgress.png
deleted file mode 100644
index 132a8e7d..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderProgress.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderRail.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderRail.png
deleted file mode 100644
index 27851dfd..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/timeSliderRail.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/unmuteButton.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/unmuteButton.png
deleted file mode 100644
index 3658453c..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/unmuteButton.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/controlbar/unmuteButtonOver.png b/.themes/classic/source/assets/jwplayer/glow/controlbar/unmuteButtonOver.png
deleted file mode 100644
index 138ebb35..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/controlbar/unmuteButtonOver.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/display/background.png b/.themes/classic/source/assets/jwplayer/glow/display/background.png
deleted file mode 100644
index 391152f5..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/display/background.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/display/bufferIcon.png b/.themes/classic/source/assets/jwplayer/glow/display/bufferIcon.png
deleted file mode 100644
index a3819c1e..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/display/bufferIcon.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/display/muteIcon.png b/.themes/classic/source/assets/jwplayer/glow/display/muteIcon.png
deleted file mode 100644
index e0408bbd..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/display/muteIcon.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/display/playIcon.png b/.themes/classic/source/assets/jwplayer/glow/display/playIcon.png
deleted file mode 100644
index cb384278..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/display/playIcon.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/dock/button.png b/.themes/classic/source/assets/jwplayer/glow/dock/button.png
deleted file mode 100644
index 391152f5..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/dock/button.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/glow.xml b/.themes/classic/source/assets/jwplayer/glow/glow.xml
deleted file mode 100644
index 71bdced0..00000000
--- a/.themes/classic/source/assets/jwplayer/glow/glow.xml
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version="1.0"?>
-<skin version="1.1" name="Glow" author="LongTail Video">
-
-	<settings>
-		<setting name="backcolor" value="0x000000" />
-		<setting name="frontcolor" value="0xeeeeee" />
-		<setting name="lightcolor" value="0xeeeeee" />
-		<setting name="screencolor" value="0x000000" />
-	</settings>
-
-	<components>
-		<component name="controlbar">
-			<settings>
-				<setting name="margin" value="0" />
-				<setting name="fontsize" value="11" />
-				<setting name="fontcolor" value="0xEEEEEE" />
-				<setting name="buttoncolor" value="0xEEEEEE" />
-			</settings>
-
-			<layout>
-				<group position="left">
-					<button name="play" />
-					<text name="elapsed" />
-				</group>
-				<group position="center">
-					<slider name="time" />
-				</group>
-				<group position="right">
-					<text name="duration" />
-					<button name="blank" />
-					<button name="mute" />
-					<button name="fullscreen" />
-				</group>
-			</layout>
-
-			<elements>
-				<element name="background" src="background.png" />
-				<element name="capLeft" src="divider.png" />
-				<element name="capRight" src="divider.png" />
-				<element name="divider" src="divider.png" />
-				<element name="blankButton" src="blankButton.png" />
-				<element name="fullscreenButton" src="fullscreenButton.png" />
-				<element name="fullscreenButtonOver" src="fullscreenButtonOver.png" />
-				<element name="muteButton" src="muteButton.png" />
-				<element name="muteButtonOver" src="muteButtonOver.png" />
-				<element name="pauseButton" src="pauseButton.png" />
-				<element name="pauseButtonOver" src="pauseButtonOver.png" />
-				<element name="playButton" src="playButton.png" />
-				<element name="playButtonOver" src="playButtonOver.png" />
-				<element name="timeSliderBuffer" src="timeSliderBuffer.png" />
-				<element name="timeSliderCapLeft" src="timeSliderCapLeft.png" />
-				<element name="timeSliderCapRight" src="timeSliderCapRight.png" />
-				<element name="timeSliderProgress" src="timeSliderProgress.png" />
-				<element name="timeSliderRail" src="timeSliderRail.png" />
-				<element name="normalscreenButton" src="normalscreenButton.png" />
-				<element name="normalscreenButtonOver" src="normalscreenButtonOver.png" />
-				<element name="unmuteButton" src="unmuteButton.png" />
-				<element name="unmuteButtonOver" src="unmuteButtonOver.png" />
-				<element name="volumeSliderRail" src="divider.png" />
-				<element name="volumeSliderProgress" src="divider.png" />
-			</elements>
-		</component>
-		
-		<component name="display">
-			<settings>
-				<setting name="bufferinterval" value="250" />
-				<setting name="bufferrotation" value="90" />
-			</settings>
-			<elements>
-				<element name="background" src="background.png" />
-				<element name="playIcon" src="playIcon.png" />
-				<element name="muteIcon" src="muteIcon.png" />
-				<element name="errorIcon" src="bufferIcon.png" />
-				<element name="bufferIcon" src="bufferIcon.png" />
-			</elements>
-		</component>
-		
-		<component name="dock">
-			<settings>
-				<setting name="fontcolor" value="0xFFFFFF" />
-			</settings>
-			<elements>
-				<element name="button" src="button.png" />
-			</elements>
-		</component>
-
-		<component name="playlist">
-			<settings>
-				<setting name="fontcolor" value="0xEEEEEE" />
-				<setting name="overcolor" value="0xFFFFFF" />
-				<setting name="activecolor" value="0xFFFFFF" />
-				<setting name="backgroundcolor" value="0x333333" />
-			</settings>
-			<elements>
-				<element name="item" src="item.png" />
-				<element name="itemOver" src="itemOver.png" />
-				<element name="sliderCapBottom" src="sliderCapBottom.png" />
-				<element name="sliderCapTop" src="sliderCapTop.png" />
-				<element name="sliderRail" src="sliderRail.png" />
-				<element name="sliderThumb" src="sliderThumb.png" />
-			</elements>
-		</component>
-
-		<component name="sharing">
-			<elements>
-				<element name="embedIcon" src="embedIcon.png" />
-				<element name="embedScreen" src="embedScreen.png" />
-				<element name="shareIcon" src="shareIcon.png" />
-				<element name="shareScreen" src="shareScreen.png" />
-			</elements>
-		</component>
-
-	</components>
-
-</skin>
\ No newline at end of file
diff --git a/.themes/classic/source/assets/jwplayer/glow/playlist/item.png b/.themes/classic/source/assets/jwplayer/glow/playlist/item.png
deleted file mode 100644
index 812592c3..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/playlist/item.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/playlist/itemOver.png b/.themes/classic/source/assets/jwplayer/glow/playlist/itemOver.png
deleted file mode 100644
index 549f3721..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/playlist/itemOver.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/playlist/sliderCapBottom.png b/.themes/classic/source/assets/jwplayer/glow/playlist/sliderCapBottom.png
deleted file mode 100644
index 048cc623..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/playlist/sliderCapBottom.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/playlist/sliderCapTop.png b/.themes/classic/source/assets/jwplayer/glow/playlist/sliderCapTop.png
deleted file mode 100644
index 65c463a0..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/playlist/sliderCapTop.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/playlist/sliderRail.png b/.themes/classic/source/assets/jwplayer/glow/playlist/sliderRail.png
deleted file mode 100644
index 121778af..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/playlist/sliderRail.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/playlist/sliderThumb.png b/.themes/classic/source/assets/jwplayer/glow/playlist/sliderThumb.png
deleted file mode 100644
index 118c3e03..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/playlist/sliderThumb.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/sharing/embedIcon.png b/.themes/classic/source/assets/jwplayer/glow/sharing/embedIcon.png
deleted file mode 100644
index 3394ac9c..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/sharing/embedIcon.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/sharing/embedScreen.png b/.themes/classic/source/assets/jwplayer/glow/sharing/embedScreen.png
deleted file mode 100644
index b4059754..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/sharing/embedScreen.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/sharing/shareIcon.png b/.themes/classic/source/assets/jwplayer/glow/sharing/shareIcon.png
deleted file mode 100644
index eae1d4e7..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/sharing/shareIcon.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/glow/sharing/shareScreen.png b/.themes/classic/source/assets/jwplayer/glow/sharing/shareScreen.png
deleted file mode 100644
index 695ec949..00000000
Binary files a/.themes/classic/source/assets/jwplayer/glow/sharing/shareScreen.png and /dev/null differ
diff --git a/.themes/classic/source/assets/jwplayer/player.swf b/.themes/classic/source/assets/jwplayer/player.swf
deleted file mode 100644
index 0eee3797..00000000
Binary files a/.themes/classic/source/assets/jwplayer/player.swf and /dev/null differ
diff --git a/.themes/classic/source/atom.xml b/.themes/classic/source/atom.xml
deleted file mode 100644
index 403328f3..00000000
--- a/.themes/classic/source/atom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
----
-layout: null
----
-<?xml version="1.0" encoding="utf-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom">
-
-  <title><![CDATA[{{ site.title | cdata_escape }}]]></title>
-  <link href="{{ site.url }}/atom.xml" rel="self"/>
-  <link href="{{ site.url }}/"/>
-  <updated>{{ site.time | date_to_xmlschema }}</updated>
-  <id>{{ site.url }}/</id>
-  <author>
-    <name><![CDATA[{{ site.author | strip_html }}]]></name>
-    {% if site.email %}<email><![CDATA[{{ site.email }}]]></email>{% endif %}
-  </author>
-  <generator uri="http://octopress.org/">Octopress</generator>
-
-  {% for post in site.posts limit: 20 %}
-  <entry>
-    <title type="html"><![CDATA[{% if site.titlecase %}{{ post.title | titlecase | cdata_escape }}{% else %}{{ post.title | cdata_escape }}{% endif %}]]></title>
-    <link href="{{ site.url }}{{ post.url }}"/>
-    <updated>{{ post.date | date_to_xmlschema }}</updated>
-    <id>{{ site.url }}{{ post.id }}</id>
-    <content type="html"><![CDATA[{{ post.content | expand_urls: site.url | cdata_escape }}]]></content>
-  </entry>
-  {% endfor %}
-</feed>
diff --git a/.themes/classic/source/blog/archives/index.html b/.themes/classic/source/blog/archives/index.html
deleted file mode 100644
index f1d9cee3..00000000
--- a/.themes/classic/source/blog/archives/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
----
-layout: page
-title: Blog Archive
-footer: false
----
-
-<div id="blog-archives">
-{% for post in site.posts reverse %}
-{% capture this_year %}{{ post.date | date: "%Y" }}{% endcapture %}
-{% unless year == this_year %}
-  {% assign year = this_year %}
-  <h2>{{ year }}</h2>
-{% endunless %}
-<article>
-  {% include archive_post.html %}
-</article>
-{% endfor %}
-</div>
diff --git a/.themes/classic/source/favicon.png b/.themes/classic/source/favicon.png
deleted file mode 100644
index 0f250673..00000000
Binary files a/.themes/classic/source/favicon.png and /dev/null differ
diff --git a/.themes/classic/source/images/bird_32_gray.png b/.themes/classic/source/images/bird_32_gray.png
deleted file mode 100644
index 574f210a..00000000
Binary files a/.themes/classic/source/images/bird_32_gray.png and /dev/null differ
diff --git a/.themes/classic/source/images/bird_32_gray_fail.png b/.themes/classic/source/images/bird_32_gray_fail.png
deleted file mode 100644
index 8337d103..00000000
Binary files a/.themes/classic/source/images/bird_32_gray_fail.png and /dev/null differ
diff --git a/.themes/classic/source/images/code_bg.png b/.themes/classic/source/images/code_bg.png
deleted file mode 100644
index a57bab56..00000000
Binary files a/.themes/classic/source/images/code_bg.png and /dev/null differ
diff --git a/.themes/classic/source/images/dotted-border.png b/.themes/classic/source/images/dotted-border.png
deleted file mode 100644
index 57f99071..00000000
Binary files a/.themes/classic/source/images/dotted-border.png and /dev/null differ
diff --git a/.themes/classic/source/images/email.png b/.themes/classic/source/images/email.png
deleted file mode 100644
index e55473fe..00000000
Binary files a/.themes/classic/source/images/email.png and /dev/null differ
diff --git a/.themes/classic/source/images/line-tile.png b/.themes/classic/source/images/line-tile.png
deleted file mode 100644
index f67ee19f..00000000
Binary files a/.themes/classic/source/images/line-tile.png and /dev/null differ
diff --git a/.themes/classic/source/images/noise.png b/.themes/classic/source/images/noise.png
deleted file mode 100644
index 432e05bf..00000000
Binary files a/.themes/classic/source/images/noise.png and /dev/null differ
diff --git a/.themes/classic/source/images/rss.png b/.themes/classic/source/images/rss.png
deleted file mode 100644
index 151ae718..00000000
Binary files a/.themes/classic/source/images/rss.png and /dev/null differ
diff --git a/.themes/classic/source/images/search.png b/.themes/classic/source/images/search.png
deleted file mode 100644
index 1220ff4e..00000000
Binary files a/.themes/classic/source/images/search.png and /dev/null differ
diff --git a/.themes/classic/source/index.html b/.themes/classic/source/index.html
deleted file mode 100644
index 64b665e4..00000000
--- a/.themes/classic/source/index.html
+++ /dev/null
@@ -1,29 +0,0 @@
----
-layout: default
----
-
-<div class="blog-index">
-  {% assign index = true %}
-  {% for post in paginator.posts %}
-  {% assign content = post.content %}
-    <article>
-      {% include article.html %}
-    </article>
-  {% endfor %}
-  <div class="pagination">
-    {% if paginator.next_page %}
-      <a class="prev" href="{{paginator.next_page_path}}">&larr; Older</a>
-    {% endif %}
-    <a href="/blog/archives">Blog Archives</a>
-    {% if paginator.previous_page %}
-    <a class="next" href="{{paginator.previous_page_path}}">Newer &rarr;</a>
-    {% endif %}
-  </div>
-</div>
-<aside class="sidebar">
-  {% if site.blog_index_asides.size %}
-    {% include_array blog_index_asides %}
-  {% else %}
-    {% include_array default_asides %}
-  {% endif %}
-</aside>
diff --git a/.themes/classic/source/javascripts/github.js b/.themes/classic/source/javascripts/github.js
deleted file mode 100644
index fc2bb12c..00000000
--- a/.themes/classic/source/javascripts/github.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var github = (function(){
-  function escapeHtml(str) {
-    return $('<div/>').text(str).html();
-  }
-  function render(target, repos){
-    var i = 0, fragment = '', t = $(target)[0];
-
-    for(i = 0; i < repos.length; i++) {
-      fragment += '<li><a href="'+repos[i].html_url+'">'+repos[i].name+'</a><p>'+escapeHtml(repos[i].description||'')+'</p></li>';
-    }
-    t.innerHTML = fragment;
-  }
-  return {
-    showRepos: function(options){
-      $.ajax({
-          url: "https://api.github.com/users/"+options.user+"/repos?sort=pushed&callback=?"
-        , dataType: 'jsonp'
-        , error: function (err) { $(options.target + ' li.loading').addClass('error').text("Error loading feed"); }
-        , success: function(data) {
-          var repos = [];
-          if (!data || !data.data) { return; }
-          for (var i = 0; i < data.data.length; i++) {
-            if (options.skip_forks && data.data[i].fork) { continue; }
-            repos.push(data.data[i]);
-          }
-          if (options.count) { repos.splice(options.count); }
-          render(options.target, repos);
-        }
-      });
-    }
-  };
-})();
diff --git a/.themes/classic/source/javascripts/libs/jXHR.js b/.themes/classic/source/javascripts/libs/jXHR.js
deleted file mode 100644
index 6775655c..00000000
--- a/.themes/classic/source/javascripts/libs/jXHR.js
+++ /dev/null
@@ -1,85 +0,0 @@
-// jXHR.js (JSON-P XHR)
-// v0.1 (c) Kyle Simpson
-// MIT License
-
-(function(global){
-	var SETTIMEOUT = global.setTimeout, // for better compression
-		doc = global.document,
-		callback_counter = 0;
-
-	global.jXHR = function() {
-		var script_url,
-			script_loaded,
-			jsonp_callback,
-			scriptElem,
-			publicAPI = null;
-
-		function removeScript() { try { scriptElem.parentNode.removeChild(scriptElem); } catch (err) { } }
-
-		function reset() {
-			script_loaded = false;
-			script_url = "";
-			removeScript();
-			scriptElem = null;
-			fireReadyStateChange(0);
-		}
-
-		function ThrowError(msg) {
-			try { publicAPI.onerror.call(publicAPI,msg,script_url); } catch (err) { throw new Error(msg); }
-		}
-
-		function handleScriptLoad() {
-			if ((this.readyState && this.readyState!=="complete" && this.readyState!=="loaded") || script_loaded) { return; }
-			this.onload = this.onreadystatechange = null; // prevent memory leak
-			script_loaded = true;
-			if (publicAPI.readyState !== 4) ThrowError("Script failed to load ["+script_url+"].");
-			removeScript();
-		}
-
-		function fireReadyStateChange(rs,args) {
-			args = args || [];
-			publicAPI.readyState = rs;
-			if (typeof publicAPI.onreadystatechange === "function") publicAPI.onreadystatechange.apply(publicAPI,args);
-		}
-
-		publicAPI = {
-			onerror:null,
-			onreadystatechange:null,
-			readyState:0,
-			open:function(method,url){
-				reset();
-				internal_callback = "cb"+(callback_counter++);
-				(function(icb){
-					global.jXHR[icb] = function() {
-						try { fireReadyStateChange.call(publicAPI,4,arguments); }
-						catch(err) {
-							publicAPI.readyState = -1;
-							ThrowError("Script failed to run ["+script_url+"].");
-						}
-						global.jXHR[icb] = null;
-					};
-				})(internal_callback);
-				script_url = url.replace(/=\?/,"=jXHR."+internal_callback);
-				fireReadyStateChange(1);
-			},
-			send:function(){
-				SETTIMEOUT(function(){
-					scriptElem = doc.createElement("script");
-					scriptElem.setAttribute("type","text/javascript");
-					scriptElem.onload = scriptElem.onreadystatechange = function(){handleScriptLoad.call(scriptElem);};
-					scriptElem.setAttribute("src",script_url);
-					doc.getElementsByTagName("head")[0].appendChild(scriptElem);
-				},0);
-				fireReadyStateChange(2);
-			},
-			setRequestHeader:function(){}, // noop
-			getResponseHeader:function(){return "";}, // basically noop
-			getAllResponseHeaders:function(){return [];} // ditto
-		};
-
-		reset();
-
-		return publicAPI;
-	};
-})(window);
-
diff --git a/.themes/classic/source/javascripts/libs/jquery.min.js b/.themes/classic/source/javascripts/libs/jquery.min.js
deleted file mode 100644
index 32d50cb0..00000000
--- a/.themes/classic/source/javascripts/libs/jquery.min.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
-//@ sourceMappingURL=jquery.min.map
-*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;
-return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&&gt(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l)
-}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window);
diff --git a/.themes/classic/source/javascripts/libs/swfobject-dynamic.js b/.themes/classic/source/javascripts/libs/swfobject-dynamic.js
deleted file mode 100644
index b0216145..00000000
--- a/.themes/classic/source/javascripts/libs/swfobject-dynamic.js
+++ /dev/null
@@ -1,298 +0,0 @@
-/*!	SWFObject v2.2 <http://code.google.com/p/swfobject/>
-	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
-*/
-
-var swfobject = function() {
-
-	var UNDEF = "undefined",
-		OBJECT = "object",
-		SHOCKWAVE_FLASH = "Shockwave Flash",
-		SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
-		FLASH_MIME_TYPE = "application/x-shockwave-flash",
-		EXPRESS_INSTALL_ID = "SWFObjectExprInst",
-
-		win = window,
-		doc = document,
-		nav = navigator,
-
-		plugin = false,
-		regObjArr = [],
-		objIdArr = [],
-		storedAltContent,
-		storedAltContentId,
-		storedCallbackFn,
-		storedCallbackObj,
-		autoHideShow = true,
-
-	/* Centralized function for browser feature detection
-		- User agent string detection is only used when no good alternative is possible
-		- Is executed directly for optimal performance
-	*/
-	ua = function() {
-		var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
-			u = nav.userAgent.toLowerCase(),
-			p = nav.platform.toLowerCase(),
-			windows = p ? /win/.test(p) : /win/.test(u),
-			mac = p ? /mac/.test(p) : /mac/.test(u),
-			webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
-			ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html
-			playerVersion = [0,0,0],
-			d = null;
-		if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
-			d = nav.plugins[SHOCKWAVE_FLASH].description;
-			if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
-				plugin = true;
-				ie = false; // cascaded feature detection for Internet Explorer
-				d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
-				playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
-				playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
-				playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
-			}
-		}
-		else if (typeof win.ActiveXObject != UNDEF) {
-			try {
-				var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
-				if (a) { // a will return null when ActiveX is disabled
-					d = a.GetVariable("$version");
-					if (d) {
-						ie = true; // cascaded feature detection for Internet Explorer
-						d = d.split(" ")[1].split(",");
-						playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
-					}
-				}
-			}
-			catch(e) {}
-		}
-		return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
-	}()
-
-
-	/* Main function
-		- Will preferably execute onDomLoad, otherwise onload (as a fallback)
-	*/
-	function main() {
-		if (plugin) { testPlayerVersion(); }
-		else { matchVersions(); }
-	}
-
-	/* Detect the Flash Player version for non-Internet Explorer browsers
-		- Detecting the plug-in version via the object element is more precise than using the plugins collection item's description:
-		  a. Both release and build numbers can be detected
-		  b. Avoid wrong descriptions by corrupt installers provided by Adobe
-		  c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports
-		- Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available
-	*/
-	function testPlayerVersion() {
-		var b = doc.getElementsByTagName("body")[0];
-		var o = createElement(OBJECT);
-		o.setAttribute("type", FLASH_MIME_TYPE);
-		var t = b.appendChild(o);
-		if (t) {
-			var counter = 0;
-			(function(){
-				if (typeof t.GetVariable != UNDEF) {
-					var d = t.GetVariable("$version");
-					if (d) {
-						d = d.split(" ")[1].split(",");
-						ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
-					}
-				}
-				else if (counter < 10) {
-					counter++;
-					setTimeout(arguments.callee, 10);
-					return;
-				}
-				b.removeChild(o);
-				t = null;
-				matchVersions();
-			})();
-		}
-		else {
-			matchVersions();
-		}
-	}
-
-
-	/* Cross-browser dynamic SWF creation
-	*/
-	function createSWF(attObj, parObj, id) {
-		var r, el = getElementById(id);
-		if (ua.wk && ua.wk < 312) { return r; }
-		if (el) {
-			if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
-				attObj.id = id;
-			}
-			if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML
-				var att = "";
-				for (var i in attObj) {
-					if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries
-						if (i.toLowerCase() == "data") {
-							parObj.movie = attObj[i];
-						}
-						else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
-							att += ' class="' + attObj[i] + '"';
-						}
-						else if (i.toLowerCase() != "classid") {
-							att += ' ' + i + '="' + attObj[i] + '"';
-						}
-					}
-				}
-				var par = "";
-				for (var j in parObj) {
-					if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries
-						par += '<param name="' + j + '" value="' + parObj[j] + '" />';
-					}
-				}
-				el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
-				objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only)
-				r = getElementById(attObj.id);
-			}
-			else { // well-behaving browsers
-				var o = createElement(OBJECT);
-				o.setAttribute("type", FLASH_MIME_TYPE);
-				for (var m in attObj) {
-					if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries
-						if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
-							o.setAttribute("class", attObj[m]);
-						}
-						else if (m.toLowerCase() != "classid") { // filter out IE specific attribute
-							o.setAttribute(m, attObj[m]);
-						}
-					}
-				}
-				for (var n in parObj) {
-					if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element
-						createObjParam(o, n, parObj[n]);
-					}
-				}
-				el.parentNode.replaceChild(o, el);
-				r = o;
-			}
-		}
-		return r;
-	}
-
-	function createObjParam(el, pName, pValue) {
-		var p = createElement("param");
-		p.setAttribute("name", pName);
-		p.setAttribute("value", pValue);
-		el.appendChild(p);
-	}
-
-	/* Cross-browser SWF removal
-		- Especially needed to safely and completely remove a SWF in Internet Explorer
-	*/
-	/* Functions to optimize JavaScript compression
-	*/
-	function getElementById(id) {
-		var el = null;
-		try {
-			el = doc.getElementById(id);
-		}
-		catch (e) {}
-		return el;
-	}
-
-	function createElement(el) {
-		return doc.createElement(el);
-	}
-
-	/* Flash Player and SWF content version matching
-	*/
-	function hasPlayerVersion(rv) {
-		var pv = ua.pv, v = rv.split(".");
-		v[0] = parseInt(v[0], 10);
-		v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
-		v[2] = parseInt(v[2], 10) || 0;
-		return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
-	}
-
-
-	/* Filter to avoid XSS attacks
-	*/
-	function urlEncodeIfNecessary(s) {
-		var regex = /[\\\"<>\.;]/;
-		var hasBadChars = regex.exec(s) != null;
-		return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s;
-	}
-
-	return {
-		/* Public API
-			- Reference: http://code.google.com/p/swfobject/wiki/documentation
-		*/
-
-		embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, flashvarsObj, parObj, attObj, callbackFn) {
-			var callbackObj = {success:false, id:replaceElemIdStr};
-			if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) {
-              widthStr += ""; // auto-convert to string
-              heightStr += "";
-              var att = {};
-              if (attObj && typeof attObj === OBJECT) {
-                for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs
-                  att[i] = attObj[i];
-                }
-              }
-              att.data = swfUrlStr;
-              att.width = widthStr;
-              att.height = heightStr;
-              var par = {};
-              if (parObj && typeof parObj === OBJECT) {
-                for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs
-                  par[j] = parObj[j];
-                }
-              }
-              if (flashvarsObj && typeof flashvarsObj === OBJECT) {
-                for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs
-                  if (typeof par.flashvars != UNDEF) {
-                    par.flashvars += "&" + k + "=" + flashvarsObj[k];
-                  }
-                  else {
-                    par.flashvars = k + "=" + flashvarsObj[k];
-                  }
-                }
-              }
-              if (hasPlayerVersion(swfVersionStr)) { // create SWF
-                var obj = createSWF(att, par, replaceElemIdStr);
-                callbackObj.success = true;
-                callbackObj.ref = obj;
-              }
-              if (callbackFn) { callbackFn(callbackObj); }
-			}
-			else if (callbackFn) { callbackFn(callbackObj);	}
-		},
-
-		ua: ua,
-
-		getFlashPlayerVersion: function() {
-			return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
-		},
-
-		hasFlashPlayerVersion: hasPlayerVersion,
-
-		createSWF: function(attObj, parObj, replaceElemIdStr) {
-			if (ua.w3) {
-				return createSWF(attObj, parObj, replaceElemIdStr);
-			}
-			else {
-				return undefined;
-			}
-		},
-
-		getQueryParamValue: function(param) {
-			var q = doc.location.search || doc.location.hash;
-			if (q) {
-				if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark
-				if (param == null) {
-					return urlEncodeIfNecessary(q);
-				}
-				var pairs = q.split("&");
-				for (var i = 0; i < pairs.length; i++) {
-					if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
-						return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
-					}
-				}
-			}
-			return "";
-		}
-	};
-}();
diff --git a/.themes/classic/source/javascripts/modernizr-2.0.js b/.themes/classic/source/javascripts/modernizr-2.0.js
deleted file mode 100644
index 9dca7b0e..00000000
--- a/.themes/classic/source/javascripts/modernizr-2.0.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Modernizr 2.6.2 (Custom Build) | MIT & BSD
- * Build: http://modernizr.com/download/#-video-mq-cssclasses-teststyles-testprop-testallprops-prefixes-domprefixes-load
- */
-;window.Modernizr=function(a,b,c){function A(a){j.cssText=a}function B(a,b){return A(m.join(a+";")+(b||""))}function C(a,b){return typeof a===b}function D(a,b){return!!~(""+a).indexOf(b)}function E(a,b){for(var d in a){var e=a[d];if(!D(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function F(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:C(f,"function")?f.bind(d||b):f}return!1}function G(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+o.join(d+" ")+d).split(" ");return C(b,"string")||C(b,"undefined")?E(e,b):(e=(a+" "+p.join(d+" ")+d).split(" "),F(e,b,c))}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m=" -webkit- -moz- -o- -ms- ".split(" "),n="Webkit Moz O ms",o=n.split(" "),p=n.toLowerCase().split(" "),q={},r={},s={},t=[],u=t.slice,v,w=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["&#173;",'<style id="s',h,'">',a,"</style>"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},x=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b).matches;var d;return w("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},y={}.hasOwnProperty,z;!C(y,"undefined")&&!C(y.call,"undefined")?z=function(a,b){return y.call(a,b)}:z=function(a,b){return b in a&&C(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=u.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(u.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(u.call(arguments)))};return e}),q.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c};for(var H in q)z(q,H)&&(v=H.toLowerCase(),e[v]=q[H](),t.push((e[v]?"":"no-")+v));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)z(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},A(""),i=k=null,e._version=d,e._prefixes=m,e._domPrefixes=p,e._cssomPrefixes=o,e.mq=x,e.testProp=function(a){return E([a])},e.testAllProps=G,e.testStyles=w,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+t.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
-
diff --git a/.themes/classic/source/javascripts/octopress.js b/.themes/classic/source/javascripts/octopress.js
deleted file mode 100644
index faaf3dbe..00000000
--- a/.themes/classic/source/javascripts/octopress.js
+++ /dev/null
@@ -1,151 +0,0 @@
-function getNav() {
-  var mainNav = $('ul.main-navigation, ul[role=main-navigation]').before('<fieldset class="mobile-nav">')
-  var mobileNav = $('fieldset.mobile-nav').append('<select>');
-  mobileNav.find('select').append('<option value="">Navigate&hellip;</option>');
-  var addOption = function(i, option) {
-    mobileNav.find('select').append('<option value="' + this.href + '">&raquo; ' + $(this).text() + '</option>');
-  }
-  mainNav.find('a').each(addOption);
-  $('ul.subscription a').each(addOption);
-  mobileNav.find('select').bind('change', function(event) {
-    if (event.target.value) { window.location.href = event.target.value; }
-  });
-}
-
-function addSidebarToggler() {
-  if(!$('body').hasClass('sidebar-footer')) {
-    $('#content').append('<span class="toggle-sidebar"></span>');
-    $('.toggle-sidebar').bind('click', function(e) {
-      e.preventDefault();
-      $('body').toggleClass('collapse-sidebar');
-    });
-  }
-  var sections = $('aside.sidebar > section');
-  if (sections.length > 1) {
-    sections.each(function(index, section){
-      if ((sections.length >= 3) && index % 3 === 0) {
-        $(section).addClass("first");
-      }
-      var count = ((index +1) % 2) ? "odd" : "even";
-      $(section).addClass(count);
-    });
-  }
-  if (sections.length >= 3){ $('aside.sidebar').addClass('thirds'); }
-}
-
-function testFeatures() {
-  var features = ['maskImage'];
-  $(features).map(function(i, feature) {
-    if (Modernizr.testAllProps(feature)) {
-      $('html').addClass(feature);
-    } else {
-      $('html').addClass('no-'+feature);
-    }
-  });
-  if ("placeholder" in document.createElement("input")) {
-    $('html').addClass('placeholder');
-  } else {
-    $('html').addClass('no-placeholder');
-  }
-}
-
-function addCodeLineNumbers() {
-  if (navigator.appName === 'Microsoft Internet Explorer') { return; }
-  $('div.gist-highlight').each(function(code) {
-    var tableStart = '<table><tbody><tr><td class="gutter">',
-        lineNumbers = '<pre class="line-numbers">',
-        tableMiddle = '</pre></td><td class="code">',
-        tableEnd = '</td></tr></tbody></table>',
-        count = $('.line', code).length;
-    for (var i=1;i<=count; i++) {
-      lineNumbers += '<span class="line-number">'+i+'</span>\n';
-    }
-    var table = tableStart + lineNumbers + tableMiddle + '<pre>'+$('pre', code).html()+'</pre>' + tableEnd;
-    $(code).html(table);
-  });
-}
-
-function flashVideoFallback(){
-  var flashplayerlocation = "/assets/jwplayer/player.swf",
-      flashplayerskin = "/assets/jwplayer/glow/glow.xml";
-  $('video').each(function(i, video){
-    video = $(video);
-    if (!Modernizr.video.h264 && swfobject.getFlashPlayerVersion() || window.location.hash.indexOf("flash-test") !== -1){
-      video.children('source[src$=mp4]').first().map(i, function(source){
-        var src = $(source).attr('src'),
-            id = 'video_'+Math.round(1 + Math.random()*(100000)),
-            width = video.attr('width'),
-            height = parseInt(video.attr('height'), 10) + 30;
-            video.after('<div class="flash-video"><div><div id='+id+'>');
-        swfobject.embedSWF(flashplayerlocation, id, width, height + 30, "9.0.0",
-          { file : src, image : video.attr('poster'), skin : flashplayerskin } ,
-          { movie : src, wmode : "opaque", allowfullscreen : "true" }
-        );
-      });
-      video.remove();
-    }
-  });
-}
-
-function wrapFlashVideos() {
-  $('object').each(function(i, object) {
-    if( $(object).find('param[name=movie]').length ){
-      $(object).wrap('<div class="flash-video">')
-    }
-  });
-  $('iframe[src*=vimeo],iframe[src*=youtube]').wrap('<div class="flash-video">')
-}
-
-function renderDeliciousLinks(items) {
-  var output = "<ul>";
-  for (var i=0,l=items.length; i<l; i++) {
-    output += '<li><a href="' + items[i].u + '" title="Tags: ' + (items[i].t == "" ? "" : items[i].t.join(', ')) + '">' + items[i].d + '</a></li>';
-  }
-  output += "</ul>";
-  $('#delicious').html(output);
-}
-
-$('document').ready(function() {
-  testFeatures();
-  wrapFlashVideos();
-  flashVideoFallback();
-  addCodeLineNumbers();
-  getNav();
-  addSidebarToggler();
-});
-
-// iOS scaling bug fix
-// Rewritten version
-// By @mathias, @cheeaun and @jdalton
-// Source url: https://gist.github.com/901295
-(function(doc) {
-  var addEvent = 'addEventListener',
-      type = 'gesturestart',
-      qsa = 'querySelectorAll',
-      scales = [1, 1],
-      meta = qsa in doc ? doc[qsa]('meta[name=viewport]') : [];
-  function fix() {
-    meta.content = 'width=device-width,minimum-scale=' + scales[0] + ',maximum-scale=' + scales[1];
-    doc.removeEventListener(type, fix, true);
-  }
-  if ((meta = meta[meta.length - 1]) && addEvent in doc) {
-    fix();
-    scales = [0.25, 1.6];
-    doc[addEvent](type, fix, true);
-  }
-}(document));
-
-/*!	SWFObject v2.2 modified by Brandon Mathis to contain only what is necessary to dynamically embed flash objects
-  * Uncompressed source in javascripts/libs/swfobject-dynamic.js
-  * <http://code.google.com/p/swfobject/>
-	released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
-*/
-var swfobject=function(){function s(a,b,d){var q,k=n(d);if(g.wk&&g.wk<312)return q;if(k){if(typeof a.id==l)a.id=d;if(g.ie&&g.win){var e="",c;for(c in a)if(a[c]!=Object.prototype[c])c.toLowerCase()=="data"?b.movie=a[c]:c.toLowerCase()=="styleclass"?e+=' class="'+a[c]+'"':c.toLowerCase()!="classid"&&(e+=" "+c+'="'+a[c]+'"');c="";for(var f in b)b[f]!=Object.prototype[f]&&(c+='<param name="'+f+'" value="'+b[f]+'" />');k.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+e+">"+c+
-"</object>";q=n(a.id)}else{f=i.createElement(o);f.setAttribute("type",m);for(var h in a)a[h]!=Object.prototype[h]&&(h.toLowerCase()=="styleclass"?f.setAttribute("class",a[h]):h.toLowerCase()!="classid"&&f.setAttribute(h,a[h]));for(e in b)b[e]!=Object.prototype[e]&&e.toLowerCase()!="movie"&&(a=f,c=e,h=b[e],d=i.createElement("param"),d.setAttribute("name",c),d.setAttribute("value",h),a.appendChild(d));k.parentNode.replaceChild(f,k);q=f}}return q}function n(a){var b=null;try{b=i.getElementById(a)}catch(d){}return b}
-function t(a){var b=g.pv,a=a.split(".");a[0]=parseInt(a[0],10);a[1]=parseInt(a[1],10)||0;a[2]=parseInt(a[2],10)||0;return b[0]>a[0]||b[0]==a[0]&&b[1]>a[1]||b[0]==a[0]&&b[1]==a[1]&&b[2]>=a[2]?!0:!1}function u(a){return/[\\\"<>\.;]/.exec(a)!=null&&typeof encodeURIComponent!=l?encodeURIComponent(a):a}var l="undefined",o="object",m="application/x-shockwave-flash",v=window,i=document,j=navigator,g=function(){var a=typeof i.getElementById!=l&&typeof i.getElementsByTagName!=l&&typeof i.createElement!=l,
-b=j.userAgent.toLowerCase(),d=j.platform.toLowerCase(),g=d?/win/.test(d):/win/.test(b),d=d?/mac/.test(d):/mac/.test(b),b=/webkit/.test(b)?parseFloat(b.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):!1,k=!+"\u000b1",e=[0,0,0],c=null;if(typeof j.plugins!=l&&typeof j.plugins["Shockwave Flash"]==o){if((c=j.plugins["Shockwave Flash"].description)&&!(typeof j.mimeTypes!=l&&j.mimeTypes[m]&&!j.mimeTypes[m].enabledPlugin))k=!1,c=c.replace(/^.*\s+(\S+\s+\S+$)/,"$1"),e[0]=parseInt(c.replace(/^(.*)\..*$/,"$1"),
-10),e[1]=parseInt(c.replace(/^.*\.(.*)\s.*$/,"$1"),10),e[2]=/[a-zA-Z]/.test(c)?parseInt(c.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}else if(typeof v.ActiveXObject!=l)try{var f=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(f&&(c=f.GetVariable("$version")))k=!0,c=c.split(" ")[1].split(","),e=[parseInt(c[0],10),parseInt(c[1],10),parseInt(c[2],10)]}catch(h){}return{w3:a,pv:e,wk:b,ie:k,win:g,mac:d}}();return{embedSWF:function(a,b,d,i,k,e,c,f,h){var j={success:!1,id:b};if(g.w3&&!(g.wk&&g.wk<312)&&
-a&&b&&d&&i&&k){d+="";i+="";var p={};if(f&&typeof f===o)for(var m in f)p[m]=f[m];p.data=a;p.width=d;p.height=i;a={};if(c&&typeof c===o)for(var n in c)a[n]=c[n];if(e&&typeof e===o)for(var r in e)typeof a.flashvars!=l?a.flashvars+="&"+r+"="+e[r]:a.flashvars=r+"="+e[r];if(t(k))b=s(p,a,b),j.success=!0,j.ref=b}h&&h(j)},ua:g,getFlashPlayerVersion:function(){return{major:g.pv[0],minor:g.pv[1],release:g.pv[2]}},hasFlashPlayerVersion:t,createSWF:function(a,b,d){if(g.w3)return s(a,b,d)},getQueryParamValue:function(a){var b=
-i.location.search||i.location.hash;if(b){/\?/.test(b)&&(b=b.split("?")[1]);if(a==null)return u(b);for(var b=b.split("&"),d=0;d<b.length;d++)if(b[d].substring(0,b[d].indexOf("="))==a)return u(b[d].substring(b[d].indexOf("=")+1))}return""}}}();
-
-
diff --git a/.themes/classic/source/javascripts/pinboard.js b/.themes/classic/source/javascripts/pinboard.js
deleted file mode 100644
index a97df03d..00000000
--- a/.themes/classic/source/javascripts/pinboard.js
+++ /dev/null
@@ -1,56 +0,0 @@
-function pinboardNS_fetch_script(url) {
-  //document.writeln('<s'+'cript type="text/javascript" src="' + url + '"></s'+'cript>');
-  (function(){
-    var pinboardLinkroll = document.createElement('script');
-    pinboardLinkroll.type = 'text/javascript';
-    pinboardLinkroll.async = true;
-    pinboardLinkroll.src = url;
-    document.getElementsByTagName('head')[0].appendChild(pinboardLinkroll);
-  })();
-}
-
-function pinboardNS_show_bmarks(r) {
-  var lr = new Pinboard_Linkroll();
-  lr.set_items(r);
-  lr.show_bmarks();
-}
-
-function Pinboard_Linkroll() {
-  var items;
-
-  this.set_items = function(i) {
-    this.items = i;
-  }
-  this.show_bmarks = function() {
-    var lines = [];
-    for (var i = 0; i < this.items.length; i++) {
-      var item = this.items[i];
-      var str = this.format_item(item);
-      lines.push(str);
-    }
-    document.getElementById(linkroll).innerHTML = lines.join("\n");
-  }
-  this.cook = function(v) {
-    return v.replace('<', '&lt;').replace('>', '&gt>');
-  }
-
-  this.format_item = function(it) {
-    var str = "<li class=\"pin-item\">";
-    if (!it.d) { return; }
-    str += "<p><a class=\"pin-title\" href=\"" + this.cook(it.u) + "\">" + this.cook(it.d) + "</a>";
-    if (it.n) {
-      str += "<span class=\"pin-description\">" + this.cook(it.n) + "</span>\n";
-    }
-    if (it.t.length > 0) {
-      for (var i = 0; i < it.t.length; i++) {
-        var tag = it.t[i];
-        str += " <a class=\"pin-tag\" href=\"https://pinboard.in/u:"+ this.cook(it.a) + "/t:" + this.cook(tag) + "\">" + this.cook(tag).replace(/^\s+|\s+$/g, '') + "</a> ";
-      }
-    }
-    str += "</p></li>\n";
-    return str;
-  }
-}
-Pinboard_Linkroll.prototype = new Pinboard_Linkroll();
-pinboardNS_fetch_script("https://feeds.pinboard.in/json/v1/u:"+pinboard_user+"/?cb=pinboardNS_show_bmarks\&count="+pinboard_count);
-
diff --git a/.themes/classic/source/javascripts/twitter.js b/.themes/classic/source/javascripts/twitter.js
deleted file mode 100644
index 3e2dd0d7..00000000
--- a/.themes/classic/source/javascripts/twitter.js
+++ /dev/null
@@ -1,78 +0,0 @@
-// JSON-P Twitter fetcher for Octopress
-// (c) Brandon Mathis // MIT License
-
-/* Sky Slavin, Ludopoli. MIT license.  * based on JavaScript Pretty Date * Copyright (c) 2008 John Resig (jquery.com) * Licensed under the MIT license.  */
-function prettyDate(time) {
-  if (navigator.appName === 'Microsoft Internet Explorer') {
-    return "<span>&infin;</span>"; // because IE date parsing isn't fun.
-  }
-  var say = {
-    just_now:    " now",
-    minute_ago:  "1m",
-    minutes_ago: "m",
-    hour_ago:    "1h",
-    hours_ago:   "h",
-    yesterday:   "1d",
-    days_ago:    "d",
-    last_week:   "1w",
-    weeks_ago:   "w"
-  };
-
-  var current_date = new Date(),
-      current_date_time = current_date.getTime(),
-      current_date_full = current_date_time + (1 * 60000),
-      date = new Date(time),
-      diff = ((current_date_full - date.getTime()) / 1000),
-      day_diff = Math.floor(diff / 86400);
-
-  if (isNaN(day_diff) || day_diff < 0) { return "<span>&infin;</span>"; }
-
-  return day_diff === 0 && (
-    diff < 60 && say.just_now ||
-    diff < 120 && say.minute_ago ||
-    diff < 3600 && Math.floor(diff / 60) + say.minutes_ago ||
-    diff < 7200 && say.hour_ago ||
-    diff < 86400 && Math.floor(diff / 3600) + say.hours_ago) ||
-    day_diff === 1 && say.yesterday ||
-    day_diff < 7 && day_diff + say.days_ago ||
-    day_diff === 7 && say.last_week ||
-    day_diff > 7 && Math.ceil(day_diff / 7) + say.weeks_ago;
-}
-
-function linkifyTweet(text, url) {
-  // Linkify urls, usernames, hashtags
-  text = text.replace(/(https?:\/\/)([\w\-:;?&=+.%#\/]+)/gi, '<a href="$1$2">$2</a>')
-    .replace(/(^|\W)@(\w+)/g, '$1<a href="https://twitter.com/$2">@$2</a>')
-    .replace(/(^|\W)#(\w+)/g, '$1<a href="https://search.twitter.com/search?q=%23$2">#$2</a>');
-
-  // Use twitter's api to replace t.co shortened urls with expanded ones.
-  for (var u in url) {
-    if(url[u].expanded_url != null){
-      var shortUrl = new RegExp(url[u].url, 'g');
-      text = text.replace(shortUrl, url[u].expanded_url);
-      var shortUrl = new RegExp(">"+(url[u].url.replace(/https?:\/\//, '')), 'g');
-      text = text.replace(shortUrl, ">"+url[u].display_url);
-    }
-  }
-  return text
-}
-
-function showTwitterFeed(tweets, twitter_user) {
-  var timeline = document.getElementById('tweets'),
-      content = '';
-
-  for (var t in tweets) {
-    content += '<li>'+'<p>'+'<a href="https://twitter.com/'+twitter_user+'/status/'+tweets[t].id_str+'">'+prettyDate(tweets[t].created_at)+'</a>'+linkifyTweet(tweets[t].text.replace(/\n/g, '<br>'), tweets[t].entities.urls)+'</p>'+'</li>';
-  }
-  timeline.innerHTML = content;
-}
-
-function getTwitterFeed(user, count, replies) {
-  count = parseInt(count, 10);
-  $.ajax({
-      url: "https://api.twitter.com/1/statuses/user_timeline/" + user + ".json?trim_user=true&count=" + (count + 20) + "&include_entities=1&exclude_replies=" + (replies ? "0" : "1") + "&callback=?"
-    , type: 'jsonp'
-    , error: function (err) { $('#tweets li.loading').addClass('error').text("Twitter's busted"); }
-    , success: function(data) { showTwitterFeed(data.slice(0, count), user); }
-  })
-}
diff --git a/.themes/classic/source/robots.txt b/.themes/classic/source/robots.txt
deleted file mode 100644
index ee34c720..00000000
--- a/.themes/classic/source/robots.txt
+++ /dev/null
@@ -1,7 +0,0 @@
----
-layout: null
----
-User-agent: *
-Disallow: 
-
-Sitemap: {{ site.url }}/sitemap.xml 
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index b2024911..00000000
--- a/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-language: ruby
-rvm:
-  - 2.0.0
-  - 1.9.3
-script: bundle exec rake install; bundle exec rake generate
diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
deleted file mode 100644
index 0da6ecb6..00000000
--- a/CHANGELOG.markdown
+++ /dev/null
@@ -1,29 +0,0 @@
-# Octopress Changelog
-
-## 2.0
-
-- Now based on [mojombo/jekyll](http://github.com/mojombo/jekyll)
-- Sports a semantic HTML5 template
-- Easy theming with Compass and Sass
-- A Mobile friendly responsive (320 and up) layout
-- Built in 3rd party support for Twitter, Google Plus One, Disqus Comments, Pinboard, Delicious, and Google Analytics
-- Deploy to Github pages or use Rsync
-- Built in support for POW and Rack servers
-- Beautiful [Solarized](http://ethanschoonover.com/solarized) syntax highlighting
-- Super easy setup and configuration
-
-**New Plugins, Filters, & Generators**
-
-- **Gist Tag** for easily embedding gists in your posts
-- **Pygments Cache** makes subsequent compiling much faster
-- **Include Code Tag** lets you embed external code snippets from your file system and adds a download link
-- **Pullquote Tag** Generate beautiful semantic pullquotes (no double data) based on Maykel Loomans's [technique](http://miekd.com/articles/pull-quotes-with-html5-and-css/)
-- **Blockquote Tag** makes it easy to semantically format blockquotes
-- **Category Generator** gives you archive pages for each category
-- **Sitemap.xml Generator** for search engines
-
-## 1.0
-
-- **No longer supported.**
-- Jekyll Matured, but Henrik's Jekyll fork did not.
-- Thanks for all your pull requests, I learned a lot.
diff --git a/Gemfile b/Gemfile
deleted file mode 100644
index b02ee4b1..00000000
--- a/Gemfile
+++ /dev/null
@@ -1,19 +0,0 @@
-source "https://rubygems.org"
-
-group :development do
-  gem 'rake', '~> 10.0'
-  gem 'jekyll', '~> 2.0'
-  gem 'octopress-hooks', '~> 2.2'
-  gem 'octopress-date-format', '~> 2.0'
-  gem 'jekyll-sitemap'
-  gem 'rdiscount', '~> 2.0'
-  gem 'RedCloth', '~> 4.2.9'
-  gem 'haml', '~> 4.0'
-  gem 'compass', '~> 0.12.2'
-  gem 'sass-globbing', '~> 1.0.0'
-  gem 'rubypants', '~> 0.2.0'
-  gem 'rb-fsevent', '~> 0.9'
-  gem 'stringex', '~> 1.4.0'
-end
-
-gem 'sinatra', '~> 1.4.2'
diff --git a/README.markdown b/README.markdown
deleted file mode 100644
index d6f1933c..00000000
--- a/README.markdown
+++ /dev/null
@@ -1,41 +0,0 @@
-## What is Octopress?
-
-Octopress is [Jekyll](https://github.com/mojombo/jekyll) blogging at its finest.
-
-1. **Octopress sports a clean responsive theme** written in semantic HTML5, focused on readability and friendliness toward mobile devices.
-2. **Code blogging is easy and beautiful.** Embed code (with [Solarized](http://ethanschoonover.com/solarized) styling) in your posts from gists, jsFiddle or from your filesystem.
-3. **Third party integration is simple** with built-in support for Pinboard, Delicious, GitHub Repositories, Disqus Comments and Google Analytics.
-4. **It's easy to use.** A collection of rake tasks simplifies development and makes deploying a cinch.
-5. **Ships with great plug-ins** some original and others from the Jekyll community &mdash; tested and improved.
-
-**Note**: Octopress requires a minimum Ruby version of `1.9.3-p0`.
-
-## Documentation
-
-Check out [Octopress.org](http://octopress.org/docs) for guides and documentation.
-It should all apply to our current stable version (found in the `master`
-branch). If this is not the case, [please submit a
-fix to our docs repo](https://github.com/octopress/docs).
-
-## Contributing
-
-[![Build Status](https://travis-ci.org/imathis/octopress.png?branch=master)](https://travis-ci.org/imathis/octopress)
-
-We love to see people contributing to Octopress, whether it's a bug report, feature suggestion or a pull request. At the moment, we try to keep the core slick and lean, focusing on basic blogging needs, so some of your suggestions might not find their way into Octopress. For those ideas, we started a [list of 3rd party plug-ins](https://github.com/imathis/octopress/wiki/3rd-party-plugins), where you can link your own Octopress plug-in repositories. For the future, we're thinking about ways to easier add them into our main releases.
-
-
-## License
-(The MIT License)
-
-Copyright © 2009-2013 Brandon Mathis
-
-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.
-
-
-#### If you want to be awesome.
-- Proudly display the 'Powered by Octopress' credit in the footer.
-- Add your site to the Wiki so we can watch the community grow.
diff --git a/Rakefile b/Rakefile
deleted file mode 100644
index a6c7c0e8..00000000
--- a/Rakefile
+++ /dev/null
@@ -1,404 +0,0 @@
-require "rubygems"
-require "bundler/setup"
-require "stringex"
-
-## -- Rsync Deploy config -- ##
-# Be sure your public key is listed in your server's ~/.ssh/authorized_keys file
-ssh_user       = "user@domain.com"
-ssh_port       = "22"
-document_root  = "~/website.com/"
-rsync_delete   = false
-rsync_args     = ""  # Any extra arguments to pass to rsync
-deploy_default = "push"
-
-# This will be configured for you when you run config_deploy
-deploy_branch  = "master"
-
-## -- Misc Configs -- ##
-
-public_dir      = "public"    # compiled site directory
-source_dir      = "source"    # source file directory
-blog_index_dir  = 'source'    # directory for your blog's index page (if you put your index in source/blog/index.html, set this to 'source/blog')
-deploy_dir      = "_deploy"   # deploy directory (for Github pages deployment)
-stash_dir       = "_stash"    # directory to stash posts for speedy generation
-posts_dir       = "_posts"    # directory for blog files
-themes_dir      = ".themes"   # directory for blog files
-new_post_ext    = "md"        # default new post file extension when using the new_post task
-new_page_ext    = "md"        # default new page file extension when using the new_page task
-server_port     = "4000"      # port for preview server eg. localhost:4000
-
-if (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
-  puts '## Set the codepage to 65001 for Windows machines'
-  `chcp 65001`
-end
-
-desc "Initial setup for Octopress: copies the default theme into the path of Jekyll's generator. Rake install defaults to rake install[classic] to install a different theme run rake install[some_theme_name]"
-task :install, :theme do |t, args|
-  if File.directory?(source_dir) || File.directory?("sass")
-    abort("rake aborted!") if ask("A theme is already installed, proceeding will overwrite existing files. Are you sure?", ['y', 'n']) == 'n'
-  end
-  # copy theme into working Jekyll directories
-  theme = args.theme || 'classic'
-  puts "## Copying "+theme+" theme into ./#{source_dir} and ./sass"
-  mkdir_p source_dir
-  cp_r "#{themes_dir}/#{theme}/source/.", source_dir
-  mkdir_p "sass"
-  cp_r "#{themes_dir}/#{theme}/sass/.", "sass"
-  mkdir_p "#{source_dir}/#{posts_dir}"
-  mkdir_p public_dir
-end
-
-#######################
-# Working with Jekyll #
-#######################
-
-desc "Generate jekyll site"
-task :generate do
-  raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir)
-  puts "## Generating Site with Jekyll"
-  system "compass compile --css-dir #{source_dir}/stylesheets"
-  system "jekyll build"
-end
-
-desc "Watch the site and regenerate when it changes"
-task :watch do
-  raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir)
-  puts "Starting to watch source with Jekyll and Compass."
-  system "compass compile --css-dir #{source_dir}/stylesheets" unless File.exist?("#{source_dir}/stylesheets/screen.css")
-  jekyllPid = Process.spawn({"OCTOPRESS_ENV"=>"preview"}, "jekyll build --watch")
-  compassPid = Process.spawn("compass watch")
-
-  trap("INT") {
-    [jekyllPid, compassPid].each { |pid| Process.kill(9, pid) rescue Errno::ESRCH }
-    exit 0
-  }
-
-  [jekyllPid, compassPid].each { |pid| Process.wait(pid) }
-end
-
-desc "preview the site in a web browser"
-task :preview do
-  raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir)
-  puts "Starting to watch source with Jekyll and Compass. Starting Rack on port #{server_port}"
-  system "compass compile --css-dir #{source_dir}/stylesheets" unless File.exist?("#{source_dir}/stylesheets/screen.css")
-  jekyllPid = Process.spawn({"OCTOPRESS_ENV"=>"preview"}, "jekyll build --watch")
-  compassPid = Process.spawn("compass watch")
-  rackupPid = Process.spawn("rackup --port #{server_port}")
-
-  trap("INT") {
-    [jekyllPid, compassPid, rackupPid].each { |pid| Process.kill(9, pid) rescue Errno::ESRCH }
-    exit 0
-  }
-
-  [jekyllPid, compassPid, rackupPid].each { |pid| Process.wait(pid) }
-end
-
-# usage rake new_post[my-new-post] or rake new_post['my new post'] or rake new_post (defaults to "new-post")
-desc "Begin a new post in #{source_dir}/#{posts_dir}"
-task :new_post, :title do |t, args|
-  if args.title
-    title = args.title
-  else
-    title = get_stdin("Enter a title for your post: ")
-  end
-  raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir)
-  mkdir_p "#{source_dir}/#{posts_dir}"
-  filename = "#{source_dir}/#{posts_dir}/#{Time.now.strftime('%Y-%m-%d')}-#{title.to_url}.#{new_post_ext}"
-  if File.exist?(filename)
-    abort("rake aborted!") if ask("#{filename} already exists. Do you want to overwrite?", ['y', 'n']) == 'n'
-  end
-  puts "Creating new post: #{filename}"
-  open(filename, 'w') do |post|
-    post.puts "---"
-    post.puts "layout: post"
-    post.puts "title: \"#{title.gsub(/&/,'&amp;')}\""
-    post.puts "date: #{Time.now.strftime('%Y-%m-%d %H:%M:%S %z')}"
-    post.puts "comments: true"
-    post.puts "categories: "
-    post.puts "---"
-  end
-end
-
-# usage rake new_page[my-new-page] or rake new_page[my-new-page.html] or rake new_page (defaults to "new-page.markdown")
-desc "Create a new page in #{source_dir}/(filename)/index.#{new_page_ext}"
-task :new_page, :filename do |t, args|
-  raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir)
-  args.with_defaults(:filename => 'new-page')
-  page_dir = [source_dir]
-  if args.filename.downcase =~ /(^.+\/)?(.+)/
-    filename, dot, extension = $2.rpartition('.').reject(&:empty?)         # Get filename and extension
-    title = filename
-    page_dir.concat($1.downcase.sub(/^\//, '').split('/')) unless $1.nil?  # Add path to page_dir Array
-    if extension.nil?
-      page_dir << filename
-      filename = "index"
-    end
-    extension ||= new_page_ext
-    page_dir = page_dir.map! { |d| d = d.to_url }.join('/')                # Sanitize path
-    filename = filename.downcase.to_url
-
-    mkdir_p page_dir
-    file = "#{page_dir}/#{filename}.#{extension}"
-    if File.exist?(file)
-      abort("rake aborted!") if ask("#{file} already exists. Do you want to overwrite?", ['y', 'n']) == 'n'
-    end
-    puts "Creating new page: #{file}"
-    open(file, 'w') do |page|
-      page.puts "---"
-      page.puts "layout: page"
-      page.puts "title: \"#{title}\""
-      page.puts "date: #{Time.now.strftime('%Y-%m-%d %H:%M')}"
-      page.puts "comments: true"
-      page.puts "sharing: true"
-      page.puts "footer: true"
-      page.puts "---"
-    end
-  else
-    puts "Syntax error: #{args.filename} contains unsupported characters"
-  end
-end
-
-# usage rake isolate[my-post]
-desc "Move all other posts than the one currently being worked on to a temporary stash location (stash) so regenerating the site happens much more quickly."
-task :isolate, :filename do |t, args|
-  stash_dir = "#{source_dir}/#{stash_dir}"
-  FileUtils.mkdir(stash_dir) unless File.exist?(stash_dir)
-  Dir.glob("#{source_dir}/#{posts_dir}/*.*") do |post|
-    FileUtils.mv post, stash_dir unless post.include?(args.filename)
-  end
-end
-
-desc "Move all stashed posts back into the posts directory, ready for site generation."
-task :integrate do
-  FileUtils.mv Dir.glob("#{source_dir}/#{stash_dir}/*.*"), "#{source_dir}/#{posts_dir}/"
-end
-
-desc "Clean out caches: .pygments-cache, .gist-cache, .sass-cache"
-task :clean do
-  rm_rf [Dir.glob(".pygments-cache/**"), Dir.glob(".gist-cache/**"), Dir.glob(".sass-cache/**"), "source/stylesheets/screen.css"]
-end
-
-desc "Move sass to sass.old, install sass theme updates, replace sass/custom with sass.old/custom"
-task :update_style, :theme do |t, args|
-  theme = args.theme || 'classic'
-  if File.directory?("sass.old")
-    puts "removed existing sass.old directory"
-    rm_r "sass.old", :secure=>true
-  end
-  mv "sass", "sass.old"
-  puts "## Moved styles into sass.old/"
-  cp_r "#{themes_dir}/"+theme+"/sass/", "sass", :remove_destination=>true
-  cp_r "sass.old/custom/.", "sass/custom/", :remove_destination=>true
-  puts "## Updated Sass ##"
-end
-
-desc "Move source to source.old, install source theme updates, replace source/_includes/navigation.html with source.old's navigation"
-task :update_source, :theme do |t, args|
-  theme = args.theme || 'classic'
-  if File.directory?("#{source_dir}.old")
-    puts "## Removed existing #{source_dir}.old directory"
-    rm_r "#{source_dir}.old", :secure=>true
-  end
-  mkdir "#{source_dir}.old"
-  cp_r "#{source_dir}/.", "#{source_dir}.old"
-  puts "## Copied #{source_dir} into #{source_dir}.old/"
-  cp_r "#{themes_dir}/"+theme+"/source/.", source_dir, :remove_destination=>true
-  cp_r "#{source_dir}.old/_includes/custom/.", "#{source_dir}/_includes/custom/", :remove_destination=>true
-  cp "#{source_dir}.old/favicon.png", source_dir
-  mv "#{source_dir}/index.html", "#{blog_index_dir}", :force=>true if blog_index_dir != source_dir
-  cp "#{source_dir}.old/index.html", source_dir if blog_index_dir != source_dir && File.exists?("#{source_dir}.old/index.html")
-  puts "## Updated #{source_dir} ##"
-end
-
-##############
-# Deploying  #
-##############
-
-desc "Default deploy task"
-task :deploy do
-  # Check if preview posts exist, which should not be published
-  if File.exists?(".preview-mode")
-    puts "## Found posts in preview mode, regenerating files ..."
-    File.delete(".preview-mode")
-    Rake::Task[:generate].execute
-  end
-
-  Rake::Task[:copydot].invoke(source_dir, public_dir)
-  Rake::Task["#{deploy_default}"].execute
-end
-
-desc "Generate website and deploy"
-task :gen_deploy => [:integrate, :generate, :deploy] do
-end
-
-desc "copy dot files for deployment"
-task :copydot, :source, :dest do |t, args|
-  FileList["#{args.source}/**/.*"].exclude("**/.", "**/..", "**/.DS_Store", "**/._*").each do |file|
-    cp_r file, file.gsub(/#{args.source}/, "#{args.dest}") unless File.directory?(file)
-  end
-end
-
-desc "Deploy website via rsync"
-task :rsync do
-  exclude = ""
-  if File.exists?('./rsync-exclude')
-    exclude = "--exclude-from '#{File.expand_path('./rsync-exclude')}'"
-  end
-  puts "## Deploying website via Rsync"
-  ok_failed system("rsync -avze 'ssh -p #{ssh_port}' #{exclude} #{rsync_args} #{"--delete" unless rsync_delete == false} #{public_dir}/ #{ssh_user}:#{document_root}")
-end
-
-desc "deploy public directory to github pages"
-multitask :push do
-  puts "## Deploying branch to Github Pages "
-  puts "## Pulling any updates from Github Pages "
-  cd "#{deploy_dir}" do 
-    Bundler.with_clean_env { system "git pull" }
-  end
-  (Dir["#{deploy_dir}/*"]).each { |f| rm_rf(f) }
-  Rake::Task[:copydot].invoke(public_dir, deploy_dir)
-  puts "\n## Copying #{public_dir} to #{deploy_dir}"
-  cp_r "#{public_dir}/.", deploy_dir
-  cd "#{deploy_dir}" do
-    system "git add -A"
-    message = "Site updated at #{Time.now.utc}"
-    puts "\n## Committing: #{message}"
-    system "git commit -m \"#{message}\""
-    puts "\n## Pushing generated #{deploy_dir} website"
-    Bundler.with_clean_env { system "git push origin #{deploy_branch}" }
-    puts "\n## Github Pages deploy complete"
-  end
-end
-
-desc "Update configurations to support publishing to root or sub directory"
-task :set_root_dir, :dir do |t, args|
-  puts ">>> !! Please provide a directory, eg. rake config_dir[publishing/subdirectory]" unless args.dir
-  if args.dir
-    if args.dir == "/"
-      dir = ""
-    else
-      dir = "/" + args.dir.sub(/(\/*)(.+)/, "\\2").sub(/\/$/, '');
-    end
-    rakefile = IO.read(__FILE__)
-    rakefile.sub!(/public_dir(\s*)=(\s*)(["'])[\w\-\/]*["']/, "public_dir\\1=\\2\\3public#{dir}\\3")
-    File.open(__FILE__, 'w') do |f|
-      f.write rakefile
-    end
-    compass_config = IO.read('config.rb')
-    compass_config.sub!(/http_path(\s*)=(\s*)(["'])[\w\-\/]*["']/, "http_path\\1=\\2\\3#{dir}/\\3")
-    compass_config.sub!(/http_images_path(\s*)=(\s*)(["'])[\w\-\/]*["']/, "http_images_path\\1=\\2\\3#{dir}/images\\3")
-    compass_config.sub!(/http_fonts_path(\s*)=(\s*)(["'])[\w\-\/]*["']/, "http_fonts_path\\1=\\2\\3#{dir}/fonts\\3")
-    compass_config.sub!(/css_dir(\s*)=(\s*)(["'])[\w\-\/]*["']/, "css_dir\\1=\\2\\3public#{dir}/stylesheets\\3")
-    File.open('config.rb', 'w') do |f|
-      f.write compass_config
-    end
-    jekyll_config = IO.read('_config.yml')
-    jekyll_config.sub!(/^destination:.+$/, "destination: public#{dir}")
-    jekyll_config.sub!(/^subscribe_rss:\s*\/.+$/, "subscribe_rss: #{dir}/atom.xml")
-    jekyll_config.sub!(/^root:.*$/, "root: /#{dir.sub(/^\//, '')}")
-    File.open('_config.yml', 'w') do |f|
-      f.write jekyll_config
-    end
-    rm_rf public_dir
-    mkdir_p "#{public_dir}#{dir}"
-    puts "## Site's root directory is now '/#{dir.sub(/^\//, '')}' ##"
-  end
-end
-
-desc "Set up _deploy folder and deploy branch for Github Pages deployment"
-task :setup_github_pages, :repo do |t, args|
-  if args.repo
-    repo_url = args.repo
-  else
-    puts "Enter the read/write url for your repository"
-    puts "(For example, 'git@github.com:your_username/your_username.github.io.git)"
-    puts "           or 'https://github.com/your_username/your_username.github.io')"
-    repo_url = get_stdin("Repository url: ")
-  end
-  protocol = (repo_url.match(/(^git)@/).nil?) ? 'https' : 'git'
-  if protocol == 'git'
-    user = repo_url.match(/:([^\/]+)/)[1]
-  else
-    user = repo_url.match(/github\.com\/([^\/]+)/)[1]
-  end
-  branch = (repo_url.match(/\/[\w-]+\.github\.(?:io|com)/).nil?) ? 'gh-pages' : 'master'
-  project = (branch == 'gh-pages') ? repo_url.match(/\/([^\.]+)/)[1] : ''
-  unless (`git remote -v` =~ /origin.+?octopress(?:\.git)?/).nil?
-    # If octopress is still the origin remote (from cloning) rename it to octopress
-    system "git remote rename origin octopress"
-    if branch == 'master'
-      # If this is a user/organization pages repository, add the correct origin remote
-      # and checkout the source branch for committing changes to the blog source.
-      system "git remote add origin #{repo_url}"
-      puts "Added remote #{repo_url} as origin"
-      system "git config branch.master.remote origin"
-      puts "Set origin as default remote"
-      system "git branch -m master source"
-      puts "Master branch renamed to 'source' for committing your blog source files"
-    else
-      unless !public_dir.match("#{project}").nil?
-        system "rake set_root_dir[#{project}]"
-      end
-    end
-  end
-  jekyll_config = IO.read('_config.yml')
-  jekyll_config.sub!(/^url:.*$/, "url: #{blog_url(user, project)}")
-  File.open('_config.yml', 'w') do |f|
-    f.write jekyll_config
-  end
-  rm_rf deploy_dir
-  mkdir deploy_dir
-  cd "#{deploy_dir}" do
-    system "git init"
-    system "echo 'My Octopress Page is coming soon &hellip;' > index.html"
-    system "git add ."
-    system "git commit -m \"Octopress init\""
-    system "git branch -m gh-pages" unless branch == 'master'
-    system "git remote add origin #{repo_url}"
-    rakefile = IO.read(__FILE__)
-    rakefile.sub!(/deploy_branch(\s*)=(\s*)(["'])[\w-]*["']/, "deploy_branch\\1=\\2\\3#{branch}\\3")
-    rakefile.sub!(/deploy_default(\s*)=(\s*)(["'])[\w-]*["']/, "deploy_default\\1=\\2\\3push\\3")
-    File.open(__FILE__, 'w') do |f|
-      f.write rakefile
-    end
-  end
-  puts "\n---\n## Now you can deploy to #{repo_url} with `rake deploy` ##"
-end
-
-def ok_failed(condition)
-  if (condition)
-    puts "OK"
-  else
-    puts "FAILED"
-  end
-end
-
-def get_stdin(message)
-  print message
-  STDIN.gets.chomp
-end
-
-def ask(message, valid_options)
-  if valid_options
-    answer = get_stdin("#{message} #{valid_options.to_s.gsub(/"/, '').gsub(/, /,'/')} ") while !valid_options.include?(answer)
-  else
-    answer = get_stdin(message)
-  end
-  answer
-end
-
-def blog_url(user, project)
-  url = if File.exists?('source/CNAME')
-    "http://#{IO.read('source/CNAME').strip}"
-  else
-    "http://#{user}.github.io"
-  end
-  url += "/#{project}" unless project == ''
-  url
-end
-
-desc "list tasks"
-task :list do
-  puts "Tasks: #{(Rake::Task.tasks - [Rake::Task[:list]]).join(', ')}"
-  puts "(type rake -T for more detail)\n\n"
-end
diff --git a/_config.yml b/_config.yml
deleted file mode 100644
index dd7f4c96..00000000
--- a/_config.yml
+++ /dev/null
@@ -1,101 +0,0 @@
-# ----------------------- #
-#      Main Configs       #
-# ----------------------- #
-
-url: http://zmwangx.github.io
-title: dl? cmplnts?
-subtitle: Mostly technical stuff. Can you figure out what the title stands for?
-author: Zhiming Wang
-simple_search: https://www.google.com/search
-description: Yet another crappy blog.
-
-# Default date format is "ordinal" (resulting in "July 22nd 2007")
-# You can customize the format as defined in
-# http://www.ruby-doc.org/core-1.9.2/Time.html#method-i-strftime
-# Additionally, %o will give you the ordinal representation of the day
-date_format: "ordinal"
-
-# RSS / Email (optional) subscription links (change if using something like Feedburner)
-subscribe_rss: /atom.xml
-subscribe_email:
-# RSS feeds can list your email address if you like
-email:
-
-# ----------------------- #
-#    Jekyll & Plugins     #
-# ----------------------- #
-
-# If publishing to a subdirectory as in http://site.com/project set 'root: /project'
-root: /
-permalink: /blog/:year/:month/:day/:title/
-source: source
-destination: public
-plugins: plugins
-code_dir: downloads/code
-category_dir: blog/categories
-markdown: rdiscount
-rdiscount:
-  extensions:
-    - autolink
-    - footnotes
-    - smart
-highlighter: pygments # default python pygments have been replaced by pygments.rb
-
-paginate: 10          # Posts per page on the blog index
-paginate_path: "posts/:num"  # Directory base for pagination URLs eg. /posts/2/
-recent_posts: 5       # Posts in the sidebar Recent Posts section
-excerpt_link: "Read on &rarr;"  # "Continue reading" link text at the bottom of excerpted articles
-excerpt_separator: "<!--more-->"
-
-titlecase: true       # Converts page and post titles to titlecase
-
-# list each of the sidebar modules you want to include, in the order you want them to appear.
-# To add custom asides, create files in /source/_includes/custom/asides/ and add them to the list like 'custom/asides/custom_aside_name.html'
-default_asides: [asides/recent_posts.html, asides/github.html, asides/delicious.html, asides/pinboard.html, asides/googleplus.html]
-
-# Each layout uses the default asides, but they can have their own asides instead. Simply uncomment the lines below
-# and add an array with the asides you want to use.
-# blog_index_asides:
-# post_asides:
-# page_asides:
-
-# ----------------------- #
-#   3rd Party Settings    #
-# ----------------------- #
-
-# Github repositories
-github_user: zmwangx
-github_repo_count: 0
-github_show_profile_link: true
-github_skip_forks: true
-
-# Twitter
-twitter_user:
-twitter_tweet_button: true
-
-# Google +1
-google_plus_one: false
-google_plus_one_size: medium
-
-# Google Plus Profile
-# Hidden: No visible button, just add author information to search results
-googleplus_user:
-googleplus_hidden: false
-
-# Pinboard
-pinboard_user:
-pinboard_count: 3
-
-# Delicious
-delicious_user:
-delicious_count: 3
-
-# Disqus Comments
-disqus_short_name: zmwangx
-disqus_show_comment_count: true
-
-# Google Analytics
-google_analytics_tracking_id: UA-53908325-1
-
-# Facebook Like
-facebook_like: false
diff --git a/config.rb b/config.rb
deleted file mode 100644
index 408aecaf..00000000
--- a/config.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-require 'sass-globbing'
-
-# Require any additional compass plugins here.
-project_type = :stand_alone
-
-# Publishing paths
-http_path = "/"
-http_images_path = "/images"
-http_generated_images_path = "/images"
-http_fonts_path = "/fonts"
-css_dir = "public/stylesheets"
-
-# Local development paths
-sass_dir = "sass"
-images_dir = "source/images"
-fonts_dir = "source/fonts"
-
-line_comments = false
-output_style = :compressed
diff --git a/config.ru b/config.ru
deleted file mode 100644
index 8e3dc08a..00000000
--- a/config.ru
+++ /dev/null
@@ -1,25 +0,0 @@
-require 'bundler/setup'
-require 'sinatra/base'
-
-# The project root directory
-$root = ::File.dirname(__FILE__)
-
-class SinatraStaticServer < Sinatra::Base
-
-  get(/.+/) do
-    send_sinatra_file(request.path) {404}
-  end
-
-  not_found do
-    send_file(File.join(File.dirname(__FILE__), 'public', '404.html'), {:status => 404})
-  end
-
-  def send_sinatra_file(path, &missing_file_block)
-    file_path = File.join(File.dirname(__FILE__), 'public',  path)
-    file_path = File.join(file_path, 'index.html') unless file_path =~ /\.[a-z]+$/i
-    File.exist?(file_path) ? send_file(file_path) : missing_file_block.call
-  end
-
-end
-
-run SinatraStaticServer
diff --git a/plugins/backtick_code_block.rb b/plugins/backtick_code_block.rb
deleted file mode 100644
index ae4a0472..00000000
--- a/plugins/backtick_code_block.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-require './plugins/pygments_code'
-
-module BacktickCodeBlock
-  AllOptions = /([^\s]+)\s+(.+?)\s+(https?:\/\/\S+|\/\S+)\s*(.+)?/i
-  LangCaption = /([^\s]+)\s*(.+)?/i
-  def self.render_code_block(input)
-    @options = nil
-    @caption = nil
-    @lang = nil
-    @url = nil
-    @title = nil
-    input.gsub(/^`{3} *([^\n]+)?\n(.+?)\n`{3}/m) do
-      @options = $1 || ''
-      str = $2
-
-      if @options =~ AllOptions
-        @lang = $1
-        @caption = "<figcaption><span>#{$2}</span><a href='#{$3}'>#{$4 || 'link'}</a></figcaption>"
-      elsif @options =~ LangCaption
-        @lang = $1
-        @caption = "<figcaption><span>#{$2}</span></figcaption>"
-      end
-
-      if str.match(/\A( {4}|\t)/)
-        str = str.gsub(/^( {4}|\t)/, '')
-      end
-      if @lang.nil? || @lang == 'plain'
-        code = HighlightCode::tableize_code(str.gsub('<','&lt;').gsub('>','&gt;'))
-        "<figure class='code'>#{@caption}#{code}</figure>"
-      else
-        if @lang.include? "-raw"
-          raw = "``` #{@options.sub('-raw', '')}\n"
-          raw += str
-          raw += "\n```\n"
-        else
-          code = HighlightCode::highlight(str, @lang)
-          "<figure class='code'>#{@caption}#{code}</figure>"
-        end
-      end
-    end
-  end
-end
diff --git a/plugins/blockquote.rb b/plugins/blockquote.rb
deleted file mode 100644
index ebdc0e89..00000000
--- a/plugins/blockquote.rb
+++ /dev/null
@@ -1,82 +0,0 @@
-#
-# Author: Brandon Mathis
-# A full rewrite based on the work of: Josediaz Gonzalez - https://github.com/josegonzalez/josediazgonzalez.com/blob/master/_plugins/blockquote.rb
-#
-# Outputs a string with a given attribution as a quote
-#
-#   {% blockquote Bobby Willis http://google.com/search?q=pants the search for bobby's pants %}
-#   Wheeee!
-#   {% endblockquote %}
-#   ...
-#   <blockquote>
-#     <p>Wheeee!</p>
-#     <footer>
-#     <strong>Bobby Willis</strong><cite><a href="http://google.com/search?q=pants">The Search For Bobby's Pants</a>
-#   </blockquote>
-#
-require './plugins/titlecase.rb'
-
-module Jekyll
-
-  class Blockquote < Liquid::Block
-    FullCiteWithTitle = /(\S.*)\s+(https?:\/\/)(\S+)\s+(.+)/i
-    FullCite = /(\S.*)\s+(https?:\/\/)(\S+)/i
-    AuthorTitle = /([^,]+),([^,]+)/
-    Author =  /(.+)/
-
-    def initialize(tag_name, markup, tokens)
-      @by = nil
-      @source = nil
-      @title = nil
-      if markup =~ FullCiteWithTitle
-        @by = $1
-        @source = $2 + $3
-        @title = $4.titlecase.strip
-      elsif markup =~ FullCite
-        @by = $1
-        @source = $2 + $3
-      elsif markup =~ AuthorTitle
-        @by = $1
-        @title = $2.titlecase.strip
-      elsif markup =~ Author
-        @by = $1
-      end
-      super
-    end
-
-    def render(context)
-      quote = paragraphize(super)
-      author = "<strong>#{@by.strip}</strong>" if @by
-      if @source
-        url = @source.match(/https?:\/\/(.+)/)[1].split('/')
-        parts = []
-        url.each do |part|
-          if (parts + [part]).join('/').length < 32
-            parts << part
-          end
-        end
-        source = parts.join('/')
-        source << '/&hellip;' unless source == @source
-      end
-      if !@source.nil?
-        cite = " <cite><a href='#{@source}'>#{(@title || source)}</a></cite>"
-      elsif !@title.nil?
-        cite = " <cite>#{@title}</cite>"
-      end
-      blockquote = if @by.nil?
-        quote
-      elsif cite
-        "#{quote}<footer>#{author + cite}</footer>"
-      else
-        "#{quote}<footer>#{author}</footer>"
-      end
-      "<blockquote>#{blockquote}</blockquote>"
-    end
-
-    def paragraphize(input)
-      "<p>#{input.lstrip.rstrip.gsub(/\n\n/, '</p><p>').gsub(/\n/, '<br/>')}</p>"
-    end
-  end
-end
-
-Liquid::Template.register_tag('blockquote', Jekyll::Blockquote)
diff --git a/plugins/category_generator.rb b/plugins/category_generator.rb
deleted file mode 100644
index c55d62f4..00000000
--- a/plugins/category_generator.rb
+++ /dev/null
@@ -1,193 +0,0 @@
-# encoding: utf-8
-#
-# Jekyll category page generator.
-# http://recursive-design.com/projects/jekyll-plugins/
-#
-# Version: 0.1.4 (201101061053)
-#
-# Copyright (c) 2010 Dave Perrett, http://recursive-design.com/
-# Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-#
-# A generator that creates category pages for jekyll sites.
-#
-# Included filters :
-# - category_links:      Outputs the list of categories as comma-separated <a> links.
-# - date_to_html_string: Outputs the post.date as formatted html, with hooks for CSS styling.
-#
-# Available _config.yml settings :
-# - category_dir:          The subfolder to build category pages in (default is 'categories').
-# - category_title_prefix: The string used before the category name in the page title (default is
-#                          'Category: ').
-
-require 'stringex'
-
-module Jekyll
-
-  # The CategoryIndex class creates a single category page for the specified category.
-  class CategoryIndex < Page
-
-    # Initializes a new CategoryIndex.
-    #
-    #  +base+         is the String path to the <source>.
-    #  +category_dir+ is the String path between <source> and the category folder.
-    #  +category+     is the category currently being processed.
-    def initialize(site, base, category_dir, category)
-      @site = site
-      @base = base
-      @dir  = category_dir
-      @name = 'index.html'
-      self.process(@name)
-      # Read the YAML data from the layout page.
-      self.read_yaml(File.join(base, '_layouts'), 'category_index.html')
-      self.data['category']    = category
-      # Set the title for this page.
-      title_prefix             = site.config['category_title_prefix'] || 'Category: '
-      self.data['title']       = "#{title_prefix}#{category}"
-      # Set the meta-description for this page.
-      meta_description_prefix  = site.config['category_meta_description_prefix'] || 'Category: '
-      self.data['description'] = "#{meta_description_prefix}#{category}"
-    end
-
-  end
-
-  # The CategoryFeed class creates an Atom feed for the specified category.
-  class CategoryFeed < Page
-
-    # Initializes a new CategoryFeed.
-    #
-    #  +base+         is the String path to the <source>.
-    #  +category_dir+ is the String path between <source> and the category folder.
-    #  +category+     is the category currently being processed.
-    def initialize(site, base, category_dir, category)
-      @site = site
-      @base = base
-      @dir  = category_dir
-      @name = 'atom.xml'
-      self.process(@name)
-      # Read the YAML data from the layout page.
-      self.read_yaml(File.join(base, '_includes/custom'), 'category_feed.xml')
-      self.data['category']    = category
-      # Set the title for this page.
-      title_prefix             = site.config['category_title_prefix'] || 'Category: '
-      self.data['title']       = "#{title_prefix}#{category}"
-      # Set the meta-description for this page.
-      meta_description_prefix  = site.config['category_meta_description_prefix'] || 'Category: '
-      self.data['description'] = "#{meta_description_prefix}#{category}"
-
-      # Set the correct feed URL.
-      self.data['feed_url'] = "#{category_dir}/#{name}"
-    end
-
-  end
-
-  # The Site class is a built-in Jekyll class with access to global site config information.
-  class Site
-
-    # Creates an instance of CategoryIndex for each category page, renders it, and
-    # writes the output to a file.
-    #
-    #  +category_dir+ is the String path to the category folder.
-    #  +category+     is the category currently being processed.
-    def write_category_index(category_dir, category)
-      index = CategoryIndex.new(self, self.source, category_dir, category)
-      index.render(self.layouts, site_payload)
-      index.write(self.dest)
-      # Record the fact that this page has been added, otherwise Site::cleanup will remove it.
-      self.pages << index
-
-      # Create an Atom-feed for each index.
-      feed = CategoryFeed.new(self, self.source, category_dir, category)
-      feed.render(self.layouts, site_payload)
-      feed.write(self.dest)
-      # Record the fact that this page has been added, otherwise Site::cleanup will remove it.
-      self.pages << feed
-    end
-
-    # Loops through the list of category pages and processes each one.
-    def write_category_indexes
-      if self.layouts.key? 'category_index'
-        dir = self.config['category_dir'] || 'categories'
-        self.categories.keys.each do |category|
-          self.write_category_index(File.join(dir, category.to_url), category)
-        end
-
-      # Throw an exception if the layout couldn't be found.
-      else
-        raise <<-ERR
-
-
-===============================================
- Error for category_generator.rb plugin
------------------------------------------------
- No 'category_index.html' in source/_layouts/
- Perhaps you haven't installed a theme yet.
-===============================================
-
-ERR
-      end
-    end
-
-  end
-
-
-  # Jekyll hook - the generate method is called by jekyll, and generates all of the category pages.
-  class GenerateCategories < Generator
-    safe true
-    priority :low
-
-    def generate(site)
-      site.write_category_indexes
-    end
-
-  end
-
-
-  # Adds some extra filters used during the category creation process.
-  module Filters
-
-    # Outputs a list of categories as comma-separated <a> links. This is used
-    # to output the category list for each post on a category page.
-    #
-    #  +categories+ is the list of categories to format.
-    #
-    # Returns string
-    #
-    def category_links(categories)
-      categories = categories.sort!.map { |c| category_link c }
-
-      case categories.length
-      when 0
-        ""
-      when 1
-        categories[0].to_s
-      else
-        "#{categories[0...-1].join(', ')}, #{categories[-1]}"
-      end
-    end
-
-    # Outputs a single category as an <a> link.
-    #
-    #  +category+ is a category string to format as an <a> link
-    #
-    # Returns string
-    #
-    def category_link(category)
-      dir = @context.registers[:site].config['category_dir']
-      "<a class='category' href='/#{dir}/#{category.to_url}/'>#{category}</a>"
-    end
-
-    # Outputs the post.date as formatted html, with hooks for CSS styling.
-    #
-    #  +date+ is the date object to format as HTML.
-    #
-    # Returns string
-    def date_to_html_string(date)
-      result = '<span class="month">' + date.strftime('%b').upcase + '</span> '
-      result += date.strftime('<span class="day">%d</span> ')
-      result += date.strftime('<span class="year">%Y</span> ')
-      result
-    end
-
-  end
-
-end
diff --git a/plugins/code_block.rb b/plugins/code_block.rb
deleted file mode 100644
index 539a3475..00000000
--- a/plugins/code_block.rb
+++ /dev/null
@@ -1,92 +0,0 @@
-# Title: Simple Code Blocks for Jekyll
-# Author: Brandon Mathis http://brandonmathis.com
-# Description: Write codeblocks with semantic HTML5 <figure> and <figcaption> elements and optional syntax highlighting — all with a simple, intuitive interface.
-#
-# Syntax:
-# {% codeblock [title] [url] [link text] %}
-# code snippet
-# {% endcodeblock %}
-#
-# For syntax highlighting, put a file extension somewhere in the title. examples:
-# {% codeblock file.sh %}
-# code snippet
-# {% endcodeblock %}
-#
-# {% codeblock Time to be Awesome! (awesome.rb) %}
-# code snippet
-# {% endcodeblock %}
-#
-# Example:
-#
-# {% codeblock Got pain? painreleif.sh http://site.com/painreleief.sh Download it! %}
-# $ rm -rf ~/PAIN
-# {% endcodeblock %}
-#
-# Output:
-#
-# <figure class='code'>
-# <figcaption><span>Got pain? painrelief.sh</span> <a href="http://site.com/painrelief.sh">Download it!</a>
-# <div class="highlight"><pre><code class="sh">
-# -- nicely escaped highlighted code --
-# </code></pre></div>
-# </figure>
-#
-# Example 2 (no syntax highlighting):
-#
-# {% codeblock %}
-# <sarcasm>Ooooh, sarcasm... How original!</sarcasm>
-# {% endcodeblock %}
-#
-# <figure class='code'>
-# <pre><code>&lt;sarcasm> Ooooh, sarcasm... How original!&lt;/sarcasm></code></pre>
-# </figure>
-#
-require './plugins/pygments_code'
-require './plugins/raw'
-
-module Jekyll
-
-  class CodeBlock < Liquid::Block
-    CaptionUrlTitle = /(\S[\S\s]*)\s+(https?:\/\/\S+|\/\S+)\s*(.+)?/i
-    Caption = /(\S[\S\s]*)/
-    def initialize(tag_name, markup, tokens)
-      @title = nil
-      @caption = nil
-      @filetype = nil
-      @highlight = true
-      if markup =~ /\s*lang:(\S+)/i
-        @filetype = $1
-        markup = markup.sub(/\s*lang:(\S+)/i,'')
-      end
-      if markup =~ CaptionUrlTitle
-        @file = $1
-        @caption = "<figcaption><span>#{$1}</span><a href='#{$2}'>#{$3 || 'link'}</a></figcaption>"
-      elsif markup =~ Caption
-        @file = $1
-        @caption = "<figcaption><span>#{$1}</span></figcaption>\n"
-      end
-      if @file =~ /\S[\S\s]*\w+\.(\w+)/ && @filetype.nil?
-        @filetype = $1
-      end
-      super
-    end
-
-    def render(context)
-      output = super
-      code = super
-      source = "<figure class='code'>"
-      source += @caption if @caption
-      if @filetype
-        source += "#{HighlightCode::highlight(code, @filetype)}</figure>"
-      else
-        source += "#{HighlightCode::tableize_code(code.lstrip.rstrip.gsub(/</,'&lt;'))}</figure>"
-      end
-      source = TemplateWrapper::safe_wrap(source)
-      source = context['pygments_prefix'] + source if context['pygments_prefix']
-      source = source + context['pygments_suffix'] if context['pygments_suffix']
-      source
-    end
-  end
-end
-
-Liquid::Template.register_tag('codeblock', Jekyll::CodeBlock)
diff --git a/plugins/config_tag.rb b/plugins/config_tag.rb
deleted file mode 100644
index 92d1f63c..00000000
--- a/plugins/config_tag.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-require 'json'
-
-class ConfigTag < Liquid::Tag
-  def initialize(tag_name, options, tokens)
-    super
-    options = options.split(' ').map {|i| i.strip }
-    @key = options.slice!(0)
-    @tag = nil
-    @classname = nil
-    options.each do |option|
-      @tag = $1 if option =~ /tag:(\S+)/ 
-      @classname = $1 if option =~ /classname:(\S+)/
-    end
-  end
-
-  def render(context)
-    config_tag(context.registers[:site].config, @key, @tag, @classname)
-  end
-end
-
-def config_tag(config, key, tag=nil, classname=nil)
-  options     = key.split('.').map { |k| config[k] }.last #reference objects with dot notation
-  tag       ||= 'div'
-  classname ||= key.sub(/_/, '-').sub(/\./, '-')
-  output      = "<#{tag} class='#{classname}'"
-
-  if options.respond_to? 'keys'
-    options.each do |k,v|
-      unless v.nil?
-        v = v.join ',' if v.respond_to? 'join'
-        v = v.to_json if v.respond_to? 'keys'
-        output += " data-#{k.sub'_','-'}='#{v}'"
-      end
-    end
-  elsif options.respond_to? 'join'
-    output += " data-value='#{config[key].join(',')}'"
-  else
-    output += " data-value='#{config[key]}'"
-  end
-  output += "></#{tag}>"
-end
-
-Liquid::Template.register_tag('config_tag', ConfigTag)
-
diff --git a/plugins/gist_tag.rb b/plugins/gist_tag.rb
deleted file mode 100644
index 51201156..00000000
--- a/plugins/gist_tag.rb
+++ /dev/null
@@ -1,130 +0,0 @@
-# A Liquid tag for Jekyll sites that allows embedding Gists and showing code for non-JavaScript enabled browsers and readers.
-# by: Brandon Tilly
-# Source URL: https://gist.github.com/1027674
-# Post http://brandontilley.com/2011/01/31/gist-tag-for-jekyll.html
-#
-# Example usage: {% gist 1027674 gist_tag.rb %} //embeds a gist for this plugin
-
-require 'cgi'
-require 'digest/md5'
-require 'net/https'
-require 'uri'
-
-module Jekyll
-  class GistTag < Liquid::Tag
-    def initialize(tag_name, text, token)
-      super
-      @text           = text
-      @cache_disabled = false
-      @cache_folder   = File.expand_path "../.gist-cache", File.dirname(__FILE__)
-      FileUtils.mkdir_p @cache_folder
-    end
-
-    def render(context)
-      if parts = @text.match(/([a-zA-Z\d]*) (.*)/)
-        gist, file = parts[1].strip, parts[2].strip
-      else
-        gist, file = @text.strip, ""
-      end
-      if gist.empty?
-        ""
-      else
-        script_url = script_url_for gist, file
-        code       = get_cached_gist(gist, file) || get_gist_from_web(gist, file)
-        html_output_for script_url, code
-      end
-    end
-
-    def html_output_for(script_url, code)
-      code = CGI.escapeHTML code
-      <<-HTML
-<div><script src='#{script_url}'></script>
-<noscript><pre><code>#{code}</code></pre></noscript></div>
-      HTML
-    end
-
-    def script_url_for(gist_id, filename)
-      url = "https://gist.github.com/#{gist_id}.js"
-      url = "#{url}?file=#{filename}" unless filename.nil? or filename.empty?
-      url
-    end
-
-    def get_gist_url_for(gist, file)
-      "https://gist.githubusercontent.com/raw/#{gist}/#{file}"
-    end
-
-    def cache(gist, file, data)
-      cache_file = get_cache_file_for gist, file
-      File.open(cache_file, "w") do |io|
-        io.write data
-      end
-    end
-
-    def get_cached_gist(gist, file)
-      return nil if @cache_disabled
-      cache_file = get_cache_file_for gist, file
-      File.read cache_file if File.exist? cache_file
-    end
-
-    def get_cache_file_for(gist, file)
-      bad_chars = /[^a-zA-Z0-9\-_.]/
-      gist      = gist.gsub bad_chars, ''
-      file      = file.gsub bad_chars, ''
-      md5       = Digest::MD5.hexdigest "#{gist}-#{file}"
-      File.join @cache_folder, "#{gist}-#{file}-#{md5}.cache"
-    end
-
-    def get_gist_from_web(gist, file)
-      gist_url = get_gist_url_for(gist, file)
-      data     = get_web_content(gist_url)
-
-      locations = Array.new
-      while (data.code.to_i == 301 || data.code.to_i == 302)
-        data = handle_gist_redirecting(data)
-        break if locations.include? data.header['Location']
-        locations << data.header['Location']
-      end
-
-      if data.code.to_i != 200
-        raise RuntimeError, "Gist replied with #{data.code} for #{gist_url}"
-      end
-
-      cache(gist, file, data.body) unless @cache_disabled
-      data.body
-    end
-
-    def handle_gist_redirecting(data)
-      redirected_url = data.header['Location']
-      if redirected_url.nil? || redirected_url.empty?
-        raise ArgumentError, "GitHub replied with a 302 but didn't provide a location in the response headers."
-      end
-
-      get_web_content(redirected_url)
-    end
-
-    def get_web_content(url)
-      raw_uri           = URI.parse url
-      proxy             = ENV['http_proxy']
-      if proxy
-        proxy_uri       = URI.parse(proxy)
-        https           = Net::HTTP::Proxy(proxy_uri.host, proxy_uri.port).new raw_uri.host, raw_uri.port
-      else
-        https           = Net::HTTP.new raw_uri.host, raw_uri.port
-      end
-      https.use_ssl     = true
-      https.verify_mode = OpenSSL::SSL::VERIFY_NONE
-      request           = Net::HTTP::Get.new raw_uri.request_uri
-      data              = https.request request
-    end
-  end
-
-  class GistTagNoCache < GistTag
-    def initialize(tag_name, text, token)
-      super
-      @cache_disabled = true
-    end
-  end
-end
-
-Liquid::Template.register_tag('gist', Jekyll::GistTag)
-Liquid::Template.register_tag('gistnocache', Jekyll::GistTagNoCache)
diff --git a/plugins/haml.rb b/plugins/haml.rb
deleted file mode 100644
index 7e548dec..00000000
--- a/plugins/haml.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-module Jekyll
-  require 'haml'
-  class HamlConverter < Converter
-    safe true
-    priority :low
-
-    def matches(ext)
-      ext =~ /haml/i
-    end
-
-    def output_ext(ext)
-      ".html"
-    end
-
-    def convert(content)
-      begin
-        engine = Haml::Engine.new(content)
-        engine.render
-      rescue StandardError => e
-          puts "!!! HAML Error: " + e.message
-      end
-    end
-  end
-end
diff --git a/plugins/image_tag.rb b/plugins/image_tag.rb
deleted file mode 100644
index 45670007..00000000
--- a/plugins/image_tag.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-# Title: Simple Image tag for Jekyll
-# Authors: Brandon Mathis http://brandonmathis.com
-#          Felix Schäfer, Frederic Hemberger
-# Description: Easily output images with optional class names, width, height, title and alt attributes
-#
-# Syntax {% img [class name(s)] [http[s]:/]/path/to/image [width [height]] [title text | "title text" ["alt text"]] %}
-#
-# Examples:
-# {% img /images/ninja.png Ninja Attack! %}
-# {% img left half http://site.com/images/ninja.png Ninja Attack! %}
-# {% img left half http://site.com/images/ninja.png 150 150 "Ninja Attack!" "Ninja in attack posture" %}
-#
-# Output:
-# <img src="/images/ninja.png">
-# <img class="left half" src="http://site.com/images/ninja.png" title="Ninja Attack!" alt="Ninja Attack!">
-# <img class="left half" src="http://site.com/images/ninja.png" width="150" height="150" title="Ninja Attack!" alt="Ninja in attack posture">
-#
-
-module Jekyll
-
-  class ImageTag < Liquid::Tag
-    @img = nil
-
-    def initialize(tag_name, markup, tokens)
-      attributes = ['class', 'src', 'width', 'height', 'title']
-
-      if markup =~ /(?<class>\S.*\s+)?(?<src>(?:https?:\/\/|\/|\S+\/)\S+)(?:\s+(?<width>\d+))?(?:\s+(?<height>\d+))?(?<title>\s+.+)?/i
-        @img = attributes.reduce({}) { |img, attr| img[attr] = $~[attr].strip if $~[attr]; img }
-        if /(?:"|')(?<title>[^"']+)?(?:"|')\s+(?:"|')(?<alt>[^"']+)?(?:"|')/ =~ @img['title']
-          @img['title']  = title
-          @img['alt']    = alt
-        else
-          @img['alt']    = @img['title'].gsub!(/"/, '&#34;') if @img['title']
-        end
-        @img['class'].gsub!(/"/, '') if @img['class']
-      end
-      super
-    end
-
-    def render(context)
-      if @img
-        "<img #{@img.collect {|k,v| "#{k}=\"#{v}\"" if v}.join(" ")}>"
-      else
-        "Error processing input, expected syntax: {% img [class name(s)] [http[s]:/]/path/to/image [width [height]] [title text | \"title text\" [\"alt text\"]] %}"
-      end
-    end
-  end
-end
-
-Liquid::Template.register_tag('img', Jekyll::ImageTag)
diff --git a/plugins/include_array.rb b/plugins/include_array.rb
deleted file mode 100644
index 000040fb..00000000
--- a/plugins/include_array.rb
+++ /dev/null
@@ -1,58 +0,0 @@
-# Title: Include Array Tag for Jekyll
-# Author: Jason Woodward http://www.woodwardjd.com
-# Description: Import files on your filesystem as specified in a configuration variable in _config.yml.  Mostly cribbed from Jekyll's include tag.
-# Syntax: {% include_array variable_name_from_config.yml %}
-#
-# Example 1:
-# {% include_array asides  %}
-#
-# _config.yml snippet:
-# asides: [asides/twitter.html, asides/custom/my_picture.html]
-#
-module Jekyll
-
-  class IncludeArrayTag < Liquid::Tag
-    Syntax = /(#{Liquid::QuotedFragment}+)/
-    def initialize(tag_name, markup, tokens)
-      if markup =~ Syntax
-        @array_name = $1
-      else
-        raise SyntaxError.new("Error in tag 'include_array' - Valid syntax: include_array [array from _config.yml]")
-      end
-
-      super
-    end
-
-    def render(context)
-      includes_dir = File.join(context.registers[:site].source, '_includes')
-
-      if File.symlink?(includes_dir)
-        return "Includes directory '#{includes_dir}' cannot be a symlink"
-      end
-
-      rtn = ''
-      (context.environments.first['site'][@array_name] || []).each do |file|
-        if file !~ /^[a-zA-Z0-9_\/\.-]+$/ || file =~ /\.\// || file =~ /\/\./
-          rtn = rtn + "Include file '#{file}' contains invalid characters or sequences"
-        end
-
-        Dir.chdir(includes_dir) do
-          choices = Dir['**/*'].reject { |x| File.symlink?(x) }
-          if choices.include?(file)
-            source = File.read(file)
-            partial = Liquid::Template.parse(source)
-            context.stack do
-              rtn = rtn + partial.render(context)
-            end
-          else
-            rtn = rtn + "Included file '#{file}' not found in _includes directory"
-          end
-        end
-      end
-      rtn
-    end
-  end
-
-end
-
-Liquid::Template.register_tag('include_array', Jekyll::IncludeArrayTag)
diff --git a/plugins/include_code.rb b/plugins/include_code.rb
deleted file mode 100644
index a61d06cf..00000000
--- a/plugins/include_code.rb
+++ /dev/null
@@ -1,71 +0,0 @@
-# Title: Include Code Tag for Jekyll
-# Author: Brandon Mathis http://brandonmathis.com
-# Description: Import files on your filesystem into any blog post as embedded code snippets with syntax highlighting and a download link.
-# Configuration: You can set default import path in _config.yml (defaults to code_dir: downloads/code)
-#
-# Syntax {% include_code path/to/file %}
-#
-# Example 1:
-# {% include_code javascripts/test.js %}
-#
-# This will import test.js from source/downloads/code/javascripts/test.js
-# and output the contents in a syntax highlighted code block inside a figure,
-# with a figcaption listing the file name and download link
-#
-# Example 2:
-# You can also include an optional title for the <figcaption>
-#
-# {% include_code Example 2 javascripts/test.js %}
-#
-# will output a figcaption with the title: Example 2 (test.js)
-#
-
-require './plugins/pygments_code'
-require './plugins/raw'
-require 'pathname'
-
-module Jekyll
-
-  class IncludeCodeTag < Liquid::Tag
-    def initialize(tag_name, markup, tokens)
-      @title = nil
-      @file = nil
-      if markup.strip =~ /\s*lang:(\S+)/i
-        @filetype = $1
-        markup = markup.strip.sub(/lang:\S+/i,'')
-      end
-      if markup.strip =~ /(.*)?(\s+|^)(\/*\S+)/i
-        @title = $1 || nil
-        @file = $3
-      end
-      super
-    end
-
-    def render(context)
-      code_dir = (context.registers[:site].config['code_dir'].sub(/^\//,'') || 'downloads/code')
-      code_path = (Pathname.new(context.registers[:site].source) + code_dir).expand_path
-      file = code_path + @file
-
-      if File.symlink?(code_path)
-        return "Code directory '#{code_path}' cannot be a symlink"
-      end
-
-      unless file.file?
-        return "File #{file} could not be found"
-      end
-
-      Dir.chdir(code_path) do
-        code = file.read
-        @filetype = file.extname.sub('.','') if @filetype.nil?
-        title = @title ? "#{@title} (#{file.basename})" : file.basename
-        url = "/#{code_dir}/#{@file}"
-        source = "<figure class='code'><figcaption><span>#{title}</span> <a href='#{url}'>download</a></figcaption>\n"
-        source += "#{HighlightCode::highlight(code, @filetype)}</figure>"
-        TemplateWrapper::safe_wrap(source)
-      end
-    end
-  end
-
-end
-
-Liquid::Template.register_tag('include_code', Jekyll::IncludeCodeTag)
diff --git a/plugins/jsfiddle.rb b/plugins/jsfiddle.rb
deleted file mode 100644
index 815910e2..00000000
--- a/plugins/jsfiddle.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# Title: jsFiddle tag for Jekyll
-# Author: Brian Arnold (@brianarn)
-# Description:
-#   Given a jsFiddle shortcode, outputs the jsFiddle iframe code.
-#   Using 'default' will preserve defaults as specified by jsFiddle.
-#
-# Syntax: {% jsfiddle shorttag [tabs] [skin] [height] [width] %}
-#
-# Examples:
-#
-# Input: {% jsfiddle ccWP7 %}
-# Output: <iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/ccWP7/embedded/js,resources,html,css,result/light/"></iframe>
-#
-# Input: {% jsfiddle ccWP7 js,html,result %}
-# Output: <iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/ccWP7/embedded/js,html,result/light/"></iframe>
-#
-
-module Jekyll
-  class JsFiddle < Liquid::Tag
-    def initialize(tag_name, markup, tokens)
-      if /(?<fiddle>\w+\/?\d?)(?:\s+(?<sequence>[\w,]+))?(?:\s+(?<skin>\w+))?(?:\s+(?<height>\w+))?(?:\s+(?<width>\w+))?/ =~ markup
-        @fiddle   = fiddle
-        @sequence = (sequence unless sequence == 'default') || 'js,resources,html,css,result'
-        @skin     = (skin unless skin == 'default') || 'light'
-        @width    = width || '100%'
-        @height   = height || '300px'
-      end
-    end
-
-    def render(context)
-      if @fiddle
-        "<iframe style=\"width: #{@width}; height: #{@height}\" frameborder=\"0\" seamless=\"seamless\" src=\"http://jsfiddle.net/#{@fiddle}/embedded/#{@sequence}/#{@skin}/\"></iframe>"
-      else
-        "Error processing input, expected syntax: {% jsfiddle shorttag [tabs] [skin] [height] [width] %}"
-      end
-    end
-  end
-end
-
-Liquid::Template.register_tag('jsfiddle', Jekyll::JsFiddle)
diff --git a/plugins/octopress_filters.rb b/plugins/octopress_filters.rb
deleted file mode 100644
index 9c7fa6c5..00000000
--- a/plugins/octopress_filters.rb
+++ /dev/null
@@ -1,142 +0,0 @@
-#custom filters for Octopress
-require './plugins/backtick_code_block'
-require 'octopress-hooks'
-require 'jekyll-sitemap'
-require 'octopress-date-format'
-require './plugins/raw'
-require 'rubypants'
-
-module OctopressFilters
-  def self.pre_filter(page)
-    if page.ext.match('html|textile|markdown|md|haml|slim|xml')
-      input = BacktickCodeBlock::render_code_block(page.content)
-      page.content = input.gsub /(<figure.+?>.+?<\/figure>)/m do
-        TemplateWrapper::safe_wrap($1)
-      end
-    end
-  end
-  def self.post_filter(page)
-    if page.ext.match('html|textile|markdown|md|haml|slim|xml')
-      page.output = TemplateWrapper::unwrap(page.output)
-    end
-
-    page.output = RubyPants.new(page.output).to_html
-  end
-
-  class PageFilters < Octopress::Hooks::Page
-    def pre_render(page)
-      OctopressFilters::pre_filter(page)
-    end
-
-    def post_render(page)
-      OctopressFilters::post_filter(page)
-    end
-  end
-
-  class PostFilters < Octopress::Hooks::Post
-    def pre_render(post)
-      OctopressFilters::pre_filter(post)
-    end
-
-    def post_render(post)
-      OctopressFilters::post_filter(post)
-    end
-  end
-end
-
-
-module OctopressLiquidFilters
-
-  # Used on the blog index to split posts on the <!--more--> marker
-  def excerpt(input)
-    if input.index(/<!--\s*more\s*-->/i)
-      input.split(/<!--\s*more\s*-->/i)[0]
-    else
-      input
-    end
-  end
-
-  # Checks for excerpts (helpful for template conditionals)
-  def has_excerpt(input)
-    input =~ /<!--\s*more\s*-->/i ? true : false
-  end
-
-  # Summary is used on the Archive pages to return the first block of content from a post.
-  def summary(input)
-    if input.index(/\n\n/)
-      input.split(/\n\n/)[0]
-    else
-      input
-    end
-  end
-
-  # Extracts raw content DIV from template, used for page description as {{ content }}
-  # contains complete sub-template code on main page level
-  def raw_content(input)
-    /<div class="entry-content">(?<content>[\s\S]*?)<\/div>\s*<(footer|\/article)>/ =~ input
-    return (content.nil?) ? input : content
-  end
-
-  # Escapes CDATA sections in post content
-  def cdata_escape(input)
-    input.gsub(/<!\[CDATA\[/, '&lt;![CDATA[').gsub(/\]\]>/, ']]&gt;')
-  end
-
-  # Replaces relative urls with full urls
-  def expand_urls(input, url='')
-    url ||= '/'
-    input.gsub /(\s+(href|src)\s*=\s*["|']{1})(\/[^\/>]{1}[^\"'>]*)/ do
-      $1+url+$3
-    end
-  end
-
-  # Improved version of Liquid's truncate:
-  # - Doesn't cut in the middle of a word.
-  # - Uses typographically correct ellipsis (…) insted of '...'
-  def truncate(input, length)
-    if input.length > length && input[0..(length-1)] =~ /(.+)\b.+$/im
-      $1.strip + ' &hellip;'
-    else
-      input
-    end
-  end
-
-  # Improved version of Liquid's truncatewords:
-  # - Uses typographically correct ellipsis (…) insted of '...'
-  def truncatewords(input, length)
-    truncate = input.split(' ')
-    if truncate.length > length
-      truncate[0..length-1].join(' ').strip + ' &hellip;'
-    else
-      input
-    end
-  end
-
-  # Condenses multiple spaces and tabs into a single space
-  def condense_spaces(input)
-    input.gsub(/\s{2,}/, ' ')
-  end
-
-  # Removes trailing forward slash from a string for easily appending url segments
-  def strip_slash(input)
-    if input =~ /(.+)\/$|^\/$/
-      input = $1
-    end
-    input
-  end
-
-  # Returns a url without the protocol (http://)
-  def shorthand_url(input)
-    input.gsub /(https?:\/\/)(\S+)/ do
-      $2
-    end
-  end
-
-  # Returns a title cased string based on John Gruber's title case http://daringfireball.net/2008/08/title_case_update
-  def titlecase(input)
-    input.titlecase
-  end
-
-end
-Liquid::Template.register_filter OctopressLiquidFilters
-
diff --git a/plugins/pullquote.rb b/plugins/pullquote.rb
deleted file mode 100644
index 3c65e66e..00000000
--- a/plugins/pullquote.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-# Author: Brandon Mathis
-# Based on the semantic pullquote technique by Maykel Loomans at http://miekd.com/articles/pull-quotes-with-html5-and-css/
-#
-# Outputs a span with a data-pullquote attribute set from the marked pullquote. Example:
-#
-#   {% pullquote %}
-#     When writing longform posts, I find it helpful to include pullquotes, which help those scanning a post discern whether or not a post is helpful.
-#     It is important to note, {" pullquotes are merely visual in presentation and should not appear twice in the text. "} That is why it is prefered
-#     to use a CSS only technique for styling pullquotes.
-#   {% endpullquote %}
-#   ...will output...
-#   <p>
-#     <span data-pullquote="pullquotes are merely visual in presentation and should not appear twice in the text.">
-#       When writing longform posts, I find it helpful to include pullquotes, which help those scanning a post discern whether or not a post is helpful.
-#       It is important to note, pullquotes are merely visual in presentation and should not appear twice in the text. This is why a CSS only approach
-#       for styling pullquotes is prefered.
-#     </span>
-#   </p>
-#
-# {% pullquote left %} will create a left-aligned pullquote instead.
-#
-# Note: this plugin now creates pullquotes with the class of pullquote-right by default
-
-module Jekyll
-
-  class PullquoteTag < Liquid::Block
-    def initialize(tag_name, markup, tokens)
-      @align = (markup =~ /left/i) ? "left" : "right"
-      super
-    end
-
-    def render(context)
-      output = super
-      if output =~ /\{"\s*(.+?)\s*"\}/m
-        @quote = RubyPants.new($1).to_html
-        "<span class='pullquote-#{@align}' data-pullquote='#{@quote}'>#{output.gsub(/\{"\s*|\s*"\}/, '')}</span>"
-      else
-        return "Surround your pullquote like this {\" text to be quoted \"}"
-      end
-    end
-  end
-end
-
-Liquid::Template.register_tag('pullquote', Jekyll::PullquoteTag)
diff --git a/plugins/pygments_code.rb b/plugins/pygments_code.rb
deleted file mode 100644
index c0f4de92..00000000
--- a/plugins/pygments_code.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-require 'pygments'
-require 'fileutils'
-require 'digest/md5'
-
-PYGMENTS_CACHE_DIR = File.expand_path('../../.pygments-cache', __FILE__)
-FileUtils.mkdir_p(PYGMENTS_CACHE_DIR)
-
-module HighlightCode
-  def self.highlight(str, lang)
-    lang = 'ruby' if lang == 'ru'
-    lang = 'objc' if lang == 'm'
-    lang = 'perl' if lang == 'pl'
-    lang = 'yaml' if lang == 'yml'
-    str = pygments(str, lang).match(/<pre>(.+)<\/pre>/m)[1].to_s.gsub(/ *$/, '') #strip out divs <div class="highlight">
-    tableize_code(str, lang)
-  end
-
-  def self.pygments(code, lang)
-    if defined?(PYGMENTS_CACHE_DIR)
-      path = File.join(PYGMENTS_CACHE_DIR, "#{lang}-#{Digest::MD5.hexdigest(code)}.html")
-      if File.exist?(path)
-        highlighted_code = File.read(path)
-      else
-        begin
-          highlighted_code = Pygments.highlight(code, :lexer => lang, :formatter => 'html', :options => {:encoding => 'utf-8', :startinline => true})
-        rescue MentosError
-          raise "Pygments can't parse unknown language: #{lang}."
-        end
-        File.open(path, 'w') {|f| f.print(highlighted_code) }
-      end
-    else
-      highlighted_code = Pygments.highlight(code, :lexer => lang, :formatter => 'html', :options => {:encoding => 'utf-8', :startinline => true})
-    end
-    highlighted_code
-  end
-  def self.tableize_code (str, lang = '')
-    table = '<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers">'
-    code = ''
-    str.lines.each_with_index do |line,index|
-      table += "<span class='line-number'>#{index+1}</span>\n"
-      code  += "<span class='line'>#{line}</span>"
-    end
-    table += "</pre></td><td class='code'><pre><code class='#{lang}'>#{code}</code></pre></td></tr></table></div>"
-  end
-end
diff --git a/plugins/raw.rb b/plugins/raw.rb
deleted file mode 100644
index e97c9459..00000000
--- a/plugins/raw.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# Author: Brandon Mathis
-# Description: Provides plugins with a method for wrapping and unwrapping input to prevent Markdown and Textile from parsing it.
-# Purpose: This is useful for preventing Markdown and Textile from being too aggressive and incorrectly parsing in-line HTML.
-module TemplateWrapper
-  # Wrap input with a <div>
-  def self.safe_wrap(input)
-    "<div class='bogus-wrapper'><notextile>#{input}</notextile></div>"
-  end
-  # This must be applied after the
-  def self.unwrap(input)
-    input.gsub /<div class='bogus-wrapper'><notextile>(.+?)<\/notextile><\/div>/m do
-      $1
-    end
-  end
-end
-
-# Author: phaer, https://github.com/phaer
-# Source: https://gist.github.com/1020852
-# Description: Raw tag for jekyll. Keeps liquid from parsing text betweeen {% raw %} and {% endraw %}
-
-module Jekyll
-  class RawTag < Liquid::Block
-    def parse(tokens)
-      @nodelist ||= []
-      @nodelist.clear
-
-      while token = tokens.shift
-        if token =~ FullToken
-          if block_delimiter == $1
-            end_tag
-            return
-          end
-        end
-        @nodelist << token if not token.empty?
-      end
-    end
-  end
-end
-
-Liquid::Template.register_tag('raw', Jekyll::RawTag)
diff --git a/plugins/render_partial.rb b/plugins/render_partial.rb
deleted file mode 100644
index b6ebfe8b..00000000
--- a/plugins/render_partial.rb
+++ /dev/null
@@ -1,69 +0,0 @@
-# Title: Render Partial Tag for Jekyll
-# Author: Brandon Mathis http://brandonmathis.com
-# Description: Import files on your filesystem into any blog post and render them inline.
-# Note: Paths are relative to the source directory, if you import a file with yaml front matter, the yaml will be stripped out.
-#
-# Syntax {% render_partial path/to/file %}
-#
-# Example 1:
-# {% render_partial about/_bio.markdown %}
-#
-# This will import source/about/_bio.markdown and render it inline.
-# In this example I used an underscore at the beginning of the filename to prevent Jekyll
-# from generating an about/bio.html (Jekyll doesn't convert files beginning with underscores)
-#
-# Example 2:
-# {% render_partial ../README.markdown %}
-#
-# You can use relative pathnames, to include files outside of the source directory.
-# This might be useful if you want to have a page for a project's README without having
-# to duplicated the contents
-#
-#
-
-require 'pathname'
-require './plugins/octopress_filters'
-
-module Jekyll
-
-  class RenderPartialTag < Liquid::Tag
-    include OctopressFilters
-    def initialize(tag_name, markup, tokens)
-      @file = nil
-      @raw = false
-      if markup =~ /^(\S+)\s?(\w+)?/
-        @file = $1.strip
-        @raw = $2 == 'raw'
-      end
-      super
-    end
-
-    def render(context)
-      file_dir = (context.registers[:site].source || 'source')
-      file_path = Pathname.new(file_dir).expand_path
-      file = file_path + @file
-
-      unless file.file?
-        return "File #{file} could not be found"
-      end
-
-      Dir.chdir(file_path) do
-        contents = file.read
-        if contents =~ /\A-{3}.+[^\A]-{3}\n(.+)/m
-          contents = $1.lstrip
-        end
-        contents = pre_filter(contents)
-        if @raw
-          contents
-        else
-          partial = Liquid::Template.parse(contents)
-          context.stack do
-            partial.render(context)
-          end
-        end
-      end
-    end
-  end
-end
-
-Liquid::Template.register_tag('render_partial', Jekyll::RenderPartialTag)
diff --git a/plugins/rubypants.rb b/plugins/rubypants.rb
deleted file mode 100644
index e4f4502f..00000000
--- a/plugins/rubypants.rb
+++ /dev/null
@@ -1,489 +0,0 @@
-#
-# = RubyPants -- SmartyPants ported to Ruby
-#
-# Ported by Christian Neukirchen <mailto:chneukirchen@gmail.com>
-#   Copyright (C) 2004 Christian Neukirchen
-#
-# Incooporates ideas, comments and documentation by Chad Miller
-#   Copyright (C) 2004 Chad Miller
-#
-# Original SmartyPants by John Gruber
-#   Copyright (C) 2003 John Gruber
-#
-
-#
-# = RubyPants -- SmartyPants ported to Ruby
-#
-# == Synopsis
-#
-# RubyPants is a Ruby port of the smart-quotes library SmartyPants.
-#
-# The original "SmartyPants" is a free web publishing plug-in for
-# Movable Type, Blosxom, and BBEdit that easily translates plain ASCII
-# punctuation characters into "smart" typographic punctuation HTML
-# entities.
-#
-#
-# == Description
-#
-# RubyPants can perform the following transformations:
-#
-# * Straight quotes (<tt>"</tt> and <tt>'</tt>) into "curly" quote
-#   HTML entities
-# * Backticks-style quotes (<tt>``like this''</tt>) into "curly" quote
-#   HTML entities
-# * Dashes (<tt>--</tt> and <tt>---</tt>) into en- and em-dash
-#   entities
-# * Three consecutive dots (<tt>...</tt> or <tt>. . .</tt>) into an
-#   ellipsis entity
-#
-# This means you can write, edit, and save your posts using plain old
-# ASCII straight quotes, plain dashes, and plain dots, but your
-# published posts (and final HTML output) will appear with smart
-# quotes, em-dashes, and proper ellipses.
-#
-# RubyPants does not modify characters within <tt><pre></tt>,
-# <tt><code></tt>, <tt><kbd></tt>, <tt><math></tt> or
-# <tt><script></tt> tag blocks. Typically, these tags are used to
-# display text where smart quotes and other "smart punctuation" would
-# not be appropriate, such as source code or example markup.
-#
-#
-# == Backslash Escapes
-#
-# If you need to use literal straight quotes (or plain hyphens and
-# periods), RubyPants accepts the following backslash escape sequences
-# to force non-smart punctuation. It does so by transforming the
-# escape sequence into a decimal-encoded HTML entity:
-#
-#   \\    \"    \'    \.    \-    \`
-#
-# This is useful, for example, when you want to use straight quotes as
-# foot and inch marks: 6'2" tall; a 17" iMac.  (Use <tt>6\'2\"</tt>
-# resp. <tt>17\"</tt>.)
-#
-#
-# == Algorithmic Shortcomings
-#
-# One situation in which quotes will get curled the wrong way is when
-# apostrophes are used at the start of leading contractions. For
-# example:
-#
-#   'Twas the night before Christmas.
-#
-# In the case above, RubyPants will turn the apostrophe into an
-# opening single-quote, when in fact it should be a closing one. I
-# don't think this problem can be solved in the general case--every
-# word processor I've tried gets this wrong as well. In such cases,
-# it's best to use the proper HTML entity for closing single-quotes
-# ("<tt>&#8217;</tt>") by hand.
-#
-#
-# == Bugs
-#
-# To file bug reports or feature requests (except see above) please
-# send email to: mailto:chneukirchen@gmail.com
-#
-# If the bug involves quotes being curled the wrong way, please send
-# example text to illustrate.
-#
-#
-# == Authors
-#
-# John Gruber did all of the hard work of writing this software in
-# Perl for Movable Type and almost all of this useful documentation.
-# Chad Miller ported it to Python to use with Pyblosxom.
-#
-# Christian Neukirchen provided the Ruby port, as a general-purpose
-# library that follows the *Cloth API.
-#
-#
-# == Copyright and License
-#
-# === SmartyPants license:
-#
-# Copyright (c) 2003 John Gruber
-# (http://daringfireball.net)
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# * Redistributions of source code must retain the above copyright
-#   notice, this list of conditions and the following disclaimer.
-#
-# * Redistributions in binary form must reproduce the above copyright
-#   notice, this list of conditions and the following disclaimer in
-#   the documentation and/or other materials provided with the
-#   distribution.
-#
-# * Neither the name "SmartyPants" nor the names of its contributors
-#   may be used to endorse or promote products derived from this
-#   software without specific prior written permission.
-#
-# This software is provided by the copyright holders and contributors
-# "as is" and any express or implied warranties, including, but not
-# limited to, the implied warranties of merchantability and fitness
-# for a particular purpose are disclaimed. In no event shall the
-# copyright owner or contributors be liable for any direct, indirect,
-# incidental, special, exemplary, or consequential damages (including,
-# but not limited to, procurement of substitute goods or services;
-# loss of use, data, or profits; or business interruption) however
-# caused and on any theory of liability, whether in contract, strict
-# liability, or tort (including negligence or otherwise) arising in
-# any way out of the use of this software, even if advised of the
-# possibility of such damage.
-#
-# === RubyPants license
-#
-# RubyPants is a derivative work of SmartyPants and smartypants.py.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# * Redistributions of source code must retain the above copyright
-#   notice, this list of conditions and the following disclaimer.
-#
-# * Redistributions in binary form must reproduce the above copyright
-#   notice, this list of conditions and the following disclaimer in
-#   the documentation and/or other materials provided with the
-#   distribution.
-#
-# This software is provided by the copyright holders and contributors
-# "as is" and any express or implied warranties, including, but not
-# limited to, the implied warranties of merchantability and fitness
-# for a particular purpose are disclaimed. In no event shall the
-# copyright owner or contributors be liable for any direct, indirect,
-# incidental, special, exemplary, or consequential damages (including,
-# but not limited to, procurement of substitute goods or services;
-# loss of use, data, or profits; or business interruption) however
-# caused and on any theory of liability, whether in contract, strict
-# liability, or tort (including negligence or otherwise) arising in
-# any way out of the use of this software, even if advised of the
-# possibility of such damage.
-#
-#
-# == Links
-#
-# John Gruber:: http://daringfireball.net
-# SmartyPants:: http://daringfireball.net/projects/smartypants
-#
-# Chad Miller:: http://web.chad.org
-#
-# Christian Neukirchen:: http://kronavita.de/chris
-#
-
-
-class RubyPants < String
-
-  # Create a new RubyPants instance with the text in +string+.
-  #
-  # Allowed elements in the options array:
-  #
-  # 0  :: do nothing
-  # 1  :: enable all, using only em-dash shortcuts
-  # 2  :: enable all, using old school en- and em-dash shortcuts (*default*)
-  # 3  :: enable all, using inverted old school en and em-dash shortcuts
-  # -1 :: stupefy (translate HTML entities to their ASCII-counterparts)
-  #
-  # If you don't like any of these defaults, you can pass symbols to change
-  # RubyPants' behavior:
-  #
-  # <tt>:quotes</tt>        :: quotes
-  # <tt>:backticks</tt>     :: backtick quotes (``double'' only)
-  # <tt>:allbackticks</tt>  :: backtick quotes (``double'' and `single')
-  # <tt>:dashes</tt>        :: dashes
-  # <tt>:oldschool</tt>     :: old school dashes
-  # <tt>:inverted</tt>      :: inverted old school dashes
-  # <tt>:ellipses</tt>      :: ellipses
-  # <tt>:convertquotes</tt> :: convert <tt>&quot;</tt> entities to
-  #                            <tt>"</tt> for Dreamweaver users
-  # <tt>:stupefy</tt>       :: translate RubyPants HTML entities
-  #                            to their ASCII counterparts.
-  #
-  def initialize(string, options=[2])
-    super string
-    @options = [*options]
-  end
-
-  # Apply SmartyPants transformations.
-  def to_html
-    do_quotes = do_backticks = do_dashes = do_ellipses = do_stupify = nil
-    convert_quotes = false
-
-    if @options.include? 0
-      # Do nothing.
-      return self
-    elsif @options.include? 1
-      # Do everything, turn all options on.
-      do_quotes = do_backticks = do_ellipses = true
-      do_dashes = :normal
-    elsif @options.include? 2
-      # Do everything, turn all options on, use old school dash shorthand.
-      do_quotes = do_backticks = do_ellipses = true
-      do_dashes = :oldschool
-    elsif @options.include? 3
-      # Do everything, turn all options on, use inverted old school
-      # dash shorthand.
-      do_quotes = do_backticks = do_ellipses = true
-      do_dashes = :inverted
-    elsif @options.include?(-1)
-      do_stupefy = true
-    else
-      do_quotes =                @options.include? :quotes
-      do_backticks =             @options.include? :backticks
-      do_backticks = :both    if @options.include? :allbackticks
-      do_dashes = :normal     if @options.include? :dashes
-      do_dashes = :oldschool  if @options.include? :oldschool
-      do_dashes = :inverted   if @options.include? :inverted
-      do_ellipses =              @options.include? :ellipses
-      convert_quotes =           @options.include? :convertquotes
-      do_stupefy =               @options.include? :stupefy
-    end
-
-    # Parse the HTML
-    tokens = tokenize
-
-    # Keep track of when we're inside <pre> or <code> tags.
-    in_pre = false
-
-    # Here is the result stored in.
-    result = ""
-
-    # This is a cheat, used to get some context for one-character
-    # tokens that consist of just a quote char. What we do is remember
-    # the last character of the previous text token, to use as context
-    # to curl single- character quote tokens correctly.
-    prev_token_last_char = nil
-
-    tokens.each { |token|
-      if token.first == :tag
-        result << token[1]
-        if token[1] =~ %r!<(/?)(?:pre|code|kbd|script|math)[\s>]!
-          in_pre = ($1 != "/")  # Opening or closing tag?
-        end
-      else
-        t = token[1]
-
-        # Remember last char of this token before processing.
-        last_char = t[-1].chr
-
-        unless in_pre
-          t = process_escapes t
-
-          t.gsub!(/&quot;/, '"')  if convert_quotes
-
-          if do_dashes
-            t = educate_dashes t            if do_dashes == :normal
-            t = educate_dashes_oldschool t  if do_dashes == :oldschool
-            t = educate_dashes_inverted t   if do_dashes == :inverted
-          end
-
-          t = educate_ellipses t  if do_ellipses
-
-          # Note: backticks need to be processed before quotes.
-          if do_backticks
-            t = educate_backticks t
-            t = educate_single_backticks t  if do_backticks == :both
-          end
-
-          if do_quotes
-            if t == "'"
-              # Special case: single-character ' token
-              if prev_token_last_char =~ /\S/
-                t = "&#8217;"
-              else
-                t = "&#8216;"
-              end
-            elsif t == '"'
-              # Special case: single-character " token
-              if prev_token_last_char =~ /\S/
-                t = "&#8221;"
-              else
-                t = "&#8220;"
-              end
-            else
-              # Normal case:
-              t = educate_quotes t
-            end
-          end
-
-          t = stupefy_entities t  if do_stupefy
-        end
-
-        prev_token_last_char = last_char
-        result << t
-      end
-    }
-
-    # Done
-    result
-  end
-
-  protected
-
-  # Return the string, with after processing the following backslash
-  # escape sequences. This is useful if you want to force a "dumb" quote
-  # or other character to appear.
-  #
-  # Escaped are:
-  #      \\    \"    \'    \.    \-    \`
-  #
-  def process_escapes(str)
-    str.gsub('\\\\', '&#92;').
-      gsub('\"', '&#34;').
-      gsub("\\\'", '&#39;').
-      gsub('\.', '&#46;').
-      gsub('\-', '&#45;').
-      gsub('\`', '&#96;')
-  end
-
-  # The string, with each instance of "<tt>--</tt>" translated to an
-  # em-dash HTML entity.
-  #
-  def educate_dashes(str)
-    str.gsub(/--/, '&#8212;')
-  end
-
-  # The string, with each instance of "<tt>--</tt>" translated to an
-  # en-dash HTML entity, and each "<tt>---</tt>" translated to an
-  # em-dash HTML entity.
-  #
-  def educate_dashes_oldschool(str)
-    str.gsub(/---/, '&#8212;').gsub(/--/, '&#8211;')
-  end
-
-  # Return the string, with each instance of "<tt>--</tt>" translated
-  # to an em-dash HTML entity, and each "<tt>---</tt>" translated to
-  # an en-dash HTML entity. Two reasons why: First, unlike the en- and
-  # em-dash syntax supported by +educate_dashes_oldschool+, it's
-  # compatible with existing entries written before SmartyPants 1.1,
-  # back when "<tt>--</tt>" was only used for em-dashes.  Second,
-  # em-dashes are more common than en-dashes, and so it sort of makes
-  # sense that the shortcut should be shorter to type. (Thanks to
-  # Aaron Swartz for the idea.)
-  #
-  def educate_dashes_inverted(str)
-    str.gsub(/---/, '&#8211;').gsub(/--/, '&#8212;')
-  end
-
-  # Return the string, with each instance of "<tt>...</tt>" translated
-  # to an ellipsis HTML entity. Also converts the case where there are
-  # spaces between the dots.
-  #
-  def educate_ellipses(str)
-    str.gsub('...', '&#8230;').gsub('. . .', '&#8230;')
-  end
-
-  # Return the string, with "<tt>``backticks''</tt>"-style single quotes
-  # translated into HTML curly quote entities.
-  #
-  def educate_backticks(str)
-    str.gsub("``", '&#8220;').gsub("''", '&#8221;')
-  end
-
-  # Return the string, with "<tt>`backticks'</tt>"-style single quotes
-  # translated into HTML curly quote entities.
-  #
-  def educate_single_backticks(str)
-    str.gsub("`", '&#8216;').gsub("'", '&#8217;')
-  end
-
-  # Return the string, with "educated" curly quote HTML entities.
-  #
-  def educate_quotes(str)
-    punct_class = '[!"#\$\%\'()*+,\-.\/:;<=>?\@\[\\\\\]\^_`{|}~]'
-
-    str = str.dup
-
-    # Special case if the very first character is a quote followed by
-    # punctuation at a non-word-break. Close the quotes by brute
-    # force:
-    str.gsub!(/^'(?=#{punct_class}\B)/, '&#8217;')
-    str.gsub!(/^"(?=#{punct_class}\B)/, '&#8221;')
-
-    # Special case for double sets of quotes, e.g.:
-    #   <p>He said, "'Quoted' words in a larger quote."</p>
-    str.gsub!(/"'(?=\w)/, '&#8220;&#8216;')
-    str.gsub!(/'"(?=\w)/, '&#8216;&#8220;')
-
-    # Special case for decade abbreviations (the '80s):
-    str.gsub!(/'(?=\d\ds)/, '&#8217;')
-
-    close_class = %![^\ \t\r\n\\[\{\(\-]!
-    dec_dashes = '&#8211;|&#8212;'
-
-    # Get most opening single quotes:
-    str.gsub!(/(\s|&nbsp;|--|&[mn]dash;|#{dec_dashes}|&#x201[34];)'(?=\w)/,
-             '\1&#8216;')
-    # Single closing quotes:
-    str.gsub!(/(#{close_class})'/, '\1&#8217;')
-    str.gsub!(/'(\s|s\b|$)/, '&#8217;\1')
-    # Any remaining single quotes should be opening ones:
-    str.gsub!(/'/, '&#8216;')
-
-    # Get most opening double quotes:
-    str.gsub!(/(\s|&nbsp;|--|&[mn]dash;|#{dec_dashes}|&#x201[34];)"(?=\w)/,
-             '\1&#8220;')
-    # Double closing quotes:
-    str.gsub!(/(#{close_class})"/, '\1&#8221;')
-    str.gsub!(/"(\s|s\b|$)/, '&#8221;\1')
-    # Any remaining quotes should be opening ones:
-    str.gsub!(/"/, '&#8220;')
-
-    str
-  end
-
-  # Return the string, with each RubyPants HTML entity translated to
-  # its ASCII counterpart.
-  #
-  # Note: This is not reversible (but exactly the same as in SmartyPants)
-  #
-  def stupefy_entities(str)
-    str.
-      gsub(/&#8211;/, '-').      # en-dash
-      gsub(/&#8212;/, '--').     # em-dash
-
-      gsub(/&#8216;/, "'").      # open single quote
-      gsub(/&#8217;/, "'").      # close single quote
-
-      gsub(/&#8220;/, '"').      # open double quote
-      gsub(/&#8221;/, '"').      # close double quote
-
-      gsub(/&#8230;/, '...')     # ellipsis
-  end
-
-  # Return an array of the tokens comprising the string. Each token is
-  # either a tag (possibly with nested, tags contained therein, such
-  # as <tt><a href="<MTFoo>"></tt>, or a run of text between
-  # tags. Each element of the array is a two-element array; the first
-  # is either :tag or :text; the second is the actual value.
-  #
-  # Based on the <tt>_tokenize()</tt> subroutine from Brad Choate's
-  # MTRegex plugin.  <http://www.bradchoate.com/past/mtregex.php>
-  #
-  # This is actually the easier variant using tag_soup, as used by
-  # Chad Miller in the Python port of SmartyPants.
-  #
-  def tokenize
-    tag_soup = /([^<]*)(<[^>]*>)/
-
-    tokens = []
-
-    prev_end = 0
-    scan(tag_soup) {
-      tokens << [:text, $1]  if $1 != ""
-      tokens << [:tag, $2]
-
-      prev_end = $~.end(0)
-    }
-
-    if prev_end < size
-      tokens << [:text, self[prev_end..-1]]
-    end
-
-    tokens
-  end
-end
diff --git a/plugins/titlecase.rb b/plugins/titlecase.rb
deleted file mode 100644
index 7648932c..00000000
--- a/plugins/titlecase.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-class String
-  def titlecase
-    small_words = %w(a an and as at but by en for if in of on or the to v v. via vs vs.)
-
-    x = split(" ").map do |word|
-      # note: word could contain non-word characters!
-      # downcase all small_words, capitalize the rest
-      small_words.include?(word.gsub(/\W/, "").downcase) ? word.downcase! : word.smart_capitalize!
-      word
-    end
-    # capitalize first and last words
-    x.first.to_s.smart_capitalize!
-    x.last.to_s.smart_capitalize!
-    # small words are capitalized after colon, period, exclamation mark, question mark
-    x.join(" ").gsub(/(:|\.|!|\?)\s?(\W*#{small_words.join("|")}\W*)\s/) { "#{$1} #{$2.smart_capitalize} " }
-  end
-
-  def titlecase!
-    replace(titlecase)
-  end
-
-  def smart_capitalize
-    # ignore any leading crazy characters and capitalize the first real character
-    if self =~ /^['"\(\[']*([a-z])/
-      i = index($1)
-      x = self[i,self.length]
-      # word with capitals and periods mid-word are left alone
-      self[i,1] = self[i,1].upcase unless x =~ /[A-Z]/ or x =~ /\.\w+/
-    end
-    self
-  end
-
-  def smart_capitalize!
-    replace(smart_capitalize)
-  end
-end
diff --git a/plugins/video_tag.rb b/plugins/video_tag.rb
deleted file mode 100644
index c6e67b77..00000000
--- a/plugins/video_tag.rb
+++ /dev/null
@@ -1,56 +0,0 @@
-# Title: Simple Video tag for Jekyll
-# Author: Brandon Mathis http://brandonmathis.com
-# Description: Easily output MPEG4 HTML5 video with a flash backup.
-#
-# Syntax {% video url/to/video [width height] [url/to/poster] %}
-#
-# Example:
-# {% video http://site.com/video.mp4 720 480 http://site.com/poster-frame.jpg %}
-#
-# Output:
-# <video width='720' height='480' preload='none' controls poster='http://site.com/poster-frame.jpg'>
-#   <source src='http://site.com/video.mp4' type='video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"'/>
-# </video>
-#
-
-module Jekyll
-
-  class VideoTag < Liquid::Tag
-    @video = nil
-    @poster = ''
-    @height = ''
-    @width = ''
-
-    def initialize(tag_name, markup, tokens)
-      if markup =~ /(https?:\S+)(\s+(https?:\S+))?(\s+(https?:\S+))?(\s+(\d+)\s(\d+))?(\s+(https?:\S+))?/i
-        @video  = [$1, $3, $5].compact
-        @width  = $7
-        @height = $8
-        @poster = $10
-      end
-      super
-    end
-
-    def render(context)
-      output = super
-      type = {
-        'mp4' => "type='video/mp4; codecs=\"avc1.42E01E, mp4a.40.2\"'",
-        'ogv' => "type='video/ogg; codecs=theora, vorbis'",
-        'webm' => "type='video/webm; codecs=vp8, vorbis'"
-      }
-      if @video.size > 0
-        video =  "<video width='#{@width}' height='#{@height}' preload='none' controls poster='#{@poster}'>"
-        @video.each do |v|
-          t = v.match(/([^\.]+)$/)[1]
-          video += "<source src='#{v}' #{type[t]}>"
-        end
-        video += "</video>"
-      else
-        "Error processing input, expected syntax: {% video url/to/video [url/to/video] [url/to/video] [width height] [url/to/poster] %}"
-      end
-    end
-  end
-end
-
-Liquid::Template.register_tag('video', Jekyll::VideoTag)
-
diff --git a/sass/_base.scss b/sass/_base.scss
deleted file mode 100644
index 05fdd005..00000000
--- a/sass/_base.scss
+++ /dev/null
@@ -1,5 +0,0 @@
-@import "base/utilities";
-@import "base/solarized";
-@import "base/theme";
-@import "base/typography";
-@import "base/layout";
diff --git a/sass/_partials.scss b/sass/_partials.scss
deleted file mode 100644
index 99c28b63..00000000
--- a/sass/_partials.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-@import "partials/header";
-@import "partials/navigation";
-@import "partials/blog";
-@import "partials/sharing";
-@import "partials/syntax";
-@import "partials/archive";
-@import "partials/sidebar";
-@import "partials/footer";
diff --git a/sass/base/_layout.scss b/sass/base/_layout.scss
deleted file mode 100644
index 81903428..00000000
--- a/sass/base/_layout.scss
+++ /dev/null
@@ -1,192 +0,0 @@
-$max-width: 1200px !default;
-
-// Padding used for layout margins
-$pad-min: 18px !default;
-$pad-narrow: 25px !default;
-$pad-medium: 35px !default;
-$pad-wide: 55px !default;
-
-// Sidebar widths used in media queries
-$sidebar-width-medium: 240px !default;
-$sidebar-pad-medium: 15px !default;
-$sidebar-pad-wide: 20px !default;
-$sidebar-width-wide: 300px !default;
-
-$indented-lists: false !default;
-
-$header-font-size: 1em !default;
-$header-padding-top: 1.5em !default;
-$header-padding-bottom: 1.5em !default;
-
-.group { @include pie-clearfix; }
-
-@mixin collapse-sidebar {
-  float: none;
-  width: auto;
-  clear: left;
-  margin: 0;
-  padding: 0 $pad-medium 1px;
-  background-color: lighten($sidebar-bg, 2);
-  border-top: 1px solid lighten($sidebar-border, 4);
-  section {
-    &.odd, &.even { float: left; width: 48%; }
-    &.odd { margin-left: 0; }
-    &.even { margin-left: 4%; }
-  }
-  &.thirds section {
-    width: 30%;
-    margin-left: 5%;
-    &.first {
-      margin-left: 0;
-      clear: both;
-    }
-  }
-}
-
-body {
-  -webkit-text-size-adjust: none;
-  max-width: $max-width;
-  position: relative;
-  margin: 0 auto;
-  > header, > nav, > footer, #content > article, #content > div > article, #content > div > section {
-    @extend .group;
-    padding-left: $pad-min;
-    padding-right: $pad-min;
-    @media only screen and (min-width: 480px) {
-      padding-left: $pad-narrow;
-      padding-right: $pad-narrow;
-    }
-    @media only screen and (min-width: 768px) {
-      padding-left: $pad-medium;
-      padding-right: $pad-medium;
-    }
-    @media only screen and (min-width: 992px) {
-      padding-left: $pad-wide;
-      padding-right: $pad-wide;
-    }
-  }
-  div.pagination {
-    @extend .group;
-    margin-left: $pad-min;
-    margin-right: $pad-min;
-    @media only screen and (min-width: 480px) {
-      margin-left: $pad-narrow;
-      margin-right: $pad-narrow;
-    }
-    @media only screen and (min-width: 768px) {
-      margin-left: $pad-medium;
-      margin-right: $pad-medium;
-    }
-    @media only screen and (min-width: 992px) {
-      margin-left: $pad-wide;
-      margin-right: $pad-wide;
-    }
-  }
-  > header {
-    font-size: $header-font-size;
-    padding-top: $header-padding-top;
-    padding-bottom: $header-padding-bottom;
-  }
-}
-
-#content {
-  overflow: hidden;
-  > div, > article { width: 100%; }
-}
-
-aside.sidebar {
-  float: none;
-  padding: 0 $pad-min 1px;
-  background-color: lighten($sidebar-bg, 2);
-  border-top: 1px solid $sidebar-border;
-  @extend .group;
-}
-
-.flex-content { max-width: 100%; height: auto; }
-
-.basic-alignment {
-  &.left { float: left; margin-right: 1.5em; }
-  &.right { float: right; margin-left: 1.5em; }
-  &.center { display:block; margin: 0 auto 1.5em; }
-  &.left, &.right { margin-bottom: .8em; }
-}
-
-.toggle-sidebar { &, .no-sidebar & { display: none; }}
-
-body.sidebar-footer {
-  @media only screen and (min-width: 750px) {
-    aside.sidebar{ @include collapse-sidebar; }
-  }
-  #content { margin-right: 0px; }
-  .toggle-sidebar { display: none; }
-}
-
-@media only screen and (min-width: 550px) {
-  body > header { font-size: $header-font-size; }
-}
-@media only screen and (min-width: 750px) {
-  aside.sidebar { @include collapse-sidebar; }
-}
-#main, #content, .sidebar {
-  @extend .group;
-}
-@media only screen and (min-width: 768px) {
-  body { -webkit-text-size-adjust: auto; }
-  body > header { font-size: $header-font-size * 1.2; }
-  #main {
-    padding: 0;
-    margin: 0 auto;
-  }
-  #content {
-    overflow: visible;
-    margin-right: $sidebar-width-medium;
-    position: relative;
-    .no-sidebar & { margin-right: 0; border-right: 0; }
-    .collapse-sidebar & { margin-right: 20px; }
-    > div, > article {
-      padding-top: $pad-medium/2;
-      padding-bottom: $pad-medium/2;
-      float: left;
-    }
-  }
-  aside.sidebar {
-    width: $sidebar-width-medium - $sidebar-pad-medium*2;
-    padding: 0 $sidebar-pad-medium $sidebar-pad-medium;
-    background: none;
-    clear: none;
-    float: left;
-    margin: 0 -100% 0 0;
-    section {
-      width: auto; margin-left: 0;
-      &.odd, &.even { float: none; width: auto; margin-left: 0; }
-    }
-    .collapse-sidebar & {
-      @include collapse-sidebar;
-    }
-  }
-}
-
-@media only screen and (min-width: 992px) {
-  body > header { font-size: $header-font-size * 1.3; }
-  #content { margin-right: $sidebar-width-wide; }
-  #content {
-    > div, > article {
-      padding-top: $pad-wide/2;
-      padding-bottom: $pad-wide/2;
-    }
-  }
-  aside.sidebar {
-    width: $sidebar-width-wide - $sidebar-pad-wide*2;
-    padding: 1.2em $sidebar-pad-wide $sidebar-pad-wide;
-    .collapse-sidebar & {
-      padding: { left: $pad-wide; right: $pad-wide; }
-    }
-  }
-}
-
-@if $indented-lists == false {
-  @media only screen and (min-width: 768px) {
-    ul, ol { margin-left: 0; }
-  }
-}
-
diff --git a/sass/base/_solarized.scss b/sass/base/_solarized.scss
deleted file mode 100644
index 45d8fc5e..00000000
--- a/sass/base/_solarized.scss
+++ /dev/null
@@ -1,46 +0,0 @@
-$base03:          #002b36 !default; //darkest blue
-$base02:          #073642 !default; //dark blue
-$base01:          #586e75 !default; //darkest gray
-$base00:          #657b83 !default; //dark gray
-$base0:           #839496 !default; //medium gray
-$base1:           #93a1a1 !default; //medium light gray
-$base2:           #eee8d5 !default; //cream
-$base3:           #fdf6e3 !default; //white
-$solar-yellow:    #b58900 !default;
-$solar-orange:    #cb4b16 !default;
-$solar-red:       #dc322f !default;
-$solar-magenta:   #d33682 !default;
-$solar-violet:    #6c71c4 !default;
-$solar-blue:      #268bd2 !default;
-$solar-cyan:      #2aa198 !default;
-$solar-green:     #859900 !default;
-
-$solarized: dark !default;
-
-@if $solarized == light {
-
-  $_base03: $base03;
-  $_base02: $base02;
-  $_base01: $base01;
-  $_base00: $base00;
-  $_base0:  $base0;
-  $_base1:  $base1;
-  $_base2:  $base2;
-  $_base3:  $base3;
-
-  $base03:  $_base3;
-  $base02:  $_base2;
-  $base01:  $_base1;
-  $base00:  $_base0;
-  $base0:   $_base00;
-  $base1:   $_base01;
-  $base2:   $_base02;
-  $base3:   $_base03;
-}
-
-/* non highlighted code colors */
-$pre-bg: $base03 !default;
-$pre-border: darken($base02, 5) !default;
-$pre-color: $base1 !default;
-
-
diff --git a/sass/base/_theme.scss b/sass/base/_theme.scss
deleted file mode 100644
index c35136d5..00000000
--- a/sass/base/_theme.scss
+++ /dev/null
@@ -1,85 +0,0 @@
-$noise-bg: image-url('noise.png') top left !default;
-$img-border: inline-image('dotted-border.png') !default;
-
-// Main Link Colors
-$link-color: lighten(#165b94, 3) !default;
-$link-color-hover: adjust-color($link-color, $lightness: 10, $saturation: 25) !default;
-$link-color-visited: adjust-color($link-color, $hue: 80, $lightness: -4) !default;
-$link-color-active: adjust-color($link-color-hover, $lightness: -15) !default;
-
-// Main Section Colors
-$main-bg: #f8f8f8 !default;
-$page-bg: #252525 !default;
-$article-border: #eeeeee !default;
-
-$header-bg: #333 !default;
-$header-border: lighten($header-bg, 15) !default;
-$title-color: #f2f2f2 !default;
-$subtitle-color: #aaa !default;
-
-$text-color: #222 !default;
-$text-color-light: #aaa !default;
-$type-border: #ddd !default;
-
-/* Navigation */
-$nav-bg: #ccc !default;
-$nav-bg-front: image-url('noise.png') !default;
-$nav-bg-back: linear-gradient(lighten($nav-bg, 8), $nav-bg, darken($nav-bg, 11)) !default;
-$nav-color: darken($nav-bg, 38) !default;
-$nav-color-hover: darken($nav-color, 25) !default;
-$nav-placeholder: desaturate(darken($nav-bg, 10), 15) !default;
-$nav-border: darken($nav-bg, 10) !default;
-$nav-border-top: lighten($nav-bg, 15) !default;
-$nav-border-bottom: darken($nav-bg, 25) !default;
-$nav-border-left: darken($nav-bg, 11) !default;
-$nav-border-right: lighten($nav-bg, 7) !default;
-
-/* Sidebar colors */
-$sidebar-bg: #f2f2f2 !default;
-$sidebar-link-color: $text-color !default;
-$sidebar-link-color-hover: $link-color-hover !default;
-$sidebar-link-color-active: $link-color-active !default;
-$sidebar-color: change-color(mix($text-color, $sidebar-bg, 80), $hue: hue($sidebar-bg), $saturation: saturation($sidebar-bg)/2) !default;
-$sidebar-border: desaturate(darken($sidebar-bg, 7), 10) !default;
-$sidebar-border-hover: darken($sidebar-bg, 7) !default;
-$sidebar-link-color-subdued: lighten($sidebar-color, 20) !default;
-$sidebar-link-color-subdued-hover: $sidebar-link-color-hover !default;
-
-$footer-color: #888 !default;
-$footer-bg: #ccc !default;
-$footer-bg-front: image-url('noise.png') !default;
-$footer-bg-back: linear-gradient(lighten($footer-bg, 8), $footer-bg, darken($footer-bg, 11)) !default;
-$footer-color: darken($footer-bg, 38) !default;
-$footer-color-hover: darken($footer-color, 10) !default;
-$footer-border-top: lighten($footer-bg, 15) !default;
-$footer-border-bottom: darken($footer-bg, 15) !default;
-$footer-link-color: darken($footer-bg, 38) !default;
-$footer-link-color-hover: darken($footer-color, 25) !default;
-$page-border-bottom: darken($footer-bg, 5) !default;
-
-
-/* Core theme application */
-
-a {
-  @include link-colors($link-color, $hover: $link-color-hover, $focus: $link-color-hover, $visited: $link-color-visited, $active: $link-color-active);
-}
-aside.sidebar a {
-  @include link-colors($sidebar-link-color, $hover: $sidebar-link-color-hover, $focus: $sidebar-link-color-hover, $active: $sidebar-link-color-active);
-}
-a {
-  @include transition(color .3s);
-}
-
-html {
-  background: $page-bg image-url('line-tile.png') top left;
-}
-body {
-  > div {
-    background: $sidebar-bg $noise-bg;
-    border-bottom: 1px solid $page-border-bottom;
-    > div {
-      background: $main-bg $noise-bg;
-      border-right: 1px solid $sidebar-border;
-    }
-  }
-}
diff --git a/sass/base/_typography.scss b/sass/base/_typography.scss
deleted file mode 100644
index 9a6bbacd..00000000
--- a/sass/base/_typography.scss
+++ /dev/null
@@ -1,164 +0,0 @@
-$blockquote: $type-border !default;
-$sans: "PT Sans", "Helvetica Neue", Arial, sans-serif !default;
-$serif: "PT Serif", Georgia, Times, "Times New Roman", serif !default;
-$mono: Menlo, Monaco, "Andale Mono", "lucida console", "Courier New", monospace !default;
-$heading-font-family: "PT Serif", "Georgia", "Helvetica Neue", Arial, sans-serif !default;
-$header-title-font-family: $heading-font-family !default;
-$header-subtitle-font-family: $heading-font-family !default;
-
-// Fonts
-.heading {
-  font-family: $heading-font-family;
-}
-.sans { font-family: $sans; }
-.serif { font-family: $serif; }
-.mono { font-family: $mono; }
-
-body > header h1 {
-  font-size: 2.2em;
-  @extend .heading;
-  font-family: $header-title-font-family;
-  font-weight: normal;
-  line-height: 1.2em;
-  margin-bottom: 0.6667em;
-}
-body > header h2 {
-  font-family: $header-subtitle-font-family;
-}
-
-body {
-  line-height: 1.5em;
-  color: $text-color;
-  @extend .serif;
-}
-h1 {
-  font-size: 2.2em;
-  line-height: 1.2em;
-}
-
-@media only screen and (min-width: 992px) {
-  body { font-size: 1.15em; }
-  h1 { font-size: 2.6em; line-height: 1.2em; }
-}
-
-#{headings()}{
-  @extend .heading;
-  text-rendering: optimizelegibility;
-  margin-bottom: 1em;
-  font-weight: bold;
-}
-h2, section h1 {
-  font-size: 1.5em;
-}
-h3, section h2, section section h1 {
-  font-size: 1.3em;
-}
-h4, section h3, section section h2, section section section h1 {
-  font-size: 1em;
-}
-h5, section h4, section section h3 {
-  font-size: .9em;
-}
-h6, section h5, section section h4, section section section h3 {
-  font-size: .8em;
-}
-
-p, article blockquote, ul, ol { margin-bottom: 1.5em; }
-
-ul { list-style-type: disc;
-  ul { list-style-type: circle; margin-bottom: 0px;
-    ul { list-style-type: square; margin-bottom: 0px; }}}
-
-ol { list-style-type: decimal;
-  ol { list-style-type: lower-alpha; margin-bottom: 0px;
-    ol { list-style-type: lower-roman; margin-bottom: 0px; }}}
-
-ul, ol { &, ul, ol { margin-left: 1.3em; }}
-ul, ol { ul, ol { margin-bottom: 0em; }}
-
-strong { font-weight: bold; }
-
-em { font-style: italic; }
-
-sup, sub { font-size: 0.75em; position: relative;  display: inline-block; padding: 0 .2em; line-height: .8em;}
-sup { top: -.5em; }
-sub { bottom: -.5em; }
-
-a[rev='footnote']{ font-size: .75em; padding: 0 .3em; line-height: 1; }
-
-q { font-style: italic;
-  &:before { content: "\201C"; }
-  &:after { content: "\201D"; }
-}
-
-em, dfn { font-style: italic; }
-
-strong, dfn { font-weight: bold; }
-
-del, s { text-decoration: line-through; }
-
-abbr, acronym { border-bottom: 1px dotted; cursor: help; }
-
-pre, code, tt { @extend .mono; }
-
-hr { margin-bottom: 0.2em; }
-
-small { font-size: .8em; }
-
-big { font-size: 1.2em; }
-
-article blockquote {
-  $bq-margin: 1.2em;
-  font-style: italic;
-  position: relative;
-  font-size: 1.2em;
-  line-height: 1.5em;
-  padding-left: 1em;
-  border-left: 4px solid rgba($text-color-light, .5);
-  cite {
-    font-style: italic;
-    a { color: $text-color-light !important; word-wrap: break-word; }
-    &:before { content: '\2014'; padding:{right: .3em; left: .3em;} color: $text-color-light; }
-  }
-  @media only screen and (min-width: 992px) {
-    padding-left: 1.5em;
-    border-left-width: 4px;
-  }
-}
-
-.pullquote-right:before,
-.pullquote-left:before {
-  /* Reset metrics. */
-  padding: 0;
-  border: none;
-
-  /* Content */
-  content: attr(data-pullquote);
-
-  /* Pull out to the right, modular scale based margins. */
-  float: right;
-  width: 45%;
-  margin: .5em 0 1em 1.5em;
-
-  /* Baseline correction */
-  position: relative;
-  top: 7px;
-  font-size: 1.4em;
-  line-height: 1.45em;
-}
-
-.pullquote-left:before {
-  /* Make left pullquotes align properly. */
-  float: left;
-  margin: .5em 1.5em 1em 0;
-}
-
-/* @extend this to force long lines of continuous text to wrap */
-.force-wrap {
-  white-space: -moz-pre-wrap;
-  white-space: -pre-wrap;
-  white-space: -o-pre-wrap;
-  white-space: pre-wrap;
-  word-wrap: break-word;
-}
-
diff --git a/sass/base/_utilities.scss b/sass/base/_utilities.scss
deleted file mode 100644
index 2d49e659..00000000
--- a/sass/base/_utilities.scss
+++ /dev/null
@@ -1,28 +0,0 @@
-@mixin mask-image($img, $repeat: no-repeat){
-  @include experimental(mask-image, image-url($img), -webkit, -moz, -o, -ms);
-  @include experimental(mask-repeat, $repeat, -webkit, -moz, -o, -ms);
-  width: image-width($img);
-  height: image-height($img);
-}
-
-@mixin shadow-box($border: #fff .5em solid, $shadow: rgba(#000, .15) 0 1px 4px, $border-radius: .3em) {
-  @include border-radius($border-radius);
-  @include box-shadow($shadow);
-  @include box-sizing(border-box);
-  border: $border;
-}
-
-@mixin selection($bg, $color: inherit, $text-shadow: none){
-  * {
-    &::-moz-selection { background: $bg; color: $color; text-shadow: $text-shadow; }
-    &::-webkit-selection { background: $bg; color: $color; text-shadow: $text-shadow; }
-    &::selection { background: $bg; color: $color; text-shadow: $text-shadow; }
-  }
-}
-
-@function text-color($color, $dark: dark, $light: light){
-  $text-color: ( (red($color)*299) + (green($color)*587) + (blue($color)*114) ) / 1000;
-  $text-color: if($text-color >= 150, $dark, $light);
-  @return $text-color;
-}
-
diff --git a/sass/custom/_colors.scss b/sass/custom/_colors.scss
deleted file mode 100644
index 515544fe..00000000
--- a/sass/custom/_colors.scss
+++ /dev/null
@@ -1,43 +0,0 @@
-// Here you can easily change your sites's color scheme.
-// To give it a try, uncomment some of the lines below rebuild your blog, and see how it works.
-// If you need a handy color picker try http://hslpicker.com
-
-$header-bg: #263347;
-$subtitle-color: lighten($header-bg, 58);
-$nav-bg: desaturate(lighten(#8fc17a, 18), 5);
-$nav-bg-front: image-url('noise.png');
-$nav-bg-back: linear-gradient(lighten($nav-bg, 8), $nav-bg, darken($nav-bg, 11));
-$sidebar-bg: desaturate(#eceff5, 8);
-$sidebar-link-color: saturate(#526f9a, 10);
-$sidebar-link-color-hover: darken(#7ab662, 9);
-$footer-bg: #ccc !default;
-$footer-bg-front: image-url('noise.png');
-$footer-bg-back: linear-gradient(lighten($footer-bg, 8), $footer-bg, darken($footer-bg, 11));
-
-
-/* To use the light Solarized highlighting theme uncomment the following line */
-$solarized: light;
-
-/* If you want to tweak the Solarized colors you can do that here */
-//$base03:          #002b36; //darkest blue
-//$base02:          #073642; //dark blue
-//$base01:          #586e75; //darkest gray
-//$base00:          #657b83; //dark gray
-//$base0:           #839496; //medium gray
-//$base1:           #93a1a1; //medium light gray
-//$base2:           #eee8d5; //cream
-//$base3:           #fdf6e3; //white
-//$solar-yellow:    #b58900;
-//$solar-orange:    #cb4b16;
-//$solar-red:       #dc322f;
-//$solar-magenta:   #d33682;
-//$solar-violet:    #6c71c4;
-//$solar-blue:      #268bd2;
-//$solar-cyan:      #2aa198;
-//$solar-green:     #859900;
-
-
-/* Non highlighted code colors */
-//$pre-bg: $base03;
-//$pre-border: darken($base02, 5);
-//$pre-color: $base1;
diff --git a/sass/custom/_fonts.scss b/sass/custom/_fonts.scss
deleted file mode 100644
index 162e3fa1..00000000
--- a/sass/custom/_fonts.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-// Here you can easily change font faces which are used in your site.
-// To give it a try, uncomment some of the lines below rebuild your blog, and see how it works. your sites's.
-// If you love to use Web Fonts, you also need to add some lines to source/_includes/custom/head.html
-
-$sans: "Source Sans Pro", sans-serif;
-$serif: "Source Sans Pro", sans-serif;
-$mono: "Source Code Pro", monospace;
-$heading-font-family: "Source Sans Pro", sans-serif;
-$header-title-font-family: "Source Sans Pro", sans-serif;
-$header-subtitle-font-family: "Source Sans Pro", sans-serif;
diff --git a/sass/custom/_layout.scss b/sass/custom/_layout.scss
deleted file mode 100644
index 74c7de9d..00000000
--- a/sass/custom/_layout.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-// Here you can easily change your sites's layout.
-// To give it a try, uncomment some of the lines below, make changes, rebuild your blog, and see how it works.
-
-//$header-font-size: 1em;
-//$header-padding-top: 1.5em;
-//$header-padding-bottom: 1.5em;
-
-//$max-width: 1350px;
-//$indented-lists: true;
-
-// Padding used for layout margins
-//$pad-min: 18px;
-//$pad-narrow: 25px;
-//$pad-medium: 35px;
-//$pad-wide: 55px;
-
-// Sidebar widths used in media queries
-//$sidebar-width-medium: 240px;
-//$sidebar-pad-medium: 15px;
-//$sidebar-pad-wide: 20px;
-//$sidebar-width-wide: 300px;
diff --git a/sass/custom/_styles.scss b/sass/custom/_styles.scss
deleted file mode 100644
index 2f23ecfd..00000000
--- a/sass/custom/_styles.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-// This File is imported last, and will override other styles in the cascade
-// Add styles here to make changes without digging in too much
-body {
-    font-size: 1em;
-}
-
-article blockquote {
-    font-size: 1em;
-    color: #888888;
-}
diff --git a/sass/partials/_archive.scss b/sass/partials/_archive.scss
deleted file mode 100644
index 9ef1e824..00000000
--- a/sass/partials/_archive.scss
+++ /dev/null
@@ -1,72 +0,0 @@
-#archive {
-  #content > div { &, > article { padding-top: 0; } }
-}
-#blog-archives {
-  article {
-    padding: 1em 0 1em;
-    position: relative;
-    background: $img-border bottom left repeat-x;
-    &:last-child {
-      background: none;
-    }
-    footer { padding: 0; margin: 0;}
-  }
-  h1 { color: $text-color; margin-bottom: .3em; }
-  h2 { display: none; }
-  h1 {
-    font-size: 1.5em;
-    a {
-      @include hover-link;
-      color: inherit;
-      &:hover { color: $link-color-hover; }
-      font-weight: normal;
-      display: inline-block;
-    }
-  }
-  a.category, time {
-    @extend .sans;
-    color: $text-color-light;
-  }
-  color: $text-color-light;
-  .entry-content { display: none; }
-  time {
-    font-size: .9em;
-    line-height: 1.2em;
-    .month, .day { display: inline-block; }
-    .month { text-transform: uppercase; }
-  }
-  p { margin-bottom: 1em; }
-  &, .entry-content { a { @include link-colors(inherit, $link-color-hover); }}
-  a:hover { color: $link-color-hover; }
-  @media only screen and (min-width: 550px) {
-    article { margin-left: 5em; }
-    h2 {
-      margin-bottom: .3em;
-      font-weight: normal;
-      display: inline-block;
-      position: relative; top: -1px;
-      float: left;
-      &:first-child { padding-top: .75em; }
-    }
-    time {
-      position: absolute;
-      text-align: right;
-      left: 0em;
-      top: 1.8em;
-    }
-    .year { display: none; }
-    article {
-      padding:{left: 4.5em; bottom: .7em;}
-    }
-  a.category {
-    line-height: 1.1em;
-    }
-  }
-}
-#content > .category {
-  article {
-    margin-left: 0;
-    padding-left: 6.8em;
-  }
-  .year { display: inline; }
-}
diff --git a/sass/partials/_blog.scss b/sass/partials/_blog.scss
deleted file mode 100644
index 57fe7a8a..00000000
--- a/sass/partials/_blog.scss
+++ /dev/null
@@ -1,141 +0,0 @@
-article {
-  padding-top: 1em;
-  a { @extend .force-wrap; }
-  header {
-    position: relative;
-    padding-top: 2em;
-    padding-bottom: 1em;
-    margin-bottom: 1em;
-    background: $img-border bottom left repeat-x;
-    h1 {
-      margin: 0;
-      a { text-decoration: none;
-        &:hover { text-decoration: underline; } }
-    }
-    p {
-      font-size: .9em;
-      color: $text-color-light;
-      margin: 0;
-      &.meta {
-        @extend .sans;
-        text-transform: uppercase;
-        position: absolute; top: 0;
-      }
-    }
-    @media only screen and (min-width: 768px) {
-      margin-bottom: 1.5em;
-      padding-bottom: 1em;
-      background: $img-border bottom left repeat-x;
-    }
-  }
-  h2 {
-    padding-top: 0.8em;
-    background: $img-border top left repeat-x;
-  }
-  .entry-content & h2:first-child, header + h2 { padding-top: 0; }
-  h2:first-child, header + h2 { background: none; }
-  .feature {
-    padding-top: .5em;
-    margin-bottom: 1em;
-    padding-bottom: 1em;
-    background: $img-border bottom left repeat-x;
-    font-size: 2.0em; font-style: italic;
-    line-height: 1.3em;
-  }
-  img, video, .flash-video {
-    @extend .flex-content;
-    @extend .basic-alignment;
-    @include shadow-box;
-  }
-  video, .flash-video { margin: 0 auto 1.5em; }
-  video { display: block; width: 100%; }
-  .flash-video {
-    > div {
-      position: relative;
-      display: block;
-      padding-bottom: 56.25%;
-      padding-top: 1px;
-      height: 0;
-      overflow: hidden;
-      iframe, object, embed {
-        position: absolute;
-        top: 0;
-        left: 0;
-        width: 100%;
-        height: 100%;
-      }
-    }
-  }
-  > footer {
-    padding-bottom: 2.5em;
-    margin-top: 2em;
-    @extend .sans;
-    p.meta {
-      margin-bottom: .8em;
-      font-size: .85em;
-      clear: both;
-      overflow: hidden;
-    }
-    .byline + time:before, time +time:before, .comments:before, .byline ~ .categories:before {
-      @extend .separator;
-    }
-  }
-
-}
-article + article {
-  .blog-index & {
-    background: $img-border top left repeat-x;
-  }
-}
-#content .blog-index {
-  padding: { top: 0; bottom: 0; }
-  article { padding-top: 2em; }
-  article header { background: none; padding-bottom: 0; }
-  article h1 {
-    font-size: 2.2em;
-    a { color: inherit; &:hover { color: $link-color-hover; } }
-  }
-  a[rel=full-article] {
-    background: darken($main-bg, 5);
-    display: inline-block;
-    padding: .4em .8em;
-    margin-right: .5em;
-    text-decoration: none;
-    color: mix($text-color, $text-color-light);
-    @extend .serif;
-    @include transition(background-color .5s);
-    &:hover {
-      background: $link-color-hover;
-      text-shadow: none;
-      color: $main-bg;
-    }
-  }
-  footer {
-    @extend .sans;
-    margin-top: 1em;
-  }
-}
-
-.separator {
-  content: "\2022 ";
-  padding: 0 .4em 0 .2em;
-  display: inline-block;
-}
-
-#content div.pagination {
-  text-align: center;
-  font-size: .95em;
-  position: relative;
-  background: $img-border top left repeat-x;
-  padding: {top: 1.5em; bottom: 1.5em;}
-  a {
-    text-decoration: none;
-    color: $text-color-light;
-    &.prev { position: absolute; left: 0; }
-    &.next { position: absolute; right: 0; }
-    &:hover { color: $link-color-hover; }
-    &[href*=archive] {
-      &:before, &:after { content: '\2014'; padding: 0 .3em; }
-    }
-  }
-}
diff --git a/sass/partials/_footer.scss b/sass/partials/_footer.scss
deleted file mode 100644
index 37411225..00000000
--- a/sass/partials/_footer.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-body > footer {
-  @extend .sans;
-  font-size: .8em;
-  color: $footer-color;
-  text-shadow: lighten($footer-bg, 5) 0 1px;
-  background-color: $footer-bg;
-  @include background($footer-bg-front, $footer-bg-back);
-  border-top: 1px solid $footer-border-top;
-  position: relative;
-  padding-top: 1em;
-  padding-bottom: 1em;
-  margin-bottom: 3em;
-  @include border-bottom-radius(.4em);
-  z-index: 1;
-  a {
-    @include link-colors($footer-link-color, $footer-link-color-hover, $visited: $footer-link-color);
-  }
-  p:last-child { margin-bottom: 0; }
-}
diff --git a/sass/partials/_header.scss b/sass/partials/_header.scss
deleted file mode 100644
index e3c6c020..00000000
--- a/sass/partials/_header.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-body > header {
-  background: $header-bg;
-  h1 {
-    display: inline-block;
-    margin: 0;
-    a, a:visited, a:hover {
-      color: $title_color;
-      text-decoration: none;
-    }
-  }
-  h2 {
-    margin: .2em 0 0;
-    @extend .sans;
-    font-size: 1em;
-    color: $subtitle-color;
-    font-weight: normal;
-  }
-}
diff --git a/sass/partials/_navigation.scss b/sass/partials/_navigation.scss
deleted file mode 100644
index 30fa011d..00000000
--- a/sass/partials/_navigation.scss
+++ /dev/null
@@ -1,137 +0,0 @@
-body > nav {
-  position: relative;
-  background-color: $nav-bg;
-  @include background($nav-bg-front, $nav-bg-back);
-  border: {
-    top: 1px solid $nav-border-top;
-    bottom: 1px solid $nav-border-bottom; }
-  padding-top: .35em;
-  padding-bottom: .35em;
-  form {
-    @include background-clip(padding-box);
-    margin: 0; padding: 0;
-    .search {
-      padding: .3em .5em 0;
-      font-size: .85em;
-      font-family: $sans;
-      line-height: 1.1em;
-      width: 95%;
-      @include border-radius(.5em);
-      @include background-clip(padding-box);
-      @include box-shadow(lighten($nav-bg, 2) 0 1px);
-      background-color: lighten($nav-bg, 15);
-      border: 1px solid $nav-border;
-      color: #888;
-      &:focus {
-        color: #444;
-        border-color: #80b1df;
-        @include box-shadow(#80b1df 0 0 4px, #80b1df 0 0 3px inset);
-        background-color: #fff;
-        outline: none;
-      }
-    }
-  }
-  fieldset[role=search]{ float: right; width: 48%; }
-  fieldset.mobile-nav{ float: left; width: 48%;
-    select{ width: 100%; font-size: .8em; border: 1px solid #888;}
-  }
-  ul { display: none; }
-  @media only screen and (min-width: 550px) {
-    font-size: .9em;
-    ul {
-      @include horizontal-list(0);
-      float: left;
-      display: block;
-      padding-top: .15em;
-    }
-    ul.subscription {
-      margin-left: .8em;
-      float: right;
-      li:last-child a { padding-right: 0; }
-    }
-    ul li {
-      margin: 0;
-    }
-    a {
-      @include link-colors($nav-color, $nav-color-hover, $visited: $nav-color);
-      font-family: $sans;
-      text-shadow: lighten($nav-bg, 12) 0 1px;
-      float: left;
-      text-decoration: none;
-      font-size: 1.1em;
-      padding: .1em 0;
-      line-height: 1.5em;
-    }
-    li + li {
-      border-left: 1px solid $nav-border-left;
-      margin-left: .8em;
-      a {
-        padding-left: .8em;
-        border-left: 1px solid $nav-border-right;
-      }
-    }
-    form {
-      float: right;
-      text-align: left;
-      padding-left: .8em;
-      width: $sidebar-width-medium - $pad-medium*2 - $sidebar-pad-medium + 20px;
-      .search {
-        width: 93%;
-        font-size: .95em;
-        line-height: 1.2em;
-      }
-    }
-    ul[data-subscription$=email] + form {
-      width: $sidebar-width-medium - $pad-medium*2 - $sidebar-pad-medium - 58px;
-      .search { width: 91%; }
-    }
-    fieldset.mobile-nav { display: none; }
-    fieldset[role=search]{ width: 99%; }
-  }
-  @media only screen and (min-width: 992px) {
-    form {
-      width: $sidebar-width-wide - $pad-wide - $sidebar-pad-wide*2 + 10px;
-    }
-    ul[data-subscription$=email] + form {
-      width: $sidebar-width-wide - $pad-wide - $sidebar-pad-wide*2 - 58px;
-    }
-  }
-}
-.no-placeholder {
-  body > nav .search {
-    background: lighten($nav-bg, 15) image-url('search.png') .3em .25em no-repeat;
-    text-indent: 1.3em;
-  }
-}
-@mixin mask-subscription-nav($feed: 'rss.png'){
-  position: relative; top: 0px;
-  text-indent: -999999em;
-  background-color: $nav-border-right;
-  border: 0;
-  padding: 0;
-  &,&:after { @include mask-image($feed); }
-  &:after {
-    content: "";
-    position: absolute; top: -1px; left: 0;
-    background-color: lighten($nav-color, 25);
-  }
-  &:hover:after { background-color: lighten($nav-color, 20); }
-}
-.maskImage {
-  body > nav {
-    @media only screen and (min-width: 550px) {
-      ul[data-subscription$=email] + form {
-        width: $sidebar-width-medium - $pad-medium*2 - $sidebar-pad-medium - 32px;
-      }
-    }
-    @media only screen and (min-width: 992px) {
-      ul[data-subscription$=email] + form {
-        width: $sidebar-width-wide - $pad-wide - $sidebar-pad-wide*2 - 32px;
-      }
-    }
-  }
-  ul.subscription { position: relative; top: .2em; li, a { border: 0; padding: 0; }}
-  a[rel=subscribe-rss]{ @include mask-subscription-nav('rss.png'); }
-  a[rel=subscribe-email]{ @include mask-subscription-nav('email.png'); }
-}
-
diff --git a/sass/partials/_sharing.scss b/sass/partials/_sharing.scss
deleted file mode 100644
index 3eecb488..00000000
--- a/sass/partials/_sharing.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-.sharing {
-  p.meta + & {
-    padding: { top: 1em; left: 0; }
-    background: $img-border top left repeat-x;
-  }
-}
-
-#fb-root { display: none; }
diff --git a/sass/partials/_sidebar.scss b/sass/partials/_sidebar.scss
deleted file mode 100644
index cd8c1ca2..00000000
--- a/sass/partials/_sidebar.scss
+++ /dev/null
@@ -1,4 +0,0 @@
-@import "sidebar/base";
-@import "sidebar/googleplus";
-@import "sidebar/pinboard";
-@import "sidebar/delicious";
diff --git a/sass/partials/_syntax.scss b/sass/partials/_syntax.scss
deleted file mode 100644
index 5465286f..00000000
--- a/sass/partials/_syntax.scss
+++ /dev/null
@@ -1,261 +0,0 @@
-.highlight, html .gist .gist-file .gist-syntax .gist-highlight {
-  table td.code { width: 100%; }
-  border: 1px solid $pre-border !important;
-}
-.highlight .line-numbers, html .gist .gist-file .gist-syntax .highlight .line_numbers {
-  text-align: right;
-  font-size: 13px;
-  line-height: 1.45em;
-  @if $solarized == light {
-    background: lighten($base03, 1) $noise-bg !important;
-    border-right: 1px solid darken($base02, 2) !important;
-    @include box-shadow(lighten($base03, 2) -1px 0 inset);
-    text-shadow: lighten($base02, 2) 0 -1px;
-  } @else {
-    background: $base02 $noise-bg !important;
-    border-right: 1px solid darken($base03, 2) !important;
-    @include box-shadow(lighten($base02, 2) -1px 0 inset);
-    text-shadow: darken($base02, 10) 0 -1px;
-  }
-  span { color: $base01 !important; }
-  padding: .8em !important;
-  @include border-radius(0);
-}
-
-figure.code, .gist-file, pre {
-  @include box-shadow(rgba(#000, .06) 0 0 10px);
-  .highlight pre { @include box-shadow(none); }
-}
-
-.gist .highlight, figure.code .highlight {
-  @include selection(adjust-color($base03, $lightness: 23%, $saturation: -65%), $text-shadow: $base03 0 1px);
-}
-html .gist .gist-file {
-  margin-bottom: 1.8em;
-  position: relative;
-  border: none;
-  padding-top: image-height("code_bg.png") !important;
-  .highlight {
-    margin-bottom: 0;
-  }
-  .gist-syntax {
-    border-bottom: 0 !important;
-    background: none !important;
-    .gist-highlight {
-      background: $base03 !important;
-    }
-    .highlight pre {
-      @extend .pre-code;
-      padding: 0;
-    }
-  }
-  .gist-meta {
-   padding: .6em 0.8em;
-   border: 1px solid lighten($base02, 2) !important;
-   color: $base01;
-   font-size: .7em !important;
-   @if $solarized == light {
-     background: lighten($base03, 2) $noise-bg;
-     border: 1px solid $pre-border !important;
-     border-top: 1px solid lighten($base03, 2) !important;
-   } @else {
-     background: $base02 $noise-bg;
-   }
-   @extend .sans;
-   line-height: 1.5em;
-    a {
-      color: mix($base1, $base01) !important;
-      @include hover-link;
-      &:hover { color: $base1 !important; }
-    }
-    a[href*='#file'] {
-      position: absolute; top: 0; left:0; right:-10px;
-      color: #474747 !important;
-      @extend .code-title;
-      &:hover { color: $link-color !important; }
-    }
-    a[href*=raw]{
-      @extend .download-source;
-      top: .4em;
-    }
-  }
-}
-pre {
-  background: $pre-bg $noise-bg;
-  @include border-radius(.4em);
-  @extend .mono;
-  border: 1px solid $pre-border;
-  line-height: 1.45em;
-  font-size: 13px;
-  margin-bottom: 2.1em;
-  padding: .8em 1em;
-  color: $pre-color;
-  overflow: auto;
-}
-h3.filename {
-  @extend .code-title;
-  + pre { @include border-top-radius(0px); }
-}
-
-p, li {
-  code {
-    @extend .mono;
-    display: inline-block;
-    white-space: no-wrap;
-    background: #fff;
-    font-size: .8em;
-    line-height: 1.5em;
-    color: #555;
-    border: 1px solid #ddd;
-    @include border-radius(.4em);
-    padding: 0 .3em;
-    margin: -1px 0;
-  }
-  pre code { font-size: 1em !important; background: none; border: none; }
-}
-
-.pre-code {
-  font-family: $mono !important;
-  overflow: scroll;
-  overflow-y: hidden;
-  display: block;
-  padding: .8em;
-  overflow-x: auto;
-  line-height: 1.45em;
-  background: $base03 $noise-bg !important;
-  color: $base1 !important;
-  span { color: $base1 !important; }
-  span { font-style: normal !important; font-weight: normal !important; }
-
-  .c      { color: $base01 !important; font-style: italic !important; }                     /* Comment */
-  .cm     { color: $base01 !important; font-style: italic !important; }                     /* Comment.Multiline */
-  .cp     { color: $base01 !important; font-style: italic !important;  }                     /* Comment.Preproc */
-  .c1     { color: $base01 !important; font-style: italic !important; }                     /* Comment.Single */
-  .cs     { color: $base01 !important; font-weight: bold !important; font-style: italic !important; }   /* Comment.Special */
-  .err    { color: $solar-red !important; background: none !important; }                                            /* Error */
-  .k      { color: $solar-orange !important; }                       /* Keyword */
-  .o      { color: $base1 !important; font-weight: bold !important; }                       /* Operator */
-  .p      { color: $base1 !important; }                                             /* Operator */
-  .ow     { color: $solar-cyan !important; font-weight: bold !important; }                       /* Operator.Word */
-  .gd     { color: $base1 !important; background-color: mix($solar-red, $base03, 25%) !important; display: inline-block; }               /* Generic.Deleted */
-  .gd .x  { color: $base1 !important; background-color: mix($solar-red, $base03, 35%) !important; display: inline-block; }               /* Generic.Deleted.Specific */
-  .ge     { color: $base1 !important; font-style: italic !important; }                      /* Generic.Emph */
-  //.gr     { color: #aa0000 }                                          /* Generic.Error */
-  .gh     { color: $base01 !important; }                                          /* Generic.Heading */
-  .gi     { color: $base1 !important; background-color: mix($solar-green, $base03, 20%) !important; display: inline-block; }               /* Generic.Inserted */
-  .gi .x  { color: $base1 !important; background-color: mix($solar-green, $base03, 40%) !important; display: inline-block; }               /* Generic.Inserted.Specific */
-  //.go     { color: #888888 }                                          /* Generic.Output */
-  //.gp     { color: #555555 }                                          /* Generic.Prompt */
-  .gs     { color: $base1 !important; font-weight: bold !important; }                                       /* Generic.Strong */
-  .gu     { color: $solar-violet !important; }                                          /* Generic.Subheading */
-  //.gt     { color: #aa0000 }                                          /* Generic.Traceback */
-  .kc     { color: $solar-green !important; font-weight: bold !important; }                       /* Keyword.Constant */
-  .kd     { color: $solar-blue !important; }                       /* Keyword.Declaration */
-  .kp     { color: $solar-orange !important; font-weight: bold !important; }                       /* Keyword.Pseudo */
-  .kr     { color: $solar-magenta !important; font-weight: bold !important; }                       /* Keyword.Reserved */
-  .kt     { color: $solar-cyan !important; }                       /* Keyword.Type */
-  .n      { color: $solar-blue !important; }
-  .na     { color: $solar-blue !important; }                                          /* Name.Attribute */
-  .nb     { color: $solar-green !important; }                                          /* Name.Builtin */
-  .nc     { color: $solar-magenta !important;}                                                   /* Name.Class */
-  .no     { color: $solar-yellow !important; }                                          /* Name.Constant */
-  //.ni     { color: #800080 }                                          /* Name.Entity */
-  .nl     { color: $solar-green !important; }
-  .ne     { color: $solar-blue !important; font-weight: bold !important; }                       /* Name.Exception */
-  .nf     { color: $solar-blue !important; font-weight: bold !important; }                       /* Name.Function */
-  .nn     { color: $solar-yellow !important; }                                          /* Name.Namespace */
-  .nt     { color: $solar-blue !important; font-weight: bold !important; }                                          /* Name.Tag */
-  .nx     { color: $solar-yellow !Important; }
-  //.bp     { color: #999999 }                                          /* Name.Builtin.Pseudo */
-  //.vc     { color: #008080 }                                          /* Name.Variable.Class */
-  .vg     { color: $solar-blue !important; }                                          /* Name.Variable.Global */
-  .vi     { color: $solar-blue !important; }                                          /* Name.Variable.Instance */
-  .nv     { color: $solar-blue !important; }                                          /* Name.Variable */
-  //.w      { color: #bbbbbb }                                          /* Text.Whitespace */
-  .mf     { color: $solar-cyan !important; }                                          /* Literal.Number.Float */
-  .m      { color: $solar-cyan !important; }                                          /* Literal.Number */
-  .mh     { color: $solar-cyan !important; }                                          /* Literal.Number.Hex */
-  .mi     { color: $solar-cyan !important; }                                          /* Literal.Number.Integer */
-  //.mo     { color: #009999 }                                          /* Literal.Number.Oct */
-  .s      { color: $solar-cyan !important; }                                             /* Literal.String */
-  //.sb     { color: #d14 }                                             /* Literal.String.Backtick */
-  //.sc     { color: #d14 }                                             /* Literal.String.Char */
-  .sd     { color: $solar-cyan !important; }                                             /* Literal.String.Doc */
-  .s2     { color: $solar-cyan !important; }                                             /* Literal.String.Double */
-  .se     { color: $solar-red !important; }                                             /* Literal.String.Escape */
-  //.sh     { color: #d14 }                                             /* Literal.String.Heredoc */
-  .si     { color: $solar-blue !important; }                                             /* Literal.String.Interpol */
-  //.sx     { color: #d14 }                                             /* Literal.String.Other */
-  .sr     { color: $solar-cyan !important; }                                          /* Literal.String.Regex */
-  .s1     { color: $solar-cyan !important; }                                             /* Literal.String.Single */
-  //.ss     { color: #990073 }                                          /* Literal.String.Symbol */
-  //.il     { color: #009999 }                                          /* Literal.Number.Integer.Long */
-  div { .gd, .gd .x, .gi, .gi .x { display: inline-block; width: 100%; }}
-}
-
-.highlight, .gist-highlight {
-  pre { background: none; @include border-radius(0px); border: none; padding: 0; margin-bottom: 0; }
-  margin-bottom: 1.8em;
-  background: $base03;
-  overflow-y: hidden;
-  overflow-x: auto;
-}
-
-$solar-scroll-bg: rgba(#fff, .15);
-$solar-scroll-thumb: rgba(#fff, .2);
-@if $solarized == light {
-  $solar-scroll-bg: rgba(#000, .15);
-  $solar-scroll-thumb: rgba(#000, .15);
-}
-
-pre, .highlight, .gist-highlight {
-  &::-webkit-scrollbar {  height: .5em; background: $solar-scroll-bg; }
-  &::-webkit-scrollbar-thumb:horizontal { background: $solar-scroll-thumb;  -webkit-border-radius: 4px; border-radius: 4px }
-}
-
-.highlight code { 
-  @extend .pre-code; background: #000;
-}
-figure.code {
-  background: none;
-  padding: 0;
-  border: 0;
-  margin-bottom: 1.5em;
-  pre { margin-bottom: 0; }
-  figcaption {
-    position: relative;
-    @extend .code-title;
-    a { @extend .download-source; }
-  }
-  .highlight {
-    margin-bottom: 0;
-  }
-}
-
-.code-title {
-  text-align: center;
-  font-size: 13px;
-  line-height: 2em;
-  text-shadow: #cbcccc 0 1px 0;
-  color: #474747;
-  font-weight: normal;
-  margin-bottom: 0;
-  @include border-top-radius(5px);
-  font-family: "Helvetica Neue", Arial, "Lucida Grande", "Lucida Sans Unicode", Lucida, sans-serif;
-  background: #aaaaaa image-url("code_bg.png") top repeat-x;
-  border: 1px solid #565656;
-  border-top-color: #cbcbcb;
-  border-left-color: #a5a5a5;
-  border-right-color: #a5a5a5;
-  border-bottom: 0;
-}
-
-.download-source {
-  position: absolute; right: .8em;
-  @include hover-link;
-  color: #666 !important;
-  z-index: 1;
-  font-size: 13px;
-  text-shadow: #cbcccc 0 1px 0;
-  padding-left: 3em;
-}
diff --git a/sass/partials/sidebar/_base.scss b/sass/partials/sidebar/_base.scss
deleted file mode 100644
index 5441304e..00000000
--- a/sass/partials/sidebar/_base.scss
+++ /dev/null
@@ -1,106 +0,0 @@
-.side-shadow-border {
-  @include box-shadow(lighten($sidebar-bg, 5) 0 1px);
-}
-aside.sidebar {
-  overflow: hidden;
-  color: $sidebar-color;
-  text-shadow: lighten($sidebar-bg, 8) 0 1px;
-  a { @extend .force-wrap; }
-  section {
-    @extend .sans;
-    font-size: .8em;
-    line-height: 1.4em;
-    margin-bottom: 1.5em;
-    h1 {
-      margin: 1.5em 0 0;
-      padding-bottom: .2em;
-      border-bottom: 1px solid $sidebar-border;
-      @extend .side-shadow-border;
-      + p {
-        padding-top: .4em;
-      }
-    }
-  }
-  img {
-    @extend .flex-content;
-    @extend .basic-alignment;
-    @include shadow-box($border: #fff .3em solid);
-  }
-  ul {
-    margin-bottom: 0.5em;
-    margin-left: 0;
-  }
-  li {
-    list-style: none;
-    padding: .5em 0;
-    margin: 0;
-    border-bottom: 1px solid $sidebar-border;
-    @extend .side-shadow-border;
-    p:last-child {
-      margin-bottom: 0;
-    }
-  }
-  a {
-    color: inherit;
-    @include transition(color .5s);
-  }
-  &:hover a {
-    color: $sidebar-link-color;
-    &:hover { color: $sidebar-link-color-hover; }
-  }
-}
-.aside-alt-link {
-  color: $sidebar-link-color-subdued;
-  &:hover {
-    color: $sidebar-link-color-subdued-hover;
-  }
-}
-
-@media only screen and (min-width: 768px) {
-  .toggle-sidebar {
-    outline: none;
-    position: absolute; right: -10px; top: 0; bottom: 0;
-    display: inline-block;
-    text-decoration: none;
-    color: mix($text-color-light, $sidebar-bg);
-    width: 9px;
-    cursor: pointer;
-    &:hover {
-      background: mix($sidebar-border, $sidebar-bg);
-      @include background(linear-gradient(left, rgba($sidebar-border, .5), rgba($sidebar-border, 0)));
-    }
-    &:after {
-      position: absolute; right: -11px; top: 0;
-      width: 20px;
-      font-size: 1.2em;
-      line-height: 1.1em;
-      padding-bottom: .15em;
-      @include border-bottom-right-radius(.3em);
-      text-align: center;
-      background: $main-bg $noise-bg;
-      border-bottom: 1px solid $sidebar-border;
-      border-right: 1px solid $sidebar-border;
-      content: "\00BB";
-      text-indent: -1px;
-    }
-    .collapse-sidebar & {
-      text-indent: 0px;
-      right: -20px;
-      width: 19px;
-      &:hover {
-        background: mix($sidebar-border, $sidebar-bg);
-      }
-      &:after {
-        border-left: 1px solid $sidebar-border;
-        text-shadow: #fff 0 1px;
-        content: "\00AB";
-        left: 0px; right: 0;
-        text-align: center;
-        text-indent: 0;
-        border: 0;
-        border-right-width: 0;
-        background: none;
-      }
-    }
-  }
-}
diff --git a/sass/partials/sidebar/_delicious.scss b/sass/partials/sidebar/_delicious.scss
deleted file mode 100644
index e962702e..00000000
--- a/sass/partials/sidebar/_delicious.scss
+++ /dev/null
@@ -1,4 +0,0 @@
-.delicious-posts {
-  a.delicious-link { margin-bottom: .5em; display: block; }
-  p { font-size: 1em; }
-}
diff --git a/sass/partials/sidebar/_googleplus.scss b/sass/partials/sidebar/_googleplus.scss
deleted file mode 100644
index c2a693ee..00000000
--- a/sass/partials/sidebar/_googleplus.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-.googleplus {
-  h1 {
-       -moz-box-shadow: none !important;
-    -webkit-box-shadow: none !important;
-         -o-box-shadow: none !important;
-            box-shadow: none !important;
-    border-bottom: 0px none !important;
-  }
-  a {
-    text-decoration: none;
-    white-space: normal !important;
-    line-height: 32px;
-
-    img {
-      float: left;
-      margin-right: 0.5em;
-      border: 0 none;
-    }
-  }
-}
-
-.googleplus-hidden {
-  position: absolute;
-  top: -1000em;
-  left: -1000em;
-}
diff --git a/sass/partials/sidebar/_pinboard.scss b/sass/partials/sidebar/_pinboard.scss
deleted file mode 100644
index 9f9ab461..00000000
--- a/sass/partials/sidebar/_pinboard.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-#pinboard_linkroll {
-  .pin-title, .pin-description {
-    display: block;
-    margin-bottom: .5em;
-  }
-  .pin-tag {
-    @include hover-link;
-    @extend .aside-alt-link;
-    &:after { content: ','; }
-    &:last-child:after { content: ''; }
-  }
-}
diff --git a/sass/plugins/_plugins.scss b/sass/plugins/_plugins.scss
deleted file mode 100644
index 3b4ba0b8..00000000
--- a/sass/plugins/_plugins.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-/*
-  Add plugin stylesheets to this directory and they will be automatically
-  Imported. Load order is alphabetical and styles can be overriden in
-  custom/_style.scss which is loaded after all plugin stylesheets.
-*/
-
diff --git a/sass/screen.scss b/sass/screen.scss
deleted file mode 100644
index 75eac0a2..00000000
--- a/sass/screen.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-@import "compass";
-@include global-reset;
-
-@import "custom/colors";
-@import "custom/fonts";
-@import "custom/layout";
-@import "base";
-@import "partials";
-@import "plugins/**/*";
-@import "custom/styles";
diff --git a/source/_includes/after_footer.html b/source/_includes/after_footer.html
deleted file mode 100644
index 08b8e340..00000000
--- a/source/_includes/after_footer.html
+++ /dev/null
@@ -1,5 +0,0 @@
-{% include disqus.html %}
-{% include facebook_like.html %}
-{% include google_plus_one.html %}
-{% include twitter_sharing.html %}
-{% include custom/after_footer.html %}
diff --git a/source/_includes/archive_post.html b/source/_includes/archive_post.html
deleted file mode 100644
index 210dbbbe..00000000
--- a/source/_includes/archive_post.html
+++ /dev/null
@@ -1,8 +0,0 @@
-{% capture category %}{{ post.categories | size }}{% endcapture %}
-<h1><a href="{{ root_url }}{{ post.url }}">{% if site.titlecase %}{{ post.title | titlecase }}{% else %}{{ post.title }}{% endif %}</a></h1>
-<time datetime="{{ post.date | datetime | date_to_xmlschema }}" pubdate>{{ post.date | date: "<span class='month'>%b</span> <span class='day'>%d</span> <span class='year'>%Y</span>"}}</time>
-{% if category != '0' %}
-<footer>
-  <span class="categories">posted in {{ post.categories | category_links }}</span>
-</footer>
-{% endif %}
diff --git a/source/_includes/article.html b/source/_includes/article.html
deleted file mode 100644
index 84279977..00000000
--- a/source/_includes/article.html
+++ /dev/null
@@ -1,29 +0,0 @@
-{% unless page.no_header %}
-  <header>
-    {% if index %}
-      <h1 class="entry-title"><a href="{{ root_url }}{{ post.url }}">{% if site.titlecase %}{{ post.title | titlecase }}{% else %}{{ post.title }}{% endif %}</a></h1>
-    {% else %}
-      <h1 class="entry-title">{% if site.titlecase %}{{ page.title | titlecase }}{% else %}{{ page.title }}{% endif %}</h1>
-    {% endif %}
-    {% unless page.meta == false %}
-      <p class="meta">
-        {% include post/date.html %}{{ time }}
-        {% if site.disqus_short_name and page.comments != false and post.comments != false and site.disqus_show_comment_count == true %}
-           | <a href="{% if index %}{{ root_url }}{{ post.url }}{% endif %}#disqus_thread"
-             data-disqus-identifier="{% if post.meta.disqus_id %}{{ post.meta.disqus_id }}{% else %}{{ site.url }}{{ post.url }}{% endif %}">Comments</a>
-        {% endif %}
-      </p>
-    {% endunless %}
-  </header>
-{% endunless %}
-{% if index %}
-  <div class="entry-content">{{ content | excerpt }}</div>
-  {% capture excerpted %}{{ content | has_excerpt }}{% endcapture %}
-  {% if excerpted == 'true' %}
-    <footer>
-      <a rel="full-article" href="{{ root_url }}{{ post.url }}">{{ site.excerpt_link }}</a>
-    </footer>
-  {% endif %}
-{% else %}
-<div class="entry-content">{{ content }}</div>
-{% endif %}
diff --git a/source/_includes/asides/delicious.html b/source/_includes/asides/delicious.html
deleted file mode 100644
index 115cdcbc..00000000
--- a/source/_includes/asides/delicious.html
+++ /dev/null
@@ -1,8 +0,0 @@
-{% if site.delicious_user %}
-<section>
-  <h1>On Delicious</h1>
-  <div id="delicious"></div>
-  <script type="text/javascript" src="http://feeds.delicious.com/v2/json/{{ site.delicious_user }}?count={{ site.delicious_count }}&amp;sort=date&amp;callback=renderDeliciousLinks"></script>
-  <p><a href="http://delicious.com/{{ site.delicious_user }}">My Delicious Bookmarks &raquo;</a></p>
-</section>
-{% endif %}
\ No newline at end of file
diff --git a/source/_includes/asides/github.html b/source/_includes/asides/github.html
deleted file mode 100644
index b0bf9596..00000000
--- a/source/_includes/asides/github.html
+++ /dev/null
@@ -1,30 +0,0 @@
-{% if site.github_user %}
-<section>
-  <h1>GitHub Repos</h1>
-  <ul id="gh_repos">
-    <li class="loading">Status updating...</li>
-  </ul>
-  {% if site.github_show_profile_link %}
-  <a href="https://github.com/{{site.github_user}}">@{{site.github_user}}</a> on GitHub
-  {% endif %}
-  <script type="text/javascript">
-    $(document).ready(function(){
-        if (!window.jXHR){
-            var jxhr = document.createElement('script');
-            jxhr.type = 'text/javascript';
-            jxhr.src = '{{ root_url}}/javascripts/libs/jXHR.js';
-            var s = document.getElementsByTagName('script')[0];
-            s.parentNode.insertBefore(jxhr, s);
-        }
-
-        github.showRepos({
-            user: '{{site.github_user}}',
-            count: {{site.github_repo_count}},
-            skip_forks: {{site.github_skip_forks}},
-            target: '#gh_repos'
-        });
-    });
-  </script>
-  <script src="{{ root_url }}/javascripts/github.js" type="text/javascript"> </script>
-</section>
-{% endif %}
diff --git a/source/_includes/asides/googleplus.html b/source/_includes/asides/googleplus.html
deleted file mode 100644
index 00a0aa85..00000000
--- a/source/_includes/asides/googleplus.html
+++ /dev/null
@@ -1,11 +0,0 @@
-{% if site.googleplus_user %}
-<section class="googleplus{% if site.googleplus_hidden %} googleplus-hidden{% endif %}">
-  <h1>
-    <a href="https://plus.google.com/{{ site.googleplus_user }}?rel=author">
-      <img src="http://www.google.com/images/icons/ui/gprofile_button-32.png" width="32" height="32">
-      Google+
-    </a>
-  </h1>
-</section>
-{% endif %}
-
diff --git a/source/_includes/asides/pinboard.html b/source/_includes/asides/pinboard.html
deleted file mode 100644
index c89c3e7b..00000000
--- a/source/_includes/asides/pinboard.html
+++ /dev/null
@@ -1,19 +0,0 @@
-{% if site.pinboard_user %}
-<section>
-  <h1>My Pinboard</h1>
-  <ul id="pinboard_linkroll">Fetching linkroll...</ul>
-  <p><a href="http://pinboard.in/u:{{ site.pinboard_user }}">My Pinboard Bookmarks &raquo;</a></p>
-</section>
-<script type="text/javascript">
-  var linkroll = 'pinboard_linkroll'; //id target for pinboard list
-  var pinboard_user = "{{ site.pinboard_user }}"; //id target for pinboard list
-  var pinboard_count = {{ site.pinboard_count }}; //id target for pinboard list
-  (function(){
-    var pinboardInit = document.createElement('script');
-    pinboardInit.type = 'text/javascript';
-    pinboardInit.async = true;
-    pinboardInit.src = '{{ root_url }}/javascripts/pinboard.js';
-    document.getElementsByTagName('head')[0].appendChild(pinboardInit);
-  })();
-</script>
-{% endif %}
diff --git a/source/_includes/asides/recent_posts.html b/source/_includes/asides/recent_posts.html
deleted file mode 100644
index 4b108474..00000000
--- a/source/_includes/asides/recent_posts.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<section>
-  <h1>Recent Posts</h1>
-  <ul id="recent_posts">
-    {% for post in site.posts limit: site.recent_posts %}
-      <li class="post">
-        <a href="{{ root_url }}{{ post.url }}">{% if site.titlecase %}{{ post.title | titlecase }}{% else %}{{ post.title }}{% endif %}</a>
-      </li>
-    {% endfor %}
-  </ul>
-</section>
diff --git a/source/_includes/custom/after_footer.html b/source/_includes/custom/after_footer.html
deleted file mode 100644
index bce25dd9..00000000
--- a/source/_includes/custom/after_footer.html
+++ /dev/null
@@ -1,3 +0,0 @@
-{% comment %}
-  Add content to be output at the bottom of each page. (You might use this for analytics scripts, for example)
-{% endcomment %}
diff --git a/source/_includes/custom/asides/about.html b/source/_includes/custom/asides/about.html
deleted file mode 100644
index 59d309e4..00000000
--- a/source/_includes/custom/asides/about.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<section>
-  <h1>About Me</h1>
-  <p>A little something about me.</p>
-</section>
diff --git a/source/_includes/custom/category_feed.xml b/source/_includes/custom/category_feed.xml
deleted file mode 100644
index 8c93ed39..00000000
--- a/source/_includes/custom/category_feed.xml
+++ /dev/null
@@ -1,27 +0,0 @@
----
-layout: null
----
-<?xml version="1.0" encoding="utf-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom">
-
-  <title><![CDATA[{% if site.titlecase %}{{ page.title | titlecase | cdata_escape }}{% else %}{{ page.title | cdata_escape }}{% endif %} | {{ site.title | cdata_escape }}]]></title>
-  <link href="{{ site.url }}/{{ page.feed_url }}" rel="self"/>
-  <link href="{{ site.url }}/"/>
-  <updated>{{ site.time | date_to_xmlschema }}</updated>
-  <id>{{ site.url }}/</id>
-  <author>
-    <name><![CDATA[{{ site.author | strip_html }}]]></name>
-    {% if site.email %}<email><![CDATA[{{ site.email }}]]></email>{% endif %}
-  </author>
-  <generator uri="http://octopress.org/">Octopress</generator>
-
-  {% for post in site.categories[page.category] limit: 5 %}
-  <entry>
-    <title type="html"><![CDATA[{% if site.titlecase %}{{ post.title | titlecase | cdata_escape }}{% else %}{{ post.title | cdata_escape }}{% endif %}]]></title>
-    <link href="{{ site.url }}{{ post.url }}"/>
-    <updated>{{ post.date | date_to_xmlschema }}</updated>
-    <id>{{ site.url }}{{ post.id }}</id>
-    <content type="html"><![CDATA[{{ post.content | expand_urls: site.url | markdownify | cdata_escape }}]]></content>
-  </entry>
-  {% endfor %}
-</feed>
diff --git a/source/_includes/custom/footer.html b/source/_includes/custom/footer.html
deleted file mode 100644
index e12f0678..00000000
--- a/source/_includes/custom/footer.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<p>
-  Copyright &copy; {{ site.time | date: "%Y" }} - {{ site.author }} -
-  <span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
-</p>
diff --git a/source/_includes/custom/head.html b/source/_includes/custom/head.html
deleted file mode 100644
index 824a41e7..00000000
--- a/source/_includes/custom/head.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<!--Fonts from Google"s Web font directory at http://google.com/webfonts -->
-<link href="//fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css">
-<link href="//fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css">
diff --git a/source/_includes/custom/header.html b/source/_includes/custom/header.html
deleted file mode 100644
index 35f9c059..00000000
--- a/source/_includes/custom/header.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<hgroup>
-  <h1><a href="{{ root_url }}/">{{ site.title }}</a></h1>
-  {% if site.subtitle %}
-    <h2>{{ site.subtitle }}</h2>
-  {% endif %}
-</hgroup>
diff --git a/source/_includes/custom/navigation.html b/source/_includes/custom/navigation.html
deleted file mode 100644
index d6bd4246..00000000
--- a/source/_includes/custom/navigation.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<ul class="main-navigation">
-  <li><a href="{{ root_url }}/">Blog</a></li>
-  <li><a href="{{ root_url }}/blog/archives">Archives</a></li>
-</ul>
diff --git a/source/_includes/disqus.html b/source/_includes/disqus.html
deleted file mode 100644
index 49c6a29c..00000000
--- a/source/_includes/disqus.html
+++ /dev/null
@@ -1,21 +0,0 @@
-{% comment %} Load script if disquss comments are enabled and `page.comments` is either empty (index) or set to true {% endcomment %}
-{% if site.disqus_short_name and page.comments != false %}
-<script type="text/javascript">
-      var disqus_shortname = '{{ site.disqus_short_name }}';
-      {% if page.comments == true %}
-        {% comment %} `page.comments` can be only be set to true on pages/posts, so we embed the comments here. {% endcomment %}
-        // var disqus_developer = 1;
-        var disqus_identifier = '{{ site.url }}{{ page.url }}';
-        var disqus_url = '{{ site.url }}{{ page.url }}';
-        var disqus_script = 'embed.js';
-      {% else %}
-        {% comment %} As `page.comments` is empty, we must be on the index page. {% endcomment %}
-        var disqus_script = 'count.js';
-      {% endif %}
-    (function () {
-      var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
-      dsq.src = '//' + disqus_shortname + '.disqus.com/' + disqus_script;
-      (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
-    }());
-</script>
-{% endif %}
diff --git a/source/_includes/facebook_like.html b/source/_includes/facebook_like.html
deleted file mode 100644
index d263e6d2..00000000
--- a/source/_includes/facebook_like.html
+++ /dev/null
@@ -1,10 +0,0 @@
-{% if site.facebook_like %}
-<div id="fb-root"></div>
-<script>(function(d, s, id) {
-  var js, fjs = d.getElementsByTagName(s)[0];
-  if (d.getElementById(id)) {return;}
-  js = d.createElement(s); js.id = id; js.async = true;
-  js.src = "//connect.facebook.net/en_US/all.js#appId=212934732101925&xfbml=1";
-  fjs.parentNode.insertBefore(js, fjs);
-}(document, 'script', 'facebook-jssdk'));</script>
-{% endif %}
diff --git a/source/_includes/footer.html b/source/_includes/footer.html
deleted file mode 100644
index 3a8c7687..00000000
--- a/source/_includes/footer.html
+++ /dev/null
@@ -1 +0,0 @@
-{% include custom/footer.html %}
diff --git a/source/_includes/google_analytics.html b/source/_includes/google_analytics.html
deleted file mode 100644
index 4d4d5969..00000000
--- a/source/_includes/google_analytics.html
+++ /dev/null
@@ -1,13 +0,0 @@
-{% if site.google_analytics_tracking_id %}
-  <script type="text/javascript">
-    var _gaq = _gaq || [];
-    _gaq.push(['_setAccount', '{{ site.google_analytics_tracking_id }}']);
-    _gaq.push(['_trackPageview']);
-
-    (function() {
-      var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
-      ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
-      var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
-    })();
-  </script>
-{% endif %}
diff --git a/source/_includes/google_plus_one.html b/source/_includes/google_plus_one.html
deleted file mode 100644
index b69ddaeb..00000000
--- a/source/_includes/google_plus_one.html
+++ /dev/null
@@ -1,9 +0,0 @@
-{% if site.google_plus_one %}
-  <script type="text/javascript">
-    (function() {
-      var script = document.createElement('script'); script.type = 'text/javascript'; script.async = true;
-      script.src = 'https://apis.google.com/js/plusone.js';
-      var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(script, s);
-    })();
-  </script>
-{% endif %}
diff --git a/source/_includes/head.html b/source/_includes/head.html
deleted file mode 100644
index 6b5412ca..00000000
--- a/source/_includes/head.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE html>
-<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
-<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
-<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
-<head>
-  <meta charset="utf-8">
-  <title>{% if page.title %}{% if site.titlecase %}{{ page.title | titlecase }}{% else %}{{ page.title }}{% endif %} - {% endif %}{{ site.title }}</title>
-  <meta name="author" content="{{ site.author }}">
-
-  {% capture description %}{% if page.description %}{{ page.description }}{% else %}{{ content | raw_content }}{% endif %}{% endcapture %}
-  <meta name="description" content="{{ description | strip_html | condense_spaces | truncate:150 }}">
-  {% if page.keywords %}<meta name="keywords" content="{{ page.keywords }}">{% endif %}
-
-  <!-- http://t.co/dKP3o1e -->
-  <meta name="HandheldFriendly" content="True">
-  <meta name="MobileOptimized" content="320">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-
-  {% capture canonical %}{{ site.url }}{% if site.permalink contains '.html' %}{{ page.url }}{% else %}{{ page.url | remove:'index.html' | strip_slash }}{% endif %}{% endcapture %}
-  <link rel="canonical" href="{{ canonical }}">
-  <link href="{{ root_url }}/favicon.png" rel="icon">
-  <link href="{{ root_url }}/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
-  <link href="{{ site.subscribe_rss }}" rel="alternate" title="{{site.title}}" type="application/atom+xml">
-  <script src="{{ root_url }}/javascripts/modernizr-2.0.js"></script>
-  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
-  <script>!window.jQuery && document.write(unescape('%3Cscript src="./javascripts/libs/jquery.min.js"%3E%3C/script%3E'))</script>
-  <script src="{{ root_url }}/javascripts/octopress.js" type="text/javascript"></script>
-  {% include custom/head.html %}
-  {% include google_analytics.html %}
-</head>
diff --git a/source/_includes/header.html b/source/_includes/header.html
deleted file mode 100644
index 524de651..00000000
--- a/source/_includes/header.html
+++ /dev/null
@@ -1 +0,0 @@
-{% include custom/header.html %}
diff --git a/source/_includes/navigation.html b/source/_includes/navigation.html
deleted file mode 100644
index 2f0e6280..00000000
--- a/source/_includes/navigation.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<ul class="subscription" data-subscription="rss{% if site.subscribe_email %} email{% endif %}">
-  <li><a href="{{ site.subscribe_rss }}" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
-  {% if site.subscribe_email %}
-    <li><a href="{{ site.subscribe_email }}" rel="subscribe-email" title="subscribe via email">Email</a></li>
-  {% endif %}
-</ul>
-  {% if site.simple_search %}
-<form action="{{ site.simple_search }}" method="get">
-  <fieldset role="search">
-    <input type="hidden" name="q" value="site:{{ site.url | shorthand_url }}" />
-    <input class="search" type="text" name="q" results="0" placeholder="Search"/>
-  </fieldset>
-</form>
-  {% endif %}
-{% include custom/navigation.html %}
diff --git a/source/_includes/post/author.html b/source/_includes/post/author.html
deleted file mode 100644
index 83dd6a89..00000000
--- a/source/_includes/post/author.html
+++ /dev/null
@@ -1,8 +0,0 @@
-{% if post.author %}
-  {% assign author = post.author %}
-{% elsif page.author %}
-  {% assign author = page.author %}
-{% else %}
-  {% assign author = site.author %}
-{% endif %}
-{% if author %}<span class="byline author vcard">Posted by <span class="fn">{{ author }}</span></span>{% endif %}
diff --git a/source/_includes/post/categories.html b/source/_includes/post/categories.html
deleted file mode 100644
index 4a98b29d..00000000
--- a/source/_includes/post/categories.html
+++ /dev/null
@@ -1,10 +0,0 @@
-{% capture category %}{% if post %}{{ post.categories | category_links | size }}{% else %}{{ page.categories | category_links | size }}{% endif %}{% endcapture %}
-{% unless category == '0' %}
-<span class="categories">
-  {% if post %}
-    {{ post.categories | category_links }}
-  {% else %}
-    {{ page.categories | category_links }}
-  {% endif %}
-</span>
-{% endunless %}
diff --git a/source/_includes/post/date.html b/source/_includes/post/date.html
deleted file mode 100644
index a86953c2..00000000
--- a/source/_includes/post/date.html
+++ /dev/null
@@ -1,5 +0,0 @@
-{% if page.date %}{% capture time %}{{ page.date_time_html }}{% endcapture %}{% endif %}
-{% if post.date %}{% capture time %}{{ post.date_time_html }}{% endcapture %}{% endif %}
-
-{% if page.updated %}{% capture updated %}{{ page.date_time_updated_html }}{% endcapture %}{% endif %}
-{% if post.updated %}{% capture updated %}{{ post.date_time_updated_html }}{% endcapture %}{% endif %}
diff --git a/source/_includes/post/disqus_thread.html b/source/_includes/post/disqus_thread.html
deleted file mode 100644
index b1acd8cc..00000000
--- a/source/_includes/post/disqus_thread.html
+++ /dev/null
@@ -1 +0,0 @@
-<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
diff --git a/source/_includes/post/sharing.html b/source/_includes/post/sharing.html
deleted file mode 100644
index d639faa1..00000000
--- a/source/_includes/post/sharing.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<div class="sharing">
-  {% if site.twitter_tweet_button %}
-  <a href="//twitter.com/share" class="twitter-share-button" data-url="{{ site.url }}{{ page.url }}" data-via="{{ site.twitter_user }}" data-counturl="{{ site.url }}{{ page.url }}" >Tweet</a>
-  {% endif %}
-  {% if site.google_plus_one %}
-  <div class="g-plusone" data-size="{{ site.google_plus_one_size }}"></div>
-  {% endif %}
-  {% if site.facebook_like %}
-    <div class="fb-like" data-send="true" data-width="450" data-show-faces="false"></div>
-  {% endif %}
-</div>
diff --git a/source/_includes/twitter_sharing.html b/source/_includes/twitter_sharing.html
deleted file mode 100644
index 7cd5fbc2..00000000
--- a/source/_includes/twitter_sharing.html
+++ /dev/null
@@ -1,11 +0,0 @@
-{% if site.twitter_follow_button or site.twitter_tweet_button %}
-  <script type="text/javascript">
-    (function(){
-      var twitterWidgets = document.createElement('script');
-      twitterWidgets.type = 'text/javascript';
-      twitterWidgets.async = true;
-      twitterWidgets.src = '//platform.twitter.com/widgets.js';
-      document.getElementsByTagName('head')[0].appendChild(twitterWidgets);
-    })();
-  </script>
-{% endif %}
diff --git a/source/_layouts/category_index.html b/source/_layouts/category_index.html
deleted file mode 100644
index 85a63072..00000000
--- a/source/_layouts/category_index.html
+++ /dev/null
@@ -1,17 +0,0 @@
----
-layout: page
-footer: false
----
-
-<div id="blog-archives" class="category">
-{% for post in site.categories[page.category] %}
-{% capture this_year %}{{ post.date | date: "%Y" }}{% endcapture %}
-{% unless year == this_year %}
-  {% assign year = this_year %}
-  <h2>{{ year }}</h2>
-{% endunless %}
-<article>
-  {% include archive_post.html %}
-</article>
-{% endfor %}
-</div>
diff --git a/source/_layouts/default.html b/source/_layouts/default.html
deleted file mode 100644
index f23b07b8..00000000
--- a/source/_layouts/default.html
+++ /dev/null
@@ -1,14 +0,0 @@
-{% capture root_url %}{{ site.root | strip_slash }}{% endcapture %}
-{% include head.html %}
-<body {% if page.body_id %} id="{{ page.body_id }}" {% endif %} {% if page.sidebar == false %} class="no-sidebar" {% endif %} {% if page.sidebar == 'collapse' or site.sidebar == 'collapse' %} class="collapse-sidebar sidebar-footer" {% endif %}>
-  <header role="banner">{% include header.html %}</header>
-  <nav role="navigation">{% include navigation.html %}</nav>
-  <div id="main">
-    <div id="content">
-      {{ content | expand_urls: root_url }}
-    </div>
-  </div>
-  <footer role="contentinfo">{% include footer.html %}</footer>
-  {% include after_footer.html %}
-</body>
-</html>
diff --git a/source/_layouts/page.html b/source/_layouts/page.html
deleted file mode 100644
index 8ba6ec94..00000000
--- a/source/_layouts/page.html
+++ /dev/null
@@ -1,42 +0,0 @@
----
-layout: default
----
-
-<div>
-<article role="article">
-  {% if page.title %}
-  <header>
-    <h1 class="entry-title">{% if site.titlecase %}{{ page.title | titlecase }}{% else %}{{ page.title }}{% endif %}</h1>
-    {% if page.date %}<p class="meta">{% include post/date.html %}{{ time }}</p>{% endif %}
-  </header>
-  {% endif %}
-  {{ content }}
-  {% unless page.footer == false %}
-    <footer>
-      {% if page.date or page.author %}<p class="meta">
-        {% if page.author %}{% include post/author.html %}{% endif %}
-        {% include post/date.html %}{% if updated %}{{ updated }}{% else %}{{ time }}{% endif %}
-        {% if page.categories %}{% include post/categories.html %}{% endif %}
-      </p>{% endif %}
-      {% unless page.sharing == false %}
-        {% include post/sharing.html %}
-      {% endunless %}
-    </footer>
-  {% endunless %}
-</article>
-{% if site.disqus_short_name and page.comments == true %}
-  <section>
-    <h1>Comments</h1>
-    <div id="disqus_thread" aria-live="polite">{% include post/disqus_thread.html %}</div>
-  </section>
-{% endif %}
-</div>
-{% unless page.sidebar == false %}
-<aside class="sidebar">
-  {% if site.page_asides.size %}
-    {% include_array page_asides %}
-  {% else %}
-    {% include_array default_asides %}
-  {% endif %}
-</aside>
-{% endunless %}
diff --git a/source/_layouts/post.html b/source/_layouts/post.html
deleted file mode 100644
index b450681b..00000000
--- a/source/_layouts/post.html
+++ /dev/null
@@ -1,43 +0,0 @@
----
-layout: default
-single: true
----
-
-<div>
-<article class="hentry" role="article">
-  {% include article.html %}
-  <footer>
-    <p class="meta">
-      {% include post/author.html %}
-      {% include post/date.html %}{{ time }}{% if updated %} {{ updated }}{% endif %}
-      {% include post/categories.html %}
-    </p>
-    {% unless page.sharing == false %}
-      {% include post/sharing.html %}
-    {% endunless %}
-    <p class="meta">
-      {% if page.previous.url %}
-        <a class="basic-alignment left" href="{{page.previous.url}}" title="Previous Post: {{page.previous.title}}">&laquo; {{page.previous.title}}</a>
-      {% endif %}
-      {% if page.next.url %}
-        <a class="basic-alignment right" href="{{page.next.url}}" title="Next Post: {{page.next.title}}">{{page.next.title}} &raquo;</a>
-      {% endif %}
-    </p>
-  </footer>
-</article>
-{% if site.disqus_short_name and page.comments == true %}
-  <section>
-    <h1>Comments</h1>
-    <div id="disqus_thread" aria-live="polite">{% include post/disqus_thread.html %}</div>
-  </section>
-{% endif %}
-</div>
-{% unless page.sidebar == false %}
-<aside class="sidebar">
-  {% if site.post_asides.size %}
-    {% include_array post_asides %}
-  {% else %}
-    {% include_array default_asides %}
-  {% endif %}
-</aside>
-{% endunless %}
diff --git a/source/_posts/2014-10-20-hello-octopress.md b/source/_posts/2014-10-20-hello-octopress.md
deleted file mode 100644
index d359f401..00000000
--- a/source/_posts/2014-10-20-hello-octopress.md
+++ /dev/null
@@ -1,35 +0,0 @@
----
-layout: post
-title: "Hello, Octopress!"
-date: 2014-10-20 16:53:00 -0700
-comments: true
-categories:
----
-This post marks my transition from Tumblr to Octopress & GitHub Pages.
-
-I've been microblogging for a while at [zshello3.tumblr.com](http://zshello3.tumblr.com) and I liked it. Not because of readers, which I suspect I have none; but there are certainly a huge amount of information I want to dump off my mind. Back in the days I *loved* my handwritten journals, and I really poured a lot into them. Peers were usually amazed when they saw my journals. These days typing seems to be a more robust solution to keeping my thoughts, especially when the thoughts are mostly technical.
-
-Tumblr is awesome. Compared to WordPress (.com for pedantic people), it is both lightweight and beautiful (you get all the customization for free), so you quickly get to the writing. However, it is not designed for geeks, so
-
-* Customization is capped at some point;
-* I had the impression that the Markdown parser is herrendous;
-* Email publishing is a mightmare, by the way;
-* Code rendering always falls short — unless I spend a lot of time customizing (I'm pretty bad at HTML, CSS, and JS stuff).
-
-Speaking of the last point, I've always been envious of the beautiful code blocks found on Octopress blogs. So here I come!
-
-(Let me give it a try first.)
-
-``` C hello.c
-#include <stdio.h>
-
-int main(int argc, char **argv) {
-    printf("Hello, Octopress!\n")
-}
-```
-
-Gorgeous. I'll get to the theme customization later. I'm actually busy as crazy this week.
-
-Before I close this post, let me also try to embed a random gist I authored yesterday (for brewing):
-
-{% gist 828fd00bdecd6611cf40 brew.sh %}
diff --git a/source/_posts/2014-10-20-help-mou-hit-1-dot-0.md b/source/_posts/2014-10-20-help-mou-hit-1-dot-0.md
deleted file mode 100644
index 22587df4..00000000
--- a/source/_posts/2014-10-20-help-mou-hit-1-dot-0.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-layout: post
-title: "Help Mou hit 1.0"
-date: 2014-10-20 17:37:45 -0700
-comments: true
-categories:
----
-Quick call for [Mou 1.0 fundraiser](https://www.indiegogo.com/projects/mou-1-0-markdown-editor-on-os-x-for-you) on Indiegogo. At the time of writing, it has raised $6,178/$20,000, and has 39 days to go (with 21 already passed).
-
-
-I'm actually writing this post in Mou right now. It's far less powerful than Emacs, but when I want preview-on-the-fly, Mou is the Markdown editor to go. Right now it's far from perfect; for instance, GFM fenced blocks (now included in [CommonMark](http://commonmark.org)) are not supported, so you get nonsense preview when your code block is fenced rather than indented. (Of course, Mou is even less suitable for editing an Octopress post due to the yaml metadata upfront, but that's not a big deal.)
-
-Let's hope for Mou hitting the 1.0 mark.
\ No newline at end of file
diff --git a/source/_posts/2014-10-21-get-rolling.md b/source/_posts/2014-10-21-get-rolling.md
deleted file mode 100644
index bf8f040e..00000000
--- a/source/_posts/2014-10-21-get-rolling.md
+++ /dev/null
@@ -1,35 +0,0 @@
----
-layout: post
-title: "Get rolling"
-date: 2014-10-21 11:40:14 -0700
-comments: true
-categories:
----
-Yesterday, on an internet forum, I saw someone’s signature, which translates to
-
-> Don’t even get started if you know you can't know from the beginning that you won't make it to the very end.
-
-This seems justified — persistence is the key to success; why even bother if you know you’ll fail? However, I have to profoundly disagree with this, and even dedicate a blog post to discussing this problem.
-
-The problem here is, the real world is much more complicated than the idealized world found in various quotes about persistence. Most of the time you have absolutely no clue where which road is leading, unless you embark on the journey, clueless. As for me, fortunately I knew I was gonna be a mathematician/physicist ever since elementary school, so the roadmap is sorta clear on the grand scale. Still, all those tiny building blocks for the ultimate goal are confusing, and even more so for things hardly related to the ultimate goal, for instance, coding, which is just a hobby and a way to simplify life — it has simplified my life in some sense, but has itself complicated my life in other ways (your life inevitably becomes more complicated when you know more and want to find out even more).
-
-And sometimes you are bound to fail — I know my code is shitty, for instance, but if I don’t get rolling, I won’t even have a working (albeit shitty) version that barely meets my needs. As another example, I was looking for a way to share and archive some photos. I started with [WordPress](http://apinkarchive.wordpress.com/), which turned out to be more formal and tiring than I’d thought. Then I ran a [Tumblr microblog](http://chorongmemories.tumblr.com/), which was great, but has certain limitations that in the end prevents it from being damn useful for myself, so in the end I went onto “indefinite hiatus.” In both cases I never declared that the thing was permanent — I was careful to say that the blogs were experimental, and I moved on when I found something better, or when they were no longer helping me. Yesterday I started yet another experiment, a [Tistory blog](http://apinkpcr.tistory.com). It is a random move triggered by something unexpected; the South Korean blogging platform is not that great, but at least it provides acceptable API access, and more importantly, I’ve got complete infrastructure built around the API to scrape photos, so it’s easy to build on top of that to automate things. It is also experimental. Again I’m not sure I long I can keep it up, but at least I’m happy with it for the time being. Being happy at the time being is the most important goal for hobbies.
-
-Choices are hard. Especially in today’s world, tools in every discipline are constantly improving, be it math, physics, programming, photography, blogging, or whatever. If you research over and over until you find “the perfect tool”, or “the perfect platform” (hint: the rank is constantly changing), you’re stuck on the first step to anywhere. In fact, reading other people’s blogs, for example, are not enough to learn what is the best — you need to at least have some working knowledge to even decide which tool or platform is more suitable for you. Therefore, the most sensible thing to do is to do a little bit of research (combined with your gut feeling), pick up something that makes you feel good at the moment, and immediately get rolling. Well, of course you need some research, otherwise you’re just kidding yourself; doing `>>> import this` in python tells you:
-
-> Now is better than never.<br>
-> Although never is often better than *right* now.
-
-Then, when you have more experience and know what’s wrong with your original choice, correct it or trash it. There’s nothing wrong with abandoning dated crap, hopping bandwagons, or whatever; that’s the nature of change and improvement, and the most sensible thing for someone as busy as you are.
-
-Up till now I've been talking about tools and platforms, so maybe it seems that I'm attacking the straw man — you may argue that the original quote is not about what tools or platforms you use, but rather, what you try to accomplish with the tools or platforms. Okay, what about the grander things in life, like mathematical research, like *the final theory*? Well, similar. I’ll quote Ravi here,
-
-> …mathematics is so rich and infinite that it is impossible to learn it systematically, and if you wait to master one topic before moving on to the next, you’ll never get anywhere. Instead, you’ll have tendrils of knowledge extending far from your comfort zone. Then you can later backfill from these tendrils, and extend your comfort zone; this is much easier to do than learning “forwards”.
-
-Ravi is always hinting at “you should get started with actual research rather than ‘prepare’ yourself”! I can’t reckon that since I’ve yet to follow Ravi’s advice, but the thinking here is crystal clear. **You shouldn’t be afraid of failure; you shouldn’t be afraid of being “not prepared enough”; you shouldn’t be afraid of getting started.** Speaking of a final theory, I’m pretty sure I’m bound to fail, I’m pretty sure I won’t see a satisfactory one in my lifetime — the inconvenient truth is that, I have the gut feeling that the ultimate explanation is unfortunately intertwined with consciousness, and we are still far from having the right tools to understand consciousness. According to Feynman, **really knowing something is hard**. It’s hard, so failure is not shameful at all. Those who won’t even get started due to fear of failing or making the wrong choice won’t fail again, since they’ve already failed at the very beginning. So, get rolling.
-
-Yesterday I read [Fire and Motion](http://www.joelonsoftware.com/articles/fog0000000339.html) on *Joel on Software*. Joel’s metaphor is really nice, but he’s essentially conveying very similar ideas.
-
--------------------------------------------------------------------------------
-
-By the way, I wrote this post in Emacs. I don’t know why but I seem to type much faster in Emacs than in Mou. (For Markdown editing `markdown-mode`, and `typo-mode`, a minor mode I found today which is useful for inserting smart quotes and smart dashes seamlessly into md articles).
diff --git a/source/_posts/2014-10-23-ripping-copy-protected-dvd-with-mpv.md b/source/_posts/2014-10-23-ripping-copy-protected-dvd-with-mpv.md
deleted file mode 100644
index 4db51a86..00000000
--- a/source/_posts/2014-10-23-ripping-copy-protected-dvd-with-mpv.md
+++ /dev/null
@@ -1,38 +0,0 @@
----
-layout: post
-title: "Ripping copy-protected DVD with mpv"
-date: 2014-10-23 20:03:22 -0700
-comments: true
-categories:
----
-**_11/02/2014 update:_**
-
-See [this post](/blog/2014/11/02/vobcopy-dvdbackup-etc/) for issues, explanations, and more.
-
----
-
-**_10/25/2014 update:_**
-
-I'm such an idiot. `vobcopy` is the real, hassel-free way to go.
-
-    brew install vobcopy
-
-Then, with the DVD mounted,
-
-> **vobcopy** without any options will copy the title with the most chapters into files of 2GB size into the current working directory.
-
-Of course there are a ton of options, but I generally hate to browse through options unless I have to, so I'm happy with calling without argument.
-
----
-
-Yesterday I was trying to rip a music video off a newly released DVD from Japan. I knew very little about how DRM (in this case, CSS) actually works and how to break it. I tried to operate directly on the VOB file with `ffmpeg` or `mpv` but both failed with a lot of header errors — I suppose more files than the VOB are required for authentication? Whatever, maybe I’ll learn the details in the future, but I don’t see the need since DVD is an outdated technology anyway.
-
-So, can we proceed from here? Most certainly. I noticed that although `mpv` won’t let me play a single VOB, I can simply hand it the DVD mount point, and it will play the whole DVD seamlessly. **Caution:** `mpv` needs to be compiled with `libdvdnav` and `libdvdread`! With brew you just do
-
-    brew install mpv --with-libdvdnav --with-libdvdread
-
-For better performance and backup, I first cloned the DVD into a `.cdr` image (DVD/CD-R Master Image) using Disk Utility (I've never tried creating/cloning image with `diskutil` CLI, so nothing to report on that). Then I mount the image, say the mount point is `/Volumes/UPBX_80165`. As said I can hand that mount point to `mpv` and it simply works, but how about extracting the MPEG-2 video stream? The `--stream-capture=<filename>` option is there just for you. In principle `--stream-dump=<filename>` should also work, but without monitoring the output and controlling where to end, I’m not sure if it will ever terminate itself when reading from a DVD (when I stream captured the DVD it just kept repeating itself until I explicitly quit with `q`). So that's it:
-
-    mpv --stream-capture=dump.mpg /Volumes/UPBX_80165
-
-Then you can torture the `dump.mpg` with `ffmpeg` however you want. The most obvious thing is to cut out the music video part, and put into a new container like MPEG-TS. Or transcode it to H.264 for your iPhone. The nice thing about `dump.mpg` is that, unless I got it wrong, there's no quality loss here — the only thing you got rid of is that goddamn DRM.
diff --git a/source/_posts/2014-10-24-charles-munger-donated-$65m-to-kitp.md b/source/_posts/2014-10-24-charles-munger-donated-$65m-to-kitp.md
deleted file mode 100644
index 9c37b99e..00000000
--- a/source/_posts/2014-10-24-charles-munger-donated-$65m-to-kitp.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-layout: post
-title: "Charles Munger donated $65M to KITP"
-date: 2014-10-24 16:41:36 -0700
-comments: true
-categories:
----
-Today's news has it that Charles Munger made a $65 million donation to KITP at UCSB. See for instance [this article](http://nyti.ms/1D4zg24) on NYT. Of course I didn't learn it from NYT (I'm generally sick of any news other than math, physics, or IT-related ones). I learned it from [Not Even Wrong](http://www.math.columbia.edu/~woit/wordpress/?p=7247) instead (of course I don't agree with Woit, but some of his links are nice).
-
-I have no interest whatsoever in the business world, so I have no idea about Warren Buffett's business partners (although I'm still worldly enough to know Warren Buffett). However, the name Charles Munger sounded surprisingly familiar. After reading the sentence
-
-> Mr. Munger has frequently donated big sums to schools like Stanford and the Harvard-Westlake School.
-
-from the NYT article linked above, it finally hit me that Mr. Munger is the donor of the Munger Graduate Residence here at Stanford. Munger is really nice, much better than our undergrad residences AFAIK (location-wise Roble is still unbeatable for mathematicians and physicists, although Munger still kicks EV's ass).
-
-I'm glad to see more and more entrepreneurs funding physics, especially theoretical physics, whether they understand it or not. (**Aside:** Even for laypeople theoretical physics is cool isn't it, like the coolest kid in class. I won't comment on whether math is cooler, but breakthrough mathematical work certainly go largely unnoticed in the public, since theoretical physics is the last thing that laypeople can "vaguely understand". Do some name searches on Google to see how math and physics play out in the limelight — hint:
-
-* Gauss — 4,130,000 results;
-* Euler — 855,000 results;
-* Newton — 13,200,000 results;
-* Einstein — 6,330,000 results.
-
-End of aside.) Engaging in physics is plain better than engaging in some questionable philanthropy. (Have you heard that Gates Foundation invested in G4S, the largest private military and security company in the world? I’m not sure about the details — I once read that off a bathroom flyer — but that’s definitely interesting philanthropy.)
diff --git a/source/_posts/2014-10-25-os-x-package-receipts.md b/source/_posts/2014-10-25-os-x-package-receipts.md
deleted file mode 100644
index a3695600..00000000
--- a/source/_posts/2014-10-25-os-x-package-receipts.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-layout: post
-title: "OS X package receipts"
-date: 2014-10-25 13:26:02 -0700
-comments: true
-categories:
----
-I just learned something new. Whenever you install a `pkg` on OS X, OS X stores a receipt of what was installed in `/var/db/receipts` (I'm running OS X 10.9.5 at the time of writing), called a **bom** — bill of materials (I’d rather call it a manifest, whatever). This feature was introduced in NeXTSTEP. From `man 5 bom`:
-
-> The Mac OS X Installer uses a file system "bill of materials" to determine which files to install, remove, or upgrade. A bill of materials, **bom**, contains all the files within a directory, along with some information about each file. File information includes: the file's UNIX permissions, its owner and group, its size, its time of last modification, and so on.  Also included are a checksum of each file and information about hard links.
-
-`man 5 bom` is actually badly maintained, as it says "The bill of materials for installed packages are found within the package receipts located in /Library/Receipts," whereas those have been migrated to `/var/db/receipts` a long time ago.
-
-`.bom` files are binary, but you can access the contents via `lsbom`. For instance, to list the files installed,
-
-    lsbom -f /var/db/receipts/org.macports.MacPorts.bom
-
-Note that the paths printed are always relative to `/`. See `man 1 lsbom` for detailed option listing.
-
-(Beware when you try to clean up unwanted packages using the `lsbom` listing. Packages might overwrite files, so make sure you review the listing first and know what you are doing. "Knowing what you are doing" is the prerequisite for using `sudo` anyway.)
diff --git a/source/_posts/2014-10-26-audio-cd-slash-dvd-to-iso-image-on-os-x.md b/source/_posts/2014-10-26-audio-cd-slash-dvd-to-iso-image-on-os-x.md
deleted file mode 100644
index 7ff57bc8..00000000
--- a/source/_posts/2014-10-26-audio-cd-slash-dvd-to-iso-image-on-os-x.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-layout: post
-title: "Convert Audio CD/DVD to ISO image on OS X"
-date: 2014-10-26 23:29:47 -0700
-comments: true
-categories:
----
-**_11/02/2014 update:_**
-
-See [this post](/blog/2014/11/02/vobcopy-dvdbackup-etc/) for issues, explanations, and more.
-
----
-
-Today it occurred to me that I should make clones of my audio CDs (as stand-alone ISO images, I mean, not just rsyncing the AIFFs to subdirectories in `~/aud/lossless`). One can never have too many backups.
-
-Of course I could simply pack the aforementioned directories with AIFFs into ISOs — that’s not impressive. The end result might actually be the same, but I want to make the clones directly from the original CDs. It turns out that this is not so simple with the Disk Utility GUI — unlike DVDs, the “New Image” option is grayed out for Audio CDs. I’m not sure why, but maybe they want you to just use iTunes to deal with Audio CDs (which works well for all practical purposes — but theoretical curiosity never ends).
-
-So there comes `hdiutil`. `hdiutil` and `diskutil` are the utilities underlying Disk Utility. Unfortunately, so far I know little about them except for simplest things like `diskutil list`, `diskutil mount`, `hdiutil attach -stdinpass`, etc. (I'm so ignorant about anything filesystem related!) The `hdiutil` verb that makes cross-platform CD or DVD is `makehybrid`, which supports the following filesystem options: `-hfs` (holy crap, no HFS+ please! Apple ought to replace this thirty-year-old filesystem — ZFS or something better please!), `-iso`, `-joliet`, and `-udf`. For Audio CDs you use `-iso` and with `-joliet` extension:
-
-    hdiutil makehybrid -iso -joliet -o AUDIO_CD_NAME.iso SOURCE
-
-where `SOURCE` can be the mount point, the disk device file, etc. Similarly, although you can create `.cdr` images from DVDs via the Disk Utility GUI, you can also do it with `hdiutil` (which is potentially more portable — I’ve never heard a definitive answer of whether renaming `.cdr` to `.iso` really cross-platform):
-
-    hdiutil makehybrid -udf -o DVD_NAME.iso SOURCE
-
-This way CSS keys *seem* to be cloned as well, since I was able to authenticate such a CSS-protected DVD with `libdvdread`.
-
----
-
-P.S. I sincerely hope that one day lossless music tracks are no longer distributed through CD-ROMs. So painful — even my Internet speed is more than ten times faster than the [highest transfer rate](https://en.wikipedia.org/wiki/CD-ROM#Transfer_rates) available from any CD-ROM. (I’ve heard about some websites distributing lossless music digitally, but that won’t happen to the music I care about in the near future.) I still like physical albums though — a real sense of possession. Maybe they should contain the physical goodies and some sort of access codes?
diff --git a/source/_posts/2014-10-26-disk-visualizer-daisydisk.md b/source/_posts/2014-10-26-disk-visualizer-daisydisk.md
deleted file mode 100644
index 2de4201e..00000000
--- a/source/_posts/2014-10-26-disk-visualizer-daisydisk.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-layout: post
-title: "Disk visualizer: DaisyDisk"
-date: 2014-10-26 00:02:22 -0700
-comments: true
-categories:
----
-DaisyDisk is a pretty famous name. I’ve heard a lot that DaisyDisk is beautiful, but as a “power user” I always feel ashamed about using a disk analyzer or visualizer (although no one really cares). I’m pretty comfortable with doing most filesystem operations right in the shell, and for other tasks too tedious for the shell (like renaming a bunch of files with no obvious pattern), Finder (equipped with TotalFinder) works just fine.
-
-Today I was trying clean up my drive a bit, as there were only 22GB left. I knew where the main problem lied: a huge number of highres videos lying in `~/vid/staging`, awaiting renaming and migration to my external drive. Anyway, it would be nice to have some visualization of a detailed breakdown of my disk usage, preferably on any level I want without multiple passes of `du`. The name DaisyDisk popped up from the cache in my brain, so I headed over to their website to download it.
-
-The result is not disappointing at all. Look at this:
-
-![DaisyDisk screen shot](http://i.imgur.com/vyIwSNQ.png)
-
-Beautiful. Moreover, functional. It indeed gives me a detailed breakdown on any level, within any directory (given enough priviledge). I can also collect items I don’t want and let DaisyDisk clean up for me at once (not surprising for a disk analyzer); this feature isn’t that useful for me since I know exactly where my queues of unorganized items are — `~/Downloads`, `~/aud/staging`, `~/img/staging`, and `~/vid/staging`.
-
-By the way, DaisyDisk seems to be WinRAR-free. (Rest assured; I’m a good guy and I *will* purchase a license — these days whether to purchase the website or the MAS version is a headache, though.)
diff --git a/source/_posts/2014-10-27-onedrive-goes-unlimited.md b/source/_posts/2014-10-27-onedrive-goes-unlimited.md
deleted file mode 100644
index 256b04e6..00000000
--- a/source/_posts/2014-10-27-onedrive-goes-unlimited.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-layout: post
-title: "OneDrive goes unlimited"
-date: 2014-10-27 09:44:51 -0700
-comments: true
-categories:
----
-**10/28/2014 Update:**
-
-Yesterday Microsoft pushed an update to OneDrive.app to MAS. After uninstalling, reinstalling, and wiping the 10 GB folder I'd like to sync (that's for photos; I upload videos via the web interface) on both client and server sides, it actually began to work. The speed was around 1 MB/s during my last sync of 10 GB worth of data. Not fast, but I will be fairly satisfied if it can keep up with that speed. Time will tell.
-
----
-The OneDrive team just [announced on their blog](https://blog.onedrive.com/office-365-onedrive-unlimited-storage/) that
-
-> Today, storage limits just became a thing of the past with Office 365. Moving forward, all Office 365 customers will get unlimited OneDrive storage at no additional cost.
-
-Hell, I hate Microsoft, but **I have to say that this is big**. OneDrive might not be the first to offer unlimited cloud storage (not sure), but it is certainly the first one to roll it out on such a grand scale. Remember, Office 365 is just $99.99 a year. OneDrive might not be the best cloud storage service, especially for OS X customers, but unlimited is unlimited — in comparison, I pay Google $9.99 a month for 1 TB.
-
-Microsoft products are indeed pure crap on a Mac. Office for Mac 2011 is horrible (speed and bloat aside, some features are simply not implemented — try to import a UTF-8 CSV into Excel, all non-ASCII characters become underscores; Microsoft’s response was that Unicode import was not implemented yet). OneDrive.app is slow like crawl, and it never finishes syncing — always stuck on the last few megabytes, eating up 100% CPU. Thank god I only use it for backups. The web interface is okay, although Google Drive is faster — blazing fast, I can easily upload with 20+MB/s. But again, **unlimited is unlimited.**
-
-Microsoft is opening a new chapter of cloud storage. In today’s world, we have so many huge video files, so storage limit should indeed be something of the past. This is a smart move for Microsoft — when you have, say, 100 TB up there (which seems very far at this moment, but what if all contents go 4K), and if competitors don’t offer comparable plans, then you are stuck with Microsoft. And Office. Oh my god, Microsoft Office must die.
-
-Of course I don’t want to be stuck with Microsoft, so I’m looking at how Google and Apple will handle this. Google ought to offer more affordable plans, preferably also unlimited. (My 1Password still has it that I purchased Office for Mac University 2011 on Nov 12, 2012 for $99.99. That turned into a free 4-year Office 365 subscription, which contains 60 world minutes of Skype per month, 1 TB of OneDrive — oh, now it’s about to go unlimited. All for $99.99. In comparison, Google charges me $119.88 per year.) Apple wants you to save everything to iCloud, and it introduced iCloud Drive and Cloud Kit this year — but plans still start at 5 GB and tops out at 1 TB, seriously? Dude, you sell top notch hardware with huge profits; why don’t you pay your customers back by offering better cloud storage — that’s also better for iCloud.
diff --git a/source/_posts/2014-10-28-google-drive-no-selective-subfolder-sync.md b/source/_posts/2014-10-28-google-drive-no-selective-subfolder-sync.md
deleted file mode 100644
index 2383a0da..00000000
--- a/source/_posts/2014-10-28-google-drive-no-selective-subfolder-sync.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-layout: post
-title: "Google Drive — no selective subfolder sync?"
-date: 2014-10-28 20:49:24 -0700
-comments: true
-categories:
----
-Up to this point I've been using Google Drive as an online backup service, and uploads files mostly manually, although I do sync `~/img` with the client.
-
-**Aside.** Google Drive, OneDrive, etc. don't work with symlinks. Wanna keep your stuff free and duplicate-free yet still synced to the servers? Use `rsync` to automatically reproduce your folder structure with hard links:
-
-    rsync -avzP --delete --link-dest=SOURCE/ SOURCE DESTINATION
-
-e.g.,
-
-    rsync -avzP --delete --link-dest=~/img/ ~/img/ ~/sync/GoogleDrive/img/
-
-automatically reproduces my `~/img` in the `img` directory under Google Drive's root, yet every file in the `~/img` tree is replaced by hard links to the original file, so the new structure within Google Drive takes little additional space — for the directories only.
-
-That doesn't solve every problem though, as you will see shortly. *End of aside.*
-
-So, up to this point I’ve mostly used Google Drive as an online backup service by manually uploading (huge) stuff. But at some point I’m gonna automate parts of the uploading. As it turns out, I can keep some smaller video files on my hard drive; other bigger monsters (like movies, TV shows, etc., especially a lot of 1080i Transport Streams directly from TV broadcasts) are uploaded and then moved to external drives. Some of the smaller files, including things downloaded from YouTube, live in `~/vid/etc`, and I want to sync this folder to Google Drive. What's shocking is that this is not possible with the Google Drive client — it only allows selective syncing of the top level folders. Let me repeat this:
-
-**The Google Drive client only allows selective syncing of the _top level folders_.**
-
-This is *insane*. It’s almost 2015. Everyone supports this — Dropbox, Microsoft, Box, even Baidu. Google Drive launched on April 24, 2012, that’s 2.5 years ago. [This thread](https://productforums.google.com/forum/#!topic/drive/Gs2w1BL-B9U) on Google Drive Forum, “Ability to sync only selected sub folders”, was posted on August 27, 2012, and has garnered 139 replies. They are ignored by the developers, and the accepted “answer” is to utilize Google Drive’s assign-one-file/folder-to-multiple-folders feature to create a special “sync” directory. Okay, that’s a stupid hard link solution on the server side. Okay, if that works… *No*. “Hard links on the server side” cannot bear different names; so what if I want to sync, say, both `vid/etc` and `aud/etc`? Whoops. So I also have to do all sorts of ugly renaming. NO, GOOGLE, NO, I won't accept that much trouble.
-
-This kind of insanity makes me wander:
-
-**Do the Google Drive developers use Google Drive themselves?**
-
-For now I'm moving `vid/etc` to `vid_etc`. Sigh.
-
----
-
-There are other problems that I encountered with Google Drive sync today. For one thing, it rejects what I already have and insists on starting from scratch. I mean, say I have uploaded a folder via the web interface, and later wants to keep it in sync (of course that's only possible if it's top level), so I put what I already have there. Nope, Google Drive reports that as a conflict and insists on downloading all the stuff again. Apart from wasted traffic, that also ruins my hard links, so I have to either wipe everything clean on the server side and reupload, or redownload everything and redo all the hard-linking after the download finishes. Either way, very annoying. I opted for the first one. (I later empirically confirmed that OneDrive could handle this situation.)
-
-There are other problems that don't pop right off my mind. Anyway, the gist is,
-
-**Google Drive is not yet sync-ready for power users (maybe even laymen).**
-
----
-
-Then, is OneDrive perfect? No. I know it recently went unlimited, but there’s one major annoyance: the speed. Stanford’s Ethernet speed is almost 1 Gbps UL/DL, but the OneDrive client tops out at about 2 MBps. The web interface isn’t much better. Google Drive is a lot faster than that, which makes it a good backup service for manual uploading. Anyway, maybe OneDrive will improve over time; yesterday they delivered an update to OneDrive.app, and at least it finally works.
-
-OneDrive also boasts no file status indicators on OS X, which everyone else in the industry has. That’s not a show-stopper though, if you just use it as a backup service.
-
----
-
-What about Dropbox? Dropbox is a truly awesome sync-ready service, but it is at the same time pretty expensive compared to others. Also, since I use Dropbox as a sync service, it must be up at all times and constantly indexing, so I’m really cautious with what I put there to avoid unnecessary cycles and startup time.
-
----
-
-Everything is broken in one way or another. Sigh. Let's hope that OneDrive improves a lot in the coming months; if it's stable enough and the speed gets some boost, I'll cancel my Google Drive subscription. I am a Google supporter and Microsoft hater, but a service that *works* is more important than ideology.
diff --git a/source/_posts/2014-10-28-mou-1-dot-0-fundraiser-goal-reached.md b/source/_posts/2014-10-28-mou-1-dot-0-fundraiser-goal-reached.md
deleted file mode 100644
index bec69ef7..00000000
--- a/source/_posts/2014-10-28-mou-1-dot-0-fundraiser-goal-reached.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-layout: post
-title: "Mou 1.0 fundraiser: goal reached"
-date: 2014-10-28 01:57:06 -0700
-comments: true
-categories:
----
-A week ago I wrote a post [*Help Mou hit 1.0*](blog/2014/10/20/help-mou-hit-1-dot-0/). Today, I'm delighted to find out that Mou has reached its goal, $20,000, half way into the fundraiser.
-
-![Mou hit its goal on Indiegogo](http://i.imgur.com/vM298t5.png)
-
-So what do I expect from 1.0? Most importantly,
-
-* CommonMark support, especially GFM fenced code block and saner nested structures;
-* Custom Markdown engine (I would like to call [`stmd`](https://github.com/jgm/CommonMark)).
-
-Whatever the case, Emacs is still my best friend.
diff --git a/source/_posts/2014-10-29-fun.md b/source/_posts/2014-10-29-fun.md
deleted file mode 100644
index ce32a9b0..00000000
--- a/source/_posts/2014-10-29-fun.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-layout: post
-title: "Fun"
-date: 2014-10-29 11:26:29 -0700
-comments: true
-categories:
----
-
-This happened in yesterday's Math 210A lecture.
-
-> Ravi: I won't be here next Thursday.<br>
-> Someone: Will there be a lecture?<br>
-> Ravi: Yeah, Brian Conrad will give a lecture. Don't tell him, he don't know this yet.
-
-...
diff --git a/source/_posts/2014-11-02-vobcopy-dvdbackup-etc.md b/source/_posts/2014-11-02-vobcopy-dvdbackup-etc.md
deleted file mode 100644
index b8690912..00000000
--- a/source/_posts/2014-11-02-vobcopy-dvdbackup-etc.md
+++ /dev/null
@@ -1,90 +0,0 @@
----
-layout: post
-title: "vobcopy, dvdbackup, etc."
-date: 2014-11-02 15:06:07 -0800
-comments: true
-categories:
----
-A few days ago, I was cloning my entire Audio CD and DVD collection, and reported some of the findings in [this post](/blog/2014/10/26/audio-cd-slash-dvd-to-iso-image-on-os-x/). As said, the most important commands are
-
-    hdiutil makehybrid -iso -joliet -o AUDIO_CD_NAME.iso SOURCE
-
-for Audio CDs and
-
-    hdiutil makehybrid -udf -o DVD_NAME.iso SOURCE
-
-for DVDs.
-
-Those alone don't finish the story. I also tried other things and unfortunately encountered problems. I was too busy to report back then, but now I'll summarize some of the findings.
-
----
-
-For one thing, `hdiutil makehybrid` might fail, issuing an "Operation not permitted" for no obvious reason. This could even happen when you work with the Disk Utility GUI (for which I once got a "Permission denied"). Even `sudo` didn't help in my case. However, I was able to **circumvent the problem with the root shell** (I won't tell you how to enter the root shell — you need to at least have that amount of knowledge about the root shell before you are given the key). Not sure why. Just keep in mind that the root shell might help (that's also a general, albeit dangerous, advice for life).
-
----
-
-Next onto grabbing the raw VOB.
-
-`vobcopy` is pretty sweet, but at least for me it had one huge problem. When I tried to copy a single title, say title #2 with
-
-    vobcopy --title-number TITLE_NUMBER -i SOURCE
-
-other titles got copied, too. I didn't have enough samples to test out, but presumably it's because the problematic DVD has a structure like this:
-
-![problematic DVD title structure](http://i.imgur.com/HTgmwQL.png)
-
-Anyway, no matter I `vobcopy` title 01, 02, or 03, the result was the same — the whole thing. That's pretty stupid. I don't know if it counts as a bug or unfinished feature. Definitely not cool.
-
-(One cool thing about `vobcopy`: as long as you complied with `libdvdread`, you can create a fully decrypted version of the DVD with
-
-    vobcopy --mirror -i SOURCE
-
-Of course, to get an iso image out of the decrypted mirror, you run the `hdiutil makehybrid -udf` command given above.)
-
----
-
-So `vobcopy` is dead (for copying specific titles in unfortunate DVDs). What's next?
-
-There's `dvdbackup`. The man page is good, and [ArchWiki](https://wiki.archlinux.org/index.php/dvdbackup#A_single_title) is even better (*ArchWiki is awesome!*), providing you cookbook solutions of combining the power of `dvdbackup` and `dvdauthor` (cookbooks are nice when dealing with unexciting technologies like DVD). In fact, `dvdbackup` alone is enough for extracting the VOBs of relatively small titles (< 1GiB):
-
-    dvdbackup -i SOURCE -o VOB_TARGET_DIR -t TITLE_NUMBER -n TITLE_NAME
-
-then grab your title-specific VOB in `VOB_TARGET_DIR/TITLE_NAME/VIDEO_TS`. Unlike `vobcopy`'s `-n/--title-number` option, `dvdbackup`'s `-t/--title` option does it right, trimming everything else. However, there's a problem when the title is larger than 1 GiB — then `dvdbackup` will split the VOB into several 1 GiB max pieces, and there's no way to disable this (since `dvdbackup` is targeting a DVD player — ancient technology — rather than `mpv` or whatever). What's sadder is that I can't seem to combine the split VOBs with FFmpeg stream copy — `pcm_dvd` audio always gets converted to `mp2` and fails when I use `-c copy`. I'm not a codec expert, but I suppose this is due to the fact that `pcm_dvd` isn't a supported encoding codec of FFmpeg (at least not my FFmpeg):
-
-    > ffmpeg -codecs | grep pcm_dvd
-    D.A..S pcm_dvd              PCM signed 20|24-bit big-endian
-
-`D` is for "Decoding supported", `A` is for "Audio codec", `S` is for "Lossless compression" — no encoding support. By the way, my FFmpeg is `brew`ed with the options `--with-fdk-aac`, `--with-ffplay`, `--with-freetype`, `--with-libass`, `--with-libbluray`, `--with-openjpeg`, `--with-openssl`, `--with-x265`:
-
-    > \ffmpeg -version
-    ffmpeg version 2.4.2 Copyright (c) 2000-2014 the FFmpeg developers
-    built on Oct 19 2014 14:09:36 with Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
-    configuration: --prefix=/usr/local/Cellar/ffmpeg/2.4.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid --enable-libfreetype --enable-libass --enable-ffplay --enable-libfdk-aac --enable-openssl --enable-libx265 --enable-libopenjpeg --disable-decoder=jpeg2000 --extra-cflags='-I/usr/local/Cellar/openjpeg/1.5.1_1/include/openjpeg-1.5 '
-    libavutil      54.  7.100 / 54.  7.100
-    libavcodec     56.  1.100 / 56.  1.100
-    libavformat    56.  4.101 / 56.  4.101
-    libavdevice    56.  0.100 / 56.  0.100
-    libavfilter     5.  1.100 /  5.  1.100
-    libavresample   2.  1.  0 /  2.  1.  0
-    libswscale      3.  0.100 /  3.  0.100
-    libswresample   1.  1.100 /  1.  1.100
-    libpostproc    53.  0.100 / 53.  0.100
-
-Maybe I missed some `--enable`.
-
-Sorry for the digression. So, it's not possible to stream-copy-concat the VOBs with FFmpeg. (In fact, since audio quality is not that important — you won't be able to tell 256k AAC from lossless anyway, especially when you are focusing on the video, so you can always transcode `pcm_dvd` into 256k AAC with `-c:a libfdk_aac -b:a 256k`. `mpeg2video` is an encoding supported codec so stream copy works fine. Or you may also use `flac` or whatever encoding-supported lossless codec.) However, if you insist on getting the original `pcm_dvd`, there is a way, an ugly way. You've gotta be creative here. [ArchWiki](https://wiki.archlinux.org/index.php/dvdbackup#A_single_title) already provides a cookbook solution on how to use `dvdbackup` and `dvdauthor` to create a DVD with a selected title. And `vobcopy` can copy the entire thing just fine, without the 1 GiB limit (make sure to use the `-l/--large-file` option if the size is greater than 2 GiB). Therefore, you can create a DVD with selected title from the original DVD, then `vobcopy` from the new DVD. This is insane, but it works, I've tested that. **Note, however, that timestamps might be wrong with `vobcopy`, so the VOB runs just fine linearly but might run into problems when you seek.** Therefore, FFmpeg is still the way to go. Or maybe you can do it right with one click using some closed source software ☹ — I've heard about success stories with the long ceased DVD Decrypter Windows project. In reality, I guess only people with theoretical interest or OCD will ever do this — FLAC or AAC should serve everyone just fine. It should have worked with `vobcopy` alone, but it doesn't. Hence the workaround.
-
----
-
-For future reference, I'll translate the ArchWiki cookbook solution here (it's too cookbook itself, specifying paths like `~/movie_name` and using unnecessary `cd`) about creating a title-specific DVD from a multi-title DVD (replace `SOURCE`, `VOB_TARGET_DIR`, `DVD_TARGET_DIR`, `TITLE_NUMBER`, and `TITLE_NAME` with sane values):
-
-    dvdbackup -i SOURCE -o VOB_TARGET_DIR -t TITLE_NUMBER -n TITLE_NAME
-    dvdauthor -t -o DVD_TARGET_DIR VOB_TARGET_DIR/TITLE_NAME/VIDEO_TS/*.VOB
-    export VIDEO_FORMAT=NTSC
-    cd DVD_TARGET_DIR/VIDEO_TS && dvdauthor -T -o DVD_TARGET_DIR
-
-`export VIDEO_FORMAT=NTSC` is to avoid the `dvdauthor` error of "no default video format, must explicitly specify NTSC or PAL" (I'm not sure about the difference between NTSC and PAL, but I saw NTSC printed on my DVD, so I used it). And there you go, a shiny new DVD filesystem located in `DVD_TARGET_DIR`. (Note that unlike `vobcopy`, `dvdbackup` doesn't feature a nice progress bar even when `-v/--verbose` and `-p/--progress` are specified.) Then you can
-
-    vobcopy -l DVD_TARGET_DIR
-
-if you'd like to. Recall that timestamps might be wrong, sadly.
diff --git a/source/_posts/2014-11-05-apple-is-pushing-yosemite-hard.md b/source/_posts/2014-11-05-apple-is-pushing-yosemite-hard.md
deleted file mode 100644
index 0324c26c..00000000
--- a/source/_posts/2014-11-05-apple-is-pushing-yosemite-hard.md
+++ /dev/null
@@ -1,32 +0,0 @@
----
-layout: post
-title: "Apple is pushing Yosemite hard"
-date: 2014-11-05 22:17:01 -0800
-comments: true
-categories:
----
-Apple is pushing Yosemite hard and secretly Yosemitizing things. iTunes was updated to its shiny new look on Mavericks, day one upon Yosemite launch. I liked it. The only problems I had with the new iTunes are:
-
-* It's no longer possible to go to the Artists view and Music Videos view with one click. Artists is now a drop-down menu option in My Music view; Music Videos is now a sidebar tab in Playlists view.
-
-* The red icon doesn't look as good as the previous blue one, and it doesn't harmonize too well alongside the blue Finder and Mail. Maybe they will look better together in Yosemite.
-
-Just now I found that the Mac App Store in Mavericks is also Yosemitized:
-
-![Yosemitized Mac App Store](http://i.imgur.com/T7KIo6s.png)
-
-The chromeless UI certainly looks a bit weird, and the font seems a bit too small. However, I'm sure I'll quickly get over these shortcomings, and might even grow to appreciate them. Even more so when I finally upgrade to Yosemite (I'll wait for Thanksgiving break or 10.10.1 this year, whichever comes first — looks like the former will come first, considering the first 10.10.1 developer beta was out [merely two days ago](http://www.macrumors.com/2014/11/03/first-yosemite-10-10-1-beta-now-available/), [reportedly](http://i.imgur.com/IVFV7E2.png) focusing on WiFi, etc.).
-
-On the font side, unfortunately the small font size in the new Mac App Store does make text fuzzy on my non-Retina display. I didn't notice the fuzziness in the new iTunes. Anyway, everything is optimized for Retina — Apple is also secretly pushing Retina hard. In the Apple ecosystem, apparently you always want to stay at the top of the line. Due to Apple's nature, the degree of hardware-software integration is simply unparalleled, so only the latest hardware enjoys all the new features and love. Unfortunately, the typical lifespan of a Mac is much longer than the hardware/software release cycle.
-
-The truth is, we (or at least I) adapt to things much quicker and easier than we'd imagined (or otherwise would be willing to admit). When iOS 7 was demo'ed on WWDC 2013, I was like "no way! What's with those stupid flat crap?" But when the update came, I hopped on and was happy ever since. (I reserve my opinion on the icon design.) Later when I installed an app that was not updated for the new UI, I was like "OMG, what's with this clumsy UI?" I guess legibility issues, WiFi issues (with Yosemite) and responsiveness issue (with iOS 8 on iPhone 4S — *AT&T, where's my preordered 6 Plus?*) are harder to impossible to adapt to, but they will eventually be fixed, or support-dropped, or hardware-upgraded (with $$). So in the end (almost) everyone will be happy. And one day when we face the old thing again by chance, we'll flee as fast as we can: "what's with that..." (I did exaggerate. Also, I know, many people just don't care about design, or have ill tastes, or can't find the buttons after a minimal number of UI tweaks — I'm not including them in the "we" here.) Those who claim that "I won't upgrade until..." are just kidding themselves, and certainly no one will wait for them or make their "until..." come true. Most of those "won't upgrade" folks will eventually upgrade and be happy. For those that really don't upgrade (like those still running Snow Leopard) either can't afford the new hardware, or suffer from senility (seen from the deep hostility towards new things). Or they have some important legacy software that would break with an upgrade; poor dudes.
-
-Same goes for newer, shinier, seemingly unnecessary deluxe hardware. I'm still stuck on a Mid-2012 MBP 13" Non-Retina. Retina seems highly useless for me since I do most of my work on the 27" external display — the 13" internal LCD hosts a single maximized Activity Monitor window most of the time (and sometimes also a Transmission window). I expect my opinion about Retina to change after I upgrade to a Retina model next year. (It will be a pretty major purchase though — i7, 16 GB memory, and 512 GB SSD are musts, and there are like a million peripherals to buy — Thunderbolt to Ethernet, Super Drive, etc., etc.) This shift of opinion after upgrading to something unnecessarily good (and ending up not being able to tolerate anything inferior) is best described as "**sadly converted**". Some folks are already sadly converted by the Retina iMac. See, for example, [this article](http://arstechnica.com/apple/2014/11/yes-the-5k-retina-imacs-screen-runs-at-60hz-at-5k-resolution/#p11) on Ars Technica:
-
-> Prior to getting the Retina iMac on my desk, I would have said that "retina" isn’t necessarily something we need on the desktop. Most people don’t notice pixels on the desktop at a normal seating distance. However, after getting to A/B compare the Retina iMac with the standard one over the course of a week, I’m sadly converted. I just don’t know if my wallet can take the abuse.
-
-And others are bitterly desiring one (me included — sadly two Mac are too much for a university dorm). See, for example, [this comment](http://arstechnica.com/apple/2014/11/yes-the-5k-retina-imacs-screen-runs-at-60hz-at-5k-resolution/?comments=1&post=27896871) on the aforementioned article:
-
-> I WISH APPLE TECHNICA WOULD STOP WITH ALL THESE ARTICLES ABOUT THE IMAC.
->
-> It really makes me want one unjustifiably.
diff --git a/source/_posts/2014-11-05-list-youtube-playlist-with-youtube-dl.md b/source/_posts/2014-11-05-list-youtube-playlist-with-youtube-dl.md
deleted file mode 100644
index a0d8af7b..00000000
--- a/source/_posts/2014-11-05-list-youtube-playlist-with-youtube-dl.md
+++ /dev/null
@@ -1,71 +0,0 @@
----
-layout: post
-title: "List YouTube playlist with youtube-dl"
-date: 2014-11-05 10:37:58 -0800
-comments: true
-categories:
----
-Of course you are always welcome to use the [Google APIs Client Library for Python](https://developers.google.com/api-client-library/python/) to wrestle with YouTube, which is usually pretty simple. (As an added bonus, YouTube has some [nice runnable sample scripts](https://developers.google.com/youtube/v3/code_samples/) to get you started.) With the client library, listing videos in a YouTube playlist is a breeze.
-
-However, if you don't feel like writing code yourself (I usually don't feel like writing code myself until I use something often enough and existing solutions are suboptimal), `youtube-dl` recently added the functionality to list videos in a playlist with the `--flat-playlist` option.
-
-[According to one of the project collaborators](https://github.com/rg3/youtube-dl/issues/4003#issuecomment-60322630), currently `--flat-playlist` is only helpful with the `-j` option for dumping JSON (so I suppose this feature is subject to change). For instance, `--flat-playlist` alone would emit something like this:
-
-```bash
-> youtube-dl --flat-playlist 'https://www.youtube.com/watch?v=gdOwwI0ngqQ&list=PLPpZI8R1zUfrkDbmJMOBhEbJ9Td9vbV-F'
-[youtube:playlist] Downloading playlist PLPpZI8R1zUfrkDbmJMOBhEbJ9Td9vbV-F - add --no-playlist to just download video gdOwwI0ngqQ
-[youtube:playlist] PLPpZI8R1zUfrkDbmJMOBhEbJ9Td9vbV-F: Downloading webpage
-[youtube:playlist] PLPpZI8R1zUfrkDbmJMOBhEbJ9Td9vbV-F: Downloading page #1
-[download] Downloading playlist: Cam By apinknomfan
-[youtube:playlist] playlist Cam By apinknomfan: Collected 119 video ids (downloading 119 of them)
-[download] Downloading video #1 of 119
-[download] Downloading video #2 of 119
-[download] Downloading video #3 of 119
-[download] Downloading video #4 of 119
-...
-```
-
-which doesn't really make sense — it tells you that it collected 119 video ids, and no more. Once you have `-j` on, you get JSON data that you can parse with anything:
-
-```bash
-> youtube-dl -j --flat-playlist 'https://www.youtube.com/watch?v=gdOwwI0ngqQ&list=PLPpZI8R1zUfrkDbmJMOBhEbJ9Td9vbV-F'
-{"url": "gdOwwI0ngqQ", "_type": "url", "ie_key": "Youtube", "id": "gdOwwI0ngqQ"}
-{"url": "j9l5nchv1Z8", "_type": "url", "ie_key": "Youtube", "id": "j9l5nchv1Z8"}
-{"url": "znW5ALwWNQw", "_type": "url", "ie_key": "Youtube", "id": "znW5ALwWNQw"}
-{"url": "qyE7-auTIcc", "_type": "url", "ie_key": "Youtube", "id": "qyE7-auTIcc"}
-...
-```
-
-The most straightforward way to parse this is to use a command line JSON parser, the best one being [jq](https://github.com/stedolan/jq):
-
-```bash
-> youtube-dl -j --flat-playlist 'https://www.youtube.com/watch?v=gdOwwI0ngqQ&list=PLPpZI8R1zUfrkDbmJMOBhEbJ9Td9vbV-F' | jq -r '.id' | sed 's_^_https://youtube.com/v/_'
-https://youtube.com/v/gdOwwI0ngqQ
-https://youtube.com/v/j9l5nchv1Z8
-https://youtube.com/v/znW5ALwWNQw
-https://youtube.com/v/qyE7-auTIcc
-...
-```
-
-There you go, a list of URIs you can use. Of course you can put this in a script to save some typing:
-
-```bash youtube-ls-playlist.sh https://gist.github.com/zmwangx/0245788475f963210ed9 Gist
-#!/usr/bin/env bash
-# Takes a YouTube URI to a playlist (fairly liberal, it's fine as long
-# as the playlist id can be extracted), and prints a list of URIs in a
-# YouTube playlist.
-#
-# Requires youtube-dl 2014.10.24, tested on youtube-dl
-# 2014.11.02.1. Feature subject to change.
-youtube-dl -j --flat-playlist "$1" | jq -r '.id' | sed 's_^_https://youtube.com/v/_'
-```
-
-**_Aside:_** I first embedded the gist here, but [it looked a bit off](http://i.imgur.com/m3cr0Im.png). See [imathis/octopress#1392](https://github.com/imathis/octopress/issues/1392).
-
-> In the next version of the Gist tag plugin we are just downloading the gists and embedding them upon generation so we don't have to worry about GitHub going down and breaking all your gists, or changing the HTML and breaking all the styles.
->
-> For the time being I suggest embedding your code snippets directly if you want them to look good.
-
-Okay. End of aside.
-
-By the way, `youtube-dl` supports playlist bulk download natively. The reason I need a list of video ids or URIs, however, is that among other things, `youtube-dl` doesn't download highest resolution DASH video by default, so I have to rely on something like `youtube-dl-dash` ([link](https://github.com/zmwangx/sh/blob/master/youtube-dl-dash)) to download the best version.
diff --git a/source/_posts/2014-11-06-2014-nobel-prize-in-physics-led-lights-seriously.md b/source/_posts/2014-11-06-2014-nobel-prize-in-physics-led-lights-seriously.md
deleted file mode 100644
index f68ea55d..00000000
--- a/source/_posts/2014-11-06-2014-nobel-prize-in-physics-led-lights-seriously.md
+++ /dev/null
@@ -1,19 +0,0 @@
----
-layout: post
-title: "2014 Nobel Prize in Physics — LED lights, seriously?"
-date: 2014-11-06 11:08:45 -0800
-comments: true
-categories:
----
-For some reason, I only learned about this year’s laureates today, through [the reference frame](http://motls.blogspot.com/2014/11/ex-employer-wont-meet-blue-led-nobel.html). The prize goes to the inventors of the LED. Not exciting at all, so I don’t care if I’m ever informed. (Lubos has a good point on why applied physics — well, let’s even widen the concept of applied physics a bit — should not surprise anyone when they appear in a Nobel Prize announcement: “After all, Alfred Nobel might have very well considered his dynamite to be a discovery in physics, too.”)
-
-The Nobel Prize Physics Awards has been rather amusing in recent years. Partly due to controversy on the theoretical front and no breakthrough on the experimental front, I guess. (The discovery of Higgs was a breakthrough to some extent, but it was totally expected; little physics beyond SM at LHC before LS1 is sad. Since it was totally expected, the award went to theorists — some experimentalists might not be too thrilled.) Just look at the recent list: 2010, graphene (shouldn’t that be chemistry? if material science can be part of physics, then chemistry must surely encompass it, too); 2009, CCD sensor (whatever that means, maybe that’s important); 2008, fibers (okay, I love fast Internet connections). The list actually goes all the way down to early 20th century, but it’s much denser in recent decades. Now one more: 2014, LED.
-
-> “for the invention of efficient blue light-emitting diodes which has enabled bright and energy-saving white light sources”
-
-Wow, energy-saving. I guess next year’s prize will go to the inventors of high efficiency urinals, for being resource-saving.
-**I mean, LEDs are great, but not great as physics, much less a physics breakthrough.**
-
-Let’s compare the applied folks to other laureates: Lorentz, J. J. Thomson, Planck, Einstein, Bohr, Heisenberg, Schrödinger, Dirac, Fermi, Pauli, Born, Lee, Yang, Landau, Feynman, Schwinger, Gell-Mann, Weinberg, ’t Hooft, etc. Not on the same level.
-
-It’s good to see that a growing body of physicists are (or at least as it seems to me) increasingly reserved about the Nobel Prize, and prizes in general. Same goes for math, with the Nobel Prize replaced by something else. (Employers still love the big titles, I suppose — good to have some star faculty on board.)
diff --git a/source/_posts/2014-11-07-interstellar.md b/source/_posts/2014-11-07-interstellar.md
deleted file mode 100644
index 8cd93b8f..00000000
--- a/source/_posts/2014-11-07-interstellar.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-layout: post
-title: "Interstellar"
-date: 2014-11-07 23:56:31 -0800
-comments: true
-categories:
----
-Today (I mean November 7, 2014 — it’s technically November 8 at the time of writing) I saw [*Interstellar*](https://en.wikipedia.org/wiki/Interstellar_%28film%29) (IMAX digital) at AMC Mercado 20. I rarely go to movie theaters, less on the release day (film formats of *Interstellar* were released on November 5, and digital formats followed on November 7). However, reviews of it were positive (from the physics community), and I really need a way to release stress these days — I wasn’t in the right condition for months. So I figured I’d just spend an afternoon in front of the big screen.
-
-I’ve heard good things about IMAX 70mm film, like no trailers, among other things. But I didn’t bother the extra seven miles’ drive to Hackworth IMAX Dome, so I landed on IMAX digital. Still a pretty stunning experience, although I ended up watching forty minutes worth of trailers before the real thing (arrived fifteen minutes early). In hindsight maybe I’d be better off spending some extra time on the road.
-
-Speaking of the movie itself, they tried to make it as plausible as possible from a physics viewpoint, by involving [Kip Thorne](https://en.wikipedia.org/wiki/Kip_Thorne) of Caltech. (There’s even a book out, *The Science of Interstellar*.) For instance, the wormhole isn’t portrayed as a hole (I mean, imagine a ring in empty space, as you would picture in your mind when you hear the word “hole” out of nothing; that’s not how it looks like here, and there’s a nice explanation). Some of the physics still doesn’t work out quite well, though, like Cooper’s not crushed at the singularity… Also there are communications from within the horizon and breakdown of causality, explained in the movie as happening in four dimension slices of some five dimensional spacetime where time could be a physical dimension. Obviously these are needed to get the sci-fi story going, so no one should be blamed.
-
-I was there for the sci-fi and physics, but a nice surprise was that I was also touched by the humanity elements of story, I mean, family and stuff.
-
-The downside: Cooper’s accent was a bit hard on me ☹
diff --git a/source/_posts/2014-11-10-average-phone-plan-in-the-u-dot-s-costs-ten-time-as-much-as-that-in-the-u-dot-k.md b/source/_posts/2014-11-10-average-phone-plan-in-the-u-dot-s-costs-ten-time-as-much-as-that-in-the-u-dot-k.md
deleted file mode 100644
index 1bce5027..00000000
--- a/source/_posts/2014-11-10-average-phone-plan-in-the-u-dot-s-costs-ten-time-as-much-as-that-in-the-u-dot-k.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-layout: post
-title: "Average phone plan in the U.S. costs ten time as much as that in the U.K."
-date: 2014-11-10 11:11:46 -0800
-comments: true
-categories:
----
-To quote [Opera News](http://blogs.opera.com/news/2014/11/mobile-data-anyway/),
-
-> According to research by the International Telecommunication Union, the average phone plan with 500MB of data costs $85 in the United States, compared to $24.10 in China and $8.80 in the United Kingdom.
-
-Holy shit!
diff --git a/source/_posts/2014-11-11-re-encoding-everything-for-iphone-6-plus.md b/source/_posts/2014-11-11-re-encoding-everything-for-iphone-6-plus.md
deleted file mode 100644
index 51d5ed37..00000000
--- a/source/_posts/2014-11-11-re-encoding-everything-for-iphone-6-plus.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-layout: post
-title: "Re-encoding everything for iPhone 6 Plus"
-date: 2014-11-11 13:31:25 -0800
-comments: true
-categories:
----
-AT&T finally delivered my iPhone 6 Plus (silver, 64 GB) after about fifty days since preorder… The 1080p Retina display is simply stunning. However, it turns out that my old videos don’t work so well on 6 Plus’s giant screen. My old mobile video collection was optimized for my 16 GB 4S, targeting the small screen and highly limited storage — you guessed it, they were resized to 960x540, and they looked great. But they’re not up to the task any more. 960x540 videos aren’t at all sharp on the stunning screen of 6 Plus, which is more than capable of handling 4x pixels. Therefore, I have no choice but to feed it more pixels. I’m left in a weird situation, where my 1080p desktop (or even HDTV) quality videos should fit the screen just fine, but H.264 profile stands in the way. iPhone 6 and 6 Plus are only capable of High Profile level 4.2, so anything encoded in level 5.1, for instance, needs to be re-encoded. Also there are still MPEG-2 and MPEG-4 videos out there (MPEG-4 should be obsolete by now, I assume, but some people still use it; and MPEG-2 is de facto in TV broadcasts), which have to be transcoded. Okay, it’s a daunting task to re-encode a fairly big collection, but I have to do it sooner or later. Presumably this weekend. I’ll also report whether 720p videos look sharp on the screen later.
diff --git a/source/_posts/2014-11-19-convolution-of-irreducible-characters.md b/source/_posts/2014-11-19-convolution-of-irreducible-characters.md
deleted file mode 100644
index f3f3207e..00000000
--- a/source/_posts/2014-11-19-convolution-of-irreducible-characters.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-layout: post
-title: "Convolution of irreducible characters"
-date: 2014-11-19 20:40:37 -0800
-comments: true
-categories:
----
-__*TL; DR:* The actual PDF write-up is [here](https://dl.bintray.com/zmwangx/generic/20141119-convolution-of-irreducible-characters.pdf).__
-
----
-
-Yesterday I was trying to establish the formula for orthogonal primitive central idempotents of a group ring. It is possible to establish the result through the convolution of irreducible characters. However, I stuck quite a while on trying to work out the convolutions themselves. For a formidable and unenlightening proof using "matrix entry functions" (i.e., fix a basis, induce a matrix representation, and explicitly expand everything in matrix elements), see [this post](http://drexel28.wordpress.com/2011/03/02/representation-theory-using-orthogonality-relations-to-compute-convolutions-of-characters-and-matrix-entry-functions/) (in fact, this is just one in a series of posts that lead up to the result). That's a really sad proof.
-
-It turns out that I really should have been working the other way round --- first establish the orthogonal idempotents (the proof of which is really simple and elegant, I was just trapped in a single thread of thought), then use that to compute the convolution of irreducible characters.
-
-I feel like this is worth presenting (as the only proof I saw online is the really sad one above), so I TeX'ed it up. I tried to convert to MathJax HTML but eventually gave up (that's the story for another post). So, the write-up is in good ol' PDF, available [here](https://dl.bintray.com/zmwangx/generic/20141119-convolution-of-irreducible-characters.pdf).
diff --git a/source/_posts/2014-11-20-dropbot-for-geeks(r).md b/source/_posts/2014-11-20-dropbot-for-geeks(r).md
deleted file mode 100644
index ad075302..00000000
--- a/source/_posts/2014-11-20-dropbot-for-geeks(r).md
+++ /dev/null
@@ -1,26 +0,0 @@
----
-layout: post
-title: "Dropbot for Geeks®"
-date: 2014-11-20 09:48:15 -0800
-comments: true
-categories:
----
-I propose the following cloud storage and syncing service model of the future. I call it **Dropbot for Geeks®**, and it totally rules. It's designed for geeks who are tired of the highly limited, miserably unproductive traditional services (based on clicking around). It has the following features:
-
-* Standard Unix file system commands exposed as an API, e.g., `cat`, `cd`, `cp`, `du`, `df`, `file`, `find`, `head`, `ln`, `ls`, `mkdir`, `mv`, `pwd`, `rm`, `rmdir`, `tail`, `touch`, etc.
-
-* A rudimentary shell emulator through the web interface exposing the commands above.
-
-* Secure shell access to the file system, also exposing the commands above. Provide two-factor auth for SSH. Clearly, `scp` should also be supported.
-
-* Checksums. Expose, for instance, `md5sum` or `sha1sum`, in the API. Provide checksums on download pages, probably on demand.
-
-* Programmable selective syncing, down to per file level.
-
-* Scriptability. Allow clients to run custom scheduled jobs or daemons with the API above. To prevent the service from becoming full-featured IaaS, though, clients might be limited in CPU time, memory, or command selection. This bullet point is arguable.
-
----
-
-With the level of command line integration illustrated above, we'll finally get rid of clicking around and not being able to automate chores. Navgating the remote file system will be a breeze — click, click, click, click, click (sometimes click should be replaced by double click, which is even more painful) just to navigate to a directory will be made a thing of the past. `ln`, in particular, saves disk space for duplicates — Dropbot for Geeks does *not* want to charge you extra for multiple copies of the same file in different directories. (To facilitate syncing hardlinks, clients should be able to specify hardlinked files in a config file. Or maybe some better mechanism. This might be hard.) At last, checksums are a must. I’ve had traumatic experiences like having downloaded an eight-part RAR, 1 GiB each, only to find that it wouldn’t unRAR. Without checksums, it was impossible to find which part was corrupted. As a result, I had to re-download everything — a nightmare. I never want to experience similar problems again. Hence the precious checksums.
-
-Dropbot for Geeks looks like a pretty good (well, not really, but at least pretty cool®) model. Maybe I should patent it before anyone else? Then if some similar service surfaces in the future, I can [sue their ass off and enjoy some hot cash](http://arstechnica.com/tech-policy/2014/11/jury-apple-must-pay-23-6m-for-old-pager-patents/).
diff --git a/source/_posts/2014-11-24-iphone-photography-frustration.md b/source/_posts/2014-11-24-iphone-photography-frustration.md
deleted file mode 100644
index 1a375f25..00000000
--- a/source/_posts/2014-11-24-iphone-photography-frustration.md
+++ /dev/null
@@ -1,32 +0,0 @@
----
-layout: post
-title: "iPhone photography frustration"
-date: 2014-11-24 12:42:25 -0800
-comments: true
-categories:
----
-**TL; DR:** Jump to the paragraph “In the end…”
-
----
-
-I'm not a photo-savvy guy. I've never taken a single selfie in my life, and my iPhone Photos app witnesses about twenty photos a year — fifteen of which are accidental screenshots. Okay, a little bit of exaggeration. The iPhone, aka iCamera, especially the 6 Plus model, is sort of a waste in my possession. However, my grandparents came to visit me on campus yesterday, and my grandma *loves* photos. So I took one with them, using my phone (which is obviously better than my grandma’s digital camera). The lighting was wrong, but I was able to fix that in five seconds — clicked “Edit”, clicked on the little sun icon (whatever it is called), clicked on “Light”, slided the slidebar all the way to the right, and all of a sudden it looked perfect. (This is the first time I ever clicked those, but I got it nicely done in five seconds — very intuitive, deeply impressed.) From a layman’s perspective, the builtin edit feature of the Photos app is really smart. Later I tried to reproduce the same edit with iPhoto, but I had to manually wrestle with exposure, highlights, shadows, brightness, contrast, etc., and I just never got it right. Call me a moron if you feel like it, but I’ve already given you the context at the beginning of this article, so you can’t blame me. (For your reference, I do ’shop some images for fun and profit from time to time, but I never deal with actual unedited photos, so I never have to worry about exposure and stuff.)
-
-So far so good. The frustation began when I try to import the photo to my Mac. I’m certainly not a mobile guy who keeps everything on his phone or the cloud. I have the photo import feature of Dropbox turned on, so as I plugged in my phone the photo already appearred in the Camera Upload folder. Wait what, two copies? Two copies that looked exactly the same, albeit one is about 0.1 MB larger than the other? Not cool. Pulled up Image Capture; Apple’s own software should do the trick, I guess. Nope, same thing. Googled, found this article on support.apple.com: [*iOS: Edited photos show original photo after import or in other apps*](http://support.apple.com/en-us/HT203612). Okay sure, they know this. Let's listen to what they have to say.
-
-> Apple uses Extensible Metadata Platform (XMP), a standard created by Adobe, for nondestructive photo editing. XMP allows you to undo edits and to revert back to an original photo without the loss of quality. Displaying the edited photo requires OS X v10.9 or later and software that can read XMP. The following applications support XMP:
->
-> * iPhoto 9.5 or later
-> * iPhoto for iOS
-> * Aperture 3 or later
-> * Adobe Lightroom
-> * Adobe Photoshop Elements
->
-> Other photo-management applications and some iOS apps may also display XMP.
-
-Adobe Lightroom, oh well. I don’t yet have Adobe CC installed — Photoshop is certainly a powerhouse (plus Illustrator, InDesign, etc. are nice to have at times), but Pixelmator works fine for me most of the time, and I’m happy to go to a library iMac or Mac Pro when I do need the power; $29.99/$19.99 is just too much if I use it twice a month. I theorize that I can indefinitely extend the free trial by running CC in a VM, reverting to a clean snapshot and regenerating the MAC address from time to time, but that’s only a theory — I haven’t got the incentive to test it out. As for iPhoto, I know it’s pretty lame from past experience, and I was very much baffled by the ugly and unintuitive UI, so normally I don’t even want to waste disk space on it; but since it’s only official solution other than expensive Adobe products and Aperture, I decided to install it. 1.7 GB gone. *So does the wasted 1.7 GB do the trick? Sadly, no.* Still the same thing in iPhoto 9.6, which is clearly “iPhoto 9.5 or later”. Totally baffled.
-
-In the end, I came up with an ugly solution. Just email or iMessage the photo to yourself from the phone. If you use email though, be sure to use the builtin Mail, or you would likely lose Exif data (I sent from Mailbox and lost Exif; I then sent from Mail and didn’t). This is really annoying since setting up accounts in the builtin Mail app is not fun — Google 2FA is not supported, and I have to generate an app-specific password. Compare to Mailbox, where *I signed into Dropbox on the new phone and within five seconds all of my ten email accounts are ready to use*. The loss of Exif data is probably related to [this thread on SO](http://stackoverflow.com/questions/20763814), but I didn’t delve into it since I’m not a Cocoa Touch dev. What’s more confusing, sending the photo via different applications result in different filesizes. The one sent from Mail (I chose original size when I sent it) was a 2 MB JPEG; the one sent from Mailbox was a 4.5 MB JPEG (without the right Exif); and the one sent via iMessage and later opened from the Messages app on Yosemite could be saved as a 10 MB lossless PNG (Exif was there). I went with the 2 MB one in the end.
-
-I don’t know if iCloud Photo Library will solve the problem in the end. From my perspective, *Apple should train Preview and QuickLook to recognize their XMP technology.* Seriously, they talk about continuity, and I expect to enjoy my enhanced photos on my Mac without going through all the hessle and confusion. Photo enhancing is already such a breeze, thank you; now make sharing and archiving easy, at least within the Apple ecosystem. (Although I’m not familiar with photography and image editing in general, considering how tech-savvy I am, I bet most users can’t even figure out one annoying solution.)
-
-By the way, Continuity and Handoff only work intermittently for me, and AirDrop between my iPhone (6 Plus) and MacBook Pro (mid-2012, model 9,2) doesn’t work at all. Continuity and Handoff sometimes turn up when they are unexpected (and serve as kinda nice surprises), but when I try to nail them, they remain elusive. Not a big deal for me, but certainly not the most pleasant thing ever. I bet these have to do with the fact that my Mac is connected to Ethernet and sharing the Ethernet connection to my iPhone; these days they expect everyone to be on Wi-Fi (and ironically they messed up big in Yosemite), but Wi-Fi simply can’t beat the speed and stability of Ethernet. I didn’t bother to test whether the features work when my devices are connected to the same Wi-Fi network; even if they do, that’s not my production setup, so they’re still useless to me.
diff --git a/source/_posts/2014-11-24-why-i-abandoned-mathjax-and-fell-back-to-pdf.md b/source/_posts/2014-11-24-why-i-abandoned-mathjax-and-fell-back-to-pdf.md
deleted file mode 100644
index 10f105d8..00000000
--- a/source/_posts/2014-11-24-why-i-abandoned-mathjax-and-fell-back-to-pdf.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-layout: post
-title: "Why I abandoned MathJax and fell back to PDF"
-date: 2014-11-24 20:54:36 -0800
-comments: true
-categories:
----
-Recently I wrote an expository article, [*Convolution of irreducible characters*](/pdf/20141119-convolution-of-irreducible-characters.pdf), and posted it [here](/blog/2014/11/19/convolution-of-irreducible-characters/). At first I intended to use MathJax, but in the end I fell back to good ol' PDF. Here's why.
-
-In short, I'm a mathematician. I write math *articles*, not just standalone expressions or formulas. I use AMSLaTeX to its fullest (not really, but at least I use numbering and the `amsthm` package to its fullest). HTML simply wasn't designed for this. Here are two influential markup languages designed for totally different use cases, and bridging them is painful. I tried to use `pandoc`, but it doesn't support `\input`, doesn't support `\def`, and swallows `\begin{theorem} \end{theorem}`, among other things. I tried to use `htlatex`; even the MathML output is suboptimal, with many math symbols translated to non-math (apart from totally human-unreadable), and it uses its custom CSS files that don't play well with everything else. I tried other things. In the end I gave up. Maybe I don't know enough about MathJax, but I certainly don't want to write a translator myself. Leave LaTeX alone. Distribute as PDF. MathJax may be great for Wikis (like Wikipedia) and for math lite blogs, but it's no replacement for real, beefy LaTeX. It's not for mathematicians who want to distribute real articles.
-
-By the way, Terry Tao and others use [Luca's LaTeX to WordPress, aka LaTeX2WP](http://lucatrevisan.wordpress.com/latex-to-wordpress/) for math blogging. From Terry's experience it works fairly well. I don't know if `amsthm` and `\def` are in the feature set, though. Anyway, since WordPress handles LaTeX as pre-compiled images (which is also the default on Wikipedia, and which looks poor in general and plays horribly with scaling), LaTeX2WP won't help MathJax users the slightest.
diff --git a/source/_posts/2014-11-25-i-got-16-gigs-of-ram.md b/source/_posts/2014-11-25-i-got-16-gigs-of-ram.md
deleted file mode 100644
index d55a642e..00000000
--- a/source/_posts/2014-11-25-i-got-16-gigs-of-ram.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-layout: post
-title: "I got 16 gigs of RAM"
-date: 2014-11-25 16:28:30 -0800
-comments: true
-categories:
----
-Today I upgraded the RAM of my MacBook Pro mid-2012 to 2x8GB. I purchased the [Crucial 16GB Kit (8GBx2) DDR3/DDR3L 1600 MHz (PC3-12800) CL11 SODIMM 204-Pin 1.35V/1.5V Memory for Mac CT2K8G3S160BM](http://smile.amazon.com/dp/B008LTBJFW) from Amazon, which cose me $146.64 after tax. I followed the [official guide](http://support.apple.com/en-us/HT201165) as well as the [iFixit guide](https://www.ifixit.com/Guide/MacBook+Pro+13-Inch+Unibody+Mid+2012+RAM+Replacement/10374). To finish the job I needed a Phillips #00 screwdriver and a spudger, so I purchased the [spudger](https://www.ifixit.com/Store/Tools/Spudger/IF145-002) and the [54 bit driver kit](https://www.ifixit.com/Store/Tools/54-Bit-Driver-Kit/IF145-022-1) from iFixit.
-
-The actual process was pretty simple. I had a little bit of hard time pulling out the bottom module and pushing in the top module, but overall it was smooth. The only stupid thing I did was that I forgot to push the battery connector back in before I closed the case; I only realized this when I was screwing in the eighth screw (that was a close one!), and had to unscrew everything again.
-
-After I replaced the RAM modules, booting was just normal. And now I've got 16 gigs of RAM!
-
-![](http://i.imgur.com/PGhdEGr.png)
-
-Want to run multiple memory hoggers *along with a Windows VM* (with 4GB of RAM)? No problem.
-
-![](http://i.imgur.com/czDcVaK.png)
-
-By the way, Yosemite is indeed really aggressive at RAM usage. I reserve my opinion on whether there's a memory leak. But so far the performance has been fine, even with 8GB of RAM.
diff --git a/source/_posts/2014-11-26-original-images-in-day-one-journal.md b/source/_posts/2014-11-26-original-images-in-day-one-journal.md
deleted file mode 100644
index c738699c..00000000
--- a/source/_posts/2014-11-26-original-images-in-day-one-journal.md
+++ /dev/null
@@ -1,42 +0,0 @@
----
-layout: post
-title: "Original images in Day One journal"
-date: 2014-11-26 00:22:16 -0800
-comments: true
-categories:
----
-**TL; DR:** Jump to the paragraph beginning with “workaround”.
-
----
-
-I started a Day One journal two days ago. I've heard good things about Day One, but after using it for a dozen entries, I'm not that satisfied. For one thing, the editor is pretty horrible — keybindings aside, I can’t even find and replace?! And the overview doesn’t look very pretty if you are a heavy Markdown user (i.e., you have a lot of markups, e.g., italics and inline links) — the markups are displayed as is. Moreover, I can’t even `#` my title: it kills the bold font rendering in the bird’s-eye view. What a let down. Anyway, it’s better than nothing, and I hope it will help me keep on track. (I used to manage a Markdown journal in an encrypted sparse bundle, and it was a pain in the ass — mentally. Maybe some GUI sugar is necessary, although Day One is certainly not as pretty as advertised.) Also a private journal means more privacy — I certainly don’t want to publish everything I write on this public blog.
-
-Too much irrelevant talking. Onto one of the most annoying “features”, and the subject of this post. Images are automatically JPEG-compressed when imported into Day One. See [this support article](https://dayone.zendesk.com/hc/en-us/articles/200145875-Are-photos-resized-when-imported-into-Day-One-), which says:
-
-> Every photo imported into Day One is converted to JPEG format and resized to a maximum resolution of 2100 x 2100 pixels. The aspect ratio is maintained. We resize photos for more efficient sync and storage. At this size the average photo is about 700KB which means you can store:
-> * Dropbox: 2,500+ photos using the free 2GB account
-> * iCloud: 6,000+ photos using the free 5GB account
-
-What the heck. Dude, who cares about storage these days? And transfer rate? I have a gigabit Ethernet. I certainly have much more than 2GB in my Dropbox. Even for those underpriviledged folks with only 2GB, remember, Day One allows *only one photo per entry*. That’s 2,500+ entries. At any rate, this should be an opt-in rather than an uncustomizable “feature”. I’m about to submit a ticket, but I doubt the outcome (I’m sure many people have submitted tickets about the plain text format even when password-protected, but so far, no response).
-
-With photos, most of the time JPEG compression works pretty well (but people surely want to keep photos in highest quality). However, I’m a techie guy, and my images are often screenshots or precision images, where JPEG compression totally ruins the sharpness.
-
-Workaround? Simple (yet a bit annoying). Day One lets you show the photo in Finder. So just go ahead and replace that compressed image with the original using `cp` or `mv`. I shouldn’t have needed to do this, but every piece of software comes with some annoyances. Overall Day One’s pretty good — at least it does what it was designed for, albeit not perfectly.
-
----
-
-By the way, here is my support ticket:
-
-> I understand that Day One does JPEG compression to every imported photo, as written in the support article “Are photos resized when imported into Day One?” http://goo.gl/Rzi017 . Yet I beg an option. The reason is that the benefits outlined in the support article are virtually non-existent:
->
-> * “More efficient sync and storage”: these days transfer rates are really high with SSDs and gigabit Ethernet, so reducing a few hundred KBs won’t help me the slightest;
->
-> * “Dropbox: 2,500+ photos using the free 2GB account”: I have much more than 2GB in my Dropbox; even if I only have 2GB, Day One allows only one photo per entry, and that means 2,500+ entries with photos, which is more than enough for most users, I suppose. By the way, Dropbox storage shouldn’t be your concern; people will buy more when they need more.
->
-> And some of the bad things about JPEG compression:
->
-> * JPEG compression usually works pretty well with photos, but when I import high precision images, the sharpness is totally ruined;
->
-> * People want to keep their photos in highest quality, which is defeated by forced compression.
->
-> I know an ugly workaround, which is simply replace the compressed image with the original in the filesystem. But I would love to see an option to import images as originals (in fact, compression should be an opt-in). Really, transfer rates and storage grow so rapidly that they are not people’s primary concerns anymore. (For your information, OneDrive recently rolled out truly unlimited storage to Office 365 subscribers. Online storage is that cheap.) Thanks.
diff --git a/source/_posts/2014-11-28-given-infinite-time.md b/source/_posts/2014-11-28-given-infinite-time.md
deleted file mode 100644
index 833b4de4..00000000
--- a/source/_posts/2014-11-28-given-infinite-time.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-layout: post
-title: "Given infinite time"
-date: 2014-11-28 00:18:19 -0800
-comments: true
-categories: 
----
-Given infinite time. There's so much I can do *given infinite time*. I don't think I'll ever be bored. But sadly the time assigned to each human being is finite. Actually it's epsilon, epsilon approaching zero. Sadly.
diff --git a/source/_posts/2014-11-28-going-diceware.md b/source/_posts/2014-11-28-going-diceware.md
deleted file mode 100644
index e649f374..00000000
--- a/source/_posts/2014-11-28-going-diceware.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-layout: post
-title: "Going Diceware"
-date: 2014-11-28 19:05:59 -0800
-comments: true
-categories: 
----
-Today I'm officially going [Diceware](http://world.std.com/~reinhold/diceware.html). I published my simple C implementation of diceware on [GitHub](https://github.com/zmwangx/diceware).
-
-I've been using 1Password for a couple years now, and I've always been a bit worried about my master password. It's a ~30 byte monster with uppercase, lowercase letters, numbers, and special symbols. By any measure it is very safe. The problem is there are (extremely) personal things in there. I assembled several unrelated things that I (secretly) hold dearest to my heart, obfuscated them with rules not found in best64, and mixed with semi-gibberish. My daily login password is a combo similar in nature, with less obfuscation to facilitate typing. People who dig really deep into my identity might be able to compromise it (or not); I'm afraid that I'm more predictable than I thought I was. I know, the worry is pretty much unwarranted, as I’m not likely the target of a focused attack — I’m neither rich nor equipped with sensitive information or power, and for wide-range exploits, 99.9% of people are lower-hanging fruits. Even for a targeted attack, [xkcd 538: Security](http://xkcd.com/538/) broke a crypto nerd’s imagination with a $5 wrench. However, a geek is a geek, you can’t block a geek’s imagination.
-
-Therefore, after worrying for so long, today I’m going Diceware. Eight diceware words give you at least 100 bits of true entropy. Unfortunately I don’t have a die, and don’t bother to get one. (Amazon Prime: get it Monday? No. Target, six miles away? No.) So I read my random bits from `/dev/urandom`. The C implementation is [here](https://github.com/zmwangx/diceware). By publishing this I’m announcing to the world that I’m using diceware. But I’m not afraid, since I’m now protected by true entropy that’s not compromised by publishing the scheme.
diff --git a/source/_posts/2014-11-30-opera-style-advanced-keyboard-shortcuts-in-safari.md b/source/_posts/2014-11-30-opera-style-advanced-keyboard-shortcuts-in-safari.md
deleted file mode 100644
index f76879f3..00000000
--- a/source/_posts/2014-11-30-opera-style-advanced-keyboard-shortcuts-in-safari.md
+++ /dev/null
@@ -1,45 +0,0 @@
----
-layout: post
-title: "Opera-style advanced keyboard shortcuts in Safari"
-date: 2014-11-30 17:20:20 -0800
-comments: true
-categories: 
----
-I've been using the Chromuim Opera for a long time, after Chrome's design went unbearably ugly around v32 (IIRC Opera stable channel was on v19 when I switched, which was released on January 28, 2014). From then on, Opera's [advanced keyboard shortcuts](http://help.opera.com/opera/Mac/1583/en/fasterBrowsing.html#advanced) has become an integral part of my browsing habit. In particular, the following are especially handy for me:
-
-* `1`: Cycle left through tabs;
-* `2`: Cycle right through tabs;
-* `/`: Find on page;
-* `Z`: Go back one page;
-* `X`: Go forward one page;
-* `0`: Zoom in;
-* `9`: Zoom out;
-* `6`: Reset zoom to 100%.
-
-Lately, with the Yosemite release, Safari has become a much more competitive browser. I won't say why, and I admit that it has major missing features that still prevents it from becoming my default — but I have to say I’m gradually moving more of more of my browsing, especially reading, to Safari. It would be nice if I could carry my power user shortcuts with me. Fortunately, this is possible. Just modify the plist in the following way:
-
-```bash safari-advanced-keyboard-shortcuts.sh
-#!/usr/bin/env bash
-defaults write com.apple.Safari NSUserKeyEquivalents '{
-"Actual Size"="6";
-"Back"="z";
-"Find..."="/";
-"Forward"="x";
-"Show Previous Tab"="1";
-"Show Next Tab"="2";
-"Zoom In"="0";
-"Zoom Out"="9";
-}'
-```
-
-Relaunch Safari. You are all set! Enjoy the ultrafast single key navigating experience. To reset,
-
-```bash
-defaults delete com.apple.Safari NSUserKeyEquivalents
-```
-
----
-
-**_2014/12/22 Update:_**
-
-There's one caveat to this approach — unlike in Opera, where the default layman shortcuts (e.g., ⌘F) are still available when advanced keyboard shorts are enabled, in Safari they are simply overwritten. This is annoying when the web page or web app binds certain keys, especially `/` to its own search bar (a notable example being google.com). In that case I have to admit defeat and click on the menu bar item, which takes a hundred times as long as a single `/` keystroke.
diff --git a/source/_posts/2014-12-05-distraction-free-writing.md b/source/_posts/2014-12-05-distraction-free-writing.md
deleted file mode 100644
index 122f6fc2..00000000
--- a/source/_posts/2014-12-05-distraction-free-writing.md
+++ /dev/null
@@ -1,34 +0,0 @@
----
-layout: post
-title: "Distraction free writing"
-date: 2014-12-05 21:09:10 -0800
-comments: true
-categories: 
----
-This is not the first time that a distraction free writing app is featured on the Mac App Store. This time the candidate is [Desk](https://itunes.apple.com/us/app/desk/id915839505?mt=12). The official website is [here](http://desk.pm), but licensing is MAS-exclusive. The icon looks like this:
-
-![](http://i.imgur.com/OprXSEU.png)
-
-Skeuomorphism, oh man. And this is the only screenshot I can find on the official website:
-
-![](http://i.imgur.com/WBaYzho.png)
-
-I can find a few other screenshots on MAS, but you know how shitty MAS screenshots are, plus the screenshots of this app only focus on specific UI elements. The official website also features an intro video (which provides no information at all) and a brief feature list with no further details, all on one page. The MAS description is somewhat more comprehensive, but again, "WordPress integration" and the like are not so informative. So, after a certain amount of research, I have to say I know little about this app. To do the app justice, there's an [accompanying blog](http://blog.desk.pm), with all kinds of noise though — like what a good blog should be, no complaint about that. So I guess anyone who wants to know more about this app should go digging there. Not me, so I didn't read.
-
-Strangely enough, reception is great, although the price tag is currently set at $30 — definitely a premium price. John Gruber [has a piece](http://daringfireball.net/linked/2014/11/22/desk), but I think "My thanks to Johb Saddington for sponsoring this weeks' DF RSS feed to promote Desk, his blogging app for the Mac" kind of defeats credability. MAS featuring is also a good sign (although not always). Out of the 55 MAS ratings at the time of writing (9:42 PM, Friday, December 5, 2014), 45 are five stars.
-
-That brings home my curiosity about "distraction free writing apps" in general. _Why would anyone pay $30 for a "distraction free writing app" (which basically justifies any lack of feature — "we deliberately give you no choice for anything so you can focus on writing!"), **without even a trial**?_ MAS is such a bad model for utility and productivity software since you can't just look at five screenshots (seriously?) and decide "this is for me!" Yet I have the impression that more developers prefer this model nowadays, especially in this focused-writing business, another example being IA Writer. Sure it makes licensing and combating piracy simple, but again, I need to feel it to decide if it's the right tool for me, especially for a feature-deprived focused-writing app. (This is a general thought — in this case I don't need to feel it to tell that it's not for me.)
-
-More specifically, let's think about distraction free writing. What does IA Writer, or Desk, or other apps offer that's not already available to you with your OS? They support Markdown syntax highlighting, or even WYSYWYG (but only the very simple kind of WYSYWYG limited by the Markdown feature set), sure. They support some select-and-click type of formatting (by the way, Desk's formatting tools look a lot like those found on medium.com), which is good for some who are not competent enough to type simple markups, I guess. Desk supports drag-and-drop of media (although I'm sure it's limited to certain platforms and not portable at all — I always upload images to Imgur and embed the Imgur links, which is super simple for me since I have several homemade scripts to take care of that). So are these features essential? Not at all. For the general public, plain Markdown without rendering should be more than enough, since Markdown was designed to be human-readable as plain text in the first place. Markdown only gets ugly when you have a lot of inline hyperlinks, or worse still, plain HTML tags, but that's not what I would expect from the general public. The technical population who do probably need the rendering, on the other hand, aren't the target audience of these apps; certain needs of the technical folks are hardly ever addressed by these feature-deprived focused-writing apps — e.g., where are my keybindings (full-featured, not just C-k, C-y, C-p, C-n, C-b, C-f, M-del, etc.; in particular, what about M-d, M-b, etc.)? What about custom Markdown engine? What about Jekyll integration (no need for that, actually — I'm happy with tty)? So, to sum up, for the target audience, realtime rendering isn't necessary, although I guess people with technophobia hate to see markups like `**` so no rendering will kill them. Second point, select-and-click type of formatting, is already dismissed. Third point, drag-and-drop of media might be useful for some people, but not all. After all, Desk uses a typewriter as its icon, and there's no way you could throw photos into your typewriter. It's about writing, and most of the time writing is enough.
-
-I have dismissed the "additional features" of focused-writing apps as non-essential. And I can argue that they are actually sources of distraction — as soon as you have WYSYWYG and formatting and mouse, you could, in principle, begin to fiddle. But when I say "additional features", you might ask, "additional" compared to what? Okay here's the magic. The magic is designed by Apple in California®, and it's present on every single Mac running OS X. It's called TextEdit.app. Distraction free? How can you be more distraction free than this:
-
-![](http://i.imgur.com/z3LEu0U.png)
-
-It's either text or blank. Nothing else. It's more than capable of handling plain text, our best friend (and computer's best friend — the universal interface). You can customize the font once and for all, or you can even live with the factory setting. That's better than having a font you don't like forced upon you, as many of those focused-writing apps do. You can even auto save to iCloud if you'd like to. Of course there's no one click publishing or timeline management or whatever, but you could leave that to a publishing app (like Desk, when used as a publishing app). Better yet, you can use Jekyll or Octopress or whatever command line solution, where everything is at your fingertip, a few keystrokes away. No limitation whatsoever. But that's out of question for most people. (The easy-to-use command line interface, and not needing to worry about hosting myself, are two of the primary reasons that brought me to Octopress on GitHub Pages, rather than wordpress.com or self-hosted wordpress.org).
-
-Of course I'm not saying TextEdit is good enough as a text editor (it is good enough for most people, though), or it is my text editor of choice. My text editor has always been Emacs, which can be distraction free when I need it to be (I've hidden everything I feel like to hide), and which can be an almost feature-complete operating system when I need it to be. Apart from a slightly frustrating loading time, there's no such bullshit as "we deliberately left no feature and no choice to you so you won't fiddle." Mostly importantly, it is extensible — I can start writing Elisp right away, and every single line of code I write can potentially save me thousands of keystrokes in the future; I don't need to submit a feature request to the developer and wait forever (usually power users' feature requests are ignored, unless the software was built for power users to begin with or mainly popular within power users). Plus Emacs is free (both as in beer and in speech), rather than being proprietary and costing $30. At any rate, when I'm writing in Emacs, most of the time I'm just furiously typing away — no distraction whatsoever. That's the ideal state of writing, and I feel really good at those moments. That's the main charm of writing, at least to me.
-
-![](http://i.imgur.com/2Jx9Mpv.png)
-
-The whole command line experience is awesome (most of what I do with the computer are either done in the browser or in iTerm2 — well, plus some time spent with PDF in Preview.app and some with emails in Mail.app). And most of my tools either ship with the operating system (OS X is a great operating system), or are FOSS. Things that hardly ever die. Of course the command line experience is infeasible for laymen, but my argument is, **most of the time the things you need are already there, e.g., TextEdit.** I feel bad about those folks who are constantly on the lookout for distraction-free writing apps, and pay a ridiculous amount for them — only to distract themselves. Just open TextEdit and type away (or if you're capable of it, Emacs or Vim or SublimeText or TextMate or BBEdit or whatever). That's the most productive thing to do. **Publishing is not the top priority; writing is, and it's really simple.**
diff --git a/source/_posts/2014-12-05-python-3-and-unicode.md b/source/_posts/2014-12-05-python-3-and-unicode.md
deleted file mode 100644
index d7d871d8..00000000
--- a/source/_posts/2014-12-05-python-3-and-unicode.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-layout: post
-title: "Python 3 and Unicode"
-date: 2014-12-05 15:01:54 -0800
-comments: true
-categories: 
----
-I never realized that in Python 3 Unicode is the default; in particular, `str` in Python 3 is practically equivalent to `unicode` in Python 2. This might be the *one thing* that convince me to migrate. `str.encode()`, `str.decode()`, `unicode.encode()`, `unicode.decode()`, etc. are so confusing that I'm never 100% sure what I'm doing (only-occasionally-used-but-unavoidable-and-worst-of-all-very-confusing "features" are nightmares).
diff --git a/source/_posts/2014-12-10-omnifocus-change-sync-behavior-mac-and-ios.md b/source/_posts/2014-12-10-omnifocus-change-sync-behavior-mac-and-ios.md
deleted file mode 100644
index 4ee29d57..00000000
--- a/source/_posts/2014-12-10-omnifocus-change-sync-behavior-mac-and-ios.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-layout: post
-title: "OmniFocus: change sync behavior, Mac and iOS"
-date: 2014-12-10 22:45:34 -0800
-comments: true
-categories: 
----
-On OS X, the following URIs are relevant:
-
-* <a href="omnifocus:///change-preference?MaximumTimeBetweenSync=30">omnifocus:///change-preference?MaximumTimeBetweenSync=30</a>
-* <a href="omnifocus:///change-preference?TimeFromFirstEditToSync=2">omnifocus:///change-preference?TimeFromFirstEditToSync=2</a>
-
-What they do are self-evident.
-
-On iOS, use the following URIs instead:
-
-* <a href="x-omnifocus-debug:set-default:MaximumTimeBetweenSync:60">x-omnifocus-debug:set-default:MaximumTimeBetweenSync:60</a>
-* <a href="x-omnifocus-debug:set-default:TimeFromFirstEditToSync:2">x-omnifocus-debug:set-default:TimeFromFirstEditToSync:2</a>
-
-Source: [Change Default Sync Times of OmniFocus For Mac and iOS](http://www.macstories.net/links/change-default-sync-times-of-omnifocus-for-mac-and-ios/).
diff --git a/source/_posts/2014-12-13-the-mac-like-evernote.md b/source/_posts/2014-12-13-the-mac-like-evernote.md
deleted file mode 100644
index 7eacfad3..00000000
--- a/source/_posts/2014-12-13-the-mac-like-evernote.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-layout: post
-title: "The Mac-like Evernote"
-date: 2014-12-13 21:47:31 -0800
-comments: true
-categories: 
----
-Once in a while (maybe a year, maybe several months — not set in stone), I give big name free services not in use a chance to convince me. Evernote is one such service. The interface used to look very cheap and cluttered. I hated it. However, this time I'm sold. Now everything Evernote, from its Mac app to its iOS app to its web design to its physical products, looks distinctively Mac-like. (I use Mac-like to refer to Apple's design philosophy, including iOS. Well, I guess the Android and Windows apps aren't Mac-like.) I mean, just look at the screenshots:
-
-![Web UI, beta](http://i.imgur.com/AZelofm.png)
-![Evernote Market, Pfeiffer Collection](http://i.imgur.com/tZuWBlY.png)
-![Mac app](http://i.imgur.com/R4QF8OM.png)
-
-Bright, simplistic, elegant, clutter-free. Mac-like. The Mac app takes advantage of the translucent material of Yosemite, and it looks gorgeous. The iOS app also feels great on a full HD Retina screen; I didn't bother to take a screenshot. Now it's much likely that I'll put it into good use — cluttered and cheap-looking interfaces give me nightmares and actually hinders my productivity, and now they are gone.
-
-No one can argue that Apple products make great screenshots. They are also much more intuitive, functional, and productive than most Windows folks are willing to believe. I hope our world is more Mac-like.
diff --git a/source/_posts/2014-12-14-speeding-up-emacs-with-emacsclient.md b/source/_posts/2014-12-14-speeding-up-emacs-with-emacsclient.md
deleted file mode 100644
index f82f63cf..00000000
--- a/source/_posts/2014-12-14-speeding-up-emacs-with-emacsclient.md
+++ /dev/null
@@ -1,36 +0,0 @@
----
-layout: post
-title: "Speeding up Emacs with emacsclient"
-date: 2014-12-14 10:06:02 -0800
-comments: true
-categories: 
----
-Emacs is notorious for its loading time. For me, this is especially annoying when I'm editing LaTeX files — AUCTeX takes about five seconds to load, and once I exit Emacs (especially after a quick edit), all that work is wasted, and next time I want to do some quick editing with that same LaTeX file — sorry, another five seconds.
-
-This problem can be solved by "using that same Emacs", i.e., running Emacs in server mode, then connecting to the server via `emacsclient`. Below is my script, which I call `emc`, to make `emacsclient` more user-friendly. `emc` opens a file (given as `$1`) on the server, launching one on its way if none is detected. Note that I used `-cqta=` for `emacsclient`. The `-c` option is `--create-frame`, i.e., create a new frame (in the current tty, for instance) instead of using the existing frame (in another tty, for instance); this allows for multiple frames accross different ttys. The `-q` option is for `--quiet`, suppressing messages like "Waiting for Emacs..." The `-t` option is for `--tty`, or equivalently, the familiar `-nw` option of `emacs`. The `-a=` options is `--alternate-editor=`; according to the manpage, `-a, --alternate-editor=EDITOR` has the following effect:
-
-> if the Emacs server is not running, run the specified editor instead. This can also be specified via the \`ALTERNATE_EDITOR' environment variable. If the value of EDITOR is the empty string,  run \`emacs --daemon' to start Emacs in daemon mode, and try to connect to it.
-
-Note that `emacsclient` requires a filename, so my script prompts for one if `$1` is empty.
-
-``` bash emc
-#!/usr/bin/env bash
-if [[ -n $1 ]]; then
-    file=$1
-else
-    while [[ -z ${file} ]]; do
-        read -p 'filename: ' file
-    done
-fi
-emacsclient -cqta= "${file}"
-```
-
-Note that using `emacsclient` has the additional benefit that the same buffer is simultaneously updated accross different ttys (See screenshot, where I opened the current post in two different ttys). This way, you won't face the nasty "file changed on disk" problem when you accidentally edited the same file in another tty session.
-
-![screen shot of multiple copies of the same buffer](http://i.imgur.com/9KxEWKq.png)
-
-By the way, remember to re-configure your other programs that uses an external editor. For instance, change `$EDITOR` to `emacsclient -cqta=` in your `env`, and `core.editor` to `emacsclient -cqta=` in your `~/.gitconfig`.
-
-*Note*: if you use `emacsclient` to edit git commit messages in Git Commit Mode, remember to use `C-c C-c` (`git-commit-commit`) to save the commit message rather than using `server-edit` or `C-x C-c` to exit Emacs. Otherwise, the `COMMIT_EDITMSG` buffer will persist in the Emacs server, and you'll be prompted to revert buffer the next time you edit another commit message, which is pretty annoying.
-
-I just started using `emacsclient`, so the above script might be buggy in certain edge cases. I'll report when I run into issues.
diff --git a/source/_posts/2014-12-14-the-google-chrome-comic-a-classic.md b/source/_posts/2014-12-14-the-google-chrome-comic-a-classic.md
deleted file mode 100644
index b1fe01b5..00000000
--- a/source/_posts/2014-12-14-the-google-chrome-comic-a-classic.md
+++ /dev/null
@@ -1,21 +0,0 @@
----
-layout: post
-title: "The Google Chrome Comic — A classic"
-date: 2014-12-14 17:42:55 -0800
-comments: true
-categories: 
----
-I was cleaning up my Opera bookmarks just now — I'm semi-officially leaving Opera for Safari. Of course, Safari still can't handle everything (e.g., Adblock Plus is still not so good on Safari, YouTubeCenter lags behind and I don't bother to compile myself — yes, I have a certificate, and some power user features simply don't exist), so I'm still going to Opera/Opera beta/Chrome/Firefox for certain tasks. But Safari is very nice. For the first time.
-
-I started out as a Chrome user (well, don't want to recall the IE days), branched out to the Chromium Opera, and now ended up in Safari. Not sure about the future. When I look back, something nostalgic pops up in mind — [the Google Chrome Comic](http://www.google.com/googlebooks/chrome/). I enjoyed it more than once, but I never seemed to have archived it. So here it is, combined into [one PDF](https://dl.bintray.com/zmwangx/generic/2008-chrome-comic.pdf). In fact, you can create the PDF yourself:
-
-```
-seq 0 39 | parallel wget -q http://www.google.com/googlebooks/chrome/images/big/{}.jpg
-convert $(ls -v *.jpg) 2008-chrome-comic.pdf
-```
-
-Here I was a bit lazy and used a GNU `ls` feature: `-v` for natural sorting of numbers (doesn't work for BSD `ls`).
-
-And here's page 1 of the comic as a teaser:
-
-![](http://i.imgur.com/W5pJTjl.jpg)
diff --git a/source/_posts/2014-12-19-app-suggestion-dropzone-3.md b/source/_posts/2014-12-19-app-suggestion-dropzone-3.md
deleted file mode 100644
index 340828a5..00000000
--- a/source/_posts/2014-12-19-app-suggestion-dropzone-3.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-layout: post
-title: "App suggestion: Dropzone 3"
-date: 2014-12-19 14:08:57 -0800
-comments: true
-categories: 
----
-I recently tried and purchased [Dropzone 3](https://aptonic.com/dropzone3/). See a list of features on the linked official website. In short, Dropzone 3 provides an intermediate zone for drag-n-drop. You can use it as a stash (called "Drop Bar" — stacking is available), use it as a shortcut by putting frequently used folders and applications there, or trigger actions by dropping. There are a dozen builtin actions and [an additional list of readily available actions](https://aptonic.com/dropzone3/actions/), covering common web drives, SNS and file sharing sites. **Better yet, you can develop your custom actions with the easy-to-use [Ruby API](https://github.com/aptonic/dropzone3-actions/blob/master/README.md#dzalerttitle-message).** For instance, I wrote a simple Google Translate action, `Google Translate.dzbundle` ([link](https://gist.github.com/zmwangx/b27f106a8ba47468a43d)), based on [translate-shell](https://github.com/soimort/translate-shell). (You know, it's Ruby, so calling external commands and concatenating strings feel at home, as if you are coding in Perl or directly in shell; unlike Python, where you at least need to `import subprocess` then `subprocess.check_output` to get the output of an external command, and have to use a bunch of stupid `+`'s to get your goddamn message to print.)
-
-Although I use the terminal for most tasks, drag-n-drop is still useful and convenient at times, not to mention the custom actions. (And the stock drag-n-drop is kinda hit-and-miss, especially for people like me who are mostly working with windows maximized — except terminal windows.) After using Dropzone 3 for a while, I found it well worth $4.99.
-
-Wait, I didn't mention the pricing? Dropzone 3 is only [$4.99 on MAS](https://itunes.apple.com/us/app/dropzone-3/id695406827?ls=1&mt=12), so get it while supplies last. (Somehow the license is $10 on the developer's online store, so definitely buy from MAS and change to the [unsandboxed version](https://aptonic.com/dropzone3/sandboxing.php) later — de-sandboxing is free.) There's also a 15-day free trial.
diff --git a/source/_posts/2014-12-22-10k-images-on-imgur.md b/source/_posts/2014-12-22-10k-images-on-imgur.md
deleted file mode 100644
index a9a96bde..00000000
--- a/source/_posts/2014-12-22-10k-images-on-imgur.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-layout: post
-title: "10k images on imgur"
-date: 2014-12-22 12:42:16 -0800
-comments: true
-categories: 
----
-I happened to check my imgur account just now (haven't been to the web interface for ages), and you know what, I have uploaded 10,744 images since I created the account in February this year! (I've been using imgur for longer than that; previously I uploaded images anonymously.) Most of the 10k images were uploaded via scripts using the API. This again demonstrates the importance of a good API — without the imgur API I wouldn't have been able to upload hundreds of images with a few keystrokes all in a snap, and getting links would be a huge pain in the ass. There are myriad image hosting services out there, but imgur rules 'em all, thanks to its decent API (and also its good CDN and direct image links, of course).
diff --git a/source/_posts/2014-12-23-mpv-launcher.md b/source/_posts/2014-12-23-mpv-launcher.md
deleted file mode 100644
index 1bb85b50..00000000
--- a/source/_posts/2014-12-23-mpv-launcher.md
+++ /dev/null
@@ -1,26 +0,0 @@
----
-layout: post
-title: "mpv launcher"
-date: 2014-12-23 00:51:05 -0800
-comments: true
-categories: 
----
-**_04/06/2015 update:_**
-
-I just noticed that `daemonize` doesn't play too well with the OS; in particular, when you use dark menu bar on OS X Yosemite, apps launched with `daemonize` won't conform to that. So a native shell solution would be using `/bin/zsh` and run
-
-    mpv "$@" >/dev/null 2>&1 </dev/null &!
-
-instead.
-
----
-
-[`mpv`](http://mpv.io) is a nice simplistic video player (fork of MPlayer and mplayer2). The CLI is flawless (and you can run as many instances as you want), but when it comes to the OS X application bundle, there's one major annoyance. Each app bundle could only have one running instance (unless `open -n`’ed, which is not how sane people use app bundles), and one instance of `mpv` only supports one video. So, say I'm playing one video with the app bundle, and unsuspectingly opens another in Finder (which is associated to `mpv.app` by default), then the latter video immediately takes over, and the position in the first video is lost. That happens *a lot*.
-
-Today I finally gave this issue some serious thought (I've been on a bug report/enhancement request spree these days so it's natural for me to start thinking about enhancements). Turns out that there's a pretty simple workaround. I created an automator app `mpv-launcher.app` that does one thing: "Run Shell Script" (pass input as arguments)
-
-    daemonize /usr/local/bin/mpv "$@"
-
-in the shell of your choice (for me the shell of choice is `zsh` since the env would be readily available from my `zshenv`). `daemonize`, as the name suggests, daemonizes the process so that the process doesn't block; this way, `mpv-launcher.app` immediately quits after launching, making multiple "instances" possible. (`daemonize` can be installed via `brew install daemonize`; note that you need to specify the full path of the command to daemonize, which in my case is `/usr/local/bin/mpv`). And there you go. Associate your video files to `mpv-launcher.app`. Launch as many instances as you want. Enjoy.
-
-By the way, I also filed an [enhancement request](https://github.com/mpv-player/mpv/issues/1377) with `mpv-player/mpv`. We'll see what the developers can do. Hopefully the app bundle will support multiple videos out of box in the future.
diff --git a/source/_posts/2015-01-01-os-x-system-ruby-encoding-annoyance.md b/source/_posts/2015-01-01-os-x-system-ruby-encoding-annoyance.md
deleted file mode 100644
index 2bef694d..00000000
--- a/source/_posts/2015-01-01-os-x-system-ruby-encoding-annoyance.md
+++ /dev/null
@@ -1,43 +0,0 @@
----
-layout: post
-title: "OS X system ruby encoding annoyance"
-date: 2015-01-01 22:49:39 -0800
-comments: true
-categories: 
----
-I've been using RVM (with fairly up-to-date Rubies) and pry since my day one with Ruby (well, almost), so it actually surprises me today when I found out by chance how poorly the system Ruby behaves when it comes to encoding.
-
-The major annoyance with the current system Ruby (2.0.0p481) is that it can't convert `UTF8-MAC` to `UTF-8` (namely, NFD to NFC, as far as I can tell), at least not with Korean characters. Consider the following script:
-
-```ruby utf8-mac.rb
-# coding: utf-8
-require 'hex_string'
-str = "에이핑크"
-puts str.to_hex_string
-puts str.encode("UTF-8", "UTF8-MAC").to_hex_string
-```
-
-Here are what I get with the system Ruby and the latested brewed Ruby:
-
-```bash
-> /usr/bin/ruby --version
-ruby 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin14]
-> /usr/local/bin/ruby --version
-ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin14]
-> /usr/bin/ruby utf8-mac.rb
-e1 84 8b e1 85 a6 e1 84 8b e1 85 b5 e1 84 91 e1 85 b5 e1 86 bc e1 84 8f e1 85 b3
-e1 84 8b e1 85 a6 e1 84 8b e1 85 b5 e1 84 91 e1 85 b5 e1 86 bc e1 84 8f e1 85 b3
-> /usr/local/bin/ruby utf8-mac.rb
-e1 84 8b e1 85 a6 e1 84 8b e1 85 b5 e1 84 91 e1 85 b5 e1 86 bc e1 84 8f e1 85 b3
-ec 97 90 ec 9d b4 ed 95 91 ed 81 ac
-```
-
-As you can see, in the case of the system Ruby, NFD is left untouched. This leads to problems with, for instance, Google Translate. One obvious solution is to outsource the task to `iconv`, but I have the impression that outsourcing language features to shell commands is a generally despised practice.
-
-There's one more surprise. While `pry` with latest Rubies tend to handle Unicode very well (unlike `irb`), I tried `pry` with the current system Ruby, and it doesn't work; due to this annoying limitation, I couldn't even test the above problem interactively, and had to resort to a script. Maybe the problem can be resolved by compiling Ruby with `readline` or whatever; I didn't bother. The bottom line is, the system Ruby is not very pleasant for men in the 21st century — good Unicode support ought to be a must. (By the way, NFD in HFS+ is maddening. It breaks Terminal, iTerm, Google Translate, scp with Linux hosts, and the list goes on.)
-
-P.S. In Dropzone 3 custom actions you can select a custom Ruby with the `RubyPath` meta field, e.g.,
-
-```ruby
-# RubyPath: /usr/local/bin/ruby
-```
diff --git a/source/_posts/2015-01-10-fonts-why-chinese-web-design-is-hard.md b/source/_posts/2015-01-10-fonts-why-chinese-web-design-is-hard.md
deleted file mode 100644
index 7d6e5ee8..00000000
--- a/source/_posts/2015-01-10-fonts-why-chinese-web-design-is-hard.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-layout: post
-title: "Fonts: why Chinese web design is hard"
-date: 2015-01-10 09:30:02 -0800
-comments: true
-categories: 
----
-For years I've been complaining about Chinese websites' horrendous designs. Yesterday I tried to translate one of my simple project websites to Chinese, and finally realized that web design for the Chinese language is no simple task — much harder than for English. The problem is fonts. This might not be the only problem (and cannot take blame for all the horrendous designs), but it certainly seems to be a roadblock.
-
-The problem with fonts boils down to the fact that the Chinese writing system has too many glyphs. I still remember learning things about the GB 2312 charset when I was twelve — there are 3755 Level 1 characters (more commonly seen), 3008 Level 2 characters, and other symbols and foreign glyphs. Designing more than six thousand Chinese characters is so much harder than designing 26 letters. I'm not sure if many glyphs are auto-generated from parts, but that would certainly degrade the quality. The result? Availability of digital fonts suffers. There are simply not so many choices of Chinese fonts. Chinese writing is beautiful, but I've yet to see a font for screens (let alone the web) that conveys that beauty. This might be subjective, but I have the impression that fonts generally look worse on screen than in print, and more so for Chinese fonts (Retina doesn't help much). For the record, I checked Apple's font usage at the moment, and they are using a tailored font named "PingHei" ("平黑", I guess; see screenshot at the end); I'm not at all impressed. Compare that to the English counterpart (also at the end) — not on the same level. (I won't talk about Microsoft since it doesn't feature a design department, or that department is brain dead. Well, I'm a little opinionated.)
-
-Another problem triggered by the vast number of glyphs is that font files are large. I looked at a dozen OTF fonts with SC or TC glyphs, and none seems to be below 10 MB. That's clearly a no go on the web — not until everyone has a gigabit connection, I suppose. I tried to Google for Chinese webfonts and had little success, so I'm not sure if woff helps. I've heard that Apple is able to pack a reduced set of PingHei glyphs into woffs less than 1 MB (keep in mind that PingHei being sans serif is simpler than serif fonts like Songti); that's pretty remarkable. I don't know much about font technologies so I can't comment more on this matter, but from my observation all Chinese websites (with the exception of apple.com/cn, I guess) rely on locally installed fonts, and most don't even have a list of fallbacks, i.e., typefaces simply aren't part of their designs. Even if they do have a list of fallbacks, they won't be able to guarantee uniform experience across the board (as far as I know, the lowest common denominator of Chinese fonts across all platforms seem to be zero). Apple has taught us that design must be integrated and perfected (well, Apple wasn't the first to do design, but they did bring it to the digital world and to the masses). Any fragmented design is doomed to fail.
-
-![](http://i.imgur.com/MPmtSJI.png)
-
-![](http://i.imgur.com/hBpdv0B.png)
diff --git a/source/_posts/2015-01-21-web-design-microsoft-vs-apple.md b/source/_posts/2015-01-21-web-design-microsoft-vs-apple.md
deleted file mode 100644
index 5f8cb833..00000000
--- a/source/_posts/2015-01-21-web-design-microsoft-vs-apple.md
+++ /dev/null
@@ -1,19 +0,0 @@
----
-layout: post
-title: "Web design: Microsoft vs Apple"
-date: 2015-01-21 16:30:51 -0800
-comments: true
-categories: 
----
-I just had a look at Ars's live blog on today's Windows 10 Event to acquire a sense of where Windows is heading. There's not much to report. Safari rip-off (Microsoft's new Spartan — wait, is this name also inspired by Safari? — features reading mode and offline reading list, Safari's killer features) aside, the focus seems to be virtual assistant, PC-tablet-phone integration, and gaming, none of which I'm interested in. The hologram thing does look cool, but putting the hype aside, I doubt if it will be really useful for the masses (except probably in gaming, one of my most despised applications of computing). I'm not a visionary so maybe I'm underestimating this.
-
-(Another interesting development is "Windows as a Service" — WaaS? Microsoft isn't communiating it effectively. If it means paid subscription, am I ever going to subscribe to an OS? No. If it instead means free system updates for the lifetime of a device, then this WaaS thing is just a vacuous buzz phrase — Apple has already been doing it for two years. Longer if you count the cheap upgrades. However, if free system updates is indeed the case, then what about VMs? Not sure.)
-
-The only thing I would like to see Apple copy from Microsoft is the unlimited OneDrive — come on, we already paid enough for our hardware, why can't we have unlimited cloud storage? I would even pay $10 per month for that — Microsoft is offering Office 365 along with unlimited cloud storage, all for just $10, so it certainly won't hurt Apple. The current iCloud pricing is ridiculous.
-
-All the discussions above are not the main point of this post though. The point is, I went to the Windows website to learn more about Windows 10, and just can't believe my eyes in how awful it is designed. Just look at the font and the layout of <http://windows.microsoft.com/en-us/windows-10/about> (full web page screenshot courtesy of [web-capture.net](http://web-capture.net)). And compare that to <http://www.apple.com/osx/> (scroll past the Windows screenshot). Holy crap, I even booted my Windows 8.1 VM just to make sure I'm not lacking the necessary fonts available on Windows.
-
-Why Microsoft's web design is so shitty is always beyond my grasp. For OS X, a potential customer would be eager to set his hands on it just by looking at its beautifully-crafted homepage and a few screenshots there. For Windows it's exactly the opposite. I mean, apart from metro apps (worst and ugliest desktop experience ever), modern Windows actually looks pretty good. But their shitty advertising totally ruins it. I guess it doesn't matter much for Microsoft, for all design-savvy folks who are not stuck on Windows are already using OS X, and most of their customers just need a commodity OS.
-
-![](http://i.imgur.com/0eIt4SR.png)
-![](http://i.imgur.com/piUO0xY.png)
diff --git a/source/_posts/2015-02-10-monitor-progress-of-your-unix-pipes-with-pv.md b/source/_posts/2015-02-10-monitor-progress-of-your-unix-pipes-with-pv.md
deleted file mode 100644
index 2f58e884..00000000
--- a/source/_posts/2015-02-10-monitor-progress-of-your-unix-pipes-with-pv.md
+++ /dev/null
@@ -1,60 +0,0 @@
----
-layout: post
-title: "Monitor progress of your Unix pipes with pv"
-date: 2015-02-10 02:18:30 -0800
-comments: true
-categories: 
----
-Recently I found a very useful utility called `pv` (for "pipe viewer"). [Here](http://www.ivarch.com/programs/pv.shtml) is its home page, and it can be easily installed with `brew`. According to its man page,
-
-> `pv` shows the progress of data through a pipeline by giving information such as time elapsed, percentage completed (with progress bar), current throughput rate, total data transferred, and ETA.
-
-For more info, see its home page (linked above) and [man page](http://linux.die.net/man/1/pv).
-
-Why is it useful? Well, pretty obvious if you are in the right audience. For me, one particularly important use case is with `openssl sha1`. I deal with videos on a daily basis, and back up all of them to OneDrive (ever since OneDrive went unlimited). To ensure integrity of transfer (in future downloads), I append the first seven digits of each video to its filename. This should be more than enough to reveal any error in transfer except for active attacks. One additional advantage is that I can now have multiple versions of a same show, event, or whatever and don't have to worry about naming conflicts (and don't have to artificially say `-ver1`, `-ver2`, etc.). This little merit turns out to be huge and saves me a lot of trouble, since naming things is intrinsically hard:
-
-> There are only three hard things concurrency, in computer science: cache invalidation, naming things, and off-by-one errors.
-
-(I learned this beefed up version of two hard things only recently.) Well, too much digression. So SHA-1 sum is useful. (By the way, I learned in my crypto class that SHA-1 is broken as a collision-resistant hash function — not HMAC, which doesn't assume collision-resistance — and SHA-256 should be used instead. However, I'm not protecting against active attacks — I won't be able to without a shared secret key anyway — so the faster SHA-1 is good for my purpose.) But at the same time, SHA-1 is slow. Maybe what's actually slow is my HDD. Whatever the bottleneck, generating a SHA-1 digest for a 10 GB video file isn't fun at all; it's even more of a torture when there's no progress bar and ETA. But hopelessly waiting has become a thing of the past with the advent (well, discovery in my case) of `pv`. Now I have nice and informative progress bars, which reduces the anxiety of waiting by an order of magnitude.
-
-For the record, here's the current version of my ruby script that attaches the first seven digits of the SHA-1 digests of the given files to their filenames:
-
-```ruby 7sha1
-#!/usr/bin/env ruby
-
-require 'fileutils'
-
-def rename(items)
-  num_items = items.length
-  num_done = 0
-  items.each {|path|
-    printf($stderr, "%d/%d: %s\n", num_done + 1, num_items, File.basename(path))
-
-    if ! File.directory?(path)
-      extname = File.extname(path)
-      basename = File.basename(path, extname)
-      dirname = File.dirname(path)
-      sha1sum = `pv '#{path}' | openssl sha1`
-      new_basename = basename + "__" + sha1sum[0,7]
-      new_path = File.join(dirname, new_basename + extname)
-      FileUtils.mv(path, new_path)
-    else
-      STDERR.puts("#{path}: directory ignored")
-    end
-    
-    num_done += 1
-  }
-end
-
-rename(ARGV)
-```
-
-You might ask why I used ruby (littered with bash) when it's obviously a job for bash or perl. Well, the reason is that I first wrote this thing in ruby as a [Dropzone 3 action](https://gist.github.com/zmwangx/d6406fb8bf51ac768770). I'm lazy, so I just borrowed that script and modified its printout for shell use.
-
----
-
-By the way, I also found a project called `cv` (Coreutils Viewer), which is [officially described as](https://github.com/Xfennec/cv)
-
-> ... a Tiny, Dirty, Linux-Only C command that looks for coreutils basic commands (cp, mv, dd, tar, gzip/gunzip, cat, etc.) currently running on your system and displays the percentage of copied data.
-
-I'll look into it when I have time, but it from its description, it seems to be limited to coreutils, and OS X support might not be too awesome (at this point).
diff --git a/source/_posts/2015-02-17-microsoft-is-getting-cool-but-not-its-website.md b/source/_posts/2015-02-17-microsoft-is-getting-cool-but-not-its-website.md
deleted file mode 100644
index 7342568d..00000000
--- a/source/_posts/2015-02-17-microsoft-is-getting-cool-but-not-its-website.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-layout: post
-title: "Microsoft is getting cool (but not its website)"
-date: 2015-02-17 18:57:19 -0800
-comments: true
-categories: 
----
-Microsoft is getting kind of cool. For instance, open sourcing .NET last year caused quite a buzz. Ars has a good piece about this: [Microsoft’s continuing efforts to be cool](http://arstechnica.com/information-technology/2015/02/microsofts-continuing-efforts-to-be-cool/).
-
-Three weeks ago Microsoft made another minor but totally unexpected move: they integrated AgileBits' `onepassword-app-extension` ([GitHub](https://github.com/AgileBits/onepassword-app-extension)) into the 5.0 release of the OneDrive iOS app. I didn't realize this until I read [yesterday's blog post on the OneDrive Blog](https://blog.onedrive.com/onedrive_secure_password/). This is really amazing when you put it in context: I mean, take a look at [Apps that love 1Password](https://blog.agilebits.com/1password-apps/), i.e., apps that have integrated that extension. Out of the ninety apps listed to date, there are only a dozen apps that I've heard of, and the only brands bigger than 1Password are Microsoft, Tumblr, Uber (infamous), and Walmart (what?). Microsoft embracing third party is surely an interesting phenomenon.
-
-Meanwhile,
-
-* Microsoft still won't let us use our password managers to its fullest (of course we can't blame it on the OneDrive folks): 16 characters max in this day and age (screenshot taken today)? Hmm. And I remember Microsoft recently said password length isn't the main source of vulnerability of its customers. WTF. Who cares about *your* stupid customers. I just want to protect *my own* data, and make sure that in case of a breach on *your* side, I won't face the same loss as your technologically illiterate customers. But that's not currently possible with Microsoft.
-
-![](http://i.imgur.com/CNv76zw.png)
-
-* Microsoft's UI design is still shit, [as well as their website](/blog/2015/01/21/web-design-microsoft-vs-apple/); I mean, seriously:
-
-![](http://i.imgur.com/wu66zZc.png)
diff --git a/source/_posts/2015-02-20-my-dock-and-updated-omnifocus.md b/source/_posts/2015-02-20-my-dock-and-updated-omnifocus.md
deleted file mode 100644
index 690b83e1..00000000
--- a/source/_posts/2015-02-20-my-dock-and-updated-omnifocus.md
+++ /dev/null
@@ -1,21 +0,0 @@
----
-layout: post
-title: "My dock and updated OmniFocus"
-date: 2015-02-20 16:16:10 -0800
-comments: true
-categories: 
----
-
-> Simplicity is the ultimate sophistication.
-
-Here's a screenshot of my dock at the moment.
-
-![My dock](http://i.imgur.com/EhaJw57.png "My current dock. Left to right: Finder (TotalFinder), Mail, Safari, Chrome, iTunes, OmniFocus, iTerm2, Activity Monitor, and mpv. Everything except mpv is persistent.")
-
-Left to right: Finder (TotalFinder), Mail, Safari, Chrome, iTunes, OmniFocus, iTerm2, Activity Monitor, and mpv. Everything except mpv is persistent; mpv is there because I happen to be looping a piece of music with mpv that I don't plan to add to the iTunes library. The point is that it never looked this good, mainly due to the updated OmniFocus icon. Finally they put some serious thought into graphics design! Just compare [the v2.1 icon](https://dl.bintray.com/zmwangx/generic/omnifocus-v2.1.icns) to [the v2.0 version](https://dl.bintray.com/zmwangx/generic/omnifocus-v2.0.icns).
-
-![](http://i.imgur.com/KeTz5wK.png)
-
-Obviously the overpolished (and honestly, badly polished) 2.0 one belongs to the past. It "stood out" even among Mavericks dock icons (in terms of color), not to mention among the flattened-down Yosemite ones. Today, it finally becomes a native member of the dock. (Well, actually not today — I've been using the beta for a while, so the new icon didn't come as a surprise.) In fact, this time the Omni Group seems to be on a graphics design streak these days, and today they have a really impressive App Store feature banner:
-
-![](http://i.imgur.com/tILmveQ.png)
diff --git a/source/_posts/2015-02-21-all-is-not-lost.md b/source/_posts/2015-02-21-all-is-not-lost.md
deleted file mode 100644
index 75c1ede2..00000000
--- a/source/_posts/2015-02-21-all-is-not-lost.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-layout: post
-title: "All is not lost"
-date: 2015-02-21 17:12:32 -0800
-comments: true
-categories: 
----
-Lubos Motl always attacks the Many-Worlds Interpretation as if it is on the same level as anti-scientific claims. He even went on to attack Hugh Everett (the guy who first formulated this interpretation) personally; *ad hominem* is of course typical Motl shit, and I don't bother to find those posts. Anyway, here's yet another one: [Many worlds: a Rozali-Carroll exchange](http://motls.blogspot.com/2015/02/many-worlds-rozali-carroll-exchange.html).
-
-Disclaimer: I'm not really a proponent of Many-Worlds, at least not of the part of it that says history really *branches* into *many* worlds. Well, Lubos is at least right about one thing: "many worlds", taken literally, can't even be well-defined. However, I do believe that the world is can be described by a "universal wavefunction" (I prefer to call it the "universal state vector") in some gargantuan Hilbert space. And the universal state vector has to evolve deterministically. The reason is simple: **_all information is not lost_**. This principle is fundamental to physics and it's simply not on the same level as falsifiability, which is little more than a philosopher's toy and a nice thing to have. In quantum mechanics' terms, *unitarity must be respected*; this is why the Copenhagen Interpretation, or at least the wavefunction-collapsing part of it, cannot hold up to serious scrutiny — no operator can ever collapse the wavefunction and break unitarity. Those who hold the Copenhagen Interpretation are confusing *their* lack of knowledge (albeit a fundamental one, as they were entangled into the system when they make an observation) with the fundamental loss of information (which is not possible).
-
-One may question that if the universal state vector is *real*, then where's all the unavailable information stored (why is there a *fundamental* lack of knowledge)? Well, who told you that all information in this universe can be observed or written down? Everything outside our event horizon is also unavailable to us, yet modern physics knows for sure that some of those *do* exist. Of course we have a hierarchy of belief in the existence of different things, with the universal state vector being hard to believe (and very hard to not believe) or make sense of. But there's no hard cut, and we might some day be able to reason about it.
-
-I don't know how exactly the observed universe is the way it is (i.e., how exactly it fell — or "collapsed", which is a convenient word for communication — into the eigenstate that we observed). I'm not even sure if the observed universe is the way it is in the objective (ontological) sense — if there were no observers, would it just be an "uncollapsed" state vector? I suspect that this problem has something to do with consciousness, and I suspect that we are at least hundreds of years from understanding consciousness. (Of course this kind of predictions are all nonsense — no one can look thirty years into the future). At the very least, we may eliminate some possibilities when we know more about consciousness. At any rate, this is an interesting problem that might be outside the capability of human reason, or might not. One may hate it and refuse to talk about it, but one cannot dismiss it as unphysical.
-
-When Lubos dismisses *ontology* as "exactly the same thing" as classical physics, he's dismissing the problem above, and making a hard compromise. He's basically saying that we cannot and should not reason about anything outside of what we can observe (this is also a crude classification because obviously he reasons beyond black hole horizons every day). This compromise is very dangerous for physics — sometimes one has to reason beyond one's horizon to formulate a complete and consistent answer. Black holes are one good example of getting of the limit. If we can extend spacetime beyond our event horizon, then why can't we accept **_the possibility of existence_** outside our "existence horizon", i.e., outside our perceived existence of the universal (and the first hand experience of our own existence inside it)? It's a wild and not well-defined idea, but all new physics starts out not well-defined.
-
-I still remember the last lecture of my first quantum mechanics course in my freshman year, taught by Prof. Michael Peskin. He discussed the interpretations of quantum mechanics. I forgot the exact arguments, but after rejecting other interpretations (including Copenhagen and hidden variable), he resorted to Many-Worlds, citing "Once you eliminate the impossible, whatever remains, no matter how improbable, must be the truth." I was not particularly satisfied. To me, once you eliminate the impossible, if whatever remains is still improbable, then maybe your imagination is not wild enough. I also remember the second time I took QM I, this time the graduate version, taught by Prof. Lenny Susskind. He stressed unitarity so much and showed us how wavefunction-collapsing is unnecessary (it was never well-defined anyway, unless you impose it). Unitarity is so important that triggered his "black hole war".
-
-The point of mentioning my two professors is that the interpretation problem of quantum mechanics has never been settled, and people who hold opinions contrary to Copenhagen should be respected. Lubos, on the other hand, tries to convince people that this problem has been settled, and actually settled for ninety years. He is either lying or delusional himself.
diff --git a/source/_posts/2015-02-24-the-new-onedrive-api.md b/source/_posts/2015-02-24-the-new-onedrive-api.md
deleted file mode 100644
index 28067c36..00000000
--- a/source/_posts/2015-02-24-the-new-onedrive-api.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-layout: post
-title: "The new OneDrive API"
-date: 2015-02-24 18:31:19 -0800
-comments: true
-categories: 
----
-Microsoft released the new OneDrive API today. See the blog post announcement [here](https://blog.onedrive.com/the-new-onedrive-api/). One highlight is that [large file upload](http://onedrive.github.io/items/upload_large_files.htm) is now officially supported. Previously, large file upload was handled with a semi-official API using the BITS protocol; the only documentation was a [gist](https://gist.github.com/rgregg/37ba8929768a62131e85). Now it is handled through standard HTTP `POST`. With this major release, there's likely a lot of work to be done with [python-onedrive](https://github.com/mk-fg/python-onedrive). I have opened an issue: `mk-fg/python-onedrive#52` — [New OneDrive API support](https://github.com/mk-fg/python-onedrive/issues/52).
-
-Interestingly, the new OneDrive API doc is hosted on GitHub Pages — [onedrive.github.io](http://onedrive.github.io), rather than MSDN. Exactly a week ago I wrote a piece, "[Microsoft is getting cool (but not its website)](http://zmwangx.github.io/blog/2015/02/17/microsoft-is-getting-cool-but-not-its-website/)". Looks like they are doing something about their website (or better put, their online identity), too.
diff --git a/source/_posts/2015-03-22-back-up-os-x-app-icons.md b/source/_posts/2015-03-22-back-up-os-x-app-icons.md
deleted file mode 100644
index 7f9eec4b..00000000
--- a/source/_posts/2015-03-22-back-up-os-x-app-icons.md
+++ /dev/null
@@ -1,46 +0,0 @@
----
-layout: post
-title: "Back up OS X app icons"
-date: 2015-03-22 16:58:50 -0700
-comments: true
-categories: 
----
-OS X application icons are valuable assets, and it's interesting to see how they evolve over time. This is especially the case when we upgraded to OS X 10.10 Yosemite, when Apple and many design-aware third party developers overhauled (mainly flattened) their icons.
-
-However, we lose all the old icons when we do a major OS upgrade. Technically they still live in Time Machine backups, but those are a pain to pull out. Therefore, I wrote a script just now to back up app icons of all applications living in `/Applications` (including those symlinked to `/Applications`, e.g., apps installed through `brew cask`) and its level-one subdirectories, and `/System/Library/CoreServices` (for `Finder.app` and such). Here's the script:
-
-```bash backup-app-icons
-#!/usr/bin/env bash
-function app_version
-{
-    # $1 is the path to the app
-    /usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "$1"/Contents/Info.plist 2>/dev/null || date +%Y%m%d
-}
- 
-function app_icon_path
-{
-    # $1 is the path to the app
-    filename=$(/usr/libexec/PlistBuddy -c "print CFBundleIconFile" "$1"/Contents/Info.plist 2>/dev/null)
-    [[ -n ${filename} ]] || return
-    filename=$(basename "${filename}" .icns)
-    echo "$1/Contents/Resources/${filename}.icns"
-}
- 
-function process_app
-{
-    # $1 is the path to the app
-    name=$(basename "$1" .app | tr -d ' ')
-    path=$(realpath -e "$1") || { echo "${RED}error: broken link '${path}'${RESET}" >&2; return 1; }
-    version=$(app_version "${path}")
-    icon_path=$(app_icon_path "${path}")
-    [[ -n ${icon_path} ]] || { echo "${YELLOW}warning: '$1' has no app icon${RESET}"; return 1; }
-    [[ -f ${icon_path} ]] || { echo "${RED}error: '${icon_path}' does not exist${RESET}" >&2; return 1; }
-    cp "${icon_path}" "${name}-${version}.icns"
-    echo "${name}-${version}.icns"
-}
- 
-find /Applications -maxdepth 2 -name '*.app' | while read app; do process_app "${app}"; done
-find /System/Library/CoreServices -maxdepth 1 -name '*.app' | while read app; do process_app "${app}"; done
-```
-
-The script is also available as a [gist](https://gist.github.com/zmwangx/fad97e085045a21ebc1d).
diff --git a/source/_posts/2015-04-26-using-python-3-with-emacs-jedi.md b/source/_posts/2015-04-26-using-python-3-with-emacs-jedi.md
deleted file mode 100644
index 5a6f12ea..00000000
--- a/source/_posts/2015-04-26-using-python-3-with-emacs-jedi.md
+++ /dev/null
@@ -1,31 +0,0 @@
----
-layout: post
-title: "Using Python 3 with Emacs Jedi"
-date: 2015-04-26 21:19:14 -0700
-comments: true
-categories: 
----
-Recently I'm working on [a hobby project in Python](https://github.com/zmwangx/storyboard), which means editing Python source files a lot. I've been using [Emacs Jedi](https://github.com/tkf/emacs-jedi) for almost as long as I've been writing Python, and it has been pretty helpful at completing away long names.
-
-However, Jedi uses `python` by default, which means `python2` on most of our systems at this point. Occasionally I'm writing Python 3 specific code but Jedi completes to Python 2 or refuses to complete; for the record, I enjoy writing and debugging Python 3.3+ much better than 2.7 (I realized this after trying to create a code base that is backward compatible with 2.7, which means reinventing the wheel or introducing annoying branches from time to time). So naturally I'm looking into using Python 3 in Jedi.
-
-The [official docs](https://tkf.github.io/emacs-jedi/latest/#how-to-use-python-3-or-any-other-specific-version-of-python) has been confusing and unhelpful at least for me, since it insists on setting up the virtualenv from within Emacs, and it failed for me. Why can't I set up the virtualenv myself? Turns out I can, and it's incredibly simple. The commands below assume that you have installed Jedi and friends (well, dependencies) using `package.el`.
-
-```bash
-mkdir -p ~/.emacs.d/.python-environments
-virtualenv -p /usr/local/bin/python3 ~/.emacs.d/.python-environments/jedi  # or whatever your python3 path is
-# If you feel like installing the server with 'M-x jedi:install-server', also do the following
-~/.emacs.d/.python-environments/jedi/bin/pip install --upgrade ~/.emacs.d/elpa/jedi-20150109.2230/  # you might need to change the version number
-```
-
-And that's it. Put the following in your `~/.emacs`:
-
-```emacs-lisp
-(add-hook 'python-mode-hook 'jedi:setup)
-(setq jedi:complete-on-dot t)
-(setq jedi:environment-root "jedi")
-```
-
-where the first two lines should be there whether you want to use Python 3 or not — so only the third line is new, and its meaning is obvious.
-
-At last, start Emacs and do `M-x jedi:install-server` if you haven't run the `pip` command above yet. Restart Emacs (if necessary). That's it. Enjoy your Jedi with Python 3. (Type `import conf`, for instance, to be convinced that you're really autocompleting Python 3).
diff --git a/source/_posts/2015-05-03-why-oh-my-zsh-is-completely-broken.md b/source/_posts/2015-05-03-why-oh-my-zsh-is-completely-broken.md
deleted file mode 100644
index 3d682897..00000000
--- a/source/_posts/2015-05-03-why-oh-my-zsh-is-completely-broken.md
+++ /dev/null
@@ -1,150 +0,0 @@
----
-layout: post
-title: "Why Oh My Zsh is completely broken"
-date: 2015-05-03 17:15:49 -0700
-comments: true
-categories: 
----
-Today I moved from [Oh My Zsh](https://github.com/robbyrussell/oh-my-zsh) from [Prezto](https://github.com/sorin-ionescu/prezto), after using Oh My Zsh for about three years since 2012. I'll try to shed some light on the reasons in this post.
-
-Z shell is a rather complicated shell (compared to Bash), with a hell lot of builtins and a complex completion system. The complexity makes it powerful, but also makes it intimidating to the mortal; moreover, it doesn't look as sweet as it could be out of box. Most mortals, me included, want a interactive shell that's sweet and "just works", so we need wizards to guide us in configuring this beast. Oh My Zsh and Prezto are just two of such configuration frameworks. Oh My Zsh is slightly older: the first commit of Oh My Zsh dates back to [August 2009](https://github.com/robbyrussell/oh-my-zsh/commit/e20401e04e057a39c228dbb99dda68ec7fa4235a), while Prezto was forked from Oh My Zsh in [February 2011](https://github.com/sorin-ionescu/prezto/commit/8d487d4f6c2d38cb108d7c8c0c2de9f0385da402), and has since been completely rewritten. `robbyrussell/oh-my-zsh` as of today has 23,610 stars on GitHub, while `sorin-ionescu/prezto` has 4,069. This doesn't imply Oh My Zsh is any better — I guess the fancy name of Oh My Zsh earned it a lot of undeserved stars; you'll see why soon.
-
-I was hardly involved in Oh My Zsh development, and I haven't even carefully inspected Oh My Zsh's source code until yesterday, so my soon-to-come complaints about oh-my-zsh might not be completely true. But here it is: **Oh My Zsh brings the worst of community-driven development, where the "community" knows not of what it is doing, and just wants to get things done in the sloppiest way possible.** Let's look at some examples. All discussions are based on [`1400346`](https://github.com/robbyrussell/oh-my-zsh/commit/140034605edd0f72c548685d39e49687a44c1b23), the latest commit at the time of writing.
-
-## The core lib hodgepodge
-
-First, look at Oh My Zsh's core [lib](https://github.com/robbyrussell/oh-my-zsh/tree/140034605edd0f72c548685d39e49687a44c1b23/lib):
-
-```
-bzr.zsh         directories.zsh  grep.zsh          misc.zsh                   spectrum.zsh
-completion.zsh  functions.zsh    history.zsh       nvm.zsh                    termsupport.zsh
-correction.zsh  git.zsh          key-bindings.zsh  prompt_info_functions.zsh  theme-and-appearance.zsh
-```
-
-Wait, why do I see `bzr.zsh`, `git.zsh`, and even `nvm.zsh` in the core lib? The answer is that they are here because they define functions (`bzr_prompt_info`, `git_prompt_info`, `nvm_prompt_info`, etc.) that are called from many themes. But why are all of these mandatory (all files in `lib` are sourced from `oh-my-zsh.sh`)? Why should I load `bzr.sh` and `nvm.zsh` when I don't use Bazaar and NVM at all (well not really, I use [git-remote-bzr](https://github.com/felipec/git-remote-bzr) when I have to clone a Bazaar repo)? And since we already have `bzr.sh`, `git.zsh` and `nvm.zsh` in the core library, why don't we also have `hg.zsh`, `rvm.zsh`, `svn.zsh`, `virtualenv.zsh`, just to name a few? Apparently, Oh My Zsh put these marginal things in the core because there's no easy way to load a plugin from a theme, except an ugly `source` with the full path of the plugin, which is also how plugins are loaded in `oh-my-zsh.sh`.
-
-Meanwhile, Prezto does it right. Prezto is highly modular, with the `pmodload` function defined in [`init.zsh`](https://github.com/sorin-ionescu/prezto/blob/08676a273eba1781ddcb63c4f89cfff9bd62eac4/init.zsh) to load modules. That's about the entirety of Prezto's core; everything else are in optional [modules](https://github.com/sorin-ionescu/prezto/blob/08676a273eba1781ddcb63c4f89cfff9bd62eac4/modules), including essential configs like `editor` (ZLE configs), `completion`, and `prompt`. Note that module loading order matters in some cases, but still, working with Prezto's modular structure is a joy. Apart from `init.zsh` and `modules/`, Prezto repo does contain a [`runcoms`](https://github.com/sorin-ionescu/prezto/tree/08676a273eba1781ddcb63c4f89cfff9bd62eac4/runcoms) directory with the rc files, but those are just recommendations that one may disregard. In fact, there are a total of eight lines related to Prezto in my `.zshrc`, and nowhere else (note that I only switched to Prezto today, so this freshly baked `.zshrc` is subject to change):
-
-```sh Excerpt of .zshrc
-# prezto
-zstyle ':prezto:*:*' color 'yes'
-zstyle ':prezto:environment:termcap' color 'no' # disable coloring of less, which is insanely ugly
-zstyle ':prezto:load' pmodule environment editor history directory utility colors spectrum git completion prompt ruby
-zstyle ':prezto:module:editor' key-bindings 'emacs'
-zstyle ':prezto:module:prompt' theme 'zmwangx'
-[[ "$OSTYPE" == darwin* ]] && export BROWSER='open'
-source ~/.zprezto/init.zsh
-```
-
-Here `zmwangx` is my [personal theme](https://github.com/zmwangx/prezto/blob/master/modules/prompt/functions/prompt_zmwangx_setup) that looks like [this](https://i.imgur.com/nCBK8ZB.png).
-
-## Incredibly poor code quality
-
-Oh My Zsh's code quality is incredibly poor. Even within the core library. Pick any file from `lib/`, and you'll be amazed by the hot mess in front of your eyes. There's no coding standard whatsoever:
-
-* You can find four-space indents and two-space indents mixed [in the same file](https://github.com/robbyrussell/oh-my-zsh/blob/140034605edd0f72c548685d39e49687a44c1b23/lib/functions.zsh);
-* You can find function definitions with the `function` keyword and without [in the same file](https://github.com/robbyrussell/oh-my-zsh/blob/140034605edd0f72c548685d39e49687a44c1b23/lib/git.zsh);
-* You can find [167-character-long lines](https://github.com/robbyrussell/oh-my-zsh/blob/140034605edd0f72c548685d39e49687a44c1b23/lib/functions.zsh#L2) mixed with early-broken lines (yes, sometimes [within the same file](https://github.com/robbyrussell/oh-my-zsh/blob/140034605edd0f72c548685d39e49687a44c1b23/lib/git.zsh#L69));
-* You can find completely commented out blocks of code [in the core lib](https://github.com/robbyrussell/oh-my-zsh/blob/140034605edd0f72c548685d39e49687a44c1b23/lib/key-bindings.zsh#L70-L87), where the average user is not supposed to touch;
-
-I guess the list could go on; I didn't spend more time inspecting this crap.
-
-We were discussing styles, but obviously style isn't the only problem with this code base. Next onto a case study of how Oh My Zsh does something in the most inefficient way possible. Let's have a look at [the `git.zsh` file](https://github.com/robbyrussell/oh-my-zsh/blob/140034605edd0f72c548685d39e49687a44c1b23/lib/git.zsh). It suffers from almost all problems we have talked about so far, but let's focus specifically on [the `git_prompt_status` function](https://github.com/robbyrussell/oh-my-zsh/blob/140034605edd0f72c548685d39e49687a44c1b23/lib/git.zsh#L78-L122):
-
-```sh
-git_prompt_status() {
-  INDEX=$(command git status --porcelain -b 2> /dev/null)
-  STATUS=""
-  if $(echo "$INDEX" | command grep -E '^\?\? ' &> /dev/null); then
-    STATUS="$ZSH_THEME_GIT_PROMPT_UNTRACKED$STATUS"
-  fi
-  if $(echo "$INDEX" | grep '^A  ' &> /dev/null); then
-    STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS"
-  elif $(echo "$INDEX" | grep '^M  ' &> /dev/null); then
-    STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS"
-  fi
-  if $(echo "$INDEX" | grep '^ M ' &> /dev/null); then
-    STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
-  elif $(echo "$INDEX" | grep '^AM ' &> /dev/null); then
-    STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
-  elif $(echo "$INDEX" | grep '^ T ' &> /dev/null); then
-    STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
-  fi
-  if $(echo "$INDEX" | grep '^R  ' &> /dev/null); then
-    STATUS="$ZSH_THEME_GIT_PROMPT_RENAMED$STATUS"
-  fi
-  if $(echo "$INDEX" | grep '^ D ' &> /dev/null); then
-    STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
-  elif $(echo "$INDEX" | grep '^D  ' &> /dev/null); then
-    STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
-  elif $(echo "$INDEX" | grep '^AD ' &> /dev/null); then
-    STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
-  fi
-  if $(command git rev-parse --verify refs/stash >/dev/null 2>&1); then
-    STATUS="$ZSH_THEME_GIT_PROMPT_STASHED$STATUS"
-  fi
-  if $(echo "$INDEX" | grep '^UU ' &> /dev/null); then
-    STATUS="$ZSH_THEME_GIT_PROMPT_UNMERGED$STATUS"
-  fi
-  if $(echo "$INDEX" | grep '^## .*ahead' &> /dev/null); then
-    STATUS="$ZSH_THEME_GIT_PROMPT_AHEAD$STATUS"
-  fi
-  if $(echo "$INDEX" | grep '^## .*behind' &> /dev/null); then
-    STATUS="$ZSH_THEME_GIT_PROMPT_BEHIND$STATUS"
-  fi
-  if $(echo "$INDEX" | grep '^## .*diverged' &> /dev/null); then
-    STATUS="$ZSH_THEME_GIT_PROMPT_DIVERGED$STATUS"
-  fi
-  echo $STATUS
-}
-```
-
-**This one single function intended to be invoked from a precmd hook (basically excuted every time the prompt is printed), calls `grep` a staggering 14 times inside command substitutions, forking the process 28 times — while all the greps can be replaced with pattern/regex matching right within the shell.** Keep in mind that forking is the most expensive operation of the shell. For instance, `$(echo "$INDEX" | grep '^A  ' &> /dev/null)` may well be replaced with
-
-```sh
-[[ $INDEX == *$'\nA  '* ]]
-```
-
-or
-
-```sh
-[[ $INDEX =~ $'\nA  ' ]]
-```
-
-(Note that the `git status --porcelain -b` call always prints the branch info such as `## master...origin/master` in the first line, so `A  ` — that is, A followed by two spaces, if present at the beginning of any line, must be preceded by a newline; that's why the above works.) All other grep calls can be similarly replaced with pattern/regex matching. No forking.
-
-By the way, whoever wrote this function seems to be unaware of the `-q,--quite,--silent` switch of `grep` (which should be available in all implementations), and every call is littered with `&> /dev/null`. In fact, using the `-q` switch is even (slightly) faster: a reasonable implementation of `-q` exits immediately when a match is found, while what is written here waits until all input is processed.
-
-I haven't exhausted the problems with this function just yet. As a bonus: despite being awfully inefficient, **this function *can't even be used* in many cases for which it is designed.** You might have noticed that the order of different status bits is completely fixed by whoever wrote this function (by the way, all those `$ZSH_THEME_GIT_PROMPT_*` variables are documented nowhere, so one who wants to write a theme has to dig into the source — only to find the function useless expect for polluting the namespace). If one wants to use a different order, or put some of the bits in `RPROMPT`, one has to roll his own (or good luck parsing its output). In fact, even a [dumbed down function `git_prompt_info`](https://github.com/robbyrussell/oh-my-zsh/blob/140034605edd0f72c548685d39e49687a44c1b23/lib/git.zsh#L2-L8), which only prints the branch name and whether it's dirty, is similarly uncustomizable; [the `gallois` theme](https://github.com/robbyrussell/oh-my-zsh/blob/140034605edd0f72c548685d39e49687a44c1b23/themes/gallois.zsh-theme), my first theme and on which I later based my own theme, needs to define a `git_custom_status` function to achieve what it needs — otherwise something as simple as adding a pair of brackets around the branch name is super painful.
-
-**One might wonder how Prezto solves the same problem. The answer is in [the file `modules/git/functions/git-info`](https://github.com/sorin-ionescu/prezto/blob/08676a273eba1781ddcb63c4f89cfff9bd62eac4/modules/git/functions/git-info). The `git-info` function does more, and again in a highly modular way (without grep calls, for God's sake): status bits or their combinations are [formatted on demand with `zformat` and stored in an associative array `git_info`](https://github.com/sorin-ionescu/prezto/blob/08676a273eba1781ddcb63c4f89cfff9bd62eac4/modules/git/functions/git-info#L393-L416), where users specify format strings via `zstyle` with [thoroughly documented escape sequences](https://github.com/sorin-ionescu/prezto/tree/08676a273eba1781ddcb63c4f89cfff9bd62eac4/modules/git#theming). Very beautiful solution.**
-
-## The completely broken community contribution process
-
-I'm not sure if the project maintainers are Zsh wizards (I'm afraid not). I'll just assume that most of the code with incredibly poor quality comes from community contribution. Okay, community. But even the community contribution process is completely broken.
-
-At the time of writing there are 159 open issues and 446 open pull requests in `robbyrussell/oh-my-zsh` (the stats are 13/35 in `sorin-ionescu/prezto` — not proportional to the stars or forks). There's even [a PR called "Easy-to-Merge"](https://github.com/robbyrussell/oh-my-zsh/pull/3809) that is said to collect PRs that are either extremely simple fixes or have been discussed–tested–and–signed-off (wait, then why aren't they already merged?). This makes it almost impossible to open new, substantial PRs (like fixing the `git_prompt_status` above) — God knows whether other people have already proposed the same fix, or a different fix for the same problem, whether it's been discussed–tested–and–signed-off, and how much discussion will be needed for a new PR.
-
-You might infer from the above that the actually merged PRs are discussed–tested–and–signed-off. Well, of course not (think about the code quality), and here's one more case study.
-
-The only time I [submitted a PR](https://github.com/robbyrussell/oh-my-zsh/pull/3591) is when [a previous PR](https://github.com/robbyrussell/oh-my-zsh/pull/3564) broke aliases of the `ls` family, which most of us run tens to hundreds of times every day. The `-h` option was stripped from all aliases but one (which was ridiculous since the option seemed to be lost during copy/paste), and anyone who used the affected aliases regularly and lived with the PR for ten minutes should notice. Apparently nobody looked at the diffs before merging, or nobody cared (before I and one other guy jumped in). My PR was merged three days later; the delay was okay.
-
-[In another instance](https://github.com/robbyrussell/oh-my-zsh/pull/3341), the delay was totally unbearable. [grep 2.21](https://savannah.gnu.org/forum/forum.php?forum_id=8152) was released on November 23, 2014, and it deprecated `GREP_OPTIONS`. Oh My Zsh was using `GREP_OPTIONS` back then, so anyone who upgraded to grep 2.21 and used grep regularly was getting a lot of deprecation warnings (oh, before you ask, `grep.zsh` is the core lib). Core lib stuff spitting deprecation warnings on all platforms all the time is a pretty big thing, right? There were multiple ways to fix this problem, and all of them were trivial to anyone with a reasonable amount of knowledge of Zsh. However, there were quite a bit of discussions spanning multiple issues and PRs (most notably [this one](https://github.com/robbyrussell/oh-my-zsh/pull/3341)). And despite all the discussions, not a single maintainer or collaborator joined or showed any interest, and [a fix was merged not until December 14, 2014](https://github.com/robbyrussell/oh-my-zsh/pull/3403). Of course there are temporary fixes (remember, the issue was trivial to begin with), but the problem must be confusing for the less-proficient Zsh users during the twenty day window.
-
-## Easter egg
-
-One more thing, among countless other problems: the recommended way to install Oh My Zsh is either
-
-    curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh
-
-or
-
-    wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O - | sh
-
-Cool, huh? How many of you have the `--no-check-certificate` option of `wget` automatically turned on? Thankfully there's no `sudo` in front.
-
-## Summary
-
-Oh My Zsh was a great idea when it took off. Over the years however, through low-quality community contributions from people who barely understand Zsh (and the right approaches to shell scripting), it evolved into a beast that no one except the maintainers could seriously contribute to; yet the maintainers seem to be pretty satisfied with it.
-
-Therefore, I'm moving to Prezto, the project with far better modularity and code quality. In fact, this rant all began from yesterday, when I was about to embark on a stripped down Zsh configuration system for myself. I was thinking about borrowing code from both Oh My Zsh and Prezto; but after reading some code from both projects, I soon realized that Oh My Zsh is totally crap and Prezto can be taken almost unmodified. I hope that more people will take a look at Prezto, realize that it's infinitely better than the famed Oh My Zsh, fork it, and possibly submit patches.
diff --git a/source/assets/jwplayer/glow/controlbar/background.png b/source/assets/jwplayer/glow/controlbar/background.png
deleted file mode 100644
index c2824cc4..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/background.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/blankButton.png b/source/assets/jwplayer/glow/controlbar/blankButton.png
deleted file mode 100644
index 010159f3..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/blankButton.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/divider.png b/source/assets/jwplayer/glow/controlbar/divider.png
deleted file mode 100644
index 77cd829a..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/divider.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/fullscreenButton.png b/source/assets/jwplayer/glow/controlbar/fullscreenButton.png
deleted file mode 100644
index e06aa50c..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/fullscreenButton.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/fullscreenButtonOver.png b/source/assets/jwplayer/glow/controlbar/fullscreenButtonOver.png
deleted file mode 100644
index d2bc4fc7..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/fullscreenButtonOver.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/muteButton.png b/source/assets/jwplayer/glow/controlbar/muteButton.png
deleted file mode 100644
index 40c40ab2..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/muteButton.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/muteButtonOver.png b/source/assets/jwplayer/glow/controlbar/muteButtonOver.png
deleted file mode 100644
index 96fe7bb0..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/muteButtonOver.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/normalscreenButton.png b/source/assets/jwplayer/glow/controlbar/normalscreenButton.png
deleted file mode 100644
index 22295074..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/normalscreenButton.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/normalscreenButtonOver.png b/source/assets/jwplayer/glow/controlbar/normalscreenButtonOver.png
deleted file mode 100644
index 15db44d4..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/normalscreenButtonOver.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/pauseButton.png b/source/assets/jwplayer/glow/controlbar/pauseButton.png
deleted file mode 100644
index e399bf34..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/pauseButton.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/pauseButtonOver.png b/source/assets/jwplayer/glow/controlbar/pauseButtonOver.png
deleted file mode 100644
index 409d89d2..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/pauseButtonOver.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/playButton.png b/source/assets/jwplayer/glow/controlbar/playButton.png
deleted file mode 100644
index f8d9a007..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/playButton.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/playButtonOver.png b/source/assets/jwplayer/glow/controlbar/playButtonOver.png
deleted file mode 100644
index 3fe28484..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/playButtonOver.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/timeSliderBuffer.png b/source/assets/jwplayer/glow/controlbar/timeSliderBuffer.png
deleted file mode 100644
index 73b371ab..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/timeSliderBuffer.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/timeSliderCapLeft.png b/source/assets/jwplayer/glow/controlbar/timeSliderCapLeft.png
deleted file mode 100644
index 72322171..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/timeSliderCapLeft.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/timeSliderCapRight.png b/source/assets/jwplayer/glow/controlbar/timeSliderCapRight.png
deleted file mode 100644
index 626444a6..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/timeSliderCapRight.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/timeSliderProgress.png b/source/assets/jwplayer/glow/controlbar/timeSliderProgress.png
deleted file mode 100644
index 132a8e7d..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/timeSliderProgress.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/timeSliderRail.png b/source/assets/jwplayer/glow/controlbar/timeSliderRail.png
deleted file mode 100644
index 27851dfd..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/timeSliderRail.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/unmuteButton.png b/source/assets/jwplayer/glow/controlbar/unmuteButton.png
deleted file mode 100644
index 3658453c..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/unmuteButton.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/controlbar/unmuteButtonOver.png b/source/assets/jwplayer/glow/controlbar/unmuteButtonOver.png
deleted file mode 100644
index 138ebb35..00000000
Binary files a/source/assets/jwplayer/glow/controlbar/unmuteButtonOver.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/display/background.png b/source/assets/jwplayer/glow/display/background.png
deleted file mode 100644
index 391152f5..00000000
Binary files a/source/assets/jwplayer/glow/display/background.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/display/bufferIcon.png b/source/assets/jwplayer/glow/display/bufferIcon.png
deleted file mode 100644
index a3819c1e..00000000
Binary files a/source/assets/jwplayer/glow/display/bufferIcon.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/display/muteIcon.png b/source/assets/jwplayer/glow/display/muteIcon.png
deleted file mode 100644
index e0408bbd..00000000
Binary files a/source/assets/jwplayer/glow/display/muteIcon.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/display/playIcon.png b/source/assets/jwplayer/glow/display/playIcon.png
deleted file mode 100644
index cb384278..00000000
Binary files a/source/assets/jwplayer/glow/display/playIcon.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/dock/button.png b/source/assets/jwplayer/glow/dock/button.png
deleted file mode 100644
index 391152f5..00000000
Binary files a/source/assets/jwplayer/glow/dock/button.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/glow.xml b/source/assets/jwplayer/glow/glow.xml
deleted file mode 100644
index 71bdced0..00000000
--- a/source/assets/jwplayer/glow/glow.xml
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version="1.0"?>
-<skin version="1.1" name="Glow" author="LongTail Video">
-
-	<settings>
-		<setting name="backcolor" value="0x000000" />
-		<setting name="frontcolor" value="0xeeeeee" />
-		<setting name="lightcolor" value="0xeeeeee" />
-		<setting name="screencolor" value="0x000000" />
-	</settings>
-
-	<components>
-		<component name="controlbar">
-			<settings>
-				<setting name="margin" value="0" />
-				<setting name="fontsize" value="11" />
-				<setting name="fontcolor" value="0xEEEEEE" />
-				<setting name="buttoncolor" value="0xEEEEEE" />
-			</settings>
-
-			<layout>
-				<group position="left">
-					<button name="play" />
-					<text name="elapsed" />
-				</group>
-				<group position="center">
-					<slider name="time" />
-				</group>
-				<group position="right">
-					<text name="duration" />
-					<button name="blank" />
-					<button name="mute" />
-					<button name="fullscreen" />
-				</group>
-			</layout>
-
-			<elements>
-				<element name="background" src="background.png" />
-				<element name="capLeft" src="divider.png" />
-				<element name="capRight" src="divider.png" />
-				<element name="divider" src="divider.png" />
-				<element name="blankButton" src="blankButton.png" />
-				<element name="fullscreenButton" src="fullscreenButton.png" />
-				<element name="fullscreenButtonOver" src="fullscreenButtonOver.png" />
-				<element name="muteButton" src="muteButton.png" />
-				<element name="muteButtonOver" src="muteButtonOver.png" />
-				<element name="pauseButton" src="pauseButton.png" />
-				<element name="pauseButtonOver" src="pauseButtonOver.png" />
-				<element name="playButton" src="playButton.png" />
-				<element name="playButtonOver" src="playButtonOver.png" />
-				<element name="timeSliderBuffer" src="timeSliderBuffer.png" />
-				<element name="timeSliderCapLeft" src="timeSliderCapLeft.png" />
-				<element name="timeSliderCapRight" src="timeSliderCapRight.png" />
-				<element name="timeSliderProgress" src="timeSliderProgress.png" />
-				<element name="timeSliderRail" src="timeSliderRail.png" />
-				<element name="normalscreenButton" src="normalscreenButton.png" />
-				<element name="normalscreenButtonOver" src="normalscreenButtonOver.png" />
-				<element name="unmuteButton" src="unmuteButton.png" />
-				<element name="unmuteButtonOver" src="unmuteButtonOver.png" />
-				<element name="volumeSliderRail" src="divider.png" />
-				<element name="volumeSliderProgress" src="divider.png" />
-			</elements>
-		</component>
-		
-		<component name="display">
-			<settings>
-				<setting name="bufferinterval" value="250" />
-				<setting name="bufferrotation" value="90" />
-			</settings>
-			<elements>
-				<element name="background" src="background.png" />
-				<element name="playIcon" src="playIcon.png" />
-				<element name="muteIcon" src="muteIcon.png" />
-				<element name="errorIcon" src="bufferIcon.png" />
-				<element name="bufferIcon" src="bufferIcon.png" />
-			</elements>
-		</component>
-		
-		<component name="dock">
-			<settings>
-				<setting name="fontcolor" value="0xFFFFFF" />
-			</settings>
-			<elements>
-				<element name="button" src="button.png" />
-			</elements>
-		</component>
-
-		<component name="playlist">
-			<settings>
-				<setting name="fontcolor" value="0xEEEEEE" />
-				<setting name="overcolor" value="0xFFFFFF" />
-				<setting name="activecolor" value="0xFFFFFF" />
-				<setting name="backgroundcolor" value="0x333333" />
-			</settings>
-			<elements>
-				<element name="item" src="item.png" />
-				<element name="itemOver" src="itemOver.png" />
-				<element name="sliderCapBottom" src="sliderCapBottom.png" />
-				<element name="sliderCapTop" src="sliderCapTop.png" />
-				<element name="sliderRail" src="sliderRail.png" />
-				<element name="sliderThumb" src="sliderThumb.png" />
-			</elements>
-		</component>
-
-		<component name="sharing">
-			<elements>
-				<element name="embedIcon" src="embedIcon.png" />
-				<element name="embedScreen" src="embedScreen.png" />
-				<element name="shareIcon" src="shareIcon.png" />
-				<element name="shareScreen" src="shareScreen.png" />
-			</elements>
-		</component>
-
-	</components>
-
-</skin>
\ No newline at end of file
diff --git a/source/assets/jwplayer/glow/playlist/item.png b/source/assets/jwplayer/glow/playlist/item.png
deleted file mode 100644
index 812592c3..00000000
Binary files a/source/assets/jwplayer/glow/playlist/item.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/playlist/itemOver.png b/source/assets/jwplayer/glow/playlist/itemOver.png
deleted file mode 100644
index 549f3721..00000000
Binary files a/source/assets/jwplayer/glow/playlist/itemOver.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/playlist/sliderCapBottom.png b/source/assets/jwplayer/glow/playlist/sliderCapBottom.png
deleted file mode 100644
index 048cc623..00000000
Binary files a/source/assets/jwplayer/glow/playlist/sliderCapBottom.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/playlist/sliderCapTop.png b/source/assets/jwplayer/glow/playlist/sliderCapTop.png
deleted file mode 100644
index 65c463a0..00000000
Binary files a/source/assets/jwplayer/glow/playlist/sliderCapTop.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/playlist/sliderRail.png b/source/assets/jwplayer/glow/playlist/sliderRail.png
deleted file mode 100644
index 121778af..00000000
Binary files a/source/assets/jwplayer/glow/playlist/sliderRail.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/playlist/sliderThumb.png b/source/assets/jwplayer/glow/playlist/sliderThumb.png
deleted file mode 100644
index 118c3e03..00000000
Binary files a/source/assets/jwplayer/glow/playlist/sliderThumb.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/sharing/embedIcon.png b/source/assets/jwplayer/glow/sharing/embedIcon.png
deleted file mode 100644
index 3394ac9c..00000000
Binary files a/source/assets/jwplayer/glow/sharing/embedIcon.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/sharing/embedScreen.png b/source/assets/jwplayer/glow/sharing/embedScreen.png
deleted file mode 100644
index b4059754..00000000
Binary files a/source/assets/jwplayer/glow/sharing/embedScreen.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/sharing/shareIcon.png b/source/assets/jwplayer/glow/sharing/shareIcon.png
deleted file mode 100644
index eae1d4e7..00000000
Binary files a/source/assets/jwplayer/glow/sharing/shareIcon.png and /dev/null differ
diff --git a/source/assets/jwplayer/glow/sharing/shareScreen.png b/source/assets/jwplayer/glow/sharing/shareScreen.png
deleted file mode 100644
index 695ec949..00000000
Binary files a/source/assets/jwplayer/glow/sharing/shareScreen.png and /dev/null differ
diff --git a/source/assets/jwplayer/player.swf b/source/assets/jwplayer/player.swf
deleted file mode 100644
index 0eee3797..00000000
Binary files a/source/assets/jwplayer/player.swf and /dev/null differ
diff --git a/source/atom.xml b/source/atom.xml
deleted file mode 100644
index 403328f3..00000000
--- a/source/atom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
----
-layout: null
----
-<?xml version="1.0" encoding="utf-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom">
-
-  <title><![CDATA[{{ site.title | cdata_escape }}]]></title>
-  <link href="{{ site.url }}/atom.xml" rel="self"/>
-  <link href="{{ site.url }}/"/>
-  <updated>{{ site.time | date_to_xmlschema }}</updated>
-  <id>{{ site.url }}/</id>
-  <author>
-    <name><![CDATA[{{ site.author | strip_html }}]]></name>
-    {% if site.email %}<email><![CDATA[{{ site.email }}]]></email>{% endif %}
-  </author>
-  <generator uri="http://octopress.org/">Octopress</generator>
-
-  {% for post in site.posts limit: 20 %}
-  <entry>
-    <title type="html"><![CDATA[{% if site.titlecase %}{{ post.title | titlecase | cdata_escape }}{% else %}{{ post.title | cdata_escape }}{% endif %}]]></title>
-    <link href="{{ site.url }}{{ post.url }}"/>
-    <updated>{{ post.date | date_to_xmlschema }}</updated>
-    <id>{{ site.url }}{{ post.id }}</id>
-    <content type="html"><![CDATA[{{ post.content | expand_urls: site.url | cdata_escape }}]]></content>
-  </entry>
-  {% endfor %}
-</feed>
diff --git a/source/blog/2014-10-20-hello-octopress.md b/source/blog/2014-10-20-hello-octopress.md
new file mode 100644
index 00000000..d359f401
--- /dev/null
+++ b/source/blog/2014-10-20-hello-octopress.md
@@ -0,0 +1,35 @@
+---
+layout: post
+title: "Hello, Octopress!"
+date: 2014-10-20 16:53:00 -0700
+comments: true
+categories:
+---
+This post marks my transition from Tumblr to Octopress & GitHub Pages.
+
+I've been microblogging for a while at [zshello3.tumblr.com](http://zshello3.tumblr.com) and I liked it. Not because of readers, which I suspect I have none; but there are certainly a huge amount of information I want to dump off my mind. Back in the days I *loved* my handwritten journals, and I really poured a lot into them. Peers were usually amazed when they saw my journals. These days typing seems to be a more robust solution to keeping my thoughts, especially when the thoughts are mostly technical.
+
+Tumblr is awesome. Compared to WordPress (.com for pedantic people), it is both lightweight and beautiful (you get all the customization for free), so you quickly get to the writing. However, it is not designed for geeks, so
+
+* Customization is capped at some point;
+* I had the impression that the Markdown parser is herrendous;
+* Email publishing is a mightmare, by the way;
+* Code rendering always falls short — unless I spend a lot of time customizing (I'm pretty bad at HTML, CSS, and JS stuff).
+
+Speaking of the last point, I've always been envious of the beautiful code blocks found on Octopress blogs. So here I come!
+
+(Let me give it a try first.)
+
+``` C hello.c
+#include <stdio.h>
+
+int main(int argc, char **argv) {
+    printf("Hello, Octopress!\n")
+}
+```
+
+Gorgeous. I'll get to the theme customization later. I'm actually busy as crazy this week.
+
+Before I close this post, let me also try to embed a random gist I authored yesterday (for brewing):
+
+{% gist 828fd00bdecd6611cf40 brew.sh %}
diff --git a/source/blog/2014-10-20-help-mou-hit-1-dot-0.md b/source/blog/2014-10-20-help-mou-hit-1-dot-0.md
new file mode 100644
index 00000000..22587df4
--- /dev/null
+++ b/source/blog/2014-10-20-help-mou-hit-1-dot-0.md
@@ -0,0 +1,13 @@
+---
+layout: post
+title: "Help Mou hit 1.0"
+date: 2014-10-20 17:37:45 -0700
+comments: true
+categories:
+---
+Quick call for [Mou 1.0 fundraiser](https://www.indiegogo.com/projects/mou-1-0-markdown-editor-on-os-x-for-you) on Indiegogo. At the time of writing, it has raised $6,178/$20,000, and has 39 days to go (with 21 already passed).
+
+
+I'm actually writing this post in Mou right now. It's far less powerful than Emacs, but when I want preview-on-the-fly, Mou is the Markdown editor to go. Right now it's far from perfect; for instance, GFM fenced blocks (now included in [CommonMark](http://commonmark.org)) are not supported, so you get nonsense preview when your code block is fenced rather than indented. (Of course, Mou is even less suitable for editing an Octopress post due to the yaml metadata upfront, but that's not a big deal.)
+
+Let's hope for Mou hitting the 1.0 mark.
\ No newline at end of file
diff --git a/source/blog/2014-10-21-get-rolling.md b/source/blog/2014-10-21-get-rolling.md
new file mode 100644
index 00000000..bf8f040e
--- /dev/null
+++ b/source/blog/2014-10-21-get-rolling.md
@@ -0,0 +1,35 @@
+---
+layout: post
+title: "Get rolling"
+date: 2014-10-21 11:40:14 -0700
+comments: true
+categories:
+---
+Yesterday, on an internet forum, I saw someone’s signature, which translates to
+
+> Don’t even get started if you know you can't know from the beginning that you won't make it to the very end.
+
+This seems justified — persistence is the key to success; why even bother if you know you’ll fail? However, I have to profoundly disagree with this, and even dedicate a blog post to discussing this problem.
+
+The problem here is, the real world is much more complicated than the idealized world found in various quotes about persistence. Most of the time you have absolutely no clue where which road is leading, unless you embark on the journey, clueless. As for me, fortunately I knew I was gonna be a mathematician/physicist ever since elementary school, so the roadmap is sorta clear on the grand scale. Still, all those tiny building blocks for the ultimate goal are confusing, and even more so for things hardly related to the ultimate goal, for instance, coding, which is just a hobby and a way to simplify life — it has simplified my life in some sense, but has itself complicated my life in other ways (your life inevitably becomes more complicated when you know more and want to find out even more).
+
+And sometimes you are bound to fail — I know my code is shitty, for instance, but if I don’t get rolling, I won’t even have a working (albeit shitty) version that barely meets my needs. As another example, I was looking for a way to share and archive some photos. I started with [WordPress](http://apinkarchive.wordpress.com/), which turned out to be more formal and tiring than I’d thought. Then I ran a [Tumblr microblog](http://chorongmemories.tumblr.com/), which was great, but has certain limitations that in the end prevents it from being damn useful for myself, so in the end I went onto “indefinite hiatus.” In both cases I never declared that the thing was permanent — I was careful to say that the blogs were experimental, and I moved on when I found something better, or when they were no longer helping me. Yesterday I started yet another experiment, a [Tistory blog](http://apinkpcr.tistory.com). It is a random move triggered by something unexpected; the South Korean blogging platform is not that great, but at least it provides acceptable API access, and more importantly, I’ve got complete infrastructure built around the API to scrape photos, so it’s easy to build on top of that to automate things. It is also experimental. Again I’m not sure I long I can keep it up, but at least I’m happy with it for the time being. Being happy at the time being is the most important goal for hobbies.
+
+Choices are hard. Especially in today’s world, tools in every discipline are constantly improving, be it math, physics, programming, photography, blogging, or whatever. If you research over and over until you find “the perfect tool”, or “the perfect platform” (hint: the rank is constantly changing), you’re stuck on the first step to anywhere. In fact, reading other people’s blogs, for example, are not enough to learn what is the best — you need to at least have some working knowledge to even decide which tool or platform is more suitable for you. Therefore, the most sensible thing to do is to do a little bit of research (combined with your gut feeling), pick up something that makes you feel good at the moment, and immediately get rolling. Well, of course you need some research, otherwise you’re just kidding yourself; doing `>>> import this` in python tells you:
+
+> Now is better than never.<br>
+> Although never is often better than *right* now.
+
+Then, when you have more experience and know what’s wrong with your original choice, correct it or trash it. There’s nothing wrong with abandoning dated crap, hopping bandwagons, or whatever; that’s the nature of change and improvement, and the most sensible thing for someone as busy as you are.
+
+Up till now I've been talking about tools and platforms, so maybe it seems that I'm attacking the straw man — you may argue that the original quote is not about what tools or platforms you use, but rather, what you try to accomplish with the tools or platforms. Okay, what about the grander things in life, like mathematical research, like *the final theory*? Well, similar. I’ll quote Ravi here,
+
+> …mathematics is so rich and infinite that it is impossible to learn it systematically, and if you wait to master one topic before moving on to the next, you’ll never get anywhere. Instead, you’ll have tendrils of knowledge extending far from your comfort zone. Then you can later backfill from these tendrils, and extend your comfort zone; this is much easier to do than learning “forwards”.
+
+Ravi is always hinting at “you should get started with actual research rather than ‘prepare’ yourself”! I can’t reckon that since I’ve yet to follow Ravi’s advice, but the thinking here is crystal clear. **You shouldn’t be afraid of failure; you shouldn’t be afraid of being “not prepared enough”; you shouldn’t be afraid of getting started.** Speaking of a final theory, I’m pretty sure I’m bound to fail, I’m pretty sure I won’t see a satisfactory one in my lifetime — the inconvenient truth is that, I have the gut feeling that the ultimate explanation is unfortunately intertwined with consciousness, and we are still far from having the right tools to understand consciousness. According to Feynman, **really knowing something is hard**. It’s hard, so failure is not shameful at all. Those who won’t even get started due to fear of failing or making the wrong choice won’t fail again, since they’ve already failed at the very beginning. So, get rolling.
+
+Yesterday I read [Fire and Motion](http://www.joelonsoftware.com/articles/fog0000000339.html) on *Joel on Software*. Joel’s metaphor is really nice, but he’s essentially conveying very similar ideas.
+
+-------------------------------------------------------------------------------
+
+By the way, I wrote this post in Emacs. I don’t know why but I seem to type much faster in Emacs than in Mou. (For Markdown editing `markdown-mode`, and `typo-mode`, a minor mode I found today which is useful for inserting smart quotes and smart dashes seamlessly into md articles).
diff --git a/source/blog/2014-10-23-ripping-copy-protected-dvd-with-mpv.md b/source/blog/2014-10-23-ripping-copy-protected-dvd-with-mpv.md
new file mode 100644
index 00000000..4db51a86
--- /dev/null
+++ b/source/blog/2014-10-23-ripping-copy-protected-dvd-with-mpv.md
@@ -0,0 +1,38 @@
+---
+layout: post
+title: "Ripping copy-protected DVD with mpv"
+date: 2014-10-23 20:03:22 -0700
+comments: true
+categories:
+---
+**_11/02/2014 update:_**
+
+See [this post](/blog/2014/11/02/vobcopy-dvdbackup-etc/) for issues, explanations, and more.
+
+---
+
+**_10/25/2014 update:_**
+
+I'm such an idiot. `vobcopy` is the real, hassel-free way to go.
+
+    brew install vobcopy
+
+Then, with the DVD mounted,
+
+> **vobcopy** without any options will copy the title with the most chapters into files of 2GB size into the current working directory.
+
+Of course there are a ton of options, but I generally hate to browse through options unless I have to, so I'm happy with calling without argument.
+
+---
+
+Yesterday I was trying to rip a music video off a newly released DVD from Japan. I knew very little about how DRM (in this case, CSS) actually works and how to break it. I tried to operate directly on the VOB file with `ffmpeg` or `mpv` but both failed with a lot of header errors — I suppose more files than the VOB are required for authentication? Whatever, maybe I’ll learn the details in the future, but I don’t see the need since DVD is an outdated technology anyway.
+
+So, can we proceed from here? Most certainly. I noticed that although `mpv` won’t let me play a single VOB, I can simply hand it the DVD mount point, and it will play the whole DVD seamlessly. **Caution:** `mpv` needs to be compiled with `libdvdnav` and `libdvdread`! With brew you just do
+
+    brew install mpv --with-libdvdnav --with-libdvdread
+
+For better performance and backup, I first cloned the DVD into a `.cdr` image (DVD/CD-R Master Image) using Disk Utility (I've never tried creating/cloning image with `diskutil` CLI, so nothing to report on that). Then I mount the image, say the mount point is `/Volumes/UPBX_80165`. As said I can hand that mount point to `mpv` and it simply works, but how about extracting the MPEG-2 video stream? The `--stream-capture=<filename>` option is there just for you. In principle `--stream-dump=<filename>` should also work, but without monitoring the output and controlling where to end, I’m not sure if it will ever terminate itself when reading from a DVD (when I stream captured the DVD it just kept repeating itself until I explicitly quit with `q`). So that's it:
+
+    mpv --stream-capture=dump.mpg /Volumes/UPBX_80165
+
+Then you can torture the `dump.mpg` with `ffmpeg` however you want. The most obvious thing is to cut out the music video part, and put into a new container like MPEG-TS. Or transcode it to H.264 for your iPhone. The nice thing about `dump.mpg` is that, unless I got it wrong, there's no quality loss here — the only thing you got rid of is that goddamn DRM.
diff --git a/source/blog/2014-10-24-charles-munger-donated-$65m-to-kitp.md b/source/blog/2014-10-24-charles-munger-donated-$65m-to-kitp.md
new file mode 100644
index 00000000..9c37b99e
--- /dev/null
+++ b/source/blog/2014-10-24-charles-munger-donated-$65m-to-kitp.md
@@ -0,0 +1,23 @@
+---
+layout: post
+title: "Charles Munger donated $65M to KITP"
+date: 2014-10-24 16:41:36 -0700
+comments: true
+categories:
+---
+Today's news has it that Charles Munger made a $65 million donation to KITP at UCSB. See for instance [this article](http://nyti.ms/1D4zg24) on NYT. Of course I didn't learn it from NYT (I'm generally sick of any news other than math, physics, or IT-related ones). I learned it from [Not Even Wrong](http://www.math.columbia.edu/~woit/wordpress/?p=7247) instead (of course I don't agree with Woit, but some of his links are nice).
+
+I have no interest whatsoever in the business world, so I have no idea about Warren Buffett's business partners (although I'm still worldly enough to know Warren Buffett). However, the name Charles Munger sounded surprisingly familiar. After reading the sentence
+
+> Mr. Munger has frequently donated big sums to schools like Stanford and the Harvard-Westlake School.
+
+from the NYT article linked above, it finally hit me that Mr. Munger is the donor of the Munger Graduate Residence here at Stanford. Munger is really nice, much better than our undergrad residences AFAIK (location-wise Roble is still unbeatable for mathematicians and physicists, although Munger still kicks EV's ass).
+
+I'm glad to see more and more entrepreneurs funding physics, especially theoretical physics, whether they understand it or not. (**Aside:** Even for laypeople theoretical physics is cool isn't it, like the coolest kid in class. I won't comment on whether math is cooler, but breakthrough mathematical work certainly go largely unnoticed in the public, since theoretical physics is the last thing that laypeople can "vaguely understand". Do some name searches on Google to see how math and physics play out in the limelight — hint:
+
+* Gauss — 4,130,000 results;
+* Euler — 855,000 results;
+* Newton — 13,200,000 results;
+* Einstein — 6,330,000 results.
+
+End of aside.) Engaging in physics is plain better than engaging in some questionable philanthropy. (Have you heard that Gates Foundation invested in G4S, the largest private military and security company in the world? I’m not sure about the details — I once read that off a bathroom flyer — but that’s definitely interesting philanthropy.)
diff --git a/source/blog/2014-10-25-os-x-package-receipts.md b/source/blog/2014-10-25-os-x-package-receipts.md
new file mode 100644
index 00000000..a3695600
--- /dev/null
+++ b/source/blog/2014-10-25-os-x-package-receipts.md
@@ -0,0 +1,20 @@
+---
+layout: post
+title: "OS X package receipts"
+date: 2014-10-25 13:26:02 -0700
+comments: true
+categories:
+---
+I just learned something new. Whenever you install a `pkg` on OS X, OS X stores a receipt of what was installed in `/var/db/receipts` (I'm running OS X 10.9.5 at the time of writing), called a **bom** — bill of materials (I’d rather call it a manifest, whatever). This feature was introduced in NeXTSTEP. From `man 5 bom`:
+
+> The Mac OS X Installer uses a file system "bill of materials" to determine which files to install, remove, or upgrade. A bill of materials, **bom**, contains all the files within a directory, along with some information about each file. File information includes: the file's UNIX permissions, its owner and group, its size, its time of last modification, and so on.  Also included are a checksum of each file and information about hard links.
+
+`man 5 bom` is actually badly maintained, as it says "The bill of materials for installed packages are found within the package receipts located in /Library/Receipts," whereas those have been migrated to `/var/db/receipts` a long time ago.
+
+`.bom` files are binary, but you can access the contents via `lsbom`. For instance, to list the files installed,
+
+    lsbom -f /var/db/receipts/org.macports.MacPorts.bom
+
+Note that the paths printed are always relative to `/`. See `man 1 lsbom` for detailed option listing.
+
+(Beware when you try to clean up unwanted packages using the `lsbom` listing. Packages might overwrite files, so make sure you review the listing first and know what you are doing. "Knowing what you are doing" is the prerequisite for using `sudo` anyway.)
diff --git a/source/blog/2014-10-26-audio-cd-slash-dvd-to-iso-image-on-os-x.md b/source/blog/2014-10-26-audio-cd-slash-dvd-to-iso-image-on-os-x.md
new file mode 100644
index 00000000..7ff57bc8
--- /dev/null
+++ b/source/blog/2014-10-26-audio-cd-slash-dvd-to-iso-image-on-os-x.md
@@ -0,0 +1,30 @@
+---
+layout: post
+title: "Convert Audio CD/DVD to ISO image on OS X"
+date: 2014-10-26 23:29:47 -0700
+comments: true
+categories:
+---
+**_11/02/2014 update:_**
+
+See [this post](/blog/2014/11/02/vobcopy-dvdbackup-etc/) for issues, explanations, and more.
+
+---
+
+Today it occurred to me that I should make clones of my audio CDs (as stand-alone ISO images, I mean, not just rsyncing the AIFFs to subdirectories in `~/aud/lossless`). One can never have too many backups.
+
+Of course I could simply pack the aforementioned directories with AIFFs into ISOs — that’s not impressive. The end result might actually be the same, but I want to make the clones directly from the original CDs. It turns out that this is not so simple with the Disk Utility GUI — unlike DVDs, the “New Image” option is grayed out for Audio CDs. I’m not sure why, but maybe they want you to just use iTunes to deal with Audio CDs (which works well for all practical purposes — but theoretical curiosity never ends).
+
+So there comes `hdiutil`. `hdiutil` and `diskutil` are the utilities underlying Disk Utility. Unfortunately, so far I know little about them except for simplest things like `diskutil list`, `diskutil mount`, `hdiutil attach -stdinpass`, etc. (I'm so ignorant about anything filesystem related!) The `hdiutil` verb that makes cross-platform CD or DVD is `makehybrid`, which supports the following filesystem options: `-hfs` (holy crap, no HFS+ please! Apple ought to replace this thirty-year-old filesystem — ZFS or something better please!), `-iso`, `-joliet`, and `-udf`. For Audio CDs you use `-iso` and with `-joliet` extension:
+
+    hdiutil makehybrid -iso -joliet -o AUDIO_CD_NAME.iso SOURCE
+
+where `SOURCE` can be the mount point, the disk device file, etc. Similarly, although you can create `.cdr` images from DVDs via the Disk Utility GUI, you can also do it with `hdiutil` (which is potentially more portable — I’ve never heard a definitive answer of whether renaming `.cdr` to `.iso` really cross-platform):
+
+    hdiutil makehybrid -udf -o DVD_NAME.iso SOURCE
+
+This way CSS keys *seem* to be cloned as well, since I was able to authenticate such a CSS-protected DVD with `libdvdread`.
+
+---
+
+P.S. I sincerely hope that one day lossless music tracks are no longer distributed through CD-ROMs. So painful — even my Internet speed is more than ten times faster than the [highest transfer rate](https://en.wikipedia.org/wiki/CD-ROM#Transfer_rates) available from any CD-ROM. (I’ve heard about some websites distributing lossless music digitally, but that won’t happen to the music I care about in the near future.) I still like physical albums though — a real sense of possession. Maybe they should contain the physical goodies and some sort of access codes?
diff --git a/source/blog/2014-10-26-disk-visualizer-daisydisk.md b/source/blog/2014-10-26-disk-visualizer-daisydisk.md
new file mode 100644
index 00000000..2de4201e
--- /dev/null
+++ b/source/blog/2014-10-26-disk-visualizer-daisydisk.md
@@ -0,0 +1,18 @@
+---
+layout: post
+title: "Disk visualizer: DaisyDisk"
+date: 2014-10-26 00:02:22 -0700
+comments: true
+categories:
+---
+DaisyDisk is a pretty famous name. I’ve heard a lot that DaisyDisk is beautiful, but as a “power user” I always feel ashamed about using a disk analyzer or visualizer (although no one really cares). I’m pretty comfortable with doing most filesystem operations right in the shell, and for other tasks too tedious for the shell (like renaming a bunch of files with no obvious pattern), Finder (equipped with TotalFinder) works just fine.
+
+Today I was trying clean up my drive a bit, as there were only 22GB left. I knew where the main problem lied: a huge number of highres videos lying in `~/vid/staging`, awaiting renaming and migration to my external drive. Anyway, it would be nice to have some visualization of a detailed breakdown of my disk usage, preferably on any level I want without multiple passes of `du`. The name DaisyDisk popped up from the cache in my brain, so I headed over to their website to download it.
+
+The result is not disappointing at all. Look at this:
+
+![DaisyDisk screen shot](http://i.imgur.com/vyIwSNQ.png)
+
+Beautiful. Moreover, functional. It indeed gives me a detailed breakdown on any level, within any directory (given enough priviledge). I can also collect items I don’t want and let DaisyDisk clean up for me at once (not surprising for a disk analyzer); this feature isn’t that useful for me since I know exactly where my queues of unorganized items are — `~/Downloads`, `~/aud/staging`, `~/img/staging`, and `~/vid/staging`.
+
+By the way, DaisyDisk seems to be WinRAR-free. (Rest assured; I’m a good guy and I *will* purchase a license — these days whether to purchase the website or the MAS version is a headache, though.)
diff --git a/source/blog/2014-10-27-onedrive-goes-unlimited.md b/source/blog/2014-10-27-onedrive-goes-unlimited.md
new file mode 100644
index 00000000..256b04e6
--- /dev/null
+++ b/source/blog/2014-10-27-onedrive-goes-unlimited.md
@@ -0,0 +1,23 @@
+---
+layout: post
+title: "OneDrive goes unlimited"
+date: 2014-10-27 09:44:51 -0700
+comments: true
+categories:
+---
+**10/28/2014 Update:**
+
+Yesterday Microsoft pushed an update to OneDrive.app to MAS. After uninstalling, reinstalling, and wiping the 10 GB folder I'd like to sync (that's for photos; I upload videos via the web interface) on both client and server sides, it actually began to work. The speed was around 1 MB/s during my last sync of 10 GB worth of data. Not fast, but I will be fairly satisfied if it can keep up with that speed. Time will tell.
+
+---
+The OneDrive team just [announced on their blog](https://blog.onedrive.com/office-365-onedrive-unlimited-storage/) that
+
+> Today, storage limits just became a thing of the past with Office 365. Moving forward, all Office 365 customers will get unlimited OneDrive storage at no additional cost.
+
+Hell, I hate Microsoft, but **I have to say that this is big**. OneDrive might not be the first to offer unlimited cloud storage (not sure), but it is certainly the first one to roll it out on such a grand scale. Remember, Office 365 is just $99.99 a year. OneDrive might not be the best cloud storage service, especially for OS X customers, but unlimited is unlimited — in comparison, I pay Google $9.99 a month for 1 TB.
+
+Microsoft products are indeed pure crap on a Mac. Office for Mac 2011 is horrible (speed and bloat aside, some features are simply not implemented — try to import a UTF-8 CSV into Excel, all non-ASCII characters become underscores; Microsoft’s response was that Unicode import was not implemented yet). OneDrive.app is slow like crawl, and it never finishes syncing — always stuck on the last few megabytes, eating up 100% CPU. Thank god I only use it for backups. The web interface is okay, although Google Drive is faster — blazing fast, I can easily upload with 20+MB/s. But again, **unlimited is unlimited.**
+
+Microsoft is opening a new chapter of cloud storage. In today’s world, we have so many huge video files, so storage limit should indeed be something of the past. This is a smart move for Microsoft — when you have, say, 100 TB up there (which seems very far at this moment, but what if all contents go 4K), and if competitors don’t offer comparable plans, then you are stuck with Microsoft. And Office. Oh my god, Microsoft Office must die.
+
+Of course I don’t want to be stuck with Microsoft, so I’m looking at how Google and Apple will handle this. Google ought to offer more affordable plans, preferably also unlimited. (My 1Password still has it that I purchased Office for Mac University 2011 on Nov 12, 2012 for $99.99. That turned into a free 4-year Office 365 subscription, which contains 60 world minutes of Skype per month, 1 TB of OneDrive — oh, now it’s about to go unlimited. All for $99.99. In comparison, Google charges me $119.88 per year.) Apple wants you to save everything to iCloud, and it introduced iCloud Drive and Cloud Kit this year — but plans still start at 5 GB and tops out at 1 TB, seriously? Dude, you sell top notch hardware with huge profits; why don’t you pay your customers back by offering better cloud storage — that’s also better for iCloud.
diff --git a/source/blog/2014-10-28-google-drive-no-selective-subfolder-sync.md b/source/blog/2014-10-28-google-drive-no-selective-subfolder-sync.md
new file mode 100644
index 00000000..2383a0da
--- /dev/null
+++ b/source/blog/2014-10-28-google-drive-no-selective-subfolder-sync.md
@@ -0,0 +1,54 @@
+---
+layout: post
+title: "Google Drive — no selective subfolder sync?"
+date: 2014-10-28 20:49:24 -0700
+comments: true
+categories:
+---
+Up to this point I've been using Google Drive as an online backup service, and uploads files mostly manually, although I do sync `~/img` with the client.
+
+**Aside.** Google Drive, OneDrive, etc. don't work with symlinks. Wanna keep your stuff free and duplicate-free yet still synced to the servers? Use `rsync` to automatically reproduce your folder structure with hard links:
+
+    rsync -avzP --delete --link-dest=SOURCE/ SOURCE DESTINATION
+
+e.g.,
+
+    rsync -avzP --delete --link-dest=~/img/ ~/img/ ~/sync/GoogleDrive/img/
+
+automatically reproduces my `~/img` in the `img` directory under Google Drive's root, yet every file in the `~/img` tree is replaced by hard links to the original file, so the new structure within Google Drive takes little additional space — for the directories only.
+
+That doesn't solve every problem though, as you will see shortly. *End of aside.*
+
+So, up to this point I’ve mostly used Google Drive as an online backup service by manually uploading (huge) stuff. But at some point I’m gonna automate parts of the uploading. As it turns out, I can keep some smaller video files on my hard drive; other bigger monsters (like movies, TV shows, etc., especially a lot of 1080i Transport Streams directly from TV broadcasts) are uploaded and then moved to external drives. Some of the smaller files, including things downloaded from YouTube, live in `~/vid/etc`, and I want to sync this folder to Google Drive. What's shocking is that this is not possible with the Google Drive client — it only allows selective syncing of the top level folders. Let me repeat this:
+
+**The Google Drive client only allows selective syncing of the _top level folders_.**
+
+This is *insane*. It’s almost 2015. Everyone supports this — Dropbox, Microsoft, Box, even Baidu. Google Drive launched on April 24, 2012, that’s 2.5 years ago. [This thread](https://productforums.google.com/forum/#!topic/drive/Gs2w1BL-B9U) on Google Drive Forum, “Ability to sync only selected sub folders”, was posted on August 27, 2012, and has garnered 139 replies. They are ignored by the developers, and the accepted “answer” is to utilize Google Drive’s assign-one-file/folder-to-multiple-folders feature to create a special “sync” directory. Okay, that’s a stupid hard link solution on the server side. Okay, if that works… *No*. “Hard links on the server side” cannot bear different names; so what if I want to sync, say, both `vid/etc` and `aud/etc`? Whoops. So I also have to do all sorts of ugly renaming. NO, GOOGLE, NO, I won't accept that much trouble.
+
+This kind of insanity makes me wander:
+
+**Do the Google Drive developers use Google Drive themselves?**
+
+For now I'm moving `vid/etc` to `vid_etc`. Sigh.
+
+---
+
+There are other problems that I encountered with Google Drive sync today. For one thing, it rejects what I already have and insists on starting from scratch. I mean, say I have uploaded a folder via the web interface, and later wants to keep it in sync (of course that's only possible if it's top level), so I put what I already have there. Nope, Google Drive reports that as a conflict and insists on downloading all the stuff again. Apart from wasted traffic, that also ruins my hard links, so I have to either wipe everything clean on the server side and reupload, or redownload everything and redo all the hard-linking after the download finishes. Either way, very annoying. I opted for the first one. (I later empirically confirmed that OneDrive could handle this situation.)
+
+There are other problems that don't pop right off my mind. Anyway, the gist is,
+
+**Google Drive is not yet sync-ready for power users (maybe even laymen).**
+
+---
+
+Then, is OneDrive perfect? No. I know it recently went unlimited, but there’s one major annoyance: the speed. Stanford’s Ethernet speed is almost 1 Gbps UL/DL, but the OneDrive client tops out at about 2 MBps. The web interface isn’t much better. Google Drive is a lot faster than that, which makes it a good backup service for manual uploading. Anyway, maybe OneDrive will improve over time; yesterday they delivered an update to OneDrive.app, and at least it finally works.
+
+OneDrive also boasts no file status indicators on OS X, which everyone else in the industry has. That’s not a show-stopper though, if you just use it as a backup service.
+
+---
+
+What about Dropbox? Dropbox is a truly awesome sync-ready service, but it is at the same time pretty expensive compared to others. Also, since I use Dropbox as a sync service, it must be up at all times and constantly indexing, so I’m really cautious with what I put there to avoid unnecessary cycles and startup time.
+
+---
+
+Everything is broken in one way or another. Sigh. Let's hope that OneDrive improves a lot in the coming months; if it's stable enough and the speed gets some boost, I'll cancel my Google Drive subscription. I am a Google supporter and Microsoft hater, but a service that *works* is more important than ideology.
diff --git a/source/blog/2014-10-28-mou-1-dot-0-fundraiser-goal-reached.md b/source/blog/2014-10-28-mou-1-dot-0-fundraiser-goal-reached.md
new file mode 100644
index 00000000..bec69ef7
--- /dev/null
+++ b/source/blog/2014-10-28-mou-1-dot-0-fundraiser-goal-reached.md
@@ -0,0 +1,17 @@
+---
+layout: post
+title: "Mou 1.0 fundraiser: goal reached"
+date: 2014-10-28 01:57:06 -0700
+comments: true
+categories:
+---
+A week ago I wrote a post [*Help Mou hit 1.0*](blog/2014/10/20/help-mou-hit-1-dot-0/). Today, I'm delighted to find out that Mou has reached its goal, $20,000, half way into the fundraiser.
+
+![Mou hit its goal on Indiegogo](http://i.imgur.com/vM298t5.png)
+
+So what do I expect from 1.0? Most importantly,
+
+* CommonMark support, especially GFM fenced code block and saner nested structures;
+* Custom Markdown engine (I would like to call [`stmd`](https://github.com/jgm/CommonMark)).
+
+Whatever the case, Emacs is still my best friend.
diff --git a/source/blog/2014-10-29-fun.md b/source/blog/2014-10-29-fun.md
new file mode 100644
index 00000000..ce32a9b0
--- /dev/null
+++ b/source/blog/2014-10-29-fun.md
@@ -0,0 +1,15 @@
+---
+layout: post
+title: "Fun"
+date: 2014-10-29 11:26:29 -0700
+comments: true
+categories:
+---
+
+This happened in yesterday's Math 210A lecture.
+
+> Ravi: I won't be here next Thursday.<br>
+> Someone: Will there be a lecture?<br>
+> Ravi: Yeah, Brian Conrad will give a lecture. Don't tell him, he don't know this yet.
+
+...
diff --git a/source/blog/2014-11-02-vobcopy-dvdbackup-etc.md b/source/blog/2014-11-02-vobcopy-dvdbackup-etc.md
new file mode 100644
index 00000000..b8690912
--- /dev/null
+++ b/source/blog/2014-11-02-vobcopy-dvdbackup-etc.md
@@ -0,0 +1,90 @@
+---
+layout: post
+title: "vobcopy, dvdbackup, etc."
+date: 2014-11-02 15:06:07 -0800
+comments: true
+categories:
+---
+A few days ago, I was cloning my entire Audio CD and DVD collection, and reported some of the findings in [this post](/blog/2014/10/26/audio-cd-slash-dvd-to-iso-image-on-os-x/). As said, the most important commands are
+
+    hdiutil makehybrid -iso -joliet -o AUDIO_CD_NAME.iso SOURCE
+
+for Audio CDs and
+
+    hdiutil makehybrid -udf -o DVD_NAME.iso SOURCE
+
+for DVDs.
+
+Those alone don't finish the story. I also tried other things and unfortunately encountered problems. I was too busy to report back then, but now I'll summarize some of the findings.
+
+---
+
+For one thing, `hdiutil makehybrid` might fail, issuing an "Operation not permitted" for no obvious reason. This could even happen when you work with the Disk Utility GUI (for which I once got a "Permission denied"). Even `sudo` didn't help in my case. However, I was able to **circumvent the problem with the root shell** (I won't tell you how to enter the root shell — you need to at least have that amount of knowledge about the root shell before you are given the key). Not sure why. Just keep in mind that the root shell might help (that's also a general, albeit dangerous, advice for life).
+
+---
+
+Next onto grabbing the raw VOB.
+
+`vobcopy` is pretty sweet, but at least for me it had one huge problem. When I tried to copy a single title, say title #2 with
+
+    vobcopy --title-number TITLE_NUMBER -i SOURCE
+
+other titles got copied, too. I didn't have enough samples to test out, but presumably it's because the problematic DVD has a structure like this:
+
+![problematic DVD title structure](http://i.imgur.com/HTgmwQL.png)
+
+Anyway, no matter I `vobcopy` title 01, 02, or 03, the result was the same — the whole thing. That's pretty stupid. I don't know if it counts as a bug or unfinished feature. Definitely not cool.
+
+(One cool thing about `vobcopy`: as long as you complied with `libdvdread`, you can create a fully decrypted version of the DVD with
+
+    vobcopy --mirror -i SOURCE
+
+Of course, to get an iso image out of the decrypted mirror, you run the `hdiutil makehybrid -udf` command given above.)
+
+---
+
+So `vobcopy` is dead (for copying specific titles in unfortunate DVDs). What's next?
+
+There's `dvdbackup`. The man page is good, and [ArchWiki](https://wiki.archlinux.org/index.php/dvdbackup#A_single_title) is even better (*ArchWiki is awesome!*), providing you cookbook solutions of combining the power of `dvdbackup` and `dvdauthor` (cookbooks are nice when dealing with unexciting technologies like DVD). In fact, `dvdbackup` alone is enough for extracting the VOBs of relatively small titles (< 1GiB):
+
+    dvdbackup -i SOURCE -o VOB_TARGET_DIR -t TITLE_NUMBER -n TITLE_NAME
+
+then grab your title-specific VOB in `VOB_TARGET_DIR/TITLE_NAME/VIDEO_TS`. Unlike `vobcopy`'s `-n/--title-number` option, `dvdbackup`'s `-t/--title` option does it right, trimming everything else. However, there's a problem when the title is larger than 1 GiB — then `dvdbackup` will split the VOB into several 1 GiB max pieces, and there's no way to disable this (since `dvdbackup` is targeting a DVD player — ancient technology — rather than `mpv` or whatever). What's sadder is that I can't seem to combine the split VOBs with FFmpeg stream copy — `pcm_dvd` audio always gets converted to `mp2` and fails when I use `-c copy`. I'm not a codec expert, but I suppose this is due to the fact that `pcm_dvd` isn't a supported encoding codec of FFmpeg (at least not my FFmpeg):
+
+    > ffmpeg -codecs | grep pcm_dvd
+    D.A..S pcm_dvd              PCM signed 20|24-bit big-endian
+
+`D` is for "Decoding supported", `A` is for "Audio codec", `S` is for "Lossless compression" — no encoding support. By the way, my FFmpeg is `brew`ed with the options `--with-fdk-aac`, `--with-ffplay`, `--with-freetype`, `--with-libass`, `--with-libbluray`, `--with-openjpeg`, `--with-openssl`, `--with-x265`:
+
+    > \ffmpeg -version
+    ffmpeg version 2.4.2 Copyright (c) 2000-2014 the FFmpeg developers
+    built on Oct 19 2014 14:09:36 with Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
+    configuration: --prefix=/usr/local/Cellar/ffmpeg/2.4.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda --cc=clang --host-cflags= --host-ldflags= --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libxvid --enable-libfreetype --enable-libass --enable-ffplay --enable-libfdk-aac --enable-openssl --enable-libx265 --enable-libopenjpeg --disable-decoder=jpeg2000 --extra-cflags='-I/usr/local/Cellar/openjpeg/1.5.1_1/include/openjpeg-1.5 '
+    libavutil      54.  7.100 / 54.  7.100
+    libavcodec     56.  1.100 / 56.  1.100
+    libavformat    56.  4.101 / 56.  4.101
+    libavdevice    56.  0.100 / 56.  0.100
+    libavfilter     5.  1.100 /  5.  1.100
+    libavresample   2.  1.  0 /  2.  1.  0
+    libswscale      3.  0.100 /  3.  0.100
+    libswresample   1.  1.100 /  1.  1.100
+    libpostproc    53.  0.100 / 53.  0.100
+
+Maybe I missed some `--enable`.
+
+Sorry for the digression. So, it's not possible to stream-copy-concat the VOBs with FFmpeg. (In fact, since audio quality is not that important — you won't be able to tell 256k AAC from lossless anyway, especially when you are focusing on the video, so you can always transcode `pcm_dvd` into 256k AAC with `-c:a libfdk_aac -b:a 256k`. `mpeg2video` is an encoding supported codec so stream copy works fine. Or you may also use `flac` or whatever encoding-supported lossless codec.) However, if you insist on getting the original `pcm_dvd`, there is a way, an ugly way. You've gotta be creative here. [ArchWiki](https://wiki.archlinux.org/index.php/dvdbackup#A_single_title) already provides a cookbook solution on how to use `dvdbackup` and `dvdauthor` to create a DVD with a selected title. And `vobcopy` can copy the entire thing just fine, without the 1 GiB limit (make sure to use the `-l/--large-file` option if the size is greater than 2 GiB). Therefore, you can create a DVD with selected title from the original DVD, then `vobcopy` from the new DVD. This is insane, but it works, I've tested that. **Note, however, that timestamps might be wrong with `vobcopy`, so the VOB runs just fine linearly but might run into problems when you seek.** Therefore, FFmpeg is still the way to go. Or maybe you can do it right with one click using some closed source software ☹ — I've heard about success stories with the long ceased DVD Decrypter Windows project. In reality, I guess only people with theoretical interest or OCD will ever do this — FLAC or AAC should serve everyone just fine. It should have worked with `vobcopy` alone, but it doesn't. Hence the workaround.
+
+---
+
+For future reference, I'll translate the ArchWiki cookbook solution here (it's too cookbook itself, specifying paths like `~/movie_name` and using unnecessary `cd`) about creating a title-specific DVD from a multi-title DVD (replace `SOURCE`, `VOB_TARGET_DIR`, `DVD_TARGET_DIR`, `TITLE_NUMBER`, and `TITLE_NAME` with sane values):
+
+    dvdbackup -i SOURCE -o VOB_TARGET_DIR -t TITLE_NUMBER -n TITLE_NAME
+    dvdauthor -t -o DVD_TARGET_DIR VOB_TARGET_DIR/TITLE_NAME/VIDEO_TS/*.VOB
+    export VIDEO_FORMAT=NTSC
+    cd DVD_TARGET_DIR/VIDEO_TS && dvdauthor -T -o DVD_TARGET_DIR
+
+`export VIDEO_FORMAT=NTSC` is to avoid the `dvdauthor` error of "no default video format, must explicitly specify NTSC or PAL" (I'm not sure about the difference between NTSC and PAL, but I saw NTSC printed on my DVD, so I used it). And there you go, a shiny new DVD filesystem located in `DVD_TARGET_DIR`. (Note that unlike `vobcopy`, `dvdbackup` doesn't feature a nice progress bar even when `-v/--verbose` and `-p/--progress` are specified.) Then you can
+
+    vobcopy -l DVD_TARGET_DIR
+
+if you'd like to. Recall that timestamps might be wrong, sadly.
diff --git a/source/blog/2014-11-05-apple-is-pushing-yosemite-hard.md b/source/blog/2014-11-05-apple-is-pushing-yosemite-hard.md
new file mode 100644
index 00000000..0324c26c
--- /dev/null
+++ b/source/blog/2014-11-05-apple-is-pushing-yosemite-hard.md
@@ -0,0 +1,32 @@
+---
+layout: post
+title: "Apple is pushing Yosemite hard"
+date: 2014-11-05 22:17:01 -0800
+comments: true
+categories:
+---
+Apple is pushing Yosemite hard and secretly Yosemitizing things. iTunes was updated to its shiny new look on Mavericks, day one upon Yosemite launch. I liked it. The only problems I had with the new iTunes are:
+
+* It's no longer possible to go to the Artists view and Music Videos view with one click. Artists is now a drop-down menu option in My Music view; Music Videos is now a sidebar tab in Playlists view.
+
+* The red icon doesn't look as good as the previous blue one, and it doesn't harmonize too well alongside the blue Finder and Mail. Maybe they will look better together in Yosemite.
+
+Just now I found that the Mac App Store in Mavericks is also Yosemitized:
+
+![Yosemitized Mac App Store](http://i.imgur.com/T7KIo6s.png)
+
+The chromeless UI certainly looks a bit weird, and the font seems a bit too small. However, I'm sure I'll quickly get over these shortcomings, and might even grow to appreciate them. Even more so when I finally upgrade to Yosemite (I'll wait for Thanksgiving break or 10.10.1 this year, whichever comes first — looks like the former will come first, considering the first 10.10.1 developer beta was out [merely two days ago](http://www.macrumors.com/2014/11/03/first-yosemite-10-10-1-beta-now-available/), [reportedly](http://i.imgur.com/IVFV7E2.png) focusing on WiFi, etc.).
+
+On the font side, unfortunately the small font size in the new Mac App Store does make text fuzzy on my non-Retina display. I didn't notice the fuzziness in the new iTunes. Anyway, everything is optimized for Retina — Apple is also secretly pushing Retina hard. In the Apple ecosystem, apparently you always want to stay at the top of the line. Due to Apple's nature, the degree of hardware-software integration is simply unparalleled, so only the latest hardware enjoys all the new features and love. Unfortunately, the typical lifespan of a Mac is much longer than the hardware/software release cycle.
+
+The truth is, we (or at least I) adapt to things much quicker and easier than we'd imagined (or otherwise would be willing to admit). When iOS 7 was demo'ed on WWDC 2013, I was like "no way! What's with those stupid flat crap?" But when the update came, I hopped on and was happy ever since. (I reserve my opinion on the icon design.) Later when I installed an app that was not updated for the new UI, I was like "OMG, what's with this clumsy UI?" I guess legibility issues, WiFi issues (with Yosemite) and responsiveness issue (with iOS 8 on iPhone 4S — *AT&T, where's my preordered 6 Plus?*) are harder to impossible to adapt to, but they will eventually be fixed, or support-dropped, or hardware-upgraded (with $$). So in the end (almost) everyone will be happy. And one day when we face the old thing again by chance, we'll flee as fast as we can: "what's with that..." (I did exaggerate. Also, I know, many people just don't care about design, or have ill tastes, or can't find the buttons after a minimal number of UI tweaks — I'm not including them in the "we" here.) Those who claim that "I won't upgrade until..." are just kidding themselves, and certainly no one will wait for them or make their "until..." come true. Most of those "won't upgrade" folks will eventually upgrade and be happy. For those that really don't upgrade (like those still running Snow Leopard) either can't afford the new hardware, or suffer from senility (seen from the deep hostility towards new things). Or they have some important legacy software that would break with an upgrade; poor dudes.
+
+Same goes for newer, shinier, seemingly unnecessary deluxe hardware. I'm still stuck on a Mid-2012 MBP 13" Non-Retina. Retina seems highly useless for me since I do most of my work on the 27" external display — the 13" internal LCD hosts a single maximized Activity Monitor window most of the time (and sometimes also a Transmission window). I expect my opinion about Retina to change after I upgrade to a Retina model next year. (It will be a pretty major purchase though — i7, 16 GB memory, and 512 GB SSD are musts, and there are like a million peripherals to buy — Thunderbolt to Ethernet, Super Drive, etc., etc.) This shift of opinion after upgrading to something unnecessarily good (and ending up not being able to tolerate anything inferior) is best described as "**sadly converted**". Some folks are already sadly converted by the Retina iMac. See, for example, [this article](http://arstechnica.com/apple/2014/11/yes-the-5k-retina-imacs-screen-runs-at-60hz-at-5k-resolution/#p11) on Ars Technica:
+
+> Prior to getting the Retina iMac on my desk, I would have said that "retina" isn’t necessarily something we need on the desktop. Most people don’t notice pixels on the desktop at a normal seating distance. However, after getting to A/B compare the Retina iMac with the standard one over the course of a week, I’m sadly converted. I just don’t know if my wallet can take the abuse.
+
+And others are bitterly desiring one (me included — sadly two Mac are too much for a university dorm). See, for example, [this comment](http://arstechnica.com/apple/2014/11/yes-the-5k-retina-imacs-screen-runs-at-60hz-at-5k-resolution/?comments=1&post=27896871) on the aforementioned article:
+
+> I WISH APPLE TECHNICA WOULD STOP WITH ALL THESE ARTICLES ABOUT THE IMAC.
+>
+> It really makes me want one unjustifiably.
diff --git a/source/blog/2014-11-05-list-youtube-playlist-with-youtube-dl.md b/source/blog/2014-11-05-list-youtube-playlist-with-youtube-dl.md
new file mode 100644
index 00000000..a0d8af7b
--- /dev/null
+++ b/source/blog/2014-11-05-list-youtube-playlist-with-youtube-dl.md
@@ -0,0 +1,71 @@
+---
+layout: post
+title: "List YouTube playlist with youtube-dl"
+date: 2014-11-05 10:37:58 -0800
+comments: true
+categories:
+---
+Of course you are always welcome to use the [Google APIs Client Library for Python](https://developers.google.com/api-client-library/python/) to wrestle with YouTube, which is usually pretty simple. (As an added bonus, YouTube has some [nice runnable sample scripts](https://developers.google.com/youtube/v3/code_samples/) to get you started.) With the client library, listing videos in a YouTube playlist is a breeze.
+
+However, if you don't feel like writing code yourself (I usually don't feel like writing code myself until I use something often enough and existing solutions are suboptimal), `youtube-dl` recently added the functionality to list videos in a playlist with the `--flat-playlist` option.
+
+[According to one of the project collaborators](https://github.com/rg3/youtube-dl/issues/4003#issuecomment-60322630), currently `--flat-playlist` is only helpful with the `-j` option for dumping JSON (so I suppose this feature is subject to change). For instance, `--flat-playlist` alone would emit something like this:
+
+```bash
+> youtube-dl --flat-playlist 'https://www.youtube.com/watch?v=gdOwwI0ngqQ&list=PLPpZI8R1zUfrkDbmJMOBhEbJ9Td9vbV-F'
+[youtube:playlist] Downloading playlist PLPpZI8R1zUfrkDbmJMOBhEbJ9Td9vbV-F - add --no-playlist to just download video gdOwwI0ngqQ
+[youtube:playlist] PLPpZI8R1zUfrkDbmJMOBhEbJ9Td9vbV-F: Downloading webpage
+[youtube:playlist] PLPpZI8R1zUfrkDbmJMOBhEbJ9Td9vbV-F: Downloading page #1
+[download] Downloading playlist: Cam By apinknomfan
+[youtube:playlist] playlist Cam By apinknomfan: Collected 119 video ids (downloading 119 of them)
+[download] Downloading video #1 of 119
+[download] Downloading video #2 of 119
+[download] Downloading video #3 of 119
+[download] Downloading video #4 of 119
+...
+```
+
+which doesn't really make sense — it tells you that it collected 119 video ids, and no more. Once you have `-j` on, you get JSON data that you can parse with anything:
+
+```bash
+> youtube-dl -j --flat-playlist 'https://www.youtube.com/watch?v=gdOwwI0ngqQ&list=PLPpZI8R1zUfrkDbmJMOBhEbJ9Td9vbV-F'
+{"url": "gdOwwI0ngqQ", "_type": "url", "ie_key": "Youtube", "id": "gdOwwI0ngqQ"}
+{"url": "j9l5nchv1Z8", "_type": "url", "ie_key": "Youtube", "id": "j9l5nchv1Z8"}
+{"url": "znW5ALwWNQw", "_type": "url", "ie_key": "Youtube", "id": "znW5ALwWNQw"}
+{"url": "qyE7-auTIcc", "_type": "url", "ie_key": "Youtube", "id": "qyE7-auTIcc"}
+...
+```
+
+The most straightforward way to parse this is to use a command line JSON parser, the best one being [jq](https://github.com/stedolan/jq):
+
+```bash
+> youtube-dl -j --flat-playlist 'https://www.youtube.com/watch?v=gdOwwI0ngqQ&list=PLPpZI8R1zUfrkDbmJMOBhEbJ9Td9vbV-F' | jq -r '.id' | sed 's_^_https://youtube.com/v/_'
+https://youtube.com/v/gdOwwI0ngqQ
+https://youtube.com/v/j9l5nchv1Z8
+https://youtube.com/v/znW5ALwWNQw
+https://youtube.com/v/qyE7-auTIcc
+...
+```
+
+There you go, a list of URIs you can use. Of course you can put this in a script to save some typing:
+
+```bash youtube-ls-playlist.sh https://gist.github.com/zmwangx/0245788475f963210ed9 Gist
+#!/usr/bin/env bash
+# Takes a YouTube URI to a playlist (fairly liberal, it's fine as long
+# as the playlist id can be extracted), and prints a list of URIs in a
+# YouTube playlist.
+#
+# Requires youtube-dl 2014.10.24, tested on youtube-dl
+# 2014.11.02.1. Feature subject to change.
+youtube-dl -j --flat-playlist "$1" | jq -r '.id' | sed 's_^_https://youtube.com/v/_'
+```
+
+**_Aside:_** I first embedded the gist here, but [it looked a bit off](http://i.imgur.com/m3cr0Im.png). See [imathis/octopress#1392](https://github.com/imathis/octopress/issues/1392).
+
+> In the next version of the Gist tag plugin we are just downloading the gists and embedding them upon generation so we don't have to worry about GitHub going down and breaking all your gists, or changing the HTML and breaking all the styles.
+>
+> For the time being I suggest embedding your code snippets directly if you want them to look good.
+
+Okay. End of aside.
+
+By the way, `youtube-dl` supports playlist bulk download natively. The reason I need a list of video ids or URIs, however, is that among other things, `youtube-dl` doesn't download highest resolution DASH video by default, so I have to rely on something like `youtube-dl-dash` ([link](https://github.com/zmwangx/sh/blob/master/youtube-dl-dash)) to download the best version.
diff --git a/source/blog/2014-11-06-2014-nobel-prize-in-physics-led-lights-seriously.md b/source/blog/2014-11-06-2014-nobel-prize-in-physics-led-lights-seriously.md
new file mode 100644
index 00000000..f68ea55d
--- /dev/null
+++ b/source/blog/2014-11-06-2014-nobel-prize-in-physics-led-lights-seriously.md
@@ -0,0 +1,19 @@
+---
+layout: post
+title: "2014 Nobel Prize in Physics — LED lights, seriously?"
+date: 2014-11-06 11:08:45 -0800
+comments: true
+categories:
+---
+For some reason, I only learned about this year’s laureates today, through [the reference frame](http://motls.blogspot.com/2014/11/ex-employer-wont-meet-blue-led-nobel.html). The prize goes to the inventors of the LED. Not exciting at all, so I don’t care if I’m ever informed. (Lubos has a good point on why applied physics — well, let’s even widen the concept of applied physics a bit — should not surprise anyone when they appear in a Nobel Prize announcement: “After all, Alfred Nobel might have very well considered his dynamite to be a discovery in physics, too.”)
+
+The Nobel Prize Physics Awards has been rather amusing in recent years. Partly due to controversy on the theoretical front and no breakthrough on the experimental front, I guess. (The discovery of Higgs was a breakthrough to some extent, but it was totally expected; little physics beyond SM at LHC before LS1 is sad. Since it was totally expected, the award went to theorists — some experimentalists might not be too thrilled.) Just look at the recent list: 2010, graphene (shouldn’t that be chemistry? if material science can be part of physics, then chemistry must surely encompass it, too); 2009, CCD sensor (whatever that means, maybe that’s important); 2008, fibers (okay, I love fast Internet connections). The list actually goes all the way down to early 20th century, but it’s much denser in recent decades. Now one more: 2014, LED.
+
+> “for the invention of efficient blue light-emitting diodes which has enabled bright and energy-saving white light sources”
+
+Wow, energy-saving. I guess next year’s prize will go to the inventors of high efficiency urinals, for being resource-saving.
+**I mean, LEDs are great, but not great as physics, much less a physics breakthrough.**
+
+Let’s compare the applied folks to other laureates: Lorentz, J. J. Thomson, Planck, Einstein, Bohr, Heisenberg, Schrödinger, Dirac, Fermi, Pauli, Born, Lee, Yang, Landau, Feynman, Schwinger, Gell-Mann, Weinberg, ’t Hooft, etc. Not on the same level.
+
+It’s good to see that a growing body of physicists are (or at least as it seems to me) increasingly reserved about the Nobel Prize, and prizes in general. Same goes for math, with the Nobel Prize replaced by something else. (Employers still love the big titles, I suppose — good to have some star faculty on board.)
diff --git a/source/blog/2014-11-07-interstellar.md b/source/blog/2014-11-07-interstellar.md
new file mode 100644
index 00000000..8cd93b8f
--- /dev/null
+++ b/source/blog/2014-11-07-interstellar.md
@@ -0,0 +1,16 @@
+---
+layout: post
+title: "Interstellar"
+date: 2014-11-07 23:56:31 -0800
+comments: true
+categories:
+---
+Today (I mean November 7, 2014 — it’s technically November 8 at the time of writing) I saw [*Interstellar*](https://en.wikipedia.org/wiki/Interstellar_%28film%29) (IMAX digital) at AMC Mercado 20. I rarely go to movie theaters, less on the release day (film formats of *Interstellar* were released on November 5, and digital formats followed on November 7). However, reviews of it were positive (from the physics community), and I really need a way to release stress these days — I wasn’t in the right condition for months. So I figured I’d just spend an afternoon in front of the big screen.
+
+I’ve heard good things about IMAX 70mm film, like no trailers, among other things. But I didn’t bother the extra seven miles’ drive to Hackworth IMAX Dome, so I landed on IMAX digital. Still a pretty stunning experience, although I ended up watching forty minutes worth of trailers before the real thing (arrived fifteen minutes early). In hindsight maybe I’d be better off spending some extra time on the road.
+
+Speaking of the movie itself, they tried to make it as plausible as possible from a physics viewpoint, by involving [Kip Thorne](https://en.wikipedia.org/wiki/Kip_Thorne) of Caltech. (There’s even a book out, *The Science of Interstellar*.) For instance, the wormhole isn’t portrayed as a hole (I mean, imagine a ring in empty space, as you would picture in your mind when you hear the word “hole” out of nothing; that’s not how it looks like here, and there’s a nice explanation). Some of the physics still doesn’t work out quite well, though, like Cooper’s not crushed at the singularity… Also there are communications from within the horizon and breakdown of causality, explained in the movie as happening in four dimension slices of some five dimensional spacetime where time could be a physical dimension. Obviously these are needed to get the sci-fi story going, so no one should be blamed.
+
+I was there for the sci-fi and physics, but a nice surprise was that I was also touched by the humanity elements of story, I mean, family and stuff.
+
+The downside: Cooper’s accent was a bit hard on me ☹
diff --git a/source/blog/2014-11-10-average-phone-plan-in-the-u-dot-s-costs-ten-time-as-much-as-that-in-the-u-dot-k.md b/source/blog/2014-11-10-average-phone-plan-in-the-u-dot-s-costs-ten-time-as-much-as-that-in-the-u-dot-k.md
new file mode 100644
index 00000000..1bce5027
--- /dev/null
+++ b/source/blog/2014-11-10-average-phone-plan-in-the-u-dot-s-costs-ten-time-as-much-as-that-in-the-u-dot-k.md
@@ -0,0 +1,12 @@
+---
+layout: post
+title: "Average phone plan in the U.S. costs ten time as much as that in the U.K."
+date: 2014-11-10 11:11:46 -0800
+comments: true
+categories:
+---
+To quote [Opera News](http://blogs.opera.com/news/2014/11/mobile-data-anyway/),
+
+> According to research by the International Telecommunication Union, the average phone plan with 500MB of data costs $85 in the United States, compared to $24.10 in China and $8.80 in the United Kingdom.
+
+Holy shit!
diff --git a/source/blog/2014-11-11-re-encoding-everything-for-iphone-6-plus.md b/source/blog/2014-11-11-re-encoding-everything-for-iphone-6-plus.md
new file mode 100644
index 00000000..51d5ed37
--- /dev/null
+++ b/source/blog/2014-11-11-re-encoding-everything-for-iphone-6-plus.md
@@ -0,0 +1,8 @@
+---
+layout: post
+title: "Re-encoding everything for iPhone 6 Plus"
+date: 2014-11-11 13:31:25 -0800
+comments: true
+categories:
+---
+AT&T finally delivered my iPhone 6 Plus (silver, 64 GB) after about fifty days since preorder… The 1080p Retina display is simply stunning. However, it turns out that my old videos don’t work so well on 6 Plus’s giant screen. My old mobile video collection was optimized for my 16 GB 4S, targeting the small screen and highly limited storage — you guessed it, they were resized to 960x540, and they looked great. But they’re not up to the task any more. 960x540 videos aren’t at all sharp on the stunning screen of 6 Plus, which is more than capable of handling 4x pixels. Therefore, I have no choice but to feed it more pixels. I’m left in a weird situation, where my 1080p desktop (or even HDTV) quality videos should fit the screen just fine, but H.264 profile stands in the way. iPhone 6 and 6 Plus are only capable of High Profile level 4.2, so anything encoded in level 5.1, for instance, needs to be re-encoded. Also there are still MPEG-2 and MPEG-4 videos out there (MPEG-4 should be obsolete by now, I assume, but some people still use it; and MPEG-2 is de facto in TV broadcasts), which have to be transcoded. Okay, it’s a daunting task to re-encode a fairly big collection, but I have to do it sooner or later. Presumably this weekend. I’ll also report whether 720p videos look sharp on the screen later.
diff --git a/source/blog/2014-11-19-convolution-of-irreducible-characters.md b/source/blog/2014-11-19-convolution-of-irreducible-characters.md
new file mode 100644
index 00000000..f3f3207e
--- /dev/null
+++ b/source/blog/2014-11-19-convolution-of-irreducible-characters.md
@@ -0,0 +1,16 @@
+---
+layout: post
+title: "Convolution of irreducible characters"
+date: 2014-11-19 20:40:37 -0800
+comments: true
+categories:
+---
+__*TL; DR:* The actual PDF write-up is [here](https://dl.bintray.com/zmwangx/generic/20141119-convolution-of-irreducible-characters.pdf).__
+
+---
+
+Yesterday I was trying to establish the formula for orthogonal primitive central idempotents of a group ring. It is possible to establish the result through the convolution of irreducible characters. However, I stuck quite a while on trying to work out the convolutions themselves. For a formidable and unenlightening proof using "matrix entry functions" (i.e., fix a basis, induce a matrix representation, and explicitly expand everything in matrix elements), see [this post](http://drexel28.wordpress.com/2011/03/02/representation-theory-using-orthogonality-relations-to-compute-convolutions-of-characters-and-matrix-entry-functions/) (in fact, this is just one in a series of posts that lead up to the result). That's a really sad proof.
+
+It turns out that I really should have been working the other way round --- first establish the orthogonal idempotents (the proof of which is really simple and elegant, I was just trapped in a single thread of thought), then use that to compute the convolution of irreducible characters.
+
+I feel like this is worth presenting (as the only proof I saw online is the really sad one above), so I TeX'ed it up. I tried to convert to MathJax HTML but eventually gave up (that's the story for another post). So, the write-up is in good ol' PDF, available [here](https://dl.bintray.com/zmwangx/generic/20141119-convolution-of-irreducible-characters.pdf).
diff --git a/source/blog/2014-11-20-dropbot-for-geeks(r).md b/source/blog/2014-11-20-dropbot-for-geeks(r).md
new file mode 100644
index 00000000..ad075302
--- /dev/null
+++ b/source/blog/2014-11-20-dropbot-for-geeks(r).md
@@ -0,0 +1,26 @@
+---
+layout: post
+title: "Dropbot for Geeks®"
+date: 2014-11-20 09:48:15 -0800
+comments: true
+categories:
+---
+I propose the following cloud storage and syncing service model of the future. I call it **Dropbot for Geeks®**, and it totally rules. It's designed for geeks who are tired of the highly limited, miserably unproductive traditional services (based on clicking around). It has the following features:
+
+* Standard Unix file system commands exposed as an API, e.g., `cat`, `cd`, `cp`, `du`, `df`, `file`, `find`, `head`, `ln`, `ls`, `mkdir`, `mv`, `pwd`, `rm`, `rmdir`, `tail`, `touch`, etc.
+
+* A rudimentary shell emulator through the web interface exposing the commands above.
+
+* Secure shell access to the file system, also exposing the commands above. Provide two-factor auth for SSH. Clearly, `scp` should also be supported.
+
+* Checksums. Expose, for instance, `md5sum` or `sha1sum`, in the API. Provide checksums on download pages, probably on demand.
+
+* Programmable selective syncing, down to per file level.
+
+* Scriptability. Allow clients to run custom scheduled jobs or daemons with the API above. To prevent the service from becoming full-featured IaaS, though, clients might be limited in CPU time, memory, or command selection. This bullet point is arguable.
+
+---
+
+With the level of command line integration illustrated above, we'll finally get rid of clicking around and not being able to automate chores. Navgating the remote file system will be a breeze — click, click, click, click, click (sometimes click should be replaced by double click, which is even more painful) just to navigate to a directory will be made a thing of the past. `ln`, in particular, saves disk space for duplicates — Dropbot for Geeks does *not* want to charge you extra for multiple copies of the same file in different directories. (To facilitate syncing hardlinks, clients should be able to specify hardlinked files in a config file. Or maybe some better mechanism. This might be hard.) At last, checksums are a must. I’ve had traumatic experiences like having downloaded an eight-part RAR, 1 GiB each, only to find that it wouldn’t unRAR. Without checksums, it was impossible to find which part was corrupted. As a result, I had to re-download everything — a nightmare. I never want to experience similar problems again. Hence the precious checksums.
+
+Dropbot for Geeks looks like a pretty good (well, not really, but at least pretty cool®) model. Maybe I should patent it before anyone else? Then if some similar service surfaces in the future, I can [sue their ass off and enjoy some hot cash](http://arstechnica.com/tech-policy/2014/11/jury-apple-must-pay-23-6m-for-old-pager-patents/).
diff --git a/source/blog/2014-11-24-iphone-photography-frustration.md b/source/blog/2014-11-24-iphone-photography-frustration.md
new file mode 100644
index 00000000..1a375f25
--- /dev/null
+++ b/source/blog/2014-11-24-iphone-photography-frustration.md
@@ -0,0 +1,32 @@
+---
+layout: post
+title: "iPhone photography frustration"
+date: 2014-11-24 12:42:25 -0800
+comments: true
+categories:
+---
+**TL; DR:** Jump to the paragraph “In the end…”
+
+---
+
+I'm not a photo-savvy guy. I've never taken a single selfie in my life, and my iPhone Photos app witnesses about twenty photos a year — fifteen of which are accidental screenshots. Okay, a little bit of exaggeration. The iPhone, aka iCamera, especially the 6 Plus model, is sort of a waste in my possession. However, my grandparents came to visit me on campus yesterday, and my grandma *loves* photos. So I took one with them, using my phone (which is obviously better than my grandma’s digital camera). The lighting was wrong, but I was able to fix that in five seconds — clicked “Edit”, clicked on the little sun icon (whatever it is called), clicked on “Light”, slided the slidebar all the way to the right, and all of a sudden it looked perfect. (This is the first time I ever clicked those, but I got it nicely done in five seconds — very intuitive, deeply impressed.) From a layman’s perspective, the builtin edit feature of the Photos app is really smart. Later I tried to reproduce the same edit with iPhoto, but I had to manually wrestle with exposure, highlights, shadows, brightness, contrast, etc., and I just never got it right. Call me a moron if you feel like it, but I’ve already given you the context at the beginning of this article, so you can’t blame me. (For your reference, I do ’shop some images for fun and profit from time to time, but I never deal with actual unedited photos, so I never have to worry about exposure and stuff.)
+
+So far so good. The frustation began when I try to import the photo to my Mac. I’m certainly not a mobile guy who keeps everything on his phone or the cloud. I have the photo import feature of Dropbox turned on, so as I plugged in my phone the photo already appearred in the Camera Upload folder. Wait what, two copies? Two copies that looked exactly the same, albeit one is about 0.1 MB larger than the other? Not cool. Pulled up Image Capture; Apple’s own software should do the trick, I guess. Nope, same thing. Googled, found this article on support.apple.com: [*iOS: Edited photos show original photo after import or in other apps*](http://support.apple.com/en-us/HT203612). Okay sure, they know this. Let's listen to what they have to say.
+
+> Apple uses Extensible Metadata Platform (XMP), a standard created by Adobe, for nondestructive photo editing. XMP allows you to undo edits and to revert back to an original photo without the loss of quality. Displaying the edited photo requires OS X v10.9 or later and software that can read XMP. The following applications support XMP:
+>
+> * iPhoto 9.5 or later
+> * iPhoto for iOS
+> * Aperture 3 or later
+> * Adobe Lightroom
+> * Adobe Photoshop Elements
+>
+> Other photo-management applications and some iOS apps may also display XMP.
+
+Adobe Lightroom, oh well. I don’t yet have Adobe CC installed — Photoshop is certainly a powerhouse (plus Illustrator, InDesign, etc. are nice to have at times), but Pixelmator works fine for me most of the time, and I’m happy to go to a library iMac or Mac Pro when I do need the power; $29.99/$19.99 is just too much if I use it twice a month. I theorize that I can indefinitely extend the free trial by running CC in a VM, reverting to a clean snapshot and regenerating the MAC address from time to time, but that’s only a theory — I haven’t got the incentive to test it out. As for iPhoto, I know it’s pretty lame from past experience, and I was very much baffled by the ugly and unintuitive UI, so normally I don’t even want to waste disk space on it; but since it’s only official solution other than expensive Adobe products and Aperture, I decided to install it. 1.7 GB gone. *So does the wasted 1.7 GB do the trick? Sadly, no.* Still the same thing in iPhoto 9.6, which is clearly “iPhoto 9.5 or later”. Totally baffled.
+
+In the end, I came up with an ugly solution. Just email or iMessage the photo to yourself from the phone. If you use email though, be sure to use the builtin Mail, or you would likely lose Exif data (I sent from Mailbox and lost Exif; I then sent from Mail and didn’t). This is really annoying since setting up accounts in the builtin Mail app is not fun — Google 2FA is not supported, and I have to generate an app-specific password. Compare to Mailbox, where *I signed into Dropbox on the new phone and within five seconds all of my ten email accounts are ready to use*. The loss of Exif data is probably related to [this thread on SO](http://stackoverflow.com/questions/20763814), but I didn’t delve into it since I’m not a Cocoa Touch dev. What’s more confusing, sending the photo via different applications result in different filesizes. The one sent from Mail (I chose original size when I sent it) was a 2 MB JPEG; the one sent from Mailbox was a 4.5 MB JPEG (without the right Exif); and the one sent via iMessage and later opened from the Messages app on Yosemite could be saved as a 10 MB lossless PNG (Exif was there). I went with the 2 MB one in the end.
+
+I don’t know if iCloud Photo Library will solve the problem in the end. From my perspective, *Apple should train Preview and QuickLook to recognize their XMP technology.* Seriously, they talk about continuity, and I expect to enjoy my enhanced photos on my Mac without going through all the hessle and confusion. Photo enhancing is already such a breeze, thank you; now make sharing and archiving easy, at least within the Apple ecosystem. (Although I’m not familiar with photography and image editing in general, considering how tech-savvy I am, I bet most users can’t even figure out one annoying solution.)
+
+By the way, Continuity and Handoff only work intermittently for me, and AirDrop between my iPhone (6 Plus) and MacBook Pro (mid-2012, model 9,2) doesn’t work at all. Continuity and Handoff sometimes turn up when they are unexpected (and serve as kinda nice surprises), but when I try to nail them, they remain elusive. Not a big deal for me, but certainly not the most pleasant thing ever. I bet these have to do with the fact that my Mac is connected to Ethernet and sharing the Ethernet connection to my iPhone; these days they expect everyone to be on Wi-Fi (and ironically they messed up big in Yosemite), but Wi-Fi simply can’t beat the speed and stability of Ethernet. I didn’t bother to test whether the features work when my devices are connected to the same Wi-Fi network; even if they do, that’s not my production setup, so they’re still useless to me.
diff --git a/source/blog/2014-11-24-why-i-abandoned-mathjax-and-fell-back-to-pdf.md b/source/blog/2014-11-24-why-i-abandoned-mathjax-and-fell-back-to-pdf.md
new file mode 100644
index 00000000..10f105d8
--- /dev/null
+++ b/source/blog/2014-11-24-why-i-abandoned-mathjax-and-fell-back-to-pdf.md
@@ -0,0 +1,12 @@
+---
+layout: post
+title: "Why I abandoned MathJax and fell back to PDF"
+date: 2014-11-24 20:54:36 -0800
+comments: true
+categories:
+---
+Recently I wrote an expository article, [*Convolution of irreducible characters*](/pdf/20141119-convolution-of-irreducible-characters.pdf), and posted it [here](/blog/2014/11/19/convolution-of-irreducible-characters/). At first I intended to use MathJax, but in the end I fell back to good ol' PDF. Here's why.
+
+In short, I'm a mathematician. I write math *articles*, not just standalone expressions or formulas. I use AMSLaTeX to its fullest (not really, but at least I use numbering and the `amsthm` package to its fullest). HTML simply wasn't designed for this. Here are two influential markup languages designed for totally different use cases, and bridging them is painful. I tried to use `pandoc`, but it doesn't support `\input`, doesn't support `\def`, and swallows `\begin{theorem} \end{theorem}`, among other things. I tried to use `htlatex`; even the MathML output is suboptimal, with many math symbols translated to non-math (apart from totally human-unreadable), and it uses its custom CSS files that don't play well with everything else. I tried other things. In the end I gave up. Maybe I don't know enough about MathJax, but I certainly don't want to write a translator myself. Leave LaTeX alone. Distribute as PDF. MathJax may be great for Wikis (like Wikipedia) and for math lite blogs, but it's no replacement for real, beefy LaTeX. It's not for mathematicians who want to distribute real articles.
+
+By the way, Terry Tao and others use [Luca's LaTeX to WordPress, aka LaTeX2WP](http://lucatrevisan.wordpress.com/latex-to-wordpress/) for math blogging. From Terry's experience it works fairly well. I don't know if `amsthm` and `\def` are in the feature set, though. Anyway, since WordPress handles LaTeX as pre-compiled images (which is also the default on Wikipedia, and which looks poor in general and plays horribly with scaling), LaTeX2WP won't help MathJax users the slightest.
diff --git a/source/blog/2014-11-25-i-got-16-gigs-of-ram.md b/source/blog/2014-11-25-i-got-16-gigs-of-ram.md
new file mode 100644
index 00000000..d55a642e
--- /dev/null
+++ b/source/blog/2014-11-25-i-got-16-gigs-of-ram.md
@@ -0,0 +1,20 @@
+---
+layout: post
+title: "I got 16 gigs of RAM"
+date: 2014-11-25 16:28:30 -0800
+comments: true
+categories:
+---
+Today I upgraded the RAM of my MacBook Pro mid-2012 to 2x8GB. I purchased the [Crucial 16GB Kit (8GBx2) DDR3/DDR3L 1600 MHz (PC3-12800) CL11 SODIMM 204-Pin 1.35V/1.5V Memory for Mac CT2K8G3S160BM](http://smile.amazon.com/dp/B008LTBJFW) from Amazon, which cose me $146.64 after tax. I followed the [official guide](http://support.apple.com/en-us/HT201165) as well as the [iFixit guide](https://www.ifixit.com/Guide/MacBook+Pro+13-Inch+Unibody+Mid+2012+RAM+Replacement/10374). To finish the job I needed a Phillips #00 screwdriver and a spudger, so I purchased the [spudger](https://www.ifixit.com/Store/Tools/Spudger/IF145-002) and the [54 bit driver kit](https://www.ifixit.com/Store/Tools/54-Bit-Driver-Kit/IF145-022-1) from iFixit.
+
+The actual process was pretty simple. I had a little bit of hard time pulling out the bottom module and pushing in the top module, but overall it was smooth. The only stupid thing I did was that I forgot to push the battery connector back in before I closed the case; I only realized this when I was screwing in the eighth screw (that was a close one!), and had to unscrew everything again.
+
+After I replaced the RAM modules, booting was just normal. And now I've got 16 gigs of RAM!
+
+![](http://i.imgur.com/PGhdEGr.png)
+
+Want to run multiple memory hoggers *along with a Windows VM* (with 4GB of RAM)? No problem.
+
+![](http://i.imgur.com/czDcVaK.png)
+
+By the way, Yosemite is indeed really aggressive at RAM usage. I reserve my opinion on whether there's a memory leak. But so far the performance has been fine, even with 8GB of RAM.
diff --git a/source/blog/2014-11-26-original-images-in-day-one-journal.md b/source/blog/2014-11-26-original-images-in-day-one-journal.md
new file mode 100644
index 00000000..c738699c
--- /dev/null
+++ b/source/blog/2014-11-26-original-images-in-day-one-journal.md
@@ -0,0 +1,42 @@
+---
+layout: post
+title: "Original images in Day One journal"
+date: 2014-11-26 00:22:16 -0800
+comments: true
+categories:
+---
+**TL; DR:** Jump to the paragraph beginning with “workaround”.
+
+---
+
+I started a Day One journal two days ago. I've heard good things about Day One, but after using it for a dozen entries, I'm not that satisfied. For one thing, the editor is pretty horrible — keybindings aside, I can’t even find and replace?! And the overview doesn’t look very pretty if you are a heavy Markdown user (i.e., you have a lot of markups, e.g., italics and inline links) — the markups are displayed as is. Moreover, I can’t even `#` my title: it kills the bold font rendering in the bird’s-eye view. What a let down. Anyway, it’s better than nothing, and I hope it will help me keep on track. (I used to manage a Markdown journal in an encrypted sparse bundle, and it was a pain in the ass — mentally. Maybe some GUI sugar is necessary, although Day One is certainly not as pretty as advertised.) Also a private journal means more privacy — I certainly don’t want to publish everything I write on this public blog.
+
+Too much irrelevant talking. Onto one of the most annoying “features”, and the subject of this post. Images are automatically JPEG-compressed when imported into Day One. See [this support article](https://dayone.zendesk.com/hc/en-us/articles/200145875-Are-photos-resized-when-imported-into-Day-One-), which says:
+
+> Every photo imported into Day One is converted to JPEG format and resized to a maximum resolution of 2100 x 2100 pixels. The aspect ratio is maintained. We resize photos for more efficient sync and storage. At this size the average photo is about 700KB which means you can store:
+> * Dropbox: 2,500+ photos using the free 2GB account
+> * iCloud: 6,000+ photos using the free 5GB account
+
+What the heck. Dude, who cares about storage these days? And transfer rate? I have a gigabit Ethernet. I certainly have much more than 2GB in my Dropbox. Even for those underpriviledged folks with only 2GB, remember, Day One allows *only one photo per entry*. That’s 2,500+ entries. At any rate, this should be an opt-in rather than an uncustomizable “feature”. I’m about to submit a ticket, but I doubt the outcome (I’m sure many people have submitted tickets about the plain text format even when password-protected, but so far, no response).
+
+With photos, most of the time JPEG compression works pretty well (but people surely want to keep photos in highest quality). However, I’m a techie guy, and my images are often screenshots or precision images, where JPEG compression totally ruins the sharpness.
+
+Workaround? Simple (yet a bit annoying). Day One lets you show the photo in Finder. So just go ahead and replace that compressed image with the original using `cp` or `mv`. I shouldn’t have needed to do this, but every piece of software comes with some annoyances. Overall Day One’s pretty good — at least it does what it was designed for, albeit not perfectly.
+
+---
+
+By the way, here is my support ticket:
+
+> I understand that Day One does JPEG compression to every imported photo, as written in the support article “Are photos resized when imported into Day One?” http://goo.gl/Rzi017 . Yet I beg an option. The reason is that the benefits outlined in the support article are virtually non-existent:
+>
+> * “More efficient sync and storage”: these days transfer rates are really high with SSDs and gigabit Ethernet, so reducing a few hundred KBs won’t help me the slightest;
+>
+> * “Dropbox: 2,500+ photos using the free 2GB account”: I have much more than 2GB in my Dropbox; even if I only have 2GB, Day One allows only one photo per entry, and that means 2,500+ entries with photos, which is more than enough for most users, I suppose. By the way, Dropbox storage shouldn’t be your concern; people will buy more when they need more.
+>
+> And some of the bad things about JPEG compression:
+>
+> * JPEG compression usually works pretty well with photos, but when I import high precision images, the sharpness is totally ruined;
+>
+> * People want to keep their photos in highest quality, which is defeated by forced compression.
+>
+> I know an ugly workaround, which is simply replace the compressed image with the original in the filesystem. But I would love to see an option to import images as originals (in fact, compression should be an opt-in). Really, transfer rates and storage grow so rapidly that they are not people’s primary concerns anymore. (For your information, OneDrive recently rolled out truly unlimited storage to Office 365 subscribers. Online storage is that cheap.) Thanks.
diff --git a/source/blog/2014-11-28-given-infinite-time.md b/source/blog/2014-11-28-given-infinite-time.md
new file mode 100644
index 00000000..833b4de4
--- /dev/null
+++ b/source/blog/2014-11-28-given-infinite-time.md
@@ -0,0 +1,8 @@
+---
+layout: post
+title: "Given infinite time"
+date: 2014-11-28 00:18:19 -0800
+comments: true
+categories: 
+---
+Given infinite time. There's so much I can do *given infinite time*. I don't think I'll ever be bored. But sadly the time assigned to each human being is finite. Actually it's epsilon, epsilon approaching zero. Sadly.
diff --git a/source/blog/2014-11-28-going-diceware.md b/source/blog/2014-11-28-going-diceware.md
new file mode 100644
index 00000000..e649f374
--- /dev/null
+++ b/source/blog/2014-11-28-going-diceware.md
@@ -0,0 +1,12 @@
+---
+layout: post
+title: "Going Diceware"
+date: 2014-11-28 19:05:59 -0800
+comments: true
+categories: 
+---
+Today I'm officially going [Diceware](http://world.std.com/~reinhold/diceware.html). I published my simple C implementation of diceware on [GitHub](https://github.com/zmwangx/diceware).
+
+I've been using 1Password for a couple years now, and I've always been a bit worried about my master password. It's a ~30 byte monster with uppercase, lowercase letters, numbers, and special symbols. By any measure it is very safe. The problem is there are (extremely) personal things in there. I assembled several unrelated things that I (secretly) hold dearest to my heart, obfuscated them with rules not found in best64, and mixed with semi-gibberish. My daily login password is a combo similar in nature, with less obfuscation to facilitate typing. People who dig really deep into my identity might be able to compromise it (or not); I'm afraid that I'm more predictable than I thought I was. I know, the worry is pretty much unwarranted, as I’m not likely the target of a focused attack — I’m neither rich nor equipped with sensitive information or power, and for wide-range exploits, 99.9% of people are lower-hanging fruits. Even for a targeted attack, [xkcd 538: Security](http://xkcd.com/538/) broke a crypto nerd’s imagination with a $5 wrench. However, a geek is a geek, you can’t block a geek’s imagination.
+
+Therefore, after worrying for so long, today I’m going Diceware. Eight diceware words give you at least 100 bits of true entropy. Unfortunately I don’t have a die, and don’t bother to get one. (Amazon Prime: get it Monday? No. Target, six miles away? No.) So I read my random bits from `/dev/urandom`. The C implementation is [here](https://github.com/zmwangx/diceware). By publishing this I’m announcing to the world that I’m using diceware. But I’m not afraid, since I’m now protected by true entropy that’s not compromised by publishing the scheme.
diff --git a/source/blog/2014-11-30-opera-style-advanced-keyboard-shortcuts-in-safari.md b/source/blog/2014-11-30-opera-style-advanced-keyboard-shortcuts-in-safari.md
new file mode 100644
index 00000000..f76879f3
--- /dev/null
+++ b/source/blog/2014-11-30-opera-style-advanced-keyboard-shortcuts-in-safari.md
@@ -0,0 +1,45 @@
+---
+layout: post
+title: "Opera-style advanced keyboard shortcuts in Safari"
+date: 2014-11-30 17:20:20 -0800
+comments: true
+categories: 
+---
+I've been using the Chromuim Opera for a long time, after Chrome's design went unbearably ugly around v32 (IIRC Opera stable channel was on v19 when I switched, which was released on January 28, 2014). From then on, Opera's [advanced keyboard shortcuts](http://help.opera.com/opera/Mac/1583/en/fasterBrowsing.html#advanced) has become an integral part of my browsing habit. In particular, the following are especially handy for me:
+
+* `1`: Cycle left through tabs;
+* `2`: Cycle right through tabs;
+* `/`: Find on page;
+* `Z`: Go back one page;
+* `X`: Go forward one page;
+* `0`: Zoom in;
+* `9`: Zoom out;
+* `6`: Reset zoom to 100%.
+
+Lately, with the Yosemite release, Safari has become a much more competitive browser. I won't say why, and I admit that it has major missing features that still prevents it from becoming my default — but I have to say I’m gradually moving more of more of my browsing, especially reading, to Safari. It would be nice if I could carry my power user shortcuts with me. Fortunately, this is possible. Just modify the plist in the following way:
+
+```bash safari-advanced-keyboard-shortcuts.sh
+#!/usr/bin/env bash
+defaults write com.apple.Safari NSUserKeyEquivalents '{
+"Actual Size"="6";
+"Back"="z";
+"Find..."="/";
+"Forward"="x";
+"Show Previous Tab"="1";
+"Show Next Tab"="2";
+"Zoom In"="0";
+"Zoom Out"="9";
+}'
+```
+
+Relaunch Safari. You are all set! Enjoy the ultrafast single key navigating experience. To reset,
+
+```bash
+defaults delete com.apple.Safari NSUserKeyEquivalents
+```
+
+---
+
+**_2014/12/22 Update:_**
+
+There's one caveat to this approach — unlike in Opera, where the default layman shortcuts (e.g., ⌘F) are still available when advanced keyboard shorts are enabled, in Safari they are simply overwritten. This is annoying when the web page or web app binds certain keys, especially `/` to its own search bar (a notable example being google.com). In that case I have to admit defeat and click on the menu bar item, which takes a hundred times as long as a single `/` keystroke.
diff --git a/source/blog/2014-12-05-distraction-free-writing.md b/source/blog/2014-12-05-distraction-free-writing.md
new file mode 100644
index 00000000..122f6fc2
--- /dev/null
+++ b/source/blog/2014-12-05-distraction-free-writing.md
@@ -0,0 +1,34 @@
+---
+layout: post
+title: "Distraction free writing"
+date: 2014-12-05 21:09:10 -0800
+comments: true
+categories: 
+---
+This is not the first time that a distraction free writing app is featured on the Mac App Store. This time the candidate is [Desk](https://itunes.apple.com/us/app/desk/id915839505?mt=12). The official website is [here](http://desk.pm), but licensing is MAS-exclusive. The icon looks like this:
+
+![](http://i.imgur.com/OprXSEU.png)
+
+Skeuomorphism, oh man. And this is the only screenshot I can find on the official website:
+
+![](http://i.imgur.com/WBaYzho.png)
+
+I can find a few other screenshots on MAS, but you know how shitty MAS screenshots are, plus the screenshots of this app only focus on specific UI elements. The official website also features an intro video (which provides no information at all) and a brief feature list with no further details, all on one page. The MAS description is somewhat more comprehensive, but again, "WordPress integration" and the like are not so informative. So, after a certain amount of research, I have to say I know little about this app. To do the app justice, there's an [accompanying blog](http://blog.desk.pm), with all kinds of noise though — like what a good blog should be, no complaint about that. So I guess anyone who wants to know more about this app should go digging there. Not me, so I didn't read.
+
+Strangely enough, reception is great, although the price tag is currently set at $30 — definitely a premium price. John Gruber [has a piece](http://daringfireball.net/linked/2014/11/22/desk), but I think "My thanks to Johb Saddington for sponsoring this weeks' DF RSS feed to promote Desk, his blogging app for the Mac" kind of defeats credability. MAS featuring is also a good sign (although not always). Out of the 55 MAS ratings at the time of writing (9:42 PM, Friday, December 5, 2014), 45 are five stars.
+
+That brings home my curiosity about "distraction free writing apps" in general. _Why would anyone pay $30 for a "distraction free writing app" (which basically justifies any lack of feature — "we deliberately give you no choice for anything so you can focus on writing!"), **without even a trial**?_ MAS is such a bad model for utility and productivity software since you can't just look at five screenshots (seriously?) and decide "this is for me!" Yet I have the impression that more developers prefer this model nowadays, especially in this focused-writing business, another example being IA Writer. Sure it makes licensing and combating piracy simple, but again, I need to feel it to decide if it's the right tool for me, especially for a feature-deprived focused-writing app. (This is a general thought — in this case I don't need to feel it to tell that it's not for me.)
+
+More specifically, let's think about distraction free writing. What does IA Writer, or Desk, or other apps offer that's not already available to you with your OS? They support Markdown syntax highlighting, or even WYSYWYG (but only the very simple kind of WYSYWYG limited by the Markdown feature set), sure. They support some select-and-click type of formatting (by the way, Desk's formatting tools look a lot like those found on medium.com), which is good for some who are not competent enough to type simple markups, I guess. Desk supports drag-and-drop of media (although I'm sure it's limited to certain platforms and not portable at all — I always upload images to Imgur and embed the Imgur links, which is super simple for me since I have several homemade scripts to take care of that). So are these features essential? Not at all. For the general public, plain Markdown without rendering should be more than enough, since Markdown was designed to be human-readable as plain text in the first place. Markdown only gets ugly when you have a lot of inline hyperlinks, or worse still, plain HTML tags, but that's not what I would expect from the general public. The technical population who do probably need the rendering, on the other hand, aren't the target audience of these apps; certain needs of the technical folks are hardly ever addressed by these feature-deprived focused-writing apps — e.g., where are my keybindings (full-featured, not just C-k, C-y, C-p, C-n, C-b, C-f, M-del, etc.; in particular, what about M-d, M-b, etc.)? What about custom Markdown engine? What about Jekyll integration (no need for that, actually — I'm happy with tty)? So, to sum up, for the target audience, realtime rendering isn't necessary, although I guess people with technophobia hate to see markups like `**` so no rendering will kill them. Second point, select-and-click type of formatting, is already dismissed. Third point, drag-and-drop of media might be useful for some people, but not all. After all, Desk uses a typewriter as its icon, and there's no way you could throw photos into your typewriter. It's about writing, and most of the time writing is enough.
+
+I have dismissed the "additional features" of focused-writing apps as non-essential. And I can argue that they are actually sources of distraction — as soon as you have WYSYWYG and formatting and mouse, you could, in principle, begin to fiddle. But when I say "additional features", you might ask, "additional" compared to what? Okay here's the magic. The magic is designed by Apple in California®, and it's present on every single Mac running OS X. It's called TextEdit.app. Distraction free? How can you be more distraction free than this:
+
+![](http://i.imgur.com/z3LEu0U.png)
+
+It's either text or blank. Nothing else. It's more than capable of handling plain text, our best friend (and computer's best friend — the universal interface). You can customize the font once and for all, or you can even live with the factory setting. That's better than having a font you don't like forced upon you, as many of those focused-writing apps do. You can even auto save to iCloud if you'd like to. Of course there's no one click publishing or timeline management or whatever, but you could leave that to a publishing app (like Desk, when used as a publishing app). Better yet, you can use Jekyll or Octopress or whatever command line solution, where everything is at your fingertip, a few keystrokes away. No limitation whatsoever. But that's out of question for most people. (The easy-to-use command line interface, and not needing to worry about hosting myself, are two of the primary reasons that brought me to Octopress on GitHub Pages, rather than wordpress.com or self-hosted wordpress.org).
+
+Of course I'm not saying TextEdit is good enough as a text editor (it is good enough for most people, though), or it is my text editor of choice. My text editor has always been Emacs, which can be distraction free when I need it to be (I've hidden everything I feel like to hide), and which can be an almost feature-complete operating system when I need it to be. Apart from a slightly frustrating loading time, there's no such bullshit as "we deliberately left no feature and no choice to you so you won't fiddle." Mostly importantly, it is extensible — I can start writing Elisp right away, and every single line of code I write can potentially save me thousands of keystrokes in the future; I don't need to submit a feature request to the developer and wait forever (usually power users' feature requests are ignored, unless the software was built for power users to begin with or mainly popular within power users). Plus Emacs is free (both as in beer and in speech), rather than being proprietary and costing $30. At any rate, when I'm writing in Emacs, most of the time I'm just furiously typing away — no distraction whatsoever. That's the ideal state of writing, and I feel really good at those moments. That's the main charm of writing, at least to me.
+
+![](http://i.imgur.com/2Jx9Mpv.png)
+
+The whole command line experience is awesome (most of what I do with the computer are either done in the browser or in iTerm2 — well, plus some time spent with PDF in Preview.app and some with emails in Mail.app). And most of my tools either ship with the operating system (OS X is a great operating system), or are FOSS. Things that hardly ever die. Of course the command line experience is infeasible for laymen, but my argument is, **most of the time the things you need are already there, e.g., TextEdit.** I feel bad about those folks who are constantly on the lookout for distraction-free writing apps, and pay a ridiculous amount for them — only to distract themselves. Just open TextEdit and type away (or if you're capable of it, Emacs or Vim or SublimeText or TextMate or BBEdit or whatever). That's the most productive thing to do. **Publishing is not the top priority; writing is, and it's really simple.**
diff --git a/source/blog/2014-12-05-python-3-and-unicode.md b/source/blog/2014-12-05-python-3-and-unicode.md
new file mode 100644
index 00000000..d7d871d8
--- /dev/null
+++ b/source/blog/2014-12-05-python-3-and-unicode.md
@@ -0,0 +1,8 @@
+---
+layout: post
+title: "Python 3 and Unicode"
+date: 2014-12-05 15:01:54 -0800
+comments: true
+categories: 
+---
+I never realized that in Python 3 Unicode is the default; in particular, `str` in Python 3 is practically equivalent to `unicode` in Python 2. This might be the *one thing* that convince me to migrate. `str.encode()`, `str.decode()`, `unicode.encode()`, `unicode.decode()`, etc. are so confusing that I'm never 100% sure what I'm doing (only-occasionally-used-but-unavoidable-and-worst-of-all-very-confusing "features" are nightmares).
diff --git a/source/blog/2014-12-10-omnifocus-change-sync-behavior-mac-and-ios.md b/source/blog/2014-12-10-omnifocus-change-sync-behavior-mac-and-ios.md
new file mode 100644
index 00000000..4ee29d57
--- /dev/null
+++ b/source/blog/2014-12-10-omnifocus-change-sync-behavior-mac-and-ios.md
@@ -0,0 +1,20 @@
+---
+layout: post
+title: "OmniFocus: change sync behavior, Mac and iOS"
+date: 2014-12-10 22:45:34 -0800
+comments: true
+categories: 
+---
+On OS X, the following URIs are relevant:
+
+* <a href="omnifocus:///change-preference?MaximumTimeBetweenSync=30">omnifocus:///change-preference?MaximumTimeBetweenSync=30</a>
+* <a href="omnifocus:///change-preference?TimeFromFirstEditToSync=2">omnifocus:///change-preference?TimeFromFirstEditToSync=2</a>
+
+What they do are self-evident.
+
+On iOS, use the following URIs instead:
+
+* <a href="x-omnifocus-debug:set-default:MaximumTimeBetweenSync:60">x-omnifocus-debug:set-default:MaximumTimeBetweenSync:60</a>
+* <a href="x-omnifocus-debug:set-default:TimeFromFirstEditToSync:2">x-omnifocus-debug:set-default:TimeFromFirstEditToSync:2</a>
+
+Source: [Change Default Sync Times of OmniFocus For Mac and iOS](http://www.macstories.net/links/change-default-sync-times-of-omnifocus-for-mac-and-ios/).
diff --git a/source/blog/2014-12-13-the-mac-like-evernote.md b/source/blog/2014-12-13-the-mac-like-evernote.md
new file mode 100644
index 00000000..7eacfad3
--- /dev/null
+++ b/source/blog/2014-12-13-the-mac-like-evernote.md
@@ -0,0 +1,16 @@
+---
+layout: post
+title: "The Mac-like Evernote"
+date: 2014-12-13 21:47:31 -0800
+comments: true
+categories: 
+---
+Once in a while (maybe a year, maybe several months — not set in stone), I give big name free services not in use a chance to convince me. Evernote is one such service. The interface used to look very cheap and cluttered. I hated it. However, this time I'm sold. Now everything Evernote, from its Mac app to its iOS app to its web design to its physical products, looks distinctively Mac-like. (I use Mac-like to refer to Apple's design philosophy, including iOS. Well, I guess the Android and Windows apps aren't Mac-like.) I mean, just look at the screenshots:
+
+![Web UI, beta](http://i.imgur.com/AZelofm.png)
+![Evernote Market, Pfeiffer Collection](http://i.imgur.com/tZuWBlY.png)
+![Mac app](http://i.imgur.com/R4QF8OM.png)
+
+Bright, simplistic, elegant, clutter-free. Mac-like. The Mac app takes advantage of the translucent material of Yosemite, and it looks gorgeous. The iOS app also feels great on a full HD Retina screen; I didn't bother to take a screenshot. Now it's much likely that I'll put it into good use — cluttered and cheap-looking interfaces give me nightmares and actually hinders my productivity, and now they are gone.
+
+No one can argue that Apple products make great screenshots. They are also much more intuitive, functional, and productive than most Windows folks are willing to believe. I hope our world is more Mac-like.
diff --git a/source/blog/2014-12-14-speeding-up-emacs-with-emacsclient.md b/source/blog/2014-12-14-speeding-up-emacs-with-emacsclient.md
new file mode 100644
index 00000000..f82f63cf
--- /dev/null
+++ b/source/blog/2014-12-14-speeding-up-emacs-with-emacsclient.md
@@ -0,0 +1,36 @@
+---
+layout: post
+title: "Speeding up Emacs with emacsclient"
+date: 2014-12-14 10:06:02 -0800
+comments: true
+categories: 
+---
+Emacs is notorious for its loading time. For me, this is especially annoying when I'm editing LaTeX files — AUCTeX takes about five seconds to load, and once I exit Emacs (especially after a quick edit), all that work is wasted, and next time I want to do some quick editing with that same LaTeX file — sorry, another five seconds.
+
+This problem can be solved by "using that same Emacs", i.e., running Emacs in server mode, then connecting to the server via `emacsclient`. Below is my script, which I call `emc`, to make `emacsclient` more user-friendly. `emc` opens a file (given as `$1`) on the server, launching one on its way if none is detected. Note that I used `-cqta=` for `emacsclient`. The `-c` option is `--create-frame`, i.e., create a new frame (in the current tty, for instance) instead of using the existing frame (in another tty, for instance); this allows for multiple frames accross different ttys. The `-q` option is for `--quiet`, suppressing messages like "Waiting for Emacs..." The `-t` option is for `--tty`, or equivalently, the familiar `-nw` option of `emacs`. The `-a=` options is `--alternate-editor=`; according to the manpage, `-a, --alternate-editor=EDITOR` has the following effect:
+
+> if the Emacs server is not running, run the specified editor instead. This can also be specified via the \`ALTERNATE_EDITOR' environment variable. If the value of EDITOR is the empty string,  run \`emacs --daemon' to start Emacs in daemon mode, and try to connect to it.
+
+Note that `emacsclient` requires a filename, so my script prompts for one if `$1` is empty.
+
+``` bash emc
+#!/usr/bin/env bash
+if [[ -n $1 ]]; then
+    file=$1
+else
+    while [[ -z ${file} ]]; do
+        read -p 'filename: ' file
+    done
+fi
+emacsclient -cqta= "${file}"
+```
+
+Note that using `emacsclient` has the additional benefit that the same buffer is simultaneously updated accross different ttys (See screenshot, where I opened the current post in two different ttys). This way, you won't face the nasty "file changed on disk" problem when you accidentally edited the same file in another tty session.
+
+![screen shot of multiple copies of the same buffer](http://i.imgur.com/9KxEWKq.png)
+
+By the way, remember to re-configure your other programs that uses an external editor. For instance, change `$EDITOR` to `emacsclient -cqta=` in your `env`, and `core.editor` to `emacsclient -cqta=` in your `~/.gitconfig`.
+
+*Note*: if you use `emacsclient` to edit git commit messages in Git Commit Mode, remember to use `C-c C-c` (`git-commit-commit`) to save the commit message rather than using `server-edit` or `C-x C-c` to exit Emacs. Otherwise, the `COMMIT_EDITMSG` buffer will persist in the Emacs server, and you'll be prompted to revert buffer the next time you edit another commit message, which is pretty annoying.
+
+I just started using `emacsclient`, so the above script might be buggy in certain edge cases. I'll report when I run into issues.
diff --git a/source/blog/2014-12-14-the-google-chrome-comic-a-classic.md b/source/blog/2014-12-14-the-google-chrome-comic-a-classic.md
new file mode 100644
index 00000000..b1fe01b5
--- /dev/null
+++ b/source/blog/2014-12-14-the-google-chrome-comic-a-classic.md
@@ -0,0 +1,21 @@
+---
+layout: post
+title: "The Google Chrome Comic — A classic"
+date: 2014-12-14 17:42:55 -0800
+comments: true
+categories: 
+---
+I was cleaning up my Opera bookmarks just now — I'm semi-officially leaving Opera for Safari. Of course, Safari still can't handle everything (e.g., Adblock Plus is still not so good on Safari, YouTubeCenter lags behind and I don't bother to compile myself — yes, I have a certificate, and some power user features simply don't exist), so I'm still going to Opera/Opera beta/Chrome/Firefox for certain tasks. But Safari is very nice. For the first time.
+
+I started out as a Chrome user (well, don't want to recall the IE days), branched out to the Chromium Opera, and now ended up in Safari. Not sure about the future. When I look back, something nostalgic pops up in mind — [the Google Chrome Comic](http://www.google.com/googlebooks/chrome/). I enjoyed it more than once, but I never seemed to have archived it. So here it is, combined into [one PDF](https://dl.bintray.com/zmwangx/generic/2008-chrome-comic.pdf). In fact, you can create the PDF yourself:
+
+```
+seq 0 39 | parallel wget -q http://www.google.com/googlebooks/chrome/images/big/{}.jpg
+convert $(ls -v *.jpg) 2008-chrome-comic.pdf
+```
+
+Here I was a bit lazy and used a GNU `ls` feature: `-v` for natural sorting of numbers (doesn't work for BSD `ls`).
+
+And here's page 1 of the comic as a teaser:
+
+![](http://i.imgur.com/W5pJTjl.jpg)
diff --git a/source/blog/2014-12-19-app-suggestion-dropzone-3.md b/source/blog/2014-12-19-app-suggestion-dropzone-3.md
new file mode 100644
index 00000000..340828a5
--- /dev/null
+++ b/source/blog/2014-12-19-app-suggestion-dropzone-3.md
@@ -0,0 +1,12 @@
+---
+layout: post
+title: "App suggestion: Dropzone 3"
+date: 2014-12-19 14:08:57 -0800
+comments: true
+categories: 
+---
+I recently tried and purchased [Dropzone 3](https://aptonic.com/dropzone3/). See a list of features on the linked official website. In short, Dropzone 3 provides an intermediate zone for drag-n-drop. You can use it as a stash (called "Drop Bar" — stacking is available), use it as a shortcut by putting frequently used folders and applications there, or trigger actions by dropping. There are a dozen builtin actions and [an additional list of readily available actions](https://aptonic.com/dropzone3/actions/), covering common web drives, SNS and file sharing sites. **Better yet, you can develop your custom actions with the easy-to-use [Ruby API](https://github.com/aptonic/dropzone3-actions/blob/master/README.md#dzalerttitle-message).** For instance, I wrote a simple Google Translate action, `Google Translate.dzbundle` ([link](https://gist.github.com/zmwangx/b27f106a8ba47468a43d)), based on [translate-shell](https://github.com/soimort/translate-shell). (You know, it's Ruby, so calling external commands and concatenating strings feel at home, as if you are coding in Perl or directly in shell; unlike Python, where you at least need to `import subprocess` then `subprocess.check_output` to get the output of an external command, and have to use a bunch of stupid `+`'s to get your goddamn message to print.)
+
+Although I use the terminal for most tasks, drag-n-drop is still useful and convenient at times, not to mention the custom actions. (And the stock drag-n-drop is kinda hit-and-miss, especially for people like me who are mostly working with windows maximized — except terminal windows.) After using Dropzone 3 for a while, I found it well worth $4.99.
+
+Wait, I didn't mention the pricing? Dropzone 3 is only [$4.99 on MAS](https://itunes.apple.com/us/app/dropzone-3/id695406827?ls=1&mt=12), so get it while supplies last. (Somehow the license is $10 on the developer's online store, so definitely buy from MAS and change to the [unsandboxed version](https://aptonic.com/dropzone3/sandboxing.php) later — de-sandboxing is free.) There's also a 15-day free trial.
diff --git a/source/blog/2014-12-22-10k-images-on-imgur.md b/source/blog/2014-12-22-10k-images-on-imgur.md
new file mode 100644
index 00000000..a9a96bde
--- /dev/null
+++ b/source/blog/2014-12-22-10k-images-on-imgur.md
@@ -0,0 +1,8 @@
+---
+layout: post
+title: "10k images on imgur"
+date: 2014-12-22 12:42:16 -0800
+comments: true
+categories: 
+---
+I happened to check my imgur account just now (haven't been to the web interface for ages), and you know what, I have uploaded 10,744 images since I created the account in February this year! (I've been using imgur for longer than that; previously I uploaded images anonymously.) Most of the 10k images were uploaded via scripts using the API. This again demonstrates the importance of a good API — without the imgur API I wouldn't have been able to upload hundreds of images with a few keystrokes all in a snap, and getting links would be a huge pain in the ass. There are myriad image hosting services out there, but imgur rules 'em all, thanks to its decent API (and also its good CDN and direct image links, of course).
diff --git a/source/blog/2014-12-23-mpv-launcher.md b/source/blog/2014-12-23-mpv-launcher.md
new file mode 100644
index 00000000..1bb85b50
--- /dev/null
+++ b/source/blog/2014-12-23-mpv-launcher.md
@@ -0,0 +1,26 @@
+---
+layout: post
+title: "mpv launcher"
+date: 2014-12-23 00:51:05 -0800
+comments: true
+categories: 
+---
+**_04/06/2015 update:_**
+
+I just noticed that `daemonize` doesn't play too well with the OS; in particular, when you use dark menu bar on OS X Yosemite, apps launched with `daemonize` won't conform to that. So a native shell solution would be using `/bin/zsh` and run
+
+    mpv "$@" >/dev/null 2>&1 </dev/null &!
+
+instead.
+
+---
+
+[`mpv`](http://mpv.io) is a nice simplistic video player (fork of MPlayer and mplayer2). The CLI is flawless (and you can run as many instances as you want), but when it comes to the OS X application bundle, there's one major annoyance. Each app bundle could only have one running instance (unless `open -n`’ed, which is not how sane people use app bundles), and one instance of `mpv` only supports one video. So, say I'm playing one video with the app bundle, and unsuspectingly opens another in Finder (which is associated to `mpv.app` by default), then the latter video immediately takes over, and the position in the first video is lost. That happens *a lot*.
+
+Today I finally gave this issue some serious thought (I've been on a bug report/enhancement request spree these days so it's natural for me to start thinking about enhancements). Turns out that there's a pretty simple workaround. I created an automator app `mpv-launcher.app` that does one thing: "Run Shell Script" (pass input as arguments)
+
+    daemonize /usr/local/bin/mpv "$@"
+
+in the shell of your choice (for me the shell of choice is `zsh` since the env would be readily available from my `zshenv`). `daemonize`, as the name suggests, daemonizes the process so that the process doesn't block; this way, `mpv-launcher.app` immediately quits after launching, making multiple "instances" possible. (`daemonize` can be installed via `brew install daemonize`; note that you need to specify the full path of the command to daemonize, which in my case is `/usr/local/bin/mpv`). And there you go. Associate your video files to `mpv-launcher.app`. Launch as many instances as you want. Enjoy.
+
+By the way, I also filed an [enhancement request](https://github.com/mpv-player/mpv/issues/1377) with `mpv-player/mpv`. We'll see what the developers can do. Hopefully the app bundle will support multiple videos out of box in the future.
diff --git a/source/blog/2015-01-01-os-x-system-ruby-encoding-annoyance.md b/source/blog/2015-01-01-os-x-system-ruby-encoding-annoyance.md
new file mode 100644
index 00000000..2bef694d
--- /dev/null
+++ b/source/blog/2015-01-01-os-x-system-ruby-encoding-annoyance.md
@@ -0,0 +1,43 @@
+---
+layout: post
+title: "OS X system ruby encoding annoyance"
+date: 2015-01-01 22:49:39 -0800
+comments: true
+categories: 
+---
+I've been using RVM (with fairly up-to-date Rubies) and pry since my day one with Ruby (well, almost), so it actually surprises me today when I found out by chance how poorly the system Ruby behaves when it comes to encoding.
+
+The major annoyance with the current system Ruby (2.0.0p481) is that it can't convert `UTF8-MAC` to `UTF-8` (namely, NFD to NFC, as far as I can tell), at least not with Korean characters. Consider the following script:
+
+```ruby utf8-mac.rb
+# coding: utf-8
+require 'hex_string'
+str = "에이핑크"
+puts str.to_hex_string
+puts str.encode("UTF-8", "UTF8-MAC").to_hex_string
+```
+
+Here are what I get with the system Ruby and the latested brewed Ruby:
+
+```bash
+> /usr/bin/ruby --version
+ruby 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin14]
+> /usr/local/bin/ruby --version
+ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin14]
+> /usr/bin/ruby utf8-mac.rb
+e1 84 8b e1 85 a6 e1 84 8b e1 85 b5 e1 84 91 e1 85 b5 e1 86 bc e1 84 8f e1 85 b3
+e1 84 8b e1 85 a6 e1 84 8b e1 85 b5 e1 84 91 e1 85 b5 e1 86 bc e1 84 8f e1 85 b3
+> /usr/local/bin/ruby utf8-mac.rb
+e1 84 8b e1 85 a6 e1 84 8b e1 85 b5 e1 84 91 e1 85 b5 e1 86 bc e1 84 8f e1 85 b3
+ec 97 90 ec 9d b4 ed 95 91 ed 81 ac
+```
+
+As you can see, in the case of the system Ruby, NFD is left untouched. This leads to problems with, for instance, Google Translate. One obvious solution is to outsource the task to `iconv`, but I have the impression that outsourcing language features to shell commands is a generally despised practice.
+
+There's one more surprise. While `pry` with latest Rubies tend to handle Unicode very well (unlike `irb`), I tried `pry` with the current system Ruby, and it doesn't work; due to this annoying limitation, I couldn't even test the above problem interactively, and had to resort to a script. Maybe the problem can be resolved by compiling Ruby with `readline` or whatever; I didn't bother. The bottom line is, the system Ruby is not very pleasant for men in the 21st century — good Unicode support ought to be a must. (By the way, NFD in HFS+ is maddening. It breaks Terminal, iTerm, Google Translate, scp with Linux hosts, and the list goes on.)
+
+P.S. In Dropzone 3 custom actions you can select a custom Ruby with the `RubyPath` meta field, e.g.,
+
+```ruby
+# RubyPath: /usr/local/bin/ruby
+```
diff --git a/source/blog/2015-01-10-fonts-why-chinese-web-design-is-hard.md b/source/blog/2015-01-10-fonts-why-chinese-web-design-is-hard.md
new file mode 100644
index 00000000..7d6e5ee8
--- /dev/null
+++ b/source/blog/2015-01-10-fonts-why-chinese-web-design-is-hard.md
@@ -0,0 +1,16 @@
+---
+layout: post
+title: "Fonts: why Chinese web design is hard"
+date: 2015-01-10 09:30:02 -0800
+comments: true
+categories: 
+---
+For years I've been complaining about Chinese websites' horrendous designs. Yesterday I tried to translate one of my simple project websites to Chinese, and finally realized that web design for the Chinese language is no simple task — much harder than for English. The problem is fonts. This might not be the only problem (and cannot take blame for all the horrendous designs), but it certainly seems to be a roadblock.
+
+The problem with fonts boils down to the fact that the Chinese writing system has too many glyphs. I still remember learning things about the GB 2312 charset when I was twelve — there are 3755 Level 1 characters (more commonly seen), 3008 Level 2 characters, and other symbols and foreign glyphs. Designing more than six thousand Chinese characters is so much harder than designing 26 letters. I'm not sure if many glyphs are auto-generated from parts, but that would certainly degrade the quality. The result? Availability of digital fonts suffers. There are simply not so many choices of Chinese fonts. Chinese writing is beautiful, but I've yet to see a font for screens (let alone the web) that conveys that beauty. This might be subjective, but I have the impression that fonts generally look worse on screen than in print, and more so for Chinese fonts (Retina doesn't help much). For the record, I checked Apple's font usage at the moment, and they are using a tailored font named "PingHei" ("平黑", I guess; see screenshot at the end); I'm not at all impressed. Compare that to the English counterpart (also at the end) — not on the same level. (I won't talk about Microsoft since it doesn't feature a design department, or that department is brain dead. Well, I'm a little opinionated.)
+
+Another problem triggered by the vast number of glyphs is that font files are large. I looked at a dozen OTF fonts with SC or TC glyphs, and none seems to be below 10 MB. That's clearly a no go on the web — not until everyone has a gigabit connection, I suppose. I tried to Google for Chinese webfonts and had little success, so I'm not sure if woff helps. I've heard that Apple is able to pack a reduced set of PingHei glyphs into woffs less than 1 MB (keep in mind that PingHei being sans serif is simpler than serif fonts like Songti); that's pretty remarkable. I don't know much about font technologies so I can't comment more on this matter, but from my observation all Chinese websites (with the exception of apple.com/cn, I guess) rely on locally installed fonts, and most don't even have a list of fallbacks, i.e., typefaces simply aren't part of their designs. Even if they do have a list of fallbacks, they won't be able to guarantee uniform experience across the board (as far as I know, the lowest common denominator of Chinese fonts across all platforms seem to be zero). Apple has taught us that design must be integrated and perfected (well, Apple wasn't the first to do design, but they did bring it to the digital world and to the masses). Any fragmented design is doomed to fail.
+
+![](http://i.imgur.com/MPmtSJI.png)
+
+![](http://i.imgur.com/hBpdv0B.png)
diff --git a/source/blog/2015-01-21-web-design-microsoft-vs-apple.md b/source/blog/2015-01-21-web-design-microsoft-vs-apple.md
new file mode 100644
index 00000000..5f8cb833
--- /dev/null
+++ b/source/blog/2015-01-21-web-design-microsoft-vs-apple.md
@@ -0,0 +1,19 @@
+---
+layout: post
+title: "Web design: Microsoft vs Apple"
+date: 2015-01-21 16:30:51 -0800
+comments: true
+categories: 
+---
+I just had a look at Ars's live blog on today's Windows 10 Event to acquire a sense of where Windows is heading. There's not much to report. Safari rip-off (Microsoft's new Spartan — wait, is this name also inspired by Safari? — features reading mode and offline reading list, Safari's killer features) aside, the focus seems to be virtual assistant, PC-tablet-phone integration, and gaming, none of which I'm interested in. The hologram thing does look cool, but putting the hype aside, I doubt if it will be really useful for the masses (except probably in gaming, one of my most despised applications of computing). I'm not a visionary so maybe I'm underestimating this.
+
+(Another interesting development is "Windows as a Service" — WaaS? Microsoft isn't communiating it effectively. If it means paid subscription, am I ever going to subscribe to an OS? No. If it instead means free system updates for the lifetime of a device, then this WaaS thing is just a vacuous buzz phrase — Apple has already been doing it for two years. Longer if you count the cheap upgrades. However, if free system updates is indeed the case, then what about VMs? Not sure.)
+
+The only thing I would like to see Apple copy from Microsoft is the unlimited OneDrive — come on, we already paid enough for our hardware, why can't we have unlimited cloud storage? I would even pay $10 per month for that — Microsoft is offering Office 365 along with unlimited cloud storage, all for just $10, so it certainly won't hurt Apple. The current iCloud pricing is ridiculous.
+
+All the discussions above are not the main point of this post though. The point is, I went to the Windows website to learn more about Windows 10, and just can't believe my eyes in how awful it is designed. Just look at the font and the layout of <http://windows.microsoft.com/en-us/windows-10/about> (full web page screenshot courtesy of [web-capture.net](http://web-capture.net)). And compare that to <http://www.apple.com/osx/> (scroll past the Windows screenshot). Holy crap, I even booted my Windows 8.1 VM just to make sure I'm not lacking the necessary fonts available on Windows.
+
+Why Microsoft's web design is so shitty is always beyond my grasp. For OS X, a potential customer would be eager to set his hands on it just by looking at its beautifully-crafted homepage and a few screenshots there. For Windows it's exactly the opposite. I mean, apart from metro apps (worst and ugliest desktop experience ever), modern Windows actually looks pretty good. But their shitty advertising totally ruins it. I guess it doesn't matter much for Microsoft, for all design-savvy folks who are not stuck on Windows are already using OS X, and most of their customers just need a commodity OS.
+
+![](http://i.imgur.com/0eIt4SR.png)
+![](http://i.imgur.com/piUO0xY.png)
diff --git a/source/blog/2015-02-10-monitor-progress-of-your-unix-pipes-with-pv.md b/source/blog/2015-02-10-monitor-progress-of-your-unix-pipes-with-pv.md
new file mode 100644
index 00000000..2f58e884
--- /dev/null
+++ b/source/blog/2015-02-10-monitor-progress-of-your-unix-pipes-with-pv.md
@@ -0,0 +1,60 @@
+---
+layout: post
+title: "Monitor progress of your Unix pipes with pv"
+date: 2015-02-10 02:18:30 -0800
+comments: true
+categories: 
+---
+Recently I found a very useful utility called `pv` (for "pipe viewer"). [Here](http://www.ivarch.com/programs/pv.shtml) is its home page, and it can be easily installed with `brew`. According to its man page,
+
+> `pv` shows the progress of data through a pipeline by giving information such as time elapsed, percentage completed (with progress bar), current throughput rate, total data transferred, and ETA.
+
+For more info, see its home page (linked above) and [man page](http://linux.die.net/man/1/pv).
+
+Why is it useful? Well, pretty obvious if you are in the right audience. For me, one particularly important use case is with `openssl sha1`. I deal with videos on a daily basis, and back up all of them to OneDrive (ever since OneDrive went unlimited). To ensure integrity of transfer (in future downloads), I append the first seven digits of each video to its filename. This should be more than enough to reveal any error in transfer except for active attacks. One additional advantage is that I can now have multiple versions of a same show, event, or whatever and don't have to worry about naming conflicts (and don't have to artificially say `-ver1`, `-ver2`, etc.). This little merit turns out to be huge and saves me a lot of trouble, since naming things is intrinsically hard:
+
+> There are only three hard things concurrency, in computer science: cache invalidation, naming things, and off-by-one errors.
+
+(I learned this beefed up version of two hard things only recently.) Well, too much digression. So SHA-1 sum is useful. (By the way, I learned in my crypto class that SHA-1 is broken as a collision-resistant hash function — not HMAC, which doesn't assume collision-resistance — and SHA-256 should be used instead. However, I'm not protecting against active attacks — I won't be able to without a shared secret key anyway — so the faster SHA-1 is good for my purpose.) But at the same time, SHA-1 is slow. Maybe what's actually slow is my HDD. Whatever the bottleneck, generating a SHA-1 digest for a 10 GB video file isn't fun at all; it's even more of a torture when there's no progress bar and ETA. But hopelessly waiting has become a thing of the past with the advent (well, discovery in my case) of `pv`. Now I have nice and informative progress bars, which reduces the anxiety of waiting by an order of magnitude.
+
+For the record, here's the current version of my ruby script that attaches the first seven digits of the SHA-1 digests of the given files to their filenames:
+
+```ruby 7sha1
+#!/usr/bin/env ruby
+
+require 'fileutils'
+
+def rename(items)
+  num_items = items.length
+  num_done = 0
+  items.each {|path|
+    printf($stderr, "%d/%d: %s\n", num_done + 1, num_items, File.basename(path))
+
+    if ! File.directory?(path)
+      extname = File.extname(path)
+      basename = File.basename(path, extname)
+      dirname = File.dirname(path)
+      sha1sum = `pv '#{path}' | openssl sha1`
+      new_basename = basename + "__" + sha1sum[0,7]
+      new_path = File.join(dirname, new_basename + extname)
+      FileUtils.mv(path, new_path)
+    else
+      STDERR.puts("#{path}: directory ignored")
+    end
+    
+    num_done += 1
+  }
+end
+
+rename(ARGV)
+```
+
+You might ask why I used ruby (littered with bash) when it's obviously a job for bash or perl. Well, the reason is that I first wrote this thing in ruby as a [Dropzone 3 action](https://gist.github.com/zmwangx/d6406fb8bf51ac768770). I'm lazy, so I just borrowed that script and modified its printout for shell use.
+
+---
+
+By the way, I also found a project called `cv` (Coreutils Viewer), which is [officially described as](https://github.com/Xfennec/cv)
+
+> ... a Tiny, Dirty, Linux-Only C command that looks for coreutils basic commands (cp, mv, dd, tar, gzip/gunzip, cat, etc.) currently running on your system and displays the percentage of copied data.
+
+I'll look into it when I have time, but it from its description, it seems to be limited to coreutils, and OS X support might not be too awesome (at this point).
diff --git a/source/blog/2015-02-17-microsoft-is-getting-cool-but-not-its-website.md b/source/blog/2015-02-17-microsoft-is-getting-cool-but-not-its-website.md
new file mode 100644
index 00000000..7342568d
--- /dev/null
+++ b/source/blog/2015-02-17-microsoft-is-getting-cool-but-not-its-website.md
@@ -0,0 +1,20 @@
+---
+layout: post
+title: "Microsoft is getting cool (but not its website)"
+date: 2015-02-17 18:57:19 -0800
+comments: true
+categories: 
+---
+Microsoft is getting kind of cool. For instance, open sourcing .NET last year caused quite a buzz. Ars has a good piece about this: [Microsoft’s continuing efforts to be cool](http://arstechnica.com/information-technology/2015/02/microsofts-continuing-efforts-to-be-cool/).
+
+Three weeks ago Microsoft made another minor but totally unexpected move: they integrated AgileBits' `onepassword-app-extension` ([GitHub](https://github.com/AgileBits/onepassword-app-extension)) into the 5.0 release of the OneDrive iOS app. I didn't realize this until I read [yesterday's blog post on the OneDrive Blog](https://blog.onedrive.com/onedrive_secure_password/). This is really amazing when you put it in context: I mean, take a look at [Apps that love 1Password](https://blog.agilebits.com/1password-apps/), i.e., apps that have integrated that extension. Out of the ninety apps listed to date, there are only a dozen apps that I've heard of, and the only brands bigger than 1Password are Microsoft, Tumblr, Uber (infamous), and Walmart (what?). Microsoft embracing third party is surely an interesting phenomenon.
+
+Meanwhile,
+
+* Microsoft still won't let us use our password managers to its fullest (of course we can't blame it on the OneDrive folks): 16 characters max in this day and age (screenshot taken today)? Hmm. And I remember Microsoft recently said password length isn't the main source of vulnerability of its customers. WTF. Who cares about *your* stupid customers. I just want to protect *my own* data, and make sure that in case of a breach on *your* side, I won't face the same loss as your technologically illiterate customers. But that's not currently possible with Microsoft.
+
+![](http://i.imgur.com/CNv76zw.png)
+
+* Microsoft's UI design is still shit, [as well as their website](/blog/2015/01/21/web-design-microsoft-vs-apple/); I mean, seriously:
+
+![](http://i.imgur.com/wu66zZc.png)
diff --git a/source/blog/2015-02-20-my-dock-and-updated-omnifocus.md b/source/blog/2015-02-20-my-dock-and-updated-omnifocus.md
new file mode 100644
index 00000000..690b83e1
--- /dev/null
+++ b/source/blog/2015-02-20-my-dock-and-updated-omnifocus.md
@@ -0,0 +1,21 @@
+---
+layout: post
+title: "My dock and updated OmniFocus"
+date: 2015-02-20 16:16:10 -0800
+comments: true
+categories: 
+---
+
+> Simplicity is the ultimate sophistication.
+
+Here's a screenshot of my dock at the moment.
+
+![My dock](http://i.imgur.com/EhaJw57.png "My current dock. Left to right: Finder (TotalFinder), Mail, Safari, Chrome, iTunes, OmniFocus, iTerm2, Activity Monitor, and mpv. Everything except mpv is persistent.")
+
+Left to right: Finder (TotalFinder), Mail, Safari, Chrome, iTunes, OmniFocus, iTerm2, Activity Monitor, and mpv. Everything except mpv is persistent; mpv is there because I happen to be looping a piece of music with mpv that I don't plan to add to the iTunes library. The point is that it never looked this good, mainly due to the updated OmniFocus icon. Finally they put some serious thought into graphics design! Just compare [the v2.1 icon](https://dl.bintray.com/zmwangx/generic/omnifocus-v2.1.icns) to [the v2.0 version](https://dl.bintray.com/zmwangx/generic/omnifocus-v2.0.icns).
+
+![](http://i.imgur.com/KeTz5wK.png)
+
+Obviously the overpolished (and honestly, badly polished) 2.0 one belongs to the past. It "stood out" even among Mavericks dock icons (in terms of color), not to mention among the flattened-down Yosemite ones. Today, it finally becomes a native member of the dock. (Well, actually not today — I've been using the beta for a while, so the new icon didn't come as a surprise.) In fact, this time the Omni Group seems to be on a graphics design streak these days, and today they have a really impressive App Store feature banner:
+
+![](http://i.imgur.com/tILmveQ.png)
diff --git a/source/blog/2015-02-21-all-is-not-lost.md b/source/blog/2015-02-21-all-is-not-lost.md
new file mode 100644
index 00000000..75c1ede2
--- /dev/null
+++ b/source/blog/2015-02-21-all-is-not-lost.md
@@ -0,0 +1,20 @@
+---
+layout: post
+title: "All is not lost"
+date: 2015-02-21 17:12:32 -0800
+comments: true
+categories: 
+---
+Lubos Motl always attacks the Many-Worlds Interpretation as if it is on the same level as anti-scientific claims. He even went on to attack Hugh Everett (the guy who first formulated this interpretation) personally; *ad hominem* is of course typical Motl shit, and I don't bother to find those posts. Anyway, here's yet another one: [Many worlds: a Rozali-Carroll exchange](http://motls.blogspot.com/2015/02/many-worlds-rozali-carroll-exchange.html).
+
+Disclaimer: I'm not really a proponent of Many-Worlds, at least not of the part of it that says history really *branches* into *many* worlds. Well, Lubos is at least right about one thing: "many worlds", taken literally, can't even be well-defined. However, I do believe that the world is can be described by a "universal wavefunction" (I prefer to call it the "universal state vector") in some gargantuan Hilbert space. And the universal state vector has to evolve deterministically. The reason is simple: **_all information is not lost_**. This principle is fundamental to physics and it's simply not on the same level as falsifiability, which is little more than a philosopher's toy and a nice thing to have. In quantum mechanics' terms, *unitarity must be respected*; this is why the Copenhagen Interpretation, or at least the wavefunction-collapsing part of it, cannot hold up to serious scrutiny — no operator can ever collapse the wavefunction and break unitarity. Those who hold the Copenhagen Interpretation are confusing *their* lack of knowledge (albeit a fundamental one, as they were entangled into the system when they make an observation) with the fundamental loss of information (which is not possible).
+
+One may question that if the universal state vector is *real*, then where's all the unavailable information stored (why is there a *fundamental* lack of knowledge)? Well, who told you that all information in this universe can be observed or written down? Everything outside our event horizon is also unavailable to us, yet modern physics knows for sure that some of those *do* exist. Of course we have a hierarchy of belief in the existence of different things, with the universal state vector being hard to believe (and very hard to not believe) or make sense of. But there's no hard cut, and we might some day be able to reason about it.
+
+I don't know how exactly the observed universe is the way it is (i.e., how exactly it fell — or "collapsed", which is a convenient word for communication — into the eigenstate that we observed). I'm not even sure if the observed universe is the way it is in the objective (ontological) sense — if there were no observers, would it just be an "uncollapsed" state vector? I suspect that this problem has something to do with consciousness, and I suspect that we are at least hundreds of years from understanding consciousness. (Of course this kind of predictions are all nonsense — no one can look thirty years into the future). At the very least, we may eliminate some possibilities when we know more about consciousness. At any rate, this is an interesting problem that might be outside the capability of human reason, or might not. One may hate it and refuse to talk about it, but one cannot dismiss it as unphysical.
+
+When Lubos dismisses *ontology* as "exactly the same thing" as classical physics, he's dismissing the problem above, and making a hard compromise. He's basically saying that we cannot and should not reason about anything outside of what we can observe (this is also a crude classification because obviously he reasons beyond black hole horizons every day). This compromise is very dangerous for physics — sometimes one has to reason beyond one's horizon to formulate a complete and consistent answer. Black holes are one good example of getting of the limit. If we can extend spacetime beyond our event horizon, then why can't we accept **_the possibility of existence_** outside our "existence horizon", i.e., outside our perceived existence of the universal (and the first hand experience of our own existence inside it)? It's a wild and not well-defined idea, but all new physics starts out not well-defined.
+
+I still remember the last lecture of my first quantum mechanics course in my freshman year, taught by Prof. Michael Peskin. He discussed the interpretations of quantum mechanics. I forgot the exact arguments, but after rejecting other interpretations (including Copenhagen and hidden variable), he resorted to Many-Worlds, citing "Once you eliminate the impossible, whatever remains, no matter how improbable, must be the truth." I was not particularly satisfied. To me, once you eliminate the impossible, if whatever remains is still improbable, then maybe your imagination is not wild enough. I also remember the second time I took QM I, this time the graduate version, taught by Prof. Lenny Susskind. He stressed unitarity so much and showed us how wavefunction-collapsing is unnecessary (it was never well-defined anyway, unless you impose it). Unitarity is so important that triggered his "black hole war".
+
+The point of mentioning my two professors is that the interpretation problem of quantum mechanics has never been settled, and people who hold opinions contrary to Copenhagen should be respected. Lubos, on the other hand, tries to convince people that this problem has been settled, and actually settled for ninety years. He is either lying or delusional himself.
diff --git a/source/blog/2015-02-24-the-new-onedrive-api.md b/source/blog/2015-02-24-the-new-onedrive-api.md
new file mode 100644
index 00000000..28067c36
--- /dev/null
+++ b/source/blog/2015-02-24-the-new-onedrive-api.md
@@ -0,0 +1,10 @@
+---
+layout: post
+title: "The new OneDrive API"
+date: 2015-02-24 18:31:19 -0800
+comments: true
+categories: 
+---
+Microsoft released the new OneDrive API today. See the blog post announcement [here](https://blog.onedrive.com/the-new-onedrive-api/). One highlight is that [large file upload](http://onedrive.github.io/items/upload_large_files.htm) is now officially supported. Previously, large file upload was handled with a semi-official API using the BITS protocol; the only documentation was a [gist](https://gist.github.com/rgregg/37ba8929768a62131e85). Now it is handled through standard HTTP `POST`. With this major release, there's likely a lot of work to be done with [python-onedrive](https://github.com/mk-fg/python-onedrive). I have opened an issue: `mk-fg/python-onedrive#52` — [New OneDrive API support](https://github.com/mk-fg/python-onedrive/issues/52).
+
+Interestingly, the new OneDrive API doc is hosted on GitHub Pages — [onedrive.github.io](http://onedrive.github.io), rather than MSDN. Exactly a week ago I wrote a piece, "[Microsoft is getting cool (but not its website)](http://zmwangx.github.io/blog/2015/02/17/microsoft-is-getting-cool-but-not-its-website/)". Looks like they are doing something about their website (or better put, their online identity), too.
diff --git a/source/blog/2015-03-22-back-up-os-x-app-icons.md b/source/blog/2015-03-22-back-up-os-x-app-icons.md
new file mode 100644
index 00000000..7f9eec4b
--- /dev/null
+++ b/source/blog/2015-03-22-back-up-os-x-app-icons.md
@@ -0,0 +1,46 @@
+---
+layout: post
+title: "Back up OS X app icons"
+date: 2015-03-22 16:58:50 -0700
+comments: true
+categories: 
+---
+OS X application icons are valuable assets, and it's interesting to see how they evolve over time. This is especially the case when we upgraded to OS X 10.10 Yosemite, when Apple and many design-aware third party developers overhauled (mainly flattened) their icons.
+
+However, we lose all the old icons when we do a major OS upgrade. Technically they still live in Time Machine backups, but those are a pain to pull out. Therefore, I wrote a script just now to back up app icons of all applications living in `/Applications` (including those symlinked to `/Applications`, e.g., apps installed through `brew cask`) and its level-one subdirectories, and `/System/Library/CoreServices` (for `Finder.app` and such). Here's the script:
+
+```bash backup-app-icons
+#!/usr/bin/env bash
+function app_version
+{
+    # $1 is the path to the app
+    /usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "$1"/Contents/Info.plist 2>/dev/null || date +%Y%m%d
+}
+ 
+function app_icon_path
+{
+    # $1 is the path to the app
+    filename=$(/usr/libexec/PlistBuddy -c "print CFBundleIconFile" "$1"/Contents/Info.plist 2>/dev/null)
+    [[ -n ${filename} ]] || return
+    filename=$(basename "${filename}" .icns)
+    echo "$1/Contents/Resources/${filename}.icns"
+}
+ 
+function process_app
+{
+    # $1 is the path to the app
+    name=$(basename "$1" .app | tr -d ' ')
+    path=$(realpath -e "$1") || { echo "${RED}error: broken link '${path}'${RESET}" >&2; return 1; }
+    version=$(app_version "${path}")
+    icon_path=$(app_icon_path "${path}")
+    [[ -n ${icon_path} ]] || { echo "${YELLOW}warning: '$1' has no app icon${RESET}"; return 1; }
+    [[ -f ${icon_path} ]] || { echo "${RED}error: '${icon_path}' does not exist${RESET}" >&2; return 1; }
+    cp "${icon_path}" "${name}-${version}.icns"
+    echo "${name}-${version}.icns"
+}
+ 
+find /Applications -maxdepth 2 -name '*.app' | while read app; do process_app "${app}"; done
+find /System/Library/CoreServices -maxdepth 1 -name '*.app' | while read app; do process_app "${app}"; done
+```
+
+The script is also available as a [gist](https://gist.github.com/zmwangx/fad97e085045a21ebc1d).
diff --git a/source/blog/2015-04-26-using-python-3-with-emacs-jedi.md b/source/blog/2015-04-26-using-python-3-with-emacs-jedi.md
new file mode 100644
index 00000000..5a6f12ea
--- /dev/null
+++ b/source/blog/2015-04-26-using-python-3-with-emacs-jedi.md
@@ -0,0 +1,31 @@
+---
+layout: post
+title: "Using Python 3 with Emacs Jedi"
+date: 2015-04-26 21:19:14 -0700
+comments: true
+categories: 
+---
+Recently I'm working on [a hobby project in Python](https://github.com/zmwangx/storyboard), which means editing Python source files a lot. I've been using [Emacs Jedi](https://github.com/tkf/emacs-jedi) for almost as long as I've been writing Python, and it has been pretty helpful at completing away long names.
+
+However, Jedi uses `python` by default, which means `python2` on most of our systems at this point. Occasionally I'm writing Python 3 specific code but Jedi completes to Python 2 or refuses to complete; for the record, I enjoy writing and debugging Python 3.3+ much better than 2.7 (I realized this after trying to create a code base that is backward compatible with 2.7, which means reinventing the wheel or introducing annoying branches from time to time). So naturally I'm looking into using Python 3 in Jedi.
+
+The [official docs](https://tkf.github.io/emacs-jedi/latest/#how-to-use-python-3-or-any-other-specific-version-of-python) has been confusing and unhelpful at least for me, since it insists on setting up the virtualenv from within Emacs, and it failed for me. Why can't I set up the virtualenv myself? Turns out I can, and it's incredibly simple. The commands below assume that you have installed Jedi and friends (well, dependencies) using `package.el`.
+
+```bash
+mkdir -p ~/.emacs.d/.python-environments
+virtualenv -p /usr/local/bin/python3 ~/.emacs.d/.python-environments/jedi  # or whatever your python3 path is
+# If you feel like installing the server with 'M-x jedi:install-server', also do the following
+~/.emacs.d/.python-environments/jedi/bin/pip install --upgrade ~/.emacs.d/elpa/jedi-20150109.2230/  # you might need to change the version number
+```
+
+And that's it. Put the following in your `~/.emacs`:
+
+```emacs-lisp
+(add-hook 'python-mode-hook 'jedi:setup)
+(setq jedi:complete-on-dot t)
+(setq jedi:environment-root "jedi")
+```
+
+where the first two lines should be there whether you want to use Python 3 or not — so only the third line is new, and its meaning is obvious.
+
+At last, start Emacs and do `M-x jedi:install-server` if you haven't run the `pip` command above yet. Restart Emacs (if necessary). That's it. Enjoy your Jedi with Python 3. (Type `import conf`, for instance, to be convinced that you're really autocompleting Python 3).
diff --git a/source/blog/2015-05-03-why-oh-my-zsh-is-completely-broken.md b/source/blog/2015-05-03-why-oh-my-zsh-is-completely-broken.md
new file mode 100644
index 00000000..3d682897
--- /dev/null
+++ b/source/blog/2015-05-03-why-oh-my-zsh-is-completely-broken.md
@@ -0,0 +1,150 @@
+---
+layout: post
+title: "Why Oh My Zsh is completely broken"
+date: 2015-05-03 17:15:49 -0700
+comments: true
+categories: 
+---
+Today I moved from [Oh My Zsh](https://github.com/robbyrussell/oh-my-zsh) from [Prezto](https://github.com/sorin-ionescu/prezto), after using Oh My Zsh for about three years since 2012. I'll try to shed some light on the reasons in this post.
+
+Z shell is a rather complicated shell (compared to Bash), with a hell lot of builtins and a complex completion system. The complexity makes it powerful, but also makes it intimidating to the mortal; moreover, it doesn't look as sweet as it could be out of box. Most mortals, me included, want a interactive shell that's sweet and "just works", so we need wizards to guide us in configuring this beast. Oh My Zsh and Prezto are just two of such configuration frameworks. Oh My Zsh is slightly older: the first commit of Oh My Zsh dates back to [August 2009](https://github.com/robbyrussell/oh-my-zsh/commit/e20401e04e057a39c228dbb99dda68ec7fa4235a), while Prezto was forked from Oh My Zsh in [February 2011](https://github.com/sorin-ionescu/prezto/commit/8d487d4f6c2d38cb108d7c8c0c2de9f0385da402), and has since been completely rewritten. `robbyrussell/oh-my-zsh` as of today has 23,610 stars on GitHub, while `sorin-ionescu/prezto` has 4,069. This doesn't imply Oh My Zsh is any better — I guess the fancy name of Oh My Zsh earned it a lot of undeserved stars; you'll see why soon.
+
+I was hardly involved in Oh My Zsh development, and I haven't even carefully inspected Oh My Zsh's source code until yesterday, so my soon-to-come complaints about oh-my-zsh might not be completely true. But here it is: **Oh My Zsh brings the worst of community-driven development, where the "community" knows not of what it is doing, and just wants to get things done in the sloppiest way possible.** Let's look at some examples. All discussions are based on [`1400346`](https://github.com/robbyrussell/oh-my-zsh/commit/140034605edd0f72c548685d39e49687a44c1b23), the latest commit at the time of writing.
+
+## The core lib hodgepodge
+
+First, look at Oh My Zsh's core [lib](https://github.com/robbyrussell/oh-my-zsh/tree/140034605edd0f72c548685d39e49687a44c1b23/lib):
+
+```
+bzr.zsh         directories.zsh  grep.zsh          misc.zsh                   spectrum.zsh
+completion.zsh  functions.zsh    history.zsh       nvm.zsh                    termsupport.zsh
+correction.zsh  git.zsh          key-bindings.zsh  prompt_info_functions.zsh  theme-and-appearance.zsh
+```
+
+Wait, why do I see `bzr.zsh`, `git.zsh`, and even `nvm.zsh` in the core lib? The answer is that they are here because they define functions (`bzr_prompt_info`, `git_prompt_info`, `nvm_prompt_info`, etc.) that are called from many themes. But why are all of these mandatory (all files in `lib` are sourced from `oh-my-zsh.sh`)? Why should I load `bzr.sh` and `nvm.zsh` when I don't use Bazaar and NVM at all (well not really, I use [git-remote-bzr](https://github.com/felipec/git-remote-bzr) when I have to clone a Bazaar repo)? And since we already have `bzr.sh`, `git.zsh` and `nvm.zsh` in the core library, why don't we also have `hg.zsh`, `rvm.zsh`, `svn.zsh`, `virtualenv.zsh`, just to name a few? Apparently, Oh My Zsh put these marginal things in the core because there's no easy way to load a plugin from a theme, except an ugly `source` with the full path of the plugin, which is also how plugins are loaded in `oh-my-zsh.sh`.
+
+Meanwhile, Prezto does it right. Prezto is highly modular, with the `pmodload` function defined in [`init.zsh`](https://github.com/sorin-ionescu/prezto/blob/08676a273eba1781ddcb63c4f89cfff9bd62eac4/init.zsh) to load modules. That's about the entirety of Prezto's core; everything else are in optional [modules](https://github.com/sorin-ionescu/prezto/blob/08676a273eba1781ddcb63c4f89cfff9bd62eac4/modules), including essential configs like `editor` (ZLE configs), `completion`, and `prompt`. Note that module loading order matters in some cases, but still, working with Prezto's modular structure is a joy. Apart from `init.zsh` and `modules/`, Prezto repo does contain a [`runcoms`](https://github.com/sorin-ionescu/prezto/tree/08676a273eba1781ddcb63c4f89cfff9bd62eac4/runcoms) directory with the rc files, but those are just recommendations that one may disregard. In fact, there are a total of eight lines related to Prezto in my `.zshrc`, and nowhere else (note that I only switched to Prezto today, so this freshly baked `.zshrc` is subject to change):
+
+```sh Excerpt of .zshrc
+# prezto
+zstyle ':prezto:*:*' color 'yes'
+zstyle ':prezto:environment:termcap' color 'no' # disable coloring of less, which is insanely ugly
+zstyle ':prezto:load' pmodule environment editor history directory utility colors spectrum git completion prompt ruby
+zstyle ':prezto:module:editor' key-bindings 'emacs'
+zstyle ':prezto:module:prompt' theme 'zmwangx'
+[[ "$OSTYPE" == darwin* ]] && export BROWSER='open'
+source ~/.zprezto/init.zsh
+```
+
+Here `zmwangx` is my [personal theme](https://github.com/zmwangx/prezto/blob/master/modules/prompt/functions/prompt_zmwangx_setup) that looks like [this](https://i.imgur.com/nCBK8ZB.png).
+
+## Incredibly poor code quality
+
+Oh My Zsh's code quality is incredibly poor. Even within the core library. Pick any file from `lib/`, and you'll be amazed by the hot mess in front of your eyes. There's no coding standard whatsoever:
+
+* You can find four-space indents and two-space indents mixed [in the same file](https://github.com/robbyrussell/oh-my-zsh/blob/140034605edd0f72c548685d39e49687a44c1b23/lib/functions.zsh);
+* You can find function definitions with the `function` keyword and without [in the same file](https://github.com/robbyrussell/oh-my-zsh/blob/140034605edd0f72c548685d39e49687a44c1b23/lib/git.zsh);
+* You can find [167-character-long lines](https://github.com/robbyrussell/oh-my-zsh/blob/140034605edd0f72c548685d39e49687a44c1b23/lib/functions.zsh#L2) mixed with early-broken lines (yes, sometimes [within the same file](https://github.com/robbyrussell/oh-my-zsh/blob/140034605edd0f72c548685d39e49687a44c1b23/lib/git.zsh#L69));
+* You can find completely commented out blocks of code [in the core lib](https://github.com/robbyrussell/oh-my-zsh/blob/140034605edd0f72c548685d39e49687a44c1b23/lib/key-bindings.zsh#L70-L87), where the average user is not supposed to touch;
+
+I guess the list could go on; I didn't spend more time inspecting this crap.
+
+We were discussing styles, but obviously style isn't the only problem with this code base. Next onto a case study of how Oh My Zsh does something in the most inefficient way possible. Let's have a look at [the `git.zsh` file](https://github.com/robbyrussell/oh-my-zsh/blob/140034605edd0f72c548685d39e49687a44c1b23/lib/git.zsh). It suffers from almost all problems we have talked about so far, but let's focus specifically on [the `git_prompt_status` function](https://github.com/robbyrussell/oh-my-zsh/blob/140034605edd0f72c548685d39e49687a44c1b23/lib/git.zsh#L78-L122):
+
+```sh
+git_prompt_status() {
+  INDEX=$(command git status --porcelain -b 2> /dev/null)
+  STATUS=""
+  if $(echo "$INDEX" | command grep -E '^\?\? ' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_UNTRACKED$STATUS"
+  fi
+  if $(echo "$INDEX" | grep '^A  ' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS"
+  elif $(echo "$INDEX" | grep '^M  ' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS"
+  fi
+  if $(echo "$INDEX" | grep '^ M ' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
+  elif $(echo "$INDEX" | grep '^AM ' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
+  elif $(echo "$INDEX" | grep '^ T ' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
+  fi
+  if $(echo "$INDEX" | grep '^R  ' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_RENAMED$STATUS"
+  fi
+  if $(echo "$INDEX" | grep '^ D ' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
+  elif $(echo "$INDEX" | grep '^D  ' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
+  elif $(echo "$INDEX" | grep '^AD ' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
+  fi
+  if $(command git rev-parse --verify refs/stash >/dev/null 2>&1); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_STASHED$STATUS"
+  fi
+  if $(echo "$INDEX" | grep '^UU ' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_UNMERGED$STATUS"
+  fi
+  if $(echo "$INDEX" | grep '^## .*ahead' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_AHEAD$STATUS"
+  fi
+  if $(echo "$INDEX" | grep '^## .*behind' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_BEHIND$STATUS"
+  fi
+  if $(echo "$INDEX" | grep '^## .*diverged' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_DIVERGED$STATUS"
+  fi
+  echo $STATUS
+}
+```
+
+**This one single function intended to be invoked from a precmd hook (basically excuted every time the prompt is printed), calls `grep` a staggering 14 times inside command substitutions, forking the process 28 times — while all the greps can be replaced with pattern/regex matching right within the shell.** Keep in mind that forking is the most expensive operation of the shell. For instance, `$(echo "$INDEX" | grep '^A  ' &> /dev/null)` may well be replaced with
+
+```sh
+[[ $INDEX == *$'\nA  '* ]]
+```
+
+or
+
+```sh
+[[ $INDEX =~ $'\nA  ' ]]
+```
+
+(Note that the `git status --porcelain -b` call always prints the branch info such as `## master...origin/master` in the first line, so `A  ` — that is, A followed by two spaces, if present at the beginning of any line, must be preceded by a newline; that's why the above works.) All other grep calls can be similarly replaced with pattern/regex matching. No forking.
+
+By the way, whoever wrote this function seems to be unaware of the `-q,--quite,--silent` switch of `grep` (which should be available in all implementations), and every call is littered with `&> /dev/null`. In fact, using the `-q` switch is even (slightly) faster: a reasonable implementation of `-q` exits immediately when a match is found, while what is written here waits until all input is processed.
+
+I haven't exhausted the problems with this function just yet. As a bonus: despite being awfully inefficient, **this function *can't even be used* in many cases for which it is designed.** You might have noticed that the order of different status bits is completely fixed by whoever wrote this function (by the way, all those `$ZSH_THEME_GIT_PROMPT_*` variables are documented nowhere, so one who wants to write a theme has to dig into the source — only to find the function useless expect for polluting the namespace). If one wants to use a different order, or put some of the bits in `RPROMPT`, one has to roll his own (or good luck parsing its output). In fact, even a [dumbed down function `git_prompt_info`](https://github.com/robbyrussell/oh-my-zsh/blob/140034605edd0f72c548685d39e49687a44c1b23/lib/git.zsh#L2-L8), which only prints the branch name and whether it's dirty, is similarly uncustomizable; [the `gallois` theme](https://github.com/robbyrussell/oh-my-zsh/blob/140034605edd0f72c548685d39e49687a44c1b23/themes/gallois.zsh-theme), my first theme and on which I later based my own theme, needs to define a `git_custom_status` function to achieve what it needs — otherwise something as simple as adding a pair of brackets around the branch name is super painful.
+
+**One might wonder how Prezto solves the same problem. The answer is in [the file `modules/git/functions/git-info`](https://github.com/sorin-ionescu/prezto/blob/08676a273eba1781ddcb63c4f89cfff9bd62eac4/modules/git/functions/git-info). The `git-info` function does more, and again in a highly modular way (without grep calls, for God's sake): status bits or their combinations are [formatted on demand with `zformat` and stored in an associative array `git_info`](https://github.com/sorin-ionescu/prezto/blob/08676a273eba1781ddcb63c4f89cfff9bd62eac4/modules/git/functions/git-info#L393-L416), where users specify format strings via `zstyle` with [thoroughly documented escape sequences](https://github.com/sorin-ionescu/prezto/tree/08676a273eba1781ddcb63c4f89cfff9bd62eac4/modules/git#theming). Very beautiful solution.**
+
+## The completely broken community contribution process
+
+I'm not sure if the project maintainers are Zsh wizards (I'm afraid not). I'll just assume that most of the code with incredibly poor quality comes from community contribution. Okay, community. But even the community contribution process is completely broken.
+
+At the time of writing there are 159 open issues and 446 open pull requests in `robbyrussell/oh-my-zsh` (the stats are 13/35 in `sorin-ionescu/prezto` — not proportional to the stars or forks). There's even [a PR called "Easy-to-Merge"](https://github.com/robbyrussell/oh-my-zsh/pull/3809) that is said to collect PRs that are either extremely simple fixes or have been discussed–tested–and–signed-off (wait, then why aren't they already merged?). This makes it almost impossible to open new, substantial PRs (like fixing the `git_prompt_status` above) — God knows whether other people have already proposed the same fix, or a different fix for the same problem, whether it's been discussed–tested–and–signed-off, and how much discussion will be needed for a new PR.
+
+You might infer from the above that the actually merged PRs are discussed–tested–and–signed-off. Well, of course not (think about the code quality), and here's one more case study.
+
+The only time I [submitted a PR](https://github.com/robbyrussell/oh-my-zsh/pull/3591) is when [a previous PR](https://github.com/robbyrussell/oh-my-zsh/pull/3564) broke aliases of the `ls` family, which most of us run tens to hundreds of times every day. The `-h` option was stripped from all aliases but one (which was ridiculous since the option seemed to be lost during copy/paste), and anyone who used the affected aliases regularly and lived with the PR for ten minutes should notice. Apparently nobody looked at the diffs before merging, or nobody cared (before I and one other guy jumped in). My PR was merged three days later; the delay was okay.
+
+[In another instance](https://github.com/robbyrussell/oh-my-zsh/pull/3341), the delay was totally unbearable. [grep 2.21](https://savannah.gnu.org/forum/forum.php?forum_id=8152) was released on November 23, 2014, and it deprecated `GREP_OPTIONS`. Oh My Zsh was using `GREP_OPTIONS` back then, so anyone who upgraded to grep 2.21 and used grep regularly was getting a lot of deprecation warnings (oh, before you ask, `grep.zsh` is the core lib). Core lib stuff spitting deprecation warnings on all platforms all the time is a pretty big thing, right? There were multiple ways to fix this problem, and all of them were trivial to anyone with a reasonable amount of knowledge of Zsh. However, there were quite a bit of discussions spanning multiple issues and PRs (most notably [this one](https://github.com/robbyrussell/oh-my-zsh/pull/3341)). And despite all the discussions, not a single maintainer or collaborator joined or showed any interest, and [a fix was merged not until December 14, 2014](https://github.com/robbyrussell/oh-my-zsh/pull/3403). Of course there are temporary fixes (remember, the issue was trivial to begin with), but the problem must be confusing for the less-proficient Zsh users during the twenty day window.
+
+## Easter egg
+
+One more thing, among countless other problems: the recommended way to install Oh My Zsh is either
+
+    curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh
+
+or
+
+    wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O - | sh
+
+Cool, huh? How many of you have the `--no-check-certificate` option of `wget` automatically turned on? Thankfully there's no `sudo` in front.
+
+## Summary
+
+Oh My Zsh was a great idea when it took off. Over the years however, through low-quality community contributions from people who barely understand Zsh (and the right approaches to shell scripting), it evolved into a beast that no one except the maintainers could seriously contribute to; yet the maintainers seem to be pretty satisfied with it.
+
+Therefore, I'm moving to Prezto, the project with far better modularity and code quality. In fact, this rant all began from yesterday, when I was about to embark on a stripped down Zsh configuration system for myself. I was thinking about borrowing code from both Oh My Zsh and Prezto; but after reading some code from both projects, I soon realized that Oh My Zsh is totally crap and Prezto can be taken almost unmodified. I hope that more people will take a look at Prezto, realize that it's infinitely better than the famed Oh My Zsh, fork it, and possibly submit patches.
diff --git a/source/blog/archives/index.html b/source/blog/archives/index.html
deleted file mode 100644
index f1d9cee3..00000000
--- a/source/blog/archives/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
----
-layout: page
-title: Blog Archive
-footer: false
----
-
-<div id="blog-archives">
-{% for post in site.posts reverse %}
-{% capture this_year %}{{ post.date | date: "%Y" }}{% endcapture %}
-{% unless year == this_year %}
-  {% assign year = this_year %}
-  <h2>{{ year }}</h2>
-{% endunless %}
-<article>
-  {% include archive_post.html %}
-</article>
-{% endfor %}
-</div>
diff --git a/source/favicon.png b/source/favicon.png
deleted file mode 100644
index 4d541df9..00000000
Binary files a/source/favicon.png and /dev/null differ
diff --git a/source/images/bird_32_gray.png b/source/images/bird_32_gray.png
deleted file mode 100644
index 574f210a..00000000
Binary files a/source/images/bird_32_gray.png and /dev/null differ
diff --git a/source/images/bird_32_gray_fail.png b/source/images/bird_32_gray_fail.png
deleted file mode 100644
index 8337d103..00000000
Binary files a/source/images/bird_32_gray_fail.png and /dev/null differ
diff --git a/source/images/code_bg.png b/source/images/code_bg.png
deleted file mode 100644
index a57bab56..00000000
Binary files a/source/images/code_bg.png and /dev/null differ
diff --git a/source/images/dotted-border.png b/source/images/dotted-border.png
deleted file mode 100644
index 57f99071..00000000
Binary files a/source/images/dotted-border.png and /dev/null differ
diff --git a/source/images/email.png b/source/images/email.png
deleted file mode 100644
index e55473fe..00000000
Binary files a/source/images/email.png and /dev/null differ
diff --git a/source/images/line-tile.png b/source/images/line-tile.png
deleted file mode 100644
index f67ee19f..00000000
Binary files a/source/images/line-tile.png and /dev/null differ
diff --git a/source/images/noise.png b/source/images/noise.png
deleted file mode 100644
index 432e05bf..00000000
Binary files a/source/images/noise.png and /dev/null differ
diff --git a/source/images/rss.png b/source/images/rss.png
deleted file mode 100644
index 151ae718..00000000
Binary files a/source/images/rss.png and /dev/null differ
diff --git a/source/images/search.png b/source/images/search.png
deleted file mode 100644
index 1220ff4e..00000000
Binary files a/source/images/search.png and /dev/null differ
diff --git a/source/index.html b/source/index.html
deleted file mode 100644
index 64b665e4..00000000
--- a/source/index.html
+++ /dev/null
@@ -1,29 +0,0 @@
----
-layout: default
----
-
-<div class="blog-index">
-  {% assign index = true %}
-  {% for post in paginator.posts %}
-  {% assign content = post.content %}
-    <article>
-      {% include article.html %}
-    </article>
-  {% endfor %}
-  <div class="pagination">
-    {% if paginator.next_page %}
-      <a class="prev" href="{{paginator.next_page_path}}">&larr; Older</a>
-    {% endif %}
-    <a href="/blog/archives">Blog Archives</a>
-    {% if paginator.previous_page %}
-    <a class="next" href="{{paginator.previous_page_path}}">Newer &rarr;</a>
-    {% endif %}
-  </div>
-</div>
-<aside class="sidebar">
-  {% if site.blog_index_asides.size %}
-    {% include_array blog_index_asides %}
-  {% else %}
-    {% include_array default_asides %}
-  {% endif %}
-</aside>
diff --git a/source/javascripts/github.js b/source/javascripts/github.js
deleted file mode 100644
index fc2bb12c..00000000
--- a/source/javascripts/github.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var github = (function(){
-  function escapeHtml(str) {
-    return $('<div/>').text(str).html();
-  }
-  function render(target, repos){
-    var i = 0, fragment = '', t = $(target)[0];
-
-    for(i = 0; i < repos.length; i++) {
-      fragment += '<li><a href="'+repos[i].html_url+'">'+repos[i].name+'</a><p>'+escapeHtml(repos[i].description||'')+'</p></li>';
-    }
-    t.innerHTML = fragment;
-  }
-  return {
-    showRepos: function(options){
-      $.ajax({
-          url: "https://api.github.com/users/"+options.user+"/repos?sort=pushed&callback=?"
-        , dataType: 'jsonp'
-        , error: function (err) { $(options.target + ' li.loading').addClass('error').text("Error loading feed"); }
-        , success: function(data) {
-          var repos = [];
-          if (!data || !data.data) { return; }
-          for (var i = 0; i < data.data.length; i++) {
-            if (options.skip_forks && data.data[i].fork) { continue; }
-            repos.push(data.data[i]);
-          }
-          if (options.count) { repos.splice(options.count); }
-          render(options.target, repos);
-        }
-      });
-    }
-  };
-})();
diff --git a/source/javascripts/libs/jXHR.js b/source/javascripts/libs/jXHR.js
deleted file mode 100644
index 6775655c..00000000
--- a/source/javascripts/libs/jXHR.js
+++ /dev/null
@@ -1,85 +0,0 @@
-// jXHR.js (JSON-P XHR)
-// v0.1 (c) Kyle Simpson
-// MIT License
-
-(function(global){
-	var SETTIMEOUT = global.setTimeout, // for better compression
-		doc = global.document,
-		callback_counter = 0;
-
-	global.jXHR = function() {
-		var script_url,
-			script_loaded,
-			jsonp_callback,
-			scriptElem,
-			publicAPI = null;
-
-		function removeScript() { try { scriptElem.parentNode.removeChild(scriptElem); } catch (err) { } }
-
-		function reset() {
-			script_loaded = false;
-			script_url = "";
-			removeScript();
-			scriptElem = null;
-			fireReadyStateChange(0);
-		}
-
-		function ThrowError(msg) {
-			try { publicAPI.onerror.call(publicAPI,msg,script_url); } catch (err) { throw new Error(msg); }
-		}
-
-		function handleScriptLoad() {
-			if ((this.readyState && this.readyState!=="complete" && this.readyState!=="loaded") || script_loaded) { return; }
-			this.onload = this.onreadystatechange = null; // prevent memory leak
-			script_loaded = true;
-			if (publicAPI.readyState !== 4) ThrowError("Script failed to load ["+script_url+"].");
-			removeScript();
-		}
-
-		function fireReadyStateChange(rs,args) {
-			args = args || [];
-			publicAPI.readyState = rs;
-			if (typeof publicAPI.onreadystatechange === "function") publicAPI.onreadystatechange.apply(publicAPI,args);
-		}
-
-		publicAPI = {
-			onerror:null,
-			onreadystatechange:null,
-			readyState:0,
-			open:function(method,url){
-				reset();
-				internal_callback = "cb"+(callback_counter++);
-				(function(icb){
-					global.jXHR[icb] = function() {
-						try { fireReadyStateChange.call(publicAPI,4,arguments); }
-						catch(err) {
-							publicAPI.readyState = -1;
-							ThrowError("Script failed to run ["+script_url+"].");
-						}
-						global.jXHR[icb] = null;
-					};
-				})(internal_callback);
-				script_url = url.replace(/=\?/,"=jXHR."+internal_callback);
-				fireReadyStateChange(1);
-			},
-			send:function(){
-				SETTIMEOUT(function(){
-					scriptElem = doc.createElement("script");
-					scriptElem.setAttribute("type","text/javascript");
-					scriptElem.onload = scriptElem.onreadystatechange = function(){handleScriptLoad.call(scriptElem);};
-					scriptElem.setAttribute("src",script_url);
-					doc.getElementsByTagName("head")[0].appendChild(scriptElem);
-				},0);
-				fireReadyStateChange(2);
-			},
-			setRequestHeader:function(){}, // noop
-			getResponseHeader:function(){return "";}, // basically noop
-			getAllResponseHeaders:function(){return [];} // ditto
-		};
-
-		reset();
-
-		return publicAPI;
-	};
-})(window);
-
diff --git a/source/javascripts/libs/jquery.min.js b/source/javascripts/libs/jquery.min.js
deleted file mode 100644
index 32d50cb0..00000000
--- a/source/javascripts/libs/jquery.min.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
-//@ sourceMappingURL=jquery.min.map
-*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;
-return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&&gt(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l)
-}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window);
diff --git a/source/javascripts/libs/swfobject-dynamic.js b/source/javascripts/libs/swfobject-dynamic.js
deleted file mode 100644
index b0216145..00000000
--- a/source/javascripts/libs/swfobject-dynamic.js
+++ /dev/null
@@ -1,298 +0,0 @@
-/*!	SWFObject v2.2 <http://code.google.com/p/swfobject/>
-	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
-*/
-
-var swfobject = function() {
-
-	var UNDEF = "undefined",
-		OBJECT = "object",
-		SHOCKWAVE_FLASH = "Shockwave Flash",
-		SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
-		FLASH_MIME_TYPE = "application/x-shockwave-flash",
-		EXPRESS_INSTALL_ID = "SWFObjectExprInst",
-
-		win = window,
-		doc = document,
-		nav = navigator,
-
-		plugin = false,
-		regObjArr = [],
-		objIdArr = [],
-		storedAltContent,
-		storedAltContentId,
-		storedCallbackFn,
-		storedCallbackObj,
-		autoHideShow = true,
-
-	/* Centralized function for browser feature detection
-		- User agent string detection is only used when no good alternative is possible
-		- Is executed directly for optimal performance
-	*/
-	ua = function() {
-		var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
-			u = nav.userAgent.toLowerCase(),
-			p = nav.platform.toLowerCase(),
-			windows = p ? /win/.test(p) : /win/.test(u),
-			mac = p ? /mac/.test(p) : /mac/.test(u),
-			webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
-			ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html
-			playerVersion = [0,0,0],
-			d = null;
-		if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
-			d = nav.plugins[SHOCKWAVE_FLASH].description;
-			if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
-				plugin = true;
-				ie = false; // cascaded feature detection for Internet Explorer
-				d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
-				playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
-				playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
-				playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
-			}
-		}
-		else if (typeof win.ActiveXObject != UNDEF) {
-			try {
-				var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
-				if (a) { // a will return null when ActiveX is disabled
-					d = a.GetVariable("$version");
-					if (d) {
-						ie = true; // cascaded feature detection for Internet Explorer
-						d = d.split(" ")[1].split(",");
-						playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
-					}
-				}
-			}
-			catch(e) {}
-		}
-		return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
-	}()
-
-
-	/* Main function
-		- Will preferably execute onDomLoad, otherwise onload (as a fallback)
-	*/
-	function main() {
-		if (plugin) { testPlayerVersion(); }
-		else { matchVersions(); }
-	}
-
-	/* Detect the Flash Player version for non-Internet Explorer browsers
-		- Detecting the plug-in version via the object element is more precise than using the plugins collection item's description:
-		  a. Both release and build numbers can be detected
-		  b. Avoid wrong descriptions by corrupt installers provided by Adobe
-		  c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports
-		- Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available
-	*/
-	function testPlayerVersion() {
-		var b = doc.getElementsByTagName("body")[0];
-		var o = createElement(OBJECT);
-		o.setAttribute("type", FLASH_MIME_TYPE);
-		var t = b.appendChild(o);
-		if (t) {
-			var counter = 0;
-			(function(){
-				if (typeof t.GetVariable != UNDEF) {
-					var d = t.GetVariable("$version");
-					if (d) {
-						d = d.split(" ")[1].split(",");
-						ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
-					}
-				}
-				else if (counter < 10) {
-					counter++;
-					setTimeout(arguments.callee, 10);
-					return;
-				}
-				b.removeChild(o);
-				t = null;
-				matchVersions();
-			})();
-		}
-		else {
-			matchVersions();
-		}
-	}
-
-
-	/* Cross-browser dynamic SWF creation
-	*/
-	function createSWF(attObj, parObj, id) {
-		var r, el = getElementById(id);
-		if (ua.wk && ua.wk < 312) { return r; }
-		if (el) {
-			if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
-				attObj.id = id;
-			}
-			if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML
-				var att = "";
-				for (var i in attObj) {
-					if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries
-						if (i.toLowerCase() == "data") {
-							parObj.movie = attObj[i];
-						}
-						else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
-							att += ' class="' + attObj[i] + '"';
-						}
-						else if (i.toLowerCase() != "classid") {
-							att += ' ' + i + '="' + attObj[i] + '"';
-						}
-					}
-				}
-				var par = "";
-				for (var j in parObj) {
-					if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries
-						par += '<param name="' + j + '" value="' + parObj[j] + '" />';
-					}
-				}
-				el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
-				objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only)
-				r = getElementById(attObj.id);
-			}
-			else { // well-behaving browsers
-				var o = createElement(OBJECT);
-				o.setAttribute("type", FLASH_MIME_TYPE);
-				for (var m in attObj) {
-					if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries
-						if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
-							o.setAttribute("class", attObj[m]);
-						}
-						else if (m.toLowerCase() != "classid") { // filter out IE specific attribute
-							o.setAttribute(m, attObj[m]);
-						}
-					}
-				}
-				for (var n in parObj) {
-					if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element
-						createObjParam(o, n, parObj[n]);
-					}
-				}
-				el.parentNode.replaceChild(o, el);
-				r = o;
-			}
-		}
-		return r;
-	}
-
-	function createObjParam(el, pName, pValue) {
-		var p = createElement("param");
-		p.setAttribute("name", pName);
-		p.setAttribute("value", pValue);
-		el.appendChild(p);
-	}
-
-	/* Cross-browser SWF removal
-		- Especially needed to safely and completely remove a SWF in Internet Explorer
-	*/
-	/* Functions to optimize JavaScript compression
-	*/
-	function getElementById(id) {
-		var el = null;
-		try {
-			el = doc.getElementById(id);
-		}
-		catch (e) {}
-		return el;
-	}
-
-	function createElement(el) {
-		return doc.createElement(el);
-	}
-
-	/* Flash Player and SWF content version matching
-	*/
-	function hasPlayerVersion(rv) {
-		var pv = ua.pv, v = rv.split(".");
-		v[0] = parseInt(v[0], 10);
-		v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
-		v[2] = parseInt(v[2], 10) || 0;
-		return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
-	}
-
-
-	/* Filter to avoid XSS attacks
-	*/
-	function urlEncodeIfNecessary(s) {
-		var regex = /[\\\"<>\.;]/;
-		var hasBadChars = regex.exec(s) != null;
-		return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s;
-	}
-
-	return {
-		/* Public API
-			- Reference: http://code.google.com/p/swfobject/wiki/documentation
-		*/
-
-		embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, flashvarsObj, parObj, attObj, callbackFn) {
-			var callbackObj = {success:false, id:replaceElemIdStr};
-			if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) {
-              widthStr += ""; // auto-convert to string
-              heightStr += "";
-              var att = {};
-              if (attObj && typeof attObj === OBJECT) {
-                for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs
-                  att[i] = attObj[i];
-                }
-              }
-              att.data = swfUrlStr;
-              att.width = widthStr;
-              att.height = heightStr;
-              var par = {};
-              if (parObj && typeof parObj === OBJECT) {
-                for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs
-                  par[j] = parObj[j];
-                }
-              }
-              if (flashvarsObj && typeof flashvarsObj === OBJECT) {
-                for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs
-                  if (typeof par.flashvars != UNDEF) {
-                    par.flashvars += "&" + k + "=" + flashvarsObj[k];
-                  }
-                  else {
-                    par.flashvars = k + "=" + flashvarsObj[k];
-                  }
-                }
-              }
-              if (hasPlayerVersion(swfVersionStr)) { // create SWF
-                var obj = createSWF(att, par, replaceElemIdStr);
-                callbackObj.success = true;
-                callbackObj.ref = obj;
-              }
-              if (callbackFn) { callbackFn(callbackObj); }
-			}
-			else if (callbackFn) { callbackFn(callbackObj);	}
-		},
-
-		ua: ua,
-
-		getFlashPlayerVersion: function() {
-			return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
-		},
-
-		hasFlashPlayerVersion: hasPlayerVersion,
-
-		createSWF: function(attObj, parObj, replaceElemIdStr) {
-			if (ua.w3) {
-				return createSWF(attObj, parObj, replaceElemIdStr);
-			}
-			else {
-				return undefined;
-			}
-		},
-
-		getQueryParamValue: function(param) {
-			var q = doc.location.search || doc.location.hash;
-			if (q) {
-				if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark
-				if (param == null) {
-					return urlEncodeIfNecessary(q);
-				}
-				var pairs = q.split("&");
-				for (var i = 0; i < pairs.length; i++) {
-					if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
-						return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
-					}
-				}
-			}
-			return "";
-		}
-	};
-}();
diff --git a/source/javascripts/modernizr-2.0.js b/source/javascripts/modernizr-2.0.js
deleted file mode 100644
index 9dca7b0e..00000000
--- a/source/javascripts/modernizr-2.0.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Modernizr 2.6.2 (Custom Build) | MIT & BSD
- * Build: http://modernizr.com/download/#-video-mq-cssclasses-teststyles-testprop-testallprops-prefixes-domprefixes-load
- */
-;window.Modernizr=function(a,b,c){function A(a){j.cssText=a}function B(a,b){return A(m.join(a+";")+(b||""))}function C(a,b){return typeof a===b}function D(a,b){return!!~(""+a).indexOf(b)}function E(a,b){for(var d in a){var e=a[d];if(!D(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function F(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:C(f,"function")?f.bind(d||b):f}return!1}function G(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+o.join(d+" ")+d).split(" ");return C(b,"string")||C(b,"undefined")?E(e,b):(e=(a+" "+p.join(d+" ")+d).split(" "),F(e,b,c))}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m=" -webkit- -moz- -o- -ms- ".split(" "),n="Webkit Moz O ms",o=n.split(" "),p=n.toLowerCase().split(" "),q={},r={},s={},t=[],u=t.slice,v,w=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["&#173;",'<style id="s',h,'">',a,"</style>"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},x=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b).matches;var d;return w("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},y={}.hasOwnProperty,z;!C(y,"undefined")&&!C(y.call,"undefined")?z=function(a,b){return y.call(a,b)}:z=function(a,b){return b in a&&C(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=u.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(u.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(u.call(arguments)))};return e}),q.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c};for(var H in q)z(q,H)&&(v=H.toLowerCase(),e[v]=q[H](),t.push((e[v]?"":"no-")+v));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)z(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},A(""),i=k=null,e._version=d,e._prefixes=m,e._domPrefixes=p,e._cssomPrefixes=o,e.mq=x,e.testProp=function(a){return E([a])},e.testAllProps=G,e.testStyles=w,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+t.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
-
diff --git a/source/javascripts/octopress.js b/source/javascripts/octopress.js
deleted file mode 100644
index faaf3dbe..00000000
--- a/source/javascripts/octopress.js
+++ /dev/null
@@ -1,151 +0,0 @@
-function getNav() {
-  var mainNav = $('ul.main-navigation, ul[role=main-navigation]').before('<fieldset class="mobile-nav">')
-  var mobileNav = $('fieldset.mobile-nav').append('<select>');
-  mobileNav.find('select').append('<option value="">Navigate&hellip;</option>');
-  var addOption = function(i, option) {
-    mobileNav.find('select').append('<option value="' + this.href + '">&raquo; ' + $(this).text() + '</option>');
-  }
-  mainNav.find('a').each(addOption);
-  $('ul.subscription a').each(addOption);
-  mobileNav.find('select').bind('change', function(event) {
-    if (event.target.value) { window.location.href = event.target.value; }
-  });
-}
-
-function addSidebarToggler() {
-  if(!$('body').hasClass('sidebar-footer')) {
-    $('#content').append('<span class="toggle-sidebar"></span>');
-    $('.toggle-sidebar').bind('click', function(e) {
-      e.preventDefault();
-      $('body').toggleClass('collapse-sidebar');
-    });
-  }
-  var sections = $('aside.sidebar > section');
-  if (sections.length > 1) {
-    sections.each(function(index, section){
-      if ((sections.length >= 3) && index % 3 === 0) {
-        $(section).addClass("first");
-      }
-      var count = ((index +1) % 2) ? "odd" : "even";
-      $(section).addClass(count);
-    });
-  }
-  if (sections.length >= 3){ $('aside.sidebar').addClass('thirds'); }
-}
-
-function testFeatures() {
-  var features = ['maskImage'];
-  $(features).map(function(i, feature) {
-    if (Modernizr.testAllProps(feature)) {
-      $('html').addClass(feature);
-    } else {
-      $('html').addClass('no-'+feature);
-    }
-  });
-  if ("placeholder" in document.createElement("input")) {
-    $('html').addClass('placeholder');
-  } else {
-    $('html').addClass('no-placeholder');
-  }
-}
-
-function addCodeLineNumbers() {
-  if (navigator.appName === 'Microsoft Internet Explorer') { return; }
-  $('div.gist-highlight').each(function(code) {
-    var tableStart = '<table><tbody><tr><td class="gutter">',
-        lineNumbers = '<pre class="line-numbers">',
-        tableMiddle = '</pre></td><td class="code">',
-        tableEnd = '</td></tr></tbody></table>',
-        count = $('.line', code).length;
-    for (var i=1;i<=count; i++) {
-      lineNumbers += '<span class="line-number">'+i+'</span>\n';
-    }
-    var table = tableStart + lineNumbers + tableMiddle + '<pre>'+$('pre', code).html()+'</pre>' + tableEnd;
-    $(code).html(table);
-  });
-}
-
-function flashVideoFallback(){
-  var flashplayerlocation = "/assets/jwplayer/player.swf",
-      flashplayerskin = "/assets/jwplayer/glow/glow.xml";
-  $('video').each(function(i, video){
-    video = $(video);
-    if (!Modernizr.video.h264 && swfobject.getFlashPlayerVersion() || window.location.hash.indexOf("flash-test") !== -1){
-      video.children('source[src$=mp4]').first().map(i, function(source){
-        var src = $(source).attr('src'),
-            id = 'video_'+Math.round(1 + Math.random()*(100000)),
-            width = video.attr('width'),
-            height = parseInt(video.attr('height'), 10) + 30;
-            video.after('<div class="flash-video"><div><div id='+id+'>');
-        swfobject.embedSWF(flashplayerlocation, id, width, height + 30, "9.0.0",
-          { file : src, image : video.attr('poster'), skin : flashplayerskin } ,
-          { movie : src, wmode : "opaque", allowfullscreen : "true" }
-        );
-      });
-      video.remove();
-    }
-  });
-}
-
-function wrapFlashVideos() {
-  $('object').each(function(i, object) {
-    if( $(object).find('param[name=movie]').length ){
-      $(object).wrap('<div class="flash-video">')
-    }
-  });
-  $('iframe[src*=vimeo],iframe[src*=youtube]').wrap('<div class="flash-video">')
-}
-
-function renderDeliciousLinks(items) {
-  var output = "<ul>";
-  for (var i=0,l=items.length; i<l; i++) {
-    output += '<li><a href="' + items[i].u + '" title="Tags: ' + (items[i].t == "" ? "" : items[i].t.join(', ')) + '">' + items[i].d + '</a></li>';
-  }
-  output += "</ul>";
-  $('#delicious').html(output);
-}
-
-$('document').ready(function() {
-  testFeatures();
-  wrapFlashVideos();
-  flashVideoFallback();
-  addCodeLineNumbers();
-  getNav();
-  addSidebarToggler();
-});
-
-// iOS scaling bug fix
-// Rewritten version
-// By @mathias, @cheeaun and @jdalton
-// Source url: https://gist.github.com/901295
-(function(doc) {
-  var addEvent = 'addEventListener',
-      type = 'gesturestart',
-      qsa = 'querySelectorAll',
-      scales = [1, 1],
-      meta = qsa in doc ? doc[qsa]('meta[name=viewport]') : [];
-  function fix() {
-    meta.content = 'width=device-width,minimum-scale=' + scales[0] + ',maximum-scale=' + scales[1];
-    doc.removeEventListener(type, fix, true);
-  }
-  if ((meta = meta[meta.length - 1]) && addEvent in doc) {
-    fix();
-    scales = [0.25, 1.6];
-    doc[addEvent](type, fix, true);
-  }
-}(document));
-
-/*!	SWFObject v2.2 modified by Brandon Mathis to contain only what is necessary to dynamically embed flash objects
-  * Uncompressed source in javascripts/libs/swfobject-dynamic.js
-  * <http://code.google.com/p/swfobject/>
-	released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
-*/
-var swfobject=function(){function s(a,b,d){var q,k=n(d);if(g.wk&&g.wk<312)return q;if(k){if(typeof a.id==l)a.id=d;if(g.ie&&g.win){var e="",c;for(c in a)if(a[c]!=Object.prototype[c])c.toLowerCase()=="data"?b.movie=a[c]:c.toLowerCase()=="styleclass"?e+=' class="'+a[c]+'"':c.toLowerCase()!="classid"&&(e+=" "+c+'="'+a[c]+'"');c="";for(var f in b)b[f]!=Object.prototype[f]&&(c+='<param name="'+f+'" value="'+b[f]+'" />');k.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+e+">"+c+
-"</object>";q=n(a.id)}else{f=i.createElement(o);f.setAttribute("type",m);for(var h in a)a[h]!=Object.prototype[h]&&(h.toLowerCase()=="styleclass"?f.setAttribute("class",a[h]):h.toLowerCase()!="classid"&&f.setAttribute(h,a[h]));for(e in b)b[e]!=Object.prototype[e]&&e.toLowerCase()!="movie"&&(a=f,c=e,h=b[e],d=i.createElement("param"),d.setAttribute("name",c),d.setAttribute("value",h),a.appendChild(d));k.parentNode.replaceChild(f,k);q=f}}return q}function n(a){var b=null;try{b=i.getElementById(a)}catch(d){}return b}
-function t(a){var b=g.pv,a=a.split(".");a[0]=parseInt(a[0],10);a[1]=parseInt(a[1],10)||0;a[2]=parseInt(a[2],10)||0;return b[0]>a[0]||b[0]==a[0]&&b[1]>a[1]||b[0]==a[0]&&b[1]==a[1]&&b[2]>=a[2]?!0:!1}function u(a){return/[\\\"<>\.;]/.exec(a)!=null&&typeof encodeURIComponent!=l?encodeURIComponent(a):a}var l="undefined",o="object",m="application/x-shockwave-flash",v=window,i=document,j=navigator,g=function(){var a=typeof i.getElementById!=l&&typeof i.getElementsByTagName!=l&&typeof i.createElement!=l,
-b=j.userAgent.toLowerCase(),d=j.platform.toLowerCase(),g=d?/win/.test(d):/win/.test(b),d=d?/mac/.test(d):/mac/.test(b),b=/webkit/.test(b)?parseFloat(b.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):!1,k=!+"\u000b1",e=[0,0,0],c=null;if(typeof j.plugins!=l&&typeof j.plugins["Shockwave Flash"]==o){if((c=j.plugins["Shockwave Flash"].description)&&!(typeof j.mimeTypes!=l&&j.mimeTypes[m]&&!j.mimeTypes[m].enabledPlugin))k=!1,c=c.replace(/^.*\s+(\S+\s+\S+$)/,"$1"),e[0]=parseInt(c.replace(/^(.*)\..*$/,"$1"),
-10),e[1]=parseInt(c.replace(/^.*\.(.*)\s.*$/,"$1"),10),e[2]=/[a-zA-Z]/.test(c)?parseInt(c.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}else if(typeof v.ActiveXObject!=l)try{var f=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(f&&(c=f.GetVariable("$version")))k=!0,c=c.split(" ")[1].split(","),e=[parseInt(c[0],10),parseInt(c[1],10),parseInt(c[2],10)]}catch(h){}return{w3:a,pv:e,wk:b,ie:k,win:g,mac:d}}();return{embedSWF:function(a,b,d,i,k,e,c,f,h){var j={success:!1,id:b};if(g.w3&&!(g.wk&&g.wk<312)&&
-a&&b&&d&&i&&k){d+="";i+="";var p={};if(f&&typeof f===o)for(var m in f)p[m]=f[m];p.data=a;p.width=d;p.height=i;a={};if(c&&typeof c===o)for(var n in c)a[n]=c[n];if(e&&typeof e===o)for(var r in e)typeof a.flashvars!=l?a.flashvars+="&"+r+"="+e[r]:a.flashvars=r+"="+e[r];if(t(k))b=s(p,a,b),j.success=!0,j.ref=b}h&&h(j)},ua:g,getFlashPlayerVersion:function(){return{major:g.pv[0],minor:g.pv[1],release:g.pv[2]}},hasFlashPlayerVersion:t,createSWF:function(a,b,d){if(g.w3)return s(a,b,d)},getQueryParamValue:function(a){var b=
-i.location.search||i.location.hash;if(b){/\?/.test(b)&&(b=b.split("?")[1]);if(a==null)return u(b);for(var b=b.split("&"),d=0;d<b.length;d++)if(b[d].substring(0,b[d].indexOf("="))==a)return u(b[d].substring(b[d].indexOf("=")+1))}return""}}}();
-
-
diff --git a/source/javascripts/pinboard.js b/source/javascripts/pinboard.js
deleted file mode 100644
index a97df03d..00000000
--- a/source/javascripts/pinboard.js
+++ /dev/null
@@ -1,56 +0,0 @@
-function pinboardNS_fetch_script(url) {
-  //document.writeln('<s'+'cript type="text/javascript" src="' + url + '"></s'+'cript>');
-  (function(){
-    var pinboardLinkroll = document.createElement('script');
-    pinboardLinkroll.type = 'text/javascript';
-    pinboardLinkroll.async = true;
-    pinboardLinkroll.src = url;
-    document.getElementsByTagName('head')[0].appendChild(pinboardLinkroll);
-  })();
-}
-
-function pinboardNS_show_bmarks(r) {
-  var lr = new Pinboard_Linkroll();
-  lr.set_items(r);
-  lr.show_bmarks();
-}
-
-function Pinboard_Linkroll() {
-  var items;
-
-  this.set_items = function(i) {
-    this.items = i;
-  }
-  this.show_bmarks = function() {
-    var lines = [];
-    for (var i = 0; i < this.items.length; i++) {
-      var item = this.items[i];
-      var str = this.format_item(item);
-      lines.push(str);
-    }
-    document.getElementById(linkroll).innerHTML = lines.join("\n");
-  }
-  this.cook = function(v) {
-    return v.replace('<', '&lt;').replace('>', '&gt>');
-  }
-
-  this.format_item = function(it) {
-    var str = "<li class=\"pin-item\">";
-    if (!it.d) { return; }
-    str += "<p><a class=\"pin-title\" href=\"" + this.cook(it.u) + "\">" + this.cook(it.d) + "</a>";
-    if (it.n) {
-      str += "<span class=\"pin-description\">" + this.cook(it.n) + "</span>\n";
-    }
-    if (it.t.length > 0) {
-      for (var i = 0; i < it.t.length; i++) {
-        var tag = it.t[i];
-        str += " <a class=\"pin-tag\" href=\"https://pinboard.in/u:"+ this.cook(it.a) + "/t:" + this.cook(tag) + "\">" + this.cook(tag).replace(/^\s+|\s+$/g, '') + "</a> ";
-      }
-    }
-    str += "</p></li>\n";
-    return str;
-  }
-}
-Pinboard_Linkroll.prototype = new Pinboard_Linkroll();
-pinboardNS_fetch_script("https://feeds.pinboard.in/json/v1/u:"+pinboard_user+"/?cb=pinboardNS_show_bmarks\&count="+pinboard_count);
-
diff --git a/source/javascripts/twitter.js b/source/javascripts/twitter.js
deleted file mode 100644
index 3e2dd0d7..00000000
--- a/source/javascripts/twitter.js
+++ /dev/null
@@ -1,78 +0,0 @@
-// JSON-P Twitter fetcher for Octopress
-// (c) Brandon Mathis // MIT License
-
-/* Sky Slavin, Ludopoli. MIT license.  * based on JavaScript Pretty Date * Copyright (c) 2008 John Resig (jquery.com) * Licensed under the MIT license.  */
-function prettyDate(time) {
-  if (navigator.appName === 'Microsoft Internet Explorer') {
-    return "<span>&infin;</span>"; // because IE date parsing isn't fun.
-  }
-  var say = {
-    just_now:    " now",
-    minute_ago:  "1m",
-    minutes_ago: "m",
-    hour_ago:    "1h",
-    hours_ago:   "h",
-    yesterday:   "1d",
-    days_ago:    "d",
-    last_week:   "1w",
-    weeks_ago:   "w"
-  };
-
-  var current_date = new Date(),
-      current_date_time = current_date.getTime(),
-      current_date_full = current_date_time + (1 * 60000),
-      date = new Date(time),
-      diff = ((current_date_full - date.getTime()) / 1000),
-      day_diff = Math.floor(diff / 86400);
-
-  if (isNaN(day_diff) || day_diff < 0) { return "<span>&infin;</span>"; }
-
-  return day_diff === 0 && (
-    diff < 60 && say.just_now ||
-    diff < 120 && say.minute_ago ||
-    diff < 3600 && Math.floor(diff / 60) + say.minutes_ago ||
-    diff < 7200 && say.hour_ago ||
-    diff < 86400 && Math.floor(diff / 3600) + say.hours_ago) ||
-    day_diff === 1 && say.yesterday ||
-    day_diff < 7 && day_diff + say.days_ago ||
-    day_diff === 7 && say.last_week ||
-    day_diff > 7 && Math.ceil(day_diff / 7) + say.weeks_ago;
-}
-
-function linkifyTweet(text, url) {
-  // Linkify urls, usernames, hashtags
-  text = text.replace(/(https?:\/\/)([\w\-:;?&=+.%#\/]+)/gi, '<a href="$1$2">$2</a>')
-    .replace(/(^|\W)@(\w+)/g, '$1<a href="https://twitter.com/$2">@$2</a>')
-    .replace(/(^|\W)#(\w+)/g, '$1<a href="https://search.twitter.com/search?q=%23$2">#$2</a>');
-
-  // Use twitter's api to replace t.co shortened urls with expanded ones.
-  for (var u in url) {
-    if(url[u].expanded_url != null){
-      var shortUrl = new RegExp(url[u].url, 'g');
-      text = text.replace(shortUrl, url[u].expanded_url);
-      var shortUrl = new RegExp(">"+(url[u].url.replace(/https?:\/\//, '')), 'g');
-      text = text.replace(shortUrl, ">"+url[u].display_url);
-    }
-  }
-  return text
-}
-
-function showTwitterFeed(tweets, twitter_user) {
-  var timeline = document.getElementById('tweets'),
-      content = '';
-
-  for (var t in tweets) {
-    content += '<li>'+'<p>'+'<a href="https://twitter.com/'+twitter_user+'/status/'+tweets[t].id_str+'">'+prettyDate(tweets[t].created_at)+'</a>'+linkifyTweet(tweets[t].text.replace(/\n/g, '<br>'), tweets[t].entities.urls)+'</p>'+'</li>';
-  }
-  timeline.innerHTML = content;
-}
-
-function getTwitterFeed(user, count, replies) {
-  count = parseInt(count, 10);
-  $.ajax({
-      url: "https://api.twitter.com/1/statuses/user_timeline/" + user + ".json?trim_user=true&count=" + (count + 20) + "&include_entities=1&exclude_replies=" + (replies ? "0" : "1") + "&callback=?"
-    , type: 'jsonp'
-    , error: function (err) { $('#tweets li.loading').addClass('error').text("Twitter's busted"); }
-    , success: function(data) { showTwitterFeed(data.slice(0, count), user); }
-  })
-}
-- 
cgit v1.2.1