Browse Source

New project structure

Jay Salvat 11 years ago
parent
commit
6094fb6202
100 changed files with 5705 additions and 460 deletions
  1. 1 4
      CHANGELOG.md
  2. 20 0
      LICENSE-MIT
  3. 7 2
      README.md
  4. 20 0
      component.json
  5. 0 0
      dist/images/loading.gif
  6. 0 0
      dist/jquery.vegas.css
  7. 302 0
      dist/jquery.vegas.js
  8. 1 0
      dist/jquery.vegas.min.css
  9. 10 0
      dist/jquery.vegas.min.js
  10. 4 0
      dist/metadata.json
  11. 0 0
      dist/overlays/01.png
  12. 0 0
      dist/overlays/02.png
  13. 0 0
      dist/overlays/03.png
  14. 0 0
      dist/overlays/04.png
  15. 0 0
      dist/overlays/05.png
  16. 0 0
      dist/overlays/06.png
  17. 0 0
      dist/overlays/07.png
  18. 0 0
      dist/overlays/08.png
  19. 0 0
      dist/overlays/09.png
  20. 0 0
      dist/overlays/10.png
  21. 0 0
      dist/overlays/11.png
  22. 0 0
      dist/overlays/12.png
  23. 0 0
      dist/overlays/13.png
  24. 0 0
      dist/overlays/14.png
  25. 0 0
      dist/overlays/15.png
  26. 177 0
      gruntfile.js
  27. 0 454
      jquery.vegas.js
  28. 72 0
      node_modules/.bin/semver
  29. 14 0
      node_modules/grunt-contrib-clean/.jshintrc
  30. 3 0
      node_modules/grunt-contrib-clean/.npmignore
  31. 6 0
      node_modules/grunt-contrib-clean/.travis.yml
  32. 6 0
      node_modules/grunt-contrib-clean/AUTHORS
  33. 32 0
      node_modules/grunt-contrib-clean/CHANGELOG
  34. 1 0
      node_modules/grunt-contrib-clean/CONTRIBUTING.md
  35. 60 0
      node_modules/grunt-contrib-clean/Gruntfile.js
  36. 22 0
      node_modules/grunt-contrib-clean/LICENSE-MIT
  37. 83 0
      node_modules/grunt-contrib-clean/README.md
  38. 28 0
      node_modules/grunt-contrib-clean/docs/clean-examples.md
  39. 7 0
      node_modules/grunt-contrib-clean/docs/clean-options.md
  40. 3 0
      node_modules/grunt-contrib-clean/docs/clean-overview.md
  41. 1 0
      node_modules/grunt-contrib-clean/docs/overview.md
  42. 67 0
      node_modules/grunt-contrib-clean/package.json
  43. 37 0
      node_modules/grunt-contrib-clean/tasks/clean.js
  44. 22 0
      node_modules/grunt-contrib-clean/test/clean_test.js
  45. 1 0
      node_modules/grunt-contrib-clean/test/fixtures/sample_long/long.txt
  46. 1 0
      node_modules/grunt-contrib-clean/test/fixtures/sample_short/short.txt
  47. 14 0
      node_modules/grunt-contrib-cssmin/.jshintrc
  48. 3 0
      node_modules/grunt-contrib-cssmin/.npmignore
  49. 6 0
      node_modules/grunt-contrib-cssmin/.travis.yml
  50. 6 0
      node_modules/grunt-contrib-cssmin/AUTHORS
  51. 51 0
      node_modules/grunt-contrib-cssmin/CHANGELOG
  52. 1 0
      node_modules/grunt-contrib-cssmin/CONTRIBUTING.md
  53. 88 0
      node_modules/grunt-contrib-cssmin/Gruntfile.js
  54. 22 0
      node_modules/grunt-contrib-cssmin/LICENSE-MIT
  55. 123 0
      node_modules/grunt-contrib-cssmin/README.md
  56. 40 0
      node_modules/grunt-contrib-cssmin/docs/cssmin-examples.md
  57. 30 0
      node_modules/grunt-contrib-cssmin/docs/cssmin-options.md
  58. 3 0
      node_modules/grunt-contrib-cssmin/docs/cssmin-overview.md
  59. 1 0
      node_modules/grunt-contrib-cssmin/docs/overview.md
  60. 1 0
      node_modules/grunt-contrib-cssmin/node_modules/.bin/cleancss
  61. 5 0
      node_modules/grunt-contrib-cssmin/node_modules/clean-css/.npmignore
  62. 262 0
      node_modules/grunt-contrib-cssmin/node_modules/clean-css/History.md
  63. 19 0
      node_modules/grunt-contrib-cssmin/node_modules/clean-css/LICENSE
  64. 131 0
      node_modules/grunt-contrib-cssmin/node_modules/clean-css/README.md
  65. 101 0
      node_modules/grunt-contrib-cssmin/node_modules/clean-css/bin/cleancss
  66. 1 0
      node_modules/grunt-contrib-cssmin/node_modules/clean-css/index.js
  67. 601 0
      node_modules/grunt-contrib-cssmin/node_modules/clean-css/lib/clean.js
  68. 174 0
      node_modules/grunt-contrib-cssmin/node_modules/clean-css/node_modules/commander/History.md
  69. 276 0
      node_modules/grunt-contrib-cssmin/node_modules/clean-css/node_modules/commander/Readme.md
  70. 1160 0
      node_modules/grunt-contrib-cssmin/node_modules/clean-css/node_modules/commander/index.js
  71. 101 0
      node_modules/grunt-contrib-cssmin/node_modules/clean-css/node_modules/commander/node_modules/keypress/README.md
  72. 346 0
      node_modules/grunt-contrib-cssmin/node_modules/clean-css/node_modules/commander/node_modules/keypress/index.js
  73. 23 0
      node_modules/grunt-contrib-cssmin/node_modules/clean-css/node_modules/commander/node_modules/keypress/package.json
  74. 28 0
      node_modules/grunt-contrib-cssmin/node_modules/clean-css/node_modules/commander/node_modules/keypress/test.js
  75. 32 0
      node_modules/grunt-contrib-cssmin/node_modules/clean-css/node_modules/commander/package.json
  76. 43 0
      node_modules/grunt-contrib-cssmin/node_modules/clean-css/package.json
  77. 1 0
      node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/.gitattributes
  78. 14 0
      node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/.jshintrc
  79. 3 0
      node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/.npmignore
  80. 6 0
      node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/.travis.yml
  81. 4 0
      node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/AUTHORS
  82. 47 0
      node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/CHANGELOG
  83. 60 0
      node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/Gruntfile.js
  84. 22 0
      node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/LICENSE-MIT
  85. 65 0
      node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/README.md
  86. 111 0
      node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/lib/contrib.js
  87. 1 0
      node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/node_modules/zlib-browserify/.npmignore
  88. 43 0
      node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/node_modules/zlib-browserify/index.js
  89. 33 0
      node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/node_modules/zlib-browserify/package.json
  90. 1 0
      node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/node_modules/zlib-browserify/readme.md
  91. 65 0
      node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/node_modules/zlib-browserify/test/zlib.test.js
  92. 55 0
      node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/node_modules/zlib-browserify/zlib.js
  93. 55 0
      node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/package.json
  94. 233 0
      node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/test/lib_test.js
  95. 72 0
      node_modules/grunt-contrib-cssmin/package.json
  96. 61 0
      node_modules/grunt-contrib-cssmin/tasks/cssmin.js
  97. 49 0
      node_modules/grunt-contrib-cssmin/test/cssmin_test.js
  98. 1 0
      node_modules/grunt-contrib-cssmin/test/expected/inline_import.css
  99. 2 0
      node_modules/grunt-contrib-cssmin/test/expected/input_bannered.css
  100. 1 0
      node_modules/grunt-contrib-cssmin/test/expected/style.css

+ 1 - 4
CHANGELOG.md

@@ -1,10 +1,7 @@
-# Vegas Background jQuery Plugin v1.3.2
+# Vegas jQuery Plugin
 
 
 ## CHANGE LOG
 ## CHANGE LOG
 
 
-### Vegas 1.3.2 xxxx-xx-xx
-* Add user-select:none to CSS (Thanks Hüseyin)
-
 ### Vegas 1.3.1 2012-09-05
 ### Vegas 1.3.1 2012-09-05
 * New attempt to fix the webkit image size bug (Thanks orourkedd)
 * New attempt to fix the webkit image size bug (Thanks orourkedd)
 * Get rid of imagesLoadedForVegas function
 * Get rid of imagesLoadedForVegas function

+ 20 - 0
LICENSE-MIT

@@ -0,0 +1,20 @@
+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.

+ 7 - 2
README.md

@@ -1,4 +1,4 @@
-# Vegas Background jQuery Plugin
+# Vegas – Fullscreen Backgrounds and Slideshows with jQuery.
 
 
 Vegas is a jQuery plugin to add beautiful fullscreen backgrounds to your webpages. You can even create amazing Slideshows.
 Vegas is a jQuery plugin to add beautiful fullscreen backgrounds to your webpages. You can even create amazing Slideshows.
 
 
@@ -13,4 +13,9 @@ http://vegas.jaysalvat.com/
 http://vegas.jaysalvat.com/demo/
 http://vegas.jaysalvat.com/demo/
 
 
 ### Documentation
 ### Documentation
-http://vegas.jaysalvat.com/documentation/
+http://vegas.jaysalvat.com/documentation/
+
+## Contributing
+
+Please don't edit files in the `dist` subdirectory as they are generated via Grunt. You'll find source code in the `src` subdirectory!
+Regarding code style like indentation and whitespace, **follow the conventions you see used in the source already.**

+ 20 - 0
component.json

@@ -0,0 +1,20 @@
+{
+  "name": "Vegas",
+  "version": "1.3.1",
+  "description": "Vegas – Fullscreen Backgrounds and Slideshows with jQuery.",
+  "homepage": "http://vegas.jaysalvat.com",
+  "author": "Jay Salvat",
+  "license": "MIT",
+  "main": "dist/jquery.vegas.js",
+  "repository": {
+    "type": "git",
+    "url": "[email protected]:jaysalvat/vegas.git"
+  },
+  "keywords": [
+    "jquery",
+    "background",
+    "slideshow",
+    "fullscreen",
+    "vegas"
+  ]
+}

+ 0 - 0
images/loading.gif → dist/images/loading.gif


+ 0 - 0
jquery.vegas.css → dist/jquery.vegas.css


+ 302 - 0
dist/jquery.vegas.js

@@ -0,0 +1,302 @@
+ // ----------------------------------------------------------------------------
+ // Vegas – Fullscreen Backgrounds and Slideshows with jQuery.
+ // v1.3.1 - released 2013-08-15 16:57
+ // Licensed under the MIT license.
+ // http://vegas.jaysalvat.com/
+ // ----------------------------------------------------------------------------
+ // Copyright (C) 2010-2013 Jay Salvat
+ // http://jaysalvat.com/
+ // ----------------------------------------------------------------------------
+
+(function($) {
+    var $background = $("<img />").addClass("vegas-background"), $overlay = $("<div />").addClass("vegas-overlay"), $loading = $("<div />").addClass("vegas-loading"), $current = $(), paused = null, backgrounds = [], step = 0, delay = 5e3, walk = function() {}, timer, methods = {
+        init: function(settings) {
+            var options = {
+                src: getBackground(),
+                align: "center",
+                valign: "center",
+                fade: 0,
+                loading: true,
+                load: function() {},
+                complete: function() {}
+            };
+            $.extend(options, $.vegas.defaults.background, settings);
+            if (options.loading) {
+                loading();
+            }
+            var $new = $background.clone();
+            $new.css({
+                position: "fixed",
+                left: "0px",
+                top: "0px"
+            }).bind("load", function() {
+                if ($new == $current) {
+                    return;
+                }
+                $(window).bind("load resize.vegas", function(e) {
+                    resize($new, options);
+                });
+                if ($current.is("img")) {
+                    $current.stop();
+                    $new.hide().insertAfter($current).fadeIn(options.fade, function() {
+                        $(".vegas-background").not(this).remove();
+                        $("body").trigger("vegascomplete", [ this, step - 1 ]);
+                        options.complete.apply($new, [ step - 1 ]);
+                    });
+                } else {
+                    $new.hide().prependTo("body").fadeIn(options.fade, function() {
+                        $("body").trigger("vegascomplete", [ this, step - 1 ]);
+                        options.complete.apply(this, [ step - 1 ]);
+                    });
+                }
+                $current = $new;
+                resize($current, options);
+                if (options.loading) {
+                    loaded();
+                }
+                $("body").trigger("vegasload", [ $current.get(0), step - 1 ]);
+                options.load.apply($current.get(0), [ step - 1 ]);
+                if (step) {
+                    $("body").trigger("vegaswalk", [ $current.get(0), step - 1 ]);
+                    options.walk.apply($current.get(0), [ step - 1 ]);
+                }
+            }).attr("src", options.src);
+            return $.vegas;
+        },
+        destroy: function(what) {
+            if (!what || what == "background") {
+                $(".vegas-background, .vegas-loading").remove();
+                $(window).unbind("resize.vegas");
+                $current = $();
+            }
+            if (what == "overlay") {
+                $(".vegas-overlay").remove();
+            }
+            return $.vegas;
+        },
+        overlay: function(settings) {
+            var options = {
+                src: null,
+                opacity: null
+            };
+            $.extend(options, $.vegas.defaults.overlay, settings);
+            $overlay.remove();
+            $overlay.css({
+                margin: "0",
+                padding: "0",
+                position: "fixed",
+                left: "0px",
+                top: "0px",
+                width: "100%",
+                height: "100%"
+            });
+            if (options.src) {
+                $overlay.css("backgroundImage", "url(" + options.src + ")");
+            }
+            if (options.opacity) {
+                $overlay.css("opacity", options.opacity);
+            }
+            $overlay.prependTo("body");
+            return $.vegas;
+        },
+        slideshow: function(settings, keepPause) {
+            var options = {
+                step: step,
+                delay: delay,
+                preload: false,
+                backgrounds: backgrounds,
+                walk: walk
+            };
+            $.extend(options, $.vegas.defaults.slideshow, settings);
+            if (options.backgrounds != backgrounds) {
+                if (!settings.step) {
+                    options.step = 0;
+                }
+                if (!settings.walk) {
+                    options.walk = function() {};
+                }
+                if (options.preload) {
+                    $.vegas("preload", options.backgrounds);
+                }
+            }
+            backgrounds = options.backgrounds;
+            delay = options.delay;
+            step = options.step;
+            walk = options.walk;
+            clearInterval(timer);
+            if (!backgrounds.length) {
+                return $.vegas;
+            }
+            var doSlideshow = function() {
+                if (step < 0) {
+                    step = backgrounds.length - 1;
+                }
+                if (step >= backgrounds.length || !backgrounds[step - 1]) {
+                    step = 0;
+                }
+                var settings = backgrounds[step++];
+                settings.walk = options.walk;
+                if (typeof settings.fade == "undefined") {
+                    settings.fade = options.fade;
+                }
+                if (settings.fade > options.delay) {
+                    settings.fade = options.delay;
+                }
+                $.vegas(settings);
+            };
+            doSlideshow();
+            if (!keepPause) {
+                paused = false;
+                $("body").trigger("vegasstart", [ $current.get(0), step - 1 ]);
+            }
+            if (!paused) {
+                timer = setInterval(doSlideshow, options.delay);
+            }
+            return $.vegas;
+        },
+        next: function() {
+            var from = step;
+            if (step) {
+                $.vegas("slideshow", {
+                    step: step
+                }, true);
+                $("body").trigger("vegasnext", [ $current.get(0), step - 1, from - 1 ]);
+            }
+            return $.vegas;
+        },
+        previous: function() {
+            var from = step;
+            if (step) {
+                $.vegas("slideshow", {
+                    step: step - 2
+                }, true);
+                $("body").trigger("vegasprevious", [ $current.get(0), step - 1, from - 1 ]);
+            }
+            return $.vegas;
+        },
+        jump: function(s) {
+            var from = step;
+            if (step) {
+                $.vegas("slideshow", {
+                    step: s
+                }, true);
+                $("body").trigger("vegasjump", [ $current.get(0), step - 1, from - 1 ]);
+            }
+            return $.vegas;
+        },
+        stop: function() {
+            var from = step;
+            step = 0;
+            paused = null;
+            clearInterval(timer);
+            $("body").trigger("vegasstop", [ $current.get(0), from - 1 ]);
+            return $.vegas;
+        },
+        pause: function() {
+            paused = true;
+            clearInterval(timer);
+            $("body").trigger("vegaspause", [ $current.get(0), step - 1 ]);
+            return $.vegas;
+        },
+        get: function(what) {
+            if (what === null || what == "background") {
+                return $current.get(0);
+            }
+            if (what == "overlay") {
+                return $overlay.get(0);
+            }
+            if (what == "step") {
+                return step - 1;
+            }
+            if (what == "paused") {
+                return paused;
+            }
+        },
+        preload: function(backgrounds) {
+            var cache = [];
+            for (var i in backgrounds) {
+                if (backgrounds[i].src) {
+                    var cacheImage = document.createElement("img");
+                    cacheImage.src = backgrounds[i].src;
+                    cache.push(cacheImage);
+                }
+            }
+            return $.vegas;
+        }
+    };
+    function resize($img, settings) {
+        var options = {
+            align: "center",
+            valign: "center"
+        };
+        $.extend(options, settings);
+        if ($img.height() === 0) {
+            $img.load(function() {
+                resize($(this), settings);
+            });
+            return;
+        }
+        var ww = $(window).width(), wh = $(window).height(), iw = $img.width(), ih = $img.height(), rw = wh / ww, ri = ih / iw, newWidth, newHeight, newLeft, newTop, properties;
+        if (rw > ri) {
+            newWidth = wh / ri;
+            newHeight = wh;
+        } else {
+            newWidth = ww;
+            newHeight = ww * ri;
+        }
+        properties = {
+            width: newWidth + "px",
+            height: newHeight + "px",
+            top: "auto",
+            bottom: "auto",
+            left: "auto",
+            right: "auto"
+        };
+        if (!isNaN(parseInt(options.valign, 10))) {
+            properties.top = 0 - (newHeight - wh) / 100 * parseInt(options.valign, 10) + "px";
+        } else if (options.valign == "top") {
+            properties.top = 0;
+        } else if (options.valign == "bottom") {
+            properties.bottom = 0;
+        } else {
+            properties.top = (wh - newHeight) / 2;
+        }
+        if (!isNaN(parseInt(options.align, 10))) {
+            properties.left = 0 - (newWidth - ww) / 100 * parseInt(options.align, 10) + "px";
+        } else if (options.align == "left") {
+            properties.left = 0;
+        } else if (options.align == "right") {
+            properties.right = 0;
+        } else {
+            properties.left = (ww - newWidth) / 2;
+        }
+        $img.css(properties);
+    }
+    function loading() {
+        $loading.prependTo("body").fadeIn();
+    }
+    function loaded() {
+        $loading.fadeOut("fast", function() {
+            $(this).remove();
+        });
+    }
+    function getBackground() {
+        if ($("body").css("backgroundImage")) {
+            return $("body").css("backgroundImage").replace(/url\("?(.*?)"?\)/i, "$1");
+        }
+    }
+    $.vegas = function(method) {
+        if (methods[method]) {
+            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
+        } else if (typeof method === "object" || !method) {
+            return methods.init.apply(this, arguments);
+        } else {
+            $.error("Method " + method + " does not exist");
+        }
+    };
+    $.vegas.defaults = {
+        background: {},
+        slideshow: {},
+        overlay: {}
+    };
+})(jQuery);

+ 1 - 0
dist/jquery.vegas.min.css

@@ -0,0 +1 @@
+.vegas-loading{border-radius:10px;background:#000;background:rgba(0,0,0,.7);background:url(images/loading.gif) no-repeat center center;height:32px;left:20px;position:fixed;top:20px;width:32px;z-index:0}.vegas-overlay{background:transparent url(overlays/01.png);opacity:.5;z-index:-1}.vegas-background{-ms-interpolation-mode:bicubic;image-rendering:optimizeQuality;max-width:none!important;z-index:-2}.vegas-overlay,.vegas-background{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}

File diff suppressed because it is too large
+ 10 - 0
dist/jquery.vegas.min.js


+ 4 - 0
dist/metadata.json

@@ -0,0 +1,4 @@
+{
+  "date": "2013-08-15 16:57:54",
+  "version": "1.3.1"
+}

+ 0 - 0
overlays/01.png → dist/overlays/01.png


+ 0 - 0
overlays/02.png → dist/overlays/02.png


+ 0 - 0
overlays/03.png → dist/overlays/03.png


+ 0 - 0
overlays/04.png → dist/overlays/04.png


+ 0 - 0
overlays/05.png → dist/overlays/05.png


+ 0 - 0
overlays/06.png → dist/overlays/06.png


+ 0 - 0
overlays/07.png → dist/overlays/07.png


+ 0 - 0
overlays/08.png → dist/overlays/08.png


+ 0 - 0
overlays/09.png → dist/overlays/09.png


+ 0 - 0
overlays/10.png → dist/overlays/10.png


+ 0 - 0
overlays/11.png → dist/overlays/11.png


+ 0 - 0
overlays/12.png → dist/overlays/12.png


+ 0 - 0
overlays/13.png → dist/overlays/13.png


+ 0 - 0
overlays/14.png → dist/overlays/14.png


+ 0 - 0
overlays/15.png → dist/overlays/15.png


+ 177 - 0
gruntfile.js

@@ -0,0 +1,177 @@
+var semver = require('semver'),
+    format = require('util').format;
+
+module.exports = function(grunt) {
+
+    grunt.initConfig({
+
+        pkg: grunt.file.readJSON('package.json'),
+
+        banner: [
+            ' // ----------------------------------------------------------------------------',
+            ' // <%= pkg.description %>',
+            ' // v<%= pkg.version %> - released <%= grunt.template.today("yyyy-mm-dd HH:MM") %>',
+            ' // Licensed under the MIT license.',
+            ' // http://vegas.jaysalvat.com/',
+            ' // ----------------------------------------------------------------------------',
+            ' // Copyright (C) 2010-<%= grunt.template.today("yyyy") %> Jay Salvat',
+            ' // http://jaysalvat.com/',
+            ' // ----------------------------------------------------------------------------',
+            '\n'
+        ].join('\n'),
+
+        jshint: {
+            files: ['gruntfile.js', 'src/**/*.js']
+        },
+
+        uglify: {
+            options: {
+                banner: '<%= banner %>'
+            },
+            js: {
+                options: {
+                    mangle: false,
+                    compress: false,
+                    beautify: true
+                },
+                src: 'src/jquery.vegas.js',
+                dest: 'dist/jquery.vegas.js'
+            },
+            jsmin: {
+                options: {
+                    mangle: true,
+                    compress: true
+                },
+                src: 'dist/jquery.vegas.js',
+                dest: 'dist/jquery.vegas.min.js'
+            }
+        },
+
+        cssmin: {
+            minify: {
+                src: 'src/jquery.vegas.css',
+                dest: 'dist/jquery.vegas.min.css'
+            }
+        },
+
+        exec: {
+            copyAssets: {
+                cmd: [
+                    'cp -r src/images dist/',
+                    'cp -r src/overlays dist/',
+                    'cp -r src/jquery.vegas.css dist/jquery.vegas.css'
+                ].join(' && ')
+            },
+            publish: {
+                cmd: [
+                    'cp -r src/images dist/',
+                    'cp -r src/overlays dist/',
+                    'cp -r src/jquery.vegas.css dist/jquery.vegas.css',
+                    'cp -r dist/ tmp/',
+                    'zip -rj tmp/vegas.zip tmp/jquery.vegas.js',
+                    'zip -rj tmp/vegas.zip tmp/jquery.vegas.min.js',
+                    'zip -rj tmp/vegas.zip tmp/jquery.vegas.css',
+                    'zip -rj tmp/vegas.zip tmp/jquery.vegas.min.css',
+                    'zip -rj tmp/vegas.zip tmp/images',
+                    'zip -rj tmp/vegas.zip tmp/overlays',
+                    'git checkout gh-pages',
+                    'rm -rf releases/latest/',
+                    'cp -r tmp/ releases/<%= pkg.version %>/',
+                    'cp -r tmp/ releases/latest/',
+                    'git add -A releases/<%= pkg.version %>',
+                    'git add -A releases/latest',
+                    'git commit -m "Published v<%= pkg.version %>."',
+                    'git push',
+                    'git checkout -',
+                    'rm -rf tmp/'
+                ].join(' && ')
+            },
+            gitFailIfDirty: {
+                cmd: 'test -z "$(git status --porcelain)"'
+            },
+            gitAdd: {
+                cmd: 'git add .'
+            },
+            gitCommit: {
+                cmd: function(message) {
+                    return format('git commit -m "%s"', message);
+                }
+            },
+            gitTag: {
+                cmd: function(version) {
+                    return format('git tag v%s -am "%s"', version, version);
+                }
+            },
+            gitPush: {
+                cmd: [
+                    'git push',
+                    'git push --tags'
+                ].join(' && ')
+            }
+        }
+    });
+
+    grunt.loadNpmTasks('grunt-exec');
+    grunt.loadNpmTasks('grunt-contrib-jshint');
+    grunt.loadNpmTasks('grunt-contrib-uglify');
+    grunt.loadNpmTasks('grunt-contrib-cssmin');
+
+    grunt.registerTask('build',   ['jshint', 'uglify', 'cssmin']);
+    grunt.registerTask('publish', ['exec:publish']);
+    grunt.registerTask('default', ['build']);
+
+    grunt.registerTask('release', 'Release lib.', function(version) {
+        var pkg = grunt.file.readJSON('package.json');
+
+        version = semver.inc(pkg.version, version) || version;
+
+        if (!semver.valid(version) || semver.lte(version, pkg.version)) {
+            grunt.fatal('Invalid version.');
+        }
+
+        pkg.version = version;
+        grunt.config.data.pkg = pkg;
+
+        grunt.task.run([
+            'exec:gitFailIfDirty',
+            'build',
+            'metadata:' + version,
+            'manifests:' + version,
+            'exec:gitAdd',
+            'exec:gitCommit:' + version,
+            'exec:gitTag:' + version,
+            'exec:gitPush',
+            'exec:publish'
+        ]);
+    });
+
+    grunt.registerTask('manifests', 'Update manifests.', function(version) {
+        var _   = grunt.util._,
+            pkg = grunt.file.readJSON('package.json'),
+            cpt = grunt.file.readJSON('component.json');
+
+        if (!semver.valid(version)) {
+            grunt.fatal('Invalid version');
+        }
+
+        pkg.version = version;
+
+        cpt = JSON.stringify(_.extend(cpt,
+            _.omit(pkg, 'dependencies', 'devDependencies')
+        ), null, 2);
+
+        pkg = JSON.stringify(pkg, null, 2);
+
+        grunt.file.write('package.json', pkg);
+        grunt.file.write('component.json', cpt);
+    });
+
+    grunt.registerTask('metadata', 'Create metadata file.', function(version) {
+        var metadata = {
+            'date': grunt.template.today("yyyy-mm-dd HH:MM:ss"),
+            'version': version
+        };
+
+        grunt.file.write('dist/metadata.json', JSON.stringify(metadata, null, 2));
+    });
+};

+ 0 - 454
jquery.vegas.js

@@ -1,454 +0,0 @@
-// ----------------------------------------------------------------------------
-// Vegas - jQuery plugin 
-// Add awesome fullscreen backgrounds to your webpages.
-// v 1.3.1
-// Dual licensed under the MIT and GPL licenses.
-// http://vegas.jaysalvat.com/
-// ----------------------------------------------------------------------------
-// Copyright (C) 2012 Jay Salvat
-// http://jaysalvat.com/
-// ----------------------------------------------------------------------------
-// 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.
-// ----------------------------------------------------------------------------
-( function( $ ){
-    var $background = $( '<img />' ).addClass( 'vegas-background' ),
-        $overlay    = $( '<div />' ).addClass( 'vegas-overlay' ),
-        $loading    = $( '<div />' ).addClass( 'vegas-loading' ),
-        $current    = $(),
-        paused = null,
-        backgrounds = [],
-        step = 0,
-        delay = 5000,
-        walk = function() {},
-        timer,
-        methods = {
-
-        // Init plugin
-        init : function( settings ) {
-            var options = {
-                src: getBackground(),
-                align: 'center',
-                valign: 'center',
-                fade: 0,
-                loading: true,
-                load: function() {},
-                complete: function() {}
-            }
-            $.extend( options, $.vegas.defaults.background, settings );
-
-            if ( options.loading ) {
-                loading();
-            }
-
-            var $new = $background.clone();
-            $new.css( {
-                'position': 'fixed',
-                'left': '0px',
-                'top': '0px'
-            })
-            .bind('load', function() {
-                if ( $new == $current ) {
-                    return;
-                }
-                
-                $( window ).bind( 'load resize.vegas', function( e ) {
-                    resize( $new, options );
-                });
-
-                if ( $current.is( 'img' ) ) {
-
-                    $current.stop();
-
-                    $new.hide()
-                        .insertAfter( $current )
-                        .fadeIn( options.fade, function() {
-                            $('.vegas-background')
-                                .not(this)
-                                    .remove();
-                            $( 'body' ).trigger( 'vegascomplete', [ this, step - 1 ] );
-                            options.complete.apply( $new, [ step - 1 ] );
-                        });
-                } else {
-                    $new.hide()
-                        .prependTo( 'body' )
-                        .fadeIn( options.fade, function() {
-                            $( 'body' ).trigger( 'vegascomplete', [ this, step - 1 ] );
-                            options.complete.apply( this, [ step - 1 ] );    
-                        });
-                }
-
-                $current = $new;
-
-                resize( $current, options );
-
-                if ( options.loading ) {
-                    loaded();
-                }
-
-                $( 'body' ).trigger( 'vegasload', [ $current.get(0), step - 1 ] );
-                options.load.apply( $current.get(0), [ step - 1 ] );
-
-                if ( step ) {
-                    $( 'body' ).trigger( 'vegaswalk', [ $current.get(0), step - 1 ] );
-                    options.walk.apply( $current.get(0), [ step - 1 ] );
-                }
-            })
-            .attr( 'src', options.src );
-
-            return $.vegas;
-        },
-
-        // Destroy background and/or overlay
-        destroy: function( what ) {
-            if ( !what || what == 'background') {
-                $( '.vegas-background, .vegas-loading' ).remove();
-                $( window ).unbind( 'resize.vegas' );
-                $current = $();
-            }
-
-            if ( what == 'overlay') {
-                $( '.vegas-overlay' ).remove();
-            }
-
-            return $.vegas;
-        },
-
-        // Display the pattern overlay
-        overlay: function( settings ) {
-            var options = {
-                src: null,
-                opacity: null
-            };
-            $.extend( options, $.vegas.defaults.overlay, settings );
-
-            $overlay.remove();
-
-            $overlay
-                .css( {
-                    'margin': '0',
-                    'padding': '0',
-                    'position': 'fixed',
-                    'left': '0px',
-                    'top': '0px',
-                    'width': '100%',
-                    'height': '100%'
-            });
-
-            if ( options.src ) {
-                $overlay.css( 'backgroundImage', 'url(' + options.src + ')' );
-            }
-
-            if ( options.opacity ) {
-                $overlay.css( 'opacity', options.opacity );
-            }
-
-            $overlay.prependTo( 'body' );
-
-            return $.vegas;
-        },
-
-        // Start/restart slideshow
-        slideshow: function( settings, keepPause ) {
-            var options = {
-                step: step,
-                delay: delay,
-                preload: false,
-                backgrounds: backgrounds,
-                walk: walk
-            };
-            
-            $.extend( options, $.vegas.defaults.slideshow, settings );
-                        
-            if ( options.backgrounds != backgrounds ) {
-                if ( !settings.step ) {
-                    options.step = 0;
-                }
-
-                if ( !settings.walk ) {
-                    options.walk = function() {};
-                }
-
-                if ( options.preload ) {
-                    $.vegas( 'preload', options.backgrounds );
-                }
-            }
-
-            backgrounds = options.backgrounds;
-            delay = options.delay;
-            step = options.step;
-            walk = options.walk;
-
-            clearInterval( timer );
-
-            if ( !backgrounds.length ) {
-                return $.vegas;
-            }
-
-            var doSlideshow = function() {
-                if ( step < 0 ) {
-                    step = backgrounds.length - 1;
-                }
-
-                if ( step >= backgrounds.length || !backgrounds[ step - 1 ] ) {
-                    step = 0;
-                }
-
-                var settings = backgrounds[ step++ ];
-                settings.walk = options.walk;
-
-                if ( typeof( settings.fade ) == 'undefined' ) {
-                    settings.fade = options.fade;
-                }
-
-                if ( settings.fade > options.delay ) {
-                    settings.fade = options.delay;
-                }
-
-                $.vegas( settings );
-            }
-            doSlideshow();
-
-            if ( !keepPause ) {
-                paused = false;
-                
-                $( 'body' ).trigger( 'vegasstart', [ $current.get(0), step - 1 ] );
-            }
-
-            if ( !paused ) {
-                timer = setInterval( doSlideshow, options.delay );
-            }
-
-            return $.vegas;
-        },
-
-        // Jump to the next background in the current slideshow
-        next: function() {
-            var from = step;
-
-            if ( step ) {
-                $.vegas( 'slideshow', { step: step }, true );
-
-                $( 'body' ).trigger( 'vegasnext', [ $current.get(0), step - 1, from - 1 ] );
-            }
-
-            return $.vegas;
-        },
-
-        // Jump to the previous background in the current slideshow
-        previous: function() {
-            var from = step;
-
-            if ( step ) {
-                $.vegas( 'slideshow', { step: step - 2 }, true );
-
-                $( 'body' ).trigger( 'vegasprevious', [ $current.get(0), step - 1, from - 1 ] );
-            }
-
-            return $.vegas;
-        },
-
-        // Jump to a specific background in the current slideshow
-        jump: function( s ) {
-            var from = step;
-
-            if ( step ) {
-                $.vegas( 'slideshow', { step: s }, true );
-
-                $( 'body' ).trigger( 'vegasjump', [ $current.get(0), step - 1, from - 1 ] );
-            }
-
-            return $.vegas;
-        },
-
-        // Stop slideshow
-        stop: function() {
-            var from = step;
-            step = 0;
-            paused = null;
-            clearInterval( timer );
-
-            $( 'body' ).trigger( 'vegasstop', [ $current.get(0), from - 1 ] );
-
-            return $.vegas;
-        },
-
-        // Pause slideShow
-        pause: function() {
-            paused = true;
-            clearInterval( timer );
-
-            $( 'body' ).trigger( 'vegaspause', [ $current.get(0), step - 1 ] );
-
-            return $.vegas;
-        },
-
-        // Get some useful values or objects
-        get: function( what ) {
-            if ( what == null || what == 'background' ) {
-                return $current.get(0);
-            }
-
-            if ( what == 'overlay' ) {
-                return $overlay.get(0);
-            }
-
-            if ( what == 'step' ) {
-                return step - 1;
-            }
-
-            if ( what == 'paused' ) {
-                return paused;
-            }
-        },
-        
-        // Preload an array of backgrounds
-        preload: function( backgrounds ) {
-            var cache = [];
-            for( var i in backgrounds ) {
-                if ( backgrounds[ i ].src ) {
-                    var cacheImage = document.createElement('img');
-                    cacheImage.src = backgrounds[ i ].src;
-                    cache.push(cacheImage);
-                }
-            }
-
-            return $.vegas;
-        }
-    }
-
-    // Resize the background
-    function resize( $img, settings ) {
-        var options =  {
-            align: 'center',
-            valign: 'center'
-        }
-        $.extend( options, settings );
-
-        if( $img.height() == 0 ) {
-            $img.load( function(){
-                resize( $(this), settings );
-            } );
-            return;
-        }
-
-        var ww = $( window ).width(),
-            wh = $( window ).height(),
-            iw = $img.width(),
-            ih = $img.height(),
-            rw = wh / ww,
-            ri = ih / iw,
-            newWidth, newHeight,
-            newLeft, newTop,
-            properties;
-
-        if ( rw > ri ) {
-            newWidth = wh / ri;
-            newHeight = wh;
-        } else {
-            newWidth = ww;
-            newHeight = ww * ri;
-        }
-
-        properties = {
-            'width': newWidth + 'px',
-            'height': newHeight + 'px',
-            'top': 'auto',
-            'bottom': 'auto',
-            'left': 'auto',
-            'right': 'auto'
-        }
-
-        if ( !isNaN( parseInt( options.valign ) ) ) {
-            properties[ 'top' ] = ( 0 - ( newHeight - wh ) / 100 * parseInt( options.valign ) ) + 'px';
-        } else if ( options.valign == 'top' ) {
-            properties[ 'top' ] = 0;
-        } else if ( options.valign == 'bottom' ) {
-            properties[ 'bottom' ] = 0;
-        } else {
-            properties[ 'top' ] = ( wh - newHeight ) / 2;
-        } 
-
-        if ( !isNaN( parseInt( options.align ) ) ) {
-            properties[ 'left' ] = ( 0 - ( newWidth - ww ) / 100 * parseInt( options.align ) ) + 'px';
-        } else if ( options.align == 'left' ) {
-            properties[ 'left' ] = 0;
-        } else if ( options.align == 'right' ) {
-            properties[ 'right' ] = 0;
-        } else {
-            properties[ 'left' ] = ( ww - newWidth ) / 2 ;
-        }
-
-        $img.css( properties );
-    }
-
-    // Display the loading indicator
-    function loading() {
-        $loading.prependTo( 'body' ).fadeIn();
-    }
-
-    // Hide the loading indicator
-    function loaded() {
-        $loading.fadeOut( 'fast', function() {
-            $( this ).remove();
-        });
-    }
-
-    // Get the background image from the body
-    function getBackground() {
-        if ( $( 'body' ).css( 'backgroundImage' ) ) {
-            return $( 'body' ).css( 'backgroundImage' ).replace( /url\("?(.*?)"?\)/i, '$1' );
-        }
-    }
-
-    // The plugin
-    $.vegas = function( method ) {
-        if ( methods[ method ] ) {
-            return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ) );
-        } else if ( typeof method === 'object' || !method ) {
-            return methods.init.apply( this, arguments );
-        } else {
-            $.error( 'Method ' +  method + ' does not exist' );
-        }
-    };
-
-    // Global parameters
-    $.vegas.defaults = {
-        background: {
-            // src:         string
-            // align:       string/int
-            // valign:      string/int
-            // fade:        int
-            // loading      bool
-            // load:        function
-            // complete:    function
-        },
-        slideshow: {
-            // fade:        null
-            // step:        int
-            // delay:       int
-            // backgrounds: array
-            // preload:     bool
-            // walk:        function
-        },
-        overlay: {
-            // src:         string
-            // opacity:     float
-        }
-    }
-})( jQuery );

+ 72 - 0
node_modules/.bin/semver

@@ -0,0 +1,72 @@
+#!/usr/bin/env node
+// Standalone semver comparison program.
+// Exits successfully and prints matching version(s) if
+// any supplied version is valid and passes all tests.
+
+var argv = process.argv.slice(2)
+  , versions = []
+  , range = []
+  , gt = []
+  , lt = []
+  , eq = []
+  , semver = require("../semver")
+
+main()
+
+function main () {
+  if (!argv.length) return help()
+  while (argv.length) {
+    var a
+    switch (a = argv.shift()) {
+      case "-v": case "--version":
+        versions.push(argv.shift())
+        break
+      case "-r": case "--range":
+        range.push(argv.shift())
+        break
+      case "-h": case "--help": case "-?":
+        return help()
+      default:
+        versions.push(a)
+        break
+    }
+  }
+
+  versions = versions.filter(semver.valid)
+  if (!versions.length) return fail()
+  for (var i = 0, l = range.length; i < l ; i ++) {
+    versions = versions.filter(function (v) {
+      return semver.satisfies(v, range[i])
+    })
+    if (!versions.length) return fail()
+  }
+  return success(versions)
+}
+
+function fail () { process.exit(1) }
+
+function success () {
+  versions.sort(semver.compare)
+    .map(semver.clean)
+    .forEach(function (v,i,_) { console.log(v) })
+}
+
+function help () {
+  console.log(["Usage: semver -v <version> [-r <range>]"
+              ,"Test if version(s) satisfy the supplied range(s),"
+              ,"and sort them."
+              ,""
+              ,"Multiple versions or ranges may be supplied."
+              ,""
+              ,"Program exits successfully if any valid version satisfies"
+              ,"all supplied ranges, and prints all satisfying versions."
+              ,""
+              ,"If no versions are valid, or ranges are not satisfied,"
+              ,"then exits failure."
+              ,""
+              ,"Versions are printed in ascending order, so supplying"
+              ,"multiple versions to the utility will just sort them."
+              ].join("\n"))
+}
+
+

+ 14 - 0
node_modules/grunt-contrib-clean/.jshintrc

@@ -0,0 +1,14 @@
+{
+  "curly": true,
+  "eqeqeq": true,
+  "immed": true,
+  "latedef": true,
+  "newcap": true,
+  "noarg": true,
+  "sub": true,
+  "undef": true,
+  "boss": true,
+  "eqnull": true,
+  "node": true,
+  "es5": true
+}

+ 3 - 0
node_modules/grunt-contrib-clean/.npmignore

@@ -0,0 +1,3 @@
+node_modules
+npm-debug.log
+tmp

+ 6 - 0
node_modules/grunt-contrib-clean/.travis.yml

@@ -0,0 +1,6 @@
+language: node_js
+node_js:
+  - "0.8"
+  - "0.10"
+before_script:
+  - npm install -g grunt-cli

+ 6 - 0
node_modules/grunt-contrib-clean/AUTHORS

@@ -0,0 +1,6 @@
+Tim Branyen (http://tbranyen.com/)
+Tyler Kellen (http://goingslowly.com/)
+Chris Talkington (http://christalkington.com/)
+Sebastian Golasch (http://www.asciidisco.com/)
+Vlad Filippov (http://vf.io)
+"Cowboy" Ben Alman (http://benalman.com/)

+ 32 - 0
node_modules/grunt-contrib-clean/CHANGELOG

@@ -0,0 +1,32 @@
+v0.4.1:
+  date: 2013-04-16
+  changes:
+    - Check if file exists to avoid trying to delete a non-existent file.
+v0.4.0:
+  date: 2013-02-15
+  changes:
+    - First official release for Grunt 0.4.0.
+v0.4.0rc6:
+  date: 2013-01-18
+  changes:
+    - Updating grunt/gruntplugin dependencies to rc6.
+    - Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions.
+v0.4.0rc5:
+  date: 2013-01-09
+  changes:
+    - Updating to work with grunt v0.4.0rc5.
+    - Switching to this.filesSrc api.
+v0.4.0a:
+  date: 2012-12-07
+  changes:
+    - Conversion to grunt v0.4 conventions.
+    - Remove node v0.6 and grunt v0.3 support.
+    - Add force option to bypass CWD check.
+v0.3.0:
+  date: 2012-09-23
+  changes:
+    - Options no longer accepted from global config key.
+v0.2.0:
+ date: 2012-09-10
+ changes:
+   - Refactored from grunt-contrib into individual repo.

+ 1 - 0
node_modules/grunt-contrib-clean/CONTRIBUTING.md

@@ -0,0 +1 @@
+Please see the [Contributing to grunt](http://gruntjs.com/contributing) guide for information on contributing to this project.

+ 60 - 0
node_modules/grunt-contrib-clean/Gruntfile.js

@@ -0,0 +1,60 @@
+/*
+ * grunt-contrib-clean
+ * http://gruntjs.com/
+ *
+ * Copyright (c) 2012 Tim Branyen, contributors
+ * Licensed under the MIT license.
+ */
+
+'use strict';
+
+module.exports = function(grunt) {
+
+  // Project configuration.
+  grunt.initConfig({
+    jshint: {
+      all: [
+        'Gruntfile.js',
+        'tasks/*.js',
+        '<%= nodeunit.tests %>'
+      ],
+      options: {
+        jshintrc: '.jshintrc'
+      },
+    },
+
+    // Configuration to be run (and then tested).
+    clean: {
+      short: ['tmp/sample_short'],
+      long: {
+        src: ['tmp/sample_long'],
+      },
+    },
+
+    // Unit tests.
+    nodeunit: {
+      tests: ['test/*_test.js'],
+    },
+  });
+
+  // Actually load this plugin's task(s).
+  grunt.loadTasks('tasks');
+
+  // These plugins provide necessary tasks.
+  grunt.loadNpmTasks('grunt-contrib-jshint');
+  grunt.loadNpmTasks('grunt-contrib-nodeunit');
+  grunt.loadNpmTasks('grunt-contrib-internal');
+
+  // Setup a test helper to create some folders to clean.
+  grunt.registerTask('copy', 'Copy fixtures to a temp location.', function() {
+    grunt.file.copy('test/fixtures/sample_long/long.txt', 'tmp/sample_long/long.txt');
+    grunt.file.copy('test/fixtures/sample_short/short.txt', 'tmp/sample_short/short.txt');
+  });
+
+  // Whenever the 'test' task is run, first create some files to be cleaned,
+  // then run this plugin's task(s), then test the result.
+  grunt.registerTask('test', ['copy', 'clean', 'nodeunit']);
+
+  // By default, lint and run all tests.
+  grunt.registerTask('default', ['jshint', 'test', 'build-contrib']);
+};

+ 22 - 0
node_modules/grunt-contrib-clean/LICENSE-MIT

@@ -0,0 +1,22 @@
+Copyright (c) 2012 Tim Branyen, contributors
+
+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.

+ 83 - 0
node_modules/grunt-contrib-clean/README.md

@@ -0,0 +1,83 @@
+# grunt-contrib-clean [![Build Status](https://secure.travis-ci.org/gruntjs/grunt-contrib-clean.png?branch=master)](http://travis-ci.org/gruntjs/grunt-contrib-clean)
+
+> Clean files and folders.
+
+
+
+## Getting Started
+This plugin requires Grunt `~0.4.0`
+
+If you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:
+
+```shell
+npm install grunt-contrib-clean --save-dev
+```
+
+Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:
+
+```js
+grunt.loadNpmTasks('grunt-contrib-clean');
+```
+
+*This plugin was designed to work with Grunt 0.4.x. If you're still using grunt v0.3.x it's strongly recommended that [you upgrade](http://gruntjs.com/upgrading-from-0.3-to-0.4), but in case you can't please use [v0.3.2](https://github.com/gruntjs/grunt-contrib-clean/tree/grunt-0.3-stable).*
+
+
+
+## Clean task
+_Run this task with the `grunt clean` command._
+
+Task targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide.
+
+*Due to the destructive nature of this task, always be cautious of the paths you clean.*
+### Options
+
+#### force
+Type: `Boolean`  
+Default: false
+
+This overrides `grunt.file.delete` from blocking deletion of folders outside current working dir (CWD). Use with caution.
+
+### Usage Examples
+
+There are three formats you can use to run this task.
+
+#### Short
+
+```js
+clean: ["path/to/dir/one", "path/to/dir/two"]
+```
+
+#### Medium (specific targets with global options)
+
+```js
+clean: {
+  build: ["path/to/dir/one", "path/to/dir/two"],
+  release: ["path/to/another/dir/one", "path/to/another/dir/two"]
+},
+```
+
+#### Long (specific targets with per target options)
+
+```js
+clean: {
+  build: {
+    src: ["path/to/dir/one", "path/to/dir/two"]
+  }
+}
+```
+
+## Release History
+
+ * 2013-04-16   v0.4.1   Check if file exists to avoid trying to delete a non-existent file.
+ * 2013-02-15   v0.4.0   First official release for Grunt 0.4.0.
+ * 2013-01-18   v0.4.0rc6   Updating grunt/gruntplugin dependencies to rc6. Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions.
+ * 2013-01-09   v0.4.0rc5   Updating to work with grunt v0.4.0rc5. Switching to this.filesSrc api.
+ * 2012-12-07   v0.4.0a   Conversion to grunt v0.4 conventions. Remove node v0.6 and grunt v0.3 support. Add force option to bypass CWD check.
+ * 2012-09-23   v0.3.0   Options no longer accepted from global config key.
+ * 2012-09-10   v0.2.0   Refactored from grunt-contrib into individual repo.
+
+---
+
+Task submitted by [Tim Branyen](http://tbranyen.com/)
+
+*This file was generated on Tue Apr 16 2013 13:28:15.*

+ 28 - 0
node_modules/grunt-contrib-clean/docs/clean-examples.md

@@ -0,0 +1,28 @@
+# Usage Examples
+
+There are three formats you can use to run this task.
+
+## Short
+
+```js
+clean: ["path/to/dir/one", "path/to/dir/two"]
+```
+
+## Medium (specific targets with global options)
+
+```js
+clean: {
+  build: ["path/to/dir/one", "path/to/dir/two"],
+  release: ["path/to/another/dir/one", "path/to/another/dir/two"]
+},
+```
+
+## Long (specific targets with per target options)
+
+```js
+clean: {
+  build: {
+    src: ["path/to/dir/one", "path/to/dir/two"]
+  }
+}
+```

+ 7 - 0
node_modules/grunt-contrib-clean/docs/clean-options.md

@@ -0,0 +1,7 @@
+# Options
+
+## force
+Type: `Boolean`  
+Default: false
+
+This overrides `grunt.file.delete` from blocking deletion of folders outside current working dir (CWD). Use with caution.

+ 3 - 0
node_modules/grunt-contrib-clean/docs/clean-overview.md

@@ -0,0 +1,3 @@
+Task targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide.
+
+*Due to the destructive nature of this task, always be cautious of the paths you clean.*

+ 1 - 0
node_modules/grunt-contrib-clean/docs/overview.md

@@ -0,0 +1 @@
+*This plugin was designed to work with Grunt 0.4.x. If you're still using grunt v0.3.x it's strongly recommended that [you upgrade](http://gruntjs.com/upgrading-from-0.3-to-0.4), but in case you can't please use [v0.3.2](https://github.com/gruntjs/grunt-contrib-clean/tree/grunt-0.3-stable).*

File diff suppressed because it is too large
+ 67 - 0
node_modules/grunt-contrib-clean/package.json


+ 37 - 0
node_modules/grunt-contrib-clean/tasks/clean.js

@@ -0,0 +1,37 @@
+/*
+ * grunt-contrib-clean
+ * http://gruntjs.com/
+ *
+ * Copyright (c) 2012 Tim Branyen, contributors
+ * Licensed under the MIT license.
+ */
+
+'use strict';
+
+module.exports = function(grunt) {
+
+  grunt.registerMultiTask('clean', 'Clean files and folders.', function() {
+    // Merge task-specific and/or target-specific options with these defaults.
+    var options = this.options({
+      force: false
+    });
+
+    grunt.verbose.writeflags(options, 'Options');
+
+    // Clean specified files / dirs.
+    this.filesSrc.forEach(function(filepath) {
+      if (!grunt.file.exists(filepath)) { return; }
+      grunt.log.write('Cleaning "' + filepath + '"...');
+
+      try {
+        grunt.file.delete(filepath, options);
+        grunt.log.ok();
+      } catch (e) {
+        grunt.log.error();
+        grunt.verbose.error(e);
+        grunt.fail.warn('Clean operation failed.');
+      }
+    });
+  });
+
+};

+ 22 - 0
node_modules/grunt-contrib-clean/test/clean_test.js

@@ -0,0 +1,22 @@
+'use strict';
+
+var grunt = require('grunt');
+
+exports.clean = {
+  short: function(test) {
+    test.expect(1);
+
+    var expected = grunt.file.exists('tmp/sample_short');
+    test.equal(expected, false, 'should remove the short directory using clean');
+
+    test.done();
+  },
+  long: function(test) {
+    test.expect(1);
+
+    var expected = grunt.file.exists('tmp/sample_long');
+    test.equal(expected, false, 'should remove the long directory using clean');
+
+    test.done();
+  }
+};

+ 1 - 0
node_modules/grunt-contrib-clean/test/fixtures/sample_long/long.txt

@@ -0,0 +1 @@
+txt

+ 1 - 0
node_modules/grunt-contrib-clean/test/fixtures/sample_short/short.txt

@@ -0,0 +1 @@
+txt

+ 14 - 0
node_modules/grunt-contrib-cssmin/.jshintrc

@@ -0,0 +1,14 @@
+{
+  "curly": true,
+  "eqeqeq": true,
+  "immed": true,
+  "latedef": true,
+  "newcap": true,
+  "noarg": true,
+  "sub": true,
+  "undef": true,
+  "boss": true,
+  "eqnull": true,
+  "node": true,
+  "es5": true
+}

+ 3 - 0
node_modules/grunt-contrib-cssmin/.npmignore

@@ -0,0 +1,3 @@
+node_modules
+npm-debug.log
+tmp

+ 6 - 0
node_modules/grunt-contrib-cssmin/.travis.yml

@@ -0,0 +1,6 @@
+language: node_js
+node_js:
+  - "0.8"
+  - "0.10"
+before_script:
+  - npm install -g grunt-cli

+ 6 - 0
node_modules/grunt-contrib-cssmin/AUTHORS

@@ -0,0 +1,6 @@
+Tim Branyen (http://goingslowly.com/)
+Chris Talkington (http://christalkington.com/)
+Thomas Boyt (http://www.thomasboyt.com/)
+Liam Kaufman (http://liamkaufman.com/)
+Jörn Zaefferer (http://bassistance.de)
+Braden Anderson (http://google.com/profiles/bluej100)

+ 51 - 0
node_modules/grunt-contrib-cssmin/CHANGELOG

@@ -0,0 +1,51 @@
+v0.6.1:
+  date: 2013-05-25
+  changes:
+    - Support import in-lining vis clean-css ~1.0.4.
+v0.6.0:
+  date: 2013-04-05
+  changes:
+    - Update clean-css dependency to ~1.0.0
+v0.5.0:
+  date: 2013-03-14
+  changes:
+   - Support for 'report' option (false by default)
+v0.4.2:
+  date: 2013-03-10
+  changes:
+    - Add banner option
+    - Support clean-css keepSpecialComments
+v0.4.1:
+  date: 2013-02-17
+  changes:
+    - Update clean-css dependency to ~0.10.0
+v0.4.0:
+  date: 2013-02-15
+  changes:
+    - First official release for Grunt 0.4.0.
+v0.4.0rc7:
+  date: 2013-01-23
+  changes:
+    - Updating grunt/gruntplugin dependencies to rc7.
+    - Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions.
+v0.4.0rc5:
+  date: 2013-01-09
+  changes:
+    - Updating to work with grunt v0.4.0rc5.
+    - Switching to this.files api.
+v0.3.2:
+  date: 2012-11-01
+  changes:
+    - Update clean-css dep.
+v0.3.1:
+  date: 2012-10-12
+  changes:
+    - Rename grunt-contrib-lib dep to grunt-lib-contrib.
+v0.3.0:
+  date: 2012-09-23
+  changes:
+    - Options no longer accepted from global config key.
+v0.2.0:
+  date: 2012-09-10
+  changes:
+    - Refactored from grunt-contrib into individual repo.

+ 1 - 0
node_modules/grunt-contrib-cssmin/CONTRIBUTING.md

@@ -0,0 +1 @@
+Please see the [Contributing to grunt](http://gruntjs.com/contributing) guide for information on contributing to this project.

+ 88 - 0
node_modules/grunt-contrib-cssmin/Gruntfile.js

@@ -0,0 +1,88 @@
+/*
+ * grunt-contrib-cssmin
+ * http://gruntjs.com/
+ *
+ * Copyright (c) 2012 Tim Branyen, contributors
+ * Licensed under the MIT license.
+ */
+
+'use strict';
+
+module.exports = function(grunt) {
+
+  // Project configuration.
+  grunt.initConfig({
+    jshint: {
+      all: [
+        'Gruntfile.js',
+        'tasks/*.js',
+        '<%= nodeunit.tests %>'
+      ],
+      options: {
+        jshintrc: '.jshintrc'
+      }
+    },
+    // Before generating any new files, remove any previously-created files.
+    clean: {
+      test: ['tmp']
+    },
+
+    // Configuration to be run (and then tested).
+    cssmin: {
+      compress: {
+        files: {
+          'tmp/style.css': ['test/fixtures/input_one.css', 'test/fixtures/input_two.css']
+        }
+      },
+      empty: {
+        files: {
+          'tmp/idontexist.css': ['test/fixtures/idontexist.css']
+        }
+      },
+      with_banner: {
+        options: {
+          banner: '/* module name - my awesome css banner */'
+        },
+        files: {
+          'tmp/with-banner.css': ['test/fixtures/input_one.css', 'test/fixtures/input_two.css']
+        }
+      },
+      remove_first_comment: {
+        options: {
+          banner: '/* custom banner */',
+          keepSpecialComments: 0
+        },
+        files: {
+          'tmp/remove_first_comment.css': ['test/fixtures/input_bannered.css']
+        }
+      },
+      inline_import: {
+        files: {
+          'tmp/inline_import.css': ['test/fixtures/input_inline_import.css', 'test/fixtures/inner/input_inline_import.css']
+        }
+      }
+    },
+
+    // Unit tests.
+    nodeunit: {
+      tests: ['test/*_test.js']
+    }
+  });
+
+  // Actually load this plugin's task(s).
+  grunt.loadTasks('tasks');
+
+  // These plugins provide necessary tasks.
+  grunt.loadNpmTasks('grunt-contrib-clean');
+  grunt.loadNpmTasks('grunt-contrib-jshint');
+  grunt.loadNpmTasks('grunt-contrib-nodeunit');
+  grunt.loadNpmTasks('grunt-contrib-internal');
+
+  // Whenever the "test" task is run, first clean the "tmp" dir, then run this
+  // plugin's task(s), then test the result.
+  grunt.registerTask('test', ['clean', 'cssmin', 'nodeunit']);
+
+  // By default, lint and run all tests.
+  grunt.registerTask('default', ['jshint', 'test', 'build-contrib']);
+
+};

+ 22 - 0
node_modules/grunt-contrib-cssmin/LICENSE-MIT

@@ -0,0 +1,22 @@
+Copyright (c) 2012 Tim Branyen, contributors
+
+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.

+ 123 - 0
node_modules/grunt-contrib-cssmin/README.md

@@ -0,0 +1,123 @@
+# grunt-contrib-cssmin [![Build Status](https://secure.travis-ci.org/gruntjs/grunt-contrib-cssmin.png?branch=master)](http://travis-ci.org/gruntjs/grunt-contrib-cssmin)
+
+> Compress CSS files.
+
+
+
+## Getting Started
+This plugin requires Grunt `~0.4.0`
+
+If you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:
+
+```shell
+npm install grunt-contrib-cssmin --save-dev
+```
+
+Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:
+
+```js
+grunt.loadNpmTasks('grunt-contrib-cssmin');
+```
+
+*This plugin was designed to work with Grunt 0.4.x. If you're still using grunt v0.3.x it's strongly recommended that [you upgrade](http://gruntjs.com/upgrading-from-0.3-to-0.4), but in case you can't please use [v0.3.2](https://github.com/gruntjs/grunt-contrib-cssmin/tree/grunt-0.3-stable).*
+
+
+
+## Cssmin task
+_Run this task with the `grunt cssmin` command._
+
+Task targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide.
+
+Files are compressed with [clean-css](https://github.com/GoalSmashers/clean-css).
+### Options
+
+#### banner
+
+Type: `String`
+Default: `null`
+
+Prefix the compressed source with the given banner, with a linebreak inbetween.
+
+#### keepSpecialComments
+
+Type: `String` `Number`
+Default: `'*'`
+
+To keep or remove special comments, exposing the underlying option from [clean-css](https://github.com/GoalSmashers/clean-css).. `'*'` for keeping all (default), `1` for keeping first one, `0` for removing all.
+
+#### report
+Choices: `false`, `'min'`, `'gzip'`
+Default: `false`
+
+Either do not report anything, report only minification result, or report minification and gzip results.
+This is useful to see exactly how well clean-css is performing but using `'gzip'` will make the task take 5-10x longer to complete.
+
+Example ouput using `'gzip'`:
+
+```
+Original: 198444 bytes.
+Minified: 101615 bytes.
+Gzipped:  20084 bytes.
+```
+### Usage Examples
+
+#### Combine two files into one output file
+
+```js
+cssmin: {
+  combine: {
+    files: {
+      'path/to/output.css': ['path/to/input_one.css', 'path/to/input_two.css']
+    }
+  }
+}
+```
+
+#### Add a banner
+```js
+cssmin: {
+  add_banner: {
+    options: {
+      banner: '/* My minified css file */'
+    },
+    files: {
+      'path/to/output.css': ['path/to/**/*.css']
+    }
+  }
+}
+```
+
+#### Minify all contents of a release directory and add a `.min.css` extension
+```js
+cssmin: {
+  minify: {
+    expand: true,
+    cwd: 'release/css/',
+    src: ['*.css', '!*.min.css'],
+    dest: 'release/css/',
+    ext: '.min.css'
+  }
+}
+```
+
+
+## Release History
+
+ * 2013-05-25   v0.6.1   Support import in-lining vis clean-css ~1.0.4.
+ * 2013-04-05   v0.6.0   Update clean-css dependency to ~1.0.0
+ * 2013-03-14   v0.5.0   Support for 'report' option (false by default)
+ * 2013-03-10   v0.4.2   Add banner option Support clean-css keepSpecialComments
+ * 2013-02-17   v0.4.1   Update clean-css dependency to ~0.10.0
+ * 2013-02-15   v0.4.0   First official release for Grunt 0.4.0.
+ * 2013-01-23   v0.4.0rc7   Updating grunt/gruntplugin dependencies to rc7. Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions.
+ * 2013-01-09   v0.4.0rc5   Updating to work with grunt v0.4.0rc5. Switching to this.files api.
+ * 2012-11-01   v0.3.2   Update clean-css dep.
+ * 2012-10-12   v0.3.1   Rename grunt-contrib-lib dep to grunt-lib-contrib.
+ * 2012-09-23   v0.3.0   Options no longer accepted from global config key.
+ * 2012-09-10   v0.2.0   Refactored from grunt-contrib into individual repo.
+
+---
+
+Task submitted by [Tim Branyen](http://goingslowly.com/)
+
+*This file was generated on Sat May 25 2013 18:52:13.*

+ 40 - 0
node_modules/grunt-contrib-cssmin/docs/cssmin-examples.md

@@ -0,0 +1,40 @@
+# Usage Examples
+
+## Combine two files into one output file
+
+```js
+cssmin: {
+  combine: {
+    files: {
+      'path/to/output.css': ['path/to/input_one.css', 'path/to/input_two.css']
+    }
+  }
+}
+```
+
+## Add a banner
+```js
+cssmin: {
+  add_banner: {
+    options: {
+      banner: '/* My minified css file */'
+    },
+    files: {
+      'path/to/output.css': ['path/to/**/*.css']
+    }
+  }
+}
+```
+
+## Minify all contents of a release directory and add a `.min.css` extension
+```js
+cssmin: {
+  minify: {
+    expand: true,
+    cwd: 'release/css/',
+    src: ['*.css', '!*.min.css'],
+    dest: 'release/css/',
+    ext: '.min.css'
+  }
+}
+```

+ 30 - 0
node_modules/grunt-contrib-cssmin/docs/cssmin-options.md

@@ -0,0 +1,30 @@
+# Options
+
+## banner
+
+Type: `String`
+Default: `null`
+
+Prefix the compressed source with the given banner, with a linebreak inbetween.
+
+## keepSpecialComments
+
+Type: `String` `Number`
+Default: `'*'`
+
+To keep or remove special comments, exposing the underlying option from [clean-css](https://github.com/GoalSmashers/clean-css).. `'*'` for keeping all (default), `1` for keeping first one, `0` for removing all.
+
+## report
+Choices: `false`, `'min'`, `'gzip'`
+Default: `false`
+
+Either do not report anything, report only minification result, or report minification and gzip results.
+This is useful to see exactly how well clean-css is performing but using `'gzip'` will make the task take 5-10x longer to complete.
+
+Example ouput using `'gzip'`:
+
+```
+Original: 198444 bytes.
+Minified: 101615 bytes.
+Gzipped:  20084 bytes.
+```

+ 3 - 0
node_modules/grunt-contrib-cssmin/docs/cssmin-overview.md

@@ -0,0 +1,3 @@
+Task targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide.
+
+Files are compressed with [clean-css](https://github.com/GoalSmashers/clean-css).

+ 1 - 0
node_modules/grunt-contrib-cssmin/docs/overview.md

@@ -0,0 +1 @@
+*This plugin was designed to work with Grunt 0.4.x. If you're still using grunt v0.3.x it's strongly recommended that [you upgrade](http://gruntjs.com/upgrading-from-0.3-to-0.4), but in case you can't please use [v0.3.2](https://github.com/gruntjs/grunt-contrib-cssmin/tree/grunt-0.3-stable).*

+ 1 - 0
node_modules/grunt-contrib-cssmin/node_modules/.bin/cleancss

@@ -0,0 +1 @@
+../clean-css/bin/cleancss

+ 5 - 0
node_modules/grunt-contrib-cssmin/node_modules/clean-css/.npmignore

@@ -0,0 +1,5 @@
+.jshintignore
+.jshintrc
+.travis.yml
+bench
+test

+ 262 - 0
node_modules/grunt-contrib-cssmin/node_modules/clean-css/History.md

@@ -0,0 +1,262 @@
+1.0.12 / 2013-07-19
+==================
+
+* Fixed issue [#121](https://github.com/GoalSmashers/clean-css/issues/121) - ability to skip `@import` processing.
+
+1.0.11 / 2013-07-08
+==================
+
+* Fixed issue [#117](https://github.com/GoalSmashers/clean-css/issues/117) - line break escaping in comments.
+
+1.0.10 / 2013-06-13
+==================
+
+* Fixed issue [#114](https://github.com/GoalSmashers/clean-css/issues/114) - comments in imported stylesheets.
+
+1.0.9 / 2013-06-11
+==================
+
+* Fixed issue [#113](https://github.com/GoalSmashers/clean-css/issues/113) - `@import` in comments.
+
+1.0.8 / 2013-06-10
+==================
+
+* Fixed issue [#112](https://github.com/GoalSmashers/clean-css/issues/112) - reducing `box-shadow` zeros.
+
+1.0.7 / 2013-06-05
+==================
+
+* Support for `@import` URLs starting with `//`.
+  By [@petetak](https://github.com/petetak).
+
+1.0.6 / 2013-06-04
+==================
+
+* Fixed issue [#110](https://github.com/GoalSmashers/clean-css/issues/110) - data URIs in URLs.
+
+1.0.5 / 2013-05-26
+==================
+
+* Fixed issue [#107](https://github.com/GoalSmashers/clean-css/issues/107) - data URIs in imported stylesheets.
+
+1.0.4 / 2013-05-23
+==================
+
+* Rewrite relative URLs in imported stylesheets.
+  By [@bluej100](https://github.com/bluej100).
+
+1.0.3 / 2013-05-20
+==================
+
+* Support alternative `@import` syntax with file name not wrapped inside `url()` statement.
+  By [@bluej100](https://github.com/bluej100).
+
+1.0.2 / 2013-04-29
+==================
+
+* Fixed issue [#97](https://github.com/GoalSmashers/clean-css/issues/97) - `--remove-empty` & FontAwesome.
+
+1.0.1 / 2013-04-08
+==================
+
+* Do not pick up `bench` and `test` while building `npm` package.
+  By [@sindresorhus](https://https://github.com/sindresorhus).
+
+1.0.0 / 2013-03-30
+==================
+
+* Fixed issue [#2](https://github.com/GoalSmashers/clean-css/issues/2) - resolving `@import` rules.
+* Fixed issue [#44](https://github.com/GoalSmashers/clean-css/issues/44) - examples in `--help`.
+* Fixed issue [#46](https://github.com/GoalSmashers/clean-css/issues/46) - preserving special characters in URLs and attributes.
+* Fixed issue [#80](https://github.com/GoalSmashers/clean-css/issues/80) - quotation in multi line strings.
+* Fixed issue [#83](https://github.com/GoalSmashers/clean-css/issues/83) - HSL to hex color conversions.
+* Fixed issue [#86](https://github.com/GoalSmashers/clean-css/issues/86) - broken `@charset` replacing.
+* Fixed issue [#88](https://github.com/GoalSmashers/clean-css/issues/88) - removes space in `! important`.
+* Fixed issue [#92](https://github.com/GoalSmashers/clean-css/issues/92) - uppercase hex to short versions.
+
+0.10.2 / 2013-03-19
+===================
+
+* Fixed issue [#79](https://github.com/GoalSmashers/clean-css/issues/79) - node.js 0.10.x compatibility.
+
+0.10.1 / 2013-02-14
+===================
+
+* Fixed issue [#66](https://github.com/GoalSmashers/clean-css/issues/66) - line breaks without extra spaces should
+  be handled correctly.
+
+0.10.0 / 2013-02-09
+===================
+
+* Switched from [optimist](https://github.com/substack/node-optimist) to
+  [commander](https://github.com/visionmedia/commander.js) for CLI processing.
+* Changed long options from `--removeempty` to `--remove-empty` and from `--keeplinebreaks` to `--keep-line-breaks`.
+* Fixed issue [#47](https://github.com/GoalSmashers/clean-css/issues/47) - commandline issues on Windows.
+* Fixed issue [#49](https://github.com/GoalSmashers/clean-css/issues/49) - remove empty selectors from media query.
+* Fixed issue [#52](https://github.com/GoalSmashers/clean-css/issues/52) - strip fraction zeros if not needed.
+* Fixed issue [#58](https://github.com/GoalSmashers/clean-css/issues/58) - remove colon where possible.
+* Fixed issue [#59](https://github.com/GoalSmashers/clean-css/issues/59) - content property handling.
+* Fixed performance issue with replacing multiple `@charset` declarations and issue
+  with line break after `@charset` when using `keepLineBreaks` option. By [@rrjaime](https://github.com/rrjamie).
+* Removed Makefile in favor to `npm run` commands (e.g. `make check` -> `npm run check`).
+
+0.9.1 / 2012-12-19
+==================
+
+* Fixed issue [#37](https://github.com/GoalSmashers/clean-css/issues/37) - converting
+  `white` and other colors in class names (reported by [@malgorithms](https://github.com/malgorithms)).
+
+0.9.0 / 2012-12-15
+==================
+
+* Added stripping quotation from font names (if possible).
+* Added stripping quotation from `@keyframes` declaration, `animation` and
+  `animation-name` property.
+* Added stripping quotations from attributes' value (e.g. `[data-target='x']`).
+* Added better hex->name and name->hex color shortening.
+* Added `font: normal` and `font: bold` shortening the same way as `font-weight` is.
+* Refactored shorthand selectors and added `border-radius`, `border-style`
+  and `border-color` shortening.
+* Added `margin`, `padding` and `border-width` shortening.
+* Added removing line break after commas.
+* Fixed removing whitespace inside media query definition.
+* Added removing line breaks after a comma, so all declarations are one-liners now.
+* Speed optimizations (~10% despite many new features).
+* Added [JSHint](https://github.com/jshint/jshint/) validation rules via `make check`.
+
+0.8.3 / 2012-11-29
+==================
+
+* Fixed HSL/HSLA colors processing.
+
+0.8.2 / 2012-10-31
+==================
+
+* Fixed shortening hex colors and their relation to hashes in URLs.
+* Cleanup by [@XhmikosR](https://github.com/XhmikosR).
+
+0.8.1 / 2012-10-28
+==================
+
+* Added better zeros processing for `rect(...)` syntax (clip property).
+
+0.8.0 / 2012-10-21
+==================
+
+* Added removing URLs quotation if possible.
+* Rewrote breaks processing.
+* Added `keepBreaks`/`-b` option to keep line breaks in the minimized file.
+* Reformatted [lib/clean.js](/lib/clean.js) so it's easier to follow the rules.
+* Minimized test data is now minimized with line breaks so it's easier to
+  compare the changes line by line.
+
+0.7.0 / 2012-10-14
+==================
+
+* Added stripping special comments to CLI (`--s0` and `--s1` options).
+* Added stripping special comments to programmatic interface
+  (`keepSpecialComments` option).
+
+0.6.0 / 2012-08-05
+==================
+
+* Full Windows support with tests (./test.bat).
+
+0.5.0 / 2012-08-02
+==================
+
+* Made path to vows local.
+* Explicit node.js 0.6 requirement.
+
+0.4.2 / 2012-06-28
+==================
+
+* Updated binary `-v` option (version).
+* Updated binary to output help when no options given (but not in piped mode).
+* Added binary tests.
+
+0.4.1 / 2012-06-10
+==================
+
+* Fixed stateless mode where calling `CleanCSS#process` directly was giving
+  errors (reported by [@facelessuser](https://github.com/facelessuser)).
+
+0.4.0 / 2012-06-04
+==================
+
+* Speed improvements up to 4x thanks to the rewrite of comments and CSS' content
+  processing.
+* Stripping empty CSS tags is now optional (see [bin/cleancss](/bin/cleancss) for details).
+* Improved debugging mode (see [test/bench.js](/test/bench.js))
+* Added `make bench` for a one-pass benchmark.
+
+0.3.3 / 2012-05-27
+==================
+
+* Fixed tests, [package.json](/package.json) for development, and regex
+  for removing empty declarations (thanks to [@vvo](https://github.com/vvo)).
+
+0.3.2 / 2012-01-17
+==================
+
+* Fixed output method under node.js 0.6 which incorrectly tried to close
+  `process.stdout`.
+
+0.3.1 / 2011-12-16
+==================
+
+* Fixed cleaning up `0 0 0 0` expressions.
+
+0.3.0 / 2011-11-29
+==================
+
+* Clean-css requires node.js 0.4.0+ to run.
+* Removed node.js's 0.2.x 'sys' package dependency
+  (thanks to [@jmalonzo](https://github.com/jmalonzo) for a patch).
+
+0.2.6 / 2011-11-27
+==================
+
+* Fixed expanding `+` signs in `calc()` when mixed up with adjacent `+` selector.
+
+0.2.5 / 2011-11-27
+==================
+
+* Fixed issue with cleaning up spaces inside `calc`/`-moz-calc` declarations
+  (thanks to [@cvan](https://github.com/cvan) for reporting it).
+* Fixed converting `#f00` to `red` in borders and gradients.
+
+0.2.4 / 2011-05-25
+==================
+
+* Fixed problem with expanding `none` to `0` in partial/full background
+  declarations.
+* Fixed including clean-css library from binary (global to local).
+
+0.2.3 / 2011-04-18
+==================
+
+* Fixed problem with optimizing IE filters.
+
+0.2.2 / 2011-04-17
+==================
+
+* Fixed problem with space before color in `border` property.
+
+0.2.1 / 2011-03-19
+==================
+
+* Added stripping space before `!important` keyword.
+* Updated repository location and author information in [package.json](/package.json).
+
+0.2.0 / 2011-03-02
+==================
+
+* Added options parsing via optimist.
+* Changed code inclusion (thus the version bump).
+
+0.1.0 / 2011-02-27
+==================
+
+* First version of clean-css library.
+* Implemented all basic CSS transformations.

+ 19 - 0
node_modules/grunt-contrib-cssmin/node_modules/clean-css/LICENSE

@@ -0,0 +1,19 @@
+Copyright (C) 2011-2013 GoalSmashers.com
+
+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.

+ 131 - 0
node_modules/grunt-contrib-cssmin/node_modules/clean-css/README.md

@@ -0,0 +1,131 @@
+[![NPM version](https://badge.fury.io/js/clean-css.png)](http://badge.fury.io/js/clean-css)
+[![Build Status](https://secure.travis-ci.org/GoalSmashers/clean-css.png)](http://travis-ci.org/GoalSmashers/clean-css)
+[![Dependency Status](https://gemnasium.com/GoalSmashers/clean-css.png)](https://gemnasium.com/GoalSmashers/clean-css)
+
+## What is clean-css?
+
+Clean-css is a [node.js](http://nodejs.org/) library for minifying CSS files.
+It does the same job as YUI Compressor's CSS minifier, but much faster thanks
+to many speed optimizations and node.js' V8 engine.
+
+
+## Usage
+
+### What are the requirements?
+
+```
+node.js 0.6.0+ on UN*X (fully tested on OS X 10.6+ and CentOS)
+node.js 0.8.0+ on Windows
+```
+
+### How to install clean-css?
+
+```
+npm install clean-css
+```
+
+### How to use clean-css CLI?
+
+Clean-css accepts the following command line arguments (please make sure
+you use `<source-file>` as the very last argument to avoid potential issues):
+
+```
+cleancss [options] <source-file>
+
+-h, --help                  Output usage information
+-v, --version               Output the version number
+-e, --remove-empty          Remove empty declarations (e.g. a{})
+-b, --keep-line-breaks      Keep line breaks
+--s0                        Remove all special comments (i.e. /*! special comment */)
+--s1                        Remove all special comments but the first one
+-r, --root [root-path]      Set a root path to which resolve absolute @import rules
+-o, --output [output-file]  Use [output-file] as output instead of STDOUT
+```
+
+#### Examples:
+
+To minify a **public.css** file into **public-min.css** do:
+
+```
+cleancss -o public-min.css public.css
+```
+
+To minify the same **public.css** into the standard output skip the `-o` parameter:
+
+```
+cleancss public.css
+```
+
+More likely you would like to concatenate a couple of files.
+If you are on a Unix-like system:
+
+```bash
+cat one.css two.css three.css | cleancss -o merged-and-minified.css
+```
+
+On Windows:
+
+```bat
+type one.css two.css three.css | cleancss -o merged-and-minified.css
+```
+
+Or even gzip the result at once:
+
+```bash
+cat one.css two.css three.css | cleancss | gzip -9 -c > merged-minified-and-gzipped.css.gz
+```
+
+### How to use clean-css programmatically?
+
+```js
+var cleanCSS = require('clean-css');
+var source = "a{font-weight:bold;}";
+var minimized = cleanCSS.process(source);
+```
+
+Process method accepts a hash as a second parameter, i.e.,
+`cleanCSS.process(source, options)` with the following options available:
+
+* `keepSpecialComments` - `*` for keeping all (default), `1` for keeping first one, `0` for removing all
+* `keepBreaks` - whether to keep line breaks (default is false)
+* `removeEmpty` - whether to remove empty elements (default is false)
+* `debug` - turns on debug mode measuring time spent on cleaning up
+  (run `npm run bench` to see example)
+* `root` - path with which to resolve absolute `@import` rules
+* `relativeTo` - path with which to resolve relative `@import` rules
+
+### What are the clean-css' dev commands?
+
+First clone the source, then run:
+
+* `npm run bench` for clean-css benchmarks (see [test/bench.js](/test/bench.js) for details)
+* `npm run check` to check JS sources with [JSHint](https://github.com/jshint/jshint/)
+* `npm test` for the test suite
+
+### How do you preserve a comment block?
+
+Use the `/*!` notation instead of the standard one `/*`:
+
+```css
+/*!
+  Important comments included in minified output.
+*/
+```
+
+
+## Acknowledgments
+
+* Vincent Voyer ([@vvo](https://github.com/vvo)) for a patch with better
+  empty element regex and for inspiring us to do many performance improvements
+  in 0.4 release.
+* Isaac ([@facelessuser](https://github.com/facelessuser)) for pointing out
+  a flaw in clean-css' stateless mode.
+* Jan Michael Alonzo ([@jmalonzo](https://github.com/jmalonzo)) for a patch
+  removing node.js's old 'sys' package.
+* [@XhmikosR](https://github.com/XhmikosR) for suggesting new features
+  (option to remove special comments and strip out URLs quotation) and pointing
+  out numerous improvements (JSHint, media queries).
+
+## License
+
+Clean-css is released under the [MIT License](/LICENSE).

+ 101 - 0
node_modules/grunt-contrib-cssmin/node_modules/clean-css/bin/cleancss

@@ -0,0 +1,101 @@
+#!/usr/bin/env node
+
+var util = require('util');
+var fs = require('fs');
+var path = require('path');
+var CleanCSS = require('../index');
+
+var commands = require('commander');
+
+var packageConfig = fs.readFileSync(path.join(path.dirname(fs.realpathSync(process.argv[1])), '../package.json'));
+var buildVersion = JSON.parse(packageConfig).version;
+
+var isWindows = process.platform == 'win32';
+
+// Specify commander options to parse command line params correctly
+commands
+  .version(buildVersion, '-v, --version')
+  .usage('[options] <source-file>')
+  .option('-e, --remove-empty', 'Remove empty declarations (e.g. a{})')
+  .option('-b, --keep-line-breaks', 'Keep line breaks')
+  .option('--s0', 'Remove all special comments (i.e. /*! special comment */)')
+  .option('--s1', 'Remove all special comments but the first one')
+  .option('-r, --root [root-path]', 'Set a root path to which resolve absolute @import rules')
+  .option('-o, --output [output-file]', 'Use [output-file] as output instead of stdout')
+  .option('-s, --skip-import', 'Disable the @import processing');
+
+commands.on('--help', function() {
+  util.puts('  Examples:\n');
+  util.puts('    %> cleancss one.css');
+  util.puts('    %> cleancss -o one-min.css one.css');
+  if (isWindows) {
+    util.puts('    %> type one.css two.css three.css | cleancss -o merged-and-minified.css');
+  } else {
+    util.puts('    %> cat one.css two.css three.css | cleancss -o merged-and-minified.css');
+    util.puts('    %> cat one.css two.css three.css | cleancss | gzip -9 -c > merged-minified-and-gzipped.css.gz');
+  }
+  util.puts('');
+  process.exit();
+});
+
+commands.parse(process.argv);
+
+var options = {
+  source: null,
+  target: null
+};
+var cleanOptions = {};
+var fromStdin = !process.env['__DIRECT__'] && !process.stdin.isTTY;
+
+// If no sensible data passed in just print help and exit
+if (!fromStdin && commands.args.length == 0) {
+  commands.outputHelp();
+  return 0;
+}
+
+// Now coerce commands into CleanCSS configuration...
+if (commands.output)
+  options.target = commands.output;
+if (commands.removeEmpty)
+  cleanOptions.removeEmpty = true;
+if (commands.keepLineBreaks)
+  cleanOptions.keepBreaks = true;
+if (commands.s1)
+  cleanOptions.keepSpecialComments = 1;
+if (commands.s0)
+  cleanOptions.keepSpecialComments = 0;
+if (commands.root)
+  cleanOptions.root = commands.root;
+if (commands.skipImport)
+  cleanOptions.processImport = false;
+if (commands.args.length > 0) {
+  var source = commands.args[0];
+  options.source = source;
+  cleanOptions.relativeTo = path.dirname(path.resolve(source));
+}
+
+// ... and do the magic!
+if (options.source) {
+  fs.readFile(options.source, 'utf8', function(error, text) {
+    if (error)
+      throw error;
+    output(CleanCSS.process(text, cleanOptions));
+  });
+} else {
+  var stdin = process.openStdin();
+  stdin.setEncoding('utf-8');
+  var text = '';
+  stdin.on('data', function(chunk) {
+    text += chunk;
+  });
+  stdin.on('end', function() {
+    output(CleanCSS.process(text, cleanOptions));
+  });
+}
+
+function output(cleaned) {
+  if (options.target)
+    fs.writeFileSync(options.target, cleaned, 'utf8');
+  else
+    process.stdout.write(cleaned);
+};

+ 1 - 0
node_modules/grunt-contrib-cssmin/node_modules/clean-css/index.js

@@ -0,0 +1 @@
+module.exports = require('./lib/clean');

+ 601 - 0
node_modules/grunt-contrib-cssmin/node_modules/clean-css/lib/clean.js

@@ -0,0 +1,601 @@
+/**
+ * Clean-css - https://github.com/GoalSmashers/clean-css
+ * Released under the terms of MIT license
+ *
+ * Copyright (C) 2011-2013 GoalSmashers.com
+ */
+
+var fs = require('fs');
+var path = require('path');
+var existsSync = fs.existsSync || path.existsSync;
+
+var CleanCSS = {
+  colors: {
+    toHex: {
+      aqua: '#0ff',
+      black: '#000',
+      blue: '#00f',
+      fuchsia: '#f0f',
+      white: '#fff',
+      yellow: '#ff0'
+    },
+    toName: {
+      '#000080': 'navy',
+      '#008000': 'green',
+      '#008080': 'teal',
+      '#800000': 'maroon',
+      '#800080': 'purple',
+      '#808000': 'olive',
+      '#808080': 'gray',
+      '#c0c0c0': 'silver',
+      '#f00': 'red'
+    }
+  },
+
+  process: function(data, options) {
+    var context = {
+      specialComments: [],
+      freeTextBlocks: [],
+      urlBlocks: []
+    };
+    var replace = function() {
+      if (typeof arguments[0] == 'function')
+        arguments[0]();
+      else
+        data = data.replace.apply(data, arguments);
+    };
+    var lineBreak = process.platform == 'win32' ? '\r\n' : '\n';
+    this.lineBreak = lineBreak;
+
+    options = options || {};
+
+    // * - leave all important comments
+    // 1 - leave first important comment only
+    // 0 - strip all important comments
+    options.keepSpecialComments = 'keepSpecialComments' in options ?
+      options.keepSpecialComments :
+      '*';
+
+    options.keepBreaks = options.keepBreaks || false;
+
+    //active by default
+    if (options.processImport === undefined) {
+      options.processImport = true;
+    }
+
+    // replace function
+    if (options.debug) {
+      var originalReplace = replace;
+      replace = function(pattern, replacement) {
+        var name = typeof pattern == 'function' ?
+          /function (\w+)\(/.exec(pattern.toString())[1] :
+          pattern;
+
+        var start = process.hrtime();
+        originalReplace(pattern, replacement);
+
+        var itTook = process.hrtime(start);
+        console.log('%d ms: ' + name, 1000 * itTook[0] + itTook[1] / 1000000.0);
+      };
+    }
+
+    var removeComments = function() {
+      replace(function stripComments() {
+        data = CleanCSS._stripComments(context, data);
+      });
+    };
+
+    removeComments();
+
+    // replace all escaped line breaks
+    replace(/\\(\r\n|\n)/mg, '');
+
+    if (options.processImport) {
+      // inline all imports
+      replace(function inlineImports() {
+        data = CleanCSS._inlineImports(data, {
+          root: options.root || process.cwd(),
+          relativeTo: options.relativeTo
+        });
+      });
+
+      // strip comments with inlined imports
+      if (data.indexOf('/*') > -1) {
+        removeComments();
+      }
+    }
+
+    // strip parentheses in urls if possible (no spaces inside)
+    replace(/url\((['"])([^\)]+)['"]\)/g, function(match, quote, url) {
+      if (url.match(/[ \t]/g) !== null || url.indexOf('data:') === 0)
+        return 'url(' + quote + url + quote + ')';
+      else
+        return 'url(' + url + ')';
+    });
+
+    // strip parentheses in animation & font names
+    replace(/(animation|animation\-name|font|font\-family):([^;}]+)/g, function(match, propertyName, fontDef) {
+      return propertyName + ':' + fontDef.replace(/['"]([\w\-]+)['"]/g, '$1');
+    });
+
+    // strip parentheses in @keyframes
+    replace(/@(\-moz\-|\-o\-|\-webkit\-)?keyframes ([^{]+)/g, function(match, prefix, name) {
+      prefix = prefix || '';
+      return '@' + prefix + 'keyframes ' + (name.indexOf(' ') > -1 ? name : name.replace(/['"]/g, ''));
+    });
+
+    // IE shorter filters, but only if single (IE 7 issue)
+    replace(/progid:DXImageTransform\.Microsoft\.(Alpha|Chroma)(\([^\)]+\))([;}'"])/g, function(match, filter, args, suffix) {
+      return filter.toLowerCase() + args + suffix;
+    });
+
+    // strip parentheses in attribute values
+    replace(/\[([^\]]+)\]/g, function(match, content) {
+      var eqIndex = content.indexOf('=');
+      if (eqIndex < 0 && content.indexOf('\'') < 0 && content.indexOf('"') < 0)
+        return match;
+
+      var key = content.substring(0, eqIndex);
+      var value = content.substring(eqIndex + 1, content.length);
+
+      if (/^['"](?:[a-zA-Z][a-zA-Z\d\-_]+)['"]$/.test(value))
+        return '[' + key + '=' + value.substring(1, value.length - 1) + ']';
+      else
+        return match;
+    });
+
+    // replace all free text content with a placeholder
+    replace(function stripFreeText() {
+      data = CleanCSS._stripFreeText(context, data);
+    });
+
+    // replace url(...) with a placeholder
+    replace(function stripUrls() {
+      data = CleanCSS._stripUrls(context, data);
+    });
+
+    // line breaks
+    if (!options.keepBreaks)
+      replace(/[\r]?\n/g, ' ');
+
+    // multiple whitespace
+    replace(/[\t ]+/g, ' ');
+
+    // multiple semicolons (with optional whitespace)
+    replace(/;[ ]?;+/g, ';');
+
+    // multiple line breaks to one
+    replace(/ (?:\r\n|\n)/g, lineBreak);
+    replace(/(?:\r\n|\n)+/g, lineBreak);
+
+    // remove spaces around selectors
+    replace(/ ([+~>]) /g, '$1');
+
+    // remove extra spaces inside content
+    replace(/([!\(\{\}:;=,\n]) /g, '$1');
+    replace(/ ([!\)\{\};=,\n])/g, '$1');
+    replace(/(?:\r\n|\n)\}/g, '}');
+    replace(/([\{;,])(?:\r\n|\n)/g, '$1');
+    replace(/ :([^\{\};]+)([;}])/g, ':$1$2');
+
+    // restore spaces inside IE filters (IE 7 issue)
+    replace(/progid:[^(]+\(([^\)]+)/g, function(match) {
+      return match.replace(/,/g, ', ');
+    });
+
+    // trailing semicolons
+    replace(/;\}/g, '}');
+
+    // hsl to hex colors
+    replace(/hsl\((\d+),(\d+)%?,(\d+)%?\)/g, function(match, hue, saturation, lightness) {
+      var asRgb = CleanCSS._hslToRgb(hue, saturation, lightness);
+      var redAsHex = asRgb[0].toString(16);
+      var greenAsHex = asRgb[1].toString(16);
+      var blueAsHex = asRgb[2].toString(16);
+
+      return '#' +
+        ((redAsHex.length == 1 ? '0' : '') + redAsHex) +
+        ((greenAsHex.length == 1 ? '0' : '') + greenAsHex) +
+        ((blueAsHex.length == 1 ? '0' : '') + blueAsHex);
+    });
+
+    // rgb to hex colors
+    replace(/rgb\((\d+),(\d+),(\d+)\)/g, function(match, red, green, blue) {
+      var redAsHex = parseInt(red, 10).toString(16);
+      var greenAsHex = parseInt(green, 10).toString(16);
+      var blueAsHex = parseInt(blue, 10).toString(16);
+
+      return '#' +
+        ((redAsHex.length == 1 ? '0' : '') + redAsHex) +
+        ((greenAsHex.length == 1 ? '0' : '') + greenAsHex) +
+        ((blueAsHex.length == 1 ? '0' : '') + blueAsHex);
+    });
+
+    // long hex to short hex colors
+    replace(/([,: \(])#([0-9a-f]{6})/gi, function(match, prefix, color) {
+      if (color[0] == color[1] && color[2] == color[3] && color[4] == color[5])
+        return prefix + '#' + color[0] + color[2] + color[4];
+      else
+        return prefix + '#' + color;
+    });
+
+    // replace color name with hex values if shorter (or the other way around)
+    ['toHex', 'toName'].forEach(function(type) {
+      var pattern = '(' + Object.keys(CleanCSS.colors[type]).join('|') + ')';
+      var colorSwitcher = function(match, prefix, colorValue, suffix) {
+        return prefix + CleanCSS.colors[type][colorValue.toLowerCase()] + suffix;
+      };
+      replace(new RegExp('([ :,\\(])' + pattern + '([;\\}!\\) ])', 'ig'), colorSwitcher);
+      replace(new RegExp('(,)' + pattern + '(,)', 'ig'), colorSwitcher);
+    });
+
+    // replace font weight with numerical value
+    replace(/(font|font\-weight):(normal|bold)([ ;\}!])/g, function(match, property, weight, suffix) {
+      if (weight == 'normal')
+        return property + ':400' + suffix;
+      else if (weight == 'bold')
+        return property + ':700' + suffix;
+      else
+        return match;
+    });
+
+    // zero + unit to zero
+    replace(/(\s|:|,)0(?:px|em|ex|cm|mm|in|pt|pc|%)/g, '$1' + '0');
+    replace(/rect\(0(?:px|em|ex|cm|mm|in|pt|pc|%)/g, 'rect(0');
+
+    // fraction zeros removal
+    replace(/\.([1-9]*)0+(\D)/g, function(match, nonZeroPart, suffix) {
+      return (nonZeroPart ? '.' : '') + nonZeroPart + suffix;
+    });
+
+    // restore 0% in hsl/hsla
+    replace(/(hsl|hsla)\(([^\)]+)\)/g, function(match, colorFunction, colorDef) {
+      var tokens = colorDef.split(',');
+      if (tokens[1] == '0')
+        tokens[1] = '0%';
+      if (tokens[2] == '0')
+        tokens[2] = '0%';
+      return colorFunction + '(' + tokens.join(',') + ')';
+    });
+
+    // none to 0
+    replace(/(border|border-top|border-right|border-bottom|border-left|outline):none/g, '$1:0');
+
+    // background:none to 0
+    replace(/(background):none([;}])/g, '$1:0$2');
+
+    // multiple zeros into one
+    replace(/box-shadow:0 0 0 0([^\.])/g, 'box-shadow:0 0$1');
+    replace(/:0 0 0 0([^\.])/g, ':0$1');
+    replace(/([: ,=\-])0\.(\d)/g, '$1.$2');
+
+    // shorthand notations
+    var shorthandRegex = function(repeats, hasSuffix) {
+      var pattern = '(padding|margin|border\\-width|border\\-color|border\\-style|border\\-radius):';
+      for (var i = 0; i < repeats; i++) {
+        pattern += '([\\d\\w\\.%#\\(\\),]+)' + (i < repeats - 1 ? ' ' : '');
+      }
+      return new RegExp(pattern + (hasSuffix ? '([;}])' : ''), 'g');
+    };
+
+    // 4 size values into less
+    replace(shorthandRegex(4), function(match, property, size1, size2, size3, size4) {
+      if (size1 === size2 && size1 === size3 && size1 === size4)
+        return property + ':' + size1;
+      else if (size1 === size3 && size2 === size4)
+        return property + ':' + size1 + ' ' + size2;
+      else if (size2 === size4)
+        return property + ':' + size1 + ' ' + size2 + ' ' + size3;
+      else
+        return match;
+    });
+
+    // 3 size values into less
+    replace(shorthandRegex(3, true), function(match, property, size1, size2, size3, suffix) {
+      if (size1 === size2 && size1 === size3)
+        return property + ':' + size1 + suffix;
+      else if (size1 === size3)
+        return property + ':' + size1 + ' ' + size2 + suffix;
+      else
+        return match;
+    });
+
+    // same 2 values into one
+    replace(shorthandRegex(2, true), function(match, property, size1, size2, suffix) {
+      if (size1 === size2)
+        return property + ':' + size1 + suffix;
+      else
+        return match;
+    });
+
+    // restore rect(...) zeros syntax for 4 zeros
+    replace(/rect\(\s?0(\s|,)0[ ,]0[ ,]0\s?\)/g, 'rect(0$10$10$10)');
+
+    // remove universal selector when not needed (*#id, *.class etc)
+    replace(/\*([\.#:\[])/g, '$1');
+
+    // Restore spaces inside calc back
+    replace(/calc\([^\}]+\}/g, function(match) {
+      return match.replace(/\+/g, ' + ');
+    });
+
+    // Restore urls, content content, and special comments (in that order)
+    replace(/__URL__/g, function() {
+      return context.urlBlocks.shift();
+    });
+
+    replace(/__CSSFREETEXT__/g, function() {
+      return context.freeTextBlocks.shift();
+    });
+
+    var specialCommentsCount = context.specialComments.length;
+    var breakSuffix = options.keepBreaks ? lineBreak : '';
+    replace(new RegExp('__CSSCOMMENT__(' + lineBreak + '| )?', 'g'), function() {
+      switch (options.keepSpecialComments) {
+        case '*':
+          return context.specialComments.shift() + breakSuffix;
+        case 1:
+          return context.specialComments.length == specialCommentsCount ?
+            context.specialComments.shift() + breakSuffix :
+            '';
+        case 0:
+          return '';
+      }
+    });
+
+    // move first charset to the beginning
+    replace(function moveCharset() {
+      // get first charset in stylesheet
+      var match = data.match(/@charset [^;]+;/);
+      var firstCharset = match ? match[0] : null;
+      if (!firstCharset)
+        return;
+
+      // reattach first charset and remove all subsequent
+      data = firstCharset +
+        (options.keepBreaks ? lineBreak : '') +
+        data.replace(new RegExp('@charset [^;]+;(' + lineBreak + ')?', 'g'), '');
+    });
+
+    if (options.removeEmpty) {
+      // empty elements
+      replace(/[^\{\}]+\{\}/g, '');
+
+      // empty @media declarations
+      replace(/@media [^\{]+\{\}/g, '');
+    }
+
+    // trim spaces at beginning and end
+    return data.trim();
+  },
+
+  // Inlines all imports taking care of repetitions, unknown files, and cilcular dependencies
+  _inlineImports: function(data, options) {
+    var tempData = [];
+    var nextStart = 0;
+    var nextEnd = 0;
+    var cursor = 0;
+
+    options.relativeTo = options.relativeTo || options.root;
+    options._baseRelativeTo = options._baseRelativeTo || options.relativeTo;
+    options.visited = options.visited || [];
+
+    var inlinedFile = function() {
+      var importedFile = data
+        .substring(data.indexOf(' ', nextStart) + 1, nextEnd)
+        .replace(/^url\(/, '')
+        .replace(/\)$/, '')
+        .replace(/['"]/g, '');
+
+      if (/^(http|https):\/\//.test(importedFile) || /^\/\//.test(importedFile))
+        return '@import url(' + importedFile + ');';
+
+      var relativeTo = importedFile[0] == '/' ?
+        options.root :
+        options.relativeTo;
+
+      var fullPath = path.resolve(path.join(relativeTo, importedFile));
+
+      if (existsSync(fullPath) && fs.statSync(fullPath).isFile() && options.visited.indexOf(fullPath) == -1) {
+        options.visited.push(fullPath);
+
+        var importedData = fs.readFileSync(fullPath, 'utf8');
+        var importRelativeTo = path.dirname(fullPath);
+        importedData = CleanCSS._rebaseRelativeURLs(importedData, importRelativeTo, options._baseRelativeTo);
+        return CleanCSS._inlineImports(importedData, {
+          root: options.root,
+          relativeTo: importRelativeTo,
+          _baseRelativeTo: options.baseRelativeTo,
+          visited: options.visited
+        });
+      } else {
+        return '';
+      }
+    };
+
+    for (; nextEnd < data.length; ) {
+      nextStart = data.indexOf('@import', cursor);
+      if (nextStart == -1)
+        break;
+
+      nextEnd = data.indexOf(';', nextStart);
+      if (nextEnd == -1)
+        break;
+
+      tempData.push(data.substring(cursor, nextStart));
+      tempData.push(inlinedFile());
+      cursor = nextEnd + 1;
+    }
+
+    return tempData.length > 0 ?
+      tempData.join('') + data.substring(cursor, data.length) :
+      data;
+  },
+
+  _rebaseRelativeURLs: function(data, fromBase, toBase) {
+    var tempData = [];
+    var nextStart = 0;
+    var nextEnd = 0;
+    var cursor = 0;
+
+    for (; nextEnd < data.length; ) {
+      nextStart = data.indexOf('url(', nextEnd);
+      if (nextStart == -1)
+        break;
+      nextEnd = data.indexOf(')', nextStart + 4);
+      if (nextEnd == -1)
+        break;
+
+      tempData.push(data.substring(cursor, nextStart));
+      var url = data.substring(nextStart + 4, nextEnd).replace(/['"]/g, '');
+      if (url[0] != '/' && url.indexOf('data:') !== 0 && url.substring(url.length - 4) != '.css') {
+        url = path.relative(toBase, path.join(fromBase, url)).replace(/\\/g, '/');
+      }
+      tempData.push('url(' + url + ')');
+      cursor = nextEnd + 1;
+    }
+
+    return tempData.length > 0 ?
+      tempData.join('') + data.substring(cursor, data.length) :
+      data;
+  },
+
+  // Strip special comments (/*! ... */) by replacing them by __CSSCOMMENT__ marker
+  // for further restoring. Plain comments are removed. It's done by scanning datq using
+  // String#indexOf scanning instead of regexps to speed up the process.
+  _stripComments: function(context, data) {
+    var tempData = [];
+    var nextStart = 0;
+    var nextEnd = 0;
+    var cursor = 0;
+
+    for (; nextEnd < data.length; ) {
+      nextStart = data.indexOf('/*', nextEnd);
+      nextEnd = data.indexOf('*/', nextStart + 2);
+      if (nextStart == -1 || nextEnd == -1)
+        break;
+
+      tempData.push(data.substring(cursor, nextStart));
+      if (data[nextStart + 2] == '!') {
+        // in case of special comments, replace them with a placeholder
+        context.specialComments.push(data.substring(nextStart, nextEnd + 2));
+        tempData.push('__CSSCOMMENT__');
+      }
+      cursor = nextEnd + 2;
+    }
+
+    return tempData.length > 0 ?
+      tempData.join('') + data.substring(cursor, data.length) :
+      data;
+  },
+
+  // Strip content tags by replacing them by the __CSSFREETEXT__
+  // marker for further restoring. It's done via string scanning
+  // instead of regexps to speed up the process.
+  _stripFreeText: function(context, data) {
+    var tempData = [];
+    var nextStart = 0;
+    var nextEnd = 0;
+    var cursor = 0;
+    var matchedParenthesis = null;
+    var singleParenthesis = "'";
+    var doubleParenthesis = '"';
+    var dataLength = data.length;
+
+    for (; nextEnd < data.length; ) {
+      var nextStartSingle = data.indexOf(singleParenthesis, nextEnd + 1);
+      var nextStartDouble = data.indexOf(doubleParenthesis, nextEnd + 1);
+
+      if (nextStartSingle == -1)
+        nextStartSingle = dataLength;
+      if (nextStartDouble == -1)
+        nextStartDouble = dataLength;
+
+      if (nextStartSingle < nextStartDouble) {
+        nextStart = nextStartSingle;
+        matchedParenthesis = singleParenthesis;
+      } else {
+        nextStart = nextStartDouble;
+        matchedParenthesis = doubleParenthesis;
+      }
+
+      if (nextStart == -1)
+        break;
+
+      nextEnd = data.indexOf(matchedParenthesis, nextStart + 1);
+      if (nextStart == -1 || nextEnd == -1)
+        break;
+
+      tempData.push(data.substring(cursor, nextStart));
+      tempData.push('__CSSFREETEXT__');
+      context.freeTextBlocks.push(data.substring(nextStart, nextEnd + 1));
+      cursor = nextEnd + 1;
+    }
+
+    return tempData.length > 0 ?
+      tempData.join('') + data.substring(cursor, data.length) :
+      data;
+  },
+
+  // Strip urls by replacing them by the __URL__
+  // marker for further restoring. It's done via string scanning
+  // instead of regexps to speed up the process.
+  _stripUrls: function(context, data) {
+    var nextStart = 0;
+    var nextEnd = 0;
+    var cursor = 0;
+    var tempData = [];
+
+    for (; nextEnd < data.length; ) {
+      nextStart = data.indexOf('url(', nextEnd);
+      if (nextStart == -1)
+        break;
+
+      nextEnd = data.indexOf(')', nextStart);
+
+      tempData.push(data.substring(cursor, nextStart));
+      tempData.push('__URL__');
+      context.urlBlocks.push(data.substring(nextStart, nextEnd + 1));
+      cursor = nextEnd + 1;
+    }
+
+    return tempData.length > 0 ?
+      tempData.join('') + data.substring(cursor, data.length) :
+      data;
+  },
+
+  // HSL to RGB converter. Both methods taken and adapted from:
+  // http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
+  _hslToRgb: function(h, s, l) {
+    var r, g, b;
+
+    h = ~~h / 360;
+    s = ~~s / 100;
+    l = ~~l / 100;
+
+    if (s === 0) {
+      r = g = b = l; // achromatic
+    } else {
+      var q = l < 0.5 ?
+        l * (1 + s) :
+        l + s - l * s;
+      var p = 2 * l - q;
+      r = this._hueToRgb(p, q, h + 1/3);
+      g = this._hueToRgb(p, q, h);
+      b = this._hueToRgb(p, q, h - 1/3);
+    }
+
+    return [~~(r * 255), ~~(g * 255), ~~(b * 255)];
+  },
+
+  _hueToRgb: function(p, q, t) {
+    if (t < 0) t += 1;
+    if (t > 1) t -= 1;
+    if (t < 1/6) return p + (q - p) * 6 * t;
+    if (t < 1/2) return q;
+    if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
+    return p;
+  }
+};
+
+module.exports = CleanCSS;

+ 174 - 0
node_modules/grunt-contrib-cssmin/node_modules/clean-css/node_modules/commander/History.md

@@ -0,0 +1,174 @@
+
+1.3.2 / 2013-07-18 
+==================
+
+ * add support for sub-commands to co-exist with the original command
+
+1.3.1 / 2013-07-18 
+==================
+
+ * add quick .runningCommand hack so you can opt-out of other logic when running a sub command
+
+1.3.0 / 2013-07-09 
+==================
+
+ * add EACCES error handling
+ * fix sub-command --help
+
+1.2.0 / 2013-06-13 
+==================
+
+ * allow "-" hyphen as an option argument
+ * support for RegExp coercion
+
+1.1.1 / 2012-11-20 
+==================
+
+  * add more sub-command padding
+  * fix .usage() when args are present. Closes #106
+
+1.1.0 / 2012-11-16 
+==================
+
+  * add git-style executable subcommand support. Closes #94
+
+1.0.5 / 2012-10-09 
+==================
+
+  * fix `--name` clobbering. Closes #92
+  * fix examples/help. Closes #89
+
+1.0.4 / 2012-09-03 
+==================
+
+  * add `outputHelp()` method.
+
+1.0.3 / 2012-08-30 
+==================
+
+  * remove invalid .version() defaulting
+
+1.0.2 / 2012-08-24 
+==================
+
+  * add `--foo=bar` support [arv]
+  * fix password on node 0.8.8. Make backward compatible with 0.6 [focusaurus]
+
+1.0.1 / 2012-08-03 
+==================
+
+  * fix issue #56
+  * fix tty.setRawMode(mode) was moved to tty.ReadStream#setRawMode() (i.e. process.stdin.setRawMode())
+
+1.0.0 / 2012-07-05 
+==================
+
+  * add support for optional option descriptions
+  * add defaulting of `.version()` to package.json's version
+
+0.6.1 / 2012-06-01 
+==================
+
+  * Added: append (yes or no) on confirmation
+  * Added: allow node.js v0.7.x
+
+0.6.0 / 2012-04-10 
+==================
+
+  * Added `.prompt(obj, callback)` support. Closes #49
+  * Added default support to .choose(). Closes #41
+  * Fixed the choice example
+
+0.5.1 / 2011-12-20 
+==================
+
+  * Fixed `password()` for recent nodes. Closes #36
+
+0.5.0 / 2011-12-04 
+==================
+
+  * Added sub-command option support [itay]
+
+0.4.3 / 2011-12-04 
+==================
+
+  * Fixed custom help ordering. Closes #32
+
+0.4.2 / 2011-11-24 
+==================
+
+  * Added travis support
+  * Fixed: line-buffered input automatically trimmed. Closes #31
+
+0.4.1 / 2011-11-18 
+==================
+
+  * Removed listening for "close" on --help
+
+0.4.0 / 2011-11-15 
+==================
+
+  * Added support for `--`. Closes #24
+
+0.3.3 / 2011-11-14 
+==================
+
+  * Fixed: wait for close event when writing help info [Jerry Hamlet]
+
+0.3.2 / 2011-11-01 
+==================
+
+  * Fixed long flag definitions with values [felixge]
+
+0.3.1 / 2011-10-31 
+==================
+
+  * Changed `--version` short flag to `-V` from `-v`
+  * Changed `.version()` so it's configurable [felixge]
+
+0.3.0 / 2011-10-31 
+==================
+
+  * Added support for long flags only. Closes #18
+
+0.2.1 / 2011-10-24 
+==================
+
+  * "node": ">= 0.4.x < 0.7.0". Closes #20
+
+0.2.0 / 2011-09-26 
+==================
+
+  * Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs]
+
+0.1.0 / 2011-08-24 
+==================
+
+  * Added support for custom `--help` output
+
+0.0.5 / 2011-08-18 
+==================
+
+  * Changed: when the user enters nothing prompt for password again
+  * Fixed issue with passwords beginning with numbers [NuckChorris]
+
+0.0.4 / 2011-08-15 
+==================
+
+  * Fixed `Commander#args`
+
+0.0.3 / 2011-08-15 
+==================
+
+  * Added default option value support
+
+0.0.2 / 2011-08-15 
+==================
+
+  * Added mask support to `Command#password(str[, mask], fn)`
+  * Added `Command#password(str, fn)`
+
+0.0.1 / 2010-01-03
+==================
+
+  * Initial release

+ 276 - 0
node_modules/grunt-contrib-cssmin/node_modules/clean-css/node_modules/commander/Readme.md

@@ -0,0 +1,276 @@
+# Commander.js
+
+  The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander).
+
+ [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js)
+
+## Installation
+
+    $ npm install commander
+
+## Option parsing
+
+ Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.
+
+```js
+#!/usr/bin/env node
+
+/**
+ * Module dependencies.
+ */
+
+var program = require('commander');
+
+program
+  .version('0.0.1')
+  .option('-p, --peppers', 'Add peppers')
+  .option('-P, --pineapple', 'Add pineapple')
+  .option('-b, --bbq', 'Add bbq sauce')
+  .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
+  .parse(process.argv);
+
+console.log('you ordered a pizza with:');
+if (program.peppers) console.log('  - peppers');
+if (program.pineapple) console.log('  - pineapple');
+if (program.bbq) console.log('  - bbq');
+console.log('  - %s cheese', program.cheese);
+```
+
+ Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc.
+
+## Automated --help
+
+ The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:
+
+```  
+ $ ./examples/pizza --help
+
+   Usage: pizza [options]
+
+   Options:
+
+     -V, --version        output the version number
+     -p, --peppers        Add peppers
+     -P, --pineapple      Add pineapple
+     -b, --bbq            Add bbq sauce
+     -c, --cheese <type>  Add the specified type of cheese [marble]
+     -h, --help           output usage information
+
+```
+
+## Coercion
+
+```js
+function range(val) {
+  return val.split('..').map(Number);
+}
+
+function list(val) {
+  return val.split(',');
+}
+
+program
+  .version('0.0.1')
+  .usage('[options] <file ...>')
+  .option('-i, --integer <n>', 'An integer argument', parseInt)
+  .option('-f, --float <n>', 'A float argument', parseFloat)
+  .option('-r, --range <a>..<b>', 'A range', range)
+  .option('-l, --list <items>', 'A list', list)
+  .option('-o, --optional [value]', 'An optional value')
+  .parse(process.argv);
+
+console.log(' int: %j', program.integer);
+console.log(' float: %j', program.float);
+console.log(' optional: %j', program.optional);
+program.range = program.range || [];
+console.log(' range: %j..%j', program.range[0], program.range[1]);
+console.log(' list: %j', program.list);
+console.log(' args: %j', program.args);
+```
+
+## Custom help
+
+ You can display arbitrary `-h, --help` information
+ by listening for "--help". Commander will automatically
+ exit once you are done so that the remainder of your program
+ does not execute causing undesired behaviours, for example
+ in the following executable "stuff" will not output when
+ `--help` is used.
+
+```js
+#!/usr/bin/env node
+
+/**
+ * Module dependencies.
+ */
+
+var program = require('../');
+
+function list(val) {
+  return val.split(',').map(Number);
+}
+
+program
+  .version('0.0.1')
+  .option('-f, --foo', 'enable some foo')
+  .option('-b, --bar', 'enable some bar')
+  .option('-B, --baz', 'enable some baz');
+
+// must be before .parse() since
+// node's emit() is immediate
+
+program.on('--help', function(){
+  console.log('  Examples:');
+  console.log('');
+  console.log('    $ custom-help --help');
+  console.log('    $ custom-help -h');
+  console.log('');
+});
+
+program.parse(process.argv);
+
+console.log('stuff');
+```
+
+yielding the following help output:
+
+```
+
+Usage: custom-help [options]
+
+Options:
+
+  -h, --help     output usage information
+  -V, --version  output the version number
+  -f, --foo      enable some foo
+  -b, --bar      enable some bar
+  -B, --baz      enable some baz
+
+Examples:
+
+  $ custom-help --help
+  $ custom-help -h
+
+```
+
+## .prompt(msg, fn)
+
+ Single-line prompt:
+
+```js
+program.prompt('name: ', function(name){
+  console.log('hi %s', name);
+});
+```
+
+ Multi-line prompt:
+
+```js
+program.prompt('description:', function(name){
+  console.log('hi %s', name);
+});
+```
+
+ Coercion:
+
+```js
+program.prompt('Age: ', Number, function(age){
+  console.log('age: %j', age);
+});
+```
+
+```js
+program.prompt('Birthdate: ', Date, function(date){
+  console.log('date: %s', date);
+});
+```
+
+```js
+program.prompt('Email: ', /^.+@.+\..+$/, function(email){
+  console.log('email: %j', email);
+});
+```
+
+## .password(msg[, mask], fn)
+
+Prompt for password without echoing:
+
+```js
+program.password('Password: ', function(pass){
+  console.log('got "%s"', pass);
+  process.stdin.destroy();
+});
+```
+
+Prompt for password with mask char "*":
+
+```js
+program.password('Password: ', '*', function(pass){
+  console.log('got "%s"', pass);
+  process.stdin.destroy();
+});
+```
+
+## .confirm(msg, fn)
+
+ Confirm with the given `msg`:
+
+```js
+program.confirm('continue? ', function(ok){
+  console.log(' got %j', ok);
+});
+```
+
+## .choose(list, fn)
+
+ Let the user choose from a `list`:
+
+```js
+var list = ['tobi', 'loki', 'jane', 'manny', 'luna'];
+
+console.log('Choose the coolest pet:');
+program.choose(list, function(i){
+  console.log('you chose %d "%s"', i, list[i]);
+});
+```
+
+## .outputHelp()
+
+  Output help information without exiting.
+
+## .help()
+
+  Output help information and exit immediately.
+
+## Links
+
+ - [API documentation](http://visionmedia.github.com/commander.js/)
+ - [ascii tables](https://github.com/LearnBoost/cli-table)
+ - [progress bars](https://github.com/visionmedia/node-progress)
+ - [more progress bars](https://github.com/substack/node-multimeter)
+ - [examples](https://github.com/visionmedia/commander.js/tree/master/examples)
+
+## License 
+
+(The MIT License)
+
+Copyright (c) 2011 TJ Holowaychuk &lt;[email protected]&gt;
+
+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.

+ 1160 - 0
node_modules/grunt-contrib-cssmin/node_modules/clean-css/node_modules/commander/index.js

@@ -0,0 +1,1160 @@
+/*!
+ * commander
+ * Copyright(c) 2011 TJ Holowaychuk <[email protected]>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var EventEmitter = require('events').EventEmitter
+  , spawn = require('child_process').spawn
+  , keypress = require('keypress')
+  , fs = require('fs')
+  , exists = fs.existsSync
+  , path = require('path')
+  , tty = require('tty')
+  , dirname = path.dirname
+  , basename = path.basename;
+
+/**
+ * Expose the root command.
+ */
+
+exports = module.exports = new Command;
+
+/**
+ * Expose `Command`.
+ */
+
+exports.Command = Command;
+
+/**
+ * Expose `Option`.
+ */
+
+exports.Option = Option;
+
+/**
+ * Initialize a new `Option` with the given `flags` and `description`.
+ *
+ * @param {String} flags
+ * @param {String} description
+ * @api public
+ */
+
+function Option(flags, description) {
+  this.flags = flags;
+  this.required = ~flags.indexOf('<');
+  this.optional = ~flags.indexOf('[');
+  this.bool = !~flags.indexOf('-no-');
+  flags = flags.split(/[ ,|]+/);
+  if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift();
+  this.long = flags.shift();
+  this.description = description || '';
+}
+
+/**
+ * Return option name.
+ *
+ * @return {String}
+ * @api private
+ */
+
+Option.prototype.name = function(){
+  return this.long
+    .replace('--', '')
+    .replace('no-', '');
+};
+
+/**
+ * Check if `arg` matches the short or long flag.
+ *
+ * @param {String} arg
+ * @return {Boolean}
+ * @api private
+ */
+
+Option.prototype.is = function(arg){
+  return arg == this.short
+    || arg == this.long;
+};
+
+/**
+ * Initialize a new `Command`.
+ *
+ * @param {String} name
+ * @api public
+ */
+
+function Command(name) {
+  this.commands = [];
+  this.options = [];
+  this._execs = [];
+  this._args = [];
+  this._name = name;
+}
+
+/**
+ * Inherit from `EventEmitter.prototype`.
+ */
+
+Command.prototype.__proto__ = EventEmitter.prototype;
+
+/**
+ * Add command `name`.
+ *
+ * The `.action()` callback is invoked when the
+ * command `name` is specified via __ARGV__,
+ * and the remaining arguments are applied to the
+ * function for access.
+ *
+ * When the `name` is "*" an un-matched command
+ * will be passed as the first arg, followed by
+ * the rest of __ARGV__ remaining.
+ *
+ * Examples:
+ *
+ *      program
+ *        .version('0.0.1')
+ *        .option('-C, --chdir <path>', 'change the working directory')
+ *        .option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
+ *        .option('-T, --no-tests', 'ignore test hook')
+ *     
+ *      program
+ *        .command('setup')
+ *        .description('run remote setup commands')
+ *        .action(function(){
+ *          console.log('setup');
+ *        });
+ *     
+ *      program
+ *        .command('exec <cmd>')
+ *        .description('run the given remote command')
+ *        .action(function(cmd){
+ *          console.log('exec "%s"', cmd);
+ *        });
+ *     
+ *      program
+ *        .command('*')
+ *        .description('deploy the given env')
+ *        .action(function(env){
+ *          console.log('deploying "%s"', env);
+ *        });
+ *     
+ *      program.parse(process.argv);
+  *
+ * @param {String} name
+ * @param {String} [desc]
+ * @return {Command} the new command
+ * @api public
+ */
+
+Command.prototype.command = function(name, desc){
+  var args = name.split(/ +/);
+  var cmd = new Command(args.shift());
+  if (desc) cmd.description(desc);
+  if (desc) this.executables = true;
+  if (desc) this._execs[cmd._name] = true;
+  this.commands.push(cmd);
+  cmd.parseExpectedArgs(args);
+  cmd.parent = this;
+  if (desc) return this;
+  return cmd;
+};
+
+/**
+ * Add an implicit `help [cmd]` subcommand
+ * which invokes `--help` for the given command.
+ *
+ * @api private
+ */
+
+Command.prototype.addImplicitHelpCommand = function() {
+  this.command('help [cmd]', 'display help for [cmd]');
+};
+
+/**
+ * Parse expected `args`.
+ *
+ * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`.
+ *
+ * @param {Array} args
+ * @return {Command} for chaining
+ * @api public
+ */
+
+Command.prototype.parseExpectedArgs = function(args){
+  if (!args.length) return;
+  var self = this;
+  args.forEach(function(arg){
+    switch (arg[0]) {
+      case '<':
+        self._args.push({ required: true, name: arg.slice(1, -1) });
+        break;
+      case '[':
+        self._args.push({ required: false, name: arg.slice(1, -1) });
+        break;
+    }
+  });
+  return this;
+};
+
+/**
+ * Register callback `fn` for the command.
+ *
+ * Examples:
+ *
+ *      program
+ *        .command('help')
+ *        .description('display verbose help')
+ *        .action(function(){
+ *           // output help here
+ *        });
+ *
+ * @param {Function} fn
+ * @return {Command} for chaining
+ * @api public
+ */
+
+Command.prototype.action = function(fn){
+  var self = this;
+  this.parent.on(this._name, function(args, unknown){    
+    // Parse any so-far unknown options
+    unknown = unknown || [];
+    var parsed = self.parseOptions(unknown);
+    
+    // Output help if necessary
+    outputHelpIfNecessary(self, parsed.unknown);
+    
+    // If there are still any unknown options, then we simply 
+    // die, unless someone asked for help, in which case we give it
+    // to them, and then we die.
+    if (parsed.unknown.length > 0) {      
+      self.unknownOption(parsed.unknown[0]);
+    }
+    
+    // Leftover arguments need to be pushed back. Fixes issue #56
+    if (parsed.args.length) args = parsed.args.concat(args);
+    
+    self._args.forEach(function(arg, i){
+      if (arg.required && null == args[i]) {
+        self.missingArgument(arg.name);
+      }
+    });
+    
+    // Always append ourselves to the end of the arguments,
+    // to make sure we match the number of arguments the user
+    // expects
+    if (self._args.length) {
+      args[self._args.length] = self;
+    } else {
+      args.push(self);
+    }
+    
+    fn.apply(this, args);
+  });
+  return this;
+};
+
+/**
+ * Define option with `flags`, `description` and optional
+ * coercion `fn`. 
+ *
+ * The `flags` string should contain both the short and long flags,
+ * separated by comma, a pipe or space. The following are all valid
+ * all will output this way when `--help` is used.
+ *
+ *    "-p, --pepper"
+ *    "-p|--pepper"
+ *    "-p --pepper"
+ *
+ * Examples:
+ *
+ *     // simple boolean defaulting to false
+ *     program.option('-p, --pepper', 'add pepper');
+ *
+ *     --pepper
+ *     program.pepper
+ *     // => Boolean
+ *
+ *     // simple boolean defaulting to false
+ *     program.option('-C, --no-cheese', 'remove cheese');
+ *
+ *     program.cheese
+ *     // => true
+ *
+ *     --no-cheese
+ *     program.cheese
+ *     // => true
+ *
+ *     // required argument
+ *     program.option('-C, --chdir <path>', 'change the working directory');
+ *
+ *     --chdir /tmp
+ *     program.chdir
+ *     // => "/tmp"
+ *
+ *     // optional argument
+ *     program.option('-c, --cheese [type]', 'add cheese [marble]');
+ *
+ * @param {String} flags
+ * @param {String} description
+ * @param {Function|Mixed} fn or default
+ * @param {Mixed} defaultValue
+ * @return {Command} for chaining
+ * @api public
+ */
+
+Command.prototype.option = function(flags, description, fn, defaultValue){
+  var self = this
+    , option = new Option(flags, description)
+    , oname = option.name()
+    , name = camelcase(oname);
+
+  // default as 3rd arg
+  if ('function' != typeof fn) defaultValue = fn, fn = null;
+
+  // preassign default value only for --no-*, [optional], or <required>
+  if (false == option.bool || option.optional || option.required) {
+    // when --no-* we make sure default is true
+    if (false == option.bool) defaultValue = true;
+    // preassign only if we have a default
+    if (undefined !== defaultValue) self[name] = defaultValue;
+  }
+
+  // register the option
+  this.options.push(option);
+
+  // when it's passed assign the value
+  // and conditionally invoke the callback
+  this.on(oname, function(val){
+    // coercion
+    if (null != val && fn) val = fn(val);
+
+    // unassigned or bool
+    if ('boolean' == typeof self[name] || 'undefined' == typeof self[name]) {
+      // if no value, bool true, and we have a default, then use it!
+      if (null == val) {
+        self[name] = option.bool
+          ? defaultValue || true
+          : false;
+      } else {
+        self[name] = val;
+      }
+    } else if (null !== val) {
+      // reassign
+      self[name] = val;
+    }
+  });
+
+  return this;
+};
+
+/**
+ * Parse `argv`, settings options and invoking commands when defined.
+ *
+ * @param {Array} argv
+ * @return {Command} for chaining
+ * @api public
+ */
+
+Command.prototype.parse = function(argv){
+  // implicit help
+  if (this.executables) this.addImplicitHelpCommand();
+
+  // store raw args
+  this.rawArgs = argv;
+
+  // guess name
+  this._name = this._name || basename(argv[1]);
+
+  // process argv
+  var parsed = this.parseOptions(this.normalize(argv.slice(2)));
+  var args = this.args = parsed.args;
+ 
+  var result = this.parseArgs(this.args, parsed.unknown);
+
+  // executable sub-commands
+  var name = result.args[0];
+  if (this._execs[name]) return this.executeSubCommand(argv, args, parsed.unknown);
+
+  return result;
+};
+
+/**
+ * Execute a sub-command executable.
+ *
+ * @param {Array} argv
+ * @param {Array} args
+ * @param {Array} unknown
+ * @api private
+ */
+
+Command.prototype.executeSubCommand = function(argv, args, unknown) {
+  args = args.concat(unknown);
+
+  if (!args.length) this.help();
+  if ('help' == args[0] && 1 == args.length) this.help();
+
+  // <cmd> --help
+  if ('help' == args[0]) {
+    args[0] = args[1];
+    args[1] = '--help';
+  }
+
+  // executable
+  var dir = dirname(argv[1]);
+  var bin = basename(argv[1]) + '-' + args[0];
+
+  // check for ./<bin> first
+  var local = path.join(dir, bin);
+
+  // run it
+  args = args.slice(1);
+  var proc = spawn(local, args, { stdio: 'inherit', customFds: [0, 1, 2] });
+  proc.on('error', function(err){
+    if (err.code == "ENOENT") {
+      console.error('\n  %s(1) does not exist, try --help\n', bin);
+    } else if (err.code == "EACCES") {
+      console.error('\n  %s(1) not executable. try chmod or run with root\n', bin);
+    }
+  });
+
+  this.runningCommand = proc;
+};
+
+/**
+ * Normalize `args`, splitting joined short flags. For example
+ * the arg "-abc" is equivalent to "-a -b -c".
+ * This also normalizes equal sign and splits "--abc=def" into "--abc def".
+ *
+ * @param {Array} args
+ * @return {Array}
+ * @api private
+ */
+
+Command.prototype.normalize = function(args){
+  var ret = []
+    , arg
+    , index;
+
+  for (var i = 0, len = args.length; i < len; ++i) {
+    arg = args[i];
+    if (arg.length > 1 && '-' == arg[0] && '-' != arg[1]) {
+      arg.slice(1).split('').forEach(function(c){
+        ret.push('-' + c);
+      });
+    } else if (/^--/.test(arg) && ~(index = arg.indexOf('='))) {
+      ret.push(arg.slice(0, index), arg.slice(index + 1));
+    } else {
+      ret.push(arg);
+    }
+  }
+
+  return ret;
+};
+
+/**
+ * Parse command `args`.
+ *
+ * When listener(s) are available those
+ * callbacks are invoked, otherwise the "*"
+ * event is emitted and those actions are invoked.
+ *
+ * @param {Array} args
+ * @return {Command} for chaining
+ * @api private
+ */
+
+Command.prototype.parseArgs = function(args, unknown){
+  var cmds = this.commands
+    , len = cmds.length
+    , name;
+
+  if (args.length) {
+    name = args[0];
+    if (this.listeners(name).length) {
+      this.emit(args.shift(), args, unknown);
+    } else {
+      this.emit('*', args);
+    }
+  } else {
+    outputHelpIfNecessary(this, unknown);
+    
+    // If there were no args and we have unknown options,
+    // then they are extraneous and we need to error.
+    if (unknown.length > 0) {      
+      this.unknownOption(unknown[0]);
+    }
+  }
+
+  return this;
+};
+
+/**
+ * Return an option matching `arg` if any.
+ *
+ * @param {String} arg
+ * @return {Option}
+ * @api private
+ */
+
+Command.prototype.optionFor = function(arg){
+  for (var i = 0, len = this.options.length; i < len; ++i) {
+    if (this.options[i].is(arg)) {
+      return this.options[i];
+    }
+  }
+};
+
+/**
+ * Parse options from `argv` returning `argv`
+ * void of these options.
+ *
+ * @param {Array} argv
+ * @return {Array}
+ * @api public
+ */
+
+Command.prototype.parseOptions = function(argv){
+  var args = []
+    , len = argv.length
+    , literal
+    , option
+    , arg;
+
+  var unknownOptions = [];
+
+  // parse options
+  for (var i = 0; i < len; ++i) {
+    arg = argv[i];
+
+    // literal args after --
+    if ('--' == arg) {
+      literal = true;
+      continue;
+    }
+
+    if (literal) {
+      args.push(arg);
+      continue;
+    }
+
+    // find matching Option
+    option = this.optionFor(arg);
+
+    // option is defined
+    if (option) {
+      // requires arg
+      if (option.required) {
+        arg = argv[++i];
+        if (null == arg) return this.optionMissingArgument(option);
+        if ('-' == arg[0] && '-' != arg) return this.optionMissingArgument(option, arg);
+        this.emit(option.name(), arg);
+      // optional arg
+      } else if (option.optional) {
+        arg = argv[i+1];
+        if (null == arg || ('-' == arg[0] && '-' != arg)) {
+          arg = null;
+        } else {
+          ++i;
+        }
+        this.emit(option.name(), arg);
+      // bool
+      } else {
+        this.emit(option.name());
+      }
+      continue;
+    }
+    
+    // looks like an option
+    if (arg.length > 1 && '-' == arg[0]) {
+      unknownOptions.push(arg);
+      
+      // If the next argument looks like it might be
+      // an argument for this option, we pass it on.
+      // If it isn't, then it'll simply be ignored
+      if (argv[i+1] && '-' != argv[i+1][0]) {
+        unknownOptions.push(argv[++i]);
+      }
+      continue;
+    }
+    
+    // arg
+    args.push(arg);
+  }
+  
+  return { args: args, unknown: unknownOptions };
+};
+
+/**
+ * Argument `name` is missing.
+ *
+ * @param {String} name
+ * @api private
+ */
+
+Command.prototype.missingArgument = function(name){
+  console.error();
+  console.error("  error: missing required argument `%s'", name);
+  console.error();
+  process.exit(1);
+};
+
+/**
+ * `Option` is missing an argument, but received `flag` or nothing.
+ *
+ * @param {String} option
+ * @param {String} flag
+ * @api private
+ */
+
+Command.prototype.optionMissingArgument = function(option, flag){
+  console.error();
+  if (flag) {
+    console.error("  error: option `%s' argument missing, got `%s'", option.flags, flag);
+  } else {
+    console.error("  error: option `%s' argument missing", option.flags);
+  }
+  console.error();
+  process.exit(1);
+};
+
+/**
+ * Unknown option `flag`.
+ *
+ * @param {String} flag
+ * @api private
+ */
+
+Command.prototype.unknownOption = function(flag){
+  console.error();
+  console.error("  error: unknown option `%s'", flag);
+  console.error();
+  process.exit(1);
+};
+
+
+/**
+ * Set the program version to `str`.
+ *
+ * This method auto-registers the "-V, --version" flag
+ * which will print the version number when passed.
+ *
+ * @param {String} str
+ * @param {String} flags
+ * @return {Command} for chaining
+ * @api public
+ */
+
+Command.prototype.version = function(str, flags){
+  if (0 == arguments.length) return this._version;
+  this._version = str;
+  flags = flags || '-V, --version';
+  this.option(flags, 'output the version number');
+  this.on('version', function(){
+    console.log(str);
+    process.exit(0);
+  });
+  return this;
+};
+
+/**
+ * Set the description `str`.
+ *
+ * @param {String} str
+ * @return {String|Command}
+ * @api public
+ */
+
+Command.prototype.description = function(str){
+  if (0 == arguments.length) return this._description;
+  this._description = str;
+  return this;
+};
+
+/**
+ * Set / get the command usage `str`.
+ *
+ * @param {String} str
+ * @return {String|Command}
+ * @api public
+ */
+
+Command.prototype.usage = function(str){
+  var args = this._args.map(function(arg){
+    return arg.required
+      ? '<' + arg.name + '>'
+      : '[' + arg.name + ']';
+  });
+
+  var usage = '[options'
+    + (this.commands.length ? '] [command' : '')
+    + ']'
+    + (this._args.length ? ' ' + args : '');
+
+  if (0 == arguments.length) return this._usage || usage;
+  this._usage = str;
+
+  return this;
+};
+
+/**
+ * Return the largest option length.
+ *
+ * @return {Number}
+ * @api private
+ */
+
+Command.prototype.largestOptionLength = function(){
+  return this.options.reduce(function(max, option){
+    return Math.max(max, option.flags.length);
+  }, 0);
+};
+
+/**
+ * Return help for options.
+ *
+ * @return {String}
+ * @api private
+ */
+
+Command.prototype.optionHelp = function(){
+  var width = this.largestOptionLength();
+  
+  // Prepend the help information
+  return [pad('-h, --help', width) + '  ' + 'output usage information']
+    .concat(this.options.map(function(option){
+      return pad(option.flags, width)
+        + '  ' + option.description;
+      }))
+    .join('\n');
+};
+
+/**
+ * Return command help documentation.
+ *
+ * @return {String}
+ * @api private
+ */
+
+Command.prototype.commandHelp = function(){
+  if (!this.commands.length) return '';
+  return [
+      ''
+    , '  Commands:'
+    , ''
+    , this.commands.map(function(cmd){
+      var args = cmd._args.map(function(arg){
+        return arg.required
+          ? '<' + arg.name + '>'
+          : '[' + arg.name + ']';
+      }).join(' ');
+
+      return pad(cmd._name
+        + (cmd.options.length 
+          ? ' [options]'
+          : '') + ' ' + args, 22)
+        + (cmd.description()
+          ? ' ' + cmd.description()
+          : '');
+    }).join('\n').replace(/^/gm, '    ')
+    , ''
+  ].join('\n');
+};
+
+/**
+ * Return program help documentation.
+ *
+ * @return {String}
+ * @api private
+ */
+
+Command.prototype.helpInformation = function(){
+  return [
+      ''
+    , '  Usage: ' + this._name + ' ' + this.usage()
+    , '' + this.commandHelp()
+    , '  Options:'
+    , ''
+    , '' + this.optionHelp().replace(/^/gm, '    ')
+    , ''
+    , ''
+  ].join('\n');
+};
+
+/**
+ * Prompt for a `Number`.
+ *
+ * @param {String} str
+ * @param {Function} fn
+ * @api private
+ */
+
+Command.prototype.promptForNumber = function(str, fn){
+  var self = this;
+  this.promptSingleLine(str, function parseNumber(val){
+    val = Number(val);
+    if (isNaN(val)) return self.promptSingleLine(str + '(must be a number) ', parseNumber);
+    fn(val);
+  });
+};
+
+/**
+ * Prompt for a `Date`.
+ *
+ * @param {String} str
+ * @param {Function} fn
+ * @api private
+ */
+
+Command.prototype.promptForDate = function(str, fn){
+  var self = this;
+  this.promptSingleLine(str, function parseDate(val){
+    val = new Date(val);
+    if (isNaN(val.getTime())) return self.promptSingleLine(str + '(must be a date) ', parseDate);
+    fn(val);
+  });
+};
+
+
+/**
+ * Prompt for a `Regular Expression`.
+ *
+ * @param {String} str
+ * @param {Object} pattern regular expression object to test
+ * @param {Function} fn
+ * @api private
+ */
+
+Command.prototype.promptForRegexp = function(str, pattern, fn){
+  var self = this;
+  this.promptSingleLine(str, function parseRegexp(val){
+    if(!pattern.test(val)) return self.promptSingleLine(str + '(regular expression mismatch) ', parseRegexp);
+    fn(val);
+  });
+};
+
+
+/**
+ * Single-line prompt.
+ *
+ * @param {String} str
+ * @param {Function} fn
+ * @api private
+ */
+
+Command.prototype.promptSingleLine = function(str, fn){
+  // determine if the 2nd argument is a regular expression
+  if (arguments[1].global !== undefined && arguments[1].multiline !== undefined) {
+    return this.promptForRegexp(str, arguments[1], arguments[2]);
+  } else if ('function' == typeof arguments[2]) {
+    return this['promptFor' + (fn.name || fn)](str, arguments[2]);
+  }
+
+  process.stdout.write(str);
+  process.stdin.setEncoding('utf8');
+  process.stdin.once('data', function(val){
+    fn(val.trim());
+  }).resume();
+};
+
+/**
+ * Multi-line prompt.
+ *
+ * @param {String} str
+ * @param {Function} fn
+ * @api private
+ */
+
+Command.prototype.promptMultiLine = function(str, fn){
+  var buf = [];
+  console.log(str);
+  process.stdin.setEncoding('utf8');
+  process.stdin.on('data', function(val){
+    if ('\n' == val || '\r\n' == val) {
+      process.stdin.removeAllListeners('data');
+      fn(buf.join('\n'));
+    } else {
+      buf.push(val.trimRight());
+    }
+  }).resume();
+};
+
+/**
+ * Prompt `str` and callback `fn(val)`
+ *
+ * Commander supports single-line and multi-line prompts.
+ * To issue a single-line prompt simply add white-space
+ * to the end of `str`, something like "name: ", whereas
+ * for a multi-line prompt omit this "description:".
+ *
+ *
+ * Examples:
+ *
+ *     program.prompt('Username: ', function(name){
+ *       console.log('hi %s', name);
+ *     });
+ *     
+ *     program.prompt('Description:', function(desc){
+ *       console.log('description was "%s"', desc.trim());
+ *     });
+ *
+ * @param {String|Object} str
+ * @param {Function} fn
+ * @api public
+ */
+
+Command.prototype.prompt = function(str, fn){
+  var self = this;
+  if ('string' == typeof str) {
+    if (/ $/.test(str)) return this.promptSingleLine.apply(this, arguments);
+    this.promptMultiLine(str, fn);
+  } else {
+    var keys = Object.keys(str)
+      , obj = {};
+
+    function next() {
+      var key = keys.shift()
+        , label = str[key];
+
+      if (!key) return fn(obj);
+      self.prompt(label, function(val){
+        obj[key] = val;
+        next();
+      });
+    }
+
+    next();
+  }
+};
+
+/**
+ * Prompt for password with `str`, `mask` char and callback `fn(val)`.
+ *
+ * The mask string defaults to '', aka no output is
+ * written while typing, you may want to use "*" etc.
+ *
+ * Examples:
+ *
+ *     program.password('Password: ', function(pass){
+ *       console.log('got "%s"', pass);
+ *       process.stdin.destroy();
+ *     });
+ *
+ *     program.password('Password: ', '*', function(pass){
+ *       console.log('got "%s"', pass);
+ *       process.stdin.destroy();
+ *     });
+ *
+ * @param {String} str
+ * @param {String} mask
+ * @param {Function} fn
+ * @api public
+ */
+
+Command.prototype.password = function(str, mask, fn){
+  var self = this
+    , buf = '';
+
+  // default mask
+  if ('function' == typeof mask) {
+    fn = mask;
+    mask = '';
+  }
+
+  keypress(process.stdin);
+
+  function setRawMode(mode) {
+    if (process.stdin.setRawMode) {
+      process.stdin.setRawMode(mode);
+    } else {
+      tty.setRawMode(mode);
+    }
+  };
+  setRawMode(true);
+  process.stdout.write(str);
+
+  // keypress
+  process.stdin.on('keypress', function(c, key){
+    if (key && 'enter' == key.name) {
+      console.log();
+      process.stdin.pause();
+      process.stdin.removeAllListeners('keypress');
+      setRawMode(false);
+      if (!buf.trim().length) return self.password(str, mask, fn);
+      fn(buf);
+      return;
+    }
+
+    if (key && key.ctrl && 'c' == key.name) {
+      console.log('%s', buf);
+      process.exit();
+    }
+
+    process.stdout.write(mask);
+    buf += c;
+  }).resume();
+};
+
+/**
+ * Confirmation prompt with `str` and callback `fn(bool)`
+ *
+ * Examples:
+ *
+ *      program.confirm('continue? ', function(ok){
+ *        console.log(' got %j', ok);
+ *        process.stdin.destroy();
+ *      });
+ *
+ * @param {String} str
+ * @param {Function} fn
+ * @api public
+ */
+
+
+Command.prototype.confirm = function(str, fn, verbose){
+  var self = this;
+  this.prompt(str, function(ok){
+    if (!ok.trim()) {
+      if (!verbose) str += '(yes or no) ';
+      return self.confirm(str, fn, true);
+    }
+    fn(parseBool(ok));
+  });
+};
+
+/**
+ * Choice prompt with `list` of items and callback `fn(index, item)`
+ *
+ * Examples:
+ *
+ *      var list = ['tobi', 'loki', 'jane', 'manny', 'luna'];
+ *      
+ *      console.log('Choose the coolest pet:');
+ *      program.choose(list, function(i){
+ *        console.log('you chose %d "%s"', i, list[i]);
+ *        process.stdin.destroy();
+ *      });
+ *
+ * @param {Array} list
+ * @param {Number|Function} index or fn
+ * @param {Function} fn
+ * @api public
+ */
+
+Command.prototype.choose = function(list, index, fn){
+  var self = this
+    , hasDefault = 'number' == typeof index;
+
+  if (!hasDefault) {
+    fn = index;
+    index = null;
+  }
+
+  list.forEach(function(item, i){
+    if (hasDefault && i == index) {
+      console.log('* %d) %s', i + 1, item);
+    } else {
+      console.log('  %d) %s', i + 1, item);
+    }
+  });
+
+  function again() {
+    self.prompt('  : ', function(val){
+      val = parseInt(val, 10) - 1;
+      if (hasDefault && isNaN(val)) val = index;
+
+      if (null == list[val]) {
+        again();
+      } else {
+        fn(val, list[val]);
+      }
+    });
+  }
+
+  again();
+};
+
+
+/**
+ * Output help information for this command
+ *
+ * @api public
+ */
+
+Command.prototype.outputHelp = function(){
+  process.stdout.write(this.helpInformation());
+  this.emit('--help');
+};
+
+/**
+ * Output help information and exit.
+ *
+ * @api public
+ */
+
+Command.prototype.help = function(){
+  this.outputHelp();
+  process.exit();
+};
+
+/**
+ * Camel-case the given `flag`
+ *
+ * @param {String} flag
+ * @return {String}
+ * @api private
+ */
+
+function camelcase(flag) {
+  return flag.split('-').reduce(function(str, word){
+    return str + word[0].toUpperCase() + word.slice(1);
+  });
+}
+
+/**
+ * Parse a boolean `str`.
+ *
+ * @param {String} str
+ * @return {Boolean}
+ * @api private
+ */
+
+function parseBool(str) {
+  return /^y|yes|ok|true$/i.test(str);
+}
+
+/**
+ * Pad `str` to `width`.
+ *
+ * @param {String} str
+ * @param {Number} width
+ * @return {String}
+ * @api private
+ */
+
+function pad(str, width) {
+  var len = Math.max(0, width - str.length);
+  return str + Array(len + 1).join(' ');
+}
+
+/**
+ * Output help information if necessary
+ *
+ * @param {Command} command to output help for
+ * @param {Array} array of options to search for -h or --help
+ * @api private
+ */
+
+function outputHelpIfNecessary(cmd, options) {
+  options = options || [];
+  for (var i = 0; i < options.length; i++) {
+    if (options[i] == '--help' || options[i] == '-h') {
+      cmd.outputHelp();
+      process.exit(0);
+    }
+  }
+}

+ 101 - 0
node_modules/grunt-contrib-cssmin/node_modules/clean-css/node_modules/commander/node_modules/keypress/README.md

@@ -0,0 +1,101 @@
+keypress
+========
+### Make any Node ReadableStream emit "keypress" events
+
+
+Previous to Node `v0.8.x`, there was an undocumented `"keypress"` event that
+`process.stdin` would emit when it was a TTY. Some people discovered this hidden
+gem, and started using it in their own code.
+
+Now in Node `v0.8.x`, this `"keypress"` event does not get emitted by default,
+but rather only when it is being used in conjuction with the `readline` (or by
+extension, the `repl`) module.
+
+This module is the exact logic from the node `v0.8.x` releases ripped out into its
+own module.
+
+__Bonus:__ Now with mouse support!
+
+Installation
+------------
+
+Install with `npm`:
+
+``` bash
+$ npm install keypress
+```
+
+Or add it to the `"dependencies"` section of your _package.json_ file.
+
+
+Example
+-------
+
+#### Listening for "keypress" events
+
+``` js
+var keypress = require('keypress');
+
+// make `process.stdin` begin emitting "keypress" events
+keypress(process.stdin);
+
+// listen for the "keypress" event
+process.stdin.on('keypress', function (ch, key) {
+  console.log('got "keypress"', key);
+  if (key && key.ctrl && key.name == 'c') {
+    process.stdin.pause();
+  }
+});
+
+process.stdin.setRawMode(true);
+process.stdin.resume();
+```
+
+#### Listening for "mousepress" events
+
+``` js
+var keypress = require('keypress');
+
+// make `process.stdin` begin emitting "mousepress" (and "keypress") events
+keypress(process.stdin);
+
+// you must enable the mouse events before they will begin firing
+keypress.enableMouse(process.stdout);
+
+process.stdin.on('mousepress', function (info) {
+  console.log('got "mousepress" event at %d x %d', info.x, info.y);
+});
+
+process.on('exit', function () {
+  // disable mouse on exit, so that the state
+  // is back to normal for the terminal
+  keypress.disableMouse(process.stdout);
+});
+```
+
+
+License
+-------
+
+(The MIT License)
+
+Copyright (c) 2012 Nathan Rajlich &lt;[email protected]&gt;
+
+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.

+ 346 - 0
node_modules/grunt-contrib-cssmin/node_modules/clean-css/node_modules/commander/node_modules/keypress/index.js

@@ -0,0 +1,346 @@
+
+/**
+ * This module offers the internal "keypress" functionality from node-core's
+ * `readline` module, for your own programs and modules to use.
+ *
+ * Usage:
+ *
+ *   require('keypress')(process.stdin);
+ *
+ *   process.stdin.on('keypress', function (ch, key) {
+ *     console.log(ch, key);
+ *     if (key.ctrl && key.name == 'c') {
+ *       process.stdin.pause();
+ *     }
+ *   });
+ *   proces.stdin.resume();
+ */
+var exports = module.exports = keypress;
+
+exports.enableMouse = function (stream) {
+  stream.write('\x1b' +'[?1000h')
+}
+
+exports.disableMouse = function (stream) {
+  stream.write('\x1b' +'[?1000l')
+}
+
+
+/**
+ * accepts a readable Stream instance and makes it emit "keypress" events
+ */
+
+function keypress(stream) {
+  if (isEmittingKeypress(stream)) return;
+  stream._emitKeypress = true;
+
+  function onData(b) {
+    if (stream.listeners('keypress').length > 0) {
+      emitKey(stream, b);
+    } else {
+      // Nobody's watching anyway
+      stream.removeListener('data', onData);
+      stream.on('newListener', onNewListener);
+    }
+  }
+
+  function onNewListener(event) {
+    if (event == 'keypress') {
+      stream.on('data', onData);
+      stream.removeListener('newListener', onNewListener);
+    }
+  }
+
+  if (stream.listeners('keypress').length > 0) {
+    stream.on('data', onData);
+  } else {
+    stream.on('newListener', onNewListener);
+  }
+}
+
+/**
+ * Returns `true` if the stream is already emitting "keypress" events.
+ * `false` otherwise.
+ */
+
+function isEmittingKeypress(stream) {
+  var rtn = stream._emitKeypress;
+  if (!rtn) {
+    // hack: check for the v0.6.x "data" event
+    stream.listeners('data').forEach(function (l) {
+      if (l.name == 'onData' && /emitKey/.test(l.toString())) {
+        rtn = true;
+        stream._emitKeypress = true;
+      }
+    });
+  }
+  if (!rtn) {
+    // hack: check for the v0.6.x "newListener" event
+    stream.listeners('newListener').forEach(function (l) {
+      if (l.name == 'onNewListener' && /keypress/.test(l.toString())) {
+        rtn = true;
+        stream._emitKeypress = true;
+      }
+    });
+  }
+  return rtn;
+}
+
+
+/*
+  Some patterns seen in terminal key escape codes, derived from combos seen
+  at http://www.midnight-commander.org/browser/lib/tty/key.c
+
+  ESC letter
+  ESC [ letter
+  ESC [ modifier letter
+  ESC [ 1 ; modifier letter
+  ESC [ num char
+  ESC [ num ; modifier char
+  ESC O letter
+  ESC O modifier letter
+  ESC O 1 ; modifier letter
+  ESC N letter
+  ESC [ [ num ; modifier char
+  ESC [ [ 1 ; modifier letter
+  ESC ESC [ num char
+  ESC ESC O letter
+
+  - char is usually ~ but $ and ^ also happen with rxvt
+  - modifier is 1 +
+                (shift     * 1) +
+                (left_alt  * 2) +
+                (ctrl      * 4) +
+                (right_alt * 8)
+  - two leading ESCs apparently mean the same as one leading ESC
+*/
+
+// Regexes used for ansi escape code splitting
+var metaKeyCodeRe = /^(?:\x1b)([a-zA-Z0-9])$/;
+var functionKeyCodeRe =
+    /^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/;
+
+function emitKey(stream, s) {
+  var ch,
+      key = {
+        name: undefined,
+        ctrl: false,
+        meta: false,
+        shift: false
+      },
+      parts;
+
+  if (Buffer.isBuffer(s)) {
+    if (s[0] > 127 && s[1] === undefined) {
+      s[0] -= 128;
+      s = '\x1b' + s.toString(stream.encoding || 'utf-8');
+    } else {
+      s = s.toString(stream.encoding || 'utf-8');
+    }
+  }
+
+  key.sequence = s;
+
+  if (s === '\r' || s === '\n') {
+    // enter
+    key.name = 'enter';
+
+  } else if (s === '\t') {
+    // tab
+    key.name = 'tab';
+
+  } else if (s === '\b' || s === '\x7f' ||
+             s === '\x1b\x7f' || s === '\x1b\b') {
+    // backspace or ctrl+h
+    key.name = 'backspace';
+    key.meta = (s.charAt(0) === '\x1b');
+
+  } else if (s === '\x1b' || s === '\x1b\x1b') {
+    // escape key
+    key.name = 'escape';
+    key.meta = (s.length === 2);
+
+  } else if (s === ' ' || s === '\x1b ') {
+    key.name = 'space';
+    key.meta = (s.length === 2);
+
+  } else if (s <= '\x1a') {
+    // ctrl+letter
+    key.name = String.fromCharCode(s.charCodeAt(0) + 'a'.charCodeAt(0) - 1);
+    key.ctrl = true;
+
+  } else if (s.length === 1 && s >= 'a' && s <= 'z') {
+    // lowercase letter
+    key.name = s;
+
+  } else if (s.length === 1 && s >= 'A' && s <= 'Z') {
+    // shift+letter
+    key.name = s.toLowerCase();
+    key.shift = true;
+
+  } else if (parts = metaKeyCodeRe.exec(s)) {
+    // meta+character key
+    key.name = parts[1].toLowerCase();
+    key.meta = true;
+    key.shift = /^[A-Z]$/.test(parts[1]);
+
+  } else if (parts = functionKeyCodeRe.exec(s)) {
+    // ansi escape sequence
+
+    // reassemble the key code leaving out leading \x1b's,
+    // the modifier key bitflag and any meaningless "1;" sequence
+    var code = (parts[1] || '') + (parts[2] || '') +
+               (parts[4] || '') + (parts[6] || ''),
+        modifier = (parts[3] || parts[5] || 1) - 1;
+
+    // Parse the key modifier
+    key.ctrl = !!(modifier & 4);
+    key.meta = !!(modifier & 10);
+    key.shift = !!(modifier & 1);
+    key.code = code;
+
+    // Parse the key itself
+    switch (code) {
+      /* xterm/gnome ESC O letter */
+      case 'OP': key.name = 'f1'; break;
+      case 'OQ': key.name = 'f2'; break;
+      case 'OR': key.name = 'f3'; break;
+      case 'OS': key.name = 'f4'; break;
+
+      /* xterm/rxvt ESC [ number ~ */
+      case '[11~': key.name = 'f1'; break;
+      case '[12~': key.name = 'f2'; break;
+      case '[13~': key.name = 'f3'; break;
+      case '[14~': key.name = 'f4'; break;
+
+      /* from Cygwin and used in libuv */
+      case '[[A': key.name = 'f1'; break;
+      case '[[B': key.name = 'f2'; break;
+      case '[[C': key.name = 'f3'; break;
+      case '[[D': key.name = 'f4'; break;
+      case '[[E': key.name = 'f5'; break;
+
+      /* common */
+      case '[15~': key.name = 'f5'; break;
+      case '[17~': key.name = 'f6'; break;
+      case '[18~': key.name = 'f7'; break;
+      case '[19~': key.name = 'f8'; break;
+      case '[20~': key.name = 'f9'; break;
+      case '[21~': key.name = 'f10'; break;
+      case '[23~': key.name = 'f11'; break;
+      case '[24~': key.name = 'f12'; break;
+
+      /* xterm ESC [ letter */
+      case '[A': key.name = 'up'; break;
+      case '[B': key.name = 'down'; break;
+      case '[C': key.name = 'right'; break;
+      case '[D': key.name = 'left'; break;
+      case '[E': key.name = 'clear'; break;
+      case '[F': key.name = 'end'; break;
+      case '[H': key.name = 'home'; break;
+
+      /* xterm/gnome ESC O letter */
+      case 'OA': key.name = 'up'; break;
+      case 'OB': key.name = 'down'; break;
+      case 'OC': key.name = 'right'; break;
+      case 'OD': key.name = 'left'; break;
+      case 'OE': key.name = 'clear'; break;
+      case 'OF': key.name = 'end'; break;
+      case 'OH': key.name = 'home'; break;
+
+      /* xterm/rxvt ESC [ number ~ */
+      case '[1~': key.name = 'home'; break;
+      case '[2~': key.name = 'insert'; break;
+      case '[3~': key.name = 'delete'; break;
+      case '[4~': key.name = 'end'; break;
+      case '[5~': key.name = 'pageup'; break;
+      case '[6~': key.name = 'pagedown'; break;
+
+      /* putty */
+      case '[[5~': key.name = 'pageup'; break;
+      case '[[6~': key.name = 'pagedown'; break;
+
+      /* rxvt */
+      case '[7~': key.name = 'home'; break;
+      case '[8~': key.name = 'end'; break;
+
+      /* rxvt keys with modifiers */
+      case '[a': key.name = 'up'; key.shift = true; break;
+      case '[b': key.name = 'down'; key.shift = true; break;
+      case '[c': key.name = 'right'; key.shift = true; break;
+      case '[d': key.name = 'left'; key.shift = true; break;
+      case '[e': key.name = 'clear'; key.shift = true; break;
+
+      case '[2$': key.name = 'insert'; key.shift = true; break;
+      case '[3$': key.name = 'delete'; key.shift = true; break;
+      case '[5$': key.name = 'pageup'; key.shift = true; break;
+      case '[6$': key.name = 'pagedown'; key.shift = true; break;
+      case '[7$': key.name = 'home'; key.shift = true; break;
+      case '[8$': key.name = 'end'; key.shift = true; break;
+
+      case 'Oa': key.name = 'up'; key.ctrl = true; break;
+      case 'Ob': key.name = 'down'; key.ctrl = true; break;
+      case 'Oc': key.name = 'right'; key.ctrl = true; break;
+      case 'Od': key.name = 'left'; key.ctrl = true; break;
+      case 'Oe': key.name = 'clear'; key.ctrl = true; break;
+
+      case '[2^': key.name = 'insert'; key.ctrl = true; break;
+      case '[3^': key.name = 'delete'; key.ctrl = true; break;
+      case '[5^': key.name = 'pageup'; key.ctrl = true; break;
+      case '[6^': key.name = 'pagedown'; key.ctrl = true; break;
+      case '[7^': key.name = 'home'; key.ctrl = true; break;
+      case '[8^': key.name = 'end'; key.ctrl = true; break;
+
+      /* misc. */
+      case '[Z': key.name = 'tab'; key.shift = true; break;
+      default: key.name = 'undefined'; break;
+
+    }
+  } else if (s.length > 1 && s[0] !== '\x1b') {
+    // Got a longer-than-one string of characters.
+    // Probably a paste, since it wasn't a control sequence.
+    Array.prototype.forEach.call(s, function(c) {
+      emitKey(stream, c);
+    });
+    return;
+  }
+
+  if (key.code == '[M') {
+    key.name = 'mouse';
+    var s = key.sequence;
+    var b = s.charCodeAt(3);
+    key.x = s.charCodeAt(4) - 040;
+    key.y = s.charCodeAt(5) - 040;
+
+    key.scroll = 0;
+
+    key.ctrl  = !!(1<<4 & b);
+    key.meta  = !!(1<<3 & b);
+    key.shift = !!(1<<2 & b);
+
+    key.release = (3 & b) === 3;
+
+    if (1<<6 & b) { //scroll
+      key.scroll = 1 & b ? 1 : -1;
+    }
+
+    if (!key.release && !key.scroll) {
+      key.button = b & 3;
+    }
+  }
+
+  // Don't emit a key if no name was found
+  if (key.name === undefined) {
+    key = undefined;
+  }
+
+  if (s.length === 1) {
+    ch = s;
+  }
+
+  if (key && key.name == 'mouse') {
+    stream.emit('mousepress', key)
+  } else if (key || ch) {
+    stream.emit('keypress', ch, key);
+  }
+}

File diff suppressed because it is too large
+ 23 - 0
node_modules/grunt-contrib-cssmin/node_modules/clean-css/node_modules/commander/node_modules/keypress/package.json


+ 28 - 0
node_modules/grunt-contrib-cssmin/node_modules/clean-css/node_modules/commander/node_modules/keypress/test.js

@@ -0,0 +1,28 @@
+
+var keypress = require('./')
+keypress(process.stdin)
+
+if (process.stdin.setRawMode)
+  process.stdin.setRawMode(true)
+else
+  require('tty').setRawMode(true)
+
+process.stdin.on('keypress', function (c, key) {
+  console.log(0, c, key)
+  if (key && key.ctrl && key.name == 'c') {
+    process.stdin.pause()
+  }
+})
+process.stdin.on('mousepress', function (mouse) {
+  console.log(mouse)
+})
+
+keypress.enableMouse(process.stdout)
+process.on('exit', function () {
+  //disable mouse on exit, so that the state is back to normal
+  //for the terminal.
+  keypress.disableMouse(process.stdout)
+})
+
+process.stdin.resume()
+

File diff suppressed because it is too large
+ 32 - 0
node_modules/grunt-contrib-cssmin/node_modules/clean-css/node_modules/commander/package.json


File diff suppressed because it is too large
+ 43 - 0
node_modules/grunt-contrib-cssmin/node_modules/clean-css/package.json


+ 1 - 0
node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/.gitattributes

@@ -0,0 +1 @@
+* text=auto

+ 14 - 0
node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/.jshintrc

@@ -0,0 +1,14 @@
+{
+  "curly": true,
+  "eqeqeq": true,
+  "immed": true,
+  "latedef": true,
+  "newcap": true,
+  "noarg": true,
+  "sub": true,
+  "undef": true,
+  "boss": true,
+  "eqnull": true,
+  "node": true,
+  "es5": true
+}

+ 3 - 0
node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/.npmignore

@@ -0,0 +1,3 @@
+node_modules
+npm-debug.log
+tmp

+ 6 - 0
node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/.travis.yml

@@ -0,0 +1,6 @@
+language: node_js
+node_js:
+  - "0.8"
+  - "0.10"
+before_install:
+  - npm install -g grunt-cli

+ 4 - 0
node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/AUTHORS

@@ -0,0 +1,4 @@
+Tyler Kellen (http://goingslowly.com/)
+Chris Talkington (http://christalkington.com/)
+Larry Davis (http://lazd.net/)
+Sindre Sorhus (http://sindresorhus.com)

+ 47 - 0
node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/CHANGELOG

@@ -0,0 +1,47 @@
+v0.6.1:
+  date: 2013-03-24
+  changes:
+    - Add formatForType option
+v0.6.0:
+  date: 2013-03-14
+  changes:
+    - Change API/reportying style for minMaxInfo
+v0.5.3:
+  date: 2013-02-23
+  changes:
+    - use MIT licensed zlib-browserify instead of unlicensed gzip-js
+v0.5.2:
+  date: 2013-01-24
+  changes:
+    - add minMaxGzip & minMaxInfo.
+v0.5.0:
+  date: 2012-12-05
+  changes:
+    - remove findBasePath, buildIndividualDest and isIndividualDest.
+    - remove options and normalizeMultiTaskFiles.
+    - remove node v0.6 and grunt v0.3 support.
+v0.4.0:
+  date: 2012-11-20
+  changes:
+    - findBasePath returns '' if passed false.
+    - Added stripPath.
+v0.3.1:
+  date: 2012-10-29
+  changes:
+    - Tweaked findBasePath to handle single dot differently.
+    - Start testing with Travis.
+    - Docs cleanup.
+v0.3.0:
+  date: 2012-09-24
+  changes:
+    - Added findBasePath, buildIndividualDest, isIndividualDest, optsToArgs.
+    - Refactored tests.
+    - Automatically parse templates in options.
+v0.2.1:
+  date: 2012-09-14
+  changes:
+    - Added non-destuctive namespace declarations.
+v0.2.0:
+  date: 2012-09-10
+  changes:
+    - Refactored from grunt-contrib into individual repo.

+ 60 - 0
node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/Gruntfile.js

@@ -0,0 +1,60 @@
+/*
+ * grunt-lib-contrib
+ * http://gruntjs.com/
+ *
+ * Copyright (c) 2012 Tyler Kellen, contributors
+ * Licensed under the MIT license.
+ */
+
+module.exports = function(grunt) {
+  'use strict';
+
+  // Project configuration.
+  grunt.initConfig({
+    jshint: {
+      all: [
+        'Gruntfile.js',
+        'lib/*.js',
+        '<%= nodeunit.tests %>'
+      ],
+      options: {
+        jshintrc: '.jshintrc'
+      }
+    },
+
+    test_vars: {
+      source: 'source/'
+    },
+
+    test_task: {
+      options: {
+        param: 'task',
+        param2: 'task',
+        template: '<%= test_vars.source %>',
+        data: {
+          template: ['<%= test_vars.source %>']
+        }
+      },
+      target: {
+        options: {
+          param: 'target'
+        }
+      }
+    },
+
+    // Unit tests.
+    nodeunit: {
+      tests: ['test/*_test.js']
+    }
+  });
+
+  // These plugins provide necessary tasks.
+  grunt.loadNpmTasks('grunt-contrib-jshint');
+  grunt.loadNpmTasks('grunt-contrib-nodeunit');
+
+  // Whenever the "test" task is run, then test the result.
+  grunt.registerTask('test', ['nodeunit']);
+
+  // By default, lint and run all tests.
+  grunt.registerTask('default', ['jshint', 'test']);
+};

+ 22 - 0
node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/LICENSE-MIT

@@ -0,0 +1,22 @@
+Copyright (c) 2012 Tyler Kellen, contributors
+
+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.

+ 65 - 0
node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/README.md

@@ -0,0 +1,65 @@
+# grunt-lib-contrib [![Build Status](https://secure.travis-ci.org/gruntjs/grunt-lib-contrib.png?branch=master)](http://travis-ci.org/gruntjs/grunt-lib-contrib)
+
+> Common functionality shared across grunt-contrib tasks.
+
+The purpose of grunt-lib-contrib is to explore solutions to common problems task writers encounter, and to ease the upgrade path for contrib tasks.
+
+**These APIs should be considered highly unstable. Depend on them at your own risk!**
+
+_Over time, some of the functionality provided here may be incorporated directly into grunt for mainstream use. Until then, you may require `grunt-lib-contrib` as a dependency in your projects, but be very careful to specify an exact version number instead of a range, as backwards-incompatible changes are likely to be introduced._
+
+### Helper Functions
+
+#### getNamespaceDeclaration(ns)
+
+This helper is used to build JS namespace declarations.
+
+#### optsToArgs(options)
+
+Convert an object to an array of CLI arguments, which can be used with `child_process.spawn()`.
+
+```js
+// Example
+{
+  fooBar: 'a',        // ['--foo-bar', 'a']
+  fooBar: 1,          // ['--foo-bar', '1']
+  fooBar: true,       // ['--foo-bar']
+  fooBar: false,      //
+  fooBar: ['a', 'b']  // ['--foo-bar', 'a', '--foo-bar', 'b']
+}
+```
+
+#### stripPath(pth, strip)
+
+Strip a path from a path. normalize both paths for best results.
+
+#### minMaxInfo(min, max, report)
+
+Helper for logging compressed, uncompressed and gzipped sizes of strings.
+
+#### report
+Choices: `false`, `'min'`, `'gzip'`
+Default: `false`
+
+Either do not report anything, report only minification result, or report minification and gzip results.
+
+**Important** Including `'gzip'` results can make this task 5-10x slower depending on the size of the file.
+
+
+```js
+var max = grunt.file.read('max.js');
+var min = minify(max);
+minMaxInfo(min, max, 'gzip');
+```
+
+Would print:
+
+```
+Original: 495 bytes.
+Minified: 396 bytes.
+Gzipped: 36 bytes.
+```
+
+--
+
+*Lib submitted by [Tyler Kellen](https://goingslowly.com/).*

+ 111 - 0
node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/lib/contrib.js

@@ -0,0 +1,111 @@
+/*
+ * grunt-lib-contrib
+ * http://gruntjs.com/
+ *
+ * Copyright (c) 2012 Tyler Kellen, contributors
+ * Licensed under the MIT license.
+ */
+
+exports.init = function(grunt) {
+  'use strict';
+
+  var exports = {};
+
+  var path = require('path');
+
+  exports.getNamespaceDeclaration = function(ns) {
+    var output = [];
+    var curPath = 'this';
+    if (ns !== 'this') {
+      var nsParts = ns.split('.');
+      nsParts.forEach(function(curPart, index) {
+        if (curPart !== 'this') {
+          curPath += '[' + JSON.stringify(curPart) + ']';
+          output.push(curPath + ' = ' + curPath + ' || {};');
+        }
+      });
+    }
+
+    return {
+      namespace: curPath,
+      declaration: output.join('\n')
+    };
+  };
+
+  // Convert an object to an array of CLI arguments
+  exports.optsToArgs = function(options) {
+    var args = [];
+
+    Object.keys(options).forEach(function(flag) {
+      var val = options[flag];
+
+      flag = flag.replace(/[A-Z]/g, function(match) {
+        return '-' + match.toLowerCase();
+      });
+
+      if (val === true) {
+        args.push('--' + flag);
+      }
+
+      if (grunt.util._.isString(val)) {
+        args.push('--' + flag, val);
+      }
+
+      if (grunt.util._.isNumber(val)) {
+        args.push('--' + flag, '' + val);
+      }
+
+      if (grunt.util._.isArray(val)) {
+        val.forEach(function(arrVal) {
+          args.push('--' + flag, arrVal);
+        });
+      }
+    });
+
+    return args;
+  };
+
+  // Strip a path from a path. normalize both paths for best results.
+  exports.stripPath = function(pth, strip) {
+    if (strip && strip.length >= 1) {
+      strip = path.normalize(strip);
+      pth = path.normalize(pth);
+      pth = grunt.util._(pth).strRight(strip);
+      pth = grunt.util._(pth).ltrim(path.sep);
+    }
+
+    return pth;
+  };
+
+  // Log min and max info
+  function gzipSize(src) {
+    return src ? require('zlib-browserify').gzipSync(src).length : 0;
+  }
+  exports.minMaxInfo = function(min, max, report) {
+    if (report === 'min' || report === 'gzip') {
+      grunt.log.writeln('Original: ' + String(max.length).green + ' bytes.');
+      grunt.log.writeln('Minified: ' + String(min.length).green + ' bytes.');
+    }
+    if (report === 'gzip') {
+      // Note this option is pretty slow so it is not enabled by default
+      grunt.log.write('Gzipped:  ');
+      grunt.log.writeln(String(gzipSize(min)).green + ' bytes.');
+    }
+  };
+
+  exports.formatForType = function(string, type, namespace, filename) {
+    namespace = namespace || false;
+
+    if (type === 'amd' && namespace === false) {
+      string = 'return ' + string;
+    } else if (type === 'commonjs' && namespace === false) {
+      string = 'module.exports = ' + string;
+    } else if (type === 'amd' && namespace !== false || type === 'commonjs' && namespace !== false || type === 'js' && namespace !== false) {
+      string = namespace+'['+JSON.stringify(filename)+'] = '+string+';';
+    }
+
+    return string;
+  };
+
+  return exports;
+};

+ 1 - 0
node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/node_modules/zlib-browserify/.npmignore

@@ -0,0 +1 @@
+node_modules

+ 43 - 0
node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/node_modules/zlib-browserify/index.js

@@ -0,0 +1,43 @@
+const Zlib = module.exports = require('./zlib');
+
+// the least I can do is make error messages for the rest of the node.js/zlib api.
+// (thanks, dominictarr)
+function error () {
+  var m = [].slice.call(arguments).join(' ')
+  throw new Error([
+    m,
+    'we accept pull requests',
+    'http://github.com/brianloveswords/zlib-browserify'
+    ].join('\n'))
+}
+
+;['createGzip'
+, 'createGunzip'
+, 'createDeflate'
+, 'createDeflateRaw'
+, 'createInflate'
+, 'createInflateRaw'
+, 'createUnzip'
+, 'Gzip'
+, 'Gunzip'
+, 'Inflate'
+, 'InflateRaw'
+, 'Deflate'
+, 'DeflateRaw'
+, 'Unzip'
+, 'inflateRaw'
+, 'deflateRaw'].forEach(function (name) {
+  Zlib[name] = function () {
+    error('sorry,', name, 'is not implemented yet')
+  }
+});
+
+const _deflate = Zlib.deflate;
+const _gzip = Zlib.gzip;
+
+Zlib.deflate = function deflate(stringOrBuffer, callback) {
+  return _deflate(Buffer(stringOrBuffer), callback);
+};
+Zlib.gzip = function gzip(stringOrBuffer, callback) {
+  return _gzip(Buffer(stringOrBuffer), callback);
+};

+ 33 - 0
node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/node_modules/zlib-browserify/package.json

@@ -0,0 +1,33 @@
+{
+  "name": "zlib-browserify",
+  "version": "0.0.1",
+  "description": "Wrapper for zlib.js to allow for browserifyication",
+  "main": "index.js",
+  "directories": {
+    "test": "test"
+  },
+  "dependencies": {},
+  "devDependencies": {
+    "tap": "~0.3.3"
+  },
+  "scripts": {
+    "test": "./node_modules/tap test/*.test.js"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/brianloveswords/zlib-browserify.git"
+  },
+  "keywords": [
+    "zlib",
+    "browserify"
+  ],
+  "author": {
+    "name": "Brian J. Brennan"
+  },
+  "license": "MIT",
+  "gitHead": "4be9419f0e8e9dec9629c8a538b33a4efd7df17b",
+  "readmeFilename": "readme.md",
+  "readme": "Zlib in yo' browser.\n",
+  "_id": "[email protected]",
+  "_from": "[email protected]"
+}

+ 1 - 0
node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/node_modules/zlib-browserify/readme.md

@@ -0,0 +1 @@
+Zlib in yo' browser.

+ 65 - 0
node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/node_modules/zlib-browserify/test/zlib.test.js

@@ -0,0 +1,65 @@
+const test = require('tap').test;
+const zlibA = require('zlib');
+const zlibB = require('..');
+const crypto = require('crypto');
+
+test('zlibA.deflate -> zlibB.inflate', function (t) {
+  const expect = crypto.randomBytes(1024);
+  zlibA.deflate(expect, function (err, cmpA) {
+    zlibB.inflate(cmpA, function (err, result) {
+      t.same(result, expect, 'should match');
+      t.end();
+    });
+  });
+});
+
+test('zlibB.deflate -> zlibA.inflate', function (t) {
+  const expect = crypto.randomBytes(1024);
+  zlibB.deflate(expect, function (err, cmpA) {
+    zlibA.inflate(cmpA, function (err, result) {
+      t.same(result, expect, 'should match');
+      t.end();
+    });
+  });
+});
+
+test('zlibB.deflate -> zlibA.inflate (string)', function (t) {
+  const expect = 'ohaihihihihihihihihihihihihihihihi';
+  zlibB.deflate(expect, function (err, cmpA) {
+    zlibA.inflate(cmpA, function (err, result) {
+      t.same(result.toString(), expect, 'should match');
+      t.end();
+    });
+  });
+});
+
+test('zlibA.gzip -> zlibB.gunzip', function (t) {
+  const expect = crypto.randomBytes(1024);
+  zlibA.gzip(expect, function (err, cmpA) {
+    zlibB.gunzip(cmpA, function (err, result) {
+      t.same(result, expect, 'should match');
+      t.end();
+    });
+  });
+});
+
+test('zlibB.gzip -> zlibA.gunzip', function (t) {
+  const expect = crypto.randomBytes(1024);
+  zlibB.gzip(expect, function (err, cmpA) {
+    zlibA.gunzip(cmpA, function (err, result) {
+      t.same(result, expect, 'should match');
+      t.end();
+    });
+  });
+});
+
+test('zlibB.gzip -> zlibA.gunzip', function (t) {
+  const expect = 'lololololoollolololoololololololololololololololololololololol';
+  zlibB.gzip(expect, function (err, cmpA) {
+    zlibA.gunzip(cmpA, function (err, result) {
+      t.same(result.toString(), expect, 'should match');
+      t.end();
+    });
+  });
+});
+

+ 55 - 0
node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/node_modules/zlib-browserify/zlib.js

@@ -0,0 +1,55 @@
+/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */
+(function() {'use strict';function m(c){throw c;}var r=void 0,u=!0;var B="undefined"!==typeof Uint8Array&&"undefined"!==typeof Uint16Array&&"undefined"!==typeof Uint32Array;function aa(c){if("string"===typeof c){var a=c.split(""),b,e;b=0;for(e=a.length;b<e;b++)a[b]=(a[b].charCodeAt(0)&255)>>>0;c=a}for(var f=1,d=0,g=c.length,h,j=0;0<g;){h=1024<g?1024:g;g-=h;do f+=c[j++],d+=f;while(--h);f%=65521;d%=65521}return(d<<16|f)>>>0};function I(c,a){this.index="number"===typeof a?a:0;this.n=0;this.buffer=c instanceof(B?Uint8Array:Array)?c:new (B?Uint8Array:Array)(32768);2*this.buffer.length<=this.index&&m(Error("invalid index"));this.buffer.length<=this.index&&this.f()}I.prototype.f=function(){var c=this.buffer,a,b=c.length,e=new (B?Uint8Array:Array)(b<<1);if(B)e.set(c);else for(a=0;a<b;++a)e[a]=c[a];return this.buffer=e};
+I.prototype.d=function(c,a,b){var e=this.buffer,f=this.index,d=this.n,g=e[f],h;b&&1<a&&(c=8<a?(K[c&255]<<24|K[c>>>8&255]<<16|K[c>>>16&255]<<8|K[c>>>24&255])>>32-a:K[c]>>8-a);if(8>a+d)g=g<<a|c,d+=a;else for(h=0;h<a;++h)g=g<<1|c>>a-h-1&1,8===++d&&(d=0,e[f++]=K[g],g=0,f===e.length&&(e=this.f()));e[f]=g;this.buffer=e;this.n=d;this.index=f};I.prototype.finish=function(){var c=this.buffer,a=this.index,b;0<this.n&&(c[a]<<=8-this.n,c[a]=K[c[a]],a++);B?b=c.subarray(0,a):(c.length=a,b=c);return b};
+var ba=new (B?Uint8Array:Array)(256),Q;for(Q=0;256>Q;++Q){for(var R=Q,ga=R,ha=7,R=R>>>1;R;R>>>=1)ga<<=1,ga|=R&1,--ha;ba[Q]=(ga<<ha&255)>>>0}var K=ba;var S={k:function(c,a,b){return S.update(c,0,a,b)},update:function(c,a,b,e){for(var f=S.L,d="number"===typeof b?b:b=0,g="number"===typeof e?e:c.length,a=a^4294967295,d=g&7;d--;++b)a=a>>>8^f[(a^c[b])&255];for(d=g>>3;d--;b+=8)a=a>>>8^f[(a^c[b])&255],a=a>>>8^f[(a^c[b+1])&255],a=a>>>8^f[(a^c[b+2])&255],a=a>>>8^f[(a^c[b+3])&255],a=a>>>8^f[(a^c[b+4])&255],a=a>>>8^f[(a^c[b+5])&255],a=a>>>8^f[(a^c[b+6])&255],a=a>>>8^f[(a^c[b+7])&255];return(a^4294967295)>>>0}},ia=S,ja,ka=[0,1996959894,3993919788,2567524794,
+124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,
+3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,
+2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,
+2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,
+2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918E3,2847714899,3736837829,1202900863,
+817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];ja=B?new Uint32Array(ka):ka;ia.L=ja;function na(){};function oa(c){this.buffer=new (B?Uint16Array:Array)(2*c);this.length=0}oa.prototype.getParent=function(c){return 2*((c-2)/4|0)};oa.prototype.push=function(c,a){var b,e,f=this.buffer,d;b=this.length;f[this.length++]=a;for(f[this.length++]=c;0<b;)if(e=this.getParent(b),f[b]>f[e])d=f[b],f[b]=f[e],f[e]=d,d=f[b+1],f[b+1]=f[e+1],f[e+1]=d,b=e;else break;return this.length};
+oa.prototype.pop=function(){var c,a,b=this.buffer,e,f,d;a=b[0];c=b[1];this.length-=2;b[0]=b[this.length];b[1]=b[this.length+1];for(d=0;;){f=2*d+2;if(f>=this.length)break;f+2<this.length&&b[f+2]>b[f]&&(f+=2);if(b[f]>b[d])e=b[d],b[d]=b[f],b[f]=e,e=b[d+1],b[d+1]=b[f+1],b[f+1]=e;else break;d=f}return{index:c,value:a,length:this.length}};function T(c){var a=c.length,b=0,e=Number.POSITIVE_INFINITY,f,d,g,h,j,i,q,l,k;for(l=0;l<a;++l)c[l]>b&&(b=c[l]),c[l]<e&&(e=c[l]);f=1<<b;d=new (B?Uint32Array:Array)(f);g=1;h=0;for(j=2;g<=b;){for(l=0;l<a;++l)if(c[l]===g){i=0;q=h;for(k=0;k<g;++k)i=i<<1|q&1,q>>=1;for(k=i;k<f;k+=j)d[k]=g<<16|l;++h}++g;h<<=1;j<<=1}return[d,b,e]};function pa(c,a){this.l=qa;this.F=0;this.input=c;this.b=0;a&&(a.lazy&&(this.F=a.lazy),"number"===typeof a.compressionType&&(this.l=a.compressionType),a.outputBuffer&&(this.a=B&&a.outputBuffer instanceof Array?new Uint8Array(a.outputBuffer):a.outputBuffer),"number"===typeof a.outputIndex&&(this.b=a.outputIndex));this.a||(this.a=new (B?Uint8Array:Array)(32768))}var qa=2,ra={NONE:0,K:1,u:qa,W:3},sa=[],U;
+for(U=0;288>U;U++)switch(u){case 143>=U:sa.push([U+48,8]);break;case 255>=U:sa.push([U-144+400,9]);break;case 279>=U:sa.push([U-256+0,7]);break;case 287>=U:sa.push([U-280+192,8]);break;default:m("invalid literal: "+U)}
+pa.prototype.h=function(){var c,a,b,e,f=this.input;switch(this.l){case 0:b=0;for(e=f.length;b<e;){a=B?f.subarray(b,b+65535):f.slice(b,b+65535);b+=a.length;var d=a,g=b===e,h=r,j=r,i=r,q=r,l=r,k=this.a,p=this.b;if(B){for(k=new Uint8Array(this.a.buffer);k.length<=p+d.length+5;)k=new Uint8Array(k.length<<1);k.set(this.a)}h=g?1:0;k[p++]=h|0;j=d.length;i=~j+65536&65535;k[p++]=j&255;k[p++]=j>>>8&255;k[p++]=i&255;k[p++]=i>>>8&255;if(B)k.set(d,p),p+=d.length,k=k.subarray(0,p);else{q=0;for(l=d.length;q<l;++q)k[p++]=
+d[q];k.length=p}this.b=p;this.a=k}break;case 1:var t=new I(new Uint8Array(this.a.buffer),this.b);t.d(1,1,u);t.d(1,2,u);var v=ta(this,f),x,F,w;x=0;for(F=v.length;x<F;x++)if(w=v[x],I.prototype.d.apply(t,sa[w]),256<w)t.d(v[++x],v[++x],u),t.d(v[++x],5),t.d(v[++x],v[++x],u);else if(256===w)break;this.a=t.finish();this.b=this.a.length;break;case qa:var A=new I(new Uint8Array(this.a),this.b),C,n,s,E,D,ca=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],V,La,da,Ma,la,va=Array(19),Na,Z,ma,G,Oa;C=qa;A.d(1,
+1,u);A.d(C,2,u);n=ta(this,f);V=ua(this.T,15);La=wa(V);da=ua(this.S,7);Ma=wa(da);for(s=286;257<s&&0===V[s-1];s--);for(E=30;1<E&&0===da[E-1];E--);var Pa=s,Qa=E,M=new (B?Uint32Array:Array)(Pa+Qa),y,N,z,ea,L=new (B?Uint32Array:Array)(316),J,H,O=new (B?Uint8Array:Array)(19);for(y=N=0;y<Pa;y++)M[N++]=V[y];for(y=0;y<Qa;y++)M[N++]=da[y];if(!B){y=0;for(ea=O.length;y<ea;++y)O[y]=0}y=J=0;for(ea=M.length;y<ea;y+=N){for(N=1;y+N<ea&&M[y+N]===M[y];++N);z=N;if(0===M[y])if(3>z)for(;0<z--;)L[J++]=0,O[0]++;else for(;0<
+z;)H=138>z?z:138,H>z-3&&H<z&&(H=z-3),10>=H?(L[J++]=17,L[J++]=H-3,O[17]++):(L[J++]=18,L[J++]=H-11,O[18]++),z-=H;else if(L[J++]=M[y],O[M[y]]++,z--,3>z)for(;0<z--;)L[J++]=M[y],O[M[y]]++;else for(;0<z;)H=6>z?z:6,H>z-3&&H<z&&(H=z-3),L[J++]=16,L[J++]=H-3,O[16]++,z-=H}c=B?L.subarray(0,J):L.slice(0,J);la=ua(O,7);for(G=0;19>G;G++)va[G]=la[ca[G]];for(D=19;4<D&&0===va[D-1];D--);Na=wa(la);A.d(s-257,5,u);A.d(E-1,5,u);A.d(D-4,4,u);for(G=0;G<D;G++)A.d(va[G],3,u);G=0;for(Oa=c.length;G<Oa;G++)if(Z=c[G],A.d(Na[Z],
+la[Z],u),16<=Z){G++;switch(Z){case 16:ma=2;break;case 17:ma=3;break;case 18:ma=7;break;default:m("invalid code: "+Z)}A.d(c[G],ma,u)}var Ra=[La,V],Sa=[Ma,da],P,Ta,fa,ya,Ua,Va,Wa,Xa;Ua=Ra[0];Va=Ra[1];Wa=Sa[0];Xa=Sa[1];P=0;for(Ta=n.length;P<Ta;++P)if(fa=n[P],A.d(Ua[fa],Va[fa],u),256<fa)A.d(n[++P],n[++P],u),ya=n[++P],A.d(Wa[ya],Xa[ya],u),A.d(n[++P],n[++P],u);else if(256===fa)break;this.a=A.finish();this.b=this.a.length;break;default:m("invalid compression type")}return this.a};
+function xa(c,a){this.length=c;this.N=a}
+function za(){var c=Aa;switch(u){case 3===c:return[257,c-3,0];case 4===c:return[258,c-4,0];case 5===c:return[259,c-5,0];case 6===c:return[260,c-6,0];case 7===c:return[261,c-7,0];case 8===c:return[262,c-8,0];case 9===c:return[263,c-9,0];case 10===c:return[264,c-10,0];case 12>=c:return[265,c-11,1];case 14>=c:return[266,c-13,1];case 16>=c:return[267,c-15,1];case 18>=c:return[268,c-17,1];case 22>=c:return[269,c-19,2];case 26>=c:return[270,c-23,2];case 30>=c:return[271,c-27,2];case 34>=c:return[272,c-
+31,2];case 42>=c:return[273,c-35,3];case 50>=c:return[274,c-43,3];case 58>=c:return[275,c-51,3];case 66>=c:return[276,c-59,3];case 82>=c:return[277,c-67,4];case 98>=c:return[278,c-83,4];case 114>=c:return[279,c-99,4];case 130>=c:return[280,c-115,4];case 162>=c:return[281,c-131,5];case 194>=c:return[282,c-163,5];case 226>=c:return[283,c-195,5];case 257>=c:return[284,c-227,5];case 258===c:return[285,c-258,0];default:m("invalid length: "+c)}}var Ba=[],Aa,Ca;
+for(Aa=3;258>=Aa;Aa++)Ca=za(),Ba[Aa]=Ca[2]<<24|Ca[1]<<16|Ca[0];var Da=B?new Uint32Array(Ba):Ba;
+function ta(c,a){function b(a,c){var b=a.N,d=[],e=0,f;f=Da[a.length];d[e++]=f&65535;d[e++]=f>>16&255;d[e++]=f>>24;var g;switch(u){case 1===b:g=[0,b-1,0];break;case 2===b:g=[1,b-2,0];break;case 3===b:g=[2,b-3,0];break;case 4===b:g=[3,b-4,0];break;case 6>=b:g=[4,b-5,1];break;case 8>=b:g=[5,b-7,1];break;case 12>=b:g=[6,b-9,2];break;case 16>=b:g=[7,b-13,2];break;case 24>=b:g=[8,b-17,3];break;case 32>=b:g=[9,b-25,3];break;case 48>=b:g=[10,b-33,4];break;case 64>=b:g=[11,b-49,4];break;case 96>=b:g=[12,b-
+65,5];break;case 128>=b:g=[13,b-97,5];break;case 192>=b:g=[14,b-129,6];break;case 256>=b:g=[15,b-193,6];break;case 384>=b:g=[16,b-257,7];break;case 512>=b:g=[17,b-385,7];break;case 768>=b:g=[18,b-513,8];break;case 1024>=b:g=[19,b-769,8];break;case 1536>=b:g=[20,b-1025,9];break;case 2048>=b:g=[21,b-1537,9];break;case 3072>=b:g=[22,b-2049,10];break;case 4096>=b:g=[23,b-3073,10];break;case 6144>=b:g=[24,b-4097,11];break;case 8192>=b:g=[25,b-6145,11];break;case 12288>=b:g=[26,b-8193,12];break;case 16384>=
+b:g=[27,b-12289,12];break;case 24576>=b:g=[28,b-16385,13];break;case 32768>=b:g=[29,b-24577,13];break;default:m("invalid distance")}f=g;d[e++]=f[0];d[e++]=f[1];d[e++]=f[2];var h,i;h=0;for(i=d.length;h<i;++h)k[p++]=d[h];v[d[0]]++;x[d[3]]++;t=a.length+c-1;l=null}var e,f,d,g,h,j={},i,q,l,k=B?new Uint16Array(2*a.length):[],p=0,t=0,v=new (B?Uint32Array:Array)(286),x=new (B?Uint32Array:Array)(30),F=c.F,w;if(!B){for(d=0;285>=d;)v[d++]=0;for(d=0;29>=d;)x[d++]=0}v[256]=1;e=0;for(f=a.length;e<f;++e){d=h=0;
+for(g=3;d<g&&e+d!==f;++d)h=h<<8|a[e+d];j[h]===r&&(j[h]=[]);i=j[h];if(!(0<t--)){for(;0<i.length&&32768<e-i[0];)i.shift();if(e+3>=f){l&&b(l,-1);d=0;for(g=f-e;d<g;++d)w=a[e+d],k[p++]=w,++v[w];break}if(0<i.length){var A=r,C=r,n=0,s=r,E=r,D=r,ca=r,V=a.length,E=0,ca=i.length;a:for(;E<ca;E++){A=i[ca-E-1];s=3;if(3<n){for(D=n;3<D;D--)if(a[A+D-1]!==a[e+D-1])continue a;s=n}for(;258>s&&e+s<V&&a[A+s]===a[e+s];)++s;s>n&&(C=A,n=s);if(258===s)break}q=new xa(n,e-C);l?l.length<q.length?(w=a[e-1],k[p++]=w,++v[w],b(q,
+0)):b(l,-1):q.length<F?l=q:b(q,0)}else l?b(l,-1):(w=a[e],k[p++]=w,++v[w])}i.push(e)}k[p++]=256;v[256]++;c.T=v;c.S=x;return B?k.subarray(0,p):k}
+function ua(c,a){function b(a){var c=x[a][F[a]];c===l?(b(a+1),b(a+1)):--t[c];++F[a]}var e=c.length,f=new oa(572),d=new (B?Uint8Array:Array)(e),g,h,j,i,q;if(!B)for(i=0;i<e;i++)d[i]=0;for(i=0;i<e;++i)0<c[i]&&f.push(i,c[i]);g=Array(f.length/2);h=new (B?Uint32Array:Array)(f.length/2);if(1===g.length)return d[f.pop().index]=1,d;i=0;for(q=f.length/2;i<q;++i)g[i]=f.pop(),h[i]=g[i].value;var l=h.length,k=new (B?Uint16Array:Array)(a),p=new (B?Uint8Array:Array)(a),t=new (B?Uint8Array:Array)(l),v=Array(a),x=
+Array(a),F=Array(a),w=(1<<a)-l,A=1<<a-1,C,n,s,E,D;k[a-1]=l;for(n=0;n<a;++n)w<A?p[n]=0:(p[n]=1,w-=A),w<<=1,k[a-2-n]=(k[a-1-n]/2|0)+l;k[0]=p[0];v[0]=Array(k[0]);x[0]=Array(k[0]);for(n=1;n<a;++n)k[n]>2*k[n-1]+p[n]&&(k[n]=2*k[n-1]+p[n]),v[n]=Array(k[n]),x[n]=Array(k[n]);for(C=0;C<l;++C)t[C]=a;for(s=0;s<k[a-1];++s)v[a-1][s]=h[s],x[a-1][s]=s;for(C=0;C<a;++C)F[C]=0;1===p[a-1]&&(--t[0],++F[a-1]);for(n=a-2;0<=n;--n){E=C=0;D=F[n+1];for(s=0;s<k[n];s++)E=v[n+1][D]+v[n+1][D+1],E>h[C]?(v[n][s]=E,x[n][s]=l,D+=2):
+(v[n][s]=h[C],x[n][s]=C,++C);F[n]=0;1===p[n]&&b(n)}j=t;i=0;for(q=g.length;i<q;++i)d[g[i].index]=j[i];return d}function wa(c){var a=new (B?Uint16Array:Array)(c.length),b=[],e=[],f=0,d,g,h,j;d=0;for(g=c.length;d<g;d++)b[c[d]]=(b[c[d]]|0)+1;d=1;for(g=16;d<=g;d++)e[d]=f,f+=b[d]|0,f<<=1;d=0;for(g=c.length;d<g;d++){f=e[c[d]];e[c[d]]+=1;h=a[d]=0;for(j=c[d];h<j;h++)a[d]=a[d]<<1|f&1,f>>>=1}return a};function Ea(c,a){this.input=c;this.a=new (B?Uint8Array:Array)(32768);this.l=Fa.u;var b={},e;if((a||!(a={}))&&"number"===typeof a.compressionType)this.l=a.compressionType;for(e in a)b[e]=a[e];b.outputBuffer=this.a;this.H=new pa(this.input,b)}var Fa=ra;
+Ea.prototype.h=function(){var c,a,b,e,f,d,g,h=0;g=this.a;c=Ga;switch(c){case Ga:a=Math.LOG2E*Math.log(32768)-8;break;default:m(Error("invalid compression method"))}b=a<<4|c;g[h++]=b;switch(c){case Ga:switch(this.l){case Fa.NONE:f=0;break;case Fa.K:f=1;break;case Fa.u:f=2;break;default:m(Error("unsupported compression type"))}break;default:m(Error("invalid compression method"))}e=f<<6|0;g[h++]=e|31-(256*b+e)%31;d=aa(this.input);this.H.b=h;g=this.H.h();h=g.length;B&&(g=new Uint8Array(g.buffer),g.length<=
+h+4&&(this.a=new Uint8Array(g.length+4),this.a.set(g),g=this.a),g=g.subarray(0,h+4));g[h++]=d>>24&255;g[h++]=d>>16&255;g[h++]=d>>8&255;g[h++]=d&255;return g};function Ha(c,a){this.input=c;this.b=this.c=0;this.g={};a&&(a.flags&&(this.g=a.flags),"string"===typeof a.filename&&(this.filename=a.filename),"string"===typeof a.comment&&(this.comment=a.comment),a.deflateOptions&&(this.m=a.deflateOptions));this.m||(this.m={})}
+Ha.prototype.h=function(){var c,a,b,e,f,d,g,h,j=new (B?Uint8Array:Array)(32768),i=0,q=this.input,l=this.c,k=this.filename,p=this.comment;j[i++]=31;j[i++]=139;j[i++]=8;c=0;this.g.fname&&(c|=Ia);this.g.fcomment&&(c|=Ja);this.g.fhcrc&&(c|=Ka);j[i++]=c;a=(Date.now?Date.now():+new Date)/1E3|0;j[i++]=a&255;j[i++]=a>>>8&255;j[i++]=a>>>16&255;j[i++]=a>>>24&255;j[i++]=0;j[i++]=Ya;if(this.g.fname!==r){g=0;for(h=k.length;g<h;++g)d=k.charCodeAt(g),255<d&&(j[i++]=d>>>8&255),j[i++]=d&255;j[i++]=0}if(this.g.comment){g=
+0;for(h=p.length;g<h;++g)d=p.charCodeAt(g),255<d&&(j[i++]=d>>>8&255),j[i++]=d&255;j[i++]=0}this.g.fhcrc&&(b=S.k(j,0,i)&65535,j[i++]=b&255,j[i++]=b>>>8&255);this.m.outputBuffer=j;this.m.outputIndex=i;f=new pa(q,this.m);j=f.h();i=f.b;B&&(i+8>j.buffer.byteLength?(this.a=new Uint8Array(i+8),this.a.set(new Uint8Array(j.buffer)),j=this.a):j=new Uint8Array(j.buffer));e=S.k(q);j[i++]=e&255;j[i++]=e>>>8&255;j[i++]=e>>>16&255;j[i++]=e>>>24&255;h=q.length;j[i++]=h&255;j[i++]=h>>>8&255;j[i++]=h>>>16&255;j[i++]=
+h>>>24&255;this.c=l;B&&i<j.length&&(this.a=j=j.subarray(0,i));return j};var Ya=255,Ka=2,Ia=8,Ja=16;function W(c,a){this.p=[];this.q=32768;this.e=this.j=this.c=this.t=0;this.input=B?new Uint8Array(c):c;this.v=!1;this.r=Za;this.J=!1;if(a||!(a={}))a.index&&(this.c=a.index),a.bufferSize&&(this.q=a.bufferSize),a.bufferType&&(this.r=a.bufferType),a.resize&&(this.J=a.resize);switch(this.r){case $a:this.b=32768;this.a=new (B?Uint8Array:Array)(32768+this.q+258);break;case Za:this.b=0;this.a=new (B?Uint8Array:Array)(this.q);this.f=this.R;this.z=this.O;this.s=this.Q;break;default:m(Error("invalid inflate mode"))}}
+var $a=0,Za=1;
+W.prototype.i=function(){for(;!this.v;){var c=X(this,3);c&1&&(this.v=u);c>>>=1;switch(c){case 0:var a=this.input,b=this.c,e=this.a,f=this.b,d=r,g=r,h=r,j=e.length,i=r;this.e=this.j=0;d=a[b++];d===r&&m(Error("invalid uncompressed block header: LEN (first byte)"));g=d;d=a[b++];d===r&&m(Error("invalid uncompressed block header: LEN (second byte)"));g|=d<<8;d=a[b++];d===r&&m(Error("invalid uncompressed block header: NLEN (first byte)"));h=d;d=a[b++];d===r&&m(Error("invalid uncompressed block header: NLEN (second byte)"));h|=
+d<<8;g===~h&&m(Error("invalid uncompressed block header: length verify"));b+g>a.length&&m(Error("input buffer is broken"));switch(this.r){case $a:for(;f+g>e.length;){i=j-f;g-=i;if(B)e.set(a.subarray(b,b+i),f),f+=i,b+=i;else for(;i--;)e[f++]=a[b++];this.b=f;e=this.f();f=this.b}break;case Za:for(;f+g>e.length;)e=this.f({B:2});break;default:m(Error("invalid inflate mode"))}if(B)e.set(a.subarray(b,b+g),f),f+=g,b+=g;else for(;g--;)e[f++]=a[b++];this.c=b;this.b=f;this.a=e;break;case 1:this.s(ab,bb);break;
+case 2:cb(this);break;default:m(Error("unknown BTYPE: "+c))}}return this.z()};
+var db=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],eb=B?new Uint16Array(db):db,fb=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258],gb=B?new Uint16Array(fb):fb,hb=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0],ib=B?new Uint8Array(hb):hb,jb=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],kb=B?new Uint16Array(jb):jb,lb=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,
+10,11,11,12,12,13,13],mb=B?new Uint8Array(lb):lb,nb=new (B?Uint8Array:Array)(288),Y,ob;Y=0;for(ob=nb.length;Y<ob;++Y)nb[Y]=143>=Y?8:255>=Y?9:279>=Y?7:8;var ab=T(nb),pb=new (B?Uint8Array:Array)(30),qb,rb;qb=0;for(rb=pb.length;qb<rb;++qb)pb[qb]=5;var bb=T(pb);function X(c,a){for(var b=c.j,e=c.e,f=c.input,d=c.c,g;e<a;)g=f[d++],g===r&&m(Error("input buffer is broken")),b|=g<<e,e+=8;g=b&(1<<a)-1;c.j=b>>>a;c.e=e-a;c.c=d;return g}
+function sb(c,a){for(var b=c.j,e=c.e,f=c.input,d=c.c,g=a[0],h=a[1],j,i,q;e<h;)j=f[d++],j===r&&m(Error("input buffer is broken")),b|=j<<e,e+=8;i=g[b&(1<<h)-1];q=i>>>16;c.j=b>>q;c.e=e-q;c.c=d;return i&65535}
+function cb(c){function a(a,b,c){var d,f,e,g;for(g=0;g<a;)switch(d=sb(this,b),d){case 16:for(e=3+X(this,2);e--;)c[g++]=f;break;case 17:for(e=3+X(this,3);e--;)c[g++]=0;f=0;break;case 18:for(e=11+X(this,7);e--;)c[g++]=0;f=0;break;default:f=c[g++]=d}return c}var b=X(c,5)+257,e=X(c,5)+1,f=X(c,4)+4,d=new (B?Uint8Array:Array)(eb.length),g,h,j,i;for(i=0;i<f;++i)d[eb[i]]=X(c,3);g=T(d);h=new (B?Uint8Array:Array)(b);j=new (B?Uint8Array:Array)(e);c.s(T(a.call(c,b,g,h)),T(a.call(c,e,g,j)))}
+W.prototype.s=function(c,a){var b=this.a,e=this.b;this.A=c;for(var f=b.length-258,d,g,h,j;256!==(d=sb(this,c));)if(256>d)e>=f&&(this.b=e,b=this.f(),e=this.b),b[e++]=d;else{g=d-257;j=gb[g];0<ib[g]&&(j+=X(this,ib[g]));d=sb(this,a);h=kb[d];0<mb[d]&&(h+=X(this,mb[d]));e>=f&&(this.b=e,b=this.f(),e=this.b);for(;j--;)b[e]=b[e++-h]}for(;8<=this.e;)this.e-=8,this.c--;this.b=e};
+W.prototype.Q=function(c,a){var b=this.a,e=this.b;this.A=c;for(var f=b.length,d,g,h,j;256!==(d=sb(this,c));)if(256>d)e>=f&&(b=this.f(),f=b.length),b[e++]=d;else{g=d-257;j=gb[g];0<ib[g]&&(j+=X(this,ib[g]));d=sb(this,a);h=kb[d];0<mb[d]&&(h+=X(this,mb[d]));e+j>f&&(b=this.f(),f=b.length);for(;j--;)b[e]=b[e++-h]}for(;8<=this.e;)this.e-=8,this.c--;this.b=e};
+W.prototype.f=function(){var c=new (B?Uint8Array:Array)(this.b-32768),a=this.b-32768,b,e,f=this.a;if(B)c.set(f.subarray(32768,c.length));else{b=0;for(e=c.length;b<e;++b)c[b]=f[b+32768]}this.p.push(c);this.t+=c.length;if(B)f.set(f.subarray(a,a+32768));else for(b=0;32768>b;++b)f[b]=f[a+b];this.b=32768;return f};
+W.prototype.R=function(c){var a,b=this.input.length/this.c+1|0,e,f,d,g=this.input,h=this.a;c&&("number"===typeof c.B&&(b=c.B),"number"===typeof c.M&&(b+=c.M));2>b?(e=(g.length-this.c)/this.A[2],d=258*(e/2)|0,f=d<h.length?h.length+d:h.length<<1):f=h.length*b;B?(a=new Uint8Array(f),a.set(h)):a=h;return this.a=a};
+W.prototype.z=function(){var c=0,a=this.a,b=this.p,e,f=new (B?Uint8Array:Array)(this.t+(this.b-32768)),d,g,h,j;if(0===b.length)return B?this.a.subarray(32768,this.b):this.a.slice(32768,this.b);d=0;for(g=b.length;d<g;++d){e=b[d];h=0;for(j=e.length;h<j;++h)f[c++]=e[h]}d=32768;for(g=this.b;d<g;++d)f[c++]=a[d];this.p=[];return this.buffer=f};
+W.prototype.O=function(){var c,a=this.b;B?this.J?(c=new Uint8Array(a),c.set(this.a.subarray(0,a))):c=this.a.subarray(0,a):(this.a.length>a&&(this.a.length=a),c=this.a);return this.buffer=c};function tb(c){this.input=c;this.c=0;this.member=[]}
+tb.prototype.i=function(){for(var c=this.input.length;this.c<c;){var a=new na,b=r,e=r,f=r,d=r,g=r,h=r,j=r,i=r,q=r,l=this.input,k=this.c;a.C=l[k++];a.D=l[k++];(31!==a.C||139!==a.D)&&m(Error("invalid file signature:",a.C,a.D));a.w=l[k++];switch(a.w){case 8:break;default:m(Error("unknown compression method: "+a.w))}a.o=l[k++];i=l[k++]|l[k++]<<8|l[k++]<<16|l[k++]<<24;a.Z=new Date(1E3*i);a.aa=l[k++];a.$=l[k++];0<(a.o&4)&&(a.V=l[k++]|l[k++]<<8,k+=a.V);if(0<(a.o&Ia)){j=[];for(h=0;0<(g=l[k++]);)j[h++]=String.fromCharCode(g);
+a.name=j.join("")}if(0<(a.o&Ja)){j=[];for(h=0;0<(g=l[k++]);)j[h++]=String.fromCharCode(g);a.comment=j.join("")}0<(a.o&Ka)&&(a.P=S.k(l,0,k)&65535,a.P!==(l[k++]|l[k++]<<8)&&m(Error("invalid header crc16")));b=l[l.length-4]|l[l.length-3]<<8|l[l.length-2]<<16|l[l.length-1]<<24;l.length-k-4-4<512*b&&(d=b);e=new W(l,{index:k,bufferSize:d});a.data=f=e.i();k=e.c;a.X=q=(l[k++]|l[k++]<<8|l[k++]<<16|l[k++]<<24)>>>0;S.k(f)!==q&&m(Error("invalid CRC-32 checksum: 0x"+S.k(f).toString(16)+" / 0x"+q.toString(16)));
+a.Y=b=(l[k++]|l[k++]<<8|l[k++]<<16|l[k++]<<24)>>>0;(f.length&4294967295)!==b&&m(Error("invalid input size: "+(f.length&4294967295)+" / "+b));this.member.push(a);this.c=k}var p=this.member,t,v,x=0,F=0,w;t=0;for(v=p.length;t<v;++t)F+=p[t].data.length;if(B){w=new Uint8Array(F);for(t=0;t<v;++t)w.set(p[t].data,x),x+=p[t].data.length}else{w=[];for(t=0;t<v;++t)w[t]=p[t].data;w=Array.prototype.concat.apply([],w)}return w};function ub(c,a){var b,e;this.input=c;this.c=0;if(a||!(a={}))a.index&&(this.c=a.index),a.verify&&(this.U=a.verify);b=c[this.c++];e=c[this.c++];switch(b&15){case Ga:this.method=Ga;break;default:m(Error("unsupported compression method"))}0!==((b<<8)+e)%31&&m(Error("invalid fcheck flag:"+((b<<8)+e)%31));e&32&&m(Error("fdict flag is not supported"));this.I=new W(c,{index:this.c,bufferSize:a.bufferSize,bufferType:a.bufferType,resize:a.resize})}
+ub.prototype.i=function(){var c=this.input,a,b;a=this.I.i();this.c=this.I.c;this.U&&(b=(c[this.c++]<<24|c[this.c++]<<16|c[this.c++]<<8|c[this.c++])>>>0,b!==aa(a)&&m(Error("invalid adler-32 checksum")));return a};exports.deflate=vb;exports.deflateSync=wb;exports.inflate=xb;exports.inflateSync=yb;exports.gzip=zb;exports.gzipSync=Ab;exports.gunzip=Bb;exports.gunzipSync=Cb;function vb(c,a,b){process.nextTick(function(){var e,f;try{f=wb(c,b)}catch(d){e=d}a(e,f)})}function wb(c,a){var b;b=(new Ea(c)).h();a||(a={});return a.G?b:Db(b)}function xb(c,a,b){process.nextTick(function(){var e,f;try{f=yb(c,b)}catch(d){e=d}a(e,f)})}
+function yb(c,a){var b;c.subarray=c.slice;b=(new ub(c)).i();a||(a={});return a.noBuffer?b:Db(b)}function zb(c,a,b){process.nextTick(function(){var e,f;try{f=Ab(c,b)}catch(d){e=d}a(e,f)})}function Ab(c,a){var b;c.subarray=c.slice;b=(new Ha(c)).h();a||(a={});return a.G?b:Db(b)}function Bb(c,a,b){process.nextTick(function(){var e,f;try{f=Cb(c,b)}catch(d){e=d}a(e,f)})}function Cb(c,a){var b;c.subarray=c.slice;b=(new tb(c)).i();a||(a={});return a.G?b:Db(b)}
+function Db(c){var a=new Buffer(c.length),b,e;b=0;for(e=c.length;b<e;++b)a[b]=c[b];return a};var Eb=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];B&&new Uint16Array(Eb);var Fb=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258];B&&new Uint16Array(Fb);var Gb=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0];B&&new Uint8Array(Gb);var Hb=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577];B&&new Uint16Array(Hb);
+var Ib=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];B&&new Uint8Array(Ib);var Jb=new (B?Uint8Array:Array)(288),$,Kb;$=0;for(Kb=Jb.length;$<Kb;++$)Jb[$]=143>=$?8:255>=$?9:279>=$?7:8;T(Jb);var Lb=new (B?Uint8Array:Array)(30),Mb,Nb;Mb=0;for(Nb=Lb.length;Mb<Nb;++Mb)Lb[Mb]=5;T(Lb);var Ga=8;}).call(this);

File diff suppressed because it is too large
+ 55 - 0
node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/package.json


+ 233 - 0
node_modules/grunt-contrib-cssmin/node_modules/grunt-lib-contrib/test/lib_test.js

@@ -0,0 +1,233 @@
+var grunt = require('grunt');
+var helper = require('../lib/contrib.js').init(grunt);
+
+exports.lib = {
+  getNamespaceDeclaration: function(test) {
+    'use strict';
+
+    test.expect(10);
+
+    // Both test should result in this[JST]
+    var expected = {
+      namespace: 'this["JST"]',
+      declaration: 'this["JST"] = this["JST"] || {};'
+    };
+
+    var actual = helper.getNamespaceDeclaration("this.JST");
+    test.equal(expected.namespace, actual.namespace, 'namespace with square brackets incorrect');
+    test.equal(expected.declaration, actual.declaration, 'namespace declaration with square brackets incorrect');
+
+    actual = helper.getNamespaceDeclaration("JST");
+    test.equal(expected.namespace, actual.namespace, 'namespace with square brackets incorrect');
+    test.equal(expected.declaration, actual.declaration, 'namespace declaration with square brackets incorrect');
+
+    // Templates should be declared globally if this provided
+    expected = {
+      namespace: "this",
+      declaration: ""
+    };
+
+    actual = helper.getNamespaceDeclaration("this");
+    test.equal(expected.namespace, actual.namespace, 'namespace with square brackets incorrect');
+    test.equal(expected.declaration, actual.declaration, 'namespace declaration with square brackets incorrect');
+
+    // Nested namespace declaration
+    expected = {
+      namespace: 'this["GUI"]["Templates"]["Main"]',
+      declaration:  'this["GUI"] = this["GUI"] || {};\n' +
+                    'this["GUI"]["Templates"] = this["GUI"]["Templates"] || {};\n' +
+                    'this["GUI"]["Templates"]["Main"] = this["GUI"]["Templates"]["Main"] || {};'
+    };
+
+    actual = helper.getNamespaceDeclaration("GUI.Templates.Main");
+    test.equal(expected.namespace, actual.namespace, 'namespace incorrect');
+    test.equal(expected.declaration, actual.declaration, 'namespace declaration incorrect');
+
+    // Namespace that contains square brackets
+    expected = {
+      namespace: 'this["main"]["[test]"]["[test2]"]',
+      declaration: 'this["main"] = this["main"] || {};\n' +
+                   'this["main"]["[test]"] = this["main"]["[test]"] || {};\n' +
+                   'this["main"]["[test]"]["[test2]"] = this["main"]["[test]"]["[test2]"] || {};'
+    };
+
+    actual = helper.getNamespaceDeclaration("main.[test].[test2]");
+    test.equal(expected.namespace, actual.namespace, 'namespace with square brackets incorrect');
+    test.equal(expected.declaration, actual.declaration, 'namespace declaration with square brackets incorrect');
+
+    test.done();
+  },
+  optsToArgs: function(test) {
+    'use strict';
+
+    test.expect(1);
+
+    var fixture = {
+      key: 'a',
+      key2: 1,
+      key3: true,
+      key4: false,
+      key5: ['a', 'b']
+    };
+    var expected = ['--key', 'a', '--key2', '1', '--key3', '--key5', 'a', '--key5', 'b' ].toString();
+    var actual = helper.optsToArgs(fixture).toString();
+    test.equal(expected, actual, 'should convert object to array of CLI arguments');
+
+    test.done();
+  },
+  stripPath: function(test) {
+    'use strict';
+    var path = require('path');
+
+    test.expect(4);
+
+    var actual = helper.stripPath('path1/path2', 'path1');
+    var expected = 'path2';
+    test.equal(expected, actual, 'should strip path from a directory path and trim it.');
+
+    actual = helper.stripPath('path1/path2/path3/path4', 'path1/path2');
+    expected = path.normalize('path3/path4');
+    test.equal(expected, actual, 'should strip path from a directory path and trim it. (deep)');
+
+    actual = helper.stripPath('path1/file.ext', 'path1');
+    expected = 'file.ext';
+    test.equal(expected, actual, 'should strip path from a file path and trim it.');
+
+    actual = helper.stripPath('path1/path2/path3/path4/file.ext', 'path1/path2');
+    expected = path.normalize('path3/path4/file.ext');
+    test.equal(expected, actual, 'should strip path from a file path and trim it. (deep)');
+
+    test.done();
+  },
+  minMaxInfo: function(test) {
+    'use strict';
+    test.expect(3);
+
+    var max = new Array(100).join('blah ');
+    var min = max.replace(/\s+/g, '');
+
+    var actual;
+    var expected;
+
+    grunt.util.hooker.hook(grunt.log, 'writeln', {
+      pre: function(result) {
+        actual += grunt.log.uncolor(result) + grunt.util.linefeed;
+        return grunt.util.hooker.preempt();
+      }
+    });
+
+    grunt.util.hooker.hook(grunt.log, 'write', {
+      pre: function(result) {
+        actual += grunt.log.uncolor(result);
+        return grunt.util.hooker.preempt();
+      }
+    });
+
+
+    // No reporting option
+    actual = '';
+    expected = '';
+
+    helper.minMaxInfo(min, max);
+    test.equal(expected, actual, 'should not have reported min and max info.');
+
+    // Report minification results
+    actual = '';
+    expected = [
+      'Original: 495 bytes.',
+      'Minified: 396 bytes.'
+    ].join(grunt.util.linefeed) + grunt.util.linefeed;
+
+    helper.minMaxInfo(min, max, 'min');
+    test.equal(expected, actual, 'should have logged min and max info.');
+
+    // Report minification and gzip results
+    actual = '';
+    expected = [
+      'Original: 495 bytes.',
+      'Minified: 396 bytes.',
+      'Gzipped:  36 bytes.'
+    ].join(grunt.util.linefeed) + grunt.util.linefeed;
+
+    helper.minMaxInfo(min, max, 'gzip');
+    test.equal(expected, actual, 'should have logged min, max, gzip info.');
+
+    grunt.util.hooker.unhook(grunt.log, 'writeln');
+    grunt.util.hooker.unhook(grunt.log, 'write');
+    test.done();
+  },
+  formatToType: {
+    amd: function(test) {
+
+      'use strict';
+
+      test.expect(2);
+
+      var string = function () { };
+
+      var actual = helper.formatForType(string, 'amd', 'JST', 'test');
+      var expected = 'JST["test"] = function () { };';
+      test.equal(expected, actual, 'should format string to amd with namespace');
+
+      actual = helper.formatForType(string, 'amd');
+      expected = "return function () { }";
+      test.equal(expected, actual, 'should format string to amd');
+
+      test.done();
+    },
+    commonjs: function(test) {
+
+      'use strict';
+
+      test.expect(2);
+
+      var string = function () { };
+
+      var actual = helper.formatForType(string, 'commonjs', 'JST', 'test');
+      var expected = 'JST["test"] = function () { };';
+      test.equal(expected, actual, 'should format string to commonjs with namespace');
+
+      actual = helper.formatForType(string, 'commonjs');
+      expected = "module.exports = function () { }";
+      test.equal(expected, actual, 'should format string to commonjs');
+
+      test.done();
+    },
+    js: function(test) {
+
+      'use strict';
+
+      test.expect(2);
+
+      var string = function () { };
+
+      var actual = helper.formatForType(string, 'js', 'JST', 'test');
+      var expected = 'JST["test"] = function () { };';
+      test.equal(expected, actual, 'should format string to js with namespace');
+
+      actual = helper.formatForType(string, 'js');
+      expected = 'function () { }';
+      test.equal(expected, actual, 'should format string to js');
+
+      test.done();
+    },
+    html: function(test) {
+
+      'use strict';
+
+      test.expect(2);
+
+      var string = function () { };
+
+      var actual = helper.formatForType(string, 'html', 'JST', 'test');
+      var expected = 'function () { }';
+      test.equal(expected, actual, 'should format string to html with namespace');
+
+      actual = helper.formatForType(string, 'html');
+      expected = 'function () { }';
+      test.equal(expected, actual, 'should format string to html');
+
+      test.done();
+    }
+  }
+};

File diff suppressed because it is too large
+ 72 - 0
node_modules/grunt-contrib-cssmin/package.json


+ 61 - 0
node_modules/grunt-contrib-cssmin/tasks/cssmin.js

@@ -0,0 +1,61 @@
+/*
+ * grunt-contrib-cssmin
+ * http://gruntjs.com/
+ *
+ * Copyright (c) 2012 Tim Branyen, contributors
+ * Licensed under the MIT license.
+ */
+
+'use strict';
+
+module.exports = function(grunt) {
+  var helper = require('grunt-lib-contrib').init(grunt);
+  var path = require('path');
+
+  grunt.registerMultiTask('cssmin', 'Minify CSS files', function() {
+    var options = this.options({
+      report: false
+    });
+    this.files.forEach(function(f) {
+      var valid = f.src.filter(function(filepath) {
+        // Warn on and remove invalid source files (if nonull was set).
+        if (!grunt.file.exists(filepath)) {
+          grunt.log.warn('Source file "' + filepath + '" not found.');
+          return false;
+        } else {
+          return true;
+        }
+      });
+      var max = valid
+      .map(grunt.file.read)
+      .join(grunt.util.normalizelf(grunt.util.linefeed));
+      var min = valid.map(function(f) {
+        options.relativeTo = path.dirname(f);
+        return minifyCSS(grunt.file.read(f), options);
+      })
+      .join('');
+
+      if (min.length < 1) {
+        grunt.log.warn('Destination not written because minified CSS was empty.');
+      } else {
+        if ( options.banner ) {
+          min = options.banner + grunt.util.linefeed + min;
+        }
+        grunt.file.write(f.dest, min);
+        grunt.log.writeln('File ' + f.dest + ' created.');
+        if(options.report) {
+          helper.minMaxInfo(min, max, options.report);
+        }
+      }
+    });
+  });
+
+  var minifyCSS = function(source, options) {
+    try {
+      return require('clean-css').process(source, options);
+    } catch (e) {
+      grunt.log.error(e);
+      grunt.fail.warn('css minification failed.');
+    }
+  };
+};

+ 49 - 0
node_modules/grunt-contrib-cssmin/test/cssmin_test.js

@@ -0,0 +1,49 @@
+'use strict';
+
+var grunt = require('grunt');
+
+exports.cssmin = {
+  main: function(test) {
+    test.expect(1);
+
+    var expect = grunt.file.read('test/expected/style.css');
+    var result = grunt.file.read('tmp/style.css');
+    test.equal(expect, result, 'should concat and minify an array of css files in order using clean-css');
+
+    test.done();
+  },
+  with_banner: function(test) {
+    test.expect(1);
+
+    var expect = grunt.file.read('test/expected/with-banner.css');
+    var result = grunt.file.read('tmp/with-banner.css');
+    test.equal(expect, result, 'should concat, minify and prefix banner');
+
+    test.done();
+  },
+  empty: function(test) {
+    test.expect(1);
+
+    test.ok(!grunt.file.exists('tmp/idontexist.css'), 'Empty minified file should not exist');
+
+    test.done();
+  },
+  remove_first_comment: function(test) {
+    test.expect(1);
+
+    var expect = grunt.file.read('test/expected/input_bannered.css');
+    var result = grunt.file.read('tmp/remove_first_comment.css');
+    test.equal(expect, result, 'should minify and replace banner');
+
+    test.done();
+  },
+  imports: function(test) {
+    test.expect(1);
+
+    var expect = grunt.file.read('test/expected/inline_import.css');
+    var result = grunt.file.read('tmp/inline_import.css');
+    test.equal(expect, result, 'should inline @import');
+
+    test.done();
+  }
+};

+ 1 - 0
node_modules/grunt-contrib-cssmin/test/expected/inline_import.css

@@ -0,0 +1 @@
+body{color:#00f}body{background-color:red}p{color:#0f0}p{background-color:#f0f}

+ 2 - 0
node_modules/grunt-contrib-cssmin/test/expected/input_bannered.css

@@ -0,0 +1,2 @@
+/* custom banner */
+body{border:1px solid gold}

+ 1 - 0
node_modules/grunt-contrib-cssmin/test/expected/style.css

@@ -0,0 +1 @@
+body{margin:0;font-size:18px}a{color:#00f}h1{font-size:48px;font-weight:700}

Some files were not shown because too many files changed in this diff