Index: /Dev/trunk/Gruntfile.js
===================================================================
--- /Dev/trunk/Gruntfile.js	(revision 515)
+++ /Dev/trunk/Gruntfile.js	(revision 516)
@@ -14,5 +14,5 @@
                                   ,'coffeelint:lint'
                                   ,'jsonlint:lint'
-                                  //,'tv4:lint'
+                                //,'tv4:lint'
                                   ,'less:compile'
                                   ,'usebanner:generated-css'
@@ -27,4 +27,8 @@
                                 ,'dojo:build'
                                 ]);
+    grunt.registerTask('deploy', ['path-check:deploy',
+                                  'svninfo',
+                                  'build',
+                                  'git_deploy:deploy']);
 
     // FILES AND FOLDERS
@@ -69,4 +73,14 @@
                                 releaseDir: '../../'+buildDir }}
         },
+        git_deploy: {
+            deploy: {
+                options: {
+                    url: 'git@heroku.com:quod-erat.git',
+                    branch: 'master',
+                    message: "Deployment of revision <%= svninfo.rev %> on <%= grunt.template.today() %>."
+                },
+                src: buildDir
+            }
+        },
         htmlhint: {
             options: { htmlhintrc: srcDir+".htmlhintrc" },
@@ -82,5 +96,5 @@
         },
         jsonlint: {
-            'lint': { files: { src: [ srcDir+'client/qed-client/**/*.json', srcDir+'server/**/*.json' ] } },
+            'lint': { files: { src: [ srcDir+'client/qed-client/**/*.json', srcDir+'server/**/*.json' ] } }
         },
         less: {
@@ -88,4 +102,9 @@
                        dumpLineNumbers: "all" },
             compile: { files: lessMap }
+        },
+        'path-check': {
+            'deploy': {
+                src: [ 'git', 'svn' ]
+            }
         },
         requirejs: {
@@ -143,6 +162,9 @@
     grunt.loadNpmTasks('grunt-contrib-less');
     grunt.loadNpmTasks('grunt-dojo');
+    grunt.loadNpmTasks('grunt-git-deploy');
     grunt.loadNpmTasks('grunt-htmlhint');
     grunt.loadNpmTasks('grunt-jsonlint');
+    grunt.loadNpmTasks('grunt-path-check');
+    grunt.loadNpmTasks('grunt-svninfo');
     grunt.loadNpmTasks('grunt-tv4');
     grunt.loadTasks('./grunt-tasks');
Index: v/trunk/deploy.sh
===================================================================
--- /Dev/trunk/deploy.sh	(revision 515)
+++ 	(revision )
@@ -1,23 +1,0 @@
-#!/bin/sh
-
-. ./env.sh
-
-RELBUILDDIR=../build
-
-COMMITMSG="Deployment of revision `svnversion .` on `date`"
-
-echo "$COMMITMSG..."
-
-if [ ! -d "$DEPLOYDIR" ]; then
-    git clone "$DEPLOYURL" "$DEPLOYDIR"
-fi
-
-(cd "$DEPLOYDIR" && \
- git pull && \
- rm -rf * && \
- cp -r "$RELBUILDDIR"/* . && \
- git add -A . && \
- git commit -a -m "$COMMITMSG" && \
- git push)
-
-echo "Done."
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/amdefine/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/amdefine/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/amdefine/package.json	(revision 516)
@@ -33,8 +33,8 @@
   },
   "_id": "amdefine@0.0.8",
-  "_from": "amdefine@0.0.8",
   "dist": {
     "shasum": "d68d47b0400ada2aae32f758b87b0aeca12b5c8c"
   },
+  "_from": "amdefine@0.0.8",
   "_resolved": "https://registry.npmjs.org/amdefine/-/amdefine-0.0.8.tgz"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/.npmignore
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/.npmignore	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/.npmignore	(revision 516)
@@ -4,5 +4,5 @@
 AUTHORS
 CHANGELOG
-CONTRIBUTING.MD
+CONTRIBUTING.md
 custom-gruntfile.js
 Gruntfile.js
Index: v/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/CONTRIBUTING.md
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/CONTRIBUTING.md	(revision 515)
+++ 	(revision )
@@ -1,1 +1,0 @@
-Please see the [Contributing to grunt](http://gruntjs.com/contributing) guide for information on contributing to this project.
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/LICENSE-MIT
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/LICENSE-MIT	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/LICENSE-MIT	(revision 516)
@@ -1,3 +1,3 @@
-Copyright (c) 2013 "Cowboy" Ben Alman
+Copyright (c) 2014 "Cowboy" Ben Alman
 
 Permission is hereby granted, free of charge, to any person
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/README.md	(revision 516)
@@ -1,3 +1,6 @@
-# Grunt: The JavaScript Task Runner [![Build Status](https://secure.travis-ci.org/gruntjs/grunt.png?branch=master)](http://travis-ci.org/gruntjs/grunt)
+# Grunt: The JavaScript Task Runner
+
+[![Build Status](https://secure.travis-ci.org/gruntjs/grunt.png?branch=master)](http://travis-ci.org/gruntjs/grunt)
+[![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/)
 
 <img align="right" height="260" src="http://gruntjs.com/img/grunt-logo-no-wordmark.svg">
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/internal-tasks/bump.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/internal-tasks/bump.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/internal-tasks/bump.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman, contributors
+ * Copyright (c) 2014 "Cowboy" Ben Alman, contributors
  * Licensed under the MIT license.
  */
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/internal-tasks/subgrunt.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/internal-tasks/subgrunt.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/internal-tasks/subgrunt.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
@@ -23,5 +23,9 @@
   return grunt[name] = require('./grunt/' + name);
 }
-var util = gRequire('util');
+
+var util = require('grunt-legacy-util');
+grunt.util = util;
+grunt.util.task = require('./util/task');
+
 gRequire('template');
 gRequire('event');
@@ -153,4 +157,6 @@
   // allows the error callback to execute multiple times.
   tasks.forEach(function(name) { task.run(name); });
-  task.start();
+  // Run tasks async internally to reduce call-stack, per:
+  // https://github.com/gruntjs/grunt/pull/1026
+  task.start({asyncDone:true});
 };
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/cli.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/cli.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/cli.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
@@ -22,5 +22,5 @@
   // CLI-parsed options override any passed-in "default" options.
   if (options) {
-    // For each defult option...
+    // For each default option...
     Object.keys(options).forEach(function(key) {
       if (!(key in cli.options)) {
@@ -62,5 +62,5 @@
     short: 'd',
     info: 'Enable debugging mode for tasks that support it.',
-    type: Number
+    type: [Number, Boolean]
   },
   stack: {
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/config.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/config.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/config.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/event.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/event.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/event.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/fail.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/fail.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/fail.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/file.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/file.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/file.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
@@ -134,7 +134,15 @@
 var pathSeparatorRe = /[\/\\]/g;
 
+// The "ext" option refers to either everything after the first dot (default)
+// or everything after the last dot.
+var extDotRe = {
+  first: /(\.[^\/]*)?$/,
+  last: /(\.[^\/\.]*)?$/,
+};
+
 // Build a multi task "files" object dynamically.
 file.expandMapping = function(patterns, destBase, options) {
   options = grunt.util._.defaults({}, options, {
+    extDot: 'first',
     rename: function(destBase, destPath) {
       return path.join(destBase || '', destPath);
@@ -151,6 +159,6 @@
     }
     // Change the extension?
-    if (options.ext) {
-      destPath = destPath.replace(/(\.[^\/]*)?$/, options.ext);
+    if ('ext' in options) {
+      destPath = destPath.replace(extDotRe[options.extDot], options.ext);
     }
     // Generate destination filename.
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/help.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/help.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/help.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/log.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/log.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/log.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/option.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/option.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/option.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/task.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/task.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/task.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
@@ -108,5 +108,5 @@
       }
     } else if (Array.isArray(data.files)) {
-      data.files.forEach(function(obj) {
+      grunt.util._.flatten(data.files).forEach(function(obj) {
         var prop;
         if ('src' in obj || 'dest' in obj) {
@@ -245,4 +245,9 @@
       return options;
     };
+    // Expose the current target.
+    this.target = target;
+    // Recreate flags object so that the target isn't set as a flag.
+    this.flags = {};
+    this.args.forEach(function(arg) { this.flags[arg] = true; }, this);
     // Expose data on `this` (as well as task.current).
     this.data = grunt.config([name, target]);
@@ -256,9 +261,4 @@
       }.bind(this)
     });
-    // Expose the current target.
-    this.target = target;
-    // Recreate flags object so that the target isn't set as a flag.
-    this.flags = {};
-    this.args.forEach(function(arg) { this.flags[arg] = true; }, this);
     // Call original task function, passing in the target and any other args.
     return fn.apply(this, this.args);
@@ -278,9 +278,16 @@
 // Override built-in renameTask to use the registry.
 task.renameTask = function(oldname, newname) {
-  // Add and remove task.
-  registry.untasks.push(oldname);
-  registry.tasks.push(newname);
-  // Actually rename task.
-  return parent.renameTask.apply(task, arguments);
+  var result;
+  try {
+    // Actually rename task.
+    result = parent.renameTask.apply(task, arguments);
+    // Add and remove task.
+    registry.untasks.push(oldname);
+    registry.tasks.push(newname);
+    // Return result.
+    return result;
+  } catch(e) {
+    grunt.log.error(e.message);
+  }
 };
 
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/template.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/template.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/template.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: v/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/util.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/grunt/util.js	(revision 515)
+++ 	(revision )
@@ -1,188 +1,0 @@
-/*
- * grunt
- * http://gruntjs.com/
- *
- * Copyright (c) 2013 "Cowboy" Ben Alman
- * Licensed under the MIT license.
- * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
- */
-
-'use strict';
-
-// Nodejs libs.
-var spawn = require('child_process').spawn;
-var nodeUtil = require('util');
-var path = require('path');
-
-// The module to be exported.
-var util = module.exports = {};
-
-// A few internal utilites, exposed.
-util.task = require('../util/task');
-util.namespace = require('getobject');
-
-// External libs.
-util.hooker = require('hooker');
-util.async = require('async');
-var _ = util._ = require('lodash');
-var which = require('which').sync;
-// Instead of process.exit. See https://github.com/cowboy/node-exit
-util.exit = require('exit');
-
-// Mixin Underscore.string methods.
-_.str = require('underscore.string');
-_.mixin(_.str.exports());
-
-// Return a function that normalizes the given function either returning a
-// value or accepting a "done" callback that accepts a single value.
-util.callbackify = function(fn) {
-  return function callbackable() {
-    // Invoke original function, getting its result.
-    var result = fn.apply(this, arguments);
-    // If the same number or less arguments were specified than fn accepts,
-    // assume the "done" callback was already handled.
-    var length = arguments.length;
-    if (length === fn.length) { return; }
-    // Otherwise, if the last argument is a function, assume it is a "done"
-    // callback and call it.
-    var done = arguments[length - 1];
-    if (typeof done === 'function') { done(result); }
-  };
-};
-
-// Create a new Error object, with an origError property that will be dumped
-// if grunt was run with the --debug=9 option.
-util.error = function(err, origError) {
-  if (!nodeUtil.isError(err)) { err = new Error(err); }
-  if (origError) { err.origError = origError; }
-  return err;
-};
-
-// The line feed char for the current system.
-util.linefeed = process.platform === 'win32' ? '\r\n' : '\n';
-
-// Normalize linefeeds in a string.
-util.normalizelf = function(str) {
-  return str.replace(/\r\n|\n/g, util.linefeed);
-};
-
-// What "kind" is a value?
-// I really need to rework https://github.com/cowboy/javascript-getclass
-var kindsOf = {};
-'Number String Boolean Function RegExp Array Date Error'.split(' ').forEach(function(k) {
-  kindsOf['[object ' + k + ']'] = k.toLowerCase();
-});
-util.kindOf = function(value) {
-  // Null or undefined.
-  if (value == null) { return String(value); }
-  // Everything else.
-  return kindsOf[kindsOf.toString.call(value)] || 'object';
-};
-
-// Coerce something to an Array.
-util.toArray = Function.call.bind(Array.prototype.slice);
-
-// Return the string `str` repeated `n` times.
-util.repeat = function(n, str) {
-  return new Array(n + 1).join(str || ' ');
-};
-
-// Given str of "a/b", If n is 1, return "a" otherwise "b".
-util.pluralize = function(n, str, separator) {
-  var parts = str.split(separator || '/');
-  return n === 1 ? (parts[0] || '') : (parts[1] || '');
-};
-
-// Recurse through objects and arrays, executing fn for each non-object.
-util.recurse = function recurse(value, fn, fnContinue) {
-  var obj;
-  if (fnContinue && fnContinue(value) === false) {
-    // Skip value if necessary.
-    return value;
-  } else if (util.kindOf(value) === 'array') {
-    // If value is an array, recurse.
-    return value.map(function(value) {
-      return recurse(value, fn, fnContinue);
-    });
-  } else if (util.kindOf(value) === 'object') {
-    // If value is an object, recurse.
-    obj = {};
-    Object.keys(value).forEach(function(key) {
-      obj[key] = recurse(value[key], fn, fnContinue);
-    });
-    return obj;
-  } else {
-    // Otherwise pass value into fn and return.
-    return fn(value);
-  }
-};
-
-// Spawn a child process, capturing its stdout and stderr.
-util.spawn = function(opts, done) {
-  // Build a result object and pass it (among other things) into the
-  // done function.
-  var callDone = function(code, stdout, stderr) {
-    // Remove trailing whitespace (newline)
-    stdout = _.rtrim(stdout);
-    stderr = _.rtrim(stderr);
-    // Create the result object.
-    var result = {
-      stdout: stdout,
-      stderr: stderr,
-      code: code,
-      toString: function() {
-        if (code === 0) {
-          return stdout;
-        } else if ('fallback' in opts) {
-          return opts.fallback;
-        } else if (opts.grunt) {
-          // grunt.log.error uses standard out, to be fixed in 0.5.
-          return stderr || stdout;
-        }
-        return stderr;
-      }
-    };
-    // On error (and no fallback) pass an error object, otherwise pass null.
-    done(code === 0 || 'fallback' in opts ? null : new Error(stderr), result, code);
-  };
-
-  var cmd, args;
-  var pathSeparatorRe = /[\\\/]/g;
-  if (opts.grunt) {
-    cmd = process.argv[0];
-    args = [process.argv[1]].concat(opts.args);
-  } else {
-    // On Windows, child_process.spawn will only file .exe files in the PATH,
-    // not other executable types (grunt issue #155).
-    try {
-      if (!pathSeparatorRe.test(opts.cmd)) {
-        // Only use which if cmd has no path component.
-        cmd = which(opts.cmd);
-      } else {
-        cmd = opts.cmd.replace(pathSeparatorRe, path.sep);
-      }
-    } catch (err) {
-      callDone(127, '', String(err));
-      return;
-    }
-    args = opts.args;
-  }
-
-  var child = spawn(cmd, args, opts.opts);
-  var stdout = new Buffer('');
-  var stderr = new Buffer('');
-  if (child.stdout) {
-    child.stdout.on('data', function(buf) {
-      stdout = Buffer.concat([stdout, new Buffer(buf)]);
-    });
-  }
-  if (child.stderr) {
-    child.stderr.on('data', function(buf) {
-      stderr = Buffer.concat([stderr, new Buffer(buf)]);
-    });
-  }
-  child.on('close', function(code) {
-    callDone(code, stdout.toString(), stderr.toString());
-  });
-  return child;
-};
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/util/task.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/util/task.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/lib/util/task.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
@@ -90,4 +90,7 @@
   // easier to implement than some kind of in-task "super" functionality.
   Task.prototype.renameTask = function(oldname, newname) {
+    if (!this._tasks[oldname]) {
+      throw new Error('Cannot rename missing "' + oldname + '" task.');
+    }
     // Rename task.
     this._tasks[newname] = this._tasks[oldname];
@@ -186,5 +189,5 @@
 
   // Run a task function, handling this.async / return value.
-  Task.prototype.runTaskFn = function(context, fn, done) {
+  Task.prototype.runTaskFn = function(context, fn, done, asyncDone) {
     // Async flag.
     var async = false;
@@ -213,5 +216,13 @@
         this._options.error.call({name: context.name, nameArgs: context.nameArgs}, err);
       }
-      done(err, success);
+      // only call done async if explicitly requested to
+      // see: https://github.com/gruntjs/grunt/pull/1026
+      if (asyncDone) {
+        process.nextTick(function () {
+          done(err, success);
+        });
+      } else {
+        done(err, success);
+      }
     }.bind(this);
 
@@ -244,5 +255,8 @@
 
   // Begin task queue processing. Ie. run all tasks.
-  Task.prototype.start = function() {
+  Task.prototype.start = function(opts) {
+    if (!opts) {
+      opts = {};
+    }
     // Abort if already running.
     if (this._running) { return false; }
@@ -281,5 +295,5 @@
       this.runTaskFn(context, function() {
         return thing.task.fn.apply(this, this.args);
-      }, nextTask);
+      }, nextTask, !!opts.asyncDone);
 
     }.bind(this);
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/.bin/rimraf
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/.bin/rimraf	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/.bin/rimraf	(revision 516)
@@ -0,0 +1,1 @@
+link ../rimraf/bin.js
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/colors/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/colors/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/colors/package.json	(revision 516)
@@ -26,9 +26,4 @@
   "readmeFilename": "ReadMe.md",
   "_id": "colors@0.6.2",
-  "dist": {
-    "shasum": "57915cf80820c121e254ec8b7819ab808d2beae5"
-  },
-  "_from": "colors@~0.6.2",
-  "_resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
-  "scripts": {}
+  "_from": "colors@~0.6.2"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/eventemitter2/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/eventemitter2/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/eventemitter2/package.json	(revision 516)
@@ -59,8 +59,4 @@
   "homepage": "https://github.com/hij1nx/EventEmitter2",
   "_id": "eventemitter2@0.4.13",
-  "dist": {
-    "shasum": "2a03bdff50bda6586cf2e27c71feeaf6d37c383c"
-  },
-  "_from": "eventemitter2@~0.4.13",
-  "_resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.13.tgz"
+  "_from": "eventemitter2@~0.4.13"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/exit/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/exit/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/exit/package.json	(revision 516)
@@ -48,8 +48,4 @@
   "readmeFilename": "README.md",
   "_id": "exit@0.1.2",
-  "dist": {
-    "shasum": "2a1f6b7dd67aedcf9544e948cc817113b64012a5"
-  },
-  "_from": "exit@~0.1.1",
-  "_resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz"
+  "_from": "exit@~0.1.1"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/getobject/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/getobject/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/getobject/package.json	(revision 516)
@@ -45,8 +45,4 @@
   "readmeFilename": "README.md",
   "_id": "getobject@0.1.0",
-  "dist": {
-    "shasum": "4563bd9ebffaa0790ee7eec6e2d74523b7e852a6"
-  },
-  "_from": "getobject@~0.1.0",
-  "_resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz"
+  "_from": "getobject@~0.1.0"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/glob/node_modules/inherits/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/glob/node_modules/inherits/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/glob/node_modules/inherits/package.json	(revision 516)
@@ -27,8 +27,5 @@
   "homepage": "https://github.com/isaacs/inherits",
   "_id": "inherits@1.0.0",
-  "dist": {
-    "shasum": "26467026b3b86de1c6f72f00d9a31b1c97077a92"
-  },
   "_from": "inherits@1",
-  "_resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz"
+  "scripts": {}
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/.npmignore
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/.npmignore	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/.npmignore	(revision 516)
@@ -0,0 +1,1 @@
+node_modules
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/Gruntfile.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/Gruntfile.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/Gruntfile.js	(revision 516)
@@ -0,0 +1,16 @@
+'use strict';
+
+module.exports = function(grunt) {
+
+  grunt.initConfig({
+    nodeunit: {
+      util: ['test/index.js']
+    },
+
+  });
+
+  grunt.loadNpmTasks('grunt-contrib-nodeunit');
+
+  grunt.registerTask('default', ['nodeunit']);
+
+};
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/LICENSE-MIT
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/LICENSE-MIT	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/LICENSE-MIT	(revision 516)
@@ -0,0 +1,22 @@
+Copyright (c) 2014 "Cowboy" Ben Alman
+
+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.
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/README.md	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/README.md	(revision 516)
@@ -0,0 +1,26 @@
+# grunt-legacy-util
+> Deprecated Grunt utils provided for backwards compatibility.
+
+`grunt.util.namespace` use [getobject]  
+`grunt.util.hooker` use [hooker]  
+`grunt.util.async` use [async]  
+`grunt.util._` use [lodash]  
+`grunt.util.exit` use [exit]  
+`grunt.util.callbackify`  
+`grunt.util.error`  
+`grunt.util.linefeed`  
+`grunt.util.normalizelf`  
+`grunt.util.kindOf` use [lodash]  
+`grunt.util.toArray`
+`grunt.util.repeat`  
+`grunt.util.pluralize`  
+`grunt.util.recurse` use [traverse]  
+`grunt.util.spawn`  
+
+
+[getobject]: https://www.npmjs.org/package/getobject
+[hooker]: https://www.npmjs.org/package/hooker
+[async]: https://www.npmjs.org/package/async
+[lodash]: https://www.npmjs.org/package/lodash
+[exit]: https://www.npmjs.org/package/exit
+[traverse]: https://www.npmjs.org/package/lodash
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/index.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/index.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/index.js	(revision 516)
@@ -0,0 +1,187 @@
+/*
+ * grunt
+ * http://gruntjs.com/
+ *
+ * Copyright (c) 2014 "Cowboy" Ben Alman
+ * Licensed under the MIT license.
+ * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
+ */
+
+'use strict';
+
+// Nodejs libs.
+var spawn = require('child_process').spawn;
+var nodeUtil = require('util');
+var path = require('path');
+
+// The module to be exported.
+var util = module.exports = {};
+
+util.namespace = require('getobject');
+
+// External libs.
+util.hooker = require('hooker');
+util.async = require('async');
+var _ = util._ = require('lodash');
+var which = require('which').sync;
+// Instead of process.exit. See https://github.com/cowboy/node-exit
+util.exit = require('exit');
+
+// Mixin Underscore.string methods.
+_.str = require('underscore.string');
+_.mixin(_.str.exports());
+
+// Return a function that normalizes the given function either returning a
+// value or accepting a "done" callback that accepts a single value.
+util.callbackify = function(fn) {
+  return function callbackable() {
+    // Invoke original function, getting its result.
+    var result = fn.apply(this, arguments);
+    // If the same number or less arguments were specified than fn accepts,
+    // assume the "done" callback was already handled.
+    var length = arguments.length;
+    if (length === fn.length) { return; }
+    // Otherwise, if the last argument is a function, assume it is a "done"
+    // callback and call it.
+    var done = arguments[length - 1];
+    if (typeof done === 'function') { done(result); }
+  };
+};
+
+// Create a new Error object, with an origError property that will be dumped
+// if grunt was run with the --debug=9 option.
+util.error = function(err, origError) {
+  if (!nodeUtil.isError(err)) { err = new Error(err); }
+  if (origError) { err.origError = origError; }
+  return err;
+};
+
+// The line feed char for the current system.
+util.linefeed = process.platform === 'win32' ? '\r\n' : '\n';
+
+// Normalize linefeeds in a string.
+util.normalizelf = function(str) {
+  return str.replace(/\r\n|\n/g, util.linefeed);
+};
+
+// What "kind" is a value?
+// I really need to rework https://github.com/cowboy/javascript-getclass
+var kindsOf = {};
+'Number String Boolean Function RegExp Array Date Error'.split(' ').forEach(function(k) {
+  kindsOf['[object ' + k + ']'] = k.toLowerCase();
+});
+util.kindOf = function(value) {
+  // Null or undefined.
+  if (value == null) { return String(value); }
+  // Everything else.
+  return kindsOf[kindsOf.toString.call(value)] || 'object';
+};
+
+// Coerce something to an Array.
+util.toArray = Function.call.bind(Array.prototype.slice);
+
+// Return the string `str` repeated `n` times.
+util.repeat = function(n, str) {
+  return new Array(n + 1).join(str || ' ');
+};
+
+// Given str of "a/b", If n is 1, return "a" otherwise "b".
+util.pluralize = function(n, str, separator) {
+  var parts = str.split(separator || '/');
+  return n === 1 ? (parts[0] || '') : (parts[1] || '');
+};
+
+// Recurse through objects and arrays, executing fn for each non-object.
+util.recurse = function recurse(value, fn, fnContinue) {
+  var obj;
+  if (fnContinue && fnContinue(value) === false) {
+    // Skip value if necessary.
+    return value;
+  } else if (util.kindOf(value) === 'array') {
+    // If value is an array, recurse.
+    return value.map(function(value) {
+      return recurse(value, fn, fnContinue);
+    });
+  } else if (util.kindOf(value) === 'object') {
+    // If value is an object, recurse.
+    obj = {};
+    Object.keys(value).forEach(function(key) {
+      obj[key] = recurse(value[key], fn, fnContinue);
+    });
+    return obj;
+  } else {
+    // Otherwise pass value into fn and return.
+    return fn(value);
+  }
+};
+
+// Spawn a child process, capturing its stdout and stderr.
+util.spawn = function(opts, done) {
+  // Build a result object and pass it (among other things) into the
+  // done function.
+  var callDone = function(code, stdout, stderr) {
+    // Remove trailing whitespace (newline)
+    stdout = _.rtrim(stdout);
+    stderr = _.rtrim(stderr);
+    // Create the result object.
+    var result = {
+      stdout: stdout,
+      stderr: stderr,
+      code: code,
+      toString: function() {
+        if (code === 0) {
+          return stdout;
+        } else if ('fallback' in opts) {
+          return opts.fallback;
+        } else if (opts.grunt) {
+          // grunt.log.error uses standard out, to be fixed in 0.5.
+          return stderr || stdout;
+        }
+        return stderr;
+      }
+    };
+    // On error (and no fallback) pass an error object, otherwise pass null.
+    done(code === 0 || 'fallback' in opts ? null : new Error(stderr), result, code);
+  };
+
+  var cmd, args;
+  var pathSeparatorRe = /[\\\/]/g;
+  if (opts.grunt) {
+    cmd = process.execPath;
+    args = process.execArgv.concat(process.argv[1], opts.args);
+  } else {
+    // On Windows, child_process.spawn will only file .exe files in the PATH,
+    // not other executable types (grunt issue #155).
+    try {
+      if (!pathSeparatorRe.test(opts.cmd)) {
+        // Only use which if cmd has no path component.
+        cmd = which(opts.cmd);
+      } else {
+        cmd = opts.cmd.replace(pathSeparatorRe, path.sep);
+      }
+    } catch (err) {
+      callDone(127, '', String(err));
+      return;
+    }
+    args = opts.args || [];
+  }
+
+  var child = spawn(cmd, args, opts.opts);
+  var stdout = new Buffer('');
+  var stderr = new Buffer('');
+  if (child.stdout) {
+    child.stdout.on('data', function(buf) {
+      stdout = Buffer.concat([stdout, new Buffer(buf)]);
+    });
+  }
+  if (child.stderr) {
+    child.stderr.on('data', function(buf) {
+      stderr = Buffer.concat([stderr, new Buffer(buf)]);
+    });
+  }
+  child.on('close', function(code) {
+    callDone(code, stdout.toString(), stderr.toString());
+  });
+  return child;
+};
+
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/package.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/package.json	(revision 516)
@@ -0,0 +1,54 @@
+{
+  "name": "grunt-legacy-util",
+  "version": "0.1.2",
+  "description": "Deprecated Grunt utils provided for backwards compatibility.",
+  "author": {
+    "name": "\"Cowboy\" Ben Alman",
+    "url": "http://benalman.com/"
+  },
+  "homepage": "http://gruntjs.com/",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/gruntjs/grunt-legacy-util.git"
+  },
+  "bugs": {
+    "url": "http://github.com/gruntjs/grunt-legacy-util/issues"
+  },
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "http://github.com/gruntjs/grunt-legacy-util/blob/master/LICENSE-MIT"
+    }
+  ],
+  "main": "index.js",
+  "scripts": {
+    "test": "grunt test"
+  },
+  "engines": {
+    "node": ">= 0.8.0"
+  },
+  "keywords": [],
+  "dependencies": {
+    "hooker": "~0.2.3",
+    "async": "~0.1.22",
+    "lodash": "~0.9.2",
+    "exit": "~0.1.1",
+    "underscore.string": "~2.2.1",
+    "getobject": "~0.1.0",
+    "which": "~1.0.5"
+  },
+  "devDependencies": {
+    "grunt-contrib-jshint": "~0.6.4",
+    "grunt-contrib-nodeunit": "~0.2.0",
+    "grunt": "0.4.2",
+    "temporary": "0.0.8"
+  },
+  "readme": "# grunt-legacy-util\n> Deprecated Grunt utils provided for backwards compatibility.\n\n`grunt.util.namespace` use [getobject]  \n`grunt.util.hooker` use [hooker]  \n`grunt.util.async` use [async]  \n`grunt.util._` use [lodash]  \n`grunt.util.exit` use [exit]  \n`grunt.util.callbackify`  \n`grunt.util.error`  \n`grunt.util.linefeed`  \n`grunt.util.normalizelf`  \n`grunt.util.kindOf` use [lodash]  \n`grunt.util.toArray`\n`grunt.util.repeat`  \n`grunt.util.pluralize`  \n`grunt.util.recurse` use [traverse]  \n`grunt.util.spawn`  \n\n\n[getobject]: https://www.npmjs.org/package/getobject\n[hooker]: https://www.npmjs.org/package/hooker\n[async]: https://www.npmjs.org/package/async\n[lodash]: https://www.npmjs.org/package/lodash\n[exit]: https://www.npmjs.org/package/exit\n[traverse]: https://www.npmjs.org/package/lodash\n",
+  "readmeFilename": "README.md",
+  "_id": "grunt-legacy-util@0.1.2",
+  "dist": {
+    "shasum": "e1dbbcc204b3f3a744bb2e27cb028295a16d6e85"
+  },
+  "_from": "grunt-legacy-util@~0.1.2",
+  "_resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.1.2.tgz"
+}
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-execArgv-child.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-execArgv-child.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-execArgv-child.js	(revision 516)
@@ -0,0 +1,7 @@
+module.exports = function(grunt) {
+
+  grunt.registerTask('default', function(text) {
+    console.log('OUTPUT: ' + process.execArgv.join(' '));
+  });
+
+};
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-execArgv.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-execArgv.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-execArgv.js	(revision 516)
@@ -0,0 +1,17 @@
+module.exports = function(grunt) {
+
+  var util = require('../../');
+
+  grunt.registerTask('default', function(text) {
+    var done = this.async();
+    util.spawn({
+      grunt: true,
+      args: ['--gruntfile', 'Gruntfile-execArgv-child.js'],
+    }, function(err, result, code) {
+      var matches = result.stdout.match(/^(OUTPUT: .*)/m);
+      console.log(matches ? matches[1] : '');
+      done();
+    });
+  });
+
+};
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-print-text.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-print-text.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-print-text.js	(revision 516)
@@ -0,0 +1,8 @@
+module.exports = function(grunt) {
+
+  grunt.registerTask('print', 'Print the specified text.', function(text) {
+    console.log('OUTPUT: ' + text);
+    // console.log(process.cwd());
+  });
+
+};
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/exec.cmd
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/exec.cmd	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/exec.cmd	(revision 516)
@@ -0,0 +1,1 @@
+@echo done
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/exec.sh
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/exec.sh	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/exec.sh	(revision 516)
@@ -0,0 +1,2 @@
+#!/bin/bash
+echo "done"
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/spawn-multibyte.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/spawn-multibyte.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/spawn-multibyte.js	(revision 516)
@@ -0,0 +1,17 @@
+// This is a test fixture for a case where spawn receives incomplete
+// multibyte strings in separate data events.
+
+// A multibyte buffer containing all our output. We will slice it later.
+// In this case we are using a Japanese word for hello / good day, where each
+// character takes three bytes.
+var fullOutput = new Buffer('ããã«ã¡ã¯');
+
+// Output one full character and one third of a character
+process.stdout.write(fullOutput.slice(0, 4));
+
+// Output the rest of the string
+process.stdout.write(fullOutput.slice(4));
+
+// Do the same for stderr
+process.stderr.write(fullOutput.slice(0, 4));
+process.stderr.write(fullOutput.slice(4));
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/spawn.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/spawn.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/spawn.js	(revision 516)
@@ -0,0 +1,8 @@
+
+var code = Number(process.argv[2]);
+
+process.stdout.write('stdout\n');
+process.stderr.write('stderr\n');
+
+// Instead of process.exit. See https://github.com/cowboy/node-exit
+require('exit')(code);
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/index.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/index.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/grunt-legacy-util/test/index.js	(revision 516)
@@ -0,0 +1,313 @@
+'use strict';
+
+var util = require('../');
+
+var fs = require('fs');
+var path = require('path');
+
+var Tempfile = require('temporary/lib/file');
+
+exports['util.callbackify'] = {
+  'return': function(test) {
+    test.expect(1);
+    // This function returns a value.
+    function add(a, b) {
+      return a + b;
+    }
+    util.callbackify(add)(1, 2, function(result) {
+      test.equal(result, 3, 'should be the correct result.');
+      test.done();
+    });
+  },
+  'callback (sync)': function(test) {
+    test.expect(1);
+    // This function accepts a callback which it calls synchronously.
+    function add(a, b, done) {
+      done(a + b);
+    }
+    util.callbackify(add)(1, 2, function(result) {
+      test.equal(result, 3, 'should be the correct result.');
+      test.done();
+    });
+  },
+  'callback (async)': function(test) {
+    test.expect(1);
+    // This function accepts a callback which it calls asynchronously.
+    function add(a, b, done) {
+      setTimeout(done.bind(null, a + b), 0);
+    }
+    util.callbackify(add)(1, 2, function(result) {
+      test.equal(result, 3, 'should be the correct result.');
+      test.done();
+    });
+  }
+};
+
+exports['util'] = {
+  'error': function(test) {
+    test.expect(9);
+    var origError = new Error('Original error.');
+
+    var err = util.error('Test message.');
+    test.ok(err instanceof Error, 'Should be an Error.');
+    test.equal(err.name, 'Error', 'Should be an Error.');
+    test.equal(err.message, 'Test message.', 'Should have the correct message.');
+
+    err = util.error('Test message.', origError);
+    test.ok(err instanceof Error, 'Should be an Error.');
+    test.equal(err.name, 'Error', 'Should be an Error.');
+    test.equal(err.message, 'Test message.', 'Should have the correct message.');
+    test.equal(err.origError, origError, 'Should reflect the original error.');
+
+    var newError = new Error('Test message.');
+    err = util.error(newError, origError);
+    test.equal(err, newError, 'Should be the passed-in Error.');
+    test.equal(err.origError, origError, 'Should reflect the original error.');
+    test.done();
+  },
+  'linefeed': function(test) {
+    test.expect(1);
+    if (process.platform === 'win32') {
+      test.equal(util.linefeed, '\r\n', 'linefeed should be operating-system appropriate.');
+    } else {
+      test.equal(util.linefeed, '\n', 'linefeed should be operating-system appropriate.');
+    }
+    test.done();
+  },
+  'normalizelf': function(test) {
+    test.expect(1);
+    if (process.platform === 'win32') {
+      test.equal(util.normalizelf('foo\nbar\r\nbaz\r\n\r\nqux\n\nquux'), 'foo\r\nbar\r\nbaz\r\n\r\nqux\r\n\r\nquux', 'linefeeds should be normalized');
+    } else {
+      test.equal(util.normalizelf('foo\nbar\r\nbaz\r\n\r\nqux\n\nquux'), 'foo\nbar\nbaz\n\nqux\n\nquux', 'linefeeds should be normalized');
+    }
+    test.done();
+  }
+};
+
+exports['util.spawn'] = {
+  setUp: function(done) {
+    this.script = path.resolve('test/fixtures/spawn.js');
+    done();
+  },
+  'exit code 0': function(test) {
+    test.expect(6);
+    util.spawn({
+      cmd: process.execPath,
+      args: [ this.script, 0 ],
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.equals(result.stdout, 'stdout');
+      test.equals(result.stderr, 'stderr');
+      test.equals(result.code, 0);
+      test.equals(String(result), 'stdout');
+      test.done();
+    });
+  },
+  'exit code 0, fallback': function(test) {
+    test.expect(6);
+    util.spawn({
+      cmd: process.execPath,
+      args: [ this.script, 0 ],
+      fallback: 'ignored if exit code is 0'
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.equals(result.stdout, 'stdout');
+      test.equals(result.stderr, 'stderr');
+      test.equals(result.code, 0);
+      test.equals(String(result), 'stdout');
+      test.done();
+    });
+  },
+  'non-zero exit code': function(test) {
+    test.expect(7);
+    util.spawn({
+      cmd: process.execPath,
+      args: [ this.script, 123 ],
+    }, function(err, result, code) {
+      test.ok(err instanceof Error);
+      test.equals(err.message, 'stderr');
+      test.equals(code, 123);
+      test.equals(result.stdout, 'stdout');
+      test.equals(result.stderr, 'stderr');
+      test.equals(result.code, 123);
+      test.equals(String(result), 'stderr');
+      test.done();
+    });
+  },
+  'non-zero exit code, fallback': function(test) {
+    test.expect(6);
+    util.spawn({
+      cmd: process.execPath,
+      args: [ this.script, 123 ],
+      fallback: 'custom fallback'
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 123);
+      test.equals(result.stdout, 'stdout');
+      test.equals(result.stderr, 'stderr');
+      test.equals(result.code, 123);
+      test.equals(String(result), 'custom fallback');
+      test.done();
+    });
+  },
+  'cmd not found': function(test) {
+    test.expect(3);
+    util.spawn({
+      cmd: 'nodewtfmisspelled',
+    }, function(err, result, code) {
+      test.ok(err instanceof Error);
+      test.equals(code, 127);
+      test.equals(result.code, 127);
+      test.done();
+    });
+  },
+  'cmd not found, fallback': function(test) {
+    test.expect(4);
+    util.spawn({
+      cmd: 'nodewtfmisspelled',
+      fallback: 'use a fallback or good luck'
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 127);
+      test.equals(result.code, 127);
+      test.equals(String(result), 'use a fallback or good luck');
+      test.done();
+    });
+  },
+  'cmd not in path': function(test) {
+    test.expect(6);
+    var win32 = process.platform === 'win32';
+    util.spawn({
+      cmd: 'test\\fixtures\\exec' + (win32 ? '.cmd' : '.sh'),
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.equals(result.stdout, 'done');
+      test.equals(result.stderr, '');
+      test.equals(result.code, 0);
+      test.equals(String(result), 'done');
+      test.done();
+    });
+  },
+  'cmd not in path (with cwd)': function(test) {
+    test.expect(6);
+    var win32 = process.platform === 'win32';
+    util.spawn({
+      cmd: './exec' + (win32 ? '.cmd' : '.sh'),
+      opts: {cwd: 'test/fixtures'},
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.equals(result.stdout, 'done');
+      test.equals(result.stderr, '');
+      test.equals(result.code, 0);
+      test.equals(String(result), 'done');
+      test.done();
+    });
+  },
+  'grunt': function(test) {
+    test.expect(3);
+    util.spawn({
+      grunt: true,
+      args: [ '--gruntfile', 'test/fixtures/Gruntfile-print-text.js', 'print:foo' ],
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.ok(/^OUTPUT: foo/m.test(result.stdout), 'stdout should contain output indicating the grunt task was run.');
+      test.done();
+    });
+  },
+  'grunt (with cwd)': function(test) {
+    test.expect(3);
+    util.spawn({
+      grunt: true,
+      args: [ '--gruntfile', 'Gruntfile-print-text.js', 'print:foo' ],
+      opts: {cwd: 'test/fixtures'},
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.ok(/^OUTPUT: foo/m.test(result.stdout), 'stdout should contain output indicating the grunt task was run.');
+      test.done();
+    });
+  },
+  'grunt passes execArgv': function(test) {
+    test.expect(3);
+    util.spawn({
+      cmd: process.execPath,
+      args: [ '--harmony', process.argv[1], '--gruntfile', 'test/fixtures/Gruntfile-execArgv.js'],
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.ok(/^OUTPUT: --harmony/m.test(result.stdout), 'stdout should contain passed-through process.execArgv.');
+      test.done();
+    });
+  },
+  'grunt result.toString() with error': function(test) {
+    // grunt.log.error uses standard out, to be fixed in 0.5.
+    test.expect(4);
+    util.spawn({
+      grunt: true,
+      args: [ 'nonexistentTask' ]
+    }, function(err, result, code) {
+      test.ok(err instanceof Error, 'Should be an Error.');
+      test.equal(err.name, 'Error', 'Should be an Error.');
+      test.equals(code, 3);
+      test.ok(/Warning: Task "nonexistentTask" not found./m.test(result.toString()), 'stdout should contain output indicating the grunt task was (attempted to be) run.');
+      test.done();
+    });
+  },
+  'custom stdio stream(s)': function(test) {
+    test.expect(6);
+    var stdoutFile = new Tempfile();
+    var stderrFile = new Tempfile();
+    var stdout = fs.openSync(stdoutFile.path, 'a');
+    var stderr = fs.openSync(stderrFile.path, 'a');
+    var child = util.spawn({
+      cmd: process.execPath,
+      args: [ this.script, 0 ],
+      opts: {stdio: [null, stdout, stderr]},
+    }, function(err, result, code) {
+      test.equals(code, 0);
+      test.equals(String(fs.readFileSync(stdoutFile.path)), 'stdout\n', 'Child process stdout should have been captured via custom stream.');
+      test.equals(String(fs.readFileSync(stderrFile.path)), 'stderr\n', 'Child process stderr should have been captured via custom stream.');
+      stdoutFile.unlinkSync();
+      stderrFile.unlinkSync();
+      test.equals(result.stdout, '', 'Nothing will be passed to the stdout string when spawn stdio is a custom stream.');
+      test.done();
+    });
+    test.ok(!child.stdout, 'child should not have a stdout property.');
+    test.ok(!child.stderr, 'child should not have a stderr property.');
+  },
+};
+
+exports['util.spawn.multibyte'] = {
+  setUp: function(done) {
+    this.script = path.resolve('test/fixtures/spawn-multibyte.js');
+    done();
+  },
+  'partial stdout': function(test) {
+    test.expect(4);
+    util.spawn({
+      cmd: process.execPath,
+      args: [ this.script ],
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.equals(result.stdout, 'ããã«ã¡ã¯');
+      test.equals(result.stderr, 'ããã«ã¡ã¯');
+      test.done();
+    });
+  }
+};
+
+exports['util.underscore.string'] = function(test) {
+  test.expect(4);
+  test.equals(util._.trim('    foo     '), 'foo', 'Should have trimmed the string.');
+  test.equals(util._.capitalize('foo'), 'Foo', 'Should have capitalized the first letter.');
+  test.equals(util._.words('one two three').length, 3, 'Should have counted three words.');
+  test.ok(util._.isBlank(' '), 'Should be blank.');
+  test.done();
+};
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/iconv-lite/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/iconv-lite/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/iconv-lite/package.json	(revision 516)
@@ -77,8 +77,4 @@
   },
   "_id": "iconv-lite@0.2.11",
-  "dist": {
-    "shasum": "1827821f46962889765690b557c045f5cc3976eb"
-  },
-  "_from": "iconv-lite@~0.2.11",
-  "_resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz"
+  "_from": "iconv-lite@~0.2.11"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json	(revision 516)
@@ -70,8 +70,4 @@
   "readmeFilename": "README.markdown",
   "_id": "underscore.string@2.3.3",
-  "dist": {
-    "shasum": "a7cea3b9aa84d24cf1363ccbddd02ee10abee0c0"
-  },
-  "_from": "underscore.string@~2.3.1",
-  "_resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz"
+  "_from": "underscore.string@~2.3.1"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/minimatch/.npmignore
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/minimatch/.npmignore	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/minimatch/.npmignore	(revision 516)
@@ -0,0 +1,1 @@
+node_modules
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/minimatch/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/minimatch/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/minimatch/README.md	(revision 516)
@@ -20,4 +20,5 @@
 minimatch("bar.foo", "*.foo") // true!
 minimatch("bar.foo", "*.bar") // false!
+minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy!
 ```
 
@@ -36,42 +37,4 @@
 * `man 3 fnmatch`
 * `man 5 gitignore`
-
-### Comparisons to other fnmatch/glob implementations
-
-While strict compliance with the existing standards is a worthwhile
-goal, some discrepancies exist between minimatch and other
-implementations, and are intentional.
-
-If the pattern starts with a `!` character, then it is negated.  Set the
-`nonegate` flag to suppress this behavior, and treat leading `!`
-characters normally.  This is perhaps relevant if you wish to start the
-pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
-characters at the start of a pattern will negate the pattern multiple
-times.
-
-If a pattern starts with `#`, then it is treated as a comment, and
-will not match anything.  Use `\#` to match a literal `#` at the
-start of a line, or set the `nocomment` flag to suppress this behavior.
-
-The double-star character `**` is supported by default, unless the
-`noglobstar` flag is set.  This is supported in the manner of bsdglob
-and bash 4.1, where `**` only has special significance if it is the only
-thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
-`a/**b` will not.  **Note that this is different from the way that `**` is
-handled by ruby's `Dir` class.**
-
-If an escaped pattern has no matches, and the `nonull` flag is set,
-then minimatch.match returns the pattern as-provided, rather than
-interpreting the character escapes.  For example,
-`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
-`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
-that it does not resolve escaped pattern characters.
-
-If brace expansion is not disabled, then it is performed before any
-other interpretation of the glob pattern.  Thus, a pattern like
-`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
-**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
-checked for validity.  Since those two are valid, matching proceeds.
-
 
 ## Minimatch Class
@@ -217,2 +180,39 @@
 Returns from negate expressions the same as if they were not negated.
 (Ie, true on a hit, false on a miss.)
+
+
+## Comparisons to other fnmatch/glob implementations
+
+While strict compliance with the existing standards is a worthwhile
+goal, some discrepancies exist between minimatch and other
+implementations, and are intentional.
+
+If the pattern starts with a `!` character, then it is negated.  Set the
+`nonegate` flag to suppress this behavior, and treat leading `!`
+characters normally.  This is perhaps relevant if you wish to start the
+pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
+characters at the start of a pattern will negate the pattern multiple
+times.
+
+If a pattern starts with `#`, then it is treated as a comment, and
+will not match anything.  Use `\#` to match a literal `#` at the
+start of a line, or set the `nocomment` flag to suppress this behavior.
+
+The double-star character `**` is supported by default, unless the
+`noglobstar` flag is set.  This is supported in the manner of bsdglob
+and bash 4.1, where `**` only has special significance if it is the only
+thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
+`a/**b` will not.
+
+If an escaped pattern has no matches, and the `nonull` flag is set,
+then minimatch.match returns the pattern as-provided, rather than
+interpreting the character escapes.  For example,
+`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
+`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
+that it does not resolve escaped pattern characters.
+
+If brace expansion is not disabled, then it is performed before any
+other interpretation of the glob pattern.  Thus, a pattern like
+`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
+**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
+checked for validity.  Since those two are valid, matching proceeds.
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/minimatch/minimatch.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/minimatch/minimatch.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/minimatch/minimatch.js	(revision 516)
@@ -69,15 +69,4 @@
 var slashSplit = /\/+/
 
-minimatch.monkeyPatch = monkeyPatch
-function monkeyPatch () {
-  var desc = Object.getOwnPropertyDescriptor(String.prototype, "match")
-  var orig = desc.value
-  desc.value = function (p) {
-    if (p instanceof Minimatch) return p.match(this)
-    return orig.call(this, p)
-  }
-  Object.defineProperty(String.prototype, desc)
-}
-
 minimatch.filter = filter
 function filter (pattern, options) {
@@ -179,4 +168,6 @@
 }
 
+Minimatch.prototype.debug = function() {}
+
 Minimatch.prototype.make = make
 function make () {
@@ -203,5 +194,7 @@
   var set = this.globSet = this.braceExpand()
 
-  if (options.debug) console.error(this.pattern, set)
+  if (options.debug) this.debug = console.error
+
+  this.debug(this.pattern, set)
 
   // step 3: now we have a set, so turn each one into a series of path-portion
@@ -214,5 +207,5 @@
   })
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   // glob --> regexps
@@ -221,5 +214,5 @@
   }, this)
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   // filter out everything that didn't compile properly.
@@ -228,5 +221,5 @@
   })
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   this.set = set
@@ -303,9 +296,9 @@
   // and then prepend it to everything we find.
   if (pattern.charAt(0) !== "{") {
-    // console.error(pattern)
+    this.debug(pattern)
     var prefix = null
     for (var i = 0, l = pattern.length; i < l; i ++) {
       var c = pattern.charAt(i)
-      // console.error(i, c)
+      this.debug(i, c)
       if (c === "\\") {
         escaping = !escaping
@@ -318,9 +311,9 @@
     // actually no sets, all { were escaped.
     if (prefix === null) {
-      // console.error("no sets")
+      this.debug("no sets")
       return [pattern]
     }
 
-    var tail = braceExpand(pattern.substr(i), options)
+   var tail = braceExpand.call(this, pattern.substr(i), options)
     return tail.map(function (t) {
       return prefix + t
@@ -337,6 +330,6 @@
   var numset = pattern.match(/^\{(-?[0-9]+)\.\.(-?[0-9]+)\}/)
   if (numset) {
-    // console.error("numset", numset[1], numset[2])
-    var suf = braceExpand(pattern.substr(numset[0].length), options)
+    this.debug("numset", numset[1], numset[2])
+    var suf = braceExpand.call(this, pattern.substr(numset[0].length), options)
       , start = +numset[1]
       , end = +numset[2]
@@ -370,8 +363,8 @@
   }
 
-  // console.error("Entering for")
+  this.debug("Entering for")
   FOR: for (i = 1, l = pattern.length; i < l; i ++) {
     var c = pattern.charAt(i)
-    // console.error("", i, c)
+    this.debug("", i, c)
 
     if (escaping) {
@@ -421,20 +414,20 @@
   // and need to escape the leading brace
   if (depth !== 0) {
-    // console.error("didn't close", pattern)
-    return braceExpand("\\" + pattern, options)
+    this.debug("didn't close", pattern)
+    return braceExpand.call(this, "\\" + pattern, options)
   }
 
   // x{y,z} -> ["xy", "xz"]
-  // console.error("set", set)
-  // console.error("suffix", pattern.substr(i))
-  var suf = braceExpand(pattern.substr(i), options)
+  this.debug("set", set)
+  this.debug("suffix", pattern.substr(i))
+  var suf = braceExpand.call(this, pattern.substr(i), options)
   // ["b", "c{d,e}","{f,g}h"] ->
   //   [["b"], ["cd", "ce"], ["fh", "gh"]]
   var addBraces = set.length === 1
-  // console.error("set pre-expanded", set)
+  this.debug("set pre-expanded", set)
   set = set.map(function (p) {
-    return braceExpand(p, options)
-  })
-  // console.error("set expanded", set)
+    return braceExpand.call(this, p, options)
+  }, this)
+  this.debug("set expanded", set)
 
 
@@ -497,4 +490,5 @@
       : options.dot ? "(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))"
       : "(?!\\.)"
+    , self = this
 
   function clearStateChar () {
@@ -515,4 +509,5 @@
           break
       }
+      self.debug('clearStateChar %j %j', stateChar, re)
       stateChar = false
     }
@@ -523,7 +518,5 @@
       ; i ++ ) {
 
-    if (options.debug) {
-      console.error("%s\t%s %s %j", pattern, i, re, c)
-    }
+    this.debug("%s\t%s %s %j", pattern, i, re, c)
 
     // skip over any that are escaped.
@@ -552,11 +545,10 @@
       case "@":
       case "!":
-        if (options.debug) {
-          console.error("%s\t%s %s %j <-- stateChar", pattern, i, re, c)
-        }
+        this.debug("%s\t%s %s %j <-- stateChar", pattern, i, re, c)
 
         // all of those are literals inside a class, except that
         // the glob [!a] means [^a] in regexp
         if (inClass) {
+          this.debug('  in class')
           if (c === "!" && i === classStart + 1) c = "^"
           re += c
@@ -567,4 +559,5 @@
         // that there was something like ** or +? in there.
         // Handle the stateChar, then proceed with this one.
+        self.debug('call clearStateChar %j', stateChar)
         clearStateChar()
         stateChar = c
@@ -592,4 +585,5 @@
         // negation is (?:(?!js)[^/]*)
         re += stateChar === "!" ? "(?:(?!" : "(?:"
+        this.debug('plType %j %j', stateChar, re)
         stateChar = false
         continue
@@ -601,4 +595,5 @@
         }
 
+        clearStateChar()
         hasMagic = true
         re += ")"
@@ -624,4 +619,5 @@
         }
 
+        clearStateChar()
         re += "|"
         continue
@@ -716,5 +712,5 @@
     })
 
-    // console.error("tail=%j\n   %s", tail, tail)
+    this.debug("tail=%j\n   %s", tail, tail)
     var t = pl.type === "*" ? star
           : pl.type === "?" ? qmark
@@ -830,5 +826,5 @@
 Minimatch.prototype.match = match
 function match (f, partial) {
-  // console.error("match", f, this.pattern)
+  this.debug("match", f, this.pattern)
   // short-circuit in the case of busted things.
   // comments, etc.
@@ -848,7 +844,5 @@
   // treat the test path as a set of pathparts.
   f = f.split(slashSplit)
-  if (options.debug) {
-    console.error(this.pattern, "split", f)
-  }
+  this.debug(this.pattern, "split", f)
 
   // just ONE of the pattern sets in this.set needs to match
@@ -858,9 +852,14 @@
 
   var set = this.set
-  // console.error(this.pattern, "set", set)
+  this.debug(this.pattern, "set", set)
+
+  var splitFile = path.basename(f.join("/")).split("/")
 
   for (var i = 0, l = set.length; i < l; i ++) {
-    var pattern = set[i]
-    var hit = this.matchOne(f, pattern, partial)
+    var pattern = set[i], file = f
+    if (options.matchBase && pattern.length === 1) {
+      file = splitFile
+    }
+    var hit = this.matchOne(file, pattern, partial)
     if (hit) {
       if (options.flipNegate) return true
@@ -883,18 +882,10 @@
   var options = this.options
 
-  if (options.debug) {
-    console.error("matchOne",
-                  { "this": this
-                  , file: file
-                  , pattern: pattern })
-  }
-
-  if (options.matchBase && pattern.length === 1) {
-    file = path.basename(file.join("/")).split("/")
-  }
-
-  if (options.debug) {
-    console.error("matchOne", file.length, pattern.length)
-  }
+  this.debug("matchOne",
+              { "this": this
+              , file: file
+              , pattern: pattern })
+
+  this.debug("matchOne", file.length, pattern.length)
 
   for ( var fi = 0
@@ -905,13 +896,9 @@
       ; fi ++, pi ++ ) {
 
-    if (options.debug) {
-      console.error("matchOne loop")
-    }
+    this.debug("matchOne loop")
     var p = pattern[pi]
       , f = file[fi]
 
-    if (options.debug) {
-      console.error(pattern, p, f)
-    }
+    this.debug(pattern, p, f)
 
     // should be impossible.
@@ -920,6 +907,5 @@
 
     if (p === GLOBSTAR) {
-      if (options.debug)
-        console.error('GLOBSTAR', [pattern, p, f])
+      this.debug('GLOBSTAR', [pattern, p, f])
 
       // "**"
@@ -948,6 +934,5 @@
         , pr = pi + 1
       if (pr === pl) {
-        if (options.debug)
-          console.error('** at the end')
+        this.debug('** at the end')
         // a ** at the end will just swallow the rest.
         // We have found a match.
@@ -967,13 +952,10 @@
         var swallowee = file[fr]
 
-        if (options.debug) {
-          console.error('\nglobstar while',
-                        file, fr, pattern, pr, swallowee)
-        }
+        this.debug('\nglobstar while',
+                    file, fr, pattern, pr, swallowee)
 
         // XXX remove this slice.  Just pass the start index.
         if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
-          if (options.debug)
-            console.error('globstar found match!', fr, fl, swallowee)
+          this.debug('globstar found match!', fr, fl, swallowee)
           // found a match.
           return true
@@ -983,12 +965,10 @@
           if (swallowee === "." || swallowee === ".." ||
               (!options.dot && swallowee.charAt(0) === ".")) {
-            if (options.debug)
-              console.error("dot detected!", file, fr, pattern, pr)
+            this.debug("dot detected!", file, fr, pattern, pr)
             break WHILE
           }
 
           // ** swallows a segment, and continue.
-          if (options.debug)
-            console.error('globstar swallow a segment, and continue')
+          this.debug('globstar swallow a segment, and continue')
           fr ++
         }
@@ -999,5 +979,5 @@
       if (partial) {
         // ran out of file
-        // console.error("\n>>> no match, partial?", file, fr, pattern, pr)
+        this.debug("\n>>> no match, partial?", file, fr, pattern, pr)
         if (fr === fl) return true
       }
@@ -1015,12 +995,8 @@
         hit = f === p
       }
-      if (options.debug) {
-        console.error("string match", p, f, hit)
-      }
+      this.debug("string match", p, f, hit)
     } else {
       hit = f.match(p)
-      if (options.debug) {
-        console.error("pattern match", p, f, hit)
-      }
+      this.debug("pattern match", p, f, hit)
     }
 
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/package.json	(revision 516)
@@ -30,8 +30,4 @@
   "homepage": "https://github.com/isaacs/node-lru-cache",
   "_id": "lru-cache@2.5.0",
-  "dist": {
-    "shasum": "be07d09e5b05f10b83d0cf01d4891a7729288c69"
-  },
-  "_from": "lru-cache@2",
-  "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
+  "_from": "lru-cache@2"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/minimatch/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/minimatch/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/minimatch/package.json	(revision 516)
@@ -7,5 +7,5 @@
   "name": "minimatch",
   "description": "a glob matcher in javascript",
-  "version": "0.2.12",
+  "version": "0.2.14",
   "repository": {
     "type": "git",
@@ -14,5 +14,5 @@
   "main": "minimatch.js",
   "scripts": {
-    "test": "tap test"
+    "test": "tap test/*.js"
   },
   "engines": {
@@ -30,5 +30,5 @@
     "url": "http://github.com/isaacs/minimatch/raw/master/LICENSE"
   },
-  "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n### Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated.  Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally.  This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything.  Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set.  This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.  **Note that this is different from the way that `**` is\nhandled by ruby's `Dir` class.**\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes.  For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`.  This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern.  Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity.  Since those two are valid, matching proceeds.\n\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n  Each row in the\n  array corresponds to a brace-expanded pattern.  Each item in the row\n  corresponds to a single path-part.  For example, the pattern\n  `{a,b/c}/d` would expand to a set of patterns like:\n\n        [ [ a, d ]\n        , [ b, c, d ] ]\n\n    If a portion of the pattern doesn't have any \"magic\" in it\n    (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n    will be left as a string rather than converted to a regular\n    expression.\n\n* `regexp` Created by the `makeRe` method.  A single regular expression\n  expressing the entire pattern.  This is useful in cases where you wish\n  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n  Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n  false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n  filename, and match it against a single row in the `regExpSet`.  This\n  method is mainly for internal use, but is exposed so that it can be\n  used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items.  So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export.  Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`.  Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob.  If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself.  When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes.  For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n",
+  "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\nminimatch(\"bar.foo\", \"*.+(bar|foo)\", { debug: true }) // true, and noisy!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n  Each row in the\n  array corresponds to a brace-expanded pattern.  Each item in the row\n  corresponds to a single path-part.  For example, the pattern\n  `{a,b/c}/d` would expand to a set of patterns like:\n\n        [ [ a, d ]\n        , [ b, c, d ] ]\n\n    If a portion of the pattern doesn't have any \"magic\" in it\n    (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n    will be left as a string rather than converted to a regular\n    expression.\n\n* `regexp` Created by the `makeRe` method.  A single regular expression\n  expressing the entire pattern.  This is useful in cases where you wish\n  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n  Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n  false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n  filename, and match it against a single row in the `regExpSet`.  This\n  method is mainly for internal use, but is exposed so that it can be\n  used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items.  So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export.  Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`.  Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob.  If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself.  When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes.  For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated.  Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally.  This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything.  Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set.  This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes.  For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`.  This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern.  Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity.  Since those two are valid, matching proceeds.\n",
   "readmeFilename": "README.md",
   "bugs": {
@@ -36,5 +36,5 @@
   },
   "homepage": "https://github.com/isaacs/minimatch",
-  "_id": "minimatch@0.2.12",
-  "_from": "minimatch@0.x.x"
+  "_id": "minimatch@0.2.14",
+  "_from": "minimatch@~0.2.12"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/minimatch/test/extglob-ending-with-state-char.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/minimatch/test/extglob-ending-with-state-char.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/minimatch/test/extglob-ending-with-state-char.js	(revision 516)
@@ -0,0 +1,8 @@
+var test = require('tap').test
+var minimatch = require('../')
+
+test('extglob ending with statechar', function(t) {
+  t.notOk(minimatch('ax', 'a?(b*)'))
+  t.ok(minimatch('ax', '?(a*|b)'))
+  t.end()
+})
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/rimraf/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/rimraf/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/rimraf/README.md	(revision 516)
@@ -1,3 +1,3 @@
-A `rm -rf` for node.
+`rm -rf` for node.
 
 Install with `npm install rimraf`, or just drop rimraf.js somewhere.
@@ -10,9 +10,8 @@
 errors are handled for you:
 
-* `EBUSY` -  rimraf will back off a maximum of opts.maxBusyTries times
-  before giving up.
-* `EMFILE` - If too many file descriptors get opened, rimraf will
-  patiently wait until more become available.
-
+* Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of
+  `opts.maxBusyTries` times before giving up.
+* `ENOENT` - If the file doesn't exist, rimraf will return
+  successfully, since your desired outcome is already the case.
 
 ## rimraf.sync
@@ -20,2 +19,12 @@
 It can remove stuff synchronously, too.  But that's not so good.  Use
 the async API.  It's better.
+
+## CLI
+
+If installed with `npm install rimraf -g` it can be used as a global
+command `rimraf <path>` which is useful for cross platform support.
+
+## mkdirp
+
+If you need to create a directory recursively, check out
+[mkdirp](https://github.com/substack/node-mkdirp).
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/rimraf/bin.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/rimraf/bin.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/rimraf/bin.js	(revision 516)
@@ -0,0 +1,33 @@
+#!/usr/bin/env node
+
+var rimraf = require('./')
+
+var help = false
+var dashdash = false
+var args = process.argv.slice(2).filter(function(arg) {
+  if (dashdash)
+    return !!arg
+  else if (arg === '--')
+    dashdash = true
+  else if (arg.match(/^(-+|\/)(h(elp)?|\?)$/))
+    help = true
+  else
+    return !!arg
+});
+
+if (help || args.length === 0) {
+  // If they didn't ask for help, then this is not a "success"
+  var log = help ? console.log : console.error
+  log('Usage: rimraf <path>')
+  log('')
+  log('  Deletes all files and folders at "path" recursively.')
+  log('')
+  log('Options:')
+  log('')
+  log('  -h, --help    Display this usage info')
+  process.exit(help ? 0 : 1)
+} else {
+  args.forEach(function(arg) {
+    rimraf.sync(arg)
+  })
+}
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/rimraf/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/rimraf/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/rimraf/package.json	(revision 516)
@@ -1,5 +1,5 @@
 {
   "name": "rimraf",
-  "version": "2.0.3",
+  "version": "2.2.6",
   "main": "rimraf.js",
   "description": "A deep deletion module for node (like `rm -rf`)",
@@ -13,7 +13,4 @@
     "url": "https://github.com/isaacs/rimraf/raw/master/LICENSE"
   },
-  "optionalDependencies": {
-    "graceful-fs": "~1.1"
-  },
   "repository": {
     "type": "git",
@@ -22,4 +19,7 @@
   "scripts": {
     "test": "cd test && bash run.sh"
+  },
+  "bin": {
+    "rimraf": "./bin.js"
   },
   "contributors": [
@@ -46,5 +46,5 @@
     }
   ],
-  "readme": "A `rm -rf` for node.\n\nInstall with `npm install rimraf`, or just drop rimraf.js somewhere.\n\n## API\n\n`rimraf(f, callback)`\n\nThe callback will be called with an error if there is one.  Certain\nerrors are handled for you:\n\n* `EBUSY` -  rimraf will back off a maximum of opts.maxBusyTries times\n  before giving up.\n* `EMFILE` - If too many file descriptors get opened, rimraf will\n  patiently wait until more become available.\n\n\n## rimraf.sync\n\nIt can remove stuff synchronously, too.  But that's not so good.  Use\nthe async API.  It's better.\n",
+  "readme": "`rm -rf` for node.\n\nInstall with `npm install rimraf`, or just drop rimraf.js somewhere.\n\n## API\n\n`rimraf(f, callback)`\n\nThe callback will be called with an error if there is one.  Certain\nerrors are handled for you:\n\n* Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of\n  `opts.maxBusyTries` times before giving up.\n* `ENOENT` - If the file doesn't exist, rimraf will return\n  successfully, since your desired outcome is already the case.\n\n## rimraf.sync\n\nIt can remove stuff synchronously, too.  But that's not so good.  Use\nthe async API.  It's better.\n\n## CLI\n\nIf installed with `npm install rimraf -g` it can be used as a global\ncommand `rimraf <path>` which is useful for cross platform support.\n\n## mkdirp\n\nIf you need to create a directory recursively, check out\n[mkdirp](https://github.com/substack/node-mkdirp).\n",
   "readmeFilename": "README.md",
   "bugs": {
@@ -52,8 +52,9 @@
   },
   "homepage": "https://github.com/isaacs/rimraf",
-  "dependencies": {
-    "graceful-fs": "~1.1"
+  "_id": "rimraf@2.2.6",
+  "dist": {
+    "shasum": "c28d4de4cafcd392b82d02729509c65e3502240c"
   },
-  "_id": "rimraf@2.0.3",
-  "_from": "rimraf@~2.0.3"
+  "_from": "rimraf@~2.2.6",
+  "_resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/rimraf/rimraf.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/rimraf/rimraf.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/rimraf/rimraf.js	(revision 516)
@@ -3,23 +3,5 @@
 
 var path = require("path")
-  , fs
-
-try {
-  // optional dependency
-  fs = require("graceful-fs")
-} catch (er) {
-  fs = require("fs")
-}
-
-var lstat = "lstat"
-if (process.platform === "win32") {
-  // not reliable on windows prior to 0.7.9
-  var v = process.version.replace(/^v/, '').split(/\.|-/).map(Number)
-  if (v[0] === 0 && (v[1] < 7 || v[1] == 7 && v[2] < 9)) {
-    lstat = "stat"
-  }
-}
-if (!fs[lstat]) lstat = "stat"
-var lstatSync = lstat + "Sync"
+var fs = require("fs")
 
 // for EMFILE handling
@@ -28,13 +10,14 @@
 exports.BUSYTRIES_MAX = 3
 
+var isWindows = (process.platform === "win32")
+
 function rimraf (p, cb) {
-
   if (!cb) throw new Error("No callback passed to rimraf()")
 
   var busyTries = 0
-
   rimraf_(p, function CB (er) {
     if (er) {
-      if (er.code === "EBUSY" && busyTries < exports.BUSYTRIES_MAX) {
+      if (isWindows && (er.code === "EBUSY" || er.code === "ENOTEMPTY") &&
+          busyTries < exports.BUSYTRIES_MAX) {
         busyTries ++
         var time = busyTries * 100
@@ -61,98 +44,132 @@
 }
 
+// Two possible strategies.
+// 1. Assume it's a file.  unlink it, then do the dir stuff on EPERM or EISDIR
+// 2. Assume it's a directory.  readdir, then do the file stuff on ENOTDIR
+//
+// Both result in an extra syscall when you guess wrong.  However, there
+// are likely far more normal files in the world than directories.  This
+// is based on the assumption that a the average number of files per
+// directory is >= 1.
+//
+// If anyone ever complains about this, then I guess the strategy could
+// be made configurable somehow.  But until then, YAGNI.
 function rimraf_ (p, cb) {
-  fs[lstat](p, function (er, s) {
+  fs.unlink(p, function (er) {
     if (er) {
-      // already gone
-      if (er.code === "ENOENT") return cb()
-      // some other kind of error, permissions, etc.
-      return cb(er)
+      if (er.code === "ENOENT")
+        return cb(null)
+      if (er.code === "EPERM")
+        return (isWindows) ? fixWinEPERM(p, er, cb) : rmdir(p, er, cb)
+      if (er.code === "EISDIR")
+        return rmdir(p, er, cb)
     }
-
-    return rm_(p, s, false, cb)
+    return cb(er)
   })
 }
 
-
-var myGid = function myGid () {
-  var g = process.getgid && process.getgid()
-  myGid = function myGid () { return g }
-  return g
+function fixWinEPERM (p, er, cb) {
+  fs.chmod(p, 666, function (er2) {
+    if (er2)
+      cb(er2.code === "ENOENT" ? null : er)
+    else
+      fs.stat(p, function(er3, stats) {
+        if (er3)
+          cb(er3.code === "ENOENT" ? null : er)
+        else if (stats.isDirectory())
+          rmdir(p, er, cb)
+        else
+          fs.unlink(p, cb)
+      })
+  })
 }
 
-var myUid = function myUid () {
-  var u = process.getuid && process.getuid()
-  myUid = function myUid () { return u }
-  return u
+function fixWinEPERMSync (p, er, cb) {
+  try {
+    fs.chmodSync(p, 666)
+  } catch (er2) {
+    if (er2.code !== "ENOENT")
+      throw er
+  }
+
+  try {
+    var stats = fs.statSync(p)
+  } catch (er3) {
+    if (er3 !== "ENOENT")
+      throw er
+  }
+
+  if (stats.isDirectory())
+    rmdirSync(p, er)
+  else
+    fs.unlinkSync(p)
 }
 
-
-function writable (s) {
-  var mode = s.mode || 0777
-    , uid = myUid()
-    , gid = myGid()
-  return (mode & 0002)
-      || (gid === s.gid && (mode & 0020))
-      || (uid === s.uid && (mode & 0200))
+function rmdir (p, originalEr, cb) {
+  // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
+  // if we guessed wrong, and it's not a directory, then
+  // raise the original error.
+  fs.rmdir(p, function (er) {
+    if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM"))
+      rmkids(p, cb)
+    else if (er && er.code === "ENOTDIR")
+      cb(originalEr)
+    else
+      cb(er)
+  })
 }
 
-function rm_ (p, s, didWritableCheck, cb) {
-  if (!didWritableCheck && !writable(s)) {
-    // make file writable
-    // user/group/world, doesn't matter at this point
-    // since it's about to get nuked.
-    return fs.chmod(p, s.mode | 0222, function (er) {
-      if (er) return cb(er)
-      rm_(p, s, true, cb)
-    })
-  }
-
-  if (!s.isDirectory()) {
-    return fs.unlink(p, cb)
-  }
-
-  // directory
+function rmkids(p, cb) {
   fs.readdir(p, function (er, files) {
-    if (er) return cb(er)
-    asyncForEach(files.map(function (f) {
-      return path.join(p, f)
-    }), function (file, cb) {
-      rimraf(file, cb)
-    }, function (er) {
-      if (er) return cb(er)
-      fs.rmdir(p, cb)
+    if (er)
+      return cb(er)
+    var n = files.length
+    if (n === 0)
+      return fs.rmdir(p, cb)
+    var errState
+    files.forEach(function (f) {
+      rimraf(path.join(p, f), function (er) {
+        if (errState)
+          return
+        if (er)
+          return cb(errState = er)
+        if (--n === 0)
+          fs.rmdir(p, cb)
+      })
     })
   })
 }
 
-function asyncForEach (list, fn, cb) {
-  if (!list.length) cb()
-  var c = list.length
-    , errState = null
-  list.forEach(function (item, i, list) {
-    fn(item, function (er) {
-      if (errState) return
-      if (er) return cb(errState = er)
-      if (-- c === 0) return cb()
-    })
-  })
+// this looks simpler, and is strictly *faster*, but will
+// tie up the JavaScript thread and fail on excessively
+// deep directory trees.
+function rimrafSync (p) {
+  try {
+    fs.unlinkSync(p)
+  } catch (er) {
+    if (er.code === "ENOENT")
+      return
+    if (er.code === "EPERM")
+      return isWindows ? fixWinEPERMSync(p, er) : rmdirSync(p, er)
+    if (er.code !== "EISDIR")
+      throw er
+    rmdirSync(p, er)
+  }
 }
 
-// this looks simpler, but it will fail with big directory trees,
-// or on slow stupid awful cygwin filesystems
-function rimrafSync (p) {
+function rmdirSync (p, originalEr) {
   try {
-    var s = fs[lstatSync](p)
+    fs.rmdirSync(p)
   } catch (er) {
-    if (er.code === "ENOENT") return
-    throw er
+    if (er.code === "ENOENT")
+      return
+    if (er.code === "ENOTDIR")
+      throw originalEr
+    if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")
+      rmkidsSync(p)
   }
+}
 
-  if (!writable(s)) {
-    fs.chmodSync(p, s.mode | 0222)
-  }
-
-  if (!s.isDirectory()) return fs.unlinkSync(p)
-
+function rmkidsSync (p) {
   fs.readdirSync(p).forEach(function (f) {
     rimrafSync(path.join(p, f))
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/underscore.string/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/underscore.string/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/node_modules/underscore.string/package.json	(revision 516)
@@ -69,8 +69,4 @@
   "readmeFilename": "README.markdown",
   "_id": "underscore.string@2.2.1",
-  "dist": {
-    "shasum": "2aa155e7c49bcbfd88ec69b8c9694d885385c717"
-  },
-  "_from": "underscore.string@~2.2.1",
-  "_resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz"
+  "_from": "underscore.string@~2.2.1"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/grunt/package.json	(revision 516)
@@ -2,5 +2,5 @@
   "name": "grunt",
   "description": "The JavaScript Task Runner",
-  "version": "0.4.2",
+  "version": "0.4.4",
   "author": {
     "name": "\"Cowboy\" Ben Alman",
@@ -59,5 +59,5 @@
     "minimatch": "~0.2.12",
     "nopt": "~1.0.10",
-    "rimraf": "~2.0.3",
+    "rimraf": "~2.2.6",
     "lodash": "~0.9.2",
     "underscore.string": "~2.2.1",
@@ -65,5 +65,6 @@
     "js-yaml": "~2.0.5",
     "exit": "~0.1.1",
-    "getobject": "~0.1.0"
+    "getobject": "~0.1.0",
+    "grunt-legacy-util": "~0.1.2"
   },
   "devDependencies": {
@@ -76,11 +77,11 @@
     "shelljs": "~0.2.5"
   },
-  "readme": "# Grunt: The JavaScript Task Runner [![Build Status](https://secure.travis-ci.org/gruntjs/grunt.png?branch=master)](http://travis-ci.org/gruntjs/grunt)\n\n<img align=\"right\" height=\"260\" src=\"http://gruntjs.com/img/grunt-logo-no-wordmark.svg\">\n\n\n### Documentation\n\nVisit the [gruntjs.com](http://gruntjs.com/) website for all the things.\n\n### Support / Contributing\nBefore you make an issue, please read our [Contributing](http://gruntjs.com/contributing) guide.\n\nYou can find the grunt team in [#grunt on irc.freenode.net](http://webchat.freenode.net/?channels=grunt).\n\n### Release History\nSee the [CHANGELOG](CHANGELOG).\n",
+  "readme": "# Grunt: The JavaScript Task Runner\n\n[![Build Status](https://secure.travis-ci.org/gruntjs/grunt.png?branch=master)](http://travis-ci.org/gruntjs/grunt)\n[![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/)\n\n<img align=\"right\" height=\"260\" src=\"http://gruntjs.com/img/grunt-logo-no-wordmark.svg\">\n\n\n### Documentation\n\nVisit the [gruntjs.com](http://gruntjs.com/) website for all the things.\n\n### Support / Contributing\nBefore you make an issue, please read our [Contributing](http://gruntjs.com/contributing) guide.\n\nYou can find the grunt team in [#grunt on irc.freenode.net](http://webchat.freenode.net/?channels=grunt).\n\n### Release History\nSee the [CHANGELOG](CHANGELOG).\n",
   "readmeFilename": "README.md",
-  "_id": "grunt@0.4.2",
+  "_id": "grunt@0.4.4",
   "dist": {
-    "shasum": "1f6804f00e977dd90b9f97b1faed480215db0857"
+    "shasum": "64f477fef801475ab92f1819a691c6c71b72902e"
   },
-  "_from": "grunt@0.4.2",
-  "_resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.2.tgz"
+  "_from": "grunt@0.4.4",
+  "_resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.4.tgz"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/mout/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/mout/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/mout/package.json	(revision 516)
@@ -74,8 +74,8 @@
   "readmeFilename": "README.md",
   "_id": "mout@0.3.0",
-  "_from": "mout@0.3.0",
   "dist": {
     "shasum": "f4be536a04a0e0faebdc81bb68a23ceaba4d6c90"
   },
+  "_from": "mout@0.3.0",
   "_resolved": "https://registry.npmjs.org/mout/-/mout-0.3.0.tgz"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/underscore/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/underscore/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/node_modules/underscore/package.json	(revision 516)
@@ -32,8 +32,4 @@
   },
   "_id": "underscore@1.4.4",
-  "_from": "underscore@1.4.4",
-  "dist": {
-    "shasum": "3e7ceb21f205bc19964685e1fdd52c8f77773674"
-  },
-  "_resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz"
+  "_from": "underscore@1.4.4"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt-lib-amd/package.json	(revision 516)
@@ -34,4 +34,10 @@
   },
   "_from": "grunt-lib-amd@0.1.x",
-  "_resolved": "https://registry.npmjs.org/grunt-lib-amd/-/grunt-lib-amd-0.1.3.tgz"
+  "_resolved": "https://registry.npmjs.org/grunt-lib-amd/-/grunt-lib-amd-0.1.3.tgz",
+  "devDependencies": {
+    "amdefine": "0.0.8",
+    "underscore": "^1.4.4",
+    "grunt": "^0.4.4",
+    "mout": "^0.3.0"
+  }
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/.npmignore
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/.npmignore	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/.npmignore	(revision 516)
@@ -4,5 +4,5 @@
 AUTHORS
 CHANGELOG
-CONTRIBUTING.MD
+CONTRIBUTING.md
 custom-gruntfile.js
 Gruntfile.js
Index: v/trunk/node_modules/grunt-amd-check/node_modules/grunt/CONTRIBUTING.md
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/CONTRIBUTING.md	(revision 515)
+++ 	(revision )
@@ -1,1 +1,0 @@
-Please see the [Contributing to grunt](http://gruntjs.com/contributing) guide for information on contributing to this project.
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/LICENSE-MIT
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/LICENSE-MIT	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/LICENSE-MIT	(revision 516)
@@ -1,3 +1,3 @@
-Copyright (c) 2013 "Cowboy" Ben Alman
+Copyright (c) 2014 "Cowboy" Ben Alman
 
 Permission is hereby granted, free of charge, to any person
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/README.md	(revision 516)
@@ -1,3 +1,6 @@
-# Grunt: The JavaScript Task Runner [![Build Status](https://secure.travis-ci.org/gruntjs/grunt.png?branch=master)](http://travis-ci.org/gruntjs/grunt)
+# Grunt: The JavaScript Task Runner
+
+[![Build Status](https://secure.travis-ci.org/gruntjs/grunt.png?branch=master)](http://travis-ci.org/gruntjs/grunt)
+[![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/)
 
 <img align="right" height="260" src="http://gruntjs.com/img/grunt-logo-no-wordmark.svg">
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/internal-tasks/bump.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/internal-tasks/bump.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/internal-tasks/bump.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman, contributors
+ * Copyright (c) 2014 "Cowboy" Ben Alman, contributors
  * Licensed under the MIT license.
  */
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/internal-tasks/subgrunt.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/internal-tasks/subgrunt.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/internal-tasks/subgrunt.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
@@ -23,5 +23,9 @@
   return grunt[name] = require('./grunt/' + name);
 }
-var util = gRequire('util');
+
+var util = require('grunt-legacy-util');
+grunt.util = util;
+grunt.util.task = require('./util/task');
+
 gRequire('template');
 gRequire('event');
@@ -153,4 +157,6 @@
   // allows the error callback to execute multiple times.
   tasks.forEach(function(name) { task.run(name); });
-  task.start();
+  // Run tasks async internally to reduce call-stack, per:
+  // https://github.com/gruntjs/grunt/pull/1026
+  task.start({asyncDone:true});
 };
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/cli.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/cli.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/cli.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
@@ -22,5 +22,5 @@
   // CLI-parsed options override any passed-in "default" options.
   if (options) {
-    // For each defult option...
+    // For each default option...
     Object.keys(options).forEach(function(key) {
       if (!(key in cli.options)) {
@@ -62,5 +62,5 @@
     short: 'd',
     info: 'Enable debugging mode for tasks that support it.',
-    type: Number
+    type: [Number, Boolean]
   },
   stack: {
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/config.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/config.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/config.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/event.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/event.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/event.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/fail.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/fail.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/fail.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/file.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/file.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/file.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
@@ -134,7 +134,15 @@
 var pathSeparatorRe = /[\/\\]/g;
 
+// The "ext" option refers to either everything after the first dot (default)
+// or everything after the last dot.
+var extDotRe = {
+  first: /(\.[^\/]*)?$/,
+  last: /(\.[^\/\.]*)?$/,
+};
+
 // Build a multi task "files" object dynamically.
 file.expandMapping = function(patterns, destBase, options) {
   options = grunt.util._.defaults({}, options, {
+    extDot: 'first',
     rename: function(destBase, destPath) {
       return path.join(destBase || '', destPath);
@@ -151,6 +159,6 @@
     }
     // Change the extension?
-    if (options.ext) {
-      destPath = destPath.replace(/(\.[^\/]*)?$/, options.ext);
+    if ('ext' in options) {
+      destPath = destPath.replace(extDotRe[options.extDot], options.ext);
     }
     // Generate destination filename.
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/help.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/help.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/help.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/log.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/log.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/log.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/option.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/option.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/option.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/task.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/task.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/task.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
@@ -108,5 +108,5 @@
       }
     } else if (Array.isArray(data.files)) {
-      data.files.forEach(function(obj) {
+      grunt.util._.flatten(data.files).forEach(function(obj) {
         var prop;
         if ('src' in obj || 'dest' in obj) {
@@ -245,4 +245,9 @@
       return options;
     };
+    // Expose the current target.
+    this.target = target;
+    // Recreate flags object so that the target isn't set as a flag.
+    this.flags = {};
+    this.args.forEach(function(arg) { this.flags[arg] = true; }, this);
     // Expose data on `this` (as well as task.current).
     this.data = grunt.config([name, target]);
@@ -256,9 +261,4 @@
       }.bind(this)
     });
-    // Expose the current target.
-    this.target = target;
-    // Recreate flags object so that the target isn't set as a flag.
-    this.flags = {};
-    this.args.forEach(function(arg) { this.flags[arg] = true; }, this);
     // Call original task function, passing in the target and any other args.
     return fn.apply(this, this.args);
@@ -278,9 +278,16 @@
 // Override built-in renameTask to use the registry.
 task.renameTask = function(oldname, newname) {
-  // Add and remove task.
-  registry.untasks.push(oldname);
-  registry.tasks.push(newname);
-  // Actually rename task.
-  return parent.renameTask.apply(task, arguments);
+  var result;
+  try {
+    // Actually rename task.
+    result = parent.renameTask.apply(task, arguments);
+    // Add and remove task.
+    registry.untasks.push(oldname);
+    registry.tasks.push(newname);
+    // Return result.
+    return result;
+  } catch(e) {
+    grunt.log.error(e.message);
+  }
 };
 
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/template.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/template.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/template.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: v/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/util.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/grunt/util.js	(revision 515)
+++ 	(revision )
@@ -1,188 +1,0 @@
-/*
- * grunt
- * http://gruntjs.com/
- *
- * Copyright (c) 2013 "Cowboy" Ben Alman
- * Licensed under the MIT license.
- * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
- */
-
-'use strict';
-
-// Nodejs libs.
-var spawn = require('child_process').spawn;
-var nodeUtil = require('util');
-var path = require('path');
-
-// The module to be exported.
-var util = module.exports = {};
-
-// A few internal utilites, exposed.
-util.task = require('../util/task');
-util.namespace = require('getobject');
-
-// External libs.
-util.hooker = require('hooker');
-util.async = require('async');
-var _ = util._ = require('lodash');
-var which = require('which').sync;
-// Instead of process.exit. See https://github.com/cowboy/node-exit
-util.exit = require('exit');
-
-// Mixin Underscore.string methods.
-_.str = require('underscore.string');
-_.mixin(_.str.exports());
-
-// Return a function that normalizes the given function either returning a
-// value or accepting a "done" callback that accepts a single value.
-util.callbackify = function(fn) {
-  return function callbackable() {
-    // Invoke original function, getting its result.
-    var result = fn.apply(this, arguments);
-    // If the same number or less arguments were specified than fn accepts,
-    // assume the "done" callback was already handled.
-    var length = arguments.length;
-    if (length === fn.length) { return; }
-    // Otherwise, if the last argument is a function, assume it is a "done"
-    // callback and call it.
-    var done = arguments[length - 1];
-    if (typeof done === 'function') { done(result); }
-  };
-};
-
-// Create a new Error object, with an origError property that will be dumped
-// if grunt was run with the --debug=9 option.
-util.error = function(err, origError) {
-  if (!nodeUtil.isError(err)) { err = new Error(err); }
-  if (origError) { err.origError = origError; }
-  return err;
-};
-
-// The line feed char for the current system.
-util.linefeed = process.platform === 'win32' ? '\r\n' : '\n';
-
-// Normalize linefeeds in a string.
-util.normalizelf = function(str) {
-  return str.replace(/\r\n|\n/g, util.linefeed);
-};
-
-// What "kind" is a value?
-// I really need to rework https://github.com/cowboy/javascript-getclass
-var kindsOf = {};
-'Number String Boolean Function RegExp Array Date Error'.split(' ').forEach(function(k) {
-  kindsOf['[object ' + k + ']'] = k.toLowerCase();
-});
-util.kindOf = function(value) {
-  // Null or undefined.
-  if (value == null) { return String(value); }
-  // Everything else.
-  return kindsOf[kindsOf.toString.call(value)] || 'object';
-};
-
-// Coerce something to an Array.
-util.toArray = Function.call.bind(Array.prototype.slice);
-
-// Return the string `str` repeated `n` times.
-util.repeat = function(n, str) {
-  return new Array(n + 1).join(str || ' ');
-};
-
-// Given str of "a/b", If n is 1, return "a" otherwise "b".
-util.pluralize = function(n, str, separator) {
-  var parts = str.split(separator || '/');
-  return n === 1 ? (parts[0] || '') : (parts[1] || '');
-};
-
-// Recurse through objects and arrays, executing fn for each non-object.
-util.recurse = function recurse(value, fn, fnContinue) {
-  var obj;
-  if (fnContinue && fnContinue(value) === false) {
-    // Skip value if necessary.
-    return value;
-  } else if (util.kindOf(value) === 'array') {
-    // If value is an array, recurse.
-    return value.map(function(value) {
-      return recurse(value, fn, fnContinue);
-    });
-  } else if (util.kindOf(value) === 'object') {
-    // If value is an object, recurse.
-    obj = {};
-    Object.keys(value).forEach(function(key) {
-      obj[key] = recurse(value[key], fn, fnContinue);
-    });
-    return obj;
-  } else {
-    // Otherwise pass value into fn and return.
-    return fn(value);
-  }
-};
-
-// Spawn a child process, capturing its stdout and stderr.
-util.spawn = function(opts, done) {
-  // Build a result object and pass it (among other things) into the
-  // done function.
-  var callDone = function(code, stdout, stderr) {
-    // Remove trailing whitespace (newline)
-    stdout = _.rtrim(stdout);
-    stderr = _.rtrim(stderr);
-    // Create the result object.
-    var result = {
-      stdout: stdout,
-      stderr: stderr,
-      code: code,
-      toString: function() {
-        if (code === 0) {
-          return stdout;
-        } else if ('fallback' in opts) {
-          return opts.fallback;
-        } else if (opts.grunt) {
-          // grunt.log.error uses standard out, to be fixed in 0.5.
-          return stderr || stdout;
-        }
-        return stderr;
-      }
-    };
-    // On error (and no fallback) pass an error object, otherwise pass null.
-    done(code === 0 || 'fallback' in opts ? null : new Error(stderr), result, code);
-  };
-
-  var cmd, args;
-  var pathSeparatorRe = /[\\\/]/g;
-  if (opts.grunt) {
-    cmd = process.argv[0];
-    args = [process.argv[1]].concat(opts.args);
-  } else {
-    // On Windows, child_process.spawn will only file .exe files in the PATH,
-    // not other executable types (grunt issue #155).
-    try {
-      if (!pathSeparatorRe.test(opts.cmd)) {
-        // Only use which if cmd has no path component.
-        cmd = which(opts.cmd);
-      } else {
-        cmd = opts.cmd.replace(pathSeparatorRe, path.sep);
-      }
-    } catch (err) {
-      callDone(127, '', String(err));
-      return;
-    }
-    args = opts.args;
-  }
-
-  var child = spawn(cmd, args, opts.opts);
-  var stdout = new Buffer('');
-  var stderr = new Buffer('');
-  if (child.stdout) {
-    child.stdout.on('data', function(buf) {
-      stdout = Buffer.concat([stdout, new Buffer(buf)]);
-    });
-  }
-  if (child.stderr) {
-    child.stderr.on('data', function(buf) {
-      stderr = Buffer.concat([stderr, new Buffer(buf)]);
-    });
-  }
-  child.on('close', function(code) {
-    callDone(code, stdout.toString(), stderr.toString());
-  });
-  return child;
-};
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/util/task.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/util/task.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/lib/util/task.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
@@ -90,4 +90,7 @@
   // easier to implement than some kind of in-task "super" functionality.
   Task.prototype.renameTask = function(oldname, newname) {
+    if (!this._tasks[oldname]) {
+      throw new Error('Cannot rename missing "' + oldname + '" task.');
+    }
     // Rename task.
     this._tasks[newname] = this._tasks[oldname];
@@ -186,5 +189,5 @@
 
   // Run a task function, handling this.async / return value.
-  Task.prototype.runTaskFn = function(context, fn, done) {
+  Task.prototype.runTaskFn = function(context, fn, done, asyncDone) {
     // Async flag.
     var async = false;
@@ -213,5 +216,13 @@
         this._options.error.call({name: context.name, nameArgs: context.nameArgs}, err);
       }
-      done(err, success);
+      // only call done async if explicitly requested to
+      // see: https://github.com/gruntjs/grunt/pull/1026
+      if (asyncDone) {
+        process.nextTick(function () {
+          done(err, success);
+        });
+      } else {
+        done(err, success);
+      }
     }.bind(this);
 
@@ -244,5 +255,8 @@
 
   // Begin task queue processing. Ie. run all tasks.
-  Task.prototype.start = function() {
+  Task.prototype.start = function(opts) {
+    if (!opts) {
+      opts = {};
+    }
     // Abort if already running.
     if (this._running) { return false; }
@@ -281,5 +295,5 @@
       this.runTaskFn(context, function() {
         return thing.task.fn.apply(this, this.args);
-      }, nextTask);
+      }, nextTask, !!opts.asyncDone);
 
     }.bind(this);
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/.bin/rimraf
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/.bin/rimraf	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/.bin/rimraf	(revision 516)
@@ -0,0 +1,1 @@
+link ../rimraf/bin.js
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/colors/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/colors/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/colors/package.json	(revision 516)
@@ -26,9 +26,4 @@
   "readmeFilename": "ReadMe.md",
   "_id": "colors@0.6.2",
-  "dist": {
-    "shasum": "57915cf80820c121e254ec8b7819ab808d2beae5"
-  },
-  "_from": "colors@~0.6.2",
-  "_resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
-  "scripts": {}
+  "_from": "colors@~0.6.2"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/eventemitter2/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/eventemitter2/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/eventemitter2/package.json	(revision 516)
@@ -59,8 +59,4 @@
   "homepage": "https://github.com/hij1nx/EventEmitter2",
   "_id": "eventemitter2@0.4.13",
-  "dist": {
-    "shasum": "2a03bdff50bda6586cf2e27c71feeaf6d37c383c"
-  },
-  "_from": "eventemitter2@~0.4.13",
-  "_resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.13.tgz"
+  "_from": "eventemitter2@~0.4.13"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/exit/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/exit/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/exit/package.json	(revision 516)
@@ -48,8 +48,4 @@
   "readmeFilename": "README.md",
   "_id": "exit@0.1.2",
-  "dist": {
-    "shasum": "2a1f6b7dd67aedcf9544e948cc817113b64012a5"
-  },
-  "_from": "exit@~0.1.1",
-  "_resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz"
+  "_from": "exit@~0.1.1"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/getobject/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/getobject/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/getobject/package.json	(revision 516)
@@ -45,8 +45,4 @@
   "readmeFilename": "README.md",
   "_id": "getobject@0.1.0",
-  "dist": {
-    "shasum": "4563bd9ebffaa0790ee7eec6e2d74523b7e852a6"
-  },
-  "_from": "getobject@~0.1.0",
-  "_resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz"
+  "_from": "getobject@~0.1.0"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/glob/node_modules/inherits/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/glob/node_modules/inherits/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/glob/node_modules/inherits/package.json	(revision 516)
@@ -27,8 +27,4 @@
   "homepage": "https://github.com/isaacs/inherits",
   "_id": "inherits@1.0.0",
-  "dist": {
-    "shasum": "26467026b3b86de1c6f72f00d9a31b1c97077a92"
-  },
-  "_from": "inherits@1",
-  "_resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz"
+  "_from": "inherits@1"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/.npmignore
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/.npmignore	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/.npmignore	(revision 516)
@@ -0,0 +1,1 @@
+node_modules
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/Gruntfile.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/Gruntfile.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/Gruntfile.js	(revision 516)
@@ -0,0 +1,16 @@
+'use strict';
+
+module.exports = function(grunt) {
+
+  grunt.initConfig({
+    nodeunit: {
+      util: ['test/index.js']
+    },
+
+  });
+
+  grunt.loadNpmTasks('grunt-contrib-nodeunit');
+
+  grunt.registerTask('default', ['nodeunit']);
+
+};
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/LICENSE-MIT
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/LICENSE-MIT	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/LICENSE-MIT	(revision 516)
@@ -0,0 +1,22 @@
+Copyright (c) 2014 "Cowboy" Ben Alman
+
+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.
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/README.md	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/README.md	(revision 516)
@@ -0,0 +1,26 @@
+# grunt-legacy-util
+> Deprecated Grunt utils provided for backwards compatibility.
+
+`grunt.util.namespace` use [getobject]  
+`grunt.util.hooker` use [hooker]  
+`grunt.util.async` use [async]  
+`grunt.util._` use [lodash]  
+`grunt.util.exit` use [exit]  
+`grunt.util.callbackify`  
+`grunt.util.error`  
+`grunt.util.linefeed`  
+`grunt.util.normalizelf`  
+`grunt.util.kindOf` use [lodash]  
+`grunt.util.toArray`
+`grunt.util.repeat`  
+`grunt.util.pluralize`  
+`grunt.util.recurse` use [traverse]  
+`grunt.util.spawn`  
+
+
+[getobject]: https://www.npmjs.org/package/getobject
+[hooker]: https://www.npmjs.org/package/hooker
+[async]: https://www.npmjs.org/package/async
+[lodash]: https://www.npmjs.org/package/lodash
+[exit]: https://www.npmjs.org/package/exit
+[traverse]: https://www.npmjs.org/package/lodash
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/index.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/index.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/index.js	(revision 516)
@@ -0,0 +1,187 @@
+/*
+ * grunt
+ * http://gruntjs.com/
+ *
+ * Copyright (c) 2014 "Cowboy" Ben Alman
+ * Licensed under the MIT license.
+ * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
+ */
+
+'use strict';
+
+// Nodejs libs.
+var spawn = require('child_process').spawn;
+var nodeUtil = require('util');
+var path = require('path');
+
+// The module to be exported.
+var util = module.exports = {};
+
+util.namespace = require('getobject');
+
+// External libs.
+util.hooker = require('hooker');
+util.async = require('async');
+var _ = util._ = require('lodash');
+var which = require('which').sync;
+// Instead of process.exit. See https://github.com/cowboy/node-exit
+util.exit = require('exit');
+
+// Mixin Underscore.string methods.
+_.str = require('underscore.string');
+_.mixin(_.str.exports());
+
+// Return a function that normalizes the given function either returning a
+// value or accepting a "done" callback that accepts a single value.
+util.callbackify = function(fn) {
+  return function callbackable() {
+    // Invoke original function, getting its result.
+    var result = fn.apply(this, arguments);
+    // If the same number or less arguments were specified than fn accepts,
+    // assume the "done" callback was already handled.
+    var length = arguments.length;
+    if (length === fn.length) { return; }
+    // Otherwise, if the last argument is a function, assume it is a "done"
+    // callback and call it.
+    var done = arguments[length - 1];
+    if (typeof done === 'function') { done(result); }
+  };
+};
+
+// Create a new Error object, with an origError property that will be dumped
+// if grunt was run with the --debug=9 option.
+util.error = function(err, origError) {
+  if (!nodeUtil.isError(err)) { err = new Error(err); }
+  if (origError) { err.origError = origError; }
+  return err;
+};
+
+// The line feed char for the current system.
+util.linefeed = process.platform === 'win32' ? '\r\n' : '\n';
+
+// Normalize linefeeds in a string.
+util.normalizelf = function(str) {
+  return str.replace(/\r\n|\n/g, util.linefeed);
+};
+
+// What "kind" is a value?
+// I really need to rework https://github.com/cowboy/javascript-getclass
+var kindsOf = {};
+'Number String Boolean Function RegExp Array Date Error'.split(' ').forEach(function(k) {
+  kindsOf['[object ' + k + ']'] = k.toLowerCase();
+});
+util.kindOf = function(value) {
+  // Null or undefined.
+  if (value == null) { return String(value); }
+  // Everything else.
+  return kindsOf[kindsOf.toString.call(value)] || 'object';
+};
+
+// Coerce something to an Array.
+util.toArray = Function.call.bind(Array.prototype.slice);
+
+// Return the string `str` repeated `n` times.
+util.repeat = function(n, str) {
+  return new Array(n + 1).join(str || ' ');
+};
+
+// Given str of "a/b", If n is 1, return "a" otherwise "b".
+util.pluralize = function(n, str, separator) {
+  var parts = str.split(separator || '/');
+  return n === 1 ? (parts[0] || '') : (parts[1] || '');
+};
+
+// Recurse through objects and arrays, executing fn for each non-object.
+util.recurse = function recurse(value, fn, fnContinue) {
+  var obj;
+  if (fnContinue && fnContinue(value) === false) {
+    // Skip value if necessary.
+    return value;
+  } else if (util.kindOf(value) === 'array') {
+    // If value is an array, recurse.
+    return value.map(function(value) {
+      return recurse(value, fn, fnContinue);
+    });
+  } else if (util.kindOf(value) === 'object') {
+    // If value is an object, recurse.
+    obj = {};
+    Object.keys(value).forEach(function(key) {
+      obj[key] = recurse(value[key], fn, fnContinue);
+    });
+    return obj;
+  } else {
+    // Otherwise pass value into fn and return.
+    return fn(value);
+  }
+};
+
+// Spawn a child process, capturing its stdout and stderr.
+util.spawn = function(opts, done) {
+  // Build a result object and pass it (among other things) into the
+  // done function.
+  var callDone = function(code, stdout, stderr) {
+    // Remove trailing whitespace (newline)
+    stdout = _.rtrim(stdout);
+    stderr = _.rtrim(stderr);
+    // Create the result object.
+    var result = {
+      stdout: stdout,
+      stderr: stderr,
+      code: code,
+      toString: function() {
+        if (code === 0) {
+          return stdout;
+        } else if ('fallback' in opts) {
+          return opts.fallback;
+        } else if (opts.grunt) {
+          // grunt.log.error uses standard out, to be fixed in 0.5.
+          return stderr || stdout;
+        }
+        return stderr;
+      }
+    };
+    // On error (and no fallback) pass an error object, otherwise pass null.
+    done(code === 0 || 'fallback' in opts ? null : new Error(stderr), result, code);
+  };
+
+  var cmd, args;
+  var pathSeparatorRe = /[\\\/]/g;
+  if (opts.grunt) {
+    cmd = process.execPath;
+    args = process.execArgv.concat(process.argv[1], opts.args);
+  } else {
+    // On Windows, child_process.spawn will only file .exe files in the PATH,
+    // not other executable types (grunt issue #155).
+    try {
+      if (!pathSeparatorRe.test(opts.cmd)) {
+        // Only use which if cmd has no path component.
+        cmd = which(opts.cmd);
+      } else {
+        cmd = opts.cmd.replace(pathSeparatorRe, path.sep);
+      }
+    } catch (err) {
+      callDone(127, '', String(err));
+      return;
+    }
+    args = opts.args || [];
+  }
+
+  var child = spawn(cmd, args, opts.opts);
+  var stdout = new Buffer('');
+  var stderr = new Buffer('');
+  if (child.stdout) {
+    child.stdout.on('data', function(buf) {
+      stdout = Buffer.concat([stdout, new Buffer(buf)]);
+    });
+  }
+  if (child.stderr) {
+    child.stderr.on('data', function(buf) {
+      stderr = Buffer.concat([stderr, new Buffer(buf)]);
+    });
+  }
+  child.on('close', function(code) {
+    callDone(code, stdout.toString(), stderr.toString());
+  });
+  return child;
+};
+
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/package.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/package.json	(revision 516)
@@ -0,0 +1,54 @@
+{
+  "name": "grunt-legacy-util",
+  "version": "0.1.2",
+  "description": "Deprecated Grunt utils provided for backwards compatibility.",
+  "author": {
+    "name": "\"Cowboy\" Ben Alman",
+    "url": "http://benalman.com/"
+  },
+  "homepage": "http://gruntjs.com/",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/gruntjs/grunt-legacy-util.git"
+  },
+  "bugs": {
+    "url": "http://github.com/gruntjs/grunt-legacy-util/issues"
+  },
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "http://github.com/gruntjs/grunt-legacy-util/blob/master/LICENSE-MIT"
+    }
+  ],
+  "main": "index.js",
+  "scripts": {
+    "test": "grunt test"
+  },
+  "engines": {
+    "node": ">= 0.8.0"
+  },
+  "keywords": [],
+  "dependencies": {
+    "hooker": "~0.2.3",
+    "async": "~0.1.22",
+    "lodash": "~0.9.2",
+    "exit": "~0.1.1",
+    "underscore.string": "~2.2.1",
+    "getobject": "~0.1.0",
+    "which": "~1.0.5"
+  },
+  "devDependencies": {
+    "grunt-contrib-jshint": "~0.6.4",
+    "grunt-contrib-nodeunit": "~0.2.0",
+    "grunt": "0.4.2",
+    "temporary": "0.0.8"
+  },
+  "readme": "# grunt-legacy-util\n> Deprecated Grunt utils provided for backwards compatibility.\n\n`grunt.util.namespace` use [getobject]  \n`grunt.util.hooker` use [hooker]  \n`grunt.util.async` use [async]  \n`grunt.util._` use [lodash]  \n`grunt.util.exit` use [exit]  \n`grunt.util.callbackify`  \n`grunt.util.error`  \n`grunt.util.linefeed`  \n`grunt.util.normalizelf`  \n`grunt.util.kindOf` use [lodash]  \n`grunt.util.toArray`\n`grunt.util.repeat`  \n`grunt.util.pluralize`  \n`grunt.util.recurse` use [traverse]  \n`grunt.util.spawn`  \n\n\n[getobject]: https://www.npmjs.org/package/getobject\n[hooker]: https://www.npmjs.org/package/hooker\n[async]: https://www.npmjs.org/package/async\n[lodash]: https://www.npmjs.org/package/lodash\n[exit]: https://www.npmjs.org/package/exit\n[traverse]: https://www.npmjs.org/package/lodash\n",
+  "readmeFilename": "README.md",
+  "_id": "grunt-legacy-util@0.1.2",
+  "dist": {
+    "shasum": "e1dbbcc204b3f3a744bb2e27cb028295a16d6e85"
+  },
+  "_from": "grunt-legacy-util@~0.1.2",
+  "_resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.1.2.tgz"
+}
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-execArgv-child.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-execArgv-child.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-execArgv-child.js	(revision 516)
@@ -0,0 +1,7 @@
+module.exports = function(grunt) {
+
+  grunt.registerTask('default', function(text) {
+    console.log('OUTPUT: ' + process.execArgv.join(' '));
+  });
+
+};
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-execArgv.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-execArgv.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-execArgv.js	(revision 516)
@@ -0,0 +1,17 @@
+module.exports = function(grunt) {
+
+  var util = require('../../');
+
+  grunt.registerTask('default', function(text) {
+    var done = this.async();
+    util.spawn({
+      grunt: true,
+      args: ['--gruntfile', 'Gruntfile-execArgv-child.js'],
+    }, function(err, result, code) {
+      var matches = result.stdout.match(/^(OUTPUT: .*)/m);
+      console.log(matches ? matches[1] : '');
+      done();
+    });
+  });
+
+};
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-print-text.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-print-text.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-print-text.js	(revision 516)
@@ -0,0 +1,8 @@
+module.exports = function(grunt) {
+
+  grunt.registerTask('print', 'Print the specified text.', function(text) {
+    console.log('OUTPUT: ' + text);
+    // console.log(process.cwd());
+  });
+
+};
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/exec.cmd
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/exec.cmd	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/exec.cmd	(revision 516)
@@ -0,0 +1,1 @@
+@echo done
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/exec.sh
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/exec.sh	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/exec.sh	(revision 516)
@@ -0,0 +1,2 @@
+#!/bin/bash
+echo "done"
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/spawn-multibyte.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/spawn-multibyte.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/spawn-multibyte.js	(revision 516)
@@ -0,0 +1,17 @@
+// This is a test fixture for a case where spawn receives incomplete
+// multibyte strings in separate data events.
+
+// A multibyte buffer containing all our output. We will slice it later.
+// In this case we are using a Japanese word for hello / good day, where each
+// character takes three bytes.
+var fullOutput = new Buffer('ããã«ã¡ã¯');
+
+// Output one full character and one third of a character
+process.stdout.write(fullOutput.slice(0, 4));
+
+// Output the rest of the string
+process.stdout.write(fullOutput.slice(4));
+
+// Do the same for stderr
+process.stderr.write(fullOutput.slice(0, 4));
+process.stderr.write(fullOutput.slice(4));
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/spawn.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/spawn.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/spawn.js	(revision 516)
@@ -0,0 +1,8 @@
+
+var code = Number(process.argv[2]);
+
+process.stdout.write('stdout\n');
+process.stderr.write('stderr\n');
+
+// Instead of process.exit. See https://github.com/cowboy/node-exit
+require('exit')(code);
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/index.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/index.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/grunt-legacy-util/test/index.js	(revision 516)
@@ -0,0 +1,313 @@
+'use strict';
+
+var util = require('../');
+
+var fs = require('fs');
+var path = require('path');
+
+var Tempfile = require('temporary/lib/file');
+
+exports['util.callbackify'] = {
+  'return': function(test) {
+    test.expect(1);
+    // This function returns a value.
+    function add(a, b) {
+      return a + b;
+    }
+    util.callbackify(add)(1, 2, function(result) {
+      test.equal(result, 3, 'should be the correct result.');
+      test.done();
+    });
+  },
+  'callback (sync)': function(test) {
+    test.expect(1);
+    // This function accepts a callback which it calls synchronously.
+    function add(a, b, done) {
+      done(a + b);
+    }
+    util.callbackify(add)(1, 2, function(result) {
+      test.equal(result, 3, 'should be the correct result.');
+      test.done();
+    });
+  },
+  'callback (async)': function(test) {
+    test.expect(1);
+    // This function accepts a callback which it calls asynchronously.
+    function add(a, b, done) {
+      setTimeout(done.bind(null, a + b), 0);
+    }
+    util.callbackify(add)(1, 2, function(result) {
+      test.equal(result, 3, 'should be the correct result.');
+      test.done();
+    });
+  }
+};
+
+exports['util'] = {
+  'error': function(test) {
+    test.expect(9);
+    var origError = new Error('Original error.');
+
+    var err = util.error('Test message.');
+    test.ok(err instanceof Error, 'Should be an Error.');
+    test.equal(err.name, 'Error', 'Should be an Error.');
+    test.equal(err.message, 'Test message.', 'Should have the correct message.');
+
+    err = util.error('Test message.', origError);
+    test.ok(err instanceof Error, 'Should be an Error.');
+    test.equal(err.name, 'Error', 'Should be an Error.');
+    test.equal(err.message, 'Test message.', 'Should have the correct message.');
+    test.equal(err.origError, origError, 'Should reflect the original error.');
+
+    var newError = new Error('Test message.');
+    err = util.error(newError, origError);
+    test.equal(err, newError, 'Should be the passed-in Error.');
+    test.equal(err.origError, origError, 'Should reflect the original error.');
+    test.done();
+  },
+  'linefeed': function(test) {
+    test.expect(1);
+    if (process.platform === 'win32') {
+      test.equal(util.linefeed, '\r\n', 'linefeed should be operating-system appropriate.');
+    } else {
+      test.equal(util.linefeed, '\n', 'linefeed should be operating-system appropriate.');
+    }
+    test.done();
+  },
+  'normalizelf': function(test) {
+    test.expect(1);
+    if (process.platform === 'win32') {
+      test.equal(util.normalizelf('foo\nbar\r\nbaz\r\n\r\nqux\n\nquux'), 'foo\r\nbar\r\nbaz\r\n\r\nqux\r\n\r\nquux', 'linefeeds should be normalized');
+    } else {
+      test.equal(util.normalizelf('foo\nbar\r\nbaz\r\n\r\nqux\n\nquux'), 'foo\nbar\nbaz\n\nqux\n\nquux', 'linefeeds should be normalized');
+    }
+    test.done();
+  }
+};
+
+exports['util.spawn'] = {
+  setUp: function(done) {
+    this.script = path.resolve('test/fixtures/spawn.js');
+    done();
+  },
+  'exit code 0': function(test) {
+    test.expect(6);
+    util.spawn({
+      cmd: process.execPath,
+      args: [ this.script, 0 ],
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.equals(result.stdout, 'stdout');
+      test.equals(result.stderr, 'stderr');
+      test.equals(result.code, 0);
+      test.equals(String(result), 'stdout');
+      test.done();
+    });
+  },
+  'exit code 0, fallback': function(test) {
+    test.expect(6);
+    util.spawn({
+      cmd: process.execPath,
+      args: [ this.script, 0 ],
+      fallback: 'ignored if exit code is 0'
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.equals(result.stdout, 'stdout');
+      test.equals(result.stderr, 'stderr');
+      test.equals(result.code, 0);
+      test.equals(String(result), 'stdout');
+      test.done();
+    });
+  },
+  'non-zero exit code': function(test) {
+    test.expect(7);
+    util.spawn({
+      cmd: process.execPath,
+      args: [ this.script, 123 ],
+    }, function(err, result, code) {
+      test.ok(err instanceof Error);
+      test.equals(err.message, 'stderr');
+      test.equals(code, 123);
+      test.equals(result.stdout, 'stdout');
+      test.equals(result.stderr, 'stderr');
+      test.equals(result.code, 123);
+      test.equals(String(result), 'stderr');
+      test.done();
+    });
+  },
+  'non-zero exit code, fallback': function(test) {
+    test.expect(6);
+    util.spawn({
+      cmd: process.execPath,
+      args: [ this.script, 123 ],
+      fallback: 'custom fallback'
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 123);
+      test.equals(result.stdout, 'stdout');
+      test.equals(result.stderr, 'stderr');
+      test.equals(result.code, 123);
+      test.equals(String(result), 'custom fallback');
+      test.done();
+    });
+  },
+  'cmd not found': function(test) {
+    test.expect(3);
+    util.spawn({
+      cmd: 'nodewtfmisspelled',
+    }, function(err, result, code) {
+      test.ok(err instanceof Error);
+      test.equals(code, 127);
+      test.equals(result.code, 127);
+      test.done();
+    });
+  },
+  'cmd not found, fallback': function(test) {
+    test.expect(4);
+    util.spawn({
+      cmd: 'nodewtfmisspelled',
+      fallback: 'use a fallback or good luck'
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 127);
+      test.equals(result.code, 127);
+      test.equals(String(result), 'use a fallback or good luck');
+      test.done();
+    });
+  },
+  'cmd not in path': function(test) {
+    test.expect(6);
+    var win32 = process.platform === 'win32';
+    util.spawn({
+      cmd: 'test\\fixtures\\exec' + (win32 ? '.cmd' : '.sh'),
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.equals(result.stdout, 'done');
+      test.equals(result.stderr, '');
+      test.equals(result.code, 0);
+      test.equals(String(result), 'done');
+      test.done();
+    });
+  },
+  'cmd not in path (with cwd)': function(test) {
+    test.expect(6);
+    var win32 = process.platform === 'win32';
+    util.spawn({
+      cmd: './exec' + (win32 ? '.cmd' : '.sh'),
+      opts: {cwd: 'test/fixtures'},
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.equals(result.stdout, 'done');
+      test.equals(result.stderr, '');
+      test.equals(result.code, 0);
+      test.equals(String(result), 'done');
+      test.done();
+    });
+  },
+  'grunt': function(test) {
+    test.expect(3);
+    util.spawn({
+      grunt: true,
+      args: [ '--gruntfile', 'test/fixtures/Gruntfile-print-text.js', 'print:foo' ],
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.ok(/^OUTPUT: foo/m.test(result.stdout), 'stdout should contain output indicating the grunt task was run.');
+      test.done();
+    });
+  },
+  'grunt (with cwd)': function(test) {
+    test.expect(3);
+    util.spawn({
+      grunt: true,
+      args: [ '--gruntfile', 'Gruntfile-print-text.js', 'print:foo' ],
+      opts: {cwd: 'test/fixtures'},
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.ok(/^OUTPUT: foo/m.test(result.stdout), 'stdout should contain output indicating the grunt task was run.');
+      test.done();
+    });
+  },
+  'grunt passes execArgv': function(test) {
+    test.expect(3);
+    util.spawn({
+      cmd: process.execPath,
+      args: [ '--harmony', process.argv[1], '--gruntfile', 'test/fixtures/Gruntfile-execArgv.js'],
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.ok(/^OUTPUT: --harmony/m.test(result.stdout), 'stdout should contain passed-through process.execArgv.');
+      test.done();
+    });
+  },
+  'grunt result.toString() with error': function(test) {
+    // grunt.log.error uses standard out, to be fixed in 0.5.
+    test.expect(4);
+    util.spawn({
+      grunt: true,
+      args: [ 'nonexistentTask' ]
+    }, function(err, result, code) {
+      test.ok(err instanceof Error, 'Should be an Error.');
+      test.equal(err.name, 'Error', 'Should be an Error.');
+      test.equals(code, 3);
+      test.ok(/Warning: Task "nonexistentTask" not found./m.test(result.toString()), 'stdout should contain output indicating the grunt task was (attempted to be) run.');
+      test.done();
+    });
+  },
+  'custom stdio stream(s)': function(test) {
+    test.expect(6);
+    var stdoutFile = new Tempfile();
+    var stderrFile = new Tempfile();
+    var stdout = fs.openSync(stdoutFile.path, 'a');
+    var stderr = fs.openSync(stderrFile.path, 'a');
+    var child = util.spawn({
+      cmd: process.execPath,
+      args: [ this.script, 0 ],
+      opts: {stdio: [null, stdout, stderr]},
+    }, function(err, result, code) {
+      test.equals(code, 0);
+      test.equals(String(fs.readFileSync(stdoutFile.path)), 'stdout\n', 'Child process stdout should have been captured via custom stream.');
+      test.equals(String(fs.readFileSync(stderrFile.path)), 'stderr\n', 'Child process stderr should have been captured via custom stream.');
+      stdoutFile.unlinkSync();
+      stderrFile.unlinkSync();
+      test.equals(result.stdout, '', 'Nothing will be passed to the stdout string when spawn stdio is a custom stream.');
+      test.done();
+    });
+    test.ok(!child.stdout, 'child should not have a stdout property.');
+    test.ok(!child.stderr, 'child should not have a stderr property.');
+  },
+};
+
+exports['util.spawn.multibyte'] = {
+  setUp: function(done) {
+    this.script = path.resolve('test/fixtures/spawn-multibyte.js');
+    done();
+  },
+  'partial stdout': function(test) {
+    test.expect(4);
+    util.spawn({
+      cmd: process.execPath,
+      args: [ this.script ],
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.equals(result.stdout, 'ããã«ã¡ã¯');
+      test.equals(result.stderr, 'ããã«ã¡ã¯');
+      test.done();
+    });
+  }
+};
+
+exports['util.underscore.string'] = function(test) {
+  test.expect(4);
+  test.equals(util._.trim('    foo     '), 'foo', 'Should have trimmed the string.');
+  test.equals(util._.capitalize('foo'), 'Foo', 'Should have capitalized the first letter.');
+  test.equals(util._.words('one two three').length, 3, 'Should have counted three words.');
+  test.ok(util._.isBlank(' '), 'Should be blank.');
+  test.done();
+};
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/iconv-lite/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/iconv-lite/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/iconv-lite/package.json	(revision 516)
@@ -77,8 +77,4 @@
   },
   "_id": "iconv-lite@0.2.11",
-  "dist": {
-    "shasum": "1827821f46962889765690b557c045f5cc3976eb"
-  },
-  "_from": "iconv-lite@~0.2.11",
-  "_resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz"
+  "_from": "iconv-lite@~0.2.11"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json	(revision 516)
@@ -70,8 +70,4 @@
   "readmeFilename": "README.markdown",
   "_id": "underscore.string@2.3.3",
-  "dist": {
-    "shasum": "a7cea3b9aa84d24cf1363ccbddd02ee10abee0c0"
-  },
-  "_from": "underscore.string@~2.3.1",
-  "_resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz"
+  "_from": "underscore.string@~2.3.1"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/minimatch/.npmignore
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/minimatch/.npmignore	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/minimatch/.npmignore	(revision 516)
@@ -0,0 +1,1 @@
+node_modules
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/minimatch/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/minimatch/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/minimatch/README.md	(revision 516)
@@ -20,4 +20,5 @@
 minimatch("bar.foo", "*.foo") // true!
 minimatch("bar.foo", "*.bar") // false!
+minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy!
 ```
 
@@ -36,42 +37,4 @@
 * `man 3 fnmatch`
 * `man 5 gitignore`
-
-### Comparisons to other fnmatch/glob implementations
-
-While strict compliance with the existing standards is a worthwhile
-goal, some discrepancies exist between minimatch and other
-implementations, and are intentional.
-
-If the pattern starts with a `!` character, then it is negated.  Set the
-`nonegate` flag to suppress this behavior, and treat leading `!`
-characters normally.  This is perhaps relevant if you wish to start the
-pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
-characters at the start of a pattern will negate the pattern multiple
-times.
-
-If a pattern starts with `#`, then it is treated as a comment, and
-will not match anything.  Use `\#` to match a literal `#` at the
-start of a line, or set the `nocomment` flag to suppress this behavior.
-
-The double-star character `**` is supported by default, unless the
-`noglobstar` flag is set.  This is supported in the manner of bsdglob
-and bash 4.1, where `**` only has special significance if it is the only
-thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
-`a/**b` will not.  **Note that this is different from the way that `**` is
-handled by ruby's `Dir` class.**
-
-If an escaped pattern has no matches, and the `nonull` flag is set,
-then minimatch.match returns the pattern as-provided, rather than
-interpreting the character escapes.  For example,
-`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
-`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
-that it does not resolve escaped pattern characters.
-
-If brace expansion is not disabled, then it is performed before any
-other interpretation of the glob pattern.  Thus, a pattern like
-`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
-**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
-checked for validity.  Since those two are valid, matching proceeds.
-
 
 ## Minimatch Class
@@ -217,2 +180,39 @@
 Returns from negate expressions the same as if they were not negated.
 (Ie, true on a hit, false on a miss.)
+
+
+## Comparisons to other fnmatch/glob implementations
+
+While strict compliance with the existing standards is a worthwhile
+goal, some discrepancies exist between minimatch and other
+implementations, and are intentional.
+
+If the pattern starts with a `!` character, then it is negated.  Set the
+`nonegate` flag to suppress this behavior, and treat leading `!`
+characters normally.  This is perhaps relevant if you wish to start the
+pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
+characters at the start of a pattern will negate the pattern multiple
+times.
+
+If a pattern starts with `#`, then it is treated as a comment, and
+will not match anything.  Use `\#` to match a literal `#` at the
+start of a line, or set the `nocomment` flag to suppress this behavior.
+
+The double-star character `**` is supported by default, unless the
+`noglobstar` flag is set.  This is supported in the manner of bsdglob
+and bash 4.1, where `**` only has special significance if it is the only
+thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
+`a/**b` will not.
+
+If an escaped pattern has no matches, and the `nonull` flag is set,
+then minimatch.match returns the pattern as-provided, rather than
+interpreting the character escapes.  For example,
+`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
+`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
+that it does not resolve escaped pattern characters.
+
+If brace expansion is not disabled, then it is performed before any
+other interpretation of the glob pattern.  Thus, a pattern like
+`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
+**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
+checked for validity.  Since those two are valid, matching proceeds.
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/minimatch/minimatch.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/minimatch/minimatch.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/minimatch/minimatch.js	(revision 516)
@@ -69,15 +69,4 @@
 var slashSplit = /\/+/
 
-minimatch.monkeyPatch = monkeyPatch
-function monkeyPatch () {
-  var desc = Object.getOwnPropertyDescriptor(String.prototype, "match")
-  var orig = desc.value
-  desc.value = function (p) {
-    if (p instanceof Minimatch) return p.match(this)
-    return orig.call(this, p)
-  }
-  Object.defineProperty(String.prototype, desc)
-}
-
 minimatch.filter = filter
 function filter (pattern, options) {
@@ -179,4 +168,6 @@
 }
 
+Minimatch.prototype.debug = function() {}
+
 Minimatch.prototype.make = make
 function make () {
@@ -203,5 +194,7 @@
   var set = this.globSet = this.braceExpand()
 
-  if (options.debug) console.error(this.pattern, set)
+  if (options.debug) this.debug = console.error
+
+  this.debug(this.pattern, set)
 
   // step 3: now we have a set, so turn each one into a series of path-portion
@@ -214,5 +207,5 @@
   })
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   // glob --> regexps
@@ -221,5 +214,5 @@
   }, this)
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   // filter out everything that didn't compile properly.
@@ -228,5 +221,5 @@
   })
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   this.set = set
@@ -303,9 +296,9 @@
   // and then prepend it to everything we find.
   if (pattern.charAt(0) !== "{") {
-    // console.error(pattern)
+    this.debug(pattern)
     var prefix = null
     for (var i = 0, l = pattern.length; i < l; i ++) {
       var c = pattern.charAt(i)
-      // console.error(i, c)
+      this.debug(i, c)
       if (c === "\\") {
         escaping = !escaping
@@ -318,9 +311,9 @@
     // actually no sets, all { were escaped.
     if (prefix === null) {
-      // console.error("no sets")
+      this.debug("no sets")
       return [pattern]
     }
 
-    var tail = braceExpand(pattern.substr(i), options)
+   var tail = braceExpand.call(this, pattern.substr(i), options)
     return tail.map(function (t) {
       return prefix + t
@@ -337,6 +330,6 @@
   var numset = pattern.match(/^\{(-?[0-9]+)\.\.(-?[0-9]+)\}/)
   if (numset) {
-    // console.error("numset", numset[1], numset[2])
-    var suf = braceExpand(pattern.substr(numset[0].length), options)
+    this.debug("numset", numset[1], numset[2])
+    var suf = braceExpand.call(this, pattern.substr(numset[0].length), options)
       , start = +numset[1]
       , end = +numset[2]
@@ -370,8 +363,8 @@
   }
 
-  // console.error("Entering for")
+  this.debug("Entering for")
   FOR: for (i = 1, l = pattern.length; i < l; i ++) {
     var c = pattern.charAt(i)
-    // console.error("", i, c)
+    this.debug("", i, c)
 
     if (escaping) {
@@ -421,20 +414,20 @@
   // and need to escape the leading brace
   if (depth !== 0) {
-    // console.error("didn't close", pattern)
-    return braceExpand("\\" + pattern, options)
+    this.debug("didn't close", pattern)
+    return braceExpand.call(this, "\\" + pattern, options)
   }
 
   // x{y,z} -> ["xy", "xz"]
-  // console.error("set", set)
-  // console.error("suffix", pattern.substr(i))
-  var suf = braceExpand(pattern.substr(i), options)
+  this.debug("set", set)
+  this.debug("suffix", pattern.substr(i))
+  var suf = braceExpand.call(this, pattern.substr(i), options)
   // ["b", "c{d,e}","{f,g}h"] ->
   //   [["b"], ["cd", "ce"], ["fh", "gh"]]
   var addBraces = set.length === 1
-  // console.error("set pre-expanded", set)
+  this.debug("set pre-expanded", set)
   set = set.map(function (p) {
-    return braceExpand(p, options)
-  })
-  // console.error("set expanded", set)
+    return braceExpand.call(this, p, options)
+  }, this)
+  this.debug("set expanded", set)
 
 
@@ -497,4 +490,5 @@
       : options.dot ? "(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))"
       : "(?!\\.)"
+    , self = this
 
   function clearStateChar () {
@@ -515,4 +509,5 @@
           break
       }
+      self.debug('clearStateChar %j %j', stateChar, re)
       stateChar = false
     }
@@ -523,7 +518,5 @@
       ; i ++ ) {
 
-    if (options.debug) {
-      console.error("%s\t%s %s %j", pattern, i, re, c)
-    }
+    this.debug("%s\t%s %s %j", pattern, i, re, c)
 
     // skip over any that are escaped.
@@ -552,11 +545,10 @@
       case "@":
       case "!":
-        if (options.debug) {
-          console.error("%s\t%s %s %j <-- stateChar", pattern, i, re, c)
-        }
+        this.debug("%s\t%s %s %j <-- stateChar", pattern, i, re, c)
 
         // all of those are literals inside a class, except that
         // the glob [!a] means [^a] in regexp
         if (inClass) {
+          this.debug('  in class')
           if (c === "!" && i === classStart + 1) c = "^"
           re += c
@@ -567,4 +559,5 @@
         // that there was something like ** or +? in there.
         // Handle the stateChar, then proceed with this one.
+        self.debug('call clearStateChar %j', stateChar)
         clearStateChar()
         stateChar = c
@@ -592,4 +585,5 @@
         // negation is (?:(?!js)[^/]*)
         re += stateChar === "!" ? "(?:(?!" : "(?:"
+        this.debug('plType %j %j', stateChar, re)
         stateChar = false
         continue
@@ -601,4 +595,5 @@
         }
 
+        clearStateChar()
         hasMagic = true
         re += ")"
@@ -624,4 +619,5 @@
         }
 
+        clearStateChar()
         re += "|"
         continue
@@ -716,5 +712,5 @@
     })
 
-    // console.error("tail=%j\n   %s", tail, tail)
+    this.debug("tail=%j\n   %s", tail, tail)
     var t = pl.type === "*" ? star
           : pl.type === "?" ? qmark
@@ -830,5 +826,5 @@
 Minimatch.prototype.match = match
 function match (f, partial) {
-  // console.error("match", f, this.pattern)
+  this.debug("match", f, this.pattern)
   // short-circuit in the case of busted things.
   // comments, etc.
@@ -848,7 +844,5 @@
   // treat the test path as a set of pathparts.
   f = f.split(slashSplit)
-  if (options.debug) {
-    console.error(this.pattern, "split", f)
-  }
+  this.debug(this.pattern, "split", f)
 
   // just ONE of the pattern sets in this.set needs to match
@@ -858,9 +852,14 @@
 
   var set = this.set
-  // console.error(this.pattern, "set", set)
+  this.debug(this.pattern, "set", set)
+
+  var splitFile = path.basename(f.join("/")).split("/")
 
   for (var i = 0, l = set.length; i < l; i ++) {
-    var pattern = set[i]
-    var hit = this.matchOne(f, pattern, partial)
+    var pattern = set[i], file = f
+    if (options.matchBase && pattern.length === 1) {
+      file = splitFile
+    }
+    var hit = this.matchOne(file, pattern, partial)
     if (hit) {
       if (options.flipNegate) return true
@@ -883,18 +882,10 @@
   var options = this.options
 
-  if (options.debug) {
-    console.error("matchOne",
-                  { "this": this
-                  , file: file
-                  , pattern: pattern })
-  }
-
-  if (options.matchBase && pattern.length === 1) {
-    file = path.basename(file.join("/")).split("/")
-  }
-
-  if (options.debug) {
-    console.error("matchOne", file.length, pattern.length)
-  }
+  this.debug("matchOne",
+              { "this": this
+              , file: file
+              , pattern: pattern })
+
+  this.debug("matchOne", file.length, pattern.length)
 
   for ( var fi = 0
@@ -905,13 +896,9 @@
       ; fi ++, pi ++ ) {
 
-    if (options.debug) {
-      console.error("matchOne loop")
-    }
+    this.debug("matchOne loop")
     var p = pattern[pi]
       , f = file[fi]
 
-    if (options.debug) {
-      console.error(pattern, p, f)
-    }
+    this.debug(pattern, p, f)
 
     // should be impossible.
@@ -920,6 +907,5 @@
 
     if (p === GLOBSTAR) {
-      if (options.debug)
-        console.error('GLOBSTAR', [pattern, p, f])
+      this.debug('GLOBSTAR', [pattern, p, f])
 
       // "**"
@@ -948,6 +934,5 @@
         , pr = pi + 1
       if (pr === pl) {
-        if (options.debug)
-          console.error('** at the end')
+        this.debug('** at the end')
         // a ** at the end will just swallow the rest.
         // We have found a match.
@@ -967,13 +952,10 @@
         var swallowee = file[fr]
 
-        if (options.debug) {
-          console.error('\nglobstar while',
-                        file, fr, pattern, pr, swallowee)
-        }
+        this.debug('\nglobstar while',
+                    file, fr, pattern, pr, swallowee)
 
         // XXX remove this slice.  Just pass the start index.
         if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
-          if (options.debug)
-            console.error('globstar found match!', fr, fl, swallowee)
+          this.debug('globstar found match!', fr, fl, swallowee)
           // found a match.
           return true
@@ -983,12 +965,10 @@
           if (swallowee === "." || swallowee === ".." ||
               (!options.dot && swallowee.charAt(0) === ".")) {
-            if (options.debug)
-              console.error("dot detected!", file, fr, pattern, pr)
+            this.debug("dot detected!", file, fr, pattern, pr)
             break WHILE
           }
 
           // ** swallows a segment, and continue.
-          if (options.debug)
-            console.error('globstar swallow a segment, and continue')
+          this.debug('globstar swallow a segment, and continue')
           fr ++
         }
@@ -999,5 +979,5 @@
       if (partial) {
         // ran out of file
-        // console.error("\n>>> no match, partial?", file, fr, pattern, pr)
+        this.debug("\n>>> no match, partial?", file, fr, pattern, pr)
         if (fr === fl) return true
       }
@@ -1015,12 +995,8 @@
         hit = f === p
       }
-      if (options.debug) {
-        console.error("string match", p, f, hit)
-      }
+      this.debug("string match", p, f, hit)
     } else {
       hit = f.match(p)
-      if (options.debug) {
-        console.error("pattern match", p, f, hit)
-      }
+      this.debug("pattern match", p, f, hit)
     }
 
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/package.json	(revision 516)
@@ -30,8 +30,4 @@
   "homepage": "https://github.com/isaacs/node-lru-cache",
   "_id": "lru-cache@2.5.0",
-  "dist": {
-    "shasum": "be07d09e5b05f10b83d0cf01d4891a7729288c69"
-  },
-  "_from": "lru-cache@2",
-  "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
+  "_from": "lru-cache@2"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/minimatch/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/minimatch/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/minimatch/package.json	(revision 516)
@@ -7,5 +7,5 @@
   "name": "minimatch",
   "description": "a glob matcher in javascript",
-  "version": "0.2.12",
+  "version": "0.2.14",
   "repository": {
     "type": "git",
@@ -14,5 +14,5 @@
   "main": "minimatch.js",
   "scripts": {
-    "test": "tap test"
+    "test": "tap test/*.js"
   },
   "engines": {
@@ -30,5 +30,5 @@
     "url": "http://github.com/isaacs/minimatch/raw/master/LICENSE"
   },
-  "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n### Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated.  Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally.  This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything.  Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set.  This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.  **Note that this is different from the way that `**` is\nhandled by ruby's `Dir` class.**\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes.  For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`.  This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern.  Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity.  Since those two are valid, matching proceeds.\n\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n  Each row in the\n  array corresponds to a brace-expanded pattern.  Each item in the row\n  corresponds to a single path-part.  For example, the pattern\n  `{a,b/c}/d` would expand to a set of patterns like:\n\n        [ [ a, d ]\n        , [ b, c, d ] ]\n\n    If a portion of the pattern doesn't have any \"magic\" in it\n    (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n    will be left as a string rather than converted to a regular\n    expression.\n\n* `regexp` Created by the `makeRe` method.  A single regular expression\n  expressing the entire pattern.  This is useful in cases where you wish\n  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n  Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n  false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n  filename, and match it against a single row in the `regExpSet`.  This\n  method is mainly for internal use, but is exposed so that it can be\n  used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items.  So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export.  Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`.  Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob.  If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself.  When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes.  For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n",
+  "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\nminimatch(\"bar.foo\", \"*.+(bar|foo)\", { debug: true }) // true, and noisy!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n  Each row in the\n  array corresponds to a brace-expanded pattern.  Each item in the row\n  corresponds to a single path-part.  For example, the pattern\n  `{a,b/c}/d` would expand to a set of patterns like:\n\n        [ [ a, d ]\n        , [ b, c, d ] ]\n\n    If a portion of the pattern doesn't have any \"magic\" in it\n    (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n    will be left as a string rather than converted to a regular\n    expression.\n\n* `regexp` Created by the `makeRe` method.  A single regular expression\n  expressing the entire pattern.  This is useful in cases where you wish\n  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n  Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n  false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n  filename, and match it against a single row in the `regExpSet`.  This\n  method is mainly for internal use, but is exposed so that it can be\n  used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items.  So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export.  Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`.  Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob.  If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself.  When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes.  For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated.  Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally.  This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything.  Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set.  This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes.  For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`.  This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern.  Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity.  Since those two are valid, matching proceeds.\n",
   "readmeFilename": "README.md",
   "bugs": {
@@ -36,5 +36,5 @@
   },
   "homepage": "https://github.com/isaacs/minimatch",
-  "_id": "minimatch@0.2.12",
-  "_from": "minimatch@0.x.x"
+  "_id": "minimatch@0.2.14",
+  "_from": "minimatch@~0.2.12"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/minimatch/test/extglob-ending-with-state-char.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/minimatch/test/extglob-ending-with-state-char.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/minimatch/test/extglob-ending-with-state-char.js	(revision 516)
@@ -0,0 +1,8 @@
+var test = require('tap').test
+var minimatch = require('../')
+
+test('extglob ending with statechar', function(t) {
+  t.notOk(minimatch('ax', 'a?(b*)'))
+  t.ok(minimatch('ax', '?(a*|b)'))
+  t.end()
+})
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/rimraf/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/rimraf/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/rimraf/README.md	(revision 516)
@@ -1,3 +1,3 @@
-A `rm -rf` for node.
+`rm -rf` for node.
 
 Install with `npm install rimraf`, or just drop rimraf.js somewhere.
@@ -10,9 +10,8 @@
 errors are handled for you:
 
-* `EBUSY` -  rimraf will back off a maximum of opts.maxBusyTries times
-  before giving up.
-* `EMFILE` - If too many file descriptors get opened, rimraf will
-  patiently wait until more become available.
-
+* Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of
+  `opts.maxBusyTries` times before giving up.
+* `ENOENT` - If the file doesn't exist, rimraf will return
+  successfully, since your desired outcome is already the case.
 
 ## rimraf.sync
@@ -20,2 +19,12 @@
 It can remove stuff synchronously, too.  But that's not so good.  Use
 the async API.  It's better.
+
+## CLI
+
+If installed with `npm install rimraf -g` it can be used as a global
+command `rimraf <path>` which is useful for cross platform support.
+
+## mkdirp
+
+If you need to create a directory recursively, check out
+[mkdirp](https://github.com/substack/node-mkdirp).
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/rimraf/bin.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/rimraf/bin.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/rimraf/bin.js	(revision 516)
@@ -0,0 +1,33 @@
+#!/usr/bin/env node
+
+var rimraf = require('./')
+
+var help = false
+var dashdash = false
+var args = process.argv.slice(2).filter(function(arg) {
+  if (dashdash)
+    return !!arg
+  else if (arg === '--')
+    dashdash = true
+  else if (arg.match(/^(-+|\/)(h(elp)?|\?)$/))
+    help = true
+  else
+    return !!arg
+});
+
+if (help || args.length === 0) {
+  // If they didn't ask for help, then this is not a "success"
+  var log = help ? console.log : console.error
+  log('Usage: rimraf <path>')
+  log('')
+  log('  Deletes all files and folders at "path" recursively.')
+  log('')
+  log('Options:')
+  log('')
+  log('  -h, --help    Display this usage info')
+  process.exit(help ? 0 : 1)
+} else {
+  args.forEach(function(arg) {
+    rimraf.sync(arg)
+  })
+}
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/rimraf/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/rimraf/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/rimraf/package.json	(revision 516)
@@ -1,5 +1,5 @@
 {
   "name": "rimraf",
-  "version": "2.0.3",
+  "version": "2.2.6",
   "main": "rimraf.js",
   "description": "A deep deletion module for node (like `rm -rf`)",
@@ -13,7 +13,4 @@
     "url": "https://github.com/isaacs/rimraf/raw/master/LICENSE"
   },
-  "optionalDependencies": {
-    "graceful-fs": "~1.1"
-  },
   "repository": {
     "type": "git",
@@ -22,4 +19,7 @@
   "scripts": {
     "test": "cd test && bash run.sh"
+  },
+  "bin": {
+    "rimraf": "./bin.js"
   },
   "contributors": [
@@ -46,5 +46,5 @@
     }
   ],
-  "readme": "A `rm -rf` for node.\n\nInstall with `npm install rimraf`, or just drop rimraf.js somewhere.\n\n## API\n\n`rimraf(f, callback)`\n\nThe callback will be called with an error if there is one.  Certain\nerrors are handled for you:\n\n* `EBUSY` -  rimraf will back off a maximum of opts.maxBusyTries times\n  before giving up.\n* `EMFILE` - If too many file descriptors get opened, rimraf will\n  patiently wait until more become available.\n\n\n## rimraf.sync\n\nIt can remove stuff synchronously, too.  But that's not so good.  Use\nthe async API.  It's better.\n",
+  "readme": "`rm -rf` for node.\n\nInstall with `npm install rimraf`, or just drop rimraf.js somewhere.\n\n## API\n\n`rimraf(f, callback)`\n\nThe callback will be called with an error if there is one.  Certain\nerrors are handled for you:\n\n* Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of\n  `opts.maxBusyTries` times before giving up.\n* `ENOENT` - If the file doesn't exist, rimraf will return\n  successfully, since your desired outcome is already the case.\n\n## rimraf.sync\n\nIt can remove stuff synchronously, too.  But that's not so good.  Use\nthe async API.  It's better.\n\n## CLI\n\nIf installed with `npm install rimraf -g` it can be used as a global\ncommand `rimraf <path>` which is useful for cross platform support.\n\n## mkdirp\n\nIf you need to create a directory recursively, check out\n[mkdirp](https://github.com/substack/node-mkdirp).\n",
   "readmeFilename": "README.md",
   "bugs": {
@@ -52,8 +52,9 @@
   },
   "homepage": "https://github.com/isaacs/rimraf",
-  "dependencies": {
-    "graceful-fs": "~1.1"
+  "_id": "rimraf@2.2.6",
+  "dist": {
+    "shasum": "c28d4de4cafcd392b82d02729509c65e3502240c"
   },
-  "_id": "rimraf@2.0.3",
-  "_from": "rimraf@~2.0.3"
+  "_from": "rimraf@~2.2.6",
+  "_resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/rimraf/rimraf.js
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/rimraf/rimraf.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/rimraf/rimraf.js	(revision 516)
@@ -3,23 +3,5 @@
 
 var path = require("path")
-  , fs
-
-try {
-  // optional dependency
-  fs = require("graceful-fs")
-} catch (er) {
-  fs = require("fs")
-}
-
-var lstat = "lstat"
-if (process.platform === "win32") {
-  // not reliable on windows prior to 0.7.9
-  var v = process.version.replace(/^v/, '').split(/\.|-/).map(Number)
-  if (v[0] === 0 && (v[1] < 7 || v[1] == 7 && v[2] < 9)) {
-    lstat = "stat"
-  }
-}
-if (!fs[lstat]) lstat = "stat"
-var lstatSync = lstat + "Sync"
+var fs = require("fs")
 
 // for EMFILE handling
@@ -28,13 +10,14 @@
 exports.BUSYTRIES_MAX = 3
 
+var isWindows = (process.platform === "win32")
+
 function rimraf (p, cb) {
-
   if (!cb) throw new Error("No callback passed to rimraf()")
 
   var busyTries = 0
-
   rimraf_(p, function CB (er) {
     if (er) {
-      if (er.code === "EBUSY" && busyTries < exports.BUSYTRIES_MAX) {
+      if (isWindows && (er.code === "EBUSY" || er.code === "ENOTEMPTY") &&
+          busyTries < exports.BUSYTRIES_MAX) {
         busyTries ++
         var time = busyTries * 100
@@ -61,98 +44,132 @@
 }
 
+// Two possible strategies.
+// 1. Assume it's a file.  unlink it, then do the dir stuff on EPERM or EISDIR
+// 2. Assume it's a directory.  readdir, then do the file stuff on ENOTDIR
+//
+// Both result in an extra syscall when you guess wrong.  However, there
+// are likely far more normal files in the world than directories.  This
+// is based on the assumption that a the average number of files per
+// directory is >= 1.
+//
+// If anyone ever complains about this, then I guess the strategy could
+// be made configurable somehow.  But until then, YAGNI.
 function rimraf_ (p, cb) {
-  fs[lstat](p, function (er, s) {
+  fs.unlink(p, function (er) {
     if (er) {
-      // already gone
-      if (er.code === "ENOENT") return cb()
-      // some other kind of error, permissions, etc.
-      return cb(er)
+      if (er.code === "ENOENT")
+        return cb(null)
+      if (er.code === "EPERM")
+        return (isWindows) ? fixWinEPERM(p, er, cb) : rmdir(p, er, cb)
+      if (er.code === "EISDIR")
+        return rmdir(p, er, cb)
     }
-
-    return rm_(p, s, false, cb)
+    return cb(er)
   })
 }
 
-
-var myGid = function myGid () {
-  var g = process.getgid && process.getgid()
-  myGid = function myGid () { return g }
-  return g
+function fixWinEPERM (p, er, cb) {
+  fs.chmod(p, 666, function (er2) {
+    if (er2)
+      cb(er2.code === "ENOENT" ? null : er)
+    else
+      fs.stat(p, function(er3, stats) {
+        if (er3)
+          cb(er3.code === "ENOENT" ? null : er)
+        else if (stats.isDirectory())
+          rmdir(p, er, cb)
+        else
+          fs.unlink(p, cb)
+      })
+  })
 }
 
-var myUid = function myUid () {
-  var u = process.getuid && process.getuid()
-  myUid = function myUid () { return u }
-  return u
+function fixWinEPERMSync (p, er, cb) {
+  try {
+    fs.chmodSync(p, 666)
+  } catch (er2) {
+    if (er2.code !== "ENOENT")
+      throw er
+  }
+
+  try {
+    var stats = fs.statSync(p)
+  } catch (er3) {
+    if (er3 !== "ENOENT")
+      throw er
+  }
+
+  if (stats.isDirectory())
+    rmdirSync(p, er)
+  else
+    fs.unlinkSync(p)
 }
 
-
-function writable (s) {
-  var mode = s.mode || 0777
-    , uid = myUid()
-    , gid = myGid()
-  return (mode & 0002)
-      || (gid === s.gid && (mode & 0020))
-      || (uid === s.uid && (mode & 0200))
+function rmdir (p, originalEr, cb) {
+  // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
+  // if we guessed wrong, and it's not a directory, then
+  // raise the original error.
+  fs.rmdir(p, function (er) {
+    if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM"))
+      rmkids(p, cb)
+    else if (er && er.code === "ENOTDIR")
+      cb(originalEr)
+    else
+      cb(er)
+  })
 }
 
-function rm_ (p, s, didWritableCheck, cb) {
-  if (!didWritableCheck && !writable(s)) {
-    // make file writable
-    // user/group/world, doesn't matter at this point
-    // since it's about to get nuked.
-    return fs.chmod(p, s.mode | 0222, function (er) {
-      if (er) return cb(er)
-      rm_(p, s, true, cb)
-    })
-  }
-
-  if (!s.isDirectory()) {
-    return fs.unlink(p, cb)
-  }
-
-  // directory
+function rmkids(p, cb) {
   fs.readdir(p, function (er, files) {
-    if (er) return cb(er)
-    asyncForEach(files.map(function (f) {
-      return path.join(p, f)
-    }), function (file, cb) {
-      rimraf(file, cb)
-    }, function (er) {
-      if (er) return cb(er)
-      fs.rmdir(p, cb)
+    if (er)
+      return cb(er)
+    var n = files.length
+    if (n === 0)
+      return fs.rmdir(p, cb)
+    var errState
+    files.forEach(function (f) {
+      rimraf(path.join(p, f), function (er) {
+        if (errState)
+          return
+        if (er)
+          return cb(errState = er)
+        if (--n === 0)
+          fs.rmdir(p, cb)
+      })
     })
   })
 }
 
-function asyncForEach (list, fn, cb) {
-  if (!list.length) cb()
-  var c = list.length
-    , errState = null
-  list.forEach(function (item, i, list) {
-    fn(item, function (er) {
-      if (errState) return
-      if (er) return cb(errState = er)
-      if (-- c === 0) return cb()
-    })
-  })
+// this looks simpler, and is strictly *faster*, but will
+// tie up the JavaScript thread and fail on excessively
+// deep directory trees.
+function rimrafSync (p) {
+  try {
+    fs.unlinkSync(p)
+  } catch (er) {
+    if (er.code === "ENOENT")
+      return
+    if (er.code === "EPERM")
+      return isWindows ? fixWinEPERMSync(p, er) : rmdirSync(p, er)
+    if (er.code !== "EISDIR")
+      throw er
+    rmdirSync(p, er)
+  }
 }
 
-// this looks simpler, but it will fail with big directory trees,
-// or on slow stupid awful cygwin filesystems
-function rimrafSync (p) {
+function rmdirSync (p, originalEr) {
   try {
-    var s = fs[lstatSync](p)
+    fs.rmdirSync(p)
   } catch (er) {
-    if (er.code === "ENOENT") return
-    throw er
+    if (er.code === "ENOENT")
+      return
+    if (er.code === "ENOTDIR")
+      throw originalEr
+    if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")
+      rmkidsSync(p)
   }
+}
 
-  if (!writable(s)) {
-    fs.chmodSync(p, s.mode | 0222)
-  }
-
-  if (!s.isDirectory()) return fs.unlinkSync(p)
-
+function rmkidsSync (p) {
   fs.readdirSync(p).forEach(function (f) {
     rimrafSync(path.join(p, f))
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/underscore.string/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/underscore.string/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/node_modules/underscore.string/package.json	(revision 516)
@@ -69,8 +69,4 @@
   "readmeFilename": "README.markdown",
   "_id": "underscore.string@2.2.1",
-  "dist": {
-    "shasum": "2aa155e7c49bcbfd88ec69b8c9694d885385c717"
-  },
-  "_from": "underscore.string@~2.2.1",
-  "_resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz"
+  "_from": "underscore.string@~2.2.1"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/grunt/package.json	(revision 516)
@@ -2,5 +2,5 @@
   "name": "grunt",
   "description": "The JavaScript Task Runner",
-  "version": "0.4.2",
+  "version": "0.4.4",
   "author": {
     "name": "\"Cowboy\" Ben Alman",
@@ -59,5 +59,5 @@
     "minimatch": "~0.2.12",
     "nopt": "~1.0.10",
-    "rimraf": "~2.0.3",
+    "rimraf": "~2.2.6",
     "lodash": "~0.9.2",
     "underscore.string": "~2.2.1",
@@ -65,5 +65,6 @@
     "js-yaml": "~2.0.5",
     "exit": "~0.1.1",
-    "getobject": "~0.1.0"
+    "getobject": "~0.1.0",
+    "grunt-legacy-util": "~0.1.2"
   },
   "devDependencies": {
@@ -76,11 +77,11 @@
     "shelljs": "~0.2.5"
   },
-  "readme": "# Grunt: The JavaScript Task Runner [![Build Status](https://secure.travis-ci.org/gruntjs/grunt.png?branch=master)](http://travis-ci.org/gruntjs/grunt)\n\n<img align=\"right\" height=\"260\" src=\"http://gruntjs.com/img/grunt-logo-no-wordmark.svg\">\n\n\n### Documentation\n\nVisit the [gruntjs.com](http://gruntjs.com/) website for all the things.\n\n### Support / Contributing\nBefore you make an issue, please read our [Contributing](http://gruntjs.com/contributing) guide.\n\nYou can find the grunt team in [#grunt on irc.freenode.net](http://webchat.freenode.net/?channels=grunt).\n\n### Release History\nSee the [CHANGELOG](CHANGELOG).\n",
+  "readme": "# Grunt: The JavaScript Task Runner\n\n[![Build Status](https://secure.travis-ci.org/gruntjs/grunt.png?branch=master)](http://travis-ci.org/gruntjs/grunt)\n[![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/)\n\n<img align=\"right\" height=\"260\" src=\"http://gruntjs.com/img/grunt-logo-no-wordmark.svg\">\n\n\n### Documentation\n\nVisit the [gruntjs.com](http://gruntjs.com/) website for all the things.\n\n### Support / Contributing\nBefore you make an issue, please read our [Contributing](http://gruntjs.com/contributing) guide.\n\nYou can find the grunt team in [#grunt on irc.freenode.net](http://webchat.freenode.net/?channels=grunt).\n\n### Release History\nSee the [CHANGELOG](CHANGELOG).\n",
   "readmeFilename": "README.md",
-  "_id": "grunt@0.4.2",
+  "_id": "grunt@0.4.4",
   "dist": {
-    "shasum": "1f6804f00e977dd90b9f97b1faed480215db0857"
+    "shasum": "64f477fef801475ab92f1819a691c6c71b72902e"
   },
-  "_from": "grunt@0.4.2",
-  "_resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.2.tgz"
+  "_from": "grunt@0.4.4",
+  "_resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.4.tgz"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/node_modules/underscore/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/node_modules/underscore/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/node_modules/underscore/package.json	(revision 516)
@@ -32,8 +32,4 @@
   },
   "_id": "underscore@1.4.4",
-  "_from": "underscore@1.4.4",
-  "dist": {
-    "shasum": "3e7ceb21f205bc19964685e1fdd52c8f77773674"
-  },
-  "_resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz"
+  "_from": "underscore@1.4.4"
 }
Index: /Dev/trunk/node_modules/grunt-amd-check/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-amd-check/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-amd-check/package.json	(revision 516)
@@ -33,4 +33,8 @@
   },
   "_from": "grunt-amd-check@",
-  "_resolved": "https://registry.npmjs.org/grunt-amd-check/-/grunt-amd-check-0.5.2.tgz"
+  "_resolved": "https://registry.npmjs.org/grunt-amd-check/-/grunt-amd-check-0.5.2.tgz",
+  "devDependencies": {
+    "underscore": "^1.4.4",
+    "grunt": "^0.4.4"
+  }
 }
Index: /Dev/trunk/node_modules/grunt-banner/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-banner/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-banner/package.json	(revision 516)
@@ -45,8 +45,8 @@
   "readmeFilename": "README.md",
   "_id": "grunt-banner@0.1.4",
-  "_from": "grunt-banner@0.1.4",
   "dist": {
     "shasum": "93d7c29395f7a33a039a231344e4a6fdd6fa28ea"
   },
+  "_from": "grunt-banner@0.1.4",
   "_resolved": "https://registry.npmjs.org/grunt-banner/-/grunt-banner-0.1.4.tgz"
 }
Index: /Dev/trunk/node_modules/grunt-coffeelint/.travis.yml
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/.travis.yml	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/.travis.yml	(revision 516)
@@ -1,4 +1,5 @@
 language: node_js
 node_js:
-  - 0.6
   - 0.8
+before_script:
+  - npm install -g grunt-cli
Index: /Dev/trunk/node_modules/grunt-coffeelint/Gruntfile.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/Gruntfile.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/Gruntfile.coffee	(revision 516)
@@ -0,0 +1,42 @@
+module.exports = (grunt) ->
+
+  # Project configuration.
+  grunt.initConfig
+
+    coffeelint:
+      # global options
+      options:
+        indentation:
+          value: 4
+          level: 'warn'
+
+      # a target that overrides default options
+      one:
+        files:
+          src: ['test/fixtures/*.coffee']
+        options:
+          indentation:
+            value: 2
+            level: 'warn'
+          'no_trailing_semicolons':
+            level: 'warn'
+
+      # a simple target
+      two: ['test/fixtures/correct.coffee', 'test/fixtures/some.coffee']
+
+  # Load local tasks.
+  grunt.loadTasks 'tasks'
+
+  grunt.loadNpmTasks 'grunt-npm'
+  grunt.loadNpmTasks 'grunt-bump'
+
+  # Default task.
+  grunt.registerTask 'default', 'coffeelint'
+
+  grunt.registerTask 'test', 'coffeelint'
+
+  grunt.registerTask 'release', 'Bump version, push to NPM.', (type)->
+    grunt.task.run [
+      "bump:#{type || 'patch'}"
+      'npm-publish'
+    ]
Index: v/trunk/node_modules/grunt-coffeelint/Gruntfile.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/Gruntfile.js	(revision 515)
+++ 	(revision )
@@ -1,51 +1,0 @@
-module.exports = function(grunt) {
-
-  // Project configuration.
-  grunt.initConfig({
-
-    coffeelint: {
-      // global options
-      options: {
-        indentation: {
-          value: 4,
-          level: 'warn'
-        }
-      },
-
-      // a target that overrides default options
-      one: {
-        files: {
-          src: ['test/fixtures/*.coffee']
-        },
-        options: {
-          indentation: {
-            value: 2,
-            level: 'warn'
-          },
-          'no_trailing_semicolons': {
-            level: 'warn'
-          }
-        }
-      },
-
-      // a simple target
-      two: ['test/fixtures/correct.coffee', 'test/fixtures/some.coffee']
-    }
-  });
-
-  // Load local tasks.
-  grunt.loadTasks('tasks');
-
-  grunt.loadNpmTasks('grunt-npm');
-  grunt.loadNpmTasks('grunt-bump');
-
-  // Default task.
-  grunt.registerTask('default', 'coffeelint');
-
-  grunt.registerTask('release', 'Bump version, push to NPM.', function(type) {
-    grunt.task.run([
-      'bump:' + (type || 'patch'),
-      'npm-publish'
-    ]);
-  });
-};
Index: /Dev/trunk/node_modules/grunt-coffeelint/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/README.md	(revision 516)
@@ -14,4 +14,13 @@
     grunt.loadNpmTasks('grunt-coffeelint');
 
+## Options
+
+A few additional options are supported:
+
+### force
+Type: `Boolean`
+Default value: `false`
+
+Set `force` to `true` to report CoffeeLint errors but not fail the task.
 
 ## Configuration
@@ -68,8 +77,6 @@
 ````
 
-For available options see [example configuration] or [coffeelint homepage].
-
+For available options see [coffeelint homepage].
 
 [CoffeeLint]: http://www.coffeelint.org/
 [coffeelint homepage]: http://www.coffeelint.org/
-[example configuration]: https://raw.github.com/clutchski/coffeelint/master/examples/coffeelint.json
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/.package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/.package.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/.package.json	(revision 516)
@@ -0,0 +1,52 @@
+{
+  "name": "coffeelint",
+  "description": "Lint your CoffeeScript",
+  "version": "1.0.8",
+  "homepage": "http://www.coffeelint.org",
+  "keywords": [
+    "lint",
+    "coffeescript",
+    "coffee-script"
+  ],
+  "author": "Matthew Perpick <clutchski@gmail.com>",
+  "main": "./lib/coffeelint.js",
+  "engines": {
+    "node": ">=0.8.0"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/clutchski/coffeelint.git"
+  },
+  "bin": {
+    "coffeelint": "./bin/coffeelint"
+  },
+  "dependencies": {
+    "optimist": ">=0.2.8",
+    "coffee-script": "1.6.x",
+    "glob": ">=3.1.9",
+    "browserify": "~3.x",
+    "coffeeify": "~0.6.0"
+  },
+  "devDependencies": {
+    "vows": ">=0.6.0",
+    "underscore": ">=1.4.4"
+  },
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "http://github.com/clutchski/coffeelint/raw/master/LICENSE"
+    }
+  ],
+  "scripts": {
+    "pretest": "cake compile",
+    "test": "vows --spec test/*.coffee test/*.litcoffee",
+    "posttest": "npm run lint",
+    "prepublish": "cake prepublish",
+    "publish": "cake publish",
+    "install": "cake install",
+    "lint": "cake compile && ./bin/coffeelint -f coffeelint.json src/*.coffee test/*.coffee test/*.litcoffee",
+    "lint-csv": "cake compile && ./bin/coffeelint --csv -f coffeelint.json src/*.coffee test/*.coffee",
+    "lint-jslint": "cake compile && ./bin/coffeelint --jslint -f coffeelint.json src/*.coffee test/*.coffee",
+    "compile": "cake compile"
+  }
+}
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/.travis.yml
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/.travis.yml	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/.travis.yml	(revision 516)
@@ -1,5 +1,4 @@
 language: node_js
 node_js:
-  - "0.6"
   - "0.8"
   - "0.10"
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/3rd_party_rules.md
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/3rd_party_rules.md	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/3rd_party_rules.md	(revision 516)
@@ -0,0 +1,68 @@
+Creating a 3rd party rule
+=========================
+
+If your rule is overly specific or too restrictive it may not be accepted into
+the CoffeeLint repo. This doesn't mean you can't have your rule.
+
+Setup your repo
+---------------
+
+My personal preference is to not commit compiled Javascript files to a
+CoffeeScript repo. 
+
+1. `npm init`
+2. `npm install --save coffee-script` When it asks about `main` leave it as `index.js`
+3. Create an `index.js` it only needs two lines
+
+        require('coffee-script');
+        module.exports = require('./your_rule_name.coffee');
+
+4. `sudo npm link`: Once you run this CoffeeLint will be able to `require` your module
+5. Build your rule, make sure the file name matches `index.js`'s `require`
+
+[link]: https://npmjs.org/doc/cli/npm-link.html
+
+Loading your rule
+-----------------
+
+It's probably best once you get this worked out, to commit a coffeelint.json to
+your repo with your rule enabled. Here is an example:
+
+
+    {
+        "your_rule_name": {
+            "module": "your-rule-name"
+        }
+    }
+
+
+* `your_rule_name`: This MUST match the name inside your rule. A few of of the
+  built in rules are no_plus_plus, no_tabs, and cyclomatic_complexity
+* `your-rule-name`: npm's convention is to use dashes. CoffeeLint is going to
+  run `require('your-rule-name')` to find this rule.
+
+Publishing your rule
+--------------------
+
+Once you're ready you can publish it as a normal npm package. Remember to
+mention in your readme that they will need to `npm install -g your-rule-name`.
+If it's not global CoffeeLint won't see it.
+
+By convention rule authors add the keyword `coffeelintrule` to their npm 
+`package.json` so custom rules can be found easily. Click
+[here](https://npmjs.org/search?q=coffeelintrule) to list all currently available
+custom rules on npm.
+
+Verify Installation
+-------------------
+
+This will verify your development install when you used `sudo npm link` or when
+users run `npm install -g your-rule-name`
+
+Verify your installation using:
+
+    node -p "require('your-rule-name');"
+
+You should get output similar to
+
+    [Function: YourRuleName]
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/Cakefile
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/Cakefile	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/Cakefile	(revision 516)
@@ -0,0 +1,54 @@
+fs = require 'fs'
+browserify = require 'browserify'
+CoffeeScript = require 'coffee-script'
+
+
+copySync = (src, dest) ->
+    fs.writeFileSync dest, fs.readFileSync(src)
+
+coffeeSync = (input, output) ->
+    coffee = fs.readFileSync(input).toString()
+    fs.writeFileSync output, CoffeeScript.compile(coffee)
+
+
+task 'compile', 'Compile Coffeelint', ->
+    console.log 'Compiling Coffeelint...'
+    fs.mkdirSync 'lib' unless fs.existsSync 'lib'
+    invoke 'compile:browserify'
+    invoke 'compile:commandline'
+
+task 'compile:commandline', 'Compiles commandline.js', ->
+    coffeeSync 'src/commandline.coffee', 'lib/commandline.js'
+    coffeeSync 'src/configfinder.coffee', 'lib/configfinder.js'
+
+task 'compile:browserify', 'Uses browserify to compile coffeelint', ->
+    b = browserify [ './src/coffeelint.coffee' ]
+    opts =
+        standalone: 'coffeelint'
+    b.transform require('coffeeify')
+    b.bundle(opts).pipe fs.createWriteStream('lib/coffeelint.js')
+
+task 'prepublish', 'Prepublish', ->
+    { npm_config_argv } = process.env
+    if npm_config_argv? and JSON.parse(npm_config_argv).original[0] is 'install'
+        return
+
+    copySync 'package.json', '.package.json'
+    packageJson = require './package.json'
+
+    delete packageJson.dependencies.browserify
+    delete packageJson.dependencies.coffeeify
+    delete packageJson.scripts.install
+
+    fs.writeFileSync 'package.json', JSON.stringify(packageJson, undefined, 2)
+
+    invoke 'compile'
+
+task 'publish', 'publish', ->
+    copySync '.package.json', 'package.json'
+
+task 'install', 'Install', ->
+    unless require("fs").existsSync("lib/commandline.js")
+        invoke 'compile'
+
+
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/bin/coffeelint
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/bin/coffeelint	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/bin/coffeelint	(revision 516)
@@ -1,3 +1,21 @@
 #!/usr/bin/env node
 
-require('../lib/commandline')
+var path = require("path");
+var fs   = require("fs");
+
+// path.existsSync was moved to fs.existsSync node 0.6 -> 0.8
+var existsFn = fs.existsSync || path.existsSync;
+
+var thisdir = path.dirname(fs.realpathSync(__filename));
+
+// This setup allows for VERY fast development. You can clear the lib
+// directory then run without having to recompile the coffeescript.
+//
+// I use this so vim runs the newest code while I work on CoffeeLint. -Asa
+commandline = path.join(thisdir, '..', "lib", "commandline.js");
+if (existsFn(commandline)) {
+    require(commandline);
+} else {
+    require('coffee-script');
+    require('../src/commandline');
+}
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/coffeelint.json
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/coffeelint.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/coffeelint.json	(revision 516)
@@ -0,0 +1,25 @@
+{
+    "arrow_spacing": {
+        "level": "error"
+    },
+    "indentation" : {
+        "level" : "error",
+        "value" : 4
+    },
+
+    "cyclomatic_complexity" : {
+        "level" : "warn",
+        "value" : 11
+    },
+
+    "line_endings" : {
+        "value" : "unix",
+        "level" : "error"
+    },
+
+    "space_operators" : {
+        "level" : "error"
+    }
+
+
+}
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/generated_coffeelint.json
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/generated_coffeelint.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/generated_coffeelint.json	(revision 516)
@@ -0,0 +1,114 @@
+{
+    "coffeescript_error": {
+        "level": "error"
+    },
+    "arrow_spacing": {
+        "name": "arrow_spacing",
+        "level": "ignore"
+    },
+    "no_tabs": {
+        "name": "no_tabs",
+        "level": "error"
+    },
+    "no_trailing_whitespace": {
+        "name": "no_trailing_whitespace",
+        "level": "error",
+        "allowed_in_comments": false,
+        "allowed_in_empty_lines": true
+    },
+    "max_line_length": {
+        "name": "max_line_length",
+        "value": 80,
+        "level": "error",
+        "limitComments": true
+    },
+    "line_endings": {
+        "name": "line_endings",
+        "level": "ignore",
+        "value": "unix"
+    },
+    "no_trailing_semicolons": {
+        "name": "no_trailing_semicolons",
+        "level": "error"
+    },
+    "indentation": {
+        "name": "indentation",
+        "value": 2,
+        "level": "error"
+    },
+    "camel_case_classes": {
+        "name": "camel_case_classes",
+        "level": "error"
+    },
+    "colon_assignment_spacing": {
+        "name": "colon_assignment_spacing",
+        "level": "ignore",
+        "spacing": {
+            "left": 0,
+            "right": 0
+        }
+    },
+    "no_implicit_braces": {
+        "name": "no_implicit_braces",
+        "level": "ignore",
+        "strict": true
+    },
+    "no_plusplus": {
+        "name": "no_plusplus",
+        "level": "ignore"
+    },
+    "no_throwing_strings": {
+        "name": "no_throwing_strings",
+        "level": "error"
+    },
+    "no_backticks": {
+        "name": "no_backticks",
+        "level": "error"
+    },
+    "no_implicit_parens": {
+        "name": "no_implicit_parens",
+        "level": "ignore"
+    },
+    "no_empty_param_list": {
+        "name": "no_empty_param_list",
+        "level": "ignore"
+    },
+    "no_stand_alone_at": {
+        "name": "no_stand_alone_at",
+        "level": "ignore"
+    },
+    "space_operators": {
+        "name": "space_operators",
+        "level": "ignore"
+    },
+    "duplicate_key": {
+        "name": "duplicate_key",
+        "level": "error"
+    },
+    "empty_constructor_needs_parens": {
+        "name": "empty_constructor_needs_parens",
+        "level": "ignore"
+    },
+    "cyclomatic_complexity": {
+        "name": "cyclomatic_complexity",
+        "value": 10,
+        "level": "ignore"
+    },
+    "newlines_after_classes": {
+        "name": "newlines_after_classes",
+        "value": 3,
+        "level": "ignore"
+    },
+    "no_unnecessary_fat_arrows": {
+        "name": "no_unnecessary_fat_arrows",
+        "level": "warn"
+    },
+    "missing_fat_arrows": {
+        "name": "missing_fat_arrows",
+        "level": "ignore"
+    },
+    "non_empty_constructor_needs_parens": {
+        "name": "non_empty_constructor_needs_parens",
+        "level": "ignore"
+    }
+}
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/lib/coffeelint.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/lib/coffeelint.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/lib/coffeelint.js	(revision 516)
@@ -1,3 +1,235 @@
-// Generated by CoffeeScript 1.6.2
+!function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.coffeelint=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
+module.exports={
+  "name": "coffeelint",
+  "description": "Lint your CoffeeScript",
+  "version": "1.0.8",
+  "homepage": "http://www.coffeelint.org",
+  "keywords": [
+    "lint",
+    "coffeescript",
+    "coffee-script"
+  ],
+  "author": "Matthew Perpick <clutchski@gmail.com>",
+  "main": "./lib/coffeelint.js",
+  "engines": {
+    "node": ">=0.8.0"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/clutchski/coffeelint.git"
+  },
+  "bin": {
+    "coffeelint": "./bin/coffeelint"
+  },
+  "dependencies": {
+    "optimist": ">=0.2.8",
+    "coffee-script": "1.6.x",
+    "glob": ">=3.1.9"
+  },
+  "devDependencies": {
+    "vows": ">=0.6.0",
+    "underscore": ">=1.4.4"
+  },
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "http://github.com/clutchski/coffeelint/raw/master/LICENSE"
+    }
+  ],
+  "scripts": {
+    "pretest": "cake compile",
+    "test": "vows --spec test/*.coffee test/*.litcoffee",
+    "posttest": "npm run lint",
+    "prepublish": "cake prepublish",
+    "publish": "cake publish",
+    "lint": "cake compile && ./bin/coffeelint -f coffeelint.json src/*.coffee test/*.coffee test/*.litcoffee",
+    "lint-csv": "cake compile && ./bin/coffeelint --csv -f coffeelint.json src/*.coffee test/*.coffee",
+    "lint-jslint": "cake compile && ./bin/coffeelint --jslint -f coffeelint.json src/*.coffee test/*.coffee",
+    "compile": "cake compile"
+  }
+}
+},{}],2:[function(_dereq_,module,exports){
+var ASTApi, ASTLinter, BaseLinter,
+  __hasProp = {}.hasOwnProperty,
+  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
+
+BaseLinter = _dereq_('./base_linter.coffee');
+
+ASTApi = (function() {
+  function ASTApi(config) {
+    this.config = config;
+  }
+
+  return ASTApi;
+
+})();
+
+module.exports = ASTLinter = (function(_super) {
+  __extends(ASTLinter, _super);
+
+  function ASTLinter(source, config, rules, CoffeeScript) {
+    this.CoffeeScript = CoffeeScript;
+    ASTLinter.__super__.constructor.call(this, source, config, rules);
+    this.astApi = new ASTApi(this.config);
+  }
+
+  ASTLinter.prototype.acceptRule = function(rule) {
+    return typeof rule.lintAST === 'function';
+  };
+
+  ASTLinter.prototype.lint = function() {
+    var coffeeError, err, errors, rule, v, _i, _len, _ref;
+    errors = [];
+    try {
+      this.node = this.CoffeeScript.nodes(this.source);
+    } catch (_error) {
+      coffeeError = _error;
+      err = this._parseCoffeeScriptError(coffeeError);
+      if (err != null) {
+        errors.push(err);
+      }
+      return errors;
+    }
+    _ref = this.rules;
+    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+      rule = _ref[_i];
+      this.astApi.createError = (function(_this) {
+        return function(attrs) {
+          if (attrs == null) {
+            attrs = {};
+          }
+          return _this.createError(rule.rule.name, attrs);
+        };
+      })(this);
+      rule.errors = errors;
+      v = this.normalizeResult(rule, rule.lintAST(this.node, this.astApi));
+      if (v != null) {
+        return v;
+      }
+    }
+    return errors;
+  };
+
+  ASTLinter.prototype._parseCoffeeScriptError = function(coffeeError) {
+    var attrs, lineNumber, match, message, rule;
+    rule = this.config['coffeescript_error'];
+    message = coffeeError.toString();
+    lineNumber = -1;
+    if (coffeeError.location != null) {
+      lineNumber = coffeeError.location.first_line + 1;
+    } else {
+      match = /line (\d+)/.exec(message);
+      if ((match != null ? match.length : void 0) > 1) {
+        lineNumber = parseInt(match[1], 10);
+      }
+    }
+    attrs = {
+      message: message,
+      level: rule.level,
+      lineNumber: lineNumber
+    };
+    return this.createError('coffeescript_error', attrs);
+  };
+
+  return ASTLinter;
+
+})(BaseLinter);
+
+
+},{"./base_linter.coffee":3}],3:[function(_dereq_,module,exports){
+var BaseLinter, defaults, extend,
+  __slice = [].slice;
+
+extend = function() {
+  var destination, k, source, sources, v, _i, _len;
+  destination = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+  for (_i = 0, _len = sources.length; _i < _len; _i++) {
+    source = sources[_i];
+    for (k in source) {
+      v = source[k];
+      destination[k] = v;
+    }
+  }
+  return destination;
+};
+
+defaults = function(source, defaults) {
+  return extend({}, defaults, source);
+};
+
+module.exports = BaseLinter = (function() {
+  function BaseLinter(source, config, rules) {
+    this.source = source;
+    this.config = config;
+    this.setupRules(rules);
+  }
+
+  BaseLinter.prototype.isObject = function(obj) {
+    return obj === Object(obj);
+  };
+
+  BaseLinter.prototype.createError = function(ruleName, attrs) {
+    var level;
+    if (attrs == null) {
+      attrs = {};
+    }
+    if (attrs.level == null) {
+      attrs.level = this.config[ruleName].level;
+    }
+    level = attrs.level;
+    if (level !== 'ignore' && level !== 'warn' && level !== 'error') {
+      throw new Error("unknown level " + level);
+    }
+    if (level === 'error' || level === 'warn') {
+      attrs.rule = ruleName;
+      return defaults(attrs, this.config[ruleName]);
+    } else {
+      return null;
+    }
+  };
+
+  BaseLinter.prototype.acceptRule = function(rule) {
+    throw new Error("acceptRule needs to be overridden in the subclass");
+  };
+
+  BaseLinter.prototype.setupRules = function(rules) {
+    var RuleConstructor, level, name, rule, _results;
+    this.rules = [];
+    _results = [];
+    for (name in rules) {
+      RuleConstructor = rules[name];
+      level = this.config[name].level;
+      if (level === 'error' || level === 'warn') {
+        rule = new RuleConstructor(this, this.config);
+        if (this.acceptRule(rule)) {
+          _results.push(this.rules.push(rule));
+        } else {
+          _results.push(void 0);
+        }
+      } else if (level !== 'ignore') {
+        throw new Error("unknown level " + level);
+      } else {
+        _results.push(void 0);
+      }
+    }
+    return _results;
+  };
+
+  BaseLinter.prototype.normalizeResult = function(p, result) {
+    if (result === true) {
+      return this.createError(p.rule.name);
+    }
+    if (this.isObject(result)) {
+      return this.createError(p.rule.name, result);
+    }
+  };
+
+  return BaseLinter;
+
+})();
+
+
+},{}],4:[function(_dereq_,module,exports){
+
 /*
 CoffeeLint
@@ -5,183 +237,602 @@
 Copyright (c) 2011 Matthew Perpick.
 CoffeeLint is freely distributable under the MIT license.
-*/
-
-
-(function() {
-  var ASTLinter, CoffeeScript, ERROR, IGNORE, LexicalLinter, LineLinter, RULES, WARN, block_config, coffeelint, createError, defaults, extend, mergeDefaultConfig, regexes,
-    __slice = [].slice,
-    __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
-
-  coffeelint = {};
-
-  if (typeof exports !== "undefined" && exports !== null) {
-    coffeelint = exports;
-    CoffeeScript = require('coffee-script');
+ */
+var ASTLinter, CoffeeScript, ERROR, IGNORE, LexicalLinter, LineLinter, RULES, WARN, coffeelint, cs, defaults, difference, extend, hasSyntaxError, mergeDefaultConfig, packageJSON, _rules,
+  __slice = [].slice,
+  __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
+
+coffeelint = exports;
+
+if (typeof window !== "undefined" && window !== null) {
+  CoffeeScript = window.CoffeeScript;
+} else {
+  cs = 'coffee-script';
+  CoffeeScript = _dereq_(cs);
+}
+
+packageJSON = _dereq_('./../package.json');
+
+coffeelint.VERSION = packageJSON.version;
+
+ERROR = 'error';
+
+WARN = 'warn';
+
+IGNORE = 'ignore';
+
+coffeelint.RULES = RULES = _dereq_('./rules.coffee');
+
+extend = function() {
+  var destination, k, source, sources, v, _i, _len;
+  destination = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
+  for (_i = 0, _len = sources.length; _i < _len; _i++) {
+    source = sources[_i];
+    for (k in source) {
+      v = source[k];
+      destination[k] = v;
+    }
+  }
+  return destination;
+};
+
+defaults = function(source, defaults) {
+  return extend({}, defaults, source);
+};
+
+difference = function(a, b) {
+  var j, _ref, _results;
+  j = 0;
+  _results = [];
+  while (j < a.length) {
+    if (_ref = a[j], __indexOf.call(b, _ref) >= 0) {
+      _results.push(a.splice(j, 1));
+    } else {
+      _results.push(j++);
+    }
+  }
+  return _results;
+};
+
+LineLinter = _dereq_('./line_linter.coffee');
+
+LexicalLinter = _dereq_('./lexical_linter.coffee');
+
+ASTLinter = _dereq_('./ast_linter.coffee');
+
+mergeDefaultConfig = function(userConfig) {
+  var config, rule, ruleConfig;
+  config = {};
+  for (rule in RULES) {
+    ruleConfig = RULES[rule];
+    config[rule] = defaults(userConfig[rule], ruleConfig);
+  }
+  return config;
+};
+
+coffeelint.invertLiterate = function(source) {
+  var line, newSource, _i, _len, _ref;
+  source = CoffeeScript.helpers.invertLiterate(source);
+  newSource = "";
+  _ref = source.split("\n");
+  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+    line = _ref[_i];
+    if (line.match(/^#/)) {
+      line = line.replace(/\s*$/, '');
+    }
+    line = line.replace(/^\s{4}/g, '');
+    newSource += "" + line + "\n";
+  }
+  return newSource;
+};
+
+_rules = {};
+
+coffeelint.registerRule = function(RuleConstructor, ruleName) {
+  var e, name, p, _ref, _ref1;
+  if (ruleName == null) {
+    ruleName = void 0;
+  }
+  p = new RuleConstructor;
+  name = (p != null ? (_ref = p.rule) != null ? _ref.name : void 0 : void 0) || "(unknown)";
+  e = function(msg) {
+    throw new Error("Invalid rule: " + name + " " + msg);
+  };
+  if (p.rule == null) {
+    e("Rules must provide rule attribute with a default configuration.");
+  }
+  if (p.rule.name == null) {
+    e("Rule defaults require a name");
+  }
+  if ((ruleName != null) && ruleName !== p.rule.name) {
+    e("Mismatched rule name: " + ruleName);
+  }
+  if (p.rule.message == null) {
+    e("Rule defaults require a message");
+  }
+  if (p.rule.description == null) {
+    e("Rule defaults require a description");
+  }
+  if ((_ref1 = p.rule.level) !== 'ignore' && _ref1 !== 'warn' && _ref1 !== 'error') {
+    e("Default level must be 'ignore', 'warn', or 'error'");
+  }
+  if (typeof p.lintToken === 'function') {
+    if (!p.tokens) {
+      e("'tokens' is required for 'lintToken'");
+    }
+  } else if (typeof p.lintLine !== 'function' && typeof p.lintAST !== 'function') {
+    e("Rules must implement lintToken, lintLine, or lintAST");
+  }
+  RULES[p.rule.name] = p.rule;
+  return _rules[p.rule.name] = RuleConstructor;
+};
+
+coffeelint.registerRule(_dereq_('./rules/arrow_spacing.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/no_tabs.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/no_trailing_whitespace.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/max_line_length.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/line_endings.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/no_trailing_semicolons.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/indentation.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/camel_case_classes.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/colon_assignment_spacing.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/no_implicit_braces.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/no_plusplus.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/no_throwing_strings.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/no_backticks.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/no_implicit_parens.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/no_empty_param_list.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/no_stand_alone_at.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/space_operators.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/duplicate_key.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/empty_constructor_needs_parens.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/cyclomatic_complexity.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/newlines_after_classes.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/no_unnecessary_fat_arrows.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/missing_fat_arrows.coffee'));
+
+coffeelint.registerRule(_dereq_('./rules/non_empty_constructor_needs_parens.coffee'));
+
+hasSyntaxError = function(source) {
+  try {
+    CoffeeScript.tokens(source);
+    return false;
+  } catch (_error) {}
+  return true;
+};
+
+coffeelint.lint = function(source, userConfig, literate) {
+  var all_errors, astErrors, block_config, cmd, config, disabled, disabled_initially, e, errors, i, l, lexErrors, lexicalLinter, lineErrors, lineLinter, next_line, r, rules, s, tokensByLine, _i, _j, _k, _len, _len1, _ref, _ref1, _ref2, _ref3, _ref4;
+  if (userConfig == null) {
+    userConfig = {};
+  }
+  if (literate == null) {
+    literate = false;
+  }
+  if (literate) {
+    source = this.invertLiterate(source);
+  }
+  config = mergeDefaultConfig(userConfig);
+  disabled_initially = [];
+  _ref = source.split('\n');
+  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+    l = _ref[_i];
+    s = LineLinter.configStatement.exec(l);
+    if ((s != null ? s.length : void 0) > 2 && __indexOf.call(s, 'enable') >= 0) {
+      _ref1 = s.slice(1);
+      for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
+        r = _ref1[_j];
+        if (r !== 'enable' && r !== 'disable') {
+          if (!(r in config && ((_ref2 = config[r].level) === 'warn' || _ref2 === 'error'))) {
+            disabled_initially.push(r);
+            config[r] = {
+              level: 'error'
+            };
+          }
+        }
+      }
+    }
+  }
+  astErrors = new ASTLinter(source, config, _rules, CoffeeScript).lint();
+  errors = [].concat(astErrors);
+  if (!hasSyntaxError(source)) {
+    lexicalLinter = new LexicalLinter(source, config, _rules, CoffeeScript);
+    lexErrors = lexicalLinter.lint();
+    errors = errors.concat(lexErrors);
+    tokensByLine = lexicalLinter.tokensByLine;
+    lineLinter = new LineLinter(source, config, _rules, tokensByLine, literate);
+    lineErrors = lineLinter.lint();
+    errors = errors.concat(lineErrors);
+    block_config = lineLinter.block_config;
   } else {
-    this.coffeelint = coffeelint;
-    CoffeeScript = this.CoffeeScript;
-  }
-
-  coffeelint.VERSION = "0.5.7";
-
-  ERROR = 'error';
-
-  WARN = 'warn';
-
-  IGNORE = 'ignore';
-
-  coffeelint.RULES = RULES = {
-    no_tabs: {
-      level: ERROR,
-      message: 'Line contains tab indentation',
-      description: "This rule forbids tabs in indentation. Enough said. It is enabled by\ndefault."
-    },
-    no_trailing_whitespace: {
-      level: ERROR,
-      message: 'Line ends with trailing whitespace',
-      allowed_in_comments: false,
-      description: "This rule forbids trailing whitespace in your code, since it is\nneedless cruft. It is enabled by default."
-    },
-    max_line_length: {
-      value: 80,
-      level: ERROR,
-      message: 'Line exceeds maximum allowed length',
-      description: "This rule imposes a maximum line length on your code. <a\nhref=\"http://www.python.org/dev/peps/pep-0008/\">Python's style\nguide</a> does a good job explaining why you might want to limit the\nlength of your lines, though this is a matter of taste.\n\nLines can be no longer than eighty characters by default."
-    },
-    camel_case_classes: {
-      level: ERROR,
-      message: 'Class names should be camel cased',
-      description: "This rule mandates that all class names are camel cased. Camel\ncasing class names is a generally accepted way of distinguishing\nconstructor functions - which require the 'new' prefix to behave\nproperly - from plain old functions.\n<pre>\n<code># Good!\nclass BoaConstrictor\n\n# Bad!\nclass boaConstrictor\n</code>\n</pre>\nThis rule is enabled by default."
-    },
-    indentation: {
-      value: 2,
-      level: ERROR,
-      message: 'Line contains inconsistent indentation',
-      description: "This rule imposes a standard number of spaces to be used for\nindentation. Since whitespace is significant in CoffeeScript, it's\ncritical that a project chooses a standard indentation format and\nstays consistent. Other roads lead to darkness. <pre> <code>#\nEnabling this option will prevent this ugly\n# but otherwise valid CoffeeScript.\ntwoSpaces = () ->\n  fourSpaces = () ->\n      eightSpaces = () ->\n            'this is valid CoffeeScript'\n\n</code>\n</pre>\nTwo space indentation is enabled by default."
-    },
-    no_implicit_braces: {
-      level: IGNORE,
-      message: 'Implicit braces are forbidden',
-      description: "This rule prohibits implicit braces when declaring object literals.\nImplicit braces can make code more difficult to understand,\nespecially when used in combination with optional parenthesis.\n<pre>\n<code># Do you find this code ambiguous? Is it a\n# function call with three arguments or four?\nmyFunction a, b, 1:2, 3:4\n\n# While the same code written in a more\n# explicit manner has no ambiguity.\nmyFunction(a, b, {1:2, 3:4})\n</code>\n</pre>\nImplicit braces are permitted by default, since their use is\nidiomatic CoffeeScript."
-    },
-    no_trailing_semicolons: {
-      level: ERROR,
-      message: 'Line contains a trailing semicolon',
-      description: "This rule prohibits trailing semicolons, since they are needless\ncruft in CoffeeScript.\n<pre>\n<code># This semicolon is meaningful.\nx = '1234'; console.log(x)\n\n# This semicolon is redundant.\nalert('end of line');\n</code>\n</pre>\nTrailing semicolons are forbidden by default."
-    },
-    no_plusplus: {
-      level: IGNORE,
-      message: 'The increment and decrement operators are forbidden',
-      description: "This rule forbids the increment and decrement arithmetic operators.\nSome people believe the <tt>++</tt> and <tt>--</tt> to be cryptic\nand the cause of bugs due to misunderstandings of their precedence\nrules.\nThis rule is disabled by default."
-    },
-    no_throwing_strings: {
-      level: ERROR,
-      message: 'Throwing strings is forbidden',
-      description: "This rule forbids throwing string literals or interpolations. While\nJavaScript (and CoffeeScript by extension) allow any expression to\nbe thrown, it is best to only throw <a\nhref=\"https://developer.mozilla.org\n/en/JavaScript/Reference/Global_Objects/Error\"> Error</a> objects,\nbecause they contain valuable debugging information like the stack\ntrace. Because of JavaScript's dynamic nature, CoffeeLint cannot\nensure you are always throwing instances of <tt>Error</tt>. It will\nonly catch the simple but real case of throwing literal strings.\n<pre>\n<code># CoffeeLint will catch this:\nthrow \"i made a boo boo\"\n\n# ... but not this:\nthrow getSomeString()\n</code>\n</pre>\nThis rule is enabled by default."
-    },
-    cyclomatic_complexity: {
-      value: 10,
-      level: IGNORE,
-      message: 'The cyclomatic complexity is too damn high'
-    },
-    no_backticks: {
-      level: ERROR,
-      message: 'Backticks are forbidden',
-      description: "Backticks allow snippets of JavaScript to be embedded in\nCoffeeScript. While some folks consider backticks useful in a few\nniche circumstances, they should be avoided because so none of\nJavaScript's \"bad parts\", like <tt>with</tt> and <tt>eval</tt>,\nsneak into CoffeeScript.\nThis rule is enabled by default."
-    },
-    line_endings: {
-      level: IGNORE,
-      value: 'unix',
-      message: 'Line contains incorrect line endings',
-      description: "This rule ensures your project uses only <tt>windows</tt> or\n<tt>unix</tt> line endings. This rule is disabled by default."
-    },
-    no_implicit_parens: {
-      level: IGNORE,
-      message: 'Implicit parens are forbidden',
-      description: "This rule prohibits implicit parens on function calls.\n<pre>\n<code># Some folks don't like this style of coding.\nmyFunction a, b, c\n\n# And would rather it always be written like this:\nmyFunction(a, b, c)\n</code>\n</pre>\nImplicit parens are permitted by default, since their use is\nidiomatic CoffeeScript."
-    },
-    empty_constructor_needs_parens: {
-      level: IGNORE,
-      message: 'Invoking a constructor without parens and without arguments'
-    },
-    non_empty_constructor_needs_parens: {
-      level: IGNORE,
-      message: 'Invoking a constructor without parens and with arguments'
-    },
-    no_empty_param_list: {
-      level: IGNORE,
-      message: 'Empty parameter list is forbidden',
-      description: "This rule prohibits empty parameter lists in function definitions.\n<pre>\n<code># The empty parameter list in here is unnecessary:\nmyFunction = () -&gt;\n\n# We might favor this instead:\nmyFunction = -&gt;\n</code>\n</pre>\nEmpty parameter lists are permitted by default."
-    },
-    space_operators: {
-      level: IGNORE,
-      message: 'Operators must be spaced properly'
-    },
-    duplicate_key: {
-      level: ERROR,
-      message: 'Duplicate key defined in object or class'
-    },
-    newlines_after_classes: {
-      value: 3,
-      level: IGNORE,
-      message: 'Wrong count of newlines between a class and other code'
-    },
-    no_stand_alone_at: {
-      level: IGNORE,
-      message: '@ must not be used stand alone',
-      description: "This rule checks that no stand alone @ are in use, they are\ndiscouraged. Further information in CoffeScript issue <a\nhref=\"https://github.com/jashkenas/coffee-script/issues/1601\">\n#1601</a>"
-    },
-    arrow_spacing: {
-      level: IGNORE,
-      message: 'Function arrow (->) must be spaced properly',
-      description: "<p>This rule checks to see that there is spacing before and after\nthe arrow operator that declares a function. This rule is disabled\nby default.</p> <p>Note that if arrow_spacing is enabled, and you\npass an empty function as a parameter, arrow_spacing will accept\neither a space or no space in-between the arrow operator and the\nparenthesis</p>\n<pre><code># Both of this will not trigger an error,\n# even with arrow_spacing enabled.\nx(-> 3)\nx( -> 3)\n\n# However, this will trigger an error\nx((a,b)-> 3)\n</code>\n</pre>"
-    },
-    coffeescript_error: {
-      level: ERROR,
-      message: ''
-    }
-  };
-
-  regexes = {
-    trailingWhitespace: /[^\s]+[\t ]+\r?$/,
-    lineHasComment: /^\s*[^\#]*\#/,
-    indentation: /\S/,
-    longUrlComment: /^\s*\#\s*http[^\s]+$/,
-    camelCase: /^[A-Z][a-zA-Z\d]*$/,
-    trailingSemicolon: /;\r?$/,
-    configStatement: /coffeelint:\s*(disable|enable)(?:=([\w\s,]*))?/
-  };
-
-  extend = function() {
-    var destination, k, source, sources, v, _i, _len;
-
-    destination = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
-    for (_i = 0, _len = sources.length; _i < _len; _i++) {
-      source = sources[_i];
-      for (k in source) {
-        v = source[k];
-        destination[k] = v;
-      }
-    }
-    return destination;
-  };
-
-  defaults = function(source, defaults) {
-    return extend({}, defaults, source);
-  };
-
-  createError = function(rule, attrs) {
-    var level;
-
+    block_config = {
+      enable: {},
+      disable: {}
+    };
+  }
+  errors.sort(function(a, b) {
+    return a.lineNumber - b.lineNumber;
+  });
+  all_errors = errors;
+  errors = [];
+  disabled = disabled_initially;
+  next_line = 0;
+  for (i = _k = 0, _ref3 = source.split('\n').length; 0 <= _ref3 ? _k < _ref3 : _k > _ref3; i = 0 <= _ref3 ? ++_k : --_k) {
+    for (cmd in block_config) {
+      rules = block_config[cmd][i];
+      if (rules != null) {
+        ({
+          'disable': function() {
+            return disabled = disabled.concat(rules);
+          },
+          'enable': function() {
+            difference(disabled, rules);
+            if (rules.length === 0) {
+              return disabled = disabled_initially;
+            }
+          }
+        })[cmd]();
+      }
+    }
+    while (next_line === i && all_errors.length > 0) {
+      next_line = all_errors[0].lineNumber - 1;
+      e = all_errors[0];
+      if (e.lineNumber === i + 1 || (e.lineNumber == null)) {
+        e = all_errors.shift();
+        if (_ref4 = e.rule, __indexOf.call(disabled, _ref4) < 0) {
+          errors.push(e);
+        }
+      }
+    }
+  }
+  return errors;
+};
+
+
+},{"./../package.json":1,"./ast_linter.coffee":2,"./lexical_linter.coffee":5,"./line_linter.coffee":6,"./rules.coffee":7,"./rules/arrow_spacing.coffee":8,"./rules/camel_case_classes.coffee":9,"./rules/colon_assignment_spacing.coffee":10,"./rules/cyclomatic_complexity.coffee":11,"./rules/duplicate_key.coffee":12,"./rules/empty_constructor_needs_parens.coffee":13,"./rules/indentation.coffee":14,"./rules/line_endings.coffee":15,"./rules/max_line_length.coffee":16,"./rules/missing_fat_arrows.coffee":17,"./rules/newlines_after_classes.coffee":18,"./rules/no_backticks.coffee":19,"./rules/no_empty_param_list.coffee":20,"./rules/no_implicit_braces.coffee":21,"./rules/no_implicit_parens.coffee":22,"./rules/no_plusplus.coffee":23,"./rules/no_stand_alone_at.coffee":24,"./rules/no_tabs.coffee":25,"./rules/no_throwing_strings.coffee":26,"./rules/no_trailing_semicolons.coffee":27,"./rules/no_trailing_whitespace.coffee":28,"./rules/no_unnecessary_fat_arrows.coffee":29,"./rules/non_empty_constructor_needs_parens.coffee":30,"./rules/space_operators.coffee":31}],5:[function(_dereq_,module,exports){
+var BaseLinter, LexicalLinter, TokenApi,
+  __hasProp = {}.hasOwnProperty,
+  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
+  __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
+
+TokenApi = (function() {
+  function TokenApi(CoffeeScript, source, config, tokensByLine) {
+    this.config = config;
+    this.tokensByLine = tokensByLine;
+    this.tokens = CoffeeScript.tokens(source);
+    this.lines = source.split('\n');
+    this.tokensByLine = {};
+  }
+
+  TokenApi.prototype.i = 0;
+
+  TokenApi.prototype.peek = function(n) {
+    if (n == null) {
+      n = 1;
+    }
+    return this.tokens[this.i + n] || null;
+  };
+
+  return TokenApi;
+
+})();
+
+BaseLinter = _dereq_('./base_linter.coffee');
+
+module.exports = LexicalLinter = (function(_super) {
+  __extends(LexicalLinter, _super);
+
+  function LexicalLinter(source, config, rules, CoffeeScript) {
+    LexicalLinter.__super__.constructor.call(this, source, config, rules);
+    this.tokenApi = new TokenApi(CoffeeScript, source, this.config, this.tokensByLine);
+    this.tokensByLine = this.tokenApi.tokensByLine;
+  }
+
+  LexicalLinter.prototype.acceptRule = function(rule) {
+    return typeof rule.lintToken === 'function';
+  };
+
+  LexicalLinter.prototype.lint = function() {
+    var error, errors, i, token, _i, _j, _len, _len1, _ref, _ref1;
+    errors = [];
+    _ref = this.tokenApi.tokens;
+    for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
+      token = _ref[i];
+      this.tokenApi.i = i;
+      _ref1 = this.lintToken(token);
+      for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
+        error = _ref1[_j];
+        errors.push(error);
+      }
+    }
+    return errors;
+  };
+
+  LexicalLinter.prototype.lintToken = function(token) {
+    var errors, lineNumber, rule, type, v, value, _base, _i, _len, _ref, _ref1;
+    type = token[0], value = token[1], lineNumber = token[2];
+    if (typeof lineNumber === "object") {
+      if (type === 'OUTDENT' || type === 'INDENT') {
+        lineNumber = lineNumber.last_line;
+      } else {
+        lineNumber = lineNumber.first_line;
+      }
+    }
+    if ((_base = this.tokensByLine)[lineNumber] == null) {
+      _base[lineNumber] = [];
+    }
+    this.tokensByLine[lineNumber].push(token);
+    this.lineNumber = lineNumber || this.lineNumber || 0;
+    this.tokenApi.lineNumber = this.lineNumber;
+    errors = [];
+    _ref = this.rules;
+    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+      rule = _ref[_i];
+      if (!(_ref1 = token[0], __indexOf.call(rule.tokens, _ref1) >= 0)) {
+        continue;
+      }
+      v = this.normalizeResult(rule, rule.lintToken(token, this.tokenApi));
+      if (v != null) {
+        errors.push(v);
+      }
+    }
+    return errors;
+  };
+
+  LexicalLinter.prototype.createError = function(ruleName, attrs) {
     if (attrs == null) {
       attrs = {};
     }
-    level = attrs.level;
-    if (level !== IGNORE && level !== WARN && level !== ERROR) {
-      throw new Error("unknown level " + level);
-    }
-    if (level === ERROR || level === WARN) {
-      attrs.rule = rule;
-      return defaults(attrs, RULES[rule]);
+    attrs.lineNumber = this.lineNumber + 1;
+    attrs.line = this.tokenApi.lines[this.lineNumber];
+    return LexicalLinter.__super__.createError.call(this, ruleName, attrs);
+  };
+
+  return LexicalLinter;
+
+})(BaseLinter);
+
+
+},{"./base_linter.coffee":3}],6:[function(_dereq_,module,exports){
+var BaseLinter, LineApi, LineLinter, configStatement,
+  __hasProp = {}.hasOwnProperty,
+  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
+
+LineApi = (function() {
+  function LineApi(source, config, tokensByLine, literate) {
+    this.config = config;
+    this.tokensByLine = tokensByLine;
+    this.literate = literate;
+    this.line = null;
+    this.lines = source.split('\n');
+    this.lineCount = this.lines.length;
+    this.context = {
+      "class": {
+        inClass: false,
+        lastUnemptyLineInClass: null,
+        classIndents: null
+      }
+    };
+  }
+
+  LineApi.prototype.lineNumber = 0;
+
+  LineApi.prototype.isLiterate = function() {
+    return this.literate;
+  };
+
+  LineApi.prototype.maintainClassContext = function(line) {
+    if (this.context["class"].inClass) {
+      if (this.lineHasToken('INDENT')) {
+        this.context["class"].classIndents++;
+      } else if (this.lineHasToken('OUTDENT')) {
+        this.context["class"].classIndents--;
+        if (this.context["class"].classIndents === 0) {
+          this.context["class"].inClass = false;
+          this.context["class"].classIndents = null;
+        }
+      }
+      if (this.context["class"].inClass && !line.match(/^\s*$/)) {
+        this.context["class"].lastUnemptyLineInClass = this.lineNumber;
+      }
+    } else {
+      if (!line.match(/\\s*/)) {
+        this.context["class"].lastUnemptyLineInClass = null;
+      }
+      if (this.lineHasToken('CLASS')) {
+        this.context["class"].inClass = true;
+        this.context["class"].lastUnemptyLineInClass = this.lineNumber;
+        this.context["class"].classIndents = 0;
+      }
+    }
+    return null;
+  };
+
+  LineApi.prototype.isLastLine = function() {
+    return this.lineNumber === this.lineCount - 1;
+  };
+
+  LineApi.prototype.lineHasToken = function(tokenType, lineNumber) {
+    var token, tokens, _i, _len;
+    if (tokenType == null) {
+      tokenType = null;
+    }
+    if (lineNumber == null) {
+      lineNumber = null;
+    }
+    lineNumber = lineNumber != null ? lineNumber : this.lineNumber;
+    if (tokenType == null) {
+      return this.tokensByLine[lineNumber] != null;
+    } else {
+      tokens = this.tokensByLine[lineNumber];
+      if (tokens == null) {
+        return null;
+      }
+      for (_i = 0, _len = tokens.length; _i < _len; _i++) {
+        token = tokens[_i];
+        if (token[0] === tokenType) {
+          return true;
+        }
+      }
+      return false;
+    }
+  };
+
+  LineApi.prototype.getLineTokens = function() {
+    return this.tokensByLine[this.lineNumber] || [];
+  };
+
+  return LineApi;
+
+})();
+
+BaseLinter = _dereq_('./base_linter.coffee');
+
+configStatement = /coffeelint:\s*(disable|enable)(?:=([\w\s,]*))?/;
+
+module.exports = LineLinter = (function(_super) {
+  __extends(LineLinter, _super);
+
+  LineLinter.configStatement = configStatement;
+
+  function LineLinter(source, config, rules, tokensByLine, literate) {
+    if (literate == null) {
+      literate = false;
+    }
+    LineLinter.__super__.constructor.call(this, source, config, rules);
+    this.lineApi = new LineApi(source, config, tokensByLine, literate);
+    this.block_config = {
+      enable: {},
+      disable: {}
+    };
+  }
+
+  LineLinter.prototype.acceptRule = function(rule) {
+    return typeof rule.lintLine === 'function';
+  };
+
+  LineLinter.prototype.lint = function() {
+    var error, errors, line, lineNumber, _i, _j, _len, _len1, _ref, _ref1;
+    errors = [];
+    _ref = this.lineApi.lines;
+    for (lineNumber = _i = 0, _len = _ref.length; _i < _len; lineNumber = ++_i) {
+      line = _ref[lineNumber];
+      this.lineApi.lineNumber = this.lineNumber = lineNumber;
+      this.lineApi.maintainClassContext(line);
+      this.collectInlineConfig(line);
+      _ref1 = this.lintLine(line);
+      for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
+        error = _ref1[_j];
+        errors.push(error);
+      }
+    }
+    return errors;
+  };
+
+  LineLinter.prototype.lintLine = function(line) {
+    var errors, rule, v, _i, _len, _ref;
+    errors = [];
+    _ref = this.rules;
+    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+      rule = _ref[_i];
+      v = this.normalizeResult(rule, rule.lintLine(line, this.lineApi));
+      if (v != null) {
+        errors.push(v);
+      }
+    }
+    return errors;
+  };
+
+  LineLinter.prototype.collectInlineConfig = function(line) {
+    var cmd, r, result, rules, _i, _len, _ref;
+    result = configStatement.exec(line);
+    if (result != null) {
+      cmd = result[1];
+      rules = [];
+      if (result[2] != null) {
+        _ref = result[2].split(',');
+        for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+          r = _ref[_i];
+          rules.push(r.replace(/^\s+|\s+$/g, ""));
+        }
+      }
+      this.block_config[cmd][this.lineNumber] = rules;
+    }
+    return null;
+  };
+
+  LineLinter.prototype.createError = function(rule, attrs) {
+    var _ref;
+    if (attrs == null) {
+      attrs = {};
+    }
+    attrs.lineNumber = this.lineNumber + 1;
+    attrs.level = (_ref = this.config[rule]) != null ? _ref.level : void 0;
+    return LineLinter.__super__.createError.call(this, rule, attrs);
+  };
+
+  return LineLinter;
+
+})(BaseLinter);
+
+
+},{"./base_linter.coffee":3}],7:[function(_dereq_,module,exports){
+var ERROR, IGNORE, WARN;
+
+ERROR = 'error';
+
+WARN = 'warn';
+
+IGNORE = 'ignore';
+
+module.exports = {
+  coffeescript_error: {
+    level: ERROR,
+    message: ''
+  }
+};
+
+
+},{}],8:[function(_dereq_,module,exports){
+var ArrowSpacing;
+
+module.exports = ArrowSpacing = (function() {
+  function ArrowSpacing() {}
+
+  ArrowSpacing.prototype.rule = {
+    name: 'arrow_spacing',
+    level: 'ignore',
+    message: 'Function arrow (->) must be spaced properly',
+    description: "<p>This rule checks to see that there is spacing before and after\nthe arrow operator that declares a function. This rule is disabled\nby default.</p> <p>Note that if arrow_spacing is enabled, and you\npass an empty function as a parameter, arrow_spacing will accept\neither a space or no space in-between the arrow operator and the\nparenthesis</p>\n<pre><code># Both of this will not trigger an error,\n# even with arrow_spacing enabled.\nx(-> 3)\nx( -> 3)\n\n# However, this will trigger an error\nx((a,b)-> 3)\n</code>\n</pre>"
+  };
+
+  ArrowSpacing.prototype.tokens = ['->'];
+
+  ArrowSpacing.prototype.lintToken = function(token, tokenApi) {
+    var pp;
+    pp = tokenApi.peek(-1);
+    if (!(((token.spaced != null) || (token.newLine != null) || this.atEof(tokenApi)) && (((pp.spaced != null) || pp[0] === 'TERMINATOR') || (pp.generated != null) || pp[0] === "INDENT" || (pp[1] === "(" && (pp.generated == null))))) {
+      return true;
     } else {
       return null;
@@ -189,943 +840,1188 @@
   };
 
-  block_config = {
-    enable: {},
-    disable: {}
-  };
-
-  LineLinter = (function() {
-    function LineLinter(source, config, tokensByLine) {
-      this.source = source;
-      this.config = config;
-      this.line = null;
-      this.lineNumber = 0;
-      this.tokensByLine = tokensByLine;
-      this.lines = this.source.split('\n');
-      this.lineCount = this.lines.length;
-      this.context = {
-        "class": {
-          inClass: false,
-          lastUnemptyLineInClass: null,
-          classIndents: null
-        }
+  ArrowSpacing.prototype.atEof = function(tokenApi) {
+    var i, token, tokens, _i, _len, _ref, _ref1;
+    tokens = tokenApi.tokens, i = tokenApi.i;
+    _ref = tokens.slice(i + 1);
+    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+      token = _ref[_i];
+      if (!(token.generated || ((_ref1 = token[0]) === 'OUTDENT' || _ref1 === 'TERMINATOR'))) {
+        return false;
+      }
+    }
+    return true;
+  };
+
+  return ArrowSpacing;
+
+})();
+
+
+},{}],9:[function(_dereq_,module,exports){
+var CamelCaseClasses, regexes;
+
+regexes = {
+  camelCase: /^[A-Z][a-zA-Z\d]*$/
+};
+
+module.exports = CamelCaseClasses = (function() {
+  function CamelCaseClasses() {}
+
+  CamelCaseClasses.prototype.rule = {
+    name: 'camel_case_classes',
+    level: 'error',
+    message: 'Class names should be camel cased',
+    description: "This rule mandates that all class names are CamelCased. Camel\ncasing class names is a generally accepted way of distinguishing\nconstructor functions - which require the 'new' prefix to behave\nproperly - from plain old functions.\n<pre>\n<code># Good!\nclass BoaConstrictor\n\n# Bad!\nclass boaConstrictor\n</code>\n</pre>\nThis rule is enabled by default."
+  };
+
+  CamelCaseClasses.prototype.tokens = ['CLASS'];
+
+  CamelCaseClasses.prototype.lintToken = function(token, tokenApi) {
+    var className, offset, _ref, _ref1, _ref2;
+    if ((token.newLine != null) || ((_ref = tokenApi.peek()[0]) === 'INDENT' || _ref === 'EXTENDS')) {
+      return null;
+    }
+    className = null;
+    offset = 1;
+    while (!className) {
+      if (((_ref1 = tokenApi.peek(offset + 1)) != null ? _ref1[0] : void 0) === '.') {
+        offset += 2;
+      } else if (((_ref2 = tokenApi.peek(offset)) != null ? _ref2[0] : void 0) === '@') {
+        offset += 1;
+      } else {
+        className = tokenApi.peek(offset)[1];
+      }
+    }
+    if (!regexes.camelCase.test(className)) {
+      return {
+        context: "class name: " + className
       };
     }
-
-    LineLinter.prototype.lint = function() {
-      var error, errors, line, lineNumber, _i, _len, _ref;
-
-      errors = [];
-      _ref = this.lines;
-      for (lineNumber = _i = 0, _len = _ref.length; _i < _len; lineNumber = ++_i) {
-        line = _ref[lineNumber];
-        this.lineNumber = lineNumber;
-        this.line = line;
-        this.maintainClassContext();
-        error = this.lintLine();
-        if (error) {
-          errors.push(error);
-        }
-      }
-      return errors;
+  };
+
+  return CamelCaseClasses;
+
+})();
+
+
+},{}],10:[function(_dereq_,module,exports){
+var ColonAssignmentSpacing;
+
+module.exports = ColonAssignmentSpacing = (function() {
+  function ColonAssignmentSpacing() {}
+
+  ColonAssignmentSpacing.prototype.rule = {
+    name: 'colon_assignment_spacing',
+    level: 'ignore',
+    message: 'Colon assignment without proper spacing',
+    spacing: {
+      left: 0,
+      right: 0
+    },
+    description: "<p>This rule checks to see that there is spacing before and\nafter the colon in a colon assignment (i.e., classes, objects).\nThe spacing amount is specified by\nspacing.left and spacing.right, respectively.\nA zero value means no spacing required.\n</p>\n<pre><code>\n#\n# If spacing.left and spacing.right is 1\n#\n\n# Good\nobject = {spacing : true}\nclass Dog\n  canBark : true\n\n# Bad\nobject = {spacing: true}\nclass Cat\n  canBark: false\n</code></pre>"
+  };
+
+  ColonAssignmentSpacing.prototype.tokens = [':'];
+
+  ColonAssignmentSpacing.prototype.lintToken = function(token, tokenApi) {
+    var checkSpacing, getSpaceFromToken, isLeftSpaced, isRightSpaced, leftSpacing, nextToken, previousToken, rightSpacing, spacingAllowances, _ref, _ref1;
+    spacingAllowances = tokenApi.config[this.rule.name].spacing;
+    previousToken = tokenApi.peek(-1);
+    nextToken = tokenApi.peek(1);
+    getSpaceFromToken = function(direction) {
+      switch (direction) {
+        case 'left':
+          return token[2].first_column - previousToken[2].last_column - 1;
+        case 'right':
+          return nextToken[2].first_column - token[2].first_column - 1;
+      }
     };
-
-    LineLinter.prototype.lintLine = function() {
-      return this.checkTabs() || this.checkTrailingWhitespace() || this.checkLineLength() || this.checkTrailingSemicolon() || this.checkLineEndings() || this.checkComments() || this.checkNewlinesAfterClasses();
+    checkSpacing = function(direction) {
+      var isSpaced, spacing;
+      spacing = getSpaceFromToken(direction);
+      isSpaced = spacing < 0 ? true : spacing === parseInt(spacingAllowances[direction]);
+      return [isSpaced, spacing];
     };
-
-    LineLinter.prototype.checkTabs = function() {
-      var indentation;
-
-      indentation = this.line.split(regexes.indentation)[0];
-      if (this.lineHasToken() && __indexOf.call(indentation, '\t') >= 0) {
-        return this.createLineError('no_tabs');
-      } else {
-        return null;
-      }
-    };
-
-    LineLinter.prototype.checkTrailingWhitespace = function() {
-      var line, str, token, tokens, _i, _len, _ref, _ref1;
-
-      if (regexes.trailingWhitespace.test(this.line)) {
-        if (!((_ref = this.config['no_trailing_whitespace']) != null ? _ref.allowed_in_comments : void 0)) {
-          return this.createLineError('no_trailing_whitespace');
-        }
-        line = this.line;
-        tokens = this.tokensByLine[this.lineNumber];
-        if (!tokens) {
-          return null;
-        }
-        _ref1 = (function() {
-          var _j, _len, _results;
-
-          _results = [];
-          for (_j = 0, _len = tokens.length; _j < _len; _j++) {
-            token = tokens[_j];
-            if (token[0] === 'STRING') {
-              _results.push(token[1]);
-            }
-          }
-          return _results;
-        })();
-        for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
-          str = _ref1[_i];
-          line = line.replace(str, 'STRING');
-        }
-        if (!regexes.lineHasComment.test(line)) {
-          return this.createLineError('no_trailing_whitespace');
-        } else {
-          return null;
-        }
-      } else {
-        return null;
-      }
-    };
-
-    LineLinter.prototype.checkLineLength = function() {
-      var attrs, max, rule, _ref;
-
-      rule = 'max_line_length';
-      max = (_ref = this.config[rule]) != null ? _ref.value : void 0;
-      if (max && max < this.line.length && !regexes.longUrlComment.test(this.line)) {
-        attrs = {
-          context: "Length is " + this.line.length + ", max is " + max
-        };
-        return this.createLineError(rule, attrs);
-      } else {
-        return null;
-      }
-    };
-
-    LineLinter.prototype.checkTrailingSemicolon = function() {
-      var first, hasNewLine, hasSemicolon, last, _i, _ref;
-
-      hasSemicolon = regexes.trailingSemicolon.test(this.line);
-      _ref = this.getLineTokens(), first = 2 <= _ref.length ? __slice.call(_ref, 0, _i = _ref.length - 1) : (_i = 0, []), last = _ref[_i++];
-      hasNewLine = last && (last.newLine != null);
-      if (hasSemicolon && !hasNewLine && this.lineHasToken()) {
-        return this.createLineError('no_trailing_semicolons');
-      } else {
-        return null;
-      }
-    };
-
-    LineLinter.prototype.checkLineEndings = function() {
-      var ending, lastChar, rule, valid, _ref;
-
-      rule = 'line_endings';
-      ending = (_ref = this.config[rule]) != null ? _ref.value : void 0;
-      if (!ending || this.isLastLine() || !this.line) {
-        return null;
-      }
-      lastChar = this.line[this.line.length - 1];
-      valid = (function() {
-        if (ending === 'windows') {
-          return lastChar === '\r';
-        } else if (ending === 'unix') {
-          return lastChar !== '\r';
-        } else {
-          throw new Error("unknown line ending type: " + ending);
-        }
-      })();
-      if (!valid) {
-        return this.createLineError(rule, {
-          context: "Expected " + ending
-        });
-      } else {
-        return null;
-      }
-    };
-
-    LineLinter.prototype.checkComments = function() {
-      var cmd, r, result, rules, _i, _len, _ref;
-
-      result = regexes.configStatement.exec(this.line);
-      if (result != null) {
-        cmd = result[1];
-        rules = [];
-        if (result[2] != null) {
-          _ref = result[2].split(',');
-          for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-            r = _ref[_i];
-            rules.push(r.replace(/^\s+|\s+$/g, ""));
-          }
-        }
-        block_config[cmd][this.lineNumber] = rules;
-      }
+    _ref = checkSpacing('left'), isLeftSpaced = _ref[0], leftSpacing = _ref[1];
+    _ref1 = checkSpacing('right'), isRightSpaced = _ref1[0], rightSpacing = _ref1[1];
+    if (isLeftSpaced && isRightSpaced) {
       return null;
-    };
-
-    LineLinter.prototype.checkNewlinesAfterClasses = function() {
-      var ending, got, rule;
-
-      rule = 'newlines_after_classes';
-      ending = this.config[rule].value;
-      if (!ending || this.isLastLine()) {
-        return null;
-      }
-      if (!this.context["class"].inClass && (this.context["class"].lastUnemptyLineInClass != null) && ((this.lineNumber - 1) - this.context["class"].lastUnemptyLineInClass) !== ending) {
-        got = (this.lineNumber - 1) - this.context["class"].lastUnemptyLineInClass;
-        return this.createLineError(rule, {
-          context: "Expected " + ending + " got " + got
-        });
-      }
-      return null;
-    };
-
-    LineLinter.prototype.createLineError = function(rule, attrs) {
-      var _ref;
-
-      if (attrs == null) {
-        attrs = {};
-      }
-      attrs.lineNumber = this.lineNumber + 1;
-      attrs.level = (_ref = this.config[rule]) != null ? _ref.level : void 0;
-      return createError(rule, attrs);
-    };
-
-    LineLinter.prototype.isLastLine = function() {
-      return this.lineNumber === this.lineCount - 1;
-    };
-
-    LineLinter.prototype.lineHasToken = function(tokenType, lineNumber) {
-      var token, tokens, _i, _len;
-
-      if (tokenType == null) {
-        tokenType = null;
-      }
-      if (lineNumber == null) {
-        lineNumber = null;
-      }
-      lineNumber = lineNumber != null ? lineNumber : this.lineNumber;
-      if (tokenType == null) {
-        return this.tokensByLine[lineNumber] != null;
-      } else {
-        tokens = this.tokensByLine[lineNumber];
-        if (tokens == null) {
-          return null;
-        }
-        for (_i = 0, _len = tokens.length; _i < _len; _i++) {
-          token = tokens[_i];
-          if (token[0] === tokenType) {
-            return true;
-          }
-        }
-        return false;
-      }
-    };
-
-    LineLinter.prototype.getLineTokens = function() {
-      return this.tokensByLine[this.lineNumber] || [];
-    };
-
-    LineLinter.prototype.maintainClassContext = function() {
-      if (this.context["class"].inClass) {
-        if (this.lineHasToken('INDENT')) {
-          this.context["class"].classIndents++;
-        } else if (this.lineHasToken('OUTDENT')) {
-          this.context["class"].classIndents--;
-          if (this.context["class"].classIndents === 0) {
-            this.context["class"].inClass = false;
-            this.context["class"].classIndents = null;
-          }
-        }
-        if (this.context["class"].inClass && !this.line.match(/^\s*$/)) {
-          this.context["class"].lastUnemptyLineInClass = this.lineNumber;
-        }
-      } else {
-        if (!this.line.match(/\\s*/)) {
-          this.context["class"].lastUnemptyLineInClass = null;
-        }
-        if (this.lineHasToken('CLASS')) {
-          this.context["class"].inClass = true;
-          this.context["class"].lastUnemptyLineInClass = this.lineNumber;
-          this.context["class"].classIndents = 0;
-        }
-      }
-      return null;
-    };
-
-    return LineLinter;
-
-  })();
-
-  LexicalLinter = (function() {
-    function LexicalLinter(source, config) {
-      this.source = source;
-      this.tokens = CoffeeScript.tokens(source);
-      this.config = config;
-      this.i = 0;
-      this.tokensByLine = {};
-      this.arrayTokens = [];
-      this.parenTokens = [];
-      this.callTokens = [];
-      this.lines = source.split('\n');
-      this.braceScopes = [];
-    }
-
-    LexicalLinter.prototype.lint = function() {
-      var error, errors, i, token, _i, _len, _ref;
-
-      errors = [];
-      _ref = this.tokens;
-      for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
-        token = _ref[i];
-        this.i = i;
-        error = this.lintToken(token);
-        if (error) {
-          errors.push(error);
-        }
-      }
-      return errors;
-    };
-
-    LexicalLinter.prototype.lintToken = function(token) {
-      var lineNumber, type, value, _base, _ref;
-
-      type = token[0], value = token[1], lineNumber = token[2];
-      if (typeof lineNumber === "object") {
-        if (type === 'OUTDENT' || type === 'INDENT') {
-          lineNumber = lineNumber.last_line;
-        } else {
-          lineNumber = lineNumber.first_line;
-        }
-      }
-      if ((_ref = (_base = this.tokensByLine)[lineNumber]) == null) {
-        _base[lineNumber] = [];
-      }
-      this.tokensByLine[lineNumber].push(token);
-      this.lineNumber = lineNumber || this.lineNumber || 0;
-      switch (type) {
-        case "->":
-          return this.lintArrowSpacing(token);
-        case "INDENT":
-          return this.lintIndentation(token);
-        case "CLASS":
-          return this.lintClass(token);
-        case "UNARY":
-          return this.lintUnary(token);
-        case "{":
-        case "}":
-          return this.lintBrace(token);
-        case "IDENTIFIER":
-          return this.lintIdentifier(token);
-        case "++":
-        case "--":
-          return this.lintIncrement(token);
-        case "THROW":
-          return this.lintThrow(token);
-        case "[":
-        case "]":
-          return this.lintArray(token);
-        case "(":
-        case ")":
-          return this.lintParens(token);
-        case "JS":
-          return this.lintJavascript(token);
-        case "CALL_START":
-        case "CALL_END":
-          return this.lintCall(token);
-        case "PARAM_START":
-          return this.lintParam(token);
-        case "@":
-          return this.lintStandaloneAt(token);
-        case "+":
-        case "-":
-          return this.lintPlus(token);
-        case "=":
-        case "MATH":
-        case "COMPARE":
-        case "LOGIC":
-        case "COMPOUND_ASSIGN":
-          return this.lintMath(token);
-        default:
-          return null;
-      }
-    };
-
-    LexicalLinter.prototype.lintUnary = function(token) {
-      var expectedCallStart, expectedIdentifier, identifierIndex;
-
-      if (token[1] === 'new') {
-        identifierIndex = 1;
-        while (true) {
-          expectedIdentifier = this.peek(identifierIndex);
-          expectedCallStart = this.peek(identifierIndex + 1);
-          if ((expectedIdentifier != null ? expectedIdentifier[0] : void 0) === 'IDENTIFIER') {
-            if ((expectedCallStart != null ? expectedCallStart[0] : void 0) === '.') {
-              identifierIndex += 2;
-              continue;
-            }
-          }
-          break;
-        }
-        if ((expectedIdentifier != null ? expectedIdentifier[0] : void 0) === 'IDENTIFIER' && (expectedCallStart != null)) {
-          if (expectedCallStart[0] === 'CALL_START') {
-            if (expectedCallStart.generated) {
-              return this.createLexError('non_empty_constructor_needs_parens');
-            }
-          } else {
-            return this.createLexError('empty_constructor_needs_parens');
-          }
-        }
-      }
-    };
-
-    LexicalLinter.prototype.lintArray = function(token) {
-      if (token[0] === '[') {
-        this.arrayTokens.push(token);
-      } else if (token[0] === ']') {
-        this.arrayTokens.pop();
-      }
-      return null;
-    };
-
-    LexicalLinter.prototype.lintParens = function(token) {
-      var i, n1, n2, p1;
-
-      if (token[0] === '(') {
-        p1 = this.peek(-1);
-        n1 = this.peek(1);
-        n2 = this.peek(2);
-        i = n1 && n2 && n1[0] === 'STRING' && n2[0] === '+';
-        token.isInterpolation = i;
-        this.parenTokens.push(token);
-      } else {
-        this.parenTokens.pop();
-      }
-      return null;
-    };
-
-    LexicalLinter.prototype.isInInterpolation = function() {
-      var t, _i, _len, _ref;
-
-      _ref = this.parenTokens;
-      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-        t = _ref[_i];
-        if (t.isInterpolation) {
-          return true;
-        }
-      }
-      return false;
-    };
-
-    LexicalLinter.prototype.isInExtendedRegex = function() {
-      var t, _i, _len, _ref;
-
-      _ref = this.callTokens;
-      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-        t = _ref[_i];
-        if (t.isRegex) {
-          return true;
-        }
-      }
-      return false;
-    };
-
-    LexicalLinter.prototype.lintPlus = function(token) {
-      var isUnary, p, unaries, _ref;
-
-      if (this.isInInterpolation() || this.isInExtendedRegex()) {
-        return null;
-      }
-      p = this.peek(-1);
-      unaries = ['TERMINATOR', '(', '=', '-', '+', ',', 'CALL_START', 'INDEX_START', '..', '...', 'COMPARE', 'IF', 'THROW', 'LOGIC', 'POST_IF', ':', '[', 'INDENT', 'COMPOUND_ASSIGN', 'RETURN', 'MATH'];
-      isUnary = !p ? false : (_ref = p[0], __indexOf.call(unaries, _ref) >= 0);
-      if ((isUnary && token.spaced) || (!isUnary && !token.spaced && !token.newLine)) {
-        return this.createLexError('space_operators', {
-          context: token[1]
-        });
-      } else {
-        return null;
-      }
-    };
-
-    LexicalLinter.prototype.lintMath = function(token) {
-      if (!token.spaced && !token.newLine) {
-        return this.createLexError('space_operators', {
-          context: token[1]
-        });
-      } else {
-        return null;
-      }
-    };
-
-    LexicalLinter.prototype.lintCall = function(token) {
-      var p;
-
-      if (token[0] === 'CALL_START') {
-        p = this.peek(-1);
-        token.isRegex = p && p[0] === 'IDENTIFIER' && p[1] === 'RegExp';
-        this.callTokens.push(token);
-        if (token.generated) {
-          return this.createLexError('no_implicit_parens');
-        } else {
-          return null;
-        }
-      } else {
-        this.callTokens.pop();
-        return null;
-      }
-    };
-
-    LexicalLinter.prototype.lintParam = function(token) {
-      var nextType;
-
-      nextType = this.peek()[0];
-      if (nextType === 'PARAM_END') {
-        return this.createLexError('no_empty_param_list');
-      } else {
-        return null;
-      }
-    };
-
-    LexicalLinter.prototype.lintIdentifier = function(token) {
-      var key, nextToken, previousToken;
-
-      key = token[1];
-      if (this.currentScope == null) {
-        return null;
-      }
-      nextToken = this.peek(1);
-      if (nextToken[1] !== ':') {
-        return null;
-      }
-      previousToken = this.peek(-1);
-      if (previousToken[0] === '@') {
-        key = "@" + key;
-      }
-      key = "identifier-" + key;
-      if (this.currentScope[key]) {
-        return this.createLexError('duplicate_key');
-      } else {
-        this.currentScope[key] = token;
-        return null;
-      }
-    };
-
-    LexicalLinter.prototype.lintBrace = function(token) {
-      var i, t;
-
-      if (token[0] === '{') {
-        if (this.currentScope != null) {
-          this.braceScopes.push(this.currentScope);
-        }
-        this.currentScope = {};
-      } else {
-        this.currentScope = this.braceScopes.pop();
-      }
-      if (token.generated && token[0] === '{') {
-        i = -1;
-        while (true) {
-          t = this.peek(i);
-          if ((t == null) || t[0] === 'TERMINATOR') {
-            return this.createLexError('no_implicit_braces');
-          }
-          if (t[0] === 'CLASS') {
-            return null;
-          }
-          i -= 1;
-        }
-      } else {
-        return null;
-      }
-    };
-
-    LexicalLinter.prototype.lintJavascript = function(token) {
-      return this.createLexError('no_backticks');
-    };
-
-    LexicalLinter.prototype.lintThrow = function(token) {
-      var n1, n2, nextIsString, _ref;
-
-      _ref = [this.peek(), this.peek(2)], n1 = _ref[0], n2 = _ref[1];
-      nextIsString = n1[0] === 'STRING' || (n1[0] === '(' && n2[0] === 'STRING');
-      if (nextIsString) {
-        return this.createLexError('no_throwing_strings');
-      }
-    };
-
-    LexicalLinter.prototype.lintIncrement = function(token) {
-      var attrs;
-
-      attrs = {
-        context: "found '" + token[0] + "'"
+    } else {
+      return {
+        context: "Incorrect spacing around column " + token[2].first_column + ".\nExpected left: " + spacingAllowances.left + ", right: " + spacingAllowances.right + ".\nGot left: " + leftSpacing + ", right: " + rightSpacing + "."
       };
-      return this.createLexError('no_plusplus', attrs);
-    };
-
-    LexicalLinter.prototype.lintStandaloneAt = function(token) {
-      var isDot, isIdentifier, isIndexStart, isValidProtoProperty, nextToken, protoProperty, spaced;
-
-      nextToken = this.peek();
-      spaced = token.spaced;
-      isIdentifier = nextToken[0] === 'IDENTIFIER';
-      isIndexStart = nextToken[0] === 'INDEX_START';
-      isDot = nextToken[0] === '.';
-      if (nextToken[0] === '::') {
-        protoProperty = this.peek(2);
-        isValidProtoProperty = protoProperty[0] === 'IDENTIFIER';
-      }
-      if (spaced || (!isIdentifier && !isIndexStart && !isDot && !isValidProtoProperty)) {
-        return this.createLexError('no_stand_alone_at');
-      }
-    };
-
-    LexicalLinter.prototype.lintIndentation = function(token) {
-      var context, currentLine, expected, ignoreIndent, isArrayIndent, isInterpIndent, isMultiline, lineNumber, numIndents, prevNum, previous, previousIndentation, previousLine, previousSymbol, type, _ref;
-
-      type = token[0], numIndents = token[1], lineNumber = token[2];
-      if (token.generated != null) {
-        return null;
-      }
-      previous = this.peek(-2);
-      isInterpIndent = previous && previous[0] === '+';
-      previous = this.peek(-1);
-      isArrayIndent = this.inArray() && (previous != null ? previous.newLine : void 0);
-      previousSymbol = (_ref = this.peek(-1)) != null ? _ref[0] : void 0;
-      isMultiline = previousSymbol === '=' || previousSymbol === ',';
-      ignoreIndent = isInterpIndent || isArrayIndent || isMultiline;
-      if (this.isChainedCall()) {
-        currentLine = this.lines[this.lineNumber];
-        prevNum = 1;
-        while (/^\s*(#|$)/.test(this.lines[this.lineNumber - prevNum])) {
-          prevNum += 1;
-        }
-        previousLine = this.lines[this.lineNumber - prevNum];
-        previousIndentation = previousLine.match(/^(\s*)/)[1].length;
-        numIndents = currentLine.match(/^(\s*)/)[1].length;
-        numIndents -= previousIndentation;
-      }
-      expected = this.config['indentation'].value;
-      if (!ignoreIndent && numIndents !== expected) {
-        context = ("Expected " + expected + " ") + ("got " + numIndents);
-        return this.createLexError('indentation', {
-          context: context
-        });
-      } else {
-        return null;
-      }
-    };
-
-    LexicalLinter.prototype.lintClass = function(token) {
-      var attrs, className, offset, _ref, _ref1, _ref2;
-
-      if ((token.newLine != null) || ((_ref = this.peek()[0]) === 'INDENT' || _ref === 'EXTENDS')) {
-        return null;
-      }
-      className = null;
-      offset = 1;
-      while (!className) {
-        if (((_ref1 = this.peek(offset + 1)) != null ? _ref1[0] : void 0) === '.') {
-          offset += 2;
-        } else if (((_ref2 = this.peek(offset)) != null ? _ref2[0] : void 0) === '@') {
-          offset += 1;
-        } else {
-          className = this.peek(offset)[1];
-        }
-      }
-      if (!regexes.camelCase.test(className)) {
-        attrs = {
-          context: "class name: " + className
-        };
-        return this.createLexError('camel_case_classes', attrs);
-      } else {
-        return null;
-      }
-    };
-
-    LexicalLinter.prototype.lintArrowSpacing = function(token) {
-      var pp;
-
-      pp = this.peek(-1);
-      if (!(((token.spaced != null) || (token.newLine != null) || this.atEof()) && (((pp.spaced != null) || pp[0] === 'TERMINATOR') || (pp.generated != null) || pp[0] === "INDENT" || (pp[1] === "(" && (pp.generated == null))))) {
-        return this.createLexError('arrow_spacing');
-      } else {
-        return null;
-      }
-    };
-
-    LexicalLinter.prototype.createLexError = function(rule, attrs) {
-      if (attrs == null) {
-        attrs = {};
-      }
-      attrs.lineNumber = this.lineNumber + 1;
-      attrs.level = this.config[rule].level;
-      attrs.line = this.lines[this.lineNumber];
-      return createError(rule, attrs);
-    };
-
-    LexicalLinter.prototype.peek = function(n) {
-      if (n == null) {
-        n = 1;
-      }
-      return this.tokens[this.i + n] || null;
-    };
-
-    LexicalLinter.prototype.inArray = function() {
-      return this.arrayTokens.length > 0;
-    };
-
-    LexicalLinter.prototype.atEof = function() {
-      var token, _i, _len, _ref, _ref1;
-
-      _ref = this.tokens.slice(this.i + 1);
-      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-        token = _ref[_i];
-        if (!(token.generated || ((_ref1 = token[0]) === 'OUTDENT' || _ref1 === 'TERMINATOR'))) {
-          return false;
-        }
-      }
-      return true;
-    };
-
-    LexicalLinter.prototype.isChainedCall = function() {
-      var i, lastNewLineIndex, lines, t, token, tokens;
-
-      lines = (function() {
-        var _i, _len, _ref, _results;
-
-        _ref = this.tokens.slice(0, +this.i + 1 || 9e9);
-        _results = [];
-        for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
-          token = _ref[i];
-          if (token.newLine != null) {
-            _results.push(i);
-          }
-        }
-        return _results;
-      }).call(this);
-      lastNewLineIndex = lines ? lines[lines.length - 2] : null;
-      if (lastNewLineIndex == null) {
-        return false;
-      }
-      tokens = [this.tokens[lastNewLineIndex], this.tokens[lastNewLineIndex + 1]];
-      return !!((function() {
-        var _i, _len, _results;
-
-        _results = [];
-        for (_i = 0, _len = tokens.length; _i < _len; _i++) {
-          t = tokens[_i];
-          if (t && t[0] === '.') {
-            _results.push(t);
-          }
-        }
-        return _results;
-      })()).length;
-    };
-
-    return LexicalLinter;
-
-  })();
-
-  ASTLinter = (function() {
-    function ASTLinter(source, config) {
-      this.source = source;
-      this.config = config;
-      this.errors = [];
-    }
-
-    ASTLinter.prototype.lint = function() {
-      var coffeeError;
-
-      try {
-        this.node = CoffeeScript.nodes(this.source);
-      } catch (_error) {
-        coffeeError = _error;
-        this.errors.push(this._parseCoffeeScriptError(coffeeError));
-        return this.errors;
-      }
-      this.lintNode(this.node);
-      return this.errors;
-    };
-
-    ASTLinter.prototype.getComplexity = function(node) {
-      var complexity, name, _ref;
-
-      name = node.constructor.name;
-      complexity = name === 'If' || name === 'While' || name === 'For' || name === 'Try' ? 1 : name === 'Op' && ((_ref = node.operator) === '&&' || _ref === '||') ? 1 : name === 'Switch' ? node.cases.length : 0;
-      return complexity;
-    };
-
-    ASTLinter.prototype.lintNode = function(node, line) {
-      var attrs, complexity, error, name, rule,
-        _this = this;
-
-      name = node.constructor.name;
-      complexity = this.getComplexity(node);
-      node.eachChild(function(childNode) {
+    }
+  };
+
+  return ColonAssignmentSpacing;
+
+})();
+
+
+},{}],11:[function(_dereq_,module,exports){
+var NoTabs;
+
+module.exports = NoTabs = (function() {
+  function NoTabs() {}
+
+  NoTabs.prototype.rule = {
+    name: 'cyclomatic_complexity',
+    value: 10,
+    level: 'ignore',
+    message: 'The cyclomatic complexity is too damn high',
+    description: 'Examine the complexity of your application.'
+  };
+
+  NoTabs.prototype.getComplexity = function(node) {
+    var complexity, name, _ref;
+    name = node.constructor.name;
+    complexity = name === 'If' || name === 'While' || name === 'For' || name === 'Try' ? 1 : name === 'Op' && ((_ref = node.operator) === '&&' || _ref === '||') ? 1 : name === 'Switch' ? node.cases.length : 0;
+    return complexity;
+  };
+
+  NoTabs.prototype.lintAST = function(node, astApi) {
+    this.astApi = astApi;
+    this.lintNode(node);
+    return void 0;
+  };
+
+  NoTabs.prototype.lintNode = function(node, line) {
+    var complexity, error, name, rule;
+    name = node.constructor.name;
+    complexity = this.getComplexity(node);
+    node.eachChild((function(_this) {
+      return function(childNode) {
         var nodeLine;
-
         nodeLine = childNode.locationData.first_line;
         if (childNode) {
           return complexity += _this.lintNode(childNode, nodeLine);
         }
+      };
+    })(this));
+    rule = this.astApi.config[this.rule.name];
+    if (name === 'Code' && complexity >= rule.value) {
+      error = this.astApi.createError({
+        context: complexity + 1,
+        lineNumber: line + 1,
+        lineNumberEnd: node.locationData.last_line + 1
       });
-      rule = this.config.cyclomatic_complexity;
-      if (name === 'Code' && complexity >= rule.value) {
-        attrs = {
-          context: complexity + 1,
-          level: rule.level,
-          lineNumber: line + 1,
-          lineNumberEnd: node.locationData.last_line + 1
-        };
-        error = createError('cyclomatic_complexity', attrs);
-        if (error) {
-          this.errors.push(error);
-        }
-      }
-      return complexity;
-    };
-
-    ASTLinter.prototype._parseCoffeeScriptError = function(coffeeError) {
-      var attrs, lineNumber, match, message, rule;
-
-      rule = RULES['coffeescript_error'];
-      message = coffeeError.toString();
-      lineNumber = -1;
-      if (coffeeError.location != null) {
-        lineNumber = coffeeError.location.first_line + 1;
-      } else {
-        match = /line (\d+)/.exec(message);
-        if ((match != null ? match.length : void 0) > 1) {
-          lineNumber = parseInt(match[1], 10);
-        }
-      }
-      attrs = {
-        message: message,
-        level: rule.level,
-        lineNumber: lineNumber
-      };
-      return createError('coffeescript_error', attrs);
-    };
-
-    return ASTLinter;
-
-  })();
-
-  mergeDefaultConfig = function(userConfig) {
-    var config, rule, ruleConfig;
-
-    config = {};
-    for (rule in RULES) {
-      ruleConfig = RULES[rule];
-      config[rule] = defaults(userConfig[rule], ruleConfig);
-    }
-    return config;
-  };
-
-  coffeelint.invertLiterate = function(source) {
-    var line, newSource, _i, _len, _ref;
-
-    source = CoffeeScript.helpers.invertLiterate(source);
-    newSource = "";
-    _ref = source.split("\n");
-    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-      line = _ref[_i];
-      if (line.match(/^#/)) {
-        line = line.replace(/\s*$/, '');
-      }
-      line = line.replace(/^\s{4}/g, '');
-      newSource += "" + line + "\n";
-    }
-    return newSource;
-  };
-
-  coffeelint.lint = function(source, userConfig, literate) {
-    var all_errors, astErrors, cmd, config, difference, disabled, disabled_initially, e, errors, i, l, lexErrors, lexicalLinter, lineErrors, lineLinter, next_line, r, rules, s, tokensByLine, _i, _j, _k, _len, _len1, _ref, _ref1, _ref2, _ref3, _ref4;
-
-    if (userConfig == null) {
-      userConfig = {};
-    }
-    if (literate == null) {
-      literate = false;
-    }
-    if (literate) {
-      source = this.invertLiterate(source);
-    }
-    config = mergeDefaultConfig(userConfig);
-    disabled_initially = [];
-    _ref = source.split('\n');
-    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-      l = _ref[_i];
-      s = regexes.configStatement.exec(l);
-      if ((s != null ? s.length : void 0) > 2 && __indexOf.call(s, 'enable') >= 0) {
-        _ref1 = s.slice(1);
-        for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
-          r = _ref1[_j];
-          if (r !== 'enable' && r !== 'disable') {
-            if (!(r in config && ((_ref2 = config[r].level) === 'warn' || _ref2 === 'error'))) {
-              disabled_initially.push(r);
-              config[r] = {
-                level: 'error'
-              };
-            }
+      if (error) {
+        this.errors.push(error);
+      }
+    }
+    return complexity;
+  };
+
+  return NoTabs;
+
+})();
+
+
+},{}],12:[function(_dereq_,module,exports){
+var DuplicateKey;
+
+module.exports = DuplicateKey = (function() {
+  DuplicateKey.prototype.rule = {
+    name: 'duplicate_key',
+    level: 'error',
+    message: 'Duplicate key defined in object or class',
+    description: "Prevents defining duplicate keys in object literals and classes"
+  };
+
+  DuplicateKey.prototype.tokens = ['IDENTIFIER', "{", "}"];
+
+  function DuplicateKey() {
+    this.braceScopes = [];
+  }
+
+  DuplicateKey.prototype.lintToken = function(_arg, tokenApi) {
+    var type;
+    type = _arg[0];
+    if (type === "{" || type === "}") {
+      this.lintBrace.apply(this, arguments);
+      return void 0;
+    }
+    if (type === "IDENTIFIER") {
+      return this.lintIdentifier.apply(this, arguments);
+    }
+  };
+
+  DuplicateKey.prototype.lintIdentifier = function(token, tokenApi) {
+    var key, nextToken, previousToken;
+    key = token[1];
+    if (this.currentScope == null) {
+      return null;
+    }
+    nextToken = tokenApi.peek(1);
+    if (nextToken[1] !== ':') {
+      return null;
+    }
+    previousToken = tokenApi.peek(-1);
+    if (previousToken[0] === '@') {
+      key = "@" + key;
+    }
+    key = "identifier-" + key;
+    if (this.currentScope[key]) {
+      return true;
+    } else {
+      this.currentScope[key] = token;
+      return null;
+    }
+  };
+
+  DuplicateKey.prototype.lintBrace = function(token) {
+    if (token[0] === '{') {
+      if (this.currentScope != null) {
+        this.braceScopes.push(this.currentScope);
+      }
+      this.currentScope = {};
+    } else {
+      this.currentScope = this.braceScopes.pop();
+    }
+    return null;
+  };
+
+  return DuplicateKey;
+
+})();
+
+
+},{}],13:[function(_dereq_,module,exports){
+var EmptyConstructorNeedsParens;
+
+module.exports = EmptyConstructorNeedsParens = (function() {
+  function EmptyConstructorNeedsParens() {}
+
+  EmptyConstructorNeedsParens.prototype.rule = {
+    name: 'empty_constructor_needs_parens',
+    level: 'ignore',
+    message: 'Invoking a constructor without parens and without arguments',
+    description: "Requires constructors with no parameters to include the parens"
+  };
+
+  EmptyConstructorNeedsParens.prototype.tokens = ['UNARY'];
+
+  EmptyConstructorNeedsParens.prototype.lintToken = function(token, tokenApi) {
+    var expectedCallStart, expectedIdentifier, identifierIndex;
+    if (token[1] === 'new') {
+      identifierIndex = 1;
+      while (true) {
+        expectedIdentifier = tokenApi.peek(identifierIndex);
+        expectedCallStart = tokenApi.peek(identifierIndex + 1);
+        if ((expectedIdentifier != null ? expectedIdentifier[0] : void 0) === 'IDENTIFIER') {
+          if ((expectedCallStart != null ? expectedCallStart[0] : void 0) === '.') {
+            identifierIndex += 2;
+            continue;
           }
         }
-      }
-    }
-    astErrors = new ASTLinter(source, config).lint();
-    lexicalLinter = new LexicalLinter(source, config);
-    lexErrors = lexicalLinter.lint();
-    tokensByLine = lexicalLinter.tokensByLine;
-    lineLinter = new LineLinter(source, config, tokensByLine);
-    lineErrors = lineLinter.lint();
-    errors = lexErrors.concat(lineErrors, astErrors);
-    errors.sort(function(a, b) {
-      return a.lineNumber - b.lineNumber;
-    });
-    difference = function(a, b) {
-      var j, _ref3, _results;
-
-      j = 0;
+        break;
+      }
+      if ((expectedIdentifier != null ? expectedIdentifier[0] : void 0) === 'IDENTIFIER' && (expectedCallStart != null)) {
+        return this.handleExpectedCallStart(expectedCallStart);
+      }
+    }
+  };
+
+  EmptyConstructorNeedsParens.prototype.handleExpectedCallStart = function(expectedCallStart) {
+    if (expectedCallStart[0] !== 'CALL_START') {
+      return true;
+    }
+  };
+
+  return EmptyConstructorNeedsParens;
+
+})();
+
+
+},{}],14:[function(_dereq_,module,exports){
+var Indentation;
+
+module.exports = Indentation = (function() {
+  Indentation.prototype.rule = {
+    name: 'indentation',
+    value: 2,
+    level: 'error',
+    message: 'Line contains inconsistent indentation',
+    description: "This rule imposes a standard number of spaces to be used for\nindentation. Since whitespace is significant in CoffeeScript, it's\ncritical that a project chooses a standard indentation format and\nstays consistent. Other roads lead to darkness. <pre> <code>#\nEnabling this option will prevent this ugly\n# but otherwise valid CoffeeScript.\ntwoSpaces = () ->\n  fourSpaces = () ->\n      eightSpaces = () ->\n            'this is valid CoffeeScript'\n\n</code>\n</pre>\nTwo space indentation is enabled by default."
+  };
+
+  Indentation.prototype.tokens = ['INDENT', "[", "]"];
+
+  function Indentation() {
+    this.arrayTokens = [];
+  }
+
+  Indentation.prototype.lintToken = function(token, tokenApi) {
+    var currentLine, expected, ignoreIndent, isArrayIndent, isInterpIndent, isMultiline, lineNumber, lines, numIndents, prevNum, previous, previousIndentation, previousLine, previousSymbol, type, _ref;
+    type = token[0], numIndents = token[1], lineNumber = token[2];
+    if (type === "[" || type === "]") {
+      this.lintArray(token);
+      return void 0;
+    }
+    if (token.generated != null) {
+      return null;
+    }
+    previous = tokenApi.peek(-2);
+    isInterpIndent = previous && previous[0] === '+';
+    previous = tokenApi.peek(-1);
+    isArrayIndent = this.inArray() && (previous != null ? previous.newLine : void 0);
+    previousSymbol = (_ref = tokenApi.peek(-1)) != null ? _ref[0] : void 0;
+    isMultiline = previousSymbol === '=' || previousSymbol === ',';
+    ignoreIndent = isInterpIndent || isArrayIndent || isMultiline;
+    if (this.isChainedCall(tokenApi)) {
+      lines = tokenApi.lines, lineNumber = tokenApi.lineNumber;
+      currentLine = lines[lineNumber];
+      prevNum = 1;
+      while (/^\s*(#|$)/.test(lines[lineNumber - prevNum])) {
+        prevNum += 1;
+      }
+      previousLine = lines[lineNumber - prevNum];
+      previousIndentation = previousLine.match(/^(\s*)/)[1].length;
+      numIndents = currentLine.match(/^(\s*)/)[1].length;
+      numIndents -= previousIndentation;
+    }
+    expected = tokenApi.config[this.rule.name].value;
+    if (!ignoreIndent && numIndents !== expected) {
+      return {
+        context: "Expected " + expected + " got " + numIndents
+      };
+    }
+  };
+
+  Indentation.prototype.inArray = function() {
+    return this.arrayTokens.length > 0;
+  };
+
+  Indentation.prototype.lintArray = function(token) {
+    if (token[0] === '[') {
+      this.arrayTokens.push(token);
+    } else if (token[0] === ']') {
+      this.arrayTokens.pop();
+    }
+    return null;
+  };
+
+  Indentation.prototype.isChainedCall = function(tokenApi) {
+    var i, lastNewLineIndex, lines, t, token, tokens;
+    tokens = tokenApi.tokens, i = tokenApi.i;
+    lines = (function() {
+      var _i, _len, _ref, _results;
+      _ref = tokens.slice(0, +i + 1 || 9e9);
       _results = [];
-      while (j < a.length) {
-        if (_ref3 = a[j], __indexOf.call(b, _ref3) >= 0) {
-          _results.push(a.splice(j, 1));
-        } else {
-          _results.push(j++);
+      for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
+        token = _ref[i];
+        if (token.newLine != null) {
+          _results.push(i);
         }
       }
       return _results;
+    })();
+    lastNewLineIndex = lines ? lines[lines.length - 2] : null;
+    if (lastNewLineIndex == null) {
+      return false;
+    }
+    tokens = [tokens[lastNewLineIndex], tokens[lastNewLineIndex + 1]];
+    return !!((function() {
+      var _i, _len, _results;
+      _results = [];
+      for (_i = 0, _len = tokens.length; _i < _len; _i++) {
+        t = tokens[_i];
+        if (t && t[0] === '.') {
+          _results.push(t);
+        }
+      }
+      return _results;
+    })()).length;
+  };
+
+  return Indentation;
+
+})();
+
+
+},{}],15:[function(_dereq_,module,exports){
+var LineEndings;
+
+module.exports = LineEndings = (function() {
+  function LineEndings() {}
+
+  LineEndings.prototype.rule = {
+    name: 'line_endings',
+    level: 'ignore',
+    value: 'unix',
+    message: 'Line contains incorrect line endings',
+    description: "This rule ensures your project uses only <tt>windows</tt> or\n<tt>unix</tt> line endings. This rule is disabled by default."
+  };
+
+  LineEndings.prototype.lintLine = function(line, lineApi) {
+    var ending, lastChar, valid, _ref;
+    ending = (_ref = lineApi.config[this.rule.name]) != null ? _ref.value : void 0;
+    if (!ending || lineApi.isLastLine() || !line) {
+      return null;
+    }
+    lastChar = line[line.length - 1];
+    valid = (function() {
+      if (ending === 'windows') {
+        return lastChar === '\r';
+      } else if (ending === 'unix') {
+        return lastChar !== '\r';
+      } else {
+        throw new Error("unknown line ending type: " + ending);
+      }
+    })();
+    if (!valid) {
+      return {
+        context: "Expected " + ending
+      };
+    } else {
+      return null;
+    }
+  };
+
+  return LineEndings;
+
+})();
+
+
+},{}],16:[function(_dereq_,module,exports){
+var MaxLineLength, regexes;
+
+regexes = {
+  literateComment: /^\#\s/,
+  longUrlComment: /^\s*\#\s*http[^\s]+$/
+};
+
+module.exports = MaxLineLength = (function() {
+  function MaxLineLength() {}
+
+  MaxLineLength.prototype.rule = {
+    name: 'max_line_length',
+    value: 80,
+    level: 'error',
+    limitComments: true,
+    message: 'Line exceeds maximum allowed length',
+    description: "This rule imposes a maximum line length on your code. <a\nhref=\"http://www.python.org/dev/peps/pep-0008/\">Python's style\nguide</a> does a good job explaining why you might want to limit the\nlength of your lines, though this is a matter of taste.\n\nLines can be no longer than eighty characters by default."
+  };
+
+  MaxLineLength.prototype.lintLine = function(line, lineApi) {
+    var limitComments, lineLength, max, _ref, _ref1;
+    max = (_ref = lineApi.config[this.rule.name]) != null ? _ref.value : void 0;
+    limitComments = (_ref1 = lineApi.config[this.rule.name]) != null ? _ref1.limitComments : void 0;
+    lineLength = line.length;
+    if (lineApi.isLiterate() && regexes.literateComment.test(line)) {
+      lineLength -= 2;
+    }
+    if (max && max < lineLength && !regexes.longUrlComment.test(line)) {
+      if (!limitComments) {
+        if (lineApi.getLineTokens().length === 0) {
+          return;
+        }
+      }
+      return {
+        context: "Length is " + lineLength + ", max is " + max
+      };
+    }
+  };
+
+  return MaxLineLength;
+
+})();
+
+
+},{}],17:[function(_dereq_,module,exports){
+var MissingFatArrows, any, isClass, isCode, isFatArrowCode, isObject, isThis, isValue, methodsOfClass, needsFatArrow,
+  __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
+
+isCode = function(node) {
+  return (node != null ? node.constructor.name : void 0) === 'Code';
+};
+
+isClass = function(node) {
+  return node.constructor.name === 'Class';
+};
+
+isValue = function(node) {
+  return node.constructor.name === 'Value';
+};
+
+isObject = function(node) {
+  return node.constructor.name === 'Obj';
+};
+
+isThis = function(node) {
+  return isValue(node) && node.base.value === 'this';
+};
+
+isFatArrowCode = function(node) {
+  return isCode(node) && node.bound;
+};
+
+any = function(arr, test) {
+  return arr.reduce((function(res, elt) {
+    return res || test(elt);
+  }), false);
+};
+
+needsFatArrow = function(node) {
+  return isCode(node) && (any(node.params, function(param) {
+    return param.contains(isThis) != null;
+  }) || (node.body.contains(isThis) != null));
+};
+
+methodsOfClass = function(classNode) {
+  var bodyNodes, returnNode;
+  bodyNodes = classNode.body.expressions;
+  returnNode = bodyNodes[bodyNodes.length - 1];
+  if ((returnNode != null) && isValue(returnNode) && isObject(returnNode.base)) {
+    return returnNode.base.properties.map(function(assignNode) {
+      return assignNode.value;
+    }).filter(isCode);
+  } else {
+    return [];
+  }
+};
+
+module.exports = MissingFatArrows = (function() {
+  function MissingFatArrows() {}
+
+  MissingFatArrows.prototype.rule = {
+    name: 'missing_fat_arrows',
+    level: 'ignore',
+    message: 'Used `this` in a function without a fat arrow',
+    description: "Warns when you use `this` inside a function that wasn't defined\nwith a fat arrow. This rule does not apply to methods defined in a\nclass, since they have `this` bound to the class instance (or the\nclass itself, for class methods).\n\nIt is impossible to statically determine whether a function using\n`this` will be bound with the correct `this` value due to language\nfeatures like `Function.prototype.call` and\n`Function.prototype.bind`, so this rule may produce false positives."
+  };
+
+  MissingFatArrows.prototype.lintAST = function(node, astApi) {
+    this.lintNode(node, astApi);
+    return void 0;
+  };
+
+  MissingFatArrows.prototype.lintNode = function(node, astApi, methods) {
+    var error;
+    if (methods == null) {
+      methods = [];
+    }
+    if ((!isFatArrowCode(node)) && (__indexOf.call(methods, node) < 0) && (needsFatArrow(node))) {
+      error = astApi.createError({
+        lineNumber: node.locationData.first_line + 1
+      });
+      this.errors.push(error);
+    }
+    return node.eachChild((function(_this) {
+      return function(child) {
+        return _this.lintNode(child, astApi, (function() {
+          switch (false) {
+            case !isClass(node):
+              return methodsOfClass(node);
+            case !isCode(node):
+              return [];
+            default:
+              return methods;
+          }
+        })());
+      };
+    })(this));
+  };
+
+  return MissingFatArrows;
+
+})();
+
+
+},{}],18:[function(_dereq_,module,exports){
+var NewlinesAfterClasses;
+
+module.exports = NewlinesAfterClasses = (function() {
+  function NewlinesAfterClasses() {}
+
+  NewlinesAfterClasses.prototype.rule = {
+    name: 'newlines_after_classes',
+    value: 3,
+    level: 'ignore',
+    message: 'Wrong count of newlines between a class and other code',
+    description: "Checks the number of newlines between classes and other code"
+  };
+
+  NewlinesAfterClasses.prototype.lintLine = function(line, lineApi) {
+    var context, ending, got, lineNumber;
+    ending = lineApi.config[this.rule.name].value;
+    if (!ending || lineApi.isLastLine()) {
+      return null;
+    }
+    lineNumber = lineApi.lineNumber, context = lineApi.context;
+    if (!context["class"].inClass && (context["class"].lastUnemptyLineInClass != null) && (lineNumber - context["class"].lastUnemptyLineInClass) !== ending) {
+      got = lineNumber - context["class"].lastUnemptyLineInClass;
+      return {
+        context: "Expected " + ending + " got " + got
+      };
+    }
+    return null;
+  };
+
+  return NewlinesAfterClasses;
+
+})();
+
+
+},{}],19:[function(_dereq_,module,exports){
+var NoBackticks;
+
+module.exports = NoBackticks = (function() {
+  function NoBackticks() {}
+
+  NoBackticks.prototype.rule = {
+    name: 'no_backticks',
+    level: 'error',
+    message: 'Backticks are forbidden',
+    description: "Backticks allow snippets of JavaScript to be embedded in\nCoffeeScript. While some folks consider backticks useful in a few\nniche circumstances, they should be avoided because so none of\nJavaScript's \"bad parts\", like <tt>with</tt> and <tt>eval</tt>,\nsneak into CoffeeScript.\nThis rule is enabled by default."
+  };
+
+  NoBackticks.prototype.tokens = ["JS"];
+
+  NoBackticks.prototype.lintToken = function(token, tokenApi) {
+    return true;
+  };
+
+  return NoBackticks;
+
+})();
+
+
+},{}],20:[function(_dereq_,module,exports){
+var NoEmptyParamList;
+
+module.exports = NoEmptyParamList = (function() {
+  function NoEmptyParamList() {}
+
+  NoEmptyParamList.prototype.rule = {
+    name: 'no_empty_param_list',
+    level: 'ignore',
+    message: 'Empty parameter list is forbidden',
+    description: "This rule prohibits empty parameter lists in function definitions.\n<pre>\n<code># The empty parameter list in here is unnecessary:\nmyFunction = () -&gt;\n\n# We might favor this instead:\nmyFunction = -&gt;\n</code>\n</pre>\nEmpty parameter lists are permitted by default."
+  };
+
+  NoEmptyParamList.prototype.tokens = ["PARAM_START"];
+
+  NoEmptyParamList.prototype.lintToken = function(token, tokenApi) {
+    var nextType;
+    nextType = tokenApi.peek()[0];
+    return nextType === 'PARAM_END';
+  };
+
+  return NoEmptyParamList;
+
+})();
+
+
+},{}],21:[function(_dereq_,module,exports){
+var NoImplicitBraces;
+
+module.exports = NoImplicitBraces = (function() {
+  function NoImplicitBraces() {}
+
+  NoImplicitBraces.prototype.rule = {
+    name: 'no_implicit_braces',
+    level: 'ignore',
+    message: 'Implicit braces are forbidden',
+    strict: true,
+    description: "This rule prohibits implicit braces when declaring object literals.\nImplicit braces can make code more difficult to understand,\nespecially when used in combination with optional parenthesis.\n<pre>\n<code># Do you find this code ambiguous? Is it a\n# function call with three arguments or four?\nmyFunction a, b, 1:2, 3:4\n\n# While the same code written in a more\n# explicit manner has no ambiguity.\nmyFunction(a, b, {1:2, 3:4})\n</code>\n</pre>\nImplicit braces are permitted by default, since their use is\nidiomatic CoffeeScript."
+  };
+
+  NoImplicitBraces.prototype.tokens = ["{"];
+
+  NoImplicitBraces.prototype.lintToken = function(token, tokenApi) {
+    var previousToken;
+    if (token.generated) {
+      if (!tokenApi.config[this.rule.name].strict) {
+        previousToken = tokenApi.peek(-1)[0];
+        if (previousToken === 'INDENT') {
+          return;
+        }
+      }
+      return this.isPartOfClass(tokenApi);
+    }
+  };
+
+  NoImplicitBraces.prototype.isPartOfClass = function(tokenApi) {
+    var i, t;
+    i = -1;
+    while (true) {
+      t = tokenApi.peek(i);
+      if ((t == null) || t[0] === 'TERMINATOR') {
+        return true;
+      }
+      if (t[0] === 'CLASS') {
+        return null;
+      }
+      i -= 1;
+    }
+  };
+
+  return NoImplicitBraces;
+
+})();
+
+
+},{}],22:[function(_dereq_,module,exports){
+var NoImplicitParens;
+
+module.exports = NoImplicitParens = (function() {
+  function NoImplicitParens() {}
+
+  NoImplicitParens.prototype.rule = {
+    name: 'no_implicit_parens',
+    level: 'ignore',
+    message: 'Implicit parens are forbidden',
+    description: "This rule prohibits implicit parens on function calls.\n<pre>\n<code># Some folks don't like this style of coding.\nmyFunction a, b, c\n\n# And would rather it always be written like this:\nmyFunction(a, b, c)\n</code>\n</pre>\nImplicit parens are permitted by default, since their use is\nidiomatic CoffeeScript."
+  };
+
+  NoImplicitParens.prototype.tokens = ["CALL_START"];
+
+  NoImplicitParens.prototype.lintToken = function(token, tokenApi) {
+    return token.generated;
+  };
+
+  return NoImplicitParens;
+
+})();
+
+
+},{}],23:[function(_dereq_,module,exports){
+var NoPlusPlus;
+
+module.exports = NoPlusPlus = (function() {
+  function NoPlusPlus() {}
+
+  NoPlusPlus.prototype.rule = {
+    name: 'no_plusplus',
+    level: 'ignore',
+    message: 'The increment and decrement operators are forbidden',
+    description: "This rule forbids the increment and decrement arithmetic operators.\nSome people believe the <tt>++</tt> and <tt>--</tt> to be cryptic\nand the cause of bugs due to misunderstandings of their precedence\nrules.\nThis rule is disabled by default."
+  };
+
+  NoPlusPlus.prototype.tokens = ["++", "--"];
+
+  NoPlusPlus.prototype.lintToken = function(token, tokenApi) {
+    return {
+      context: "found '" + token[0] + "'"
     };
-    all_errors = errors;
-    errors = [];
-    disabled = disabled_initially;
-    next_line = 0;
-    for (i = _k = 0, _ref3 = source.split('\n').length; 0 <= _ref3 ? _k < _ref3 : _k > _ref3; i = 0 <= _ref3 ? ++_k : --_k) {
-      for (cmd in block_config) {
-        rules = block_config[cmd][i];
-        if (rules != null) {
-          ({
-            'disable': function() {
-              return disabled = disabled.concat(rules);
-            },
-            'enable': function() {
-              difference(disabled, rules);
-              if (rules.length === 0) {
-                return disabled = disabled_initially;
-              }
-            }
-          })[cmd]();
-        }
-      }
-      while (next_line === i && all_errors.length > 0) {
-        next_line = all_errors[0].lineNumber - 1;
-        e = all_errors[0];
-        if (e.lineNumber === i + 1 || (e.lineNumber == null)) {
-          e = all_errors.shift();
-          if (_ref4 = e.rule, __indexOf.call(disabled, _ref4) < 0) {
-            errors.push(e);
+  };
+
+  return NoPlusPlus;
+
+})();
+
+
+},{}],24:[function(_dereq_,module,exports){
+var NoStandAloneAt;
+
+module.exports = NoStandAloneAt = (function() {
+  function NoStandAloneAt() {}
+
+  NoStandAloneAt.prototype.rule = {
+    name: 'no_stand_alone_at',
+    level: 'ignore',
+    message: '@ must not be used stand alone',
+    description: "This rule checks that no stand alone @ are in use, they are\ndiscouraged. Further information in CoffeScript issue <a\nhref=\"https://github.com/jashkenas/coffee-script/issues/1601\">\n#1601</a>"
+  };
+
+  NoStandAloneAt.prototype.tokens = ["@"];
+
+  NoStandAloneAt.prototype.lintToken = function(token, tokenApi) {
+    var isDot, isIdentifier, isIndexStart, isValidProtoProperty, nextToken, protoProperty, spaced;
+    nextToken = tokenApi.peek();
+    spaced = token.spaced;
+    isIdentifier = nextToken[0] === 'IDENTIFIER';
+    isIndexStart = nextToken[0] === 'INDEX_START';
+    isDot = nextToken[0] === '.';
+    if (nextToken[0] === '::') {
+      protoProperty = tokenApi.peek(2);
+      isValidProtoProperty = protoProperty[0] === 'IDENTIFIER';
+    }
+    if (spaced || (!isIdentifier && !isIndexStart && !isDot && !isValidProtoProperty)) {
+      return true;
+    }
+  };
+
+  return NoStandAloneAt;
+
+})();
+
+
+},{}],25:[function(_dereq_,module,exports){
+var NoTabs, indentationRegex,
+  __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
+
+indentationRegex = /\S/;
+
+module.exports = NoTabs = (function() {
+  function NoTabs() {}
+
+  NoTabs.prototype.rule = {
+    name: 'no_tabs',
+    level: 'error',
+    message: 'Line contains tab indentation',
+    description: "This rule forbids tabs in indentation. Enough said. It is enabled by\ndefault."
+  };
+
+  NoTabs.prototype.lintLine = function(line, lineApi) {
+    var indentation;
+    indentation = line.split(indentationRegex)[0];
+    if (lineApi.lineHasToken() && __indexOf.call(indentation, '\t') >= 0) {
+      return true;
+    } else {
+      return null;
+    }
+  };
+
+  return NoTabs;
+
+})();
+
+
+},{}],26:[function(_dereq_,module,exports){
+var NoThrowingStrings;
+
+module.exports = NoThrowingStrings = (function() {
+  function NoThrowingStrings() {}
+
+  NoThrowingStrings.prototype.rule = {
+    name: 'no_throwing_strings',
+    level: 'error',
+    message: 'Throwing strings is forbidden',
+    description: "This rule forbids throwing string literals or interpolations. While\nJavaScript (and CoffeeScript by extension) allow any expression to\nbe thrown, it is best to only throw <a\nhref=\"https://developer.mozilla.org\n/en/JavaScript/Reference/Global_Objects/Error\"> Error</a> objects,\nbecause they contain valuable debugging information like the stack\ntrace. Because of JavaScript's dynamic nature, CoffeeLint cannot\nensure you are always throwing instances of <tt>Error</tt>. It will\nonly catch the simple but real case of throwing literal strings.\n<pre>\n<code># CoffeeLint will catch this:\nthrow \"i made a boo boo\"\n\n# ... but not this:\nthrow getSomeString()\n</code>\n</pre>\nThis rule is enabled by default."
+  };
+
+  NoThrowingStrings.prototype.tokens = ["THROW"];
+
+  NoThrowingStrings.prototype.lintToken = function(token, tokenApi) {
+    var n1, n2, nextIsString, _ref;
+    _ref = [tokenApi.peek(), tokenApi.peek(2)], n1 = _ref[0], n2 = _ref[1];
+    nextIsString = n1[0] === 'STRING' || (n1[0] === '(' && n2[0] === 'STRING');
+    return nextIsString;
+  };
+
+  return NoThrowingStrings;
+
+})();
+
+
+},{}],27:[function(_dereq_,module,exports){
+var NoTrailingSemicolons, regexes,
+  __slice = [].slice;
+
+regexes = {
+  trailingSemicolon: /;\r?$/
+};
+
+module.exports = NoTrailingSemicolons = (function() {
+  function NoTrailingSemicolons() {}
+
+  NoTrailingSemicolons.prototype.rule = {
+    name: 'no_trailing_semicolons',
+    level: 'error',
+    message: 'Line contains a trailing semicolon',
+    description: "This rule prohibits trailing semicolons, since they are needless\ncruft in CoffeeScript.\n<pre>\n<code># This semicolon is meaningful.\nx = '1234'; console.log(x)\n\n# This semicolon is redundant.\nalert('end of line');\n</code>\n</pre>\nTrailing semicolons are forbidden by default."
+  };
+
+  NoTrailingSemicolons.prototype.lintLine = function(line, lineApi) {
+    var first, hasNewLine, hasSemicolon, last, lineTokens, _i, _ref;
+    lineTokens = lineApi.getLineTokens();
+    if (lineTokens.length === 1 && lineTokens[0][0] === 'TERMINATOR') {
+      return;
+    }
+    hasSemicolon = regexes.trailingSemicolon.test(line);
+    _ref = lineApi.getLineTokens(), first = 2 <= _ref.length ? __slice.call(_ref, 0, _i = _ref.length - 1) : (_i = 0, []), last = _ref[_i++];
+    hasNewLine = last && (last.newLine != null);
+    if (hasSemicolon && !hasNewLine && lineApi.lineHasToken() && last[0] !== 'STRING') {
+      return true;
+    }
+  };
+
+  return NoTrailingSemicolons;
+
+})();
+
+
+},{}],28:[function(_dereq_,module,exports){
+var NoTrailingWhitespace, regexes;
+
+regexes = {
+  trailingWhitespace: /[^\s]+[\t ]+\r?$/,
+  onlySpaces: /^[\t ]+\r?$/,
+  lineHasComment: /^\s*[^\#]*\#/
+};
+
+module.exports = NoTrailingWhitespace = (function() {
+  function NoTrailingWhitespace() {}
+
+  NoTrailingWhitespace.prototype.rule = {
+    name: 'no_trailing_whitespace',
+    level: 'error',
+    message: 'Line ends with trailing whitespace',
+    allowed_in_comments: false,
+    allowed_in_empty_lines: true,
+    description: "This rule forbids trailing whitespace in your code, since it is\nneedless cruft. It is enabled by default."
+  };
+
+  NoTrailingWhitespace.prototype.lintLine = function(line, lineApi) {
+    var str, token, tokens, _i, _len, _ref, _ref1, _ref2;
+    if (!((_ref = lineApi.config['no_trailing_whitespace']) != null ? _ref.allowed_in_empty_lines : void 0)) {
+      if (regexes.onlySpaces.test(line)) {
+        return true;
+      }
+    }
+    if (regexes.trailingWhitespace.test(line)) {
+      if (!((_ref1 = lineApi.config['no_trailing_whitespace']) != null ? _ref1.allowed_in_comments : void 0)) {
+        return true;
+      }
+      line = line;
+      tokens = lineApi.tokensByLine[lineApi.lineNumber];
+      if (!tokens) {
+        return null;
+      }
+      _ref2 = (function() {
+        var _j, _len, _results;
+        _results = [];
+        for (_j = 0, _len = tokens.length; _j < _len; _j++) {
+          token = tokens[_j];
+          if (token[0] === 'STRING') {
+            _results.push(token[1]);
           }
         }
-      }
-    }
-    block_config = {
-      'enable': {},
-      'disable': {}
-    };
-    return errors;
-  };
-
-}).call(this);
+        return _results;
+      })();
+      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
+        str = _ref2[_i];
+        line = line.replace(str, 'STRING');
+      }
+      if (!regexes.lineHasComment.test(line)) {
+        return true;
+      }
+    }
+  };
+
+  return NoTrailingWhitespace;
+
+})();
+
+
+},{}],29:[function(_dereq_,module,exports){
+var NoUnnecessaryFatArrows, any, isCode, isFatArrowCode, isThis, needsFatArrow;
+
+isCode = function(node) {
+  return node.constructor.name === 'Code';
+};
+
+isFatArrowCode = function(node) {
+  return isCode(node) && node.bound;
+};
+
+isThis = function(node) {
+  return node.constructor.name === 'Value' && node.base.value === 'this';
+};
+
+any = function(arr, test) {
+  return arr.reduce((function(res, elt) {
+    return res || test(elt);
+  }), false);
+};
+
+needsFatArrow = function(node) {
+  return isCode(node) && (any(node.params, function(param) {
+    return param.contains(isThis) != null;
+  }) || (node.body.contains(isThis) != null) || (node.body.contains(function(child) {
+    return isFatArrowCode(child) && needsFatArrow(child);
+  }) != null));
+};
+
+module.exports = NoUnnecessaryFatArrows = (function() {
+  function NoUnnecessaryFatArrows() {}
+
+  NoUnnecessaryFatArrows.prototype.rule = {
+    name: 'no_unnecessary_fat_arrows',
+    level: 'warn',
+    message: 'Unnecessary fat arrow',
+    description: "Disallows defining functions with fat arrows when `this`\nis not used within the function."
+  };
+
+  NoUnnecessaryFatArrows.prototype.lintAST = function(node, astApi) {
+    this.lintNode(node, astApi);
+    return void 0;
+  };
+
+  NoUnnecessaryFatArrows.prototype.lintNode = function(node, astApi) {
+    var error;
+    if ((isFatArrowCode(node)) && (!needsFatArrow(node))) {
+      error = astApi.createError({
+        lineNumber: node.locationData.first_line + 1
+      });
+      this.errors.push(error);
+    }
+    return node.eachChild((function(_this) {
+      return function(child) {
+        return _this.lintNode(child, astApi);
+      };
+    })(this));
+  };
+
+  return NoUnnecessaryFatArrows;
+
+})();
+
+
+},{}],30:[function(_dereq_,module,exports){
+var NonEmptyConstructorNeedsParens, ParentClass,
+  __hasProp = {}.hasOwnProperty,
+  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
+
+ParentClass = _dereq_('./empty_constructor_needs_parens.coffee');
+
+module.exports = NonEmptyConstructorNeedsParens = (function(_super) {
+  __extends(NonEmptyConstructorNeedsParens, _super);
+
+  function NonEmptyConstructorNeedsParens() {
+    return NonEmptyConstructorNeedsParens.__super__.constructor.apply(this, arguments);
+  }
+
+  NonEmptyConstructorNeedsParens.prototype.rule = {
+    name: 'non_empty_constructor_needs_parens',
+    level: 'ignore',
+    message: 'Invoking a constructor without parens and with arguments',
+    description: "Requires constructors with parameters to include the parens"
+  };
+
+  NonEmptyConstructorNeedsParens.prototype.handleExpectedCallStart = function(expectedCallStart) {
+    if (expectedCallStart[0] === 'CALL_START' && expectedCallStart.generated) {
+      return true;
+    }
+  };
+
+  return NonEmptyConstructorNeedsParens;
+
+})(ParentClass);
+
+
+},{"./empty_constructor_needs_parens.coffee":13}],31:[function(_dereq_,module,exports){
+var SpaceOperators,
+  __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
+
+module.exports = SpaceOperators = (function() {
+  SpaceOperators.prototype.rule = {
+    name: 'space_operators',
+    level: 'ignore',
+    message: 'Operators must be spaced properly',
+    description: "This rule enforces that operators have space around them."
+  };
+
+  SpaceOperators.prototype.tokens = ["+", "-", "=", "MATH", "COMPARE", "LOGIC", "COMPOUND_ASSIGN", "(", ")", "CALL_START", "CALL_END"];
+
+  function SpaceOperators() {
+    this.callTokens = [];
+    this.parenTokens = [];
+  }
+
+  SpaceOperators.prototype.lintToken = function(_arg, tokenApi) {
+    var type;
+    type = _arg[0];
+    if (type === "CALL_START" || type === "CALL_END") {
+      this.lintCall.apply(this, arguments);
+      return void 0;
+    }
+    if (type === "(" || type === ")") {
+      this.lintParens.apply(this, arguments);
+      return void 0;
+    }
+    if (type === "+" || type === "-") {
+      return this.lintPlus.apply(this, arguments);
+    } else {
+      return this.lintMath.apply(this, arguments);
+    }
+  };
+
+  SpaceOperators.prototype.lintPlus = function(token, tokenApi) {
+    var isUnary, p, unaries, _ref;
+    if (this.isInInterpolation() || this.isInExtendedRegex()) {
+      return null;
+    }
+    p = tokenApi.peek(-1);
+    unaries = ['TERMINATOR', '(', '=', '-', '+', ',', 'CALL_START', 'INDEX_START', '..', '...', 'COMPARE', 'IF', 'THROW', 'LOGIC', 'POST_IF', ':', '[', 'INDENT', 'COMPOUND_ASSIGN', 'RETURN', 'MATH', 'BY', 'LEADING_WHEN'];
+    isUnary = !p ? false : (_ref = p[0], __indexOf.call(unaries, _ref) >= 0);
+    if ((isUnary && token.spaced) || (!isUnary && !token.spaced && !token.newLine)) {
+      return {
+        context: token[1]
+      };
+    } else {
+      return null;
+    }
+  };
+
+  SpaceOperators.prototype.lintMath = function(token, tokenApi) {
+    if (!token.spaced && !token.newLine) {
+      return {
+        context: token[1]
+      };
+    } else {
+      return null;
+    }
+  };
+
+  SpaceOperators.prototype.isInExtendedRegex = function() {
+    var t, _i, _len, _ref;
+    _ref = this.callTokens;
+    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+      t = _ref[_i];
+      if (t.isRegex) {
+        return true;
+      }
+    }
+    return false;
+  };
+
+  SpaceOperators.prototype.lintCall = function(token, tokenApi) {
+    var p;
+    if (token[0] === 'CALL_START') {
+      p = tokenApi.peek(-1);
+      token.isRegex = p && p[0] === 'IDENTIFIER' && p[1] === 'RegExp';
+      this.callTokens.push(token);
+    } else {
+      this.callTokens.pop();
+    }
+    return null;
+  };
+
+  SpaceOperators.prototype.isInInterpolation = function() {
+    var t, _i, _len, _ref;
+    _ref = this.parenTokens;
+    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+      t = _ref[_i];
+      if (t.isInterpolation) {
+        return true;
+      }
+    }
+    return false;
+  };
+
+  SpaceOperators.prototype.lintParens = function(token, tokenApi) {
+    var i, n1, n2, p1;
+    if (token[0] === '(') {
+      p1 = tokenApi.peek(-1);
+      n1 = tokenApi.peek(1);
+      n2 = tokenApi.peek(2);
+      i = n1 && n2 && n1[0] === 'STRING' && n2[0] === '+';
+      token.isInterpolation = i;
+      this.parenTokens.push(token);
+    } else {
+      this.parenTokens.pop();
+    }
+    return null;
+  };
+
+  return SpaceOperators;
+
+})();
+
+
+},{}]},{},[4])
+(4)
+});
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/lib/commandline.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/lib/commandline.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/lib/commandline.js	(revision 516)
@@ -1,3 +1,2 @@
-// Generated by CoffeeScript 1.6.2
 /*
 CoffeeLint
@@ -9,5 +8,5 @@
 
 (function() {
-  var CSVReporter, CoffeeScript, ErrorReport, JSLintReporter, Reporter, coffeelint, config, data, errorReport, existsFn, findCoffeeScripts, fs, glob, lintFiles, lintSource, optimist, options, path, paths, read, reportAndExit, scripts, stdin, thisdir, _ref, _ref1, _ref2,
+  var CSVReporter, CheckstyleReporter, CoffeeScript, ErrorReport, JSLintReporter, Reporter, coffeelint, config, configfinder, data, errorReport, findCoffeeScripts, fs, getFallbackConfig, glob, lintFiles, lintSource, loadRules, optimist, options, path, paths, read, reportAndExit, scripts, stdin, thisdir, _ref, _ref1, _ref2,
     __slice = [].slice,
     __hasProp = {}.hasOwnProperty,
@@ -24,5 +23,7 @@
   thisdir = path.dirname(fs.realpathSync(__filename));
 
-  coffeelint = require(path.join(thisdir, "..", "lib", "coffeelint"));
+  coffeelint = require(path.join(thisdir, "coffeelint"));
+
+  configfinder = require(path.join(thisdir, "configfinder"));
 
   CoffeeScript = require('coffee-script');
@@ -30,5 +31,4 @@
   read = function(path) {
     var realPath;
-
     realPath = fs.realpathSync(path);
     return fs.readFileSync(realPath).toString();
@@ -37,5 +37,4 @@
   findCoffeeScripts = function(paths) {
     var files, p, _i, _len;
-
     files = [];
     for (_i = 0, _len = paths.length; _i < _len; _i++) {
@@ -66,5 +65,4 @@
     ErrorReport.prototype.getSummary = function() {
       var error, errorCount, errors, pathCount, warningCount, _i, _len, _ref;
-
       pathCount = errorCount = warningCount = 0;
       _ref = this.paths;
@@ -112,5 +110,4 @@
     ErrorReport.prototype._hasLevel = function(path, level) {
       var error, _i, _len, _ref;
-
       _ref = this.paths[path];
       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
@@ -141,5 +138,4 @@
     Reporter.prototype.stylize = function() {
       var map, message, styles;
-
       message = arguments[0], styles = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
       if (!this.colorize) {
@@ -159,5 +155,4 @@
     Reporter.prototype.publish = function() {
       var errors, paths, report;
-
       paths = this.errorReport.paths;
       report = "";
@@ -176,5 +171,4 @@
     Reporter.prototype.reportSummary = function(s) {
       var e, err, file, msg, p, start, w, warn;
-
       start = s.errorCount > 0 ? "" + this.err + " " + (this.stylize("Lint!", 'red', 'bold')) : s.warningCount > 0 ? "" + this.warn + " " + (this.stylize("Warning!", 'yellow', 'bold')) : "" + this.ok + " " + (this.stylize("Ok!", 'green', 'bold'));
       e = s.errorCount;
@@ -190,5 +184,4 @@
     Reporter.prototype.reportPath = function(path, errors) {
       var color, e, hasError, hasWarning, lineEnd, o, output, overall, pathReport, _i, _len, _ref;
-
       _ref = (hasError = this.errorReport.pathHasError(path)) ? [this.err, 'red'] : (hasWarning = this.errorReport.pathHasWarning(path)) ? [this.warn, 'yellow'] : [this.ok, 'green'], overall = _ref[0], color = _ref[1];
       pathReport = "";
@@ -242,5 +235,4 @@
     CSVReporter.prototype.publish = function() {
       var e, errors, f, header, _ref1, _results;
-
       header = ["path", "lineNumber", "lineNumberEnd", "level", "message"];
       this.print(header.join(","));
@@ -251,8 +243,10 @@
         _results.push((function() {
           var _i, _len, _ref2, _results1;
-
           _results1 = [];
           for (_i = 0, _len = errors.length; _i < _len; _i++) {
             e = errors[_i];
+            if (e.context) {
+              e.message += " " + e.context + ".";
+            }
             f = [path, e.lineNumber, (_ref2 = e.lineNumberEnd) != null ? _ref2 : e.lineNumberEnd, e.level, e.message];
             _results1.push(this.print(f.join(",")));
@@ -278,5 +272,4 @@
     JSLintReporter.prototype.publish = function() {
       var e, errors, _i, _len, _ref2, _ref3;
-
       this.print("<?xml version=\"1.0\" encoding=\"utf-8\"?><jslint>");
       _ref2 = this.errorReport.paths;
@@ -287,5 +280,5 @@
           for (_i = 0, _len = errors.length; _i < _len; _i++) {
             e = errors[_i];
-            this.print("<issue line=\"" + e.lineNumber + "\"\n        lineEnd=" + ((_ref3 = e.lineNumberEnd) != null ? _ref3 : e.lineNumberEnd) + "\n        reason=\"[" + (this.escape(e.level)) + "] " + (this.escape(e.message)) + "\"\n        evidence=\"" + (this.escape(e.context)) + "\"/>");
+            this.print("<issue line=\"" + e.lineNumber + "\"\n        lineEnd=\"" + ((_ref3 = e.lineNumberEnd) != null ? _ref3 : e.lineNumber) + "\"\n        reason=\"[" + (this.escape(e.level)) + "] " + (this.escape(e.message)) + "\"\n        evidence=\"" + (this.escape(e.context)) + "\"/>");
           }
           this.print("</file>");
@@ -297,5 +290,4 @@
     JSLintReporter.prototype.escape = function(msg) {
       var r, replacements, _i, _len;
-
       msg = "" + msg;
       if (!msg) {
@@ -314,13 +306,55 @@
   })(Reporter);
 
-  lintFiles = function(paths, config) {
-    var errorReport, literate, source, _i, _len;
-
+  CheckstyleReporter = (function(_super) {
+    __extends(CheckstyleReporter, _super);
+
+    function CheckstyleReporter() {
+      _ref2 = CheckstyleReporter.__super__.constructor.apply(this, arguments);
+      return _ref2;
+    }
+
+    CheckstyleReporter.prototype.publish = function() {
+      var context, e, errors, level, _i, _len, _ref3, _ref4;
+      this.print("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+      this.print("<checkstyle version=\"4.3\">");
+      _ref3 = this.errorReport.paths;
+      for (path in _ref3) {
+        errors = _ref3[path];
+        if (errors.length) {
+          this.print("<file name=\"" + path + "\">");
+          for (_i = 0, _len = errors.length; _i < _len; _i++) {
+            e = errors[_i];
+            level = e.level;
+            if (level === 'warn') {
+              level = 'warning';
+            }
+            context = (_ref4 = e.context) != null ? _ref4 : "";
+            this.print("<error line=\"" + e.lineNumber + "\"\n    severity=\"" + (this.escape(level)) + "\"\n    message=\"" + (this.escape(e.message + '; context: ' + context)) + "\"\n    source=\"coffeelint\"/>");
+          }
+          this.print("</file>");
+        }
+      }
+      return this.print("</checkstyle>");
+    };
+
+    return CheckstyleReporter;
+
+  })(JSLintReporter);
+
+  lintFiles = function(files, config) {
+    var data, errorReport, file, fileConfig, literate, ruleName, source, _i, _len;
     errorReport = new ErrorReport();
-    for (_i = 0, _len = paths.length; _i < _len; _i++) {
-      path = paths[_i];
-      source = read(path);
-      literate = CoffeeScript.helpers.isLiterate(path);
-      errorReport.paths[path] = coffeelint.lint(source, config, literate);
+    for (_i = 0, _len = files.length; _i < _len; _i++) {
+      file = files[_i];
+      source = read(file);
+      literate = CoffeeScript.helpers.isLiterate(file);
+      fileConfig = config ? config : getFallbackConfig(file);
+      for (ruleName in fileConfig) {
+        data = fileConfig[ruleName];
+        if (data.module != null) {
+          loadRules(data.module, ruleName);
+        }
+      }
+      errorReport.paths[file] = coffeelint.lint(source, fileConfig, literate);
     }
     return errorReport;
@@ -328,18 +362,61 @@
 
   lintSource = function(source, config, literate) {
-    var errorReport;
-
+    var data, errorReport, ruleName;
     if (literate == null) {
       literate = false;
     }
     errorReport = new ErrorReport();
+    config || (config = getFallbackConfig());
+    for (ruleName in config) {
+      data = config[ruleName];
+      if (data.module != null) {
+        loadRules(data.module, ruleName);
+      }
+    }
     errorReport.paths["stdin"] = coffeelint.lint(source, config, literate);
     return errorReport;
   };
 
+  getFallbackConfig = function(filename) {
+    if (filename == null) {
+      filename = null;
+    }
+    if (!options.argv.noconfig) {
+      return configfinder.getConfig(filename);
+    }
+  };
+
+  loadRules = function(moduleName, ruleName) {
+    var e, rule, ruleModule, _i, _len, _results;
+    if (ruleName == null) {
+      ruleName = void 0;
+    }
+    try {
+      try {
+        ruleModule = require(moduleName);
+      } catch (_error) {
+        e = _error;
+        ruleModule = require(path.resolve(process.cwd(), moduleName));
+      }
+      if (typeof ruleModule === 'function') {
+        return coffeelint.registerRule(ruleModule, ruleName);
+      } else {
+        _results = [];
+        for (_i = 0, _len = ruleModule.length; _i < _len; _i++) {
+          rule = ruleModule[_i];
+          _results.push(coffeelint.registerRule(rule));
+        }
+        return _results;
+      }
+    } catch (_error) {
+      e = _error;
+      console.error("Error loading " + moduleName);
+      throw e;
+    }
+  };
+
   reportAndExit = function(errorReport, options) {
     var colorize, reporter;
-
-    reporter = options.argv.jslint ? new JSLintReporter(errorReport) : options.argv.csv ? new CSVReporter(errorReport) : (colorize = !options.argv.nocolor, new Reporter(errorReport, colorize));
+    reporter = options.argv.jslint ? new JSLintReporter(errorReport) : options.argv.csv ? new CSVReporter(errorReport) : options.argv.checkstyle ? new CheckstyleReporter(errorReport) : (colorize = !options.argv.nocolor, new Reporter(errorReport, colorize));
     reporter.publish();
     return process.on('exit', function() {
@@ -348,5 +425,5 @@
   };
 
-  options = optimist.usage("Usage: coffeelint [options] source [...]").alias("f", "file").alias("h", "help").alias("v", "version").alias("s", "stdin").alias("q", "quiet").describe("f", "Specify a custom configuration file.").describe("makeconfig", "Prints a default config file").describe("noconfig", "Ignores the environment variable COFFEELINT_CONFIG.").describe("h", "Print help information.").describe("v", "Print current version number.").describe("r", "Recursively lint .coffee files in subdirectories.").describe("csv", "Use the csv reporter.").describe("jslint", "Use the JSLint XML reporter.").describe("nocolor", "Don't colorize the output").describe("s", "Lint the source from stdin").describe("q", "Only print errors.").describe("literate", "Used with --stdin to process as Literate CoffeeScript").boolean("csv").boolean("jslint").boolean("nocolor").boolean("noconfig").boolean("makeconfig").boolean("literate").boolean("r").boolean("s").boolean("q", "Print errors only.");
+  options = optimist.usage("Usage: coffeelint [options] source [...]").alias("f", "file").alias("h", "help").alias("v", "version").alias("s", "stdin").alias("q", "quiet").describe("f", "Specify a custom configuration file.").describe("rules", "Specify a custom rule or directory of rules.").describe("makeconfig", "Prints a default config file").describe("noconfig", "Ignores the environment variable COFFEELINT_CONFIG.").describe("h", "Print help information.").describe("v", "Print current version number.").describe("r", "(not used, but left for backward compatibility)").describe("csv", "Use the csv reporter.").describe("jslint", "Use the JSLint XML reporter.").describe("checkstyle", "Use the checkstyle XML reporter.").describe("nocolor", "Don't colorize the output").describe("s", "Lint the source from stdin").describe("q", "Only print errors.").describe("literate", "Used with --stdin to process as Literate CoffeeScript").boolean("csv").boolean("jslint").boolean("checkstyle").boolean("nocolor").boolean("noconfig").boolean("makeconfig").boolean("literate").boolean("r").boolean("s").boolean("q", "Print errors only.");
 
   if (options.argv.v) {
@@ -366,12 +443,14 @@
     process.exit(1);
   } else {
-    config = {};
+    config = null;
     if (!options.argv.noconfig) {
-      existsFn = (_ref2 = fs.existsSync) != null ? _ref2 : path.existsSync;
       if (options.argv.f) {
         config = JSON.parse(read(options.argv.f));
-      } else if (process.env.COFFEELINT_CONFIG && existsFn(process.env.COFFEELINT_CONFIG)) {
+      } else if (process.env.COFFEELINT_CONFIG && fs.existsSync(process.env.COFFEELINT_CONFIG)) {
         config = JSON.parse(read(process.env.COFFEELINT_CONFIG));
       }
+    }
+    if (options.argv.rules) {
+      loadRules(options.argv.rules);
     }
     if (options.argv.s) {
@@ -385,5 +464,4 @@
       stdin.on('end', function() {
         var errorReport;
-
         errorReport = lintSource(data, config, options.argv.literate);
         return reportAndExit(errorReport, options);
@@ -391,5 +469,5 @@
     } else {
       paths = options.argv._;
-      scripts = options.argv.r ? findCoffeeScripts(paths) : paths;
+      scripts = findCoffeeScripts(paths);
       errorReport = lintFiles(scripts, config, options.argv.literate);
       reportAndExit(errorReport, options);
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/lib/configfinder.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/lib/configfinder.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/lib/configfinder.js	(revision 516)
@@ -0,0 +1,76 @@
+/*
+Helpers for finding CoffeeLint config in standard locations, similar to how
+JSHint does.
+*/
+
+
+(function() {
+  var findFile, findFileResults, fs, loadJSON, loadNpmConfig, path;
+
+  fs = require('fs');
+
+  path = require('path');
+
+  findFileResults = {};
+
+  findFile = function(name, dir) {
+    var filename, parent;
+    dir = dir || process.cwd();
+    filename = path.normalize(path.join(dir, name));
+    if (findFileResults[filename]) {
+      return findFileResults[filename];
+    }
+    parent = path.resolve(dir, "../");
+    if (fs.existsSync(filename)) {
+      return findFileResults[filename] = filename;
+    } else if (dir === parent) {
+      return findFileResults[filename] = null;
+    } else {
+      return findFile(name, parent);
+    }
+  };
+
+  loadNpmConfig = function(dir) {
+    var fp;
+    fp = findFile("package.json", dir);
+    if (fp) {
+      return loadJSON(fp).coffeelintConfig;
+    }
+  };
+
+  loadJSON = function(filename) {
+    var e;
+    try {
+      return JSON.parse(fs.readFileSync(filename).toString());
+    } catch (_error) {
+      e = _error;
+      console.error("Could not load JSON file '%s': %s", filename, e);
+      return null;
+    }
+  };
+
+  exports.getConfig = function(filename) {
+    var dir, envs, home, npmConfig, projConfig;
+    if (filename == null) {
+      filename = null;
+    }
+    if (filename) {
+      dir = path.dirname(path.resolve(filename));
+      npmConfig = loadNpmConfig(dir);
+      if (npmConfig) {
+        return npmConfig;
+      }
+      projConfig = findFile("coffeelint.json", dir);
+      if (projConfig) {
+        return loadJSON(projConfig);
+      }
+    }
+    envs = process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE;
+    home = path.normalize(path.join(envs, "coffeelint.json"));
+    if (fs.existsSync(home)) {
+      console.log('loaded', home);
+      return loadJSON(home);
+    }
+  };
+
+}).call(this);
Index: v/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/lib/htmldoc.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/lib/htmldoc.js	(revision 515)
+++ 	(revision )
@@ -1,33 +1,0 @@
-// Generated by CoffeeScript 1.6.2
-(function() {
-  var render, ruleTemplate, rules, _;
-
-  _ = require("underscore");
-
-  rules = (require("./coffeelint")).RULES;
-
-  render = function() {
-    var rule, ruleName, rulesHTML, _i, _len, _ref, _results;
-
-    rulesHTML = "";
-    _ref = _.sortBy(_.keys(rules), (function(s) {
-      return s;
-    }));
-    _results = [];
-    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-      ruleName = _ref[_i];
-      rule = rules[ruleName];
-      rule.name = ruleName;
-      if (!rule.description) {
-        rule.description = "[no description provided]";
-      }
-      _results.push(console.log(ruleTemplate(rule)));
-    }
-    return _results;
-  };
-
-  ruleTemplate = _.template("<tr>\n<td class=\"rule\"><%= name %></td>\n<td class=\"description\">\n    <%= description %>\n    <p><em>default level: <%= level %></em></p>\n</td>\n</tr>");
-
-  render();
-
-}).call(this);
Index: v/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/.bin/vows
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/.bin/vows	(revision 515)
+++ 	(revision )
@@ -1,1 +1,0 @@
-link ../vows/bin/vows
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/browser.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/browser.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/browser.js	(revision 516)
@@ -1,3 +1,3 @@
-// Generated by CoffeeScript 1.6.2
+// Generated by CoffeeScript 1.6.3
 (function() {
   var CoffeeScript, compile, runScripts,
@@ -11,10 +11,8 @@
 
   CoffeeScript["eval"] = function(code, options) {
-    var _ref;
-
     if (options == null) {
       options = {};
     }
-    if ((_ref = options.bare) == null) {
+    if (options.bare == null) {
       options.bare = true;
     }
@@ -27,4 +25,5 @@
     }
     options.bare = true;
+    options.shiftLine = true;
     return Function(compile(code, options))();
   };
@@ -34,8 +33,7 @@
   }
 
-  if ((typeof btoa !== "undefined" && btoa !== null) && (typeof JSON !== "undefined" && JSON !== null)) {
+  if ((typeof btoa !== "undefined" && btoa !== null) && (typeof JSON !== "undefined" && JSON !== null) && (typeof unescape !== "undefined" && unescape !== null) && (typeof encodeURIComponent !== "undefined" && encodeURIComponent !== null)) {
     compile = function(code, options) {
       var js, v3SourceMap, _ref;
-
       if (options == null) {
         options = {};
@@ -44,5 +42,5 @@
       options.inline = true;
       _ref = CoffeeScript.compile(code, options), js = _ref.js, v3SourceMap = _ref.v3SourceMap;
-      return "" + js + "\n//@ sourceMappingURL=data:application/json;base64," + (btoa(v3SourceMap)) + "\n//@ sourceURL=coffeescript";
+      return "" + js + "\n//@ sourceMappingURL=data:application/json;base64," + (btoa(unescape(encodeURIComponent(v3SourceMap)))) + "\n//@ sourceURL=coffeescript";
     };
   }
@@ -50,10 +48,9 @@
   CoffeeScript.load = function(url, callback, options) {
     var xhr;
-
     if (options == null) {
       options = {};
     }
     options.sourceFiles = [url];
-    xhr = window.ActiveXObject ? new window.ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest();
+    xhr = window.ActiveXObject ? new window.ActiveXObject('Microsoft.XMLHTTP') : new window.XMLHttpRequest();
     xhr.open('GET', url, true);
     if ('overrideMimeType' in xhr) {
@@ -62,5 +59,4 @@
     xhr.onreadystatechange = function() {
       var _ref;
-
       if (xhr.readyState === 4) {
         if ((_ref = xhr.status) === 0 || _ref === 200) {
@@ -79,10 +75,8 @@
   runScripts = function() {
     var coffees, coffeetypes, execute, index, length, s, scripts;
-
-    scripts = document.getElementsByTagName('script');
+    scripts = window.document.getElementsByTagName('script');
     coffeetypes = ['text/coffeescript', 'text/literate-coffeescript'];
     coffees = (function() {
       var _i, _len, _ref, _results;
-
       _results = [];
       for (_i = 0, _len = scripts.length; _i < _len; _i++) {
@@ -98,5 +92,4 @@
     (execute = function() {
       var mediatype, options, script;
-
       script = coffees[index++];
       mediatype = script != null ? script.type : void 0;
@@ -118,7 +111,7 @@
 
   if (window.addEventListener) {
-    addEventListener('DOMContentLoaded', runScripts, false);
+    window.addEventListener('DOMContentLoaded', runScripts, false);
   } else {
-    attachEvent('onload', runScripts);
+    window.attachEvent('onload', runScripts);
   }
 
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/cake.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/cake.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/cake.js	(revision 516)
@@ -1,3 +1,3 @@
-// Generated by CoffeeScript 1.6.2
+// Generated by CoffeeScript 1.6.3
 (function() {
   var CoffeeScript, cakefileDirectory, existsSync, fatalError, fs, helpers, missingTask, oparse, options, optparse, path, printTasks, switches, tasks;
@@ -26,5 +26,4 @@
     task: function(name, description, action) {
       var _ref;
-
       if (!action) {
         _ref = [description, action], action = _ref[0], description = _ref[1];
@@ -49,5 +48,4 @@
   exports.run = function() {
     var arg, args, e, _i, _len, _ref, _results;
-
     global.__originalDirname = fs.realpathSync('.');
     process.chdir(cakefileDirectory(__originalDirname));
@@ -77,5 +75,4 @@
   printTasks = function() {
     var cakefilePath, desc, name, relative, spaces, task;
-
     relative = path.relative || path.resolve;
     cakefilePath = path.join(relative(__originalDirname, process.cwd()), 'Cakefile');
@@ -105,5 +102,4 @@
   cakefileDirectory = function(dir) {
     var parent;
-
     if (existsSync(path.join(dir, 'Cakefile'))) {
       return dir;
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/coffee-script.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/coffee-script.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/coffee-script.js	(revision 516)
@@ -1,5 +1,5 @@
-// Generated by CoffeeScript 1.6.2
+// Generated by CoffeeScript 1.6.3
 (function() {
-  var Lexer, child_process, compile, ext, fork, formatSourcePosition, fs, helpers, lexer, loadFile, parser, patchStackTrace, patched, path, sourcemap, vm, _i, _len, _ref,
+  var Lexer, Module, SourceMap, child_process, compile, ext, findExtension, fork, formatSourcePosition, fs, helpers, lexer, loadFile, parser, patchStackTrace, patched, path, sourceMaps, vm, _i, _len, _ref,
     __hasProp = {}.hasOwnProperty;
 
@@ -18,23 +18,25 @@
   helpers = require('./helpers');
 
-  sourcemap = require('./sourcemap');
-
-  exports.VERSION = '1.6.2';
+  SourceMap = require('./sourcemap');
+
+  exports.VERSION = '1.6.3';
 
   exports.helpers = helpers;
 
   exports.compile = compile = function(code, options) {
-    var answer, currentColumn, currentLine, fragment, fragments, header, js, merge, newLines, sourceMap, _i, _len;
-
+    var answer, currentColumn, currentLine, fragment, fragments, header, js, map, merge, newLines, _i, _len;
     if (options == null) {
       options = {};
     }
-    merge = exports.helpers.merge;
+    merge = helpers.merge;
     if (options.sourceMap) {
-      sourceMap = new sourcemap.SourceMap();
-    }
-    fragments = (parser.parse(lexer.tokenize(code, options))).compileToFragments(options);
+      map = new SourceMap;
+    }
+    fragments = parser.parse(lexer.tokenize(code, options)).compileToFragments(options);
     currentLine = 0;
-    if (options.header || options.inline) {
+    if (options.header) {
+      currentLine += 1;
+    }
+    if (options.shiftLine) {
       currentLine += 1;
     }
@@ -43,7 +45,7 @@
     for (_i = 0, _len = fragments.length; _i < _len; _i++) {
       fragment = fragments[_i];
-      if (sourceMap) {
+      if (options.sourceMap) {
         if (fragment.locationData) {
-          sourceMap.addMapping([fragment.locationData.first_line, fragment.locationData.first_column], [currentLine, currentColumn], {
+          map.add([fragment.locationData.first_line, fragment.locationData.first_column], [currentLine, currentColumn], {
             noReplace: true
           });
@@ -63,8 +65,6 @@
         js: js
       };
-      if (sourceMap) {
-        answer.sourceMap = sourceMap;
-        answer.v3SourceMap = sourcemap.generateV3SourceMap(sourceMap, options, code);
-      }
+      answer.sourceMap = map;
+      answer.v3SourceMap = map.generate(options, code);
       return answer;
     } else {
@@ -86,11 +86,10 @@
 
   exports.run = function(code, options) {
-    var answer, mainModule, _ref;
-
+    var answer, mainModule;
     if (options == null) {
       options = {};
     }
     mainModule = require.main;
-    if ((_ref = options.sourceMap) == null) {
+    if (options.sourceMap == null) {
       options.sourceMap = true;
     }
@@ -101,5 +100,5 @@
       answer = compile(code, options);
       patchStackTrace();
-      mainModule._sourceMaps[mainModule.filename] = answer.sourceMap;
+      sourceMaps[mainModule.filename] = answer.sourceMap;
       return mainModule._compile(answer.js, mainModule.filename);
     } else {
@@ -110,5 +109,4 @@
   exports["eval"] = function(code, options) {
     var Module, Script, js, k, o, r, sandbox, v, _i, _len, _module, _ref, _ref1, _require;
-
     if (options == null) {
       options = {};
@@ -173,12 +171,14 @@
 
   loadFile = function(module, filename) {
-    var raw, stripped;
-
+    var answer, raw, stripped;
     raw = fs.readFileSync(filename, 'utf8');
     stripped = raw.charCodeAt(0) === 0xFEFF ? raw.substring(1) : raw;
-    return module._compile(compile(stripped, {
+    answer = compile(stripped, {
       filename: filename,
+      sourceMap: true,
       literate: helpers.isLiterate(filename)
-    }), filename);
+    });
+    sourceMaps[filename] = answer.sourceMap;
+    return module._compile(answer.js, filename);
   };
 
@@ -189,4 +189,27 @@
       require.extensions[ext] = loadFile;
     }
+    Module = require('module');
+    findExtension = function(filename) {
+      var curExtension, extensions;
+      extensions = path.basename(filename).split('.');
+      if (extensions[0] === '') {
+        extensions.shift();
+      }
+      while (extensions.shift()) {
+        curExtension = '.' + extensions.join('.');
+        if (Module._extensions[curExtension]) {
+          return curExtension;
+        }
+      }
+      return '.js';
+    };
+    Module.prototype.load = function(filename) {
+      var extension;
+      this.filename = filename;
+      this.paths = Module._nodeModulePaths(path.dirname(filename));
+      extension = findExtension(filename);
+      Module._extensions[extension](this, filename);
+      return this.loaded = true;
+    };
   }
 
@@ -195,5 +218,4 @@
     child_process.fork = function(path, args, options) {
       var execPath;
-
       if (args == null) {
         args = [];
@@ -217,5 +239,4 @@
     lex: function() {
       var tag, token;
-
       token = this.tokens[this.pos++];
       if (token) {
@@ -240,5 +261,4 @@
   parser.yy.parseError = function(message, _arg) {
     var token;
-
     token = _arg.token;
     message = "unexpected " + (token === 1 ? 'end of input' : token);
@@ -248,7 +268,8 @@
   patched = false;
 
+  sourceMaps = {};
+
   patchStackTrace = function() {
     var mainModule;
-
     if (patched) {
       return;
@@ -256,15 +277,12 @@
     patched = true;
     mainModule = require.main;
-    mainModule._sourceMaps = {};
     return Error.prepareStackTrace = function(err, stack) {
       var frame, frames, getSourceMapping, sourceFiles, _ref1;
-
       sourceFiles = {};
       getSourceMapping = function(filename, line, column) {
         var answer, sourceMap;
-
-        sourceMap = mainModule._sourceMaps[filename];
+        sourceMap = sourceMaps[filename];
         if (sourceMap) {
-          answer = sourceMap.getSourcePosition([line - 1, column - 1]);
+          answer = sourceMap.sourceLocation([line - 1, column - 1]);
         }
         if (answer) {
@@ -276,5 +294,4 @@
       frames = (function() {
         var _j, _len1, _results;
-
         _results = [];
         for (_j = 0, _len1 = stack.length; _j < _len1; _j++) {
@@ -293,5 +310,4 @@
   formatSourcePosition = function(frame, getSourceMapping) {
     var as, column, fileLocation, fileName, functionName, isConstructor, isMethodCall, line, methodName, source, tp, typeName;
-
     fileName = void 0;
     fileLocation = '';
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/command.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/command.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/command.js	(revision 516)
@@ -1,5 +1,5 @@
-// Generated by CoffeeScript 1.6.2
+// Generated by CoffeeScript 1.6.3
 (function() {
-  var BANNER, CoffeeScript, EventEmitter, SWITCHES, compileJoin, compileOptions, compilePath, compileScript, compileStdio, exec, exists, forkNode, fs, helpers, hidden, joinTimeout, lint, notSources, optionParser, optparse, opts, outputPath, parseOptions, path, printLine, printTokens, printWarn, removeSource, sourceCode, sources, spawn, timeLog, unwatchDir, usage, version, wait, watch, watchDir, watchers, writeJs, _ref;
+  var BANNER, CoffeeScript, EventEmitter, SWITCHES, compileJoin, compileOptions, compilePath, compileScript, compileStdio, exec, exists, forkNode, fs, helpers, hidden, joinTimeout, notSources, optionParser, optparse, opts, outputPath, parseOptions, path, printLine, printTokens, printWarn, removeSource, sourceCode, sources, spawn, timeLog, unwatchDir, usage, useWinPathSep, version, wait, watch, watchDir, watchers, writeJs, _ref;
 
   fs = require('fs');
@@ -18,4 +18,6 @@
 
   exists = fs.exists || path.exists;
+
+  useWinPathSep = path.sep === '\\';
 
   helpers.extend(CoffeeScript, new EventEmitter);
@@ -35,5 +37,5 @@
   BANNER = 'Usage: coffee [options] path/to/script.coffee -- [args]\n\nIf called without options, `coffee` will run your script.';
 
-  SWITCHES = [['-b', '--bare', 'compile without a top-level function wrapper'], ['-c', '--compile', 'compile to JavaScript and save as .js files'], ['-e', '--eval', 'pass a string from the command line as input'], ['-h', '--help', 'display this help message'], ['-i', '--interactive', 'run an interactive CoffeeScript REPL'], ['-j', '--join [FILE]', 'concatenate the source CoffeeScript before compiling'], ['-l', '--lint', 'pipe the compiled JavaScript through JavaScript Lint'], ['-m', '--map', 'generate source map and save as .map files'], ['-n', '--nodes', 'print out the parse tree that the parser produces'], ['--nodejs [ARGS]', 'pass options directly to the "node" binary'], ['-o', '--output [DIR]', 'set the output directory for compiled JavaScript'], ['-p', '--print', 'print out the compiled JavaScript'], ['-s', '--stdio', 'listen for and compile scripts over stdio'], ['-t', '--tokens', 'print out the tokens that the lexer/rewriter produce'], ['-v', '--version', 'display the version number'], ['-w', '--watch', 'watch scripts for changes and rerun commands']];
+  SWITCHES = [['-b', '--bare', 'compile without a top-level function wrapper'], ['-c', '--compile', 'compile to JavaScript and save as .js files'], ['-e', '--eval', 'pass a string from the command line as input'], ['-h', '--help', 'display this help message'], ['-i', '--interactive', 'run an interactive CoffeeScript REPL'], ['-j', '--join [FILE]', 'concatenate the source CoffeeScript before compiling'], ['-m', '--map', 'generate source map and save as .map files'], ['-n', '--nodes', 'print out the parse tree that the parser produces'], ['--nodejs [ARGS]', 'pass options directly to the "node" binary'], ['-o', '--output [DIR]', 'set the output directory for compiled JavaScript'], ['-p', '--print', 'print out the compiled JavaScript'], ['-s', '--stdio', 'listen for and compile scripts over stdio'], ['-l', '--literate', 'treat stdio as literate style coffee-script'], ['-t', '--tokens', 'print out the tokens that the lexer/rewriter produce'], ['-v', '--version', 'display the version number'], ['-w', '--watch', 'watch scripts for changes and rerun commands']];
 
   opts = {};
@@ -51,5 +53,4 @@
   exports.run = function() {
     var literals, source, _i, _len, _results;
-
     parseOptions();
     if (opts.nodejs) {
@@ -103,5 +104,4 @@
         return fs.readdir(source, function(err, files) {
           var file, index, _ref1, _ref2;
-
           if (err && err.code !== 'ENOENT') {
             throw err;
@@ -116,5 +116,4 @@
           [].splice.apply(sources, [index, index - index + 1].concat(_ref1 = (function() {
             var _i, _len, _results;
-
             _results = [];
             for (_i = 0, _len = files.length; _i < _len; _i++) {
@@ -153,5 +152,4 @@
   compileScript = function(file, input, base) {
     var compiled, err, message, o, options, t, task, useColors;
-
     if (base == null) {
       base = null;
@@ -190,6 +188,4 @@
         } else if (o.compile || o.map) {
           return writeJs(base, t.file, t.output, options.jsPath, t.sourceMap);
-        } else if (o.lint) {
-          return lint(t.file, t.output);
         }
       }
@@ -213,5 +209,4 @@
   compileStdio = function() {
     var code, stdin;
-
     code = '';
     stdin = process.openStdin();
@@ -244,5 +239,4 @@
   watch = function(source, base) {
     var compile, compileTimeout, e, prevStats, rewatch, watchErr, watcher;
-
     prevStats = null;
     compileTimeout = null;
@@ -301,5 +295,4 @@
   watchDir = function(source, base) {
     var e, readdirTimeout, watcher;
-
     readdirTimeout = null;
     try {
@@ -309,5 +302,4 @@
           return fs.readdir(source, function(err, files) {
             var file, _i, _len, _results;
-
             if (err) {
               if (err.code !== 'ENOENT') {
@@ -347,9 +339,7 @@
   unwatchDir = function(source, base) {
     var file, prevSources, toRemove, _i, _len;
-
     prevSources = sources.slice(0);
     toRemove = (function() {
       var _i, _len, _results;
-
       _results = [];
       for (_i = 0, _len = sources.length; _i < _len; _i++) {
@@ -375,5 +365,4 @@
   removeSource = function(source, base, removeJs) {
     var index, jsPath;
-
     index = sources.indexOf(source);
     sources.splice(index, 1);
@@ -396,9 +385,8 @@
   outputPath = function(source, base, extension) {
     var baseDir, basename, dir, srcDir;
-
     if (extension == null) {
       extension = ".js";
     }
-    basename = helpers.baseFileName(source, true, path.sep);
+    basename = helpers.baseFileName(source, true, useWinPathSep);
     srcDir = path.dirname(source);
     baseDir = base === '.' ? srcDir : srcDir.substring(base.length);
@@ -409,5 +397,4 @@
   writeJs = function(base, sourcePath, js, jsPath, generatedSourceMap) {
     var compile, jsDir, sourceMapPath;
-
     if (generatedSourceMap == null) {
       generatedSourceMap = null;
@@ -421,5 +408,5 @@
         }
         if (generatedSourceMap) {
-          js = "" + js + "\n/*\n//@ sourceMappingURL=" + (helpers.baseFileName(sourceMapPath, false, path.sep)) + "\n*/\n";
+          js = "" + js + "\n/*\n//@ sourceMappingURL=" + (helpers.baseFileName(sourceMapPath, false, useWinPathSep)) + "\n*/\n";
         }
         fs.writeFile(jsPath, js, function(err) {
@@ -456,24 +443,8 @@
   };
 
-  lint = function(file, js) {
-    var conf, jsl, printIt;
-
-    printIt = function(buffer) {
-      return printLine(file + ':\t' + buffer.toString().trim());
-    };
-    conf = __dirname + '/../../extras/jsl.conf';
-    jsl = spawn('jsl', ['-nologo', '-stdin', '-conf', conf]);
-    jsl.stdout.on('data', printIt);
-    jsl.stderr.on('data', printIt);
-    jsl.stdin.write(js);
-    return jsl.stdin.end();
-  };
-
   printTokens = function(tokens) {
     var strings, tag, token, value;
-
     strings = (function() {
       var _i, _len, _results;
-
       _results = [];
       for (_i = 0, _len = tokens.length; _i < _len; _i++) {
@@ -490,9 +461,8 @@
   parseOptions = function() {
     var i, o, source, _i, _len;
-
     optionParser = new optparse.OptionParser(SWITCHES, BANNER);
     o = opts = optionParser.parse(process.argv.slice(2));
     o.compile || (o.compile = !!o.output);
-    o.run = !(o.compile || o.print || o.lint || o.map);
+    o.run = !(o.compile || o.print || o.map);
     o.print = !!(o.print || (o["eval"] || o.stdio && o.compile));
     sources = o["arguments"];
@@ -505,8 +475,7 @@
   compileOptions = function(filename, base) {
     var answer, cwd, jsDir, jsPath;
-
     answer = {
       filename: filename,
-      literate: helpers.isLiterate(filename),
+      literate: opts.literate || helpers.isLiterate(filename),
       bare: opts.bare,
       header: opts.compile,
@@ -522,11 +491,11 @@
           sourceRoot: path.relative(jsDir, cwd),
           sourceFiles: [path.relative(cwd, filename)],
-          generatedFile: helpers.baseFileName(jsPath, false, path.sep)
+          generatedFile: helpers.baseFileName(jsPath, false, useWinPathSep)
         });
       } else {
         answer = helpers.merge(answer, {
           sourceRoot: "",
-          sourceFiles: [helpers.baseFileName(filename, false, path.sep)],
-          generatedFile: helpers.baseFileName(filename, true, path.sep) + ".js"
+          sourceFiles: [helpers.baseFileName(filename, false, useWinPathSep)],
+          generatedFile: helpers.baseFileName(filename, true, useWinPathSep) + ".js"
         });
       }
@@ -537,5 +506,4 @@
   forkNode = function() {
     var args, nodeArgs;
-
     nodeArgs = opts.nodejs.split(/\s+/);
     args = process.argv.slice(1);
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/grammar.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/grammar.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/grammar.js	(revision 516)
@@ -1,3 +1,3 @@
-// Generated by CoffeeScript 1.6.2
+// Generated by CoffeeScript 1.6.3
 (function() {
   var Parser, alt, alternatives, grammar, name, o, operators, token, tokens, unwrap;
@@ -9,5 +9,4 @@
   o = function(patternString, action, options) {
     var addLocationDataFn, match, patternCount;
-
     patternString = patternString.replace(/\s{2,}/g, ' ');
     patternCount = patternString.split(' ').length;
@@ -352,4 +351,6 @@
       }), o('CATCH Object Block', function() {
         return [LOC(2)(new Value($2)), $3];
+      }), o('CATCH Block', function() {
+        return [null, $2];
       })
     ],
@@ -596,5 +597,4 @@
     grammar[name] = (function() {
       var _i, _j, _len, _len1, _ref, _results;
-
       _results = [];
       for (_i = 0, _len = alternatives.length; _i < _len; _i++) {
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/helpers.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/helpers.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/helpers.js	(revision 516)
@@ -1,3 +1,3 @@
-// Generated by CoffeeScript 1.6.2
+// Generated by CoffeeScript 1.6.3
 (function() {
   var buildLocationData, extend, flatten, last, repeat, _ref;
@@ -9,5 +9,4 @@
   exports.ends = function(string, literal, back) {
     var len;
-
     len = literal.length;
     return literal === string.substr(string.length - len - (back || 0), len);
@@ -16,5 +15,4 @@
   exports.repeat = repeat = function(str, n) {
     var res;
-
     res = '';
     while (n > 0) {
@@ -30,5 +28,4 @@
   exports.compact = function(array) {
     var item, _i, _len, _results;
-
     _results = [];
     for (_i = 0, _len = array.length; _i < _len; _i++) {
@@ -43,5 +40,4 @@
   exports.count = function(string, substr) {
     var num, pos;
-
     num = pos = 0;
     if (!substr.length) {
@@ -60,5 +56,4 @@
   extend = exports.extend = function(object, properties) {
     var key, val;
-
     for (key in properties) {
       val = properties[key];
@@ -70,5 +65,4 @@
   exports.flatten = flatten = function(array) {
     var element, flattened, _i, _len;
-
     flattened = [];
     for (_i = 0, _len = array.length; _i < _len; _i++) {
@@ -85,5 +79,4 @@
   exports.del = function(obj, key) {
     var val;
-
     val = obj[key];
     delete obj[key];
@@ -97,5 +90,4 @@
   exports.some = (_ref = Array.prototype.some) != null ? _ref : function(fn) {
     var e, _i, _len;
-
     for (_i = 0, _len = this.length; _i < _len; _i++) {
       e = this[_i];
@@ -109,9 +101,7 @@
   exports.invertLiterate = function(code) {
     var line, lines, maybe_code;
-
     maybe_code = true;
     lines = (function() {
       var _i, _len, _ref1, _results;
-
       _ref1 = code.split('\n');
       _results = [];
@@ -155,5 +145,4 @@
   exports.locationDataToString = function(obj) {
     var locationData;
-
     if (("2" in obj) && ("first_line" in obj[2])) {
       locationData = obj[2];
@@ -168,13 +157,13 @@
   };
 
-  exports.baseFileName = function(file, stripExt, pathSep) {
-    var parts;
-
+  exports.baseFileName = function(file, stripExt, useWinPathSep) {
+    var parts, pathSep;
     if (stripExt == null) {
       stripExt = false;
     }
-    if (pathSep == null) {
-      pathSep = '/';
-    }
+    if (useWinPathSep == null) {
+      useWinPathSep = false;
+    }
+    pathSep = useWinPathSep ? /\\|\// : /\//;
     parts = file.split(pathSep);
     file = parts[parts.length - 1];
@@ -199,10 +188,9 @@
 
   exports.throwSyntaxError = function(message, location) {
-    var error, _ref1, _ref2;
-
-    if ((_ref1 = location.last_line) == null) {
+    var error;
+    if (location.last_line == null) {
       location.last_line = location.first_line;
     }
-    if ((_ref2 = location.last_column) == null) {
+    if (location.last_column == null) {
       location.last_column = location.first_column;
     }
@@ -214,5 +202,4 @@
   exports.prettyErrorMessage = function(error, fileName, code, useColors) {
     var codeLine, colorize, end, first_column, first_line, last_column, last_line, marker, message, start, _ref1;
-
     if (!error.location) {
       return error.stack || ("" + error);
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/index.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/index.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/index.js	(revision 516)
@@ -1,3 +1,3 @@
-// Generated by CoffeeScript 1.6.2
+// Generated by CoffeeScript 1.6.3
 (function() {
   var key, val, _ref;
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/lexer.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/lexer.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/lexer.js	(revision 516)
@@ -1,10 +1,10 @@
-// Generated by CoffeeScript 1.6.2
+// Generated by CoffeeScript 1.6.3
 (function() {
-  var BOM, BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_ALIAS_MAP, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, HEREDOC, HEREDOC_ILLEGAL, HEREDOC_INDENT, HEREGEX, HEREGEX_OMIT, IDENTIFIER, INDEXABLE, INVERSES, JSTOKEN, JS_FORBIDDEN, JS_KEYWORDS, LINE_BREAK, LINE_CONTINUER, LOGIC, Lexer, MATH, MULTILINER, MULTI_DENT, NOT_REGEX, NOT_SPACED_REGEX, NUMBER, OPERATOR, REGEX, RELATION, RESERVED, Rewriter, SHIFT, SIMPLESTR, STRICT_PROSCRIBED, TRAILING_SPACES, UNARY, WHITESPACE, compact, count, invertLiterate, key, last, locationDataToString, starts, throwSyntaxError, _ref, _ref1,
+  var BOM, BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_ALIAS_MAP, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, HEREDOC, HEREDOC_ILLEGAL, HEREDOC_INDENT, HEREGEX, HEREGEX_OMIT, IDENTIFIER, INDEXABLE, INVERSES, JSTOKEN, JS_FORBIDDEN, JS_KEYWORDS, LINE_BREAK, LINE_CONTINUER, LOGIC, Lexer, MATH, MULTILINER, MULTI_DENT, NOT_REGEX, NOT_SPACED_REGEX, NUMBER, OPERATOR, REGEX, RELATION, RESERVED, Rewriter, SHIFT, SIMPLESTR, STRICT_PROSCRIBED, TRAILING_SPACES, UNARY, WHITESPACE, compact, count, invertLiterate, key, last, locationDataToString, repeat, starts, throwSyntaxError, _ref, _ref1,
     __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
 
   _ref = require('./rewriter'), Rewriter = _ref.Rewriter, INVERSES = _ref.INVERSES;
 
-  _ref1 = require('./helpers'), count = _ref1.count, starts = _ref1.starts, compact = _ref1.compact, last = _ref1.last, invertLiterate = _ref1.invertLiterate, locationDataToString = _ref1.locationDataToString, throwSyntaxError = _ref1.throwSyntaxError;
+  _ref1 = require('./helpers'), count = _ref1.count, starts = _ref1.starts, compact = _ref1.compact, last = _ref1.last, repeat = _ref1.repeat, invertLiterate = _ref1.invertLiterate, locationDataToString = _ref1.locationDataToString, throwSyntaxError = _ref1.throwSyntaxError;
 
   exports.Lexer = Lexer = (function() {
@@ -13,5 +13,4 @@
     Lexer.prototype.tokenize = function(code, opts) {
       var consumed, i, tag, _ref2;
-
       if (opts == null) {
         opts = {};
@@ -60,5 +59,4 @@
     Lexer.prototype.identifierToken = function() {
       var colon, colonOffset, forcedIdentifier, id, idLength, input, match, poppedToken, prev, tag, tagToken, _ref2, _ref3, _ref4;
-
       if (!(match = IDENTIFIER.exec(this.chunk))) {
         return 0;
@@ -143,5 +141,4 @@
     Lexer.prototype.numberToken = function() {
       var binaryLiteral, lexedLength, match, number, octalLiteral;
-
       if (!(match = NUMBER.exec(this.chunk))) {
         return 0;
@@ -159,8 +156,8 @@
       lexedLength = number.length;
       if (octalLiteral = /^0o([0-7]+)/.exec(number)) {
-        number = '0x' + (parseInt(octalLiteral[1], 8)).toString(16);
+        number = '0x' + parseInt(octalLiteral[1], 8).toString(16);
       }
       if (binaryLiteral = /^0b([01]+)/.exec(number)) {
-        number = '0x' + (parseInt(binaryLiteral[1], 2)).toString(16);
+        number = '0x' + parseInt(binaryLiteral[1], 2).toString(16);
       }
       this.token('NUMBER', number, 0, lexedLength);
@@ -170,5 +167,4 @@
     Lexer.prototype.stringToken = function() {
       var match, octalEsc, string;
-
       switch (this.chunk.charAt(0)) {
         case "'":
@@ -203,5 +199,4 @@
     Lexer.prototype.heredocToken = function() {
       var doc, heredoc, match, quote;
-
       if (!(match = HEREDOC.exec(this.chunk))) {
         return 0;
@@ -227,5 +222,4 @@
     Lexer.prototype.commentToken = function() {
       var comment, here, match;
-
       if (!(match = this.chunk.match(COMMENT))) {
         return 0;
@@ -235,5 +229,5 @@
         this.token('HERECOMMENT', this.sanitizeHeredoc(here, {
           herecomment: true,
-          indent: Array(this.indent + 1).join(' ')
+          indent: repeat(' ', this.indent)
         }), 0, comment.length);
       }
@@ -243,5 +237,4 @@
     Lexer.prototype.jsToken = function() {
       var match, script;
-
       if (!(this.chunk.charAt(0) === '`' && (match = JSTOKEN.exec(this.chunk)))) {
         return 0;
@@ -253,5 +246,4 @@
     Lexer.prototype.regexToken = function() {
       var flags, length, match, prev, regex, _ref2, _ref3;
-
       if (this.chunk.charAt(0) !== '/') {
         return 0;
@@ -281,5 +273,4 @@
     Lexer.prototype.heregexToken = function(match) {
       var body, flags, flagsOffset, heregex, plusToken, prev, re, tag, token, tokens, value, _i, _len, _ref2, _ref3, _ref4;
-
       heregex = match[0], body = match[1], flags = match[2];
       if (0 > body.indexOf('#{')) {
@@ -335,5 +326,4 @@
     Lexer.prototype.lineToken = function() {
       var diff, indent, match, noNewlines, size;
-
       if (!(match = MULTI_DENT.exec(this.chunk))) {
         return 0;
@@ -372,5 +362,4 @@
     Lexer.prototype.outdentToken = function(moveOut, noNewlines, outdentLength) {
       var dent, len;
-
       while (moveOut > 0) {
         len = this.indents.length - 1;
@@ -405,5 +394,4 @@
     Lexer.prototype.whitespaceToken = function() {
       var match, nline, prev;
-
       if (!((match = WHITESPACE.exec(this.chunk)) || (nline = this.chunk.charAt(0) === '\n'))) {
         return 0;
@@ -439,5 +427,4 @@
     Lexer.prototype.literalToken = function() {
       var match, prev, tag, value, _ref2, _ref3, _ref4, _ref5;
-
       if (match = OPERATOR.exec(this.chunk)) {
         value = match[0];
@@ -506,5 +493,4 @@
     Lexer.prototype.sanitizeHeredoc = function(doc, options) {
       var attempt, herecomment, indent, match, _ref2;
-
       indent = options.indent, herecomment = options.herecomment;
       if (herecomment) {
@@ -534,5 +520,4 @@
     Lexer.prototype.tagParameters = function() {
       var i, stack, tok, tokens;
-
       if (this.tag() !== ')') {
         return this;
@@ -568,5 +553,4 @@
     Lexer.prototype.balancedString = function(str, end) {
       var continueCount, i, letter, match, prev, stack, _i, _ref2;
-
       continueCount = 0;
       stack = [end];
@@ -604,5 +588,4 @@
     Lexer.prototype.interpolateString = function(str, options) {
       var column, expr, heredoc, i, inner, interpolated, len, letter, lexedLength, line, locationToken, nested, offsetInChunk, pi, plusToken, popped, regex, rparen, strOffset, tag, token, tokens, value, _i, _len, _ref2, _ref3, _ref4;
-
       if (options == null) {
         options = {};
@@ -703,5 +686,4 @@
     Lexer.prototype.pair = function(tag) {
       var size, wanted;
-
       if (tag !== (wanted = last(this.ends))) {
         if ('OUTDENT' !== wanted) {
@@ -717,5 +699,4 @@
     Lexer.prototype.getLineAndColumnFromChunk = function(offset) {
       var column, lineCount, lines, string;
-
       if (offset === 0) {
         return [this.chunkLine, this.chunkColumn];
@@ -730,5 +711,5 @@
       if (lineCount > 0) {
         lines = string.split('\n');
-        column = (last(lines)).length;
+        column = last(lines).length;
       } else {
         column += string.length;
@@ -739,5 +720,4 @@
     Lexer.prototype.makeToken = function(tag, value, offsetInChunk, length) {
       var lastCharacter, locationData, token, _ref2, _ref3;
-
       if (offsetInChunk == null) {
         offsetInChunk = 0;
@@ -756,5 +736,4 @@
     Lexer.prototype.token = function(tag, value, offsetInChunk, length) {
       var token;
-
       token = this.makeToken(tag, value, offsetInChunk, length);
       this.tokens.push(token);
@@ -764,5 +743,4 @@
     Lexer.prototype.tag = function(index, tag) {
       var tok;
-
       return (tok = last(this.tokens, index)) && (tag ? tok[0] = tag : tok[0]);
     };
@@ -770,5 +748,4 @@
     Lexer.prototype.value = function(index, val) {
       var tok;
-
       return (tok = last(this.tokens, index)) && (val ? tok[1] = val : tok[1]);
     };
@@ -776,5 +753,4 @@
     Lexer.prototype.unfinished = function() {
       var _ref2;
-
       return LINE_CONTINUER.test(this.chunk) || ((_ref2 = this.tag()) === '\\' || _ref2 === '.' || _ref2 === '?.' || _ref2 === '?::' || _ref2 === 'UNARY' || _ref2 === 'MATH' || _ref2 === '+' || _ref2 === '-' || _ref2 === 'SHIFT' || _ref2 === 'RELATION' || _ref2 === 'COMPARE' || _ref2 === 'LOGIC' || _ref2 === 'THROW' || _ref2 === 'EXTENDS');
     };
@@ -828,5 +804,4 @@
   COFFEE_ALIASES = (function() {
     var _results;
-
     _results = [];
     for (key in COFFEE_ALIAS_MAP) {
@@ -902,7 +877,7 @@
   BOOL = ['TRUE', 'FALSE'];
 
-  NOT_REGEX = ['NUMBER', 'REGEX', 'BOOL', 'NULL', 'UNDEFINED', '++', '--', ']'];
-
-  NOT_SPACED_REGEX = NOT_REGEX.concat(')', '}', 'THIS', 'IDENTIFIER', 'STRING');
+  NOT_REGEX = ['NUMBER', 'REGEX', 'BOOL', 'NULL', 'UNDEFINED', '++', '--'];
+
+  NOT_SPACED_REGEX = NOT_REGEX.concat(')', '}', 'THIS', 'IDENTIFIER', 'STRING', ']');
 
   CALLABLE = ['IDENTIFIER', 'STRING', 'REGEX', ')', ']', '}', '?', '::', '@', 'THIS', 'SUPER'];
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/nodes.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/nodes.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/nodes.js	(revision 516)
@@ -1,3 +1,3 @@
-// Generated by CoffeeScript 1.6.2
+// Generated by CoffeeScript 1.6.3
 (function() {
   var Access, Arr, Assign, Base, Block, Call, Class, Closure, Code, CodeFragment, Comment, Existence, Extends, For, IDENTIFIER, IDENTIFIER_STR, IS_STRING, If, In, Index, LEVEL_ACCESS, LEVEL_COND, LEVEL_LIST, LEVEL_OP, LEVEL_PAREN, LEVEL_TOP, Literal, METHOD_DEF, NEGATE, NO, Obj, Op, Param, Parens, RESERVED, Range, Return, SIMPLENUM, STRICT_PROSCRIBED, Scope, Slice, Splat, Switch, TAB, THIS, Throw, Try, UTILITIES, Value, While, YES, addLocationDataFn, compact, del, ends, extend, flatten, fragmentsToText, last, locationDataToString, merge, multident, some, starts, throwSyntaxError, unfoldSoak, utility, _ref, _ref1, _ref2, _ref3,
@@ -39,5 +39,4 @@
     function CodeFragment(parent, code) {
       var _ref2;
-
       this.code = "" + code;
       this.locationData = parent != null ? parent.locationData : void 0;
@@ -46,5 +45,5 @@
 
     CodeFragment.prototype.toString = function() {
-      return "" + this.code + [this.locationData ? ": " + locationDataToString(this.locationData) : void 0];
+      return "" + this.code + (this.locationData ? ": " + locationDataToString(this.locationData) : '');
     };
 
@@ -55,8 +54,6 @@
   fragmentsToText = function(fragments) {
     var fragment;
-
     return ((function() {
       var _i, _len, _results;
-
       _results = [];
       for (_i = 0, _len = fragments.length; _i < _len; _i++) {
@@ -77,5 +74,4 @@
     Base.prototype.compileToFragments = function(o, lvl) {
       var node;
-
       o = extend({}, o);
       if (lvl) {
@@ -93,5 +89,4 @@
     Base.prototype.compileClosure = function(o) {
       var jumpNode;
-
       if (jumpNode = this.jumps()) {
         jumpNode.error('cannot use a pure statement in an expression');
@@ -103,5 +98,4 @@
     Base.prototype.cache = function(o, level, reused) {
       var ref, sub;
-
       if (!this.isComplex()) {
         ref = level ? this.compileToFragments(o, level) : this;
@@ -124,5 +118,4 @@
     Base.prototype.makeReturn = function(res) {
       var me;
-
       me = this.unwrapAll();
       if (res) {
@@ -135,5 +128,4 @@
     Base.prototype.contains = function(pred) {
       var node;
-
       node = void 0;
       this.traverseChildren(false, function(n) {
@@ -148,5 +140,4 @@
     Base.prototype.lastNonComment = function(list) {
       var i;
-
       i = list.length;
       while (i--) {
@@ -160,5 +151,4 @@
     Base.prototype.toString = function(idt, name) {
       var tree;
-
       if (idt == null) {
         idt = '';
@@ -179,5 +169,4 @@
     Base.prototype.eachChild = function(func) {
       var attr, child, _i, _j, _len, _len1, _ref2, _ref3;
-
       if (!this.children) {
         return this;
@@ -201,8 +190,9 @@
     Base.prototype.traverseChildren = function(crossScope, func) {
       return this.eachChild(function(child) {
-        if (func(child) === false) {
-          return false;
-        }
-        return child.traverseChildren(crossScope, func);
+        var recur;
+        recur = func(child);
+        if (recur !== false) {
+          return child.traverseChildren(crossScope, func);
+        }
       });
     };
@@ -214,5 +204,4 @@
     Base.prototype.unwrapAll = function() {
       var node;
-
       node = this;
       while (node !== (node = node.unwrap())) {
@@ -261,5 +250,4 @@
     Base.prototype.joinFragmentArrays = function(fragmentsList, joinStr) {
       var answer, fragments, i, _i, _len;
-
       answer = [];
       for (i = _i = 0, _len = fragmentsList.length; _i < _len; i = ++_i) {
@@ -314,5 +302,4 @@
     Block.prototype.isStatement = function(o) {
       var exp, _i, _len, _ref2;
-
       _ref2 = this.expressions;
       for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
@@ -327,5 +314,4 @@
     Block.prototype.jumps = function(o) {
       var exp, _i, _len, _ref2;
-
       _ref2 = this.expressions;
       for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
@@ -339,5 +325,4 @@
     Block.prototype.makeReturn = function(res) {
       var expr, len;
-
       len = this.expressions.length;
       while (len--) {
@@ -367,5 +352,4 @@
     Block.prototype.compileNode = function(o) {
       var answer, compiledNodes, fragments, index, node, top, _i, _len, _ref2;
-
       this.tab = o.indent;
       top = o.level === LEVEL_TOP;
@@ -411,5 +395,4 @@
     Block.prototype.compileRoot = function(o) {
       var exp, fragments, i, name, prelude, preludeExps, rest, _i, _len, _ref2;
-
       o.indent = o.bare ? '' : TAB;
       o.level = LEVEL_TOP;
@@ -425,5 +408,4 @@
         preludeExps = (function() {
           var _j, _len1, _ref3, _results;
-
           _ref3 = this.expressions;
           _results = [];
@@ -456,5 +438,4 @@
     Block.prototype.compileWithDeclarations = function(o) {
       var assigns, declars, exp, fragments, i, post, rest, scope, spaced, _i, _len, _ref2, _ref3, _ref4;
-
       fragments = [];
       post = [];
@@ -495,5 +476,7 @@
             fragments.push(this.makeCode(scope.assignedVariables().join(",\n" + (this.tab + TAB))));
           }
-          fragments.push(this.makeCode(';\n\n'));
+          fragments.push(this.makeCode(";\n" + (this.spaced ? '\n' : '')));
+        } else if (fragments.length && post.length) {
+          fragments.push(this.makeCode("\n"));
         }
       }
@@ -533,5 +516,4 @@
     Literal.prototype.isStatement = function() {
       var _ref2;
-
       return (_ref2 = this.value) === 'break' || _ref2 === 'continue' || _ref2 === 'debugger';
     };
@@ -554,5 +536,4 @@
     Literal.prototype.compileNode = function(o) {
       var answer, code, _ref2;
-
       code = this.value === 'this' ? ((_ref2 = o.scope.method) != null ? _ref2.bound : void 0) ? o.scope.method.context : this.value : this.value.reserved ? "\"" + this.value + "\"" : this.value;
       answer = this.isStatement() ? "" + this.tab + code + ";" : code;
@@ -646,5 +627,4 @@
     Return.prototype.compileToFragments = function(o, level) {
       var expr, _ref4;
-
       expr = (_ref4 = this.expression) != null ? _ref4.makeReturn() : void 0;
       if (expr && !(expr instanceof Return)) {
@@ -657,7 +637,6 @@
     Return.prototype.compileNode = function(o) {
       var answer;
-
       answer = [];
-      answer.push(this.makeCode(this.tab + ("return" + [this.expression ? " " : void 0])));
+      answer.push(this.makeCode(this.tab + ("return" + (this.expression ? " " : ""))));
       if (this.expression) {
         answer = answer.concat(this.expression.compileToFragments(o, LEVEL_PAREN));
@@ -719,5 +698,4 @@
     Value.prototype.isAtomic = function() {
       var node, _i, _len, _ref4;
-
       _ref4 = this.properties.concat(this.base);
       for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
@@ -763,5 +741,4 @@
     Value.prototype.cacheReference = function(o) {
       var base, bref, name, nref;
-
       name = last(this.properties);
       if (this.properties.length < 2 && !this.base.isComplex() && !(name != null ? name.isComplex() : void 0)) {
@@ -786,5 +763,4 @@
     Value.prototype.compileNode = function(o) {
       var fragments, prop, props, _i, _len;
-
       this.base.front = this.front;
       props = this.properties;
@@ -801,17 +777,14 @@
 
     Value.prototype.unfoldSoak = function(o) {
-      var _ref4,
-        _this = this;
-
-      return (_ref4 = this.unfoldedSoak) != null ? _ref4 : this.unfoldedSoak = (function() {
-        var fst, i, ifn, prop, ref, snd, _i, _len, _ref5, _ref6;
-
+      var _this = this;
+      return this.unfoldedSoak != null ? this.unfoldedSoak : this.unfoldedSoak = (function() {
+        var fst, i, ifn, prop, ref, snd, _i, _len, _ref4, _ref5;
         if (ifn = _this.base.unfoldSoak(o)) {
-          (_ref5 = ifn.body.properties).push.apply(_ref5, _this.properties);
+          (_ref4 = ifn.body.properties).push.apply(_ref4, _this.properties);
           return ifn;
         }
-        _ref6 = _this.properties;
-        for (i = _i = 0, _len = _ref6.length; _i < _len; i = ++_i) {
-          prop = _ref6[i];
+        _ref5 = _this.properties;
+        for (i = _i = 0, _len = _ref5.length; _i < _len; i = ++_i) {
+          prop = _ref5[i];
           if (!prop.soak) {
             continue;
@@ -850,6 +823,5 @@
     Comment.prototype.compileNode = function(o, level) {
       var code;
-
-      code = '/*' + multident(this.comment, this.tab) + ("\n" + this.tab + "*/\n");
+      code = "/*" + (multident(this.comment, this.tab)) + (__indexOf.call(this.comment, '\n') >= 0 ? "\n" + this.tab : '') + "*/\n";
       if ((level || o.level) === LEVEL_TOP) {
         code = o.indent + code;
@@ -877,5 +849,4 @@
     Call.prototype.newInstance = function() {
       var base, _ref4;
-
       base = ((_ref4 = this.variable) != null ? _ref4.base : void 0) || this.variable;
       if (base instanceof Call && !base.isNew) {
@@ -889,5 +860,4 @@
     Call.prototype.superReference = function(o) {
       var accesses, method;
-
       method = o.scope.namedMethod();
       if (method != null ? method.klass : void 0) {
@@ -907,5 +877,4 @@
     Call.prototype.superThis = function(o) {
       var method;
-
       method = o.scope.method;
       return (method && !method.klass && method.context) || "this";
@@ -914,5 +883,4 @@
     Call.prototype.unfoldSoak = function(o) {
       var call, ifn, left, list, rite, _i, _len, _ref4, _ref5;
-
       if (this.soak) {
         if (this.variable) {
@@ -965,5 +933,4 @@
     Call.prototype.compileNode = function(o) {
       var arg, argIndex, compiledArgs, compiledArray, fragments, preface, _i, _len, _ref4, _ref5;
-
       if ((_ref4 = this.variable) != null) {
         _ref4.front = this.front;
@@ -1003,5 +970,4 @@
     Call.prototype.compileSplat = function(o, splatArgs) {
       var answer, base, fun, idt, name, ref;
-
       if (this.isSuper) {
         return [].concat(this.makeCode("" + (this.superReference(o)) + ".apply(" + (this.superThis(o)) + ", "), splatArgs, this.makeCode(")"));
@@ -1067,5 +1033,4 @@
     Access.prototype.compileToFragments = function(o) {
       var name;
-
       name = this.name.compileToFragments(o);
       if (IDENTIFIER.test(fragmentsToText(name))) {
@@ -1119,5 +1084,4 @@
     Range.prototype.compileVariables = function(o) {
       var step, _ref4, _ref5, _ref6, _ref7;
-
       o = merge(o, {
         top: true
@@ -1136,5 +1100,4 @@
     Range.prototype.compileNode = function(o) {
       var cond, condPart, from, gt, idx, idxName, known, lt, namedIndex, stepPart, to, varPart, _ref4, _ref5;
-
       if (!this.fromVar) {
         this.compileVariables(o);
@@ -1168,5 +1131,4 @@
     Range.prototype.compileArray = function(o) {
       var args, body, cond, hasArgs, i, idt, post, pre, range, result, vars, _i, _ref4, _ref5, _results;
-
       if (this.fromNum && this.toNum && Math.abs(this.fromNum - this.toNum) <= 20) {
         range = (function() {
@@ -1220,5 +1182,4 @@
     Slice.prototype.compileNode = function(o) {
       var compiled, compiledText, from, fromCompiled, to, toStr, _ref4;
-
       _ref4 = this.range, to = _ref4.to, from = _ref4.from;
       fromCompiled = from && from.compileToFragments(o, LEVEL_PAREN) || [this.makeCode('0')];
@@ -1249,5 +1210,4 @@
     Obj.prototype.compileNode = function(o) {
       var answer, i, idt, indent, join, lastNoncom, node, prop, props, _i, _j, _len, _len1;
-
       props = this.properties;
       if (!props.length) {
@@ -1270,5 +1230,5 @@
         indent = prop instanceof Comment ? '' : idt;
         if (prop instanceof Assign && prop.variable instanceof Value && prop.variable.hasProperties()) {
-          throw new SyntaxError('Invalid object key');
+          prop.variable.error('Invalid object key');
         }
         if (prop instanceof Value && prop["this"]) {
@@ -1300,5 +1260,4 @@
     Obj.prototype.assigns = function(name) {
       var prop, _i, _len, _ref4;
-
       _ref4 = this.properties;
       for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
@@ -1326,5 +1285,4 @@
     Arr.prototype.compileNode = function(o) {
       var answer, compiledObjs, fragments, index, obj, _i, _len;
-
       if (!this.objects.length) {
         return [this.makeCode('[]')];
@@ -1338,5 +1296,4 @@
       compiledObjs = (function() {
         var _i, _len, _ref4, _results;
-
         _ref4 = this.objects;
         _results = [];
@@ -1354,5 +1311,5 @@
         answer.push.apply(answer, fragments);
       }
-      if ((fragmentsToText(answer)).indexOf('\n') >= 0) {
+      if (fragmentsToText(answer).indexOf('\n') >= 0) {
         answer.unshift(this.makeCode("[\n" + o.indent));
         answer.push(this.makeCode("\n" + this.tab + "]"));
@@ -1366,5 +1323,4 @@
     Arr.prototype.assigns = function(name) {
       var obj, _i, _len, _ref4;
-
       _ref4 = this.objects;
       for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
@@ -1396,5 +1352,4 @@
     Class.prototype.determineName = function() {
       var decl, tail;
-
       if (!this.variable) {
         return null;
@@ -1425,5 +1380,4 @@
     Class.prototype.addBoundFunctions = function(o) {
       var bvar, lhs, _i, _len, _ref4;
-
       _ref4 = this.boundFuncs;
       for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
@@ -1436,9 +1390,7 @@
     Class.prototype.addProperties = function(node, name, o) {
       var assign, base, exprs, func, props;
-
       props = node.base.properties.slice(0);
       exprs = (function() {
         var _results;
-
         _results = [];
         while (assign = props.shift()) {
@@ -1484,8 +1436,6 @@
     Class.prototype.walkBody = function(name, o) {
       var _this = this;
-
       return this.traverseChildren(false, function(child) {
         var cont, exps, i, node, _i, _len, _ref4;
-
         cont = true;
         if (child instanceof Class) {
@@ -1509,5 +1459,4 @@
     Class.prototype.hoistDirectivePrologue = function() {
       var expressions, index, node;
-
       index = 0;
       expressions = this.body.expressions;
@@ -1520,5 +1469,4 @@
     Class.prototype.ensureConstructor = function(name, o) {
       var missing, ref, superCall;
-
       missing = !this.ctor;
       this.ctor || (this.ctor = new Code);
@@ -1550,5 +1498,4 @@
     Class.prototype.compileNode = function(o) {
       var call, decl, klass, lname, name, params, _ref4;
-
       decl = this.determineName();
       name = decl || '_Class';
@@ -1591,5 +1538,4 @@
     function Assign(variable, value, context, options) {
       var forbidden, name, _ref4;
-
       this.variable = variable;
       this.value = value;
@@ -1619,5 +1565,4 @@
     Assign.prototype.compileNode = function(o) {
       var answer, compiledName, isValue, match, name, val, varBase, _ref4, _ref5, _ref6, _ref7;
-
       if (isValue = this.variable instanceof Value) {
         if (this.variable.isArray() || this.variable.isObject()) {
@@ -1666,5 +1611,4 @@
     Assign.prototype.compilePatternMatch = function(o) {
       var acc, assigns, code, fragments, i, idx, isObject, ivar, name, obj, objects, olen, ref, rest, splat, top, val, value, vvar, vvarText, _i, _len, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9;
-
       top = o.level === LEVEL_TOP;
       value = this.value;
@@ -1764,5 +1708,4 @@
     Assign.prototype.compileConditional = function(o) {
       var left, right, _ref4;
-
       _ref4 = this.variable.cacheReference(o), left = _ref4[0], right = _ref4[1];
       if (!left.properties.length && left.base instanceof Literal && left.base.value !== "this" && !o.scope.check(left.base.value)) {
@@ -1777,5 +1720,4 @@
     Assign.prototype.compileSplice = function(o) {
       var answer, exclusive, from, fromDecl, fromRef, name, to, valDef, valRef, _ref4, _ref5, _ref6;
-
       _ref4 = this.variable.properties.pop().range, from = _ref4.from, to = _ref4.to, exclusive = _ref4.exclusive;
       name = this.variable.compile(o);
@@ -1835,5 +1777,4 @@
     Code.prototype.compileNode = function(o) {
       var answer, code, exprs, i, idt, lit, p, param, params, ref, splats, uniqs, val, wasEmpty, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _m, _ref4, _ref5, _ref6, _ref7, _ref8;
-
       o.scope = new Scope(o.scope, this.body, this);
       o.scope.shared = del(o, 'sharedScope');
@@ -1866,5 +1807,4 @@
         splats = new Assign(new Value(new Arr((function() {
           var _k, _len2, _ref6, _results;
-
           _ref6 = this.params;
           _results = [];
@@ -1960,5 +1900,4 @@
     Code.prototype.eachParamName = function(iterator) {
       var param, _i, _len, _ref4, _results;
-
       _ref4 = this.params;
       _results = [];
@@ -1985,5 +1924,4 @@
     function Param(name, value, splat) {
       var _ref4;
-
       this.name = name;
       this.value = value;
@@ -2002,5 +1940,4 @@
     Param.prototype.asReference = function(o) {
       var node;
-
       if (this.reference) {
         return this.reference;
@@ -2028,5 +1965,4 @@
     Param.prototype.eachName = function(iterator, name) {
       var atParam, node, obj, _i, _len, _ref4;
-
       if (name == null) {
         name = this.name;
@@ -2034,5 +1970,4 @@
       atParam = function(obj) {
         var node;
-
         node = obj.properties[0].name;
         if (!node.value.reserved) {
@@ -2097,5 +2032,4 @@
     Splat.compileSplattedArray = function(o, list, apply) {
       var args, base, compiledNode, concatPart, fragments, i, index, node, _i, _len;
-
       index = -1;
       while ((node = list[++index]) && !(node instanceof Splat)) {
@@ -2126,5 +2060,4 @@
       base = (function() {
         var _j, _len1, _ref4, _results;
-
         _ref4 = list.slice(0, index);
         _results = [];
@@ -2174,5 +2107,4 @@
     While.prototype.jumps = function() {
       var expressions, node, _i, _len;
-
       expressions = this.body.expressions;
       if (!expressions.length) {
@@ -2192,10 +2124,9 @@
     While.prototype.compileNode = function(o) {
       var answer, body, rvar, set;
-
       o.indent += TAB;
       set = '';
       body = this.body;
       if (body.isEmpty()) {
-        body = '';
+        body = this.makeCode('');
       } else {
         if (this.returns) {
@@ -2273,5 +2204,4 @@
     Op.prototype.isComplex = function() {
       var _ref4;
-
       return !(this.isUnary() && ((_ref4 = this.operator) === '+' || _ref4 === '-')) || this.first.isComplex();
     };
@@ -2279,5 +2209,4 @@
     Op.prototype.isChainable = function() {
       var _ref4;
-
       return (_ref4 = this.operator) === '<' || _ref4 === '>' || _ref4 === '>=' || _ref4 === '<=' || _ref4 === '===' || _ref4 === '!==';
     };
@@ -2285,5 +2214,4 @@
     Op.prototype.invert = function() {
       var allInvertable, curr, fst, op, _ref4;
-
       if (this.isChainable() && this.first.isChainable()) {
         allInvertable = true;
@@ -2320,5 +2248,4 @@
     Op.prototype.unfoldSoak = function(o) {
       var _ref4;
-
       return ((_ref4 = this.operator) === '++' || _ref4 === '--' || _ref4 === 'delete') && unfoldSoak(o, this, 'first');
     };
@@ -2326,5 +2253,4 @@
     Op.prototype.generateDo = function(exp) {
       var call, func, param, passedParams, ref, _i, _len, _ref4;
-
       passedParams = [];
       func = exp instanceof Assign && (ref = exp.value.unwrap()) instanceof Code ? ref : exp;
@@ -2346,5 +2272,4 @@
     Op.prototype.compileNode = function(o) {
       var answer, isChain, _ref4, _ref5;
-
       isChain = this.isChainable() && this.first.isChainable();
       if (!isChain) {
@@ -2376,5 +2301,4 @@
     Op.prototype.compileChain = function(o) {
       var fragments, fst, shared, _ref4;
-
       _ref4 = this.first.second.cache(o), this.first.second = _ref4[0], shared = _ref4[1];
       fst = this.first.compileToFragments(o, LEVEL_OP);
@@ -2385,6 +2309,5 @@
     Op.prototype.compileExistence = function(o) {
       var fst, ref;
-
-      if (this.first.isComplex()) {
+      if (!o.isExistentialEquals && this.first.isComplex()) {
         ref = new Literal(o.scope.freeVariable('ref'));
         fst = new Parens(new Assign(ref, this.first));
@@ -2400,5 +2323,4 @@
     Op.prototype.compileUnary = function(o) {
       var op, parts, plusMinus;
-
       parts = [];
       op = this.operator;
@@ -2447,5 +2369,4 @@
     In.prototype.compileNode = function(o) {
       var hasSplat, obj, _i, _len, _ref4;
-
       if (this.array instanceof Value && this.array.isArray()) {
         _ref4 = this.array.base.objects;
@@ -2467,5 +2388,4 @@
     In.prototype.compileOrTest = function(o) {
       var cmp, cnj, i, item, ref, sub, tests, _i, _len, _ref4, _ref5, _ref6;
-
       if (this.array.base.objects.length === 0) {
         return [this.makeCode("" + (!!this.negated))];
@@ -2491,8 +2411,7 @@
     In.prototype.compileLoopTest = function(o) {
       var fragments, ref, sub, _ref4;
-
       _ref4 = this.object.cache(o, LEVEL_LIST), sub = _ref4[0], ref = _ref4[1];
       fragments = [].concat(this.makeCode(utility('indexOf') + ".call("), this.array.compileToFragments(o, LEVEL_LIST), this.makeCode(", "), ref, this.makeCode(") " + (this.negated ? '< 0' : '>= 0')));
-      if ((fragmentsToText(sub)) === (fragmentsToText(ref))) {
+      if (fragmentsToText(sub) === fragmentsToText(ref)) {
         return fragments;
       }
@@ -2529,5 +2448,4 @@
     Try.prototype.jumps = function(o) {
       var _ref4;
-
       return this.attempt.jumps(o) || ((_ref4 = this.recovery) != null ? _ref4.jumps(o) : void 0);
     };
@@ -2544,9 +2462,8 @@
 
     Try.prototype.compileNode = function(o) {
-      var catchPart, ensurePart, placeholder, tryPart, _ref4;
-
+      var catchPart, ensurePart, placeholder, tryPart;
       o.indent += TAB;
       tryPart = this.attempt.compileToFragments(o, LEVEL_TOP);
-      catchPart = this.recovery ? (placeholder = new Literal('_error'), this.recovery.unshift(new Assign(this.errorVariable, placeholder)), this.errorVariable = placeholder, (_ref4 = this.errorVariable.value, __indexOf.call(STRICT_PROSCRIBED, _ref4) >= 0) ? this.errorVariable.error("catch variable may not be \"" + this.errorVariable.value + "\"") : void 0, [].concat(this.makeCode(" catch ("), this.errorVariable.compileToFragments(o), this.makeCode(") {\n"), this.recovery.compileToFragments(o, LEVEL_TOP), this.makeCode("\n" + this.tab + "}"))) : !(this.ensure || this.recovery) ? [this.makeCode(' catch (_error) {}')] : [];
+      catchPart = this.recovery ? (placeholder = new Literal('_error'), this.errorVariable ? this.recovery.unshift(new Assign(this.errorVariable, placeholder)) : void 0, [].concat(this.makeCode(" catch ("), placeholder.compileToFragments(o), this.makeCode(") {\n"), this.recovery.compileToFragments(o, LEVEL_TOP), this.makeCode("\n" + this.tab + "}"))) : !(this.ensure || this.recovery) ? [this.makeCode(' catch (_error) {}')] : [];
       ensurePart = this.ensure ? [].concat(this.makeCode(" finally {\n"), this.ensure.compileToFragments(o, LEVEL_TOP), this.makeCode("\n" + this.tab + "}")) : [];
       return [].concat(this.makeCode("" + this.tab + "try {\n"), tryPart, this.makeCode("\n" + this.tab + "}"), catchPart, ensurePart);
@@ -2593,5 +2510,4 @@
     Existence.prototype.compileNode = function(o) {
       var cmp, cnj, code, _ref4;
-
       this.expression.front = this.front;
       code = this.expression.compile(o, LEVEL_OP);
@@ -2628,5 +2544,4 @@
     Parens.prototype.compileNode = function(o) {
       var bare, expr, fragments;
-
       expr = this.body.unwrap();
       if (expr instanceof Value && expr.isAtomic()) {
@@ -2652,5 +2567,4 @@
     function For(body, source) {
       var _ref4;
-
       this.source = source.source, this.guard = source.guard, this.step = source.step, this.name = source.name, this.index = source.index;
       this.body = Block.wrap([body]);
@@ -2671,4 +2585,7 @@
         this.name.error('cannot pattern match over range loops');
       }
+      if (this.own && !this.object) {
+        this.index.error('cannot use own with for-in');
+      }
       this.returns = false;
     }
@@ -2678,5 +2595,4 @@
     For.prototype.compileNode = function(o) {
       var body, bodyFragments, compare, compareDown, declare, declareDown, defPart, defPartFragments, down, forPartFragments, guardPart, idt1, increment, index, ivar, kvar, kvarAssign, lastJumps, lvar, name, namePart, ref, resultPart, returnResult, rvar, scope, source, step, stepNum, stepVar, svar, varPart, _ref4, _ref5;
-
       body = Block.wrap([this.body]);
       lastJumps = (_ref4 = last(body.expressions)) != null ? _ref4.jumps() : void 0;
@@ -2792,5 +2708,4 @@
     For.prototype.pluckDirectCall = function(o, body) {
       var base, defs, expr, fn, idx, ref, val, _i, _len, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9;
-
       defs = [];
       _ref4 = body.expressions;
@@ -2836,5 +2751,4 @@
     Switch.prototype.jumps = function(o) {
       var block, conds, _i, _len, _ref4, _ref5, _ref6;
-
       if (o == null) {
         o = {
@@ -2854,5 +2768,4 @@
     Switch.prototype.makeReturn = function(res) {
       var pair, _i, _len, _ref4, _ref5;
-
       _ref4 = this.cases;
       for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
@@ -2871,5 +2784,4 @@
     Switch.prototype.compileNode = function(o) {
       var block, body, cond, conditions, expr, fragments, i, idt1, idt2, _i, _j, _len, _len1, _ref4, _ref5, _ref6;
-
       idt1 = o.indent + TAB;
       idt2 = o.indent = idt1 + TAB;
@@ -2927,5 +2839,4 @@
     If.prototype.bodyNode = function() {
       var _ref4;
-
       return (_ref4 = this.body) != null ? _ref4.unwrap() : void 0;
     };
@@ -2933,5 +2844,4 @@
     If.prototype.elseBodyNode = function() {
       var _ref4;
-
       return (_ref4 = this.elseBody) != null ? _ref4.unwrap() : void 0;
     };
@@ -2949,5 +2859,4 @@
     If.prototype.isStatement = function(o) {
       var _ref4;
-
       return (o != null ? o.level : void 0) === LEVEL_TOP || this.bodyNode().isStatement(o) || ((_ref4 = this.elseBodyNode()) != null ? _ref4.isStatement(o) : void 0);
     };
@@ -2955,5 +2864,4 @@
     If.prototype.jumps = function(o) {
       var _ref4;
-
       return this.body.jumps(o) || ((_ref4 = this.elseBody) != null ? _ref4.jumps(o) : void 0);
     };
@@ -2986,5 +2894,4 @@
     If.prototype.compileStatement = function(o) {
       var answer, body, child, cond, exeq, ifPart, indent;
-
       child = del(o, 'chainChild');
       exeq = del(o, 'isExistentialEquals');
@@ -3020,5 +2927,4 @@
     If.prototype.compileExpression = function(o) {
       var alt, body, cond, fragments;
-
       cond = this.condition.compileToFragments(o, LEVEL_COND);
       body = this.bodyNode().compileToFragments(o, LEVEL_LIST);
@@ -3043,5 +2949,4 @@
     wrap: function(expressions, statement, noReturn) {
       var args, argumentsNode, call, func, meth;
-
       if (expressions.jumps()) {
         return expressions;
@@ -3079,5 +2984,4 @@
   unfoldSoak = function(o, parent, name) {
     var ifn;
-
     if (!(ifn = parent[name].unfoldSoak(o))) {
       return;
@@ -3132,5 +3036,4 @@
   utility = function(name) {
     var ref;
-
     ref = "__" + name;
     Scope.root.assign(ref, UTILITIES[name]());
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/optparse.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/optparse.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/optparse.js	(revision 516)
@@ -1,5 +1,7 @@
-// Generated by CoffeeScript 1.6.2
+// Generated by CoffeeScript 1.6.3
 (function() {
-  var LONG_FLAG, MULTI_FLAG, OPTIONAL, OptionParser, SHORT_FLAG, buildRule, buildRules, normalizeArguments;
+  var LONG_FLAG, MULTI_FLAG, OPTIONAL, OptionParser, SHORT_FLAG, buildRule, buildRules, normalizeArguments, repeat;
+
+  repeat = require('./helpers').repeat;
 
   exports.OptionParser = OptionParser = (function() {
@@ -11,5 +13,4 @@
     OptionParser.prototype.parse = function(args) {
       var arg, i, isOption, matchedRule, options, originalArgs, pos, rule, seenNonOptionArg, skippingArgument, value, _i, _j, _len, _len1, _ref;
-
       options = {
         "arguments": []
@@ -60,5 +61,4 @@
     OptionParser.prototype.help = function() {
       var letPart, lines, rule, spaces, _i, _len, _ref;
-
       lines = [];
       if (this.banner) {
@@ -69,5 +69,5 @@
         rule = _ref[_i];
         spaces = 15 - rule.longFlag.length;
-        spaces = spaces > 0 ? Array(spaces + 1).join(' ') : '';
+        spaces = spaces > 0 ? repeat(' ', spaces) : '';
         letPart = rule.shortFlag ? rule.shortFlag + ', ' : '    ';
         lines.push('  ' + letPart + rule.longFlag + spaces + rule.description);
@@ -90,5 +90,4 @@
   buildRules = function(rules) {
     var tuple, _i, _len, _results;
-
     _results = [];
     for (_i = 0, _len = rules.length; _i < _len; _i++) {
@@ -104,5 +103,4 @@
   buildRule = function(shortFlag, longFlag, description, options) {
     var match;
-
     if (options == null) {
       options = {};
@@ -122,5 +120,4 @@
   normalizeArguments = function(args) {
     var arg, l, match, result, _i, _j, _len, _len1, _ref;
-
     args = args.slice(0);
     result = [];
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/parser.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/parser.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/parser.js	(revision 516)
@@ -5,5 +5,5 @@
 symbols_: {"error":2,"Root":3,"Body":4,"Block":5,"TERMINATOR":6,"Line":7,"Expression":8,"Statement":9,"Return":10,"Comment":11,"STATEMENT":12,"Value":13,"Invocation":14,"Code":15,"Operation":16,"Assign":17,"If":18,"Try":19,"While":20,"For":21,"Switch":22,"Class":23,"Throw":24,"INDENT":25,"OUTDENT":26,"Identifier":27,"IDENTIFIER":28,"AlphaNumeric":29,"NUMBER":30,"STRING":31,"Literal":32,"JS":33,"REGEX":34,"DEBUGGER":35,"UNDEFINED":36,"NULL":37,"BOOL":38,"Assignable":39,"=":40,"AssignObj":41,"ObjAssignable":42,":":43,"ThisProperty":44,"RETURN":45,"HERECOMMENT":46,"PARAM_START":47,"ParamList":48,"PARAM_END":49,"FuncGlyph":50,"->":51,"=>":52,"OptComma":53,",":54,"Param":55,"ParamVar":56,"...":57,"Array":58,"Object":59,"Splat":60,"SimpleAssignable":61,"Accessor":62,"Parenthetical":63,"Range":64,"This":65,".":66,"?.":67,"::":68,"?::":69,"Index":70,"INDEX_START":71,"IndexValue":72,"INDEX_END":73,"INDEX_SOAK":74,"Slice":75,"{":76,"AssignList":77,"}":78,"CLASS":79,"EXTENDS":80,"OptFuncExist":81,"Arguments":82,"SUPER":83,"FUNC_EXIST":84,"CALL_START":85,"CALL_END":86,"ArgList":87,"THIS":88,"@":89,"[":90,"]":91,"RangeDots":92,"..":93,"Arg":94,"SimpleArgs":95,"TRY":96,"Catch":97,"FINALLY":98,"CATCH":99,"THROW":100,"(":101,")":102,"WhileSource":103,"WHILE":104,"WHEN":105,"UNTIL":106,"Loop":107,"LOOP":108,"ForBody":109,"FOR":110,"ForStart":111,"ForSource":112,"ForVariables":113,"OWN":114,"ForValue":115,"FORIN":116,"FOROF":117,"BY":118,"SWITCH":119,"Whens":120,"ELSE":121,"When":122,"LEADING_WHEN":123,"IfBlock":124,"IF":125,"POST_IF":126,"UNARY":127,"-":128,"+":129,"--":130,"++":131,"?":132,"MATH":133,"SHIFT":134,"COMPARE":135,"LOGIC":136,"RELATION":137,"COMPOUND_ASSIGN":138,"$accept":0,"$end":1},
 terminals_: {2:"error",6:"TERMINATOR",12:"STATEMENT",25:"INDENT",26:"OUTDENT",28:"IDENTIFIER",30:"NUMBER",31:"STRING",33:"JS",34:"REGEX",35:"DEBUGGER",36:"UNDEFINED",37:"NULL",38:"BOOL",40:"=",43:":",45:"RETURN",46:"HERECOMMENT",47:"PARAM_START",49:"PARAM_END",51:"->",52:"=>",54:",",57:"...",66:".",67:"?.",68:"::",69:"?::",71:"INDEX_START",73:"INDEX_END",74:"INDEX_SOAK",76:"{",78:"}",79:"CLASS",80:"EXTENDS",83:"SUPER",84:"FUNC_EXIST",85:"CALL_START",86:"CALL_END",88:"THIS",89:"@",90:"[",91:"]",93:"..",96:"TRY",98:"FINALLY",99:"CATCH",100:"THROW",101:"(",102:")",104:"WHILE",105:"WHEN",106:"UNTIL",108:"LOOP",110:"FOR",114:"OWN",116:"FORIN",117:"FOROF",118:"BY",119:"SWITCH",121:"ELSE",123:"LEADING_WHEN",125:"IF",126:"POST_IF",127:"UNARY",128:"-",129:"+",130:"--",131:"++",132:"?",133:"MATH",134:"SHIFT",135:"COMPARE",136:"LOGIC",137:"RELATION",138:"COMPOUND_ASSIGN"},
-productions_: [0,[3,0],[3,1],[3,2],[4,1],[4,3],[4,2],[7,1],[7,1],[9,1],[9,1],[9,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[5,2],[5,3],[27,1],[29,1],[29,1],[32,1],[32,1],[32,1],[32,1],[32,1],[32,1],[32,1],[17,3],[17,4],[17,5],[41,1],[41,3],[41,5],[41,1],[42,1],[42,1],[42,1],[10,2],[10,1],[11,1],[15,5],[15,2],[50,1],[50,1],[53,0],[53,1],[48,0],[48,1],[48,3],[48,4],[48,6],[55,1],[55,2],[55,3],[56,1],[56,1],[56,1],[56,1],[60,2],[61,1],[61,2],[61,2],[61,1],[39,1],[39,1],[39,1],[13,1],[13,1],[13,1],[13,1],[13,1],[62,2],[62,2],[62,2],[62,2],[62,1],[62,1],[70,3],[70,2],[72,1],[72,1],[59,4],[77,0],[77,1],[77,3],[77,4],[77,6],[23,1],[23,2],[23,3],[23,4],[23,2],[23,3],[23,4],[23,5],[14,3],[14,3],[14,1],[14,2],[81,0],[81,1],[82,2],[82,4],[65,1],[65,1],[44,2],[58,2],[58,4],[92,1],[92,1],[64,5],[75,3],[75,2],[75,2],[75,1],[87,1],[87,3],[87,4],[87,4],[87,6],[94,1],[94,1],[95,1],[95,3],[19,2],[19,3],[19,4],[19,5],[97,3],[97,3],[24,2],[63,3],[63,5],[103,2],[103,4],[103,2],[103,4],[20,2],[20,2],[20,2],[20,1],[107,2],[107,2],[21,2],[21,2],[21,2],[109,2],[109,2],[111,2],[111,3],[115,1],[115,1],[115,1],[115,1],[113,1],[113,3],[112,2],[112,2],[112,4],[112,4],[112,4],[112,6],[112,6],[22,5],[22,7],[22,4],[22,6],[120,1],[120,2],[122,3],[122,4],[124,3],[124,5],[18,1],[18,3],[18,3],[18,3],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,5],[16,4],[16,3]],
+productions_: [0,[3,0],[3,1],[3,2],[4,1],[4,3],[4,2],[7,1],[7,1],[9,1],[9,1],[9,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[5,2],[5,3],[27,1],[29,1],[29,1],[32,1],[32,1],[32,1],[32,1],[32,1],[32,1],[32,1],[17,3],[17,4],[17,5],[41,1],[41,3],[41,5],[41,1],[42,1],[42,1],[42,1],[10,2],[10,1],[11,1],[15,5],[15,2],[50,1],[50,1],[53,0],[53,1],[48,0],[48,1],[48,3],[48,4],[48,6],[55,1],[55,2],[55,3],[56,1],[56,1],[56,1],[56,1],[60,2],[61,1],[61,2],[61,2],[61,1],[39,1],[39,1],[39,1],[13,1],[13,1],[13,1],[13,1],[13,1],[62,2],[62,2],[62,2],[62,2],[62,1],[62,1],[70,3],[70,2],[72,1],[72,1],[59,4],[77,0],[77,1],[77,3],[77,4],[77,6],[23,1],[23,2],[23,3],[23,4],[23,2],[23,3],[23,4],[23,5],[14,3],[14,3],[14,1],[14,2],[81,0],[81,1],[82,2],[82,4],[65,1],[65,1],[44,2],[58,2],[58,4],[92,1],[92,1],[64,5],[75,3],[75,2],[75,2],[75,1],[87,1],[87,3],[87,4],[87,4],[87,6],[94,1],[94,1],[95,1],[95,3],[19,2],[19,3],[19,4],[19,5],[97,3],[97,3],[97,2],[24,2],[63,3],[63,5],[103,2],[103,4],[103,2],[103,4],[20,2],[20,2],[20,2],[20,1],[107,2],[107,2],[21,2],[21,2],[21,2],[109,2],[109,2],[111,2],[111,3],[115,1],[115,1],[115,1],[115,1],[113,1],[113,3],[112,2],[112,2],[112,4],[112,4],[112,4],[112,6],[112,6],[22,5],[22,7],[22,4],[22,6],[120,1],[120,2],[122,3],[122,4],[124,3],[124,5],[18,1],[18,3],[18,3],[18,3],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,5],[16,4],[16,3]],
 performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {
 
@@ -288,48 +288,50 @@
 case 138:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Value($$[$0-1])), $$[$0]]);
 break;
-case 139:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Throw($$[$0]));
-break;
-case 140:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Parens($$[$0-1]));
-break;
-case 141:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Parens($$[$0-2]));
-break;
-case 142:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While($$[$0]));
-break;
-case 143:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.While($$[$0-2], {
+case 139:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([null, $$[$0]]);
+break;
+case 140:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Throw($$[$0]));
+break;
+case 141:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Parens($$[$0-1]));
+break;
+case 142:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Parens($$[$0-2]));
+break;
+case 143:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While($$[$0]));
+break;
+case 144:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.While($$[$0-2], {
           guard: $$[$0]
         }));
 break;
-case 144:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While($$[$0], {
+case 145:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While($$[$0], {
           invert: true
         }));
 break;
-case 145:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.While($$[$0-2], {
+case 146:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.While($$[$0-2], {
           invert: true,
           guard: $$[$0]
         }));
 break;
-case 146:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].addBody($$[$0]));
-break;
-case 147:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0].addBody(yy.addLocationDataFn(_$[$0-1])(yy.Block.wrap([$$[$0-1]]))));
+case 147:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].addBody($$[$0]));
 break;
 case 148:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0].addBody(yy.addLocationDataFn(_$[$0-1])(yy.Block.wrap([$$[$0-1]]))));
 break;
-case 149:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])($$[$0]);
-break;
-case 150:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While(yy.addLocationDataFn(_$[$0-1])(new yy.Literal('true'))).addBody($$[$0]));
-break;
-case 151:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While(yy.addLocationDataFn(_$[$0-1])(new yy.Literal('true'))).addBody(yy.addLocationDataFn(_$[$0])(yy.Block.wrap([$$[$0]]))));
-break;
-case 152:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0-1], $$[$0]));
+case 149:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0].addBody(yy.addLocationDataFn(_$[$0-1])(yy.Block.wrap([$$[$0-1]]))));
+break;
+case 150:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])($$[$0]);
+break;
+case 151:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While(yy.addLocationDataFn(_$[$0-1])(new yy.Literal('true'))).addBody($$[$0]));
+break;
+case 152:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While(yy.addLocationDataFn(_$[$0-1])(new yy.Literal('true'))).addBody(yy.addLocationDataFn(_$[$0])(yy.Block.wrap([$$[$0]]))));
 break;
 case 153:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0-1], $$[$0]));
 break;
-case 154:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0], $$[$0-1]));
-break;
-case 155:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({
+case 154:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0-1], $$[$0]));
+break;
+case 155:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0], $$[$0-1]));
+break;
+case 156:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({
           source: yy.addLocationDataFn(_$[$0])(new yy.Value($$[$0]))
         });
 break;
-case 156:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])((function () {
+case 157:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])((function () {
         $$[$0].own = $$[$0-1].own;
         $$[$0].name = $$[$0-1][0];
@@ -338,38 +340,38 @@
       }()));
 break;
-case 157:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0]);
-break;
-case 158:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])((function () {
+case 158:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0]);
+break;
+case 159:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])((function () {
         $$[$0].own = true;
         return $$[$0];
       }()));
 break;
-case 159:this.$ = $$[$0];
-break;
 case 160:this.$ = $$[$0];
 break;
-case 161:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));
+case 161:this.$ = $$[$0];
 break;
 case 162:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));
 break;
-case 163:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([$$[$0]]);
-break;
-case 164:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([$$[$0-2], $$[$0]]);
-break;
-case 165:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({
+case 163:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));
+break;
+case 164:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([$$[$0]]);
+break;
+case 165:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([$$[$0-2], $$[$0]]);
+break;
+case 166:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({
           source: $$[$0]
         });
 break;
-case 166:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({
+case 167:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({
           source: $$[$0],
           object: true
         });
 break;
-case 167:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({
+case 168:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({
           source: $$[$0-2],
           guard: $$[$0]
         });
 break;
-case 168:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({
+case 169:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({
           source: $$[$0-2],
           guard: $$[$0],
@@ -377,10 +379,10 @@
         });
 break;
-case 169:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({
+case 170:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({
           source: $$[$0-2],
           step: $$[$0]
         });
 break;
-case 170:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])({
+case 171:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])({
           source: $$[$0-4],
           guard: $$[$0-2],
@@ -388,5 +390,5 @@
         });
 break;
-case 171:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])({
+case 172:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])({
           source: $$[$0-4],
           step: $$[$0-2],
@@ -394,36 +396,31 @@
         });
 break;
-case 172:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Switch($$[$0-3], $$[$0-1]));
-break;
-case 173:this.$ = yy.addLocationDataFn(_$[$0-6], _$[$0])(new yy.Switch($$[$0-5], $$[$0-3], $$[$0-1]));
-break;
-case 174:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Switch(null, $$[$0-1]));
-break;
-case 175:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])(new yy.Switch(null, $$[$0-3], $$[$0-1]));
-break;
-case 176:this.$ = $$[$0];
-break;
-case 177:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].concat($$[$0]));
-break;
-case 178:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([[$$[$0-1], $$[$0]]]);
-break;
-case 179:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])([[$$[$0-2], $$[$0-1]]]);
-break;
-case 180:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0-1], $$[$0], {
+case 173:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Switch($$[$0-3], $$[$0-1]));
+break;
+case 174:this.$ = yy.addLocationDataFn(_$[$0-6], _$[$0])(new yy.Switch($$[$0-5], $$[$0-3], $$[$0-1]));
+break;
+case 175:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Switch(null, $$[$0-1]));
+break;
+case 176:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])(new yy.Switch(null, $$[$0-3], $$[$0-1]));
+break;
+case 177:this.$ = $$[$0];
+break;
+case 178:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].concat($$[$0]));
+break;
+case 179:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([[$$[$0-1], $$[$0]]]);
+break;
+case 180:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])([[$$[$0-2], $$[$0-1]]]);
+break;
+case 181:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0-1], $$[$0], {
           type: $$[$0-2]
         }));
 break;
-case 181:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])($$[$0-4].addElse(new yy.If($$[$0-1], $$[$0], {
+case 182:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])($$[$0-4].addElse(new yy.If($$[$0-1], $$[$0], {
           type: $$[$0-2]
         })));
 break;
-case 182:this.$ = $$[$0];
-break;
-case 183:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].addElse($$[$0]));
-break;
-case 184:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0], yy.addLocationDataFn(_$[$0-2])(yy.Block.wrap([$$[$0-2]])), {
-          type: $$[$0-1],
-          statement: true
-        }));
+case 183:this.$ = $$[$0];
+break;
+case 184:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].addElse($$[$0]));
 break;
 case 185:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0], yy.addLocationDataFn(_$[$0-2])(yy.Block.wrap([$$[$0-2]])), {
@@ -432,25 +429,28 @@
         }));
 break;
-case 186:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op($$[$0-1], $$[$0]));
-break;
-case 187:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('-', $$[$0]));
-break;
-case 188:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('+', $$[$0]));
-break;
-case 189:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('--', $$[$0]));
-break;
-case 190:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('++', $$[$0]));
-break;
-case 191:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('--', $$[$0-1], null, true));
-break;
-case 192:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('++', $$[$0-1], null, true));
-break;
-case 193:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Existence($$[$0-1]));
-break;
-case 194:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op('+', $$[$0-2], $$[$0]));
-break;
-case 195:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op('-', $$[$0-2], $$[$0]));
-break;
-case 196:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-1], $$[$0-2], $$[$0]));
+case 186:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0], yy.addLocationDataFn(_$[$0-2])(yy.Block.wrap([$$[$0-2]])), {
+          type: $$[$0-1],
+          statement: true
+        }));
+break;
+case 187:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op($$[$0-1], $$[$0]));
+break;
+case 188:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('-', $$[$0]));
+break;
+case 189:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('+', $$[$0]));
+break;
+case 190:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('--', $$[$0]));
+break;
+case 191:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('++', $$[$0]));
+break;
+case 192:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('--', $$[$0-1], null, true));
+break;
+case 193:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('++', $$[$0-1], null, true));
+break;
+case 194:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Existence($$[$0-1]));
+break;
+case 195:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op('+', $$[$0-2], $$[$0]));
+break;
+case 196:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op('-', $$[$0-2], $$[$0]));
 break;
 case 197:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-1], $$[$0-2], $$[$0]));
@@ -460,5 +460,7 @@
 case 199:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-1], $$[$0-2], $$[$0]));
 break;
-case 200:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])((function () {
+case 200:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-1], $$[$0-2], $$[$0]));
+break;
+case 201:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])((function () {
         if ($$[$0-1].charAt(0) === '!') {
           return new yy.Op($$[$0-1].slice(1), $$[$0-2], $$[$0]).invert();
@@ -468,15 +470,15 @@
       }()));
 break;
-case 201:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign($$[$0-2], $$[$0], $$[$0-1]));
-break;
-case 202:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign($$[$0-4], $$[$0-1], $$[$0-3]));
-break;
-case 203:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Assign($$[$0-3], $$[$0], $$[$0-2]));
-break;
-case 204:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Extends($$[$0-2], $$[$0]));
+case 202:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign($$[$0-2], $$[$0], $$[$0-1]));
+break;
+case 203:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign($$[$0-4], $$[$0-1], $$[$0-3]));
+break;
+case 204:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Assign($$[$0-3], $$[$0], $$[$0-2]));
+break;
+case 205:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Extends($$[$0-2], $$[$0]));
 break;
 }
 },
-table: [{1:[2,1],3:1,4:2,5:3,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,5],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[3]},{1:[2,2],6:[1,74]},{6:[1,75]},{1:[2,4],6:[2,4],26:[2,4],102:[2,4]},{4:77,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[1,76],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,7],6:[2,7],26:[2,7],102:[2,7],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,8],6:[2,8],26:[2,8],102:[2,8],103:90,104:[1,65],106:[1,66],109:91,110:[1,68],111:69,126:[1,89]},{1:[2,12],6:[2,12],25:[2,12],26:[2,12],49:[2,12],54:[2,12],57:[2,12],62:93,66:[1,95],67:[1,96],68:[1,97],69:[1,98],70:99,71:[1,100],73:[2,12],74:[1,101],78:[2,12],81:92,84:[1,94],85:[2,108],86:[2,12],91:[2,12],93:[2,12],102:[2,12],104:[2,12],105:[2,12],106:[2,12],110:[2,12],118:[2,12],126:[2,12],128:[2,12],129:[2,12],132:[2,12],133:[2,12],134:[2,12],135:[2,12],136:[2,12],137:[2,12]},{1:[2,13],6:[2,13],25:[2,13],26:[2,13],49:[2,13],54:[2,13],57:[2,13],62:103,66:[1,95],67:[1,96],68:[1,97],69:[1,98],70:99,71:[1,100],73:[2,13],74:[1,101],78:[2,13],81:102,84:[1,94],85:[2,108],86:[2,13],91:[2,13],93:[2,13],102:[2,13],104:[2,13],105:[2,13],106:[2,13],110:[2,13],118:[2,13],126:[2,13],128:[2,13],129:[2,13],132:[2,13],133:[2,13],134:[2,13],135:[2,13],136:[2,13],137:[2,13]},{1:[2,14],6:[2,14],25:[2,14],26:[2,14],49:[2,14],54:[2,14],57:[2,14],73:[2,14],78:[2,14],86:[2,14],91:[2,14],93:[2,14],102:[2,14],104:[2,14],105:[2,14],106:[2,14],110:[2,14],118:[2,14],126:[2,14],128:[2,14],129:[2,14],132:[2,14],133:[2,14],134:[2,14],135:[2,14],136:[2,14],137:[2,14]},{1:[2,15],6:[2,15],25:[2,15],26:[2,15],49:[2,15],54:[2,15],57:[2,15],73:[2,15],78:[2,15],86:[2,15],91:[2,15],93:[2,15],102:[2,15],104:[2,15],105:[2,15],106:[2,15],110:[2,15],118:[2,15],126:[2,15],128:[2,15],129:[2,15],132:[2,15],133:[2,15],134:[2,15],135:[2,15],136:[2,15],137:[2,15]},{1:[2,16],6:[2,16],25:[2,16],26:[2,16],49:[2,16],54:[2,16],57:[2,16],73:[2,16],78:[2,16],86:[2,16],91:[2,16],93:[2,16],102:[2,16],104:[2,16],105:[2,16],106:[2,16],110:[2,16],118:[2,16],126:[2,16],128:[2,16],129:[2,16],132:[2,16],133:[2,16],134:[2,16],135:[2,16],136:[2,16],137:[2,16]},{1:[2,17],6:[2,17],25:[2,17],26:[2,17],49:[2,17],54:[2,17],57:[2,17],73:[2,17],78:[2,17],86:[2,17],91:[2,17],93:[2,17],102:[2,17],104:[2,17],105:[2,17],106:[2,17],110:[2,17],118:[2,17],126:[2,17],128:[2,17],129:[2,17],132:[2,17],133:[2,17],134:[2,17],135:[2,17],136:[2,17],137:[2,17]},{1:[2,18],6:[2,18],25:[2,18],26:[2,18],49:[2,18],54:[2,18],57:[2,18],73:[2,18],78:[2,18],86:[2,18],91:[2,18],93:[2,18],102:[2,18],104:[2,18],105:[2,18],106:[2,18],110:[2,18],118:[2,18],126:[2,18],128:[2,18],129:[2,18],132:[2,18],133:[2,18],134:[2,18],135:[2,18],136:[2,18],137:[2,18]},{1:[2,19],6:[2,19],25:[2,19],26:[2,19],49:[2,19],54:[2,19],57:[2,19],73:[2,19],78:[2,19],86:[2,19],91:[2,19],93:[2,19],102:[2,19],104:[2,19],105:[2,19],106:[2,19],110:[2,19],118:[2,19],126:[2,19],128:[2,19],129:[2,19],132:[2,19],133:[2,19],134:[2,19],135:[2,19],136:[2,19],137:[2,19]},{1:[2,20],6:[2,20],25:[2,20],26:[2,20],49:[2,20],54:[2,20],57:[2,20],73:[2,20],78:[2,20],86:[2,20],91:[2,20],93:[2,20],102:[2,20],104:[2,20],105:[2,20],106:[2,20],110:[2,20],118:[2,20],126:[2,20],128:[2,20],129:[2,20],132:[2,20],133:[2,20],134:[2,20],135:[2,20],136:[2,20],137:[2,20]},{1:[2,21],6:[2,21],25:[2,21],26:[2,21],49:[2,21],54:[2,21],57:[2,21],73:[2,21],78:[2,21],86:[2,21],91:[2,21],93:[2,21],102:[2,21],104:[2,21],105:[2,21],106:[2,21],110:[2,21],118:[2,21],126:[2,21],128:[2,21],129:[2,21],132:[2,21],133:[2,21],134:[2,21],135:[2,21],136:[2,21],137:[2,21]},{1:[2,22],6:[2,22],25:[2,22],26:[2,22],49:[2,22],54:[2,22],57:[2,22],73:[2,22],78:[2,22],86:[2,22],91:[2,22],93:[2,22],102:[2,22],104:[2,22],105:[2,22],106:[2,22],110:[2,22],118:[2,22],126:[2,22],128:[2,22],129:[2,22],132:[2,22],133:[2,22],134:[2,22],135:[2,22],136:[2,22],137:[2,22]},{1:[2,23],6:[2,23],25:[2,23],26:[2,23],49:[2,23],54:[2,23],57:[2,23],73:[2,23],78:[2,23],86:[2,23],91:[2,23],93:[2,23],102:[2,23],104:[2,23],105:[2,23],106:[2,23],110:[2,23],118:[2,23],126:[2,23],128:[2,23],129:[2,23],132:[2,23],133:[2,23],134:[2,23],135:[2,23],136:[2,23],137:[2,23]},{1:[2,9],6:[2,9],26:[2,9],102:[2,9],104:[2,9],106:[2,9],110:[2,9],126:[2,9]},{1:[2,10],6:[2,10],26:[2,10],102:[2,10],104:[2,10],106:[2,10],110:[2,10],126:[2,10]},{1:[2,11],6:[2,11],26:[2,11],102:[2,11],104:[2,11],106:[2,11],110:[2,11],126:[2,11]},{1:[2,75],6:[2,75],25:[2,75],26:[2,75],40:[1,104],49:[2,75],54:[2,75],57:[2,75],66:[2,75],67:[2,75],68:[2,75],69:[2,75],71:[2,75],73:[2,75],74:[2,75],78:[2,75],84:[2,75],85:[2,75],86:[2,75],91:[2,75],93:[2,75],102:[2,75],104:[2,75],105:[2,75],106:[2,75],110:[2,75],118:[2,75],126:[2,75],128:[2,75],129:[2,75],132:[2,75],133:[2,75],134:[2,75],135:[2,75],136:[2,75],137:[2,75]},{1:[2,76],6:[2,76],25:[2,76],26:[2,76],49:[2,76],54:[2,76],57:[2,76],66:[2,76],67:[2,76],68:[2,76],69:[2,76],71:[2,76],73:[2,76],74:[2,76],78:[2,76],84:[2,76],85:[2,76],86:[2,76],91:[2,76],93:[2,76],102:[2,76],104:[2,76],105:[2,76],106:[2,76],110:[2,76],118:[2,76],126:[2,76],128:[2,76],129:[2,76],132:[2,76],133:[2,76],134:[2,76],135:[2,76],136:[2,76],137:[2,76]},{1:[2,77],6:[2,77],25:[2,77],26:[2,77],49:[2,77],54:[2,77],57:[2,77],66:[2,77],67:[2,77],68:[2,77],69:[2,77],71:[2,77],73:[2,77],74:[2,77],78:[2,77],84:[2,77],85:[2,77],86:[2,77],91:[2,77],93:[2,77],102:[2,77],104:[2,77],105:[2,77],106:[2,77],110:[2,77],118:[2,77],126:[2,77],128:[2,77],129:[2,77],132:[2,77],133:[2,77],134:[2,77],135:[2,77],136:[2,77],137:[2,77]},{1:[2,78],6:[2,78],25:[2,78],26:[2,78],49:[2,78],54:[2,78],57:[2,78],66:[2,78],67:[2,78],68:[2,78],69:[2,78],71:[2,78],73:[2,78],74:[2,78],78:[2,78],84:[2,78],85:[2,78],86:[2,78],91:[2,78],93:[2,78],102:[2,78],104:[2,78],105:[2,78],106:[2,78],110:[2,78],118:[2,78],126:[2,78],128:[2,78],129:[2,78],132:[2,78],133:[2,78],134:[2,78],135:[2,78],136:[2,78],137:[2,78]},{1:[2,79],6:[2,79],25:[2,79],26:[2,79],49:[2,79],54:[2,79],57:[2,79],66:[2,79],67:[2,79],68:[2,79],69:[2,79],71:[2,79],73:[2,79],74:[2,79],78:[2,79],84:[2,79],85:[2,79],86:[2,79],91:[2,79],93:[2,79],102:[2,79],104:[2,79],105:[2,79],106:[2,79],110:[2,79],118:[2,79],126:[2,79],128:[2,79],129:[2,79],132:[2,79],133:[2,79],134:[2,79],135:[2,79],136:[2,79],137:[2,79]},{1:[2,106],6:[2,106],25:[2,106],26:[2,106],49:[2,106],54:[2,106],57:[2,106],66:[2,106],67:[2,106],68:[2,106],69:[2,106],71:[2,106],73:[2,106],74:[2,106],78:[2,106],82:105,84:[2,106],85:[1,106],86:[2,106],91:[2,106],93:[2,106],102:[2,106],104:[2,106],105:[2,106],106:[2,106],110:[2,106],118:[2,106],126:[2,106],128:[2,106],129:[2,106],132:[2,106],133:[2,106],134:[2,106],135:[2,106],136:[2,106],137:[2,106]},{6:[2,55],25:[2,55],27:110,28:[1,73],44:111,48:107,49:[2,55],54:[2,55],55:108,56:109,58:112,59:113,76:[1,70],89:[1,114],90:[1,115]},{5:116,25:[1,5]},{8:117,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:119,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:120,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{13:122,14:123,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:124,44:63,58:47,59:48,61:121,63:25,64:26,65:27,76:[1,70],83:[1,28],88:[1,58],89:[1,59],90:[1,57],101:[1,56]},{13:122,14:123,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:124,44:63,58:47,59:48,61:125,63:25,64:26,65:27,76:[1,70],83:[1,28],88:[1,58],89:[1,59],90:[1,57],101:[1,56]},{1:[2,72],6:[2,72],25:[2,72],26:[2,72],40:[2,72],49:[2,72],54:[2,72],57:[2,72],66:[2,72],67:[2,72],68:[2,72],69:[2,72],71:[2,72],73:[2,72],74:[2,72],78:[2,72],80:[1,129],84:[2,72],85:[2,72],86:[2,72],91:[2,72],93:[2,72],102:[2,72],104:[2,72],105:[2,72],106:[2,72],110:[2,72],118:[2,72],126:[2,72],128:[2,72],129:[2,72],130:[1,126],131:[1,127],132:[2,72],133:[2,72],134:[2,72],135:[2,72],136:[2,72],137:[2,72],138:[1,128]},{1:[2,182],6:[2,182],25:[2,182],26:[2,182],49:[2,182],54:[2,182],57:[2,182],73:[2,182],78:[2,182],86:[2,182],91:[2,182],93:[2,182],102:[2,182],104:[2,182],105:[2,182],106:[2,182],110:[2,182],118:[2,182],121:[1,130],126:[2,182],128:[2,182],129:[2,182],132:[2,182],133:[2,182],134:[2,182],135:[2,182],136:[2,182],137:[2,182]},{5:131,25:[1,5]},{5:132,25:[1,5]},{1:[2,149],6:[2,149],25:[2,149],26:[2,149],49:[2,149],54:[2,149],57:[2,149],73:[2,149],78:[2,149],86:[2,149],91:[2,149],93:[2,149],102:[2,149],104:[2,149],105:[2,149],106:[2,149],110:[2,149],118:[2,149],126:[2,149],128:[2,149],129:[2,149],132:[2,149],133:[2,149],134:[2,149],135:[2,149],136:[2,149],137:[2,149]},{5:133,25:[1,5]},{8:134,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,135],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,96],5:136,6:[2,96],13:122,14:123,25:[1,5],26:[2,96],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:124,44:63,49:[2,96],54:[2,96],57:[2,96],58:47,59:48,61:138,63:25,64:26,65:27,73:[2,96],76:[1,70],78:[2,96],80:[1,137],83:[1,28],86:[2,96],88:[1,58],89:[1,59],90:[1,57],91:[2,96],93:[2,96],101:[1,56],102:[2,96],104:[2,96],105:[2,96],106:[2,96],110:[2,96],118:[2,96],126:[2,96],128:[2,96],129:[2,96],132:[2,96],133:[2,96],134:[2,96],135:[2,96],136:[2,96],137:[2,96]},{8:139,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,47],6:[2,47],8:140,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[2,47],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],102:[2,47],103:39,104:[2,47],106:[2,47],107:40,108:[1,67],109:41,110:[2,47],111:69,119:[1,42],124:37,125:[1,64],126:[2,47],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,48],6:[2,48],25:[2,48],26:[2,48],54:[2,48],78:[2,48],102:[2,48],104:[2,48],106:[2,48],110:[2,48],126:[2,48]},{1:[2,73],6:[2,73],25:[2,73],26:[2,73],40:[2,73],49:[2,73],54:[2,73],57:[2,73],66:[2,73],67:[2,73],68:[2,73],69:[2,73],71:[2,73],73:[2,73],74:[2,73],78:[2,73],84:[2,73],85:[2,73],86:[2,73],91:[2,73],93:[2,73],102:[2,73],104:[2,73],105:[2,73],106:[2,73],110:[2,73],118:[2,73],126:[2,73],128:[2,73],129:[2,73],132:[2,73],133:[2,73],134:[2,73],135:[2,73],136:[2,73],137:[2,73]},{1:[2,74],6:[2,74],25:[2,74],26:[2,74],40:[2,74],49:[2,74],54:[2,74],57:[2,74],66:[2,74],67:[2,74],68:[2,74],69:[2,74],71:[2,74],73:[2,74],74:[2,74],78:[2,74],84:[2,74],85:[2,74],86:[2,74],91:[2,74],93:[2,74],102:[2,74],104:[2,74],105:[2,74],106:[2,74],110:[2,74],118:[2,74],126:[2,74],128:[2,74],129:[2,74],132:[2,74],133:[2,74],134:[2,74],135:[2,74],136:[2,74],137:[2,74]},{1:[2,29],6:[2,29],25:[2,29],26:[2,29],49:[2,29],54:[2,29],57:[2,29],66:[2,29],67:[2,29],68:[2,29],69:[2,29],71:[2,29],73:[2,29],74:[2,29],78:[2,29],84:[2,29],85:[2,29],86:[2,29],91:[2,29],93:[2,29],102:[2,29],104:[2,29],105:[2,29],106:[2,29],110:[2,29],118:[2,29],126:[2,29],128:[2,29],129:[2,29],132:[2,29],133:[2,29],134:[2,29],135:[2,29],136:[2,29],137:[2,29]},{1:[2,30],6:[2,30],25:[2,30],26:[2,30],49:[2,30],54:[2,30],57:[2,30],66:[2,30],67:[2,30],68:[2,30],69:[2,30],71:[2,30],73:[2,30],74:[2,30],78:[2,30],84:[2,30],85:[2,30],86:[2,30],91:[2,30],93:[2,30],102:[2,30],104:[2,30],105:[2,30],106:[2,30],110:[2,30],118:[2,30],126:[2,30],128:[2,30],129:[2,30],132:[2,30],133:[2,30],134:[2,30],135:[2,30],136:[2,30],137:[2,30]},{1:[2,31],6:[2,31],25:[2,31],26:[2,31],49:[2,31],54:[2,31],57:[2,31],66:[2,31],67:[2,31],68:[2,31],69:[2,31],71:[2,31],73:[2,31],74:[2,31],78:[2,31],84:[2,31],85:[2,31],86:[2,31],91:[2,31],93:[2,31],102:[2,31],104:[2,31],105:[2,31],106:[2,31],110:[2,31],118:[2,31],126:[2,31],128:[2,31],129:[2,31],132:[2,31],133:[2,31],134:[2,31],135:[2,31],136:[2,31],137:[2,31]},{1:[2,32],6:[2,32],25:[2,32],26:[2,32],49:[2,32],54:[2,32],57:[2,32],66:[2,32],67:[2,32],68:[2,32],69:[2,32],71:[2,32],73:[2,32],74:[2,32],78:[2,32],84:[2,32],85:[2,32],86:[2,32],91:[2,32],93:[2,32],102:[2,32],104:[2,32],105:[2,32],106:[2,32],110:[2,32],118:[2,32],126:[2,32],128:[2,32],129:[2,32],132:[2,32],133:[2,32],134:[2,32],135:[2,32],136:[2,32],137:[2,32]},{1:[2,33],6:[2,33],25:[2,33],26:[2,33],49:[2,33],54:[2,33],57:[2,33],66:[2,33],67:[2,33],68:[2,33],69:[2,33],71:[2,33],73:[2,33],74:[2,33],78:[2,33],84:[2,33],85:[2,33],86:[2,33],91:[2,33],93:[2,33],102:[2,33],104:[2,33],105:[2,33],106:[2,33],110:[2,33],118:[2,33],126:[2,33],128:[2,33],129:[2,33],132:[2,33],133:[2,33],134:[2,33],135:[2,33],136:[2,33],137:[2,33]},{1:[2,34],6:[2,34],25:[2,34],26:[2,34],49:[2,34],54:[2,34],57:[2,34],66:[2,34],67:[2,34],68:[2,34],69:[2,34],71:[2,34],73:[2,34],74:[2,34],78:[2,34],84:[2,34],85:[2,34],86:[2,34],91:[2,34],93:[2,34],102:[2,34],104:[2,34],105:[2,34],106:[2,34],110:[2,34],118:[2,34],126:[2,34],128:[2,34],129:[2,34],132:[2,34],133:[2,34],134:[2,34],135:[2,34],136:[2,34],137:[2,34]},{1:[2,35],6:[2,35],25:[2,35],26:[2,35],49:[2,35],54:[2,35],57:[2,35],66:[2,35],67:[2,35],68:[2,35],69:[2,35],71:[2,35],73:[2,35],74:[2,35],78:[2,35],84:[2,35],85:[2,35],86:[2,35],91:[2,35],93:[2,35],102:[2,35],104:[2,35],105:[2,35],106:[2,35],110:[2,35],118:[2,35],126:[2,35],128:[2,35],129:[2,35],132:[2,35],133:[2,35],134:[2,35],135:[2,35],136:[2,35],137:[2,35]},{4:141,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,142],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:143,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,147],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],87:145,88:[1,58],89:[1,59],90:[1,57],91:[1,144],94:146,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,112],6:[2,112],25:[2,112],26:[2,112],49:[2,112],54:[2,112],57:[2,112],66:[2,112],67:[2,112],68:[2,112],69:[2,112],71:[2,112],73:[2,112],74:[2,112],78:[2,112],84:[2,112],85:[2,112],86:[2,112],91:[2,112],93:[2,112],102:[2,112],104:[2,112],105:[2,112],106:[2,112],110:[2,112],118:[2,112],126:[2,112],128:[2,112],129:[2,112],132:[2,112],133:[2,112],134:[2,112],135:[2,112],136:[2,112],137:[2,112]},{1:[2,113],6:[2,113],25:[2,113],26:[2,113],27:149,28:[1,73],49:[2,113],54:[2,113],57:[2,113],66:[2,113],67:[2,113],68:[2,113],69:[2,113],71:[2,113],73:[2,113],74:[2,113],78:[2,113],84:[2,113],85:[2,113],86:[2,113],91:[2,113],93:[2,113],102:[2,113],104:[2,113],105:[2,113],106:[2,113],110:[2,113],118:[2,113],126:[2,113],128:[2,113],129:[2,113],132:[2,113],133:[2,113],134:[2,113],135:[2,113],136:[2,113],137:[2,113]},{25:[2,51]},{25:[2,52]},{1:[2,68],6:[2,68],25:[2,68],26:[2,68],40:[2,68],49:[2,68],54:[2,68],57:[2,68],66:[2,68],67:[2,68],68:[2,68],69:[2,68],71:[2,68],73:[2,68],74:[2,68],78:[2,68],80:[2,68],84:[2,68],85:[2,68],86:[2,68],91:[2,68],93:[2,68],102:[2,68],104:[2,68],105:[2,68],106:[2,68],110:[2,68],118:[2,68],126:[2,68],128:[2,68],129:[2,68],130:[2,68],131:[2,68],132:[2,68],133:[2,68],134:[2,68],135:[2,68],136:[2,68],137:[2,68],138:[2,68]},{1:[2,71],6:[2,71],25:[2,71],26:[2,71],40:[2,71],49:[2,71],54:[2,71],57:[2,71],66:[2,71],67:[2,71],68:[2,71],69:[2,71],71:[2,71],73:[2,71],74:[2,71],78:[2,71],80:[2,71],84:[2,71],85:[2,71],86:[2,71],91:[2,71],93:[2,71],102:[2,71],104:[2,71],105:[2,71],106:[2,71],110:[2,71],118:[2,71],126:[2,71],128:[2,71],129:[2,71],130:[2,71],131:[2,71],132:[2,71],133:[2,71],134:[2,71],135:[2,71],136:[2,71],137:[2,71],138:[2,71]},{8:150,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:151,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:152,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{5:153,8:154,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,5],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{27:159,28:[1,73],44:160,58:161,59:162,64:155,76:[1,70],89:[1,114],90:[1,57],113:156,114:[1,157],115:158},{112:163,116:[1,164],117:[1,165]},{6:[2,91],11:169,25:[2,91],27:170,28:[1,73],29:171,30:[1,71],31:[1,72],41:167,42:168,44:172,46:[1,46],54:[2,91],77:166,78:[2,91],89:[1,114]},{1:[2,27],6:[2,27],25:[2,27],26:[2,27],43:[2,27],49:[2,27],54:[2,27],57:[2,27],66:[2,27],67:[2,27],68:[2,27],69:[2,27],71:[2,27],73:[2,27],74:[2,27],78:[2,27],84:[2,27],85:[2,27],86:[2,27],91:[2,27],93:[2,27],102:[2,27],104:[2,27],105:[2,27],106:[2,27],110:[2,27],118:[2,27],126:[2,27],128:[2,27],129:[2,27],132:[2,27],133:[2,27],134:[2,27],135:[2,27],136:[2,27],137:[2,27]},{1:[2,28],6:[2,28],25:[2,28],26:[2,28],43:[2,28],49:[2,28],54:[2,28],57:[2,28],66:[2,28],67:[2,28],68:[2,28],69:[2,28],71:[2,28],73:[2,28],74:[2,28],78:[2,28],84:[2,28],85:[2,28],86:[2,28],91:[2,28],93:[2,28],102:[2,28],104:[2,28],105:[2,28],106:[2,28],110:[2,28],118:[2,28],126:[2,28],128:[2,28],129:[2,28],132:[2,28],133:[2,28],134:[2,28],135:[2,28],136:[2,28],137:[2,28]},{1:[2,26],6:[2,26],25:[2,26],26:[2,26],40:[2,26],43:[2,26],49:[2,26],54:[2,26],57:[2,26],66:[2,26],67:[2,26],68:[2,26],69:[2,26],71:[2,26],73:[2,26],74:[2,26],78:[2,26],80:[2,26],84:[2,26],85:[2,26],86:[2,26],91:[2,26],93:[2,26],102:[2,26],104:[2,26],105:[2,26],106:[2,26],110:[2,26],116:[2,26],117:[2,26],118:[2,26],126:[2,26],128:[2,26],129:[2,26],130:[2,26],131:[2,26],132:[2,26],133:[2,26],134:[2,26],135:[2,26],136:[2,26],137:[2,26],138:[2,26]},{1:[2,6],6:[2,6],7:173,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[2,6],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],102:[2,6],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,3]},{1:[2,24],6:[2,24],25:[2,24],26:[2,24],49:[2,24],54:[2,24],57:[2,24],73:[2,24],78:[2,24],86:[2,24],91:[2,24],93:[2,24],98:[2,24],99:[2,24],102:[2,24],104:[2,24],105:[2,24],106:[2,24],110:[2,24],118:[2,24],121:[2,24],123:[2,24],126:[2,24],128:[2,24],129:[2,24],132:[2,24],133:[2,24],134:[2,24],135:[2,24],136:[2,24],137:[2,24]},{6:[1,74],26:[1,174]},{1:[2,193],6:[2,193],25:[2,193],26:[2,193],49:[2,193],54:[2,193],57:[2,193],73:[2,193],78:[2,193],86:[2,193],91:[2,193],93:[2,193],102:[2,193],104:[2,193],105:[2,193],106:[2,193],110:[2,193],118:[2,193],126:[2,193],128:[2,193],129:[2,193],132:[2,193],133:[2,193],134:[2,193],135:[2,193],136:[2,193],137:[2,193]},{8:175,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:176,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:177,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:178,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:179,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:180,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:181,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:182,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,148],6:[2,148],25:[2,148],26:[2,148],49:[2,148],54:[2,148],57:[2,148],73:[2,148],78:[2,148],86:[2,148],91:[2,148],93:[2,148],102:[2,148],104:[2,148],105:[2,148],106:[2,148],110:[2,148],118:[2,148],126:[2,148],128:[2,148],129:[2,148],132:[2,148],133:[2,148],134:[2,148],135:[2,148],136:[2,148],137:[2,148]},{1:[2,153],6:[2,153],25:[2,153],26:[2,153],49:[2,153],54:[2,153],57:[2,153],73:[2,153],78:[2,153],86:[2,153],91:[2,153],93:[2,153],102:[2,153],104:[2,153],105:[2,153],106:[2,153],110:[2,153],118:[2,153],126:[2,153],128:[2,153],129:[2,153],132:[2,153],133:[2,153],134:[2,153],135:[2,153],136:[2,153],137:[2,153]},{8:183,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,147],6:[2,147],25:[2,147],26:[2,147],49:[2,147],54:[2,147],57:[2,147],73:[2,147],78:[2,147],86:[2,147],91:[2,147],93:[2,147],102:[2,147],104:[2,147],105:[2,147],106:[2,147],110:[2,147],118:[2,147],126:[2,147],128:[2,147],129:[2,147],132:[2,147],133:[2,147],134:[2,147],135:[2,147],136:[2,147],137:[2,147]},{1:[2,152],6:[2,152],25:[2,152],26:[2,152],49:[2,152],54:[2,152],57:[2,152],73:[2,152],78:[2,152],86:[2,152],91:[2,152],93:[2,152],102:[2,152],104:[2,152],105:[2,152],106:[2,152],110:[2,152],118:[2,152],126:[2,152],128:[2,152],129:[2,152],132:[2,152],133:[2,152],134:[2,152],135:[2,152],136:[2,152],137:[2,152]},{82:184,85:[1,106]},{1:[2,69],6:[2,69],25:[2,69],26:[2,69],40:[2,69],49:[2,69],54:[2,69],57:[2,69],66:[2,69],67:[2,69],68:[2,69],69:[2,69],71:[2,69],73:[2,69],74:[2,69],78:[2,69],80:[2,69],84:[2,69],85:[2,69],86:[2,69],91:[2,69],93:[2,69],102:[2,69],104:[2,69],105:[2,69],106:[2,69],110:[2,69],118:[2,69],126:[2,69],128:[2,69],129:[2,69],130:[2,69],131:[2,69],132:[2,69],133:[2,69],134:[2,69],135:[2,69],136:[2,69],137:[2,69],138:[2,69]},{85:[2,109]},{27:185,28:[1,73]},{27:186,28:[1,73]},{1:[2,84],6:[2,84],25:[2,84],26:[2,84],27:187,28:[1,73],40:[2,84],49:[2,84],54:[2,84],57:[2,84],66:[2,84],67:[2,84],68:[2,84],69:[2,84],71:[2,84],73:[2,84],74:[2,84],78:[2,84],80:[2,84],84:[2,84],85:[2,84],86:[2,84],91:[2,84],93:[2,84],102:[2,84],104:[2,84],105:[2,84],106:[2,84],110:[2,84],118:[2,84],126:[2,84],128:[2,84],129:[2,84],130:[2,84],131:[2,84],132:[2,84],133:[2,84],134:[2,84],135:[2,84],136:[2,84],137:[2,84],138:[2,84]},{27:188,28:[1,73]},{1:[2,85],6:[2,85],25:[2,85],26:[2,85],40:[2,85],49:[2,85],54:[2,85],57:[2,85],66:[2,85],67:[2,85],68:[2,85],69:[2,85],71:[2,85],73:[2,85],74:[2,85],78:[2,85],80:[2,85],84:[2,85],85:[2,85],86:[2,85],91:[2,85],93:[2,85],102:[2,85],104:[2,85],105:[2,85],106:[2,85],110:[2,85],118:[2,85],126:[2,85],128:[2,85],129:[2,85],130:[2,85],131:[2,85],132:[2,85],133:[2,85],134:[2,85],135:[2,85],136:[2,85],137:[2,85],138:[2,85]},{8:190,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],57:[1,194],58:47,59:48,61:36,63:25,64:26,65:27,72:189,75:191,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],92:192,93:[1,193],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{70:195,71:[1,100],74:[1,101]},{82:196,85:[1,106]},{1:[2,70],6:[2,70],25:[2,70],26:[2,70],40:[2,70],49:[2,70],54:[2,70],57:[2,70],66:[2,70],67:[2,70],68:[2,70],69:[2,70],71:[2,70],73:[2,70],74:[2,70],78:[2,70],80:[2,70],84:[2,70],85:[2,70],86:[2,70],91:[2,70],93:[2,70],102:[2,70],104:[2,70],105:[2,70],106:[2,70],110:[2,70],118:[2,70],126:[2,70],128:[2,70],129:[2,70],130:[2,70],131:[2,70],132:[2,70],133:[2,70],134:[2,70],135:[2,70],136:[2,70],137:[2,70],138:[2,70]},{6:[1,198],8:197,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,199],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,107],6:[2,107],25:[2,107],26:[2,107],49:[2,107],54:[2,107],57:[2,107],66:[2,107],67:[2,107],68:[2,107],69:[2,107],71:[2,107],73:[2,107],74:[2,107],78:[2,107],84:[2,107],85:[2,107],86:[2,107],91:[2,107],93:[2,107],102:[2,107],104:[2,107],105:[2,107],106:[2,107],110:[2,107],118:[2,107],126:[2,107],128:[2,107],129:[2,107],132:[2,107],133:[2,107],134:[2,107],135:[2,107],136:[2,107],137:[2,107]},{8:202,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,147],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],86:[1,200],87:201,88:[1,58],89:[1,59],90:[1,57],94:146,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,53],25:[2,53],49:[1,203],53:205,54:[1,204]},{6:[2,56],25:[2,56],26:[2,56],49:[2,56],54:[2,56]},{6:[2,60],25:[2,60],26:[2,60],40:[1,207],49:[2,60],54:[2,60],57:[1,206]},{6:[2,63],25:[2,63],26:[2,63],40:[2,63],49:[2,63],54:[2,63],57:[2,63]},{6:[2,64],25:[2,64],26:[2,64],40:[2,64],49:[2,64],54:[2,64],57:[2,64]},{6:[2,65],25:[2,65],26:[2,65],40:[2,65],49:[2,65],54:[2,65],57:[2,65]},{6:[2,66],25:[2,66],26:[2,66],40:[2,66],49:[2,66],54:[2,66],57:[2,66]},{27:149,28:[1,73]},{8:202,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,147],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],87:145,88:[1,58],89:[1,59],90:[1,57],91:[1,144],94:146,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,50],6:[2,50],25:[2,50],26:[2,50],49:[2,50],54:[2,50],57:[2,50],73:[2,50],78:[2,50],86:[2,50],91:[2,50],93:[2,50],102:[2,50],104:[2,50],105:[2,50],106:[2,50],110:[2,50],118:[2,50],126:[2,50],128:[2,50],129:[2,50],132:[2,50],133:[2,50],134:[2,50],135:[2,50],136:[2,50],137:[2,50]},{1:[2,186],6:[2,186],25:[2,186],26:[2,186],49:[2,186],54:[2,186],57:[2,186],73:[2,186],78:[2,186],86:[2,186],91:[2,186],93:[2,186],102:[2,186],103:87,104:[2,186],105:[2,186],106:[2,186],109:88,110:[2,186],111:69,118:[2,186],126:[2,186],128:[2,186],129:[2,186],132:[1,78],133:[2,186],134:[2,186],135:[2,186],136:[2,186],137:[2,186]},{103:90,104:[1,65],106:[1,66],109:91,110:[1,68],111:69,126:[1,89]},{1:[2,187],6:[2,187],25:[2,187],26:[2,187],49:[2,187],54:[2,187],57:[2,187],73:[2,187],78:[2,187],86:[2,187],91:[2,187],93:[2,187],102:[2,187],103:87,104:[2,187],105:[2,187],106:[2,187],109:88,110:[2,187],111:69,118:[2,187],126:[2,187],128:[2,187],129:[2,187],132:[1,78],133:[2,187],134:[2,187],135:[2,187],136:[2,187],137:[2,187]},{1:[2,188],6:[2,188],25:[2,188],26:[2,188],49:[2,188],54:[2,188],57:[2,188],73:[2,188],78:[2,188],86:[2,188],91:[2,188],93:[2,188],102:[2,188],103:87,104:[2,188],105:[2,188],106:[2,188],109:88,110:[2,188],111:69,118:[2,188],126:[2,188],128:[2,188],129:[2,188],132:[1,78],133:[2,188],134:[2,188],135:[2,188],136:[2,188],137:[2,188]},{1:[2,189],6:[2,189],25:[2,189],26:[2,189],49:[2,189],54:[2,189],57:[2,189],66:[2,72],67:[2,72],68:[2,72],69:[2,72],71:[2,72],73:[2,189],74:[2,72],78:[2,189],84:[2,72],85:[2,72],86:[2,189],91:[2,189],93:[2,189],102:[2,189],104:[2,189],105:[2,189],106:[2,189],110:[2,189],118:[2,189],126:[2,189],128:[2,189],129:[2,189],132:[2,189],133:[2,189],134:[2,189],135:[2,189],136:[2,189],137:[2,189]},{62:93,66:[1,95],67:[1,96],68:[1,97],69:[1,98],70:99,71:[1,100],74:[1,101],81:92,84:[1,94],85:[2,108]},{62:103,66:[1,95],67:[1,96],68:[1,97],69:[1,98],70:99,71:[1,100],74:[1,101],81:102,84:[1,94],85:[2,108]},{66:[2,75],67:[2,75],68:[2,75],69:[2,75],71:[2,75],74:[2,75],84:[2,75],85:[2,75]},{1:[2,190],6:[2,190],25:[2,190],26:[2,190],49:[2,190],54:[2,190],57:[2,190],66:[2,72],67:[2,72],68:[2,72],69:[2,72],71:[2,72],73:[2,190],74:[2,72],78:[2,190],84:[2,72],85:[2,72],86:[2,190],91:[2,190],93:[2,190],102:[2,190],104:[2,190],105:[2,190],106:[2,190],110:[2,190],118:[2,190],126:[2,190],128:[2,190],129:[2,190],132:[2,190],133:[2,190],134:[2,190],135:[2,190],136:[2,190],137:[2,190]},{1:[2,191],6:[2,191],25:[2,191],26:[2,191],49:[2,191],54:[2,191],57:[2,191],73:[2,191],78:[2,191],86:[2,191],91:[2,191],93:[2,191],102:[2,191],104:[2,191],105:[2,191],106:[2,191],110:[2,191],118:[2,191],126:[2,191],128:[2,191],129:[2,191],132:[2,191],133:[2,191],134:[2,191],135:[2,191],136:[2,191],137:[2,191]},{1:[2,192],6:[2,192],25:[2,192],26:[2,192],49:[2,192],54:[2,192],57:[2,192],73:[2,192],78:[2,192],86:[2,192],91:[2,192],93:[2,192],102:[2,192],104:[2,192],105:[2,192],106:[2,192],110:[2,192],118:[2,192],126:[2,192],128:[2,192],129:[2,192],132:[2,192],133:[2,192],134:[2,192],135:[2,192],136:[2,192],137:[2,192]},{6:[1,210],8:208,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,209],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:211,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{5:212,25:[1,5],125:[1,213]},{1:[2,133],6:[2,133],25:[2,133],26:[2,133],49:[2,133],54:[2,133],57:[2,133],73:[2,133],78:[2,133],86:[2,133],91:[2,133],93:[2,133],97:214,98:[1,215],99:[1,216],102:[2,133],104:[2,133],105:[2,133],106:[2,133],110:[2,133],118:[2,133],126:[2,133],128:[2,133],129:[2,133],132:[2,133],133:[2,133],134:[2,133],135:[2,133],136:[2,133],137:[2,133]},{1:[2,146],6:[2,146],25:[2,146],26:[2,146],49:[2,146],54:[2,146],57:[2,146],73:[2,146],78:[2,146],86:[2,146],91:[2,146],93:[2,146],102:[2,146],104:[2,146],105:[2,146],106:[2,146],110:[2,146],118:[2,146],126:[2,146],128:[2,146],129:[2,146],132:[2,146],133:[2,146],134:[2,146],135:[2,146],136:[2,146],137:[2,146]},{1:[2,154],6:[2,154],25:[2,154],26:[2,154],49:[2,154],54:[2,154],57:[2,154],73:[2,154],78:[2,154],86:[2,154],91:[2,154],93:[2,154],102:[2,154],104:[2,154],105:[2,154],106:[2,154],110:[2,154],118:[2,154],126:[2,154],128:[2,154],129:[2,154],132:[2,154],133:[2,154],134:[2,154],135:[2,154],136:[2,154],137:[2,154]},{25:[1,217],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{120:218,122:219,123:[1,220]},{1:[2,97],6:[2,97],25:[2,97],26:[2,97],49:[2,97],54:[2,97],57:[2,97],73:[2,97],78:[2,97],86:[2,97],91:[2,97],93:[2,97],102:[2,97],104:[2,97],105:[2,97],106:[2,97],110:[2,97],118:[2,97],126:[2,97],128:[2,97],129:[2,97],132:[2,97],133:[2,97],134:[2,97],135:[2,97],136:[2,97],137:[2,97]},{8:221,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,100],5:222,6:[2,100],25:[1,5],26:[2,100],49:[2,100],54:[2,100],57:[2,100],66:[2,72],67:[2,72],68:[2,72],69:[2,72],71:[2,72],73:[2,100],74:[2,72],78:[2,100],80:[1,223],84:[2,72],85:[2,72],86:[2,100],91:[2,100],93:[2,100],102:[2,100],104:[2,100],105:[2,100],106:[2,100],110:[2,100],118:[2,100],126:[2,100],128:[2,100],129:[2,100],132:[2,100],133:[2,100],134:[2,100],135:[2,100],136:[2,100],137:[2,100]},{1:[2,139],6:[2,139],25:[2,139],26:[2,139],49:[2,139],54:[2,139],57:[2,139],73:[2,139],78:[2,139],86:[2,139],91:[2,139],93:[2,139],102:[2,139],103:87,104:[2,139],105:[2,139],106:[2,139],109:88,110:[2,139],111:69,118:[2,139],126:[2,139],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,46],6:[2,46],26:[2,46],102:[2,46],103:87,104:[2,46],106:[2,46],109:88,110:[2,46],111:69,126:[2,46],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[1,74],102:[1,224]},{4:225,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,129],25:[2,129],54:[2,129],57:[1,227],91:[2,129],92:226,93:[1,193],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,115],6:[2,115],25:[2,115],26:[2,115],40:[2,115],49:[2,115],54:[2,115],57:[2,115],66:[2,115],67:[2,115],68:[2,115],69:[2,115],71:[2,115],73:[2,115],74:[2,115],78:[2,115],84:[2,115],85:[2,115],86:[2,115],91:[2,115],93:[2,115],102:[2,115],104:[2,115],105:[2,115],106:[2,115],110:[2,115],116:[2,115],117:[2,115],118:[2,115],126:[2,115],128:[2,115],129:[2,115],132:[2,115],133:[2,115],134:[2,115],135:[2,115],136:[2,115],137:[2,115]},{6:[2,53],25:[2,53],53:228,54:[1,229],91:[2,53]},{6:[2,124],25:[2,124],26:[2,124],54:[2,124],86:[2,124],91:[2,124]},{8:202,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,147],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],87:230,88:[1,58],89:[1,59],90:[1,57],94:146,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,130],25:[2,130],26:[2,130],54:[2,130],86:[2,130],91:[2,130]},{1:[2,114],6:[2,114],25:[2,114],26:[2,114],40:[2,114],43:[2,114],49:[2,114],54:[2,114],57:[2,114],66:[2,114],67:[2,114],68:[2,114],69:[2,114],71:[2,114],73:[2,114],74:[2,114],78:[2,114],80:[2,114],84:[2,114],85:[2,114],86:[2,114],91:[2,114],93:[2,114],102:[2,114],104:[2,114],105:[2,114],106:[2,114],110:[2,114],116:[2,114],117:[2,114],118:[2,114],126:[2,114],128:[2,114],129:[2,114],130:[2,114],131:[2,114],132:[2,114],133:[2,114],134:[2,114],135:[2,114],136:[2,114],137:[2,114],138:[2,114]},{5:231,25:[1,5],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,142],6:[2,142],25:[2,142],26:[2,142],49:[2,142],54:[2,142],57:[2,142],73:[2,142],78:[2,142],86:[2,142],91:[2,142],93:[2,142],102:[2,142],103:87,104:[1,65],105:[1,232],106:[1,66],109:88,110:[1,68],111:69,118:[2,142],126:[2,142],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,144],6:[2,144],25:[2,144],26:[2,144],49:[2,144],54:[2,144],57:[2,144],73:[2,144],78:[2,144],86:[2,144],91:[2,144],93:[2,144],102:[2,144],103:87,104:[1,65],105:[1,233],106:[1,66],109:88,110:[1,68],111:69,118:[2,144],126:[2,144],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,150],6:[2,150],25:[2,150],26:[2,150],49:[2,150],54:[2,150],57:[2,150],73:[2,150],78:[2,150],86:[2,150],91:[2,150],93:[2,150],102:[2,150],104:[2,150],105:[2,150],106:[2,150],110:[2,150],118:[2,150],126:[2,150],128:[2,150],129:[2,150],132:[2,150],133:[2,150],134:[2,150],135:[2,150],136:[2,150],137:[2,150]},{1:[2,151],6:[2,151],25:[2,151],26:[2,151],49:[2,151],54:[2,151],57:[2,151],73:[2,151],78:[2,151],86:[2,151],91:[2,151],93:[2,151],102:[2,151],103:87,104:[1,65],105:[2,151],106:[1,66],109:88,110:[1,68],111:69,118:[2,151],126:[2,151],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,155],6:[2,155],25:[2,155],26:[2,155],49:[2,155],54:[2,155],57:[2,155],73:[2,155],78:[2,155],86:[2,155],91:[2,155],93:[2,155],102:[2,155],104:[2,155],105:[2,155],106:[2,155],110:[2,155],118:[2,155],126:[2,155],128:[2,155],129:[2,155],132:[2,155],133:[2,155],134:[2,155],135:[2,155],136:[2,155],137:[2,155]},{116:[2,157],117:[2,157]},{27:159,28:[1,73],44:160,58:161,59:162,76:[1,70],89:[1,114],90:[1,115],113:234,115:158},{54:[1,235],116:[2,163],117:[2,163]},{54:[2,159],116:[2,159],117:[2,159]},{54:[2,160],116:[2,160],117:[2,160]},{54:[2,161],116:[2,161],117:[2,161]},{54:[2,162],116:[2,162],117:[2,162]},{1:[2,156],6:[2,156],25:[2,156],26:[2,156],49:[2,156],54:[2,156],57:[2,156],73:[2,156],78:[2,156],86:[2,156],91:[2,156],93:[2,156],102:[2,156],104:[2,156],105:[2,156],106:[2,156],110:[2,156],118:[2,156],126:[2,156],128:[2,156],129:[2,156],132:[2,156],133:[2,156],134:[2,156],135:[2,156],136:[2,156],137:[2,156]},{8:236,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:237,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,53],25:[2,53],53:238,54:[1,239],78:[2,53]},{6:[2,92],25:[2,92],26:[2,92],54:[2,92],78:[2,92]},{6:[2,39],25:[2,39],26:[2,39],43:[1,240],54:[2,39],78:[2,39]},{6:[2,42],25:[2,42],26:[2,42],54:[2,42],78:[2,42]},{6:[2,43],25:[2,43],26:[2,43],43:[2,43],54:[2,43],78:[2,43]},{6:[2,44],25:[2,44],26:[2,44],43:[2,44],54:[2,44],78:[2,44]},{6:[2,45],25:[2,45],26:[2,45],43:[2,45],54:[2,45],78:[2,45]},{1:[2,5],6:[2,5],26:[2,5],102:[2,5]},{1:[2,25],6:[2,25],25:[2,25],26:[2,25],49:[2,25],54:[2,25],57:[2,25],73:[2,25],78:[2,25],86:[2,25],91:[2,25],93:[2,25],98:[2,25],99:[2,25],102:[2,25],104:[2,25],105:[2,25],106:[2,25],110:[2,25],118:[2,25],121:[2,25],123:[2,25],126:[2,25],128:[2,25],129:[2,25],132:[2,25],133:[2,25],134:[2,25],135:[2,25],136:[2,25],137:[2,25]},{1:[2,194],6:[2,194],25:[2,194],26:[2,194],49:[2,194],54:[2,194],57:[2,194],73:[2,194],78:[2,194],86:[2,194],91:[2,194],93:[2,194],102:[2,194],103:87,104:[2,194],105:[2,194],106:[2,194],109:88,110:[2,194],111:69,118:[2,194],126:[2,194],128:[2,194],129:[2,194],132:[1,78],133:[1,81],134:[2,194],135:[2,194],136:[2,194],137:[2,194]},{1:[2,195],6:[2,195],25:[2,195],26:[2,195],49:[2,195],54:[2,195],57:[2,195],73:[2,195],78:[2,195],86:[2,195],91:[2,195],93:[2,195],102:[2,195],103:87,104:[2,195],105:[2,195],106:[2,195],109:88,110:[2,195],111:69,118:[2,195],126:[2,195],128:[2,195],129:[2,195],132:[1,78],133:[1,81],134:[2,195],135:[2,195],136:[2,195],137:[2,195]},{1:[2,196],6:[2,196],25:[2,196],26:[2,196],49:[2,196],54:[2,196],57:[2,196],73:[2,196],78:[2,196],86:[2,196],91:[2,196],93:[2,196],102:[2,196],103:87,104:[2,196],105:[2,196],106:[2,196],109:88,110:[2,196],111:69,118:[2,196],126:[2,196],128:[2,196],129:[2,196],132:[1,78],133:[2,196],134:[2,196],135:[2,196],136:[2,196],137:[2,196]},{1:[2,197],6:[2,197],25:[2,197],26:[2,197],49:[2,197],54:[2,197],57:[2,197],73:[2,197],78:[2,197],86:[2,197],91:[2,197],93:[2,197],102:[2,197],103:87,104:[2,197],105:[2,197],106:[2,197],109:88,110:[2,197],111:69,118:[2,197],126:[2,197],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[2,197],135:[2,197],136:[2,197],137:[2,197]},{1:[2,198],6:[2,198],25:[2,198],26:[2,198],49:[2,198],54:[2,198],57:[2,198],73:[2,198],78:[2,198],86:[2,198],91:[2,198],93:[2,198],102:[2,198],103:87,104:[2,198],105:[2,198],106:[2,198],109:88,110:[2,198],111:69,118:[2,198],126:[2,198],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[2,198],136:[2,198],137:[1,85]},{1:[2,199],6:[2,199],25:[2,199],26:[2,199],49:[2,199],54:[2,199],57:[2,199],73:[2,199],78:[2,199],86:[2,199],91:[2,199],93:[2,199],102:[2,199],103:87,104:[2,199],105:[2,199],106:[2,199],109:88,110:[2,199],111:69,118:[2,199],126:[2,199],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[2,199],137:[1,85]},{1:[2,200],6:[2,200],25:[2,200],26:[2,200],49:[2,200],54:[2,200],57:[2,200],73:[2,200],78:[2,200],86:[2,200],91:[2,200],93:[2,200],102:[2,200],103:87,104:[2,200],105:[2,200],106:[2,200],109:88,110:[2,200],111:69,118:[2,200],126:[2,200],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[2,200],136:[2,200],137:[2,200]},{1:[2,185],6:[2,185],25:[2,185],26:[2,185],49:[2,185],54:[2,185],57:[2,185],73:[2,185],78:[2,185],86:[2,185],91:[2,185],93:[2,185],102:[2,185],103:87,104:[1,65],105:[2,185],106:[1,66],109:88,110:[1,68],111:69,118:[2,185],126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,184],6:[2,184],25:[2,184],26:[2,184],49:[2,184],54:[2,184],57:[2,184],73:[2,184],78:[2,184],86:[2,184],91:[2,184],93:[2,184],102:[2,184],103:87,104:[1,65],105:[2,184],106:[1,66],109:88,110:[1,68],111:69,118:[2,184],126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,104],6:[2,104],25:[2,104],26:[2,104],49:[2,104],54:[2,104],57:[2,104],66:[2,104],67:[2,104],68:[2,104],69:[2,104],71:[2,104],73:[2,104],74:[2,104],78:[2,104],84:[2,104],85:[2,104],86:[2,104],91:[2,104],93:[2,104],102:[2,104],104:[2,104],105:[2,104],106:[2,104],110:[2,104],118:[2,104],126:[2,104],128:[2,104],129:[2,104],132:[2,104],133:[2,104],134:[2,104],135:[2,104],136:[2,104],137:[2,104]},{1:[2,80],6:[2,80],25:[2,80],26:[2,80],40:[2,80],49:[2,80],54:[2,80],57:[2,80],66:[2,80],67:[2,80],68:[2,80],69:[2,80],71:[2,80],73:[2,80],74:[2,80],78:[2,80],80:[2,80],84:[2,80],85:[2,80],86:[2,80],91:[2,80],93:[2,80],102:[2,80],104:[2,80],105:[2,80],106:[2,80],110:[2,80],118:[2,80],126:[2,80],128:[2,80],129:[2,80],130:[2,80],131:[2,80],132:[2,80],133:[2,80],134:[2,80],135:[2,80],136:[2,80],137:[2,80],138:[2,80]},{1:[2,81],6:[2,81],25:[2,81],26:[2,81],40:[2,81],49:[2,81],54:[2,81],57:[2,81],66:[2,81],67:[2,81],68:[2,81],69:[2,81],71:[2,81],73:[2,81],74:[2,81],78:[2,81],80:[2,81],84:[2,81],85:[2,81],86:[2,81],91:[2,81],93:[2,81],102:[2,81],104:[2,81],105:[2,81],106:[2,81],110:[2,81],118:[2,81],126:[2,81],128:[2,81],129:[2,81],130:[2,81],131:[2,81],132:[2,81],133:[2,81],134:[2,81],135:[2,81],136:[2,81],137:[2,81],138:[2,81]},{1:[2,82],6:[2,82],25:[2,82],26:[2,82],40:[2,82],49:[2,82],54:[2,82],57:[2,82],66:[2,82],67:[2,82],68:[2,82],69:[2,82],71:[2,82],73:[2,82],74:[2,82],78:[2,82],80:[2,82],84:[2,82],85:[2,82],86:[2,82],91:[2,82],93:[2,82],102:[2,82],104:[2,82],105:[2,82],106:[2,82],110:[2,82],118:[2,82],126:[2,82],128:[2,82],129:[2,82],130:[2,82],131:[2,82],132:[2,82],133:[2,82],134:[2,82],135:[2,82],136:[2,82],137:[2,82],138:[2,82]},{1:[2,83],6:[2,83],25:[2,83],26:[2,83],40:[2,83],49:[2,83],54:[2,83],57:[2,83],66:[2,83],67:[2,83],68:[2,83],69:[2,83],71:[2,83],73:[2,83],74:[2,83],78:[2,83],80:[2,83],84:[2,83],85:[2,83],86:[2,83],91:[2,83],93:[2,83],102:[2,83],104:[2,83],105:[2,83],106:[2,83],110:[2,83],118:[2,83],126:[2,83],128:[2,83],129:[2,83],130:[2,83],131:[2,83],132:[2,83],133:[2,83],134:[2,83],135:[2,83],136:[2,83],137:[2,83],138:[2,83]},{73:[1,241]},{57:[1,194],73:[2,88],92:242,93:[1,193],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{73:[2,89]},{8:243,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,73:[2,123],76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{12:[2,117],28:[2,117],30:[2,117],31:[2,117],33:[2,117],34:[2,117],35:[2,117],36:[2,117],37:[2,117],38:[2,117],45:[2,117],46:[2,117],47:[2,117],51:[2,117],52:[2,117],73:[2,117],76:[2,117],79:[2,117],83:[2,117],88:[2,117],89:[2,117],90:[2,117],96:[2,117],100:[2,117],101:[2,117],104:[2,117],106:[2,117],108:[2,117],110:[2,117],119:[2,117],125:[2,117],127:[2,117],128:[2,117],129:[2,117],130:[2,117],131:[2,117]},{12:[2,118],28:[2,118],30:[2,118],31:[2,118],33:[2,118],34:[2,118],35:[2,118],36:[2,118],37:[2,118],38:[2,118],45:[2,118],46:[2,118],47:[2,118],51:[2,118],52:[2,118],73:[2,118],76:[2,118],79:[2,118],83:[2,118],88:[2,118],89:[2,118],90:[2,118],96:[2,118],100:[2,118],101:[2,118],104:[2,118],106:[2,118],108:[2,118],110:[2,118],119:[2,118],125:[2,118],127:[2,118],128:[2,118],129:[2,118],130:[2,118],131:[2,118]},{1:[2,87],6:[2,87],25:[2,87],26:[2,87],40:[2,87],49:[2,87],54:[2,87],57:[2,87],66:[2,87],67:[2,87],68:[2,87],69:[2,87],71:[2,87],73:[2,87],74:[2,87],78:[2,87],80:[2,87],84:[2,87],85:[2,87],86:[2,87],91:[2,87],93:[2,87],102:[2,87],104:[2,87],105:[2,87],106:[2,87],110:[2,87],118:[2,87],126:[2,87],128:[2,87],129:[2,87],130:[2,87],131:[2,87],132:[2,87],133:[2,87],134:[2,87],135:[2,87],136:[2,87],137:[2,87],138:[2,87]},{1:[2,105],6:[2,105],25:[2,105],26:[2,105],49:[2,105],54:[2,105],57:[2,105],66:[2,105],67:[2,105],68:[2,105],69:[2,105],71:[2,105],73:[2,105],74:[2,105],78:[2,105],84:[2,105],85:[2,105],86:[2,105],91:[2,105],93:[2,105],102:[2,105],104:[2,105],105:[2,105],106:[2,105],110:[2,105],118:[2,105],126:[2,105],128:[2,105],129:[2,105],132:[2,105],133:[2,105],134:[2,105],135:[2,105],136:[2,105],137:[2,105]},{1:[2,36],6:[2,36],25:[2,36],26:[2,36],49:[2,36],54:[2,36],57:[2,36],73:[2,36],78:[2,36],86:[2,36],91:[2,36],93:[2,36],102:[2,36],103:87,104:[2,36],105:[2,36],106:[2,36],109:88,110:[2,36],111:69,118:[2,36],126:[2,36],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{8:244,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:245,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,110],6:[2,110],25:[2,110],26:[2,110],49:[2,110],54:[2,110],57:[2,110],66:[2,110],67:[2,110],68:[2,110],69:[2,110],71:[2,110],73:[2,110],74:[2,110],78:[2,110],84:[2,110],85:[2,110],86:[2,110],91:[2,110],93:[2,110],102:[2,110],104:[2,110],105:[2,110],106:[2,110],110:[2,110],118:[2,110],126:[2,110],128:[2,110],129:[2,110],132:[2,110],133:[2,110],134:[2,110],135:[2,110],136:[2,110],137:[2,110]},{6:[2,53],25:[2,53],53:246,54:[1,229],86:[2,53]},{6:[2,129],25:[2,129],26:[2,129],54:[2,129],57:[1,247],86:[2,129],91:[2,129],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{50:248,51:[1,60],52:[1,61]},{6:[2,54],25:[2,54],26:[2,54],27:110,28:[1,73],44:111,55:249,56:109,58:112,59:113,76:[1,70],89:[1,114],90:[1,115]},{6:[1,250],25:[1,251]},{6:[2,61],25:[2,61],26:[2,61],49:[2,61],54:[2,61]},{8:252,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,201],6:[2,201],25:[2,201],26:[2,201],49:[2,201],54:[2,201],57:[2,201],73:[2,201],78:[2,201],86:[2,201],91:[2,201],93:[2,201],102:[2,201],103:87,104:[2,201],105:[2,201],106:[2,201],109:88,110:[2,201],111:69,118:[2,201],126:[2,201],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{8:253,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:254,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,204],6:[2,204],25:[2,204],26:[2,204],49:[2,204],54:[2,204],57:[2,204],73:[2,204],78:[2,204],86:[2,204],91:[2,204],93:[2,204],102:[2,204],103:87,104:[2,204],105:[2,204],106:[2,204],109:88,110:[2,204],111:69,118:[2,204],126:[2,204],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,183],6:[2,183],25:[2,183],26:[2,183],49:[2,183],54:[2,183],57:[2,183],73:[2,183],78:[2,183],86:[2,183],91:[2,183],93:[2,183],102:[2,183],104:[2,183],105:[2,183],106:[2,183],110:[2,183],118:[2,183],126:[2,183],128:[2,183],129:[2,183],132:[2,183],133:[2,183],134:[2,183],135:[2,183],136:[2,183],137:[2,183]},{8:255,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,134],6:[2,134],25:[2,134],26:[2,134],49:[2,134],54:[2,134],57:[2,134],73:[2,134],78:[2,134],86:[2,134],91:[2,134],93:[2,134],98:[1,256],102:[2,134],104:[2,134],105:[2,134],106:[2,134],110:[2,134],118:[2,134],126:[2,134],128:[2,134],129:[2,134],132:[2,134],133:[2,134],134:[2,134],135:[2,134],136:[2,134],137:[2,134]},{5:257,25:[1,5]},{27:258,28:[1,73],59:259,76:[1,70]},{120:260,122:219,123:[1,220]},{26:[1,261],121:[1,262],122:263,123:[1,220]},{26:[2,176],121:[2,176],123:[2,176]},{8:265,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],95:264,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,98],5:266,6:[2,98],25:[1,5],26:[2,98],49:[2,98],54:[2,98],57:[2,98],73:[2,98],78:[2,98],86:[2,98],91:[2,98],93:[2,98],102:[2,98],103:87,104:[1,65],105:[2,98],106:[1,66],109:88,110:[1,68],111:69,118:[2,98],126:[2,98],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,101],6:[2,101],25:[2,101],26:[2,101],49:[2,101],54:[2,101],57:[2,101],73:[2,101],78:[2,101],86:[2,101],91:[2,101],93:[2,101],102:[2,101],104:[2,101],105:[2,101],106:[2,101],110:[2,101],118:[2,101],126:[2,101],128:[2,101],129:[2,101],132:[2,101],133:[2,101],134:[2,101],135:[2,101],136:[2,101],137:[2,101]},{8:267,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,140],6:[2,140],25:[2,140],26:[2,140],49:[2,140],54:[2,140],57:[2,140],66:[2,140],67:[2,140],68:[2,140],69:[2,140],71:[2,140],73:[2,140],74:[2,140],78:[2,140],84:[2,140],85:[2,140],86:[2,140],91:[2,140],93:[2,140],102:[2,140],104:[2,140],105:[2,140],106:[2,140],110:[2,140],118:[2,140],126:[2,140],128:[2,140],129:[2,140],132:[2,140],133:[2,140],134:[2,140],135:[2,140],136:[2,140],137:[2,140]},{6:[1,74],26:[1,268]},{8:269,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,67],12:[2,118],25:[2,67],28:[2,118],30:[2,118],31:[2,118],33:[2,118],34:[2,118],35:[2,118],36:[2,118],37:[2,118],38:[2,118],45:[2,118],46:[2,118],47:[2,118],51:[2,118],52:[2,118],54:[2,67],76:[2,118],79:[2,118],83:[2,118],88:[2,118],89:[2,118],90:[2,118],91:[2,67],96:[2,118],100:[2,118],101:[2,118],104:[2,118],106:[2,118],108:[2,118],110:[2,118],119:[2,118],125:[2,118],127:[2,118],128:[2,118],129:[2,118],130:[2,118],131:[2,118]},{6:[1,271],25:[1,272],91:[1,270]},{6:[2,54],8:202,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[2,54],26:[2,54],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],86:[2,54],88:[1,58],89:[1,59],90:[1,57],91:[2,54],94:273,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,53],25:[2,53],26:[2,53],53:274,54:[1,229]},{1:[2,180],6:[2,180],25:[2,180],26:[2,180],49:[2,180],54:[2,180],57:[2,180],73:[2,180],78:[2,180],86:[2,180],91:[2,180],93:[2,180],102:[2,180],104:[2,180],105:[2,180],106:[2,180],110:[2,180],118:[2,180],121:[2,180],126:[2,180],128:[2,180],129:[2,180],132:[2,180],133:[2,180],134:[2,180],135:[2,180],136:[2,180],137:[2,180]},{8:275,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:276,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{116:[2,158],117:[2,158]},{27:159,28:[1,73],44:160,58:161,59:162,76:[1,70],89:[1,114],90:[1,115],115:277},{1:[2,165],6:[2,165],25:[2,165],26:[2,165],49:[2,165],54:[2,165],57:[2,165],73:[2,165],78:[2,165],86:[2,165],91:[2,165],93:[2,165],102:[2,165],103:87,104:[2,165],105:[1,278],106:[2,165],109:88,110:[2,165],111:69,118:[1,279],126:[2,165],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,166],6:[2,166],25:[2,166],26:[2,166],49:[2,166],54:[2,166],57:[2,166],73:[2,166],78:[2,166],86:[2,166],91:[2,166],93:[2,166],102:[2,166],103:87,104:[2,166],105:[1,280],106:[2,166],109:88,110:[2,166],111:69,118:[2,166],126:[2,166],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[1,282],25:[1,283],78:[1,281]},{6:[2,54],11:169,25:[2,54],26:[2,54],27:170,28:[1,73],29:171,30:[1,71],31:[1,72],41:284,42:168,44:172,46:[1,46],78:[2,54],89:[1,114]},{8:285,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,286],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,86],6:[2,86],25:[2,86],26:[2,86],40:[2,86],49:[2,86],54:[2,86],57:[2,86],66:[2,86],67:[2,86],68:[2,86],69:[2,86],71:[2,86],73:[2,86],74:[2,86],78:[2,86],80:[2,86],84:[2,86],85:[2,86],86:[2,86],91:[2,86],93:[2,86],102:[2,86],104:[2,86],105:[2,86],106:[2,86],110:[2,86],118:[2,86],126:[2,86],128:[2,86],129:[2,86],130:[2,86],131:[2,86],132:[2,86],133:[2,86],134:[2,86],135:[2,86],136:[2,86],137:[2,86],138:[2,86]},{8:287,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,73:[2,121],76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{73:[2,122],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,37],6:[2,37],25:[2,37],26:[2,37],49:[2,37],54:[2,37],57:[2,37],73:[2,37],78:[2,37],86:[2,37],91:[2,37],93:[2,37],102:[2,37],103:87,104:[2,37],105:[2,37],106:[2,37],109:88,110:[2,37],111:69,118:[2,37],126:[2,37],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{26:[1,288],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[1,271],25:[1,272],86:[1,289]},{6:[2,67],25:[2,67],26:[2,67],54:[2,67],86:[2,67],91:[2,67]},{5:290,25:[1,5]},{6:[2,57],25:[2,57],26:[2,57],49:[2,57],54:[2,57]},{27:110,28:[1,73],44:111,55:291,56:109,58:112,59:113,76:[1,70],89:[1,114],90:[1,115]},{6:[2,55],25:[2,55],26:[2,55],27:110,28:[1,73],44:111,48:292,54:[2,55],55:108,56:109,58:112,59:113,76:[1,70],89:[1,114],90:[1,115]},{6:[2,62],25:[2,62],26:[2,62],49:[2,62],54:[2,62],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{26:[1,293],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,203],6:[2,203],25:[2,203],26:[2,203],49:[2,203],54:[2,203],57:[2,203],73:[2,203],78:[2,203],86:[2,203],91:[2,203],93:[2,203],102:[2,203],103:87,104:[2,203],105:[2,203],106:[2,203],109:88,110:[2,203],111:69,118:[2,203],126:[2,203],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{5:294,25:[1,5],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{5:295,25:[1,5]},{1:[2,135],6:[2,135],25:[2,135],26:[2,135],49:[2,135],54:[2,135],57:[2,135],73:[2,135],78:[2,135],86:[2,135],91:[2,135],93:[2,135],102:[2,135],104:[2,135],105:[2,135],106:[2,135],110:[2,135],118:[2,135],126:[2,135],128:[2,135],129:[2,135],132:[2,135],133:[2,135],134:[2,135],135:[2,135],136:[2,135],137:[2,135]},{5:296,25:[1,5]},{5:297,25:[1,5]},{26:[1,298],121:[1,299],122:263,123:[1,220]},{1:[2,174],6:[2,174],25:[2,174],26:[2,174],49:[2,174],54:[2,174],57:[2,174],73:[2,174],78:[2,174],86:[2,174],91:[2,174],93:[2,174],102:[2,174],104:[2,174],105:[2,174],106:[2,174],110:[2,174],118:[2,174],126:[2,174],128:[2,174],129:[2,174],132:[2,174],133:[2,174],134:[2,174],135:[2,174],136:[2,174],137:[2,174]},{5:300,25:[1,5]},{26:[2,177],121:[2,177],123:[2,177]},{5:301,25:[1,5],54:[1,302]},{25:[2,131],54:[2,131],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,99],6:[2,99],25:[2,99],26:[2,99],49:[2,99],54:[2,99],57:[2,99],73:[2,99],78:[2,99],86:[2,99],91:[2,99],93:[2,99],102:[2,99],104:[2,99],105:[2,99],106:[2,99],110:[2,99],118:[2,99],126:[2,99],128:[2,99],129:[2,99],132:[2,99],133:[2,99],134:[2,99],135:[2,99],136:[2,99],137:[2,99]},{1:[2,102],5:303,6:[2,102],25:[1,5],26:[2,102],49:[2,102],54:[2,102],57:[2,102],73:[2,102],78:[2,102],86:[2,102],91:[2,102],93:[2,102],102:[2,102],103:87,104:[1,65],105:[2,102],106:[1,66],109:88,110:[1,68],111:69,118:[2,102],126:[2,102],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{102:[1,304]},{91:[1,305],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,116],6:[2,116],25:[2,116],26:[2,116],40:[2,116],49:[2,116],54:[2,116],57:[2,116],66:[2,116],67:[2,116],68:[2,116],69:[2,116],71:[2,116],73:[2,116],74:[2,116],78:[2,116],84:[2,116],85:[2,116],86:[2,116],91:[2,116],93:[2,116],102:[2,116],104:[2,116],105:[2,116],106:[2,116],110:[2,116],116:[2,116],117:[2,116],118:[2,116],126:[2,116],128:[2,116],129:[2,116],132:[2,116],133:[2,116],134:[2,116],135:[2,116],136:[2,116],137:[2,116]},{8:202,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],94:306,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:202,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,147],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],87:307,88:[1,58],89:[1,59],90:[1,57],94:146,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,125],25:[2,125],26:[2,125],54:[2,125],86:[2,125],91:[2,125]},{6:[1,271],25:[1,272],26:[1,308]},{1:[2,143],6:[2,143],25:[2,143],26:[2,143],49:[2,143],54:[2,143],57:[2,143],73:[2,143],78:[2,143],86:[2,143],91:[2,143],93:[2,143],102:[2,143],103:87,104:[1,65],105:[2,143],106:[1,66],109:88,110:[1,68],111:69,118:[2,143],126:[2,143],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,145],6:[2,145],25:[2,145],26:[2,145],49:[2,145],54:[2,145],57:[2,145],73:[2,145],78:[2,145],86:[2,145],91:[2,145],93:[2,145],102:[2,145],103:87,104:[1,65],105:[2,145],106:[1,66],109:88,110:[1,68],111:69,118:[2,145],126:[2,145],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{116:[2,164],117:[2,164]},{8:309,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:310,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:311,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,90],6:[2,90],25:[2,90],26:[2,90],40:[2,90],49:[2,90],54:[2,90],57:[2,90],66:[2,90],67:[2,90],68:[2,90],69:[2,90],71:[2,90],73:[2,90],74:[2,90],78:[2,90],84:[2,90],85:[2,90],86:[2,90],91:[2,90],93:[2,90],102:[2,90],104:[2,90],105:[2,90],106:[2,90],110:[2,90],116:[2,90],117:[2,90],118:[2,90],126:[2,90],128:[2,90],129:[2,90],132:[2,90],133:[2,90],134:[2,90],135:[2,90],136:[2,90],137:[2,90]},{11:169,27:170,28:[1,73],29:171,30:[1,71],31:[1,72],41:312,42:168,44:172,46:[1,46],89:[1,114]},{6:[2,91],11:169,25:[2,91],26:[2,91],27:170,28:[1,73],29:171,30:[1,71],31:[1,72],41:167,42:168,44:172,46:[1,46],54:[2,91],77:313,89:[1,114]},{6:[2,93],25:[2,93],26:[2,93],54:[2,93],78:[2,93]},{6:[2,40],25:[2,40],26:[2,40],54:[2,40],78:[2,40],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{8:314,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{73:[2,120],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,38],6:[2,38],25:[2,38],26:[2,38],49:[2,38],54:[2,38],57:[2,38],73:[2,38],78:[2,38],86:[2,38],91:[2,38],93:[2,38],102:[2,38],104:[2,38],105:[2,38],106:[2,38],110:[2,38],118:[2,38],126:[2,38],128:[2,38],129:[2,38],132:[2,38],133:[2,38],134:[2,38],135:[2,38],136:[2,38],137:[2,38]},{1:[2,111],6:[2,111],25:[2,111],26:[2,111],49:[2,111],54:[2,111],57:[2,111],66:[2,111],67:[2,111],68:[2,111],69:[2,111],71:[2,111],73:[2,111],74:[2,111],78:[2,111],84:[2,111],85:[2,111],86:[2,111],91:[2,111],93:[2,111],102:[2,111],104:[2,111],105:[2,111],106:[2,111],110:[2,111],118:[2,111],126:[2,111],128:[2,111],129:[2,111],132:[2,111],133:[2,111],134:[2,111],135:[2,111],136:[2,111],137:[2,111]},{1:[2,49],6:[2,49],25:[2,49],26:[2,49],49:[2,49],54:[2,49],57:[2,49],73:[2,49],78:[2,49],86:[2,49],91:[2,49],93:[2,49],102:[2,49],104:[2,49],105:[2,49],106:[2,49],110:[2,49],118:[2,49],126:[2,49],128:[2,49],129:[2,49],132:[2,49],133:[2,49],134:[2,49],135:[2,49],136:[2,49],137:[2,49]},{6:[2,58],25:[2,58],26:[2,58],49:[2,58],54:[2,58]},{6:[2,53],25:[2,53],26:[2,53],53:315,54:[1,204]},{1:[2,202],6:[2,202],25:[2,202],26:[2,202],49:[2,202],54:[2,202],57:[2,202],73:[2,202],78:[2,202],86:[2,202],91:[2,202],93:[2,202],102:[2,202],104:[2,202],105:[2,202],106:[2,202],110:[2,202],118:[2,202],126:[2,202],128:[2,202],129:[2,202],132:[2,202],133:[2,202],134:[2,202],135:[2,202],136:[2,202],137:[2,202]},{1:[2,181],6:[2,181],25:[2,181],26:[2,181],49:[2,181],54:[2,181],57:[2,181],73:[2,181],78:[2,181],86:[2,181],91:[2,181],93:[2,181],102:[2,181],104:[2,181],105:[2,181],106:[2,181],110:[2,181],118:[2,181],121:[2,181],126:[2,181],128:[2,181],129:[2,181],132:[2,181],133:[2,181],134:[2,181],135:[2,181],136:[2,181],137:[2,181]},{1:[2,136],6:[2,136],25:[2,136],26:[2,136],49:[2,136],54:[2,136],57:[2,136],73:[2,136],78:[2,136],86:[2,136],91:[2,136],93:[2,136],102:[2,136],104:[2,136],105:[2,136],106:[2,136],110:[2,136],118:[2,136],126:[2,136],128:[2,136],129:[2,136],132:[2,136],133:[2,136],134:[2,136],135:[2,136],136:[2,136],137:[2,136]},{1:[2,137],6:[2,137],25:[2,137],26:[2,137],49:[2,137],54:[2,137],57:[2,137],73:[2,137],78:[2,137],86:[2,137],91:[2,137],93:[2,137],98:[2,137],102:[2,137],104:[2,137],105:[2,137],106:[2,137],110:[2,137],118:[2,137],126:[2,137],128:[2,137],129:[2,137],132:[2,137],133:[2,137],134:[2,137],135:[2,137],136:[2,137],137:[2,137]},{1:[2,138],6:[2,138],25:[2,138],26:[2,138],49:[2,138],54:[2,138],57:[2,138],73:[2,138],78:[2,138],86:[2,138],91:[2,138],93:[2,138],98:[2,138],102:[2,138],104:[2,138],105:[2,138],106:[2,138],110:[2,138],118:[2,138],126:[2,138],128:[2,138],129:[2,138],132:[2,138],133:[2,138],134:[2,138],135:[2,138],136:[2,138],137:[2,138]},{1:[2,172],6:[2,172],25:[2,172],26:[2,172],49:[2,172],54:[2,172],57:[2,172],73:[2,172],78:[2,172],86:[2,172],91:[2,172],93:[2,172],102:[2,172],104:[2,172],105:[2,172],106:[2,172],110:[2,172],118:[2,172],126:[2,172],128:[2,172],129:[2,172],132:[2,172],133:[2,172],134:[2,172],135:[2,172],136:[2,172],137:[2,172]},{5:316,25:[1,5]},{26:[1,317]},{6:[1,318],26:[2,178],121:[2,178],123:[2,178]},{8:319,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,103],6:[2,103],25:[2,103],26:[2,103],49:[2,103],54:[2,103],57:[2,103],73:[2,103],78:[2,103],86:[2,103],91:[2,103],93:[2,103],102:[2,103],104:[2,103],105:[2,103],106:[2,103],110:[2,103],118:[2,103],126:[2,103],128:[2,103],129:[2,103],132:[2,103],133:[2,103],134:[2,103],135:[2,103],136:[2,103],137:[2,103]},{1:[2,141],6:[2,141],25:[2,141],26:[2,141],49:[2,141],54:[2,141],57:[2,141],66:[2,141],67:[2,141],68:[2,141],69:[2,141],71:[2,141],73:[2,141],74:[2,141],78:[2,141],84:[2,141],85:[2,141],86:[2,141],91:[2,141],93:[2,141],102:[2,141],104:[2,141],105:[2,141],106:[2,141],110:[2,141],118:[2,141],126:[2,141],128:[2,141],129:[2,141],132:[2,141],133:[2,141],134:[2,141],135:[2,141],136:[2,141],137:[2,141]},{1:[2,119],6:[2,119],25:[2,119],26:[2,119],49:[2,119],54:[2,119],57:[2,119],66:[2,119],67:[2,119],68:[2,119],69:[2,119],71:[2,119],73:[2,119],74:[2,119],78:[2,119],84:[2,119],85:[2,119],86:[2,119],91:[2,119],93:[2,119],102:[2,119],104:[2,119],105:[2,119],106:[2,119],110:[2,119],118:[2,119],126:[2,119],128:[2,119],129:[2,119],132:[2,119],133:[2,119],134:[2,119],135:[2,119],136:[2,119],137:[2,119]},{6:[2,126],25:[2,126],26:[2,126],54:[2,126],86:[2,126],91:[2,126]},{6:[2,53],25:[2,53],26:[2,53],53:320,54:[1,229]},{6:[2,127],25:[2,127],26:[2,127],54:[2,127],86:[2,127],91:[2,127]},{1:[2,167],6:[2,167],25:[2,167],26:[2,167],49:[2,167],54:[2,167],57:[2,167],73:[2,167],78:[2,167],86:[2,167],91:[2,167],93:[2,167],102:[2,167],103:87,104:[2,167],105:[2,167],106:[2,167],109:88,110:[2,167],111:69,118:[1,321],126:[2,167],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,169],6:[2,169],25:[2,169],26:[2,169],49:[2,169],54:[2,169],57:[2,169],73:[2,169],78:[2,169],86:[2,169],91:[2,169],93:[2,169],102:[2,169],103:87,104:[2,169],105:[1,322],106:[2,169],109:88,110:[2,169],111:69,118:[2,169],126:[2,169],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,168],6:[2,168],25:[2,168],26:[2,168],49:[2,168],54:[2,168],57:[2,168],73:[2,168],78:[2,168],86:[2,168],91:[2,168],93:[2,168],102:[2,168],103:87,104:[2,168],105:[2,168],106:[2,168],109:88,110:[2,168],111:69,118:[2,168],126:[2,168],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[2,94],25:[2,94],26:[2,94],54:[2,94],78:[2,94]},{6:[2,53],25:[2,53],26:[2,53],53:323,54:[1,239]},{26:[1,324],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[1,250],25:[1,251],26:[1,325]},{26:[1,326]},{1:[2,175],6:[2,175],25:[2,175],26:[2,175],49:[2,175],54:[2,175],57:[2,175],73:[2,175],78:[2,175],86:[2,175],91:[2,175],93:[2,175],102:[2,175],104:[2,175],105:[2,175],106:[2,175],110:[2,175],118:[2,175],126:[2,175],128:[2,175],129:[2,175],132:[2,175],133:[2,175],134:[2,175],135:[2,175],136:[2,175],137:[2,175]},{26:[2,179],121:[2,179],123:[2,179]},{25:[2,132],54:[2,132],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[1,271],25:[1,272],26:[1,327]},{8:328,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:329,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[1,282],25:[1,283],26:[1,330]},{6:[2,41],25:[2,41],26:[2,41],54:[2,41],78:[2,41]},{6:[2,59],25:[2,59],26:[2,59],49:[2,59],54:[2,59]},{1:[2,173],6:[2,173],25:[2,173],26:[2,173],49:[2,173],54:[2,173],57:[2,173],73:[2,173],78:[2,173],86:[2,173],91:[2,173],93:[2,173],102:[2,173],104:[2,173],105:[2,173],106:[2,173],110:[2,173],118:[2,173],126:[2,173],128:[2,173],129:[2,173],132:[2,173],133:[2,173],134:[2,173],135:[2,173],136:[2,173],137:[2,173]},{6:[2,128],25:[2,128],26:[2,128],54:[2,128],86:[2,128],91:[2,128]},{1:[2,170],6:[2,170],25:[2,170],26:[2,170],49:[2,170],54:[2,170],57:[2,170],73:[2,170],78:[2,170],86:[2,170],91:[2,170],93:[2,170],102:[2,170],103:87,104:[2,170],105:[2,170],106:[2,170],109:88,110:[2,170],111:69,118:[2,170],126:[2,170],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,171],6:[2,171],25:[2,171],26:[2,171],49:[2,171],54:[2,171],57:[2,171],73:[2,171],78:[2,171],86:[2,171],91:[2,171],93:[2,171],102:[2,171],103:87,104:[2,171],105:[2,171],106:[2,171],109:88,110:[2,171],111:69,118:[2,171],126:[2,171],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[2,95],25:[2,95],26:[2,95],54:[2,95],78:[2,95]}],
+table: [{1:[2,1],3:1,4:2,5:3,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,5],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[3]},{1:[2,2],6:[1,74]},{6:[1,75]},{1:[2,4],6:[2,4],26:[2,4],102:[2,4]},{4:77,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[1,76],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,7],6:[2,7],26:[2,7],102:[2,7],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,8],6:[2,8],26:[2,8],102:[2,8],103:90,104:[1,65],106:[1,66],109:91,110:[1,68],111:69,126:[1,89]},{1:[2,12],6:[2,12],25:[2,12],26:[2,12],49:[2,12],54:[2,12],57:[2,12],62:93,66:[1,95],67:[1,96],68:[1,97],69:[1,98],70:99,71:[1,100],73:[2,12],74:[1,101],78:[2,12],81:92,84:[1,94],85:[2,108],86:[2,12],91:[2,12],93:[2,12],102:[2,12],104:[2,12],105:[2,12],106:[2,12],110:[2,12],118:[2,12],126:[2,12],128:[2,12],129:[2,12],132:[2,12],133:[2,12],134:[2,12],135:[2,12],136:[2,12],137:[2,12]},{1:[2,13],6:[2,13],25:[2,13],26:[2,13],49:[2,13],54:[2,13],57:[2,13],62:103,66:[1,95],67:[1,96],68:[1,97],69:[1,98],70:99,71:[1,100],73:[2,13],74:[1,101],78:[2,13],81:102,84:[1,94],85:[2,108],86:[2,13],91:[2,13],93:[2,13],102:[2,13],104:[2,13],105:[2,13],106:[2,13],110:[2,13],118:[2,13],126:[2,13],128:[2,13],129:[2,13],132:[2,13],133:[2,13],134:[2,13],135:[2,13],136:[2,13],137:[2,13]},{1:[2,14],6:[2,14],25:[2,14],26:[2,14],49:[2,14],54:[2,14],57:[2,14],73:[2,14],78:[2,14],86:[2,14],91:[2,14],93:[2,14],102:[2,14],104:[2,14],105:[2,14],106:[2,14],110:[2,14],118:[2,14],126:[2,14],128:[2,14],129:[2,14],132:[2,14],133:[2,14],134:[2,14],135:[2,14],136:[2,14],137:[2,14]},{1:[2,15],6:[2,15],25:[2,15],26:[2,15],49:[2,15],54:[2,15],57:[2,15],73:[2,15],78:[2,15],86:[2,15],91:[2,15],93:[2,15],102:[2,15],104:[2,15],105:[2,15],106:[2,15],110:[2,15],118:[2,15],126:[2,15],128:[2,15],129:[2,15],132:[2,15],133:[2,15],134:[2,15],135:[2,15],136:[2,15],137:[2,15]},{1:[2,16],6:[2,16],25:[2,16],26:[2,16],49:[2,16],54:[2,16],57:[2,16],73:[2,16],78:[2,16],86:[2,16],91:[2,16],93:[2,16],102:[2,16],104:[2,16],105:[2,16],106:[2,16],110:[2,16],118:[2,16],126:[2,16],128:[2,16],129:[2,16],132:[2,16],133:[2,16],134:[2,16],135:[2,16],136:[2,16],137:[2,16]},{1:[2,17],6:[2,17],25:[2,17],26:[2,17],49:[2,17],54:[2,17],57:[2,17],73:[2,17],78:[2,17],86:[2,17],91:[2,17],93:[2,17],102:[2,17],104:[2,17],105:[2,17],106:[2,17],110:[2,17],118:[2,17],126:[2,17],128:[2,17],129:[2,17],132:[2,17],133:[2,17],134:[2,17],135:[2,17],136:[2,17],137:[2,17]},{1:[2,18],6:[2,18],25:[2,18],26:[2,18],49:[2,18],54:[2,18],57:[2,18],73:[2,18],78:[2,18],86:[2,18],91:[2,18],93:[2,18],102:[2,18],104:[2,18],105:[2,18],106:[2,18],110:[2,18],118:[2,18],126:[2,18],128:[2,18],129:[2,18],132:[2,18],133:[2,18],134:[2,18],135:[2,18],136:[2,18],137:[2,18]},{1:[2,19],6:[2,19],25:[2,19],26:[2,19],49:[2,19],54:[2,19],57:[2,19],73:[2,19],78:[2,19],86:[2,19],91:[2,19],93:[2,19],102:[2,19],104:[2,19],105:[2,19],106:[2,19],110:[2,19],118:[2,19],126:[2,19],128:[2,19],129:[2,19],132:[2,19],133:[2,19],134:[2,19],135:[2,19],136:[2,19],137:[2,19]},{1:[2,20],6:[2,20],25:[2,20],26:[2,20],49:[2,20],54:[2,20],57:[2,20],73:[2,20],78:[2,20],86:[2,20],91:[2,20],93:[2,20],102:[2,20],104:[2,20],105:[2,20],106:[2,20],110:[2,20],118:[2,20],126:[2,20],128:[2,20],129:[2,20],132:[2,20],133:[2,20],134:[2,20],135:[2,20],136:[2,20],137:[2,20]},{1:[2,21],6:[2,21],25:[2,21],26:[2,21],49:[2,21],54:[2,21],57:[2,21],73:[2,21],78:[2,21],86:[2,21],91:[2,21],93:[2,21],102:[2,21],104:[2,21],105:[2,21],106:[2,21],110:[2,21],118:[2,21],126:[2,21],128:[2,21],129:[2,21],132:[2,21],133:[2,21],134:[2,21],135:[2,21],136:[2,21],137:[2,21]},{1:[2,22],6:[2,22],25:[2,22],26:[2,22],49:[2,22],54:[2,22],57:[2,22],73:[2,22],78:[2,22],86:[2,22],91:[2,22],93:[2,22],102:[2,22],104:[2,22],105:[2,22],106:[2,22],110:[2,22],118:[2,22],126:[2,22],128:[2,22],129:[2,22],132:[2,22],133:[2,22],134:[2,22],135:[2,22],136:[2,22],137:[2,22]},{1:[2,23],6:[2,23],25:[2,23],26:[2,23],49:[2,23],54:[2,23],57:[2,23],73:[2,23],78:[2,23],86:[2,23],91:[2,23],93:[2,23],102:[2,23],104:[2,23],105:[2,23],106:[2,23],110:[2,23],118:[2,23],126:[2,23],128:[2,23],129:[2,23],132:[2,23],133:[2,23],134:[2,23],135:[2,23],136:[2,23],137:[2,23]},{1:[2,9],6:[2,9],26:[2,9],102:[2,9],104:[2,9],106:[2,9],110:[2,9],126:[2,9]},{1:[2,10],6:[2,10],26:[2,10],102:[2,10],104:[2,10],106:[2,10],110:[2,10],126:[2,10]},{1:[2,11],6:[2,11],26:[2,11],102:[2,11],104:[2,11],106:[2,11],110:[2,11],126:[2,11]},{1:[2,75],6:[2,75],25:[2,75],26:[2,75],40:[1,104],49:[2,75],54:[2,75],57:[2,75],66:[2,75],67:[2,75],68:[2,75],69:[2,75],71:[2,75],73:[2,75],74:[2,75],78:[2,75],84:[2,75],85:[2,75],86:[2,75],91:[2,75],93:[2,75],102:[2,75],104:[2,75],105:[2,75],106:[2,75],110:[2,75],118:[2,75],126:[2,75],128:[2,75],129:[2,75],132:[2,75],133:[2,75],134:[2,75],135:[2,75],136:[2,75],137:[2,75]},{1:[2,76],6:[2,76],25:[2,76],26:[2,76],49:[2,76],54:[2,76],57:[2,76],66:[2,76],67:[2,76],68:[2,76],69:[2,76],71:[2,76],73:[2,76],74:[2,76],78:[2,76],84:[2,76],85:[2,76],86:[2,76],91:[2,76],93:[2,76],102:[2,76],104:[2,76],105:[2,76],106:[2,76],110:[2,76],118:[2,76],126:[2,76],128:[2,76],129:[2,76],132:[2,76],133:[2,76],134:[2,76],135:[2,76],136:[2,76],137:[2,76]},{1:[2,77],6:[2,77],25:[2,77],26:[2,77],49:[2,77],54:[2,77],57:[2,77],66:[2,77],67:[2,77],68:[2,77],69:[2,77],71:[2,77],73:[2,77],74:[2,77],78:[2,77],84:[2,77],85:[2,77],86:[2,77],91:[2,77],93:[2,77],102:[2,77],104:[2,77],105:[2,77],106:[2,77],110:[2,77],118:[2,77],126:[2,77],128:[2,77],129:[2,77],132:[2,77],133:[2,77],134:[2,77],135:[2,77],136:[2,77],137:[2,77]},{1:[2,78],6:[2,78],25:[2,78],26:[2,78],49:[2,78],54:[2,78],57:[2,78],66:[2,78],67:[2,78],68:[2,78],69:[2,78],71:[2,78],73:[2,78],74:[2,78],78:[2,78],84:[2,78],85:[2,78],86:[2,78],91:[2,78],93:[2,78],102:[2,78],104:[2,78],105:[2,78],106:[2,78],110:[2,78],118:[2,78],126:[2,78],128:[2,78],129:[2,78],132:[2,78],133:[2,78],134:[2,78],135:[2,78],136:[2,78],137:[2,78]},{1:[2,79],6:[2,79],25:[2,79],26:[2,79],49:[2,79],54:[2,79],57:[2,79],66:[2,79],67:[2,79],68:[2,79],69:[2,79],71:[2,79],73:[2,79],74:[2,79],78:[2,79],84:[2,79],85:[2,79],86:[2,79],91:[2,79],93:[2,79],102:[2,79],104:[2,79],105:[2,79],106:[2,79],110:[2,79],118:[2,79],126:[2,79],128:[2,79],129:[2,79],132:[2,79],133:[2,79],134:[2,79],135:[2,79],136:[2,79],137:[2,79]},{1:[2,106],6:[2,106],25:[2,106],26:[2,106],49:[2,106],54:[2,106],57:[2,106],66:[2,106],67:[2,106],68:[2,106],69:[2,106],71:[2,106],73:[2,106],74:[2,106],78:[2,106],82:105,84:[2,106],85:[1,106],86:[2,106],91:[2,106],93:[2,106],102:[2,106],104:[2,106],105:[2,106],106:[2,106],110:[2,106],118:[2,106],126:[2,106],128:[2,106],129:[2,106],132:[2,106],133:[2,106],134:[2,106],135:[2,106],136:[2,106],137:[2,106]},{6:[2,55],25:[2,55],27:110,28:[1,73],44:111,48:107,49:[2,55],54:[2,55],55:108,56:109,58:112,59:113,76:[1,70],89:[1,114],90:[1,115]},{5:116,25:[1,5]},{8:117,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:119,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:120,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{13:122,14:123,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:124,44:63,58:47,59:48,61:121,63:25,64:26,65:27,76:[1,70],83:[1,28],88:[1,58],89:[1,59],90:[1,57],101:[1,56]},{13:122,14:123,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:124,44:63,58:47,59:48,61:125,63:25,64:26,65:27,76:[1,70],83:[1,28],88:[1,58],89:[1,59],90:[1,57],101:[1,56]},{1:[2,72],6:[2,72],25:[2,72],26:[2,72],40:[2,72],49:[2,72],54:[2,72],57:[2,72],66:[2,72],67:[2,72],68:[2,72],69:[2,72],71:[2,72],73:[2,72],74:[2,72],78:[2,72],80:[1,129],84:[2,72],85:[2,72],86:[2,72],91:[2,72],93:[2,72],102:[2,72],104:[2,72],105:[2,72],106:[2,72],110:[2,72],118:[2,72],126:[2,72],128:[2,72],129:[2,72],130:[1,126],131:[1,127],132:[2,72],133:[2,72],134:[2,72],135:[2,72],136:[2,72],137:[2,72],138:[1,128]},{1:[2,183],6:[2,183],25:[2,183],26:[2,183],49:[2,183],54:[2,183],57:[2,183],73:[2,183],78:[2,183],86:[2,183],91:[2,183],93:[2,183],102:[2,183],104:[2,183],105:[2,183],106:[2,183],110:[2,183],118:[2,183],121:[1,130],126:[2,183],128:[2,183],129:[2,183],132:[2,183],133:[2,183],134:[2,183],135:[2,183],136:[2,183],137:[2,183]},{5:131,25:[1,5]},{5:132,25:[1,5]},{1:[2,150],6:[2,150],25:[2,150],26:[2,150],49:[2,150],54:[2,150],57:[2,150],73:[2,150],78:[2,150],86:[2,150],91:[2,150],93:[2,150],102:[2,150],104:[2,150],105:[2,150],106:[2,150],110:[2,150],118:[2,150],126:[2,150],128:[2,150],129:[2,150],132:[2,150],133:[2,150],134:[2,150],135:[2,150],136:[2,150],137:[2,150]},{5:133,25:[1,5]},{8:134,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,135],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,96],5:136,6:[2,96],13:122,14:123,25:[1,5],26:[2,96],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:124,44:63,49:[2,96],54:[2,96],57:[2,96],58:47,59:48,61:138,63:25,64:26,65:27,73:[2,96],76:[1,70],78:[2,96],80:[1,137],83:[1,28],86:[2,96],88:[1,58],89:[1,59],90:[1,57],91:[2,96],93:[2,96],101:[1,56],102:[2,96],104:[2,96],105:[2,96],106:[2,96],110:[2,96],118:[2,96],126:[2,96],128:[2,96],129:[2,96],132:[2,96],133:[2,96],134:[2,96],135:[2,96],136:[2,96],137:[2,96]},{8:139,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,47],6:[2,47],8:140,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[2,47],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],102:[2,47],103:39,104:[2,47],106:[2,47],107:40,108:[1,67],109:41,110:[2,47],111:69,119:[1,42],124:37,125:[1,64],126:[2,47],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,48],6:[2,48],25:[2,48],26:[2,48],54:[2,48],78:[2,48],102:[2,48],104:[2,48],106:[2,48],110:[2,48],126:[2,48]},{1:[2,73],6:[2,73],25:[2,73],26:[2,73],40:[2,73],49:[2,73],54:[2,73],57:[2,73],66:[2,73],67:[2,73],68:[2,73],69:[2,73],71:[2,73],73:[2,73],74:[2,73],78:[2,73],84:[2,73],85:[2,73],86:[2,73],91:[2,73],93:[2,73],102:[2,73],104:[2,73],105:[2,73],106:[2,73],110:[2,73],118:[2,73],126:[2,73],128:[2,73],129:[2,73],132:[2,73],133:[2,73],134:[2,73],135:[2,73],136:[2,73],137:[2,73]},{1:[2,74],6:[2,74],25:[2,74],26:[2,74],40:[2,74],49:[2,74],54:[2,74],57:[2,74],66:[2,74],67:[2,74],68:[2,74],69:[2,74],71:[2,74],73:[2,74],74:[2,74],78:[2,74],84:[2,74],85:[2,74],86:[2,74],91:[2,74],93:[2,74],102:[2,74],104:[2,74],105:[2,74],106:[2,74],110:[2,74],118:[2,74],126:[2,74],128:[2,74],129:[2,74],132:[2,74],133:[2,74],134:[2,74],135:[2,74],136:[2,74],137:[2,74]},{1:[2,29],6:[2,29],25:[2,29],26:[2,29],49:[2,29],54:[2,29],57:[2,29],66:[2,29],67:[2,29],68:[2,29],69:[2,29],71:[2,29],73:[2,29],74:[2,29],78:[2,29],84:[2,29],85:[2,29],86:[2,29],91:[2,29],93:[2,29],102:[2,29],104:[2,29],105:[2,29],106:[2,29],110:[2,29],118:[2,29],126:[2,29],128:[2,29],129:[2,29],132:[2,29],133:[2,29],134:[2,29],135:[2,29],136:[2,29],137:[2,29]},{1:[2,30],6:[2,30],25:[2,30],26:[2,30],49:[2,30],54:[2,30],57:[2,30],66:[2,30],67:[2,30],68:[2,30],69:[2,30],71:[2,30],73:[2,30],74:[2,30],78:[2,30],84:[2,30],85:[2,30],86:[2,30],91:[2,30],93:[2,30],102:[2,30],104:[2,30],105:[2,30],106:[2,30],110:[2,30],118:[2,30],126:[2,30],128:[2,30],129:[2,30],132:[2,30],133:[2,30],134:[2,30],135:[2,30],136:[2,30],137:[2,30]},{1:[2,31],6:[2,31],25:[2,31],26:[2,31],49:[2,31],54:[2,31],57:[2,31],66:[2,31],67:[2,31],68:[2,31],69:[2,31],71:[2,31],73:[2,31],74:[2,31],78:[2,31],84:[2,31],85:[2,31],86:[2,31],91:[2,31],93:[2,31],102:[2,31],104:[2,31],105:[2,31],106:[2,31],110:[2,31],118:[2,31],126:[2,31],128:[2,31],129:[2,31],132:[2,31],133:[2,31],134:[2,31],135:[2,31],136:[2,31],137:[2,31]},{1:[2,32],6:[2,32],25:[2,32],26:[2,32],49:[2,32],54:[2,32],57:[2,32],66:[2,32],67:[2,32],68:[2,32],69:[2,32],71:[2,32],73:[2,32],74:[2,32],78:[2,32],84:[2,32],85:[2,32],86:[2,32],91:[2,32],93:[2,32],102:[2,32],104:[2,32],105:[2,32],106:[2,32],110:[2,32],118:[2,32],126:[2,32],128:[2,32],129:[2,32],132:[2,32],133:[2,32],134:[2,32],135:[2,32],136:[2,32],137:[2,32]},{1:[2,33],6:[2,33],25:[2,33],26:[2,33],49:[2,33],54:[2,33],57:[2,33],66:[2,33],67:[2,33],68:[2,33],69:[2,33],71:[2,33],73:[2,33],74:[2,33],78:[2,33],84:[2,33],85:[2,33],86:[2,33],91:[2,33],93:[2,33],102:[2,33],104:[2,33],105:[2,33],106:[2,33],110:[2,33],118:[2,33],126:[2,33],128:[2,33],129:[2,33],132:[2,33],133:[2,33],134:[2,33],135:[2,33],136:[2,33],137:[2,33]},{1:[2,34],6:[2,34],25:[2,34],26:[2,34],49:[2,34],54:[2,34],57:[2,34],66:[2,34],67:[2,34],68:[2,34],69:[2,34],71:[2,34],73:[2,34],74:[2,34],78:[2,34],84:[2,34],85:[2,34],86:[2,34],91:[2,34],93:[2,34],102:[2,34],104:[2,34],105:[2,34],106:[2,34],110:[2,34],118:[2,34],126:[2,34],128:[2,34],129:[2,34],132:[2,34],133:[2,34],134:[2,34],135:[2,34],136:[2,34],137:[2,34]},{1:[2,35],6:[2,35],25:[2,35],26:[2,35],49:[2,35],54:[2,35],57:[2,35],66:[2,35],67:[2,35],68:[2,35],69:[2,35],71:[2,35],73:[2,35],74:[2,35],78:[2,35],84:[2,35],85:[2,35],86:[2,35],91:[2,35],93:[2,35],102:[2,35],104:[2,35],105:[2,35],106:[2,35],110:[2,35],118:[2,35],126:[2,35],128:[2,35],129:[2,35],132:[2,35],133:[2,35],134:[2,35],135:[2,35],136:[2,35],137:[2,35]},{4:141,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,142],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:143,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,147],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],87:145,88:[1,58],89:[1,59],90:[1,57],91:[1,144],94:146,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,112],6:[2,112],25:[2,112],26:[2,112],49:[2,112],54:[2,112],57:[2,112],66:[2,112],67:[2,112],68:[2,112],69:[2,112],71:[2,112],73:[2,112],74:[2,112],78:[2,112],84:[2,112],85:[2,112],86:[2,112],91:[2,112],93:[2,112],102:[2,112],104:[2,112],105:[2,112],106:[2,112],110:[2,112],118:[2,112],126:[2,112],128:[2,112],129:[2,112],132:[2,112],133:[2,112],134:[2,112],135:[2,112],136:[2,112],137:[2,112]},{1:[2,113],6:[2,113],25:[2,113],26:[2,113],27:149,28:[1,73],49:[2,113],54:[2,113],57:[2,113],66:[2,113],67:[2,113],68:[2,113],69:[2,113],71:[2,113],73:[2,113],74:[2,113],78:[2,113],84:[2,113],85:[2,113],86:[2,113],91:[2,113],93:[2,113],102:[2,113],104:[2,113],105:[2,113],106:[2,113],110:[2,113],118:[2,113],126:[2,113],128:[2,113],129:[2,113],132:[2,113],133:[2,113],134:[2,113],135:[2,113],136:[2,113],137:[2,113]},{25:[2,51]},{25:[2,52]},{1:[2,68],6:[2,68],25:[2,68],26:[2,68],40:[2,68],49:[2,68],54:[2,68],57:[2,68],66:[2,68],67:[2,68],68:[2,68],69:[2,68],71:[2,68],73:[2,68],74:[2,68],78:[2,68],80:[2,68],84:[2,68],85:[2,68],86:[2,68],91:[2,68],93:[2,68],102:[2,68],104:[2,68],105:[2,68],106:[2,68],110:[2,68],118:[2,68],126:[2,68],128:[2,68],129:[2,68],130:[2,68],131:[2,68],132:[2,68],133:[2,68],134:[2,68],135:[2,68],136:[2,68],137:[2,68],138:[2,68]},{1:[2,71],6:[2,71],25:[2,71],26:[2,71],40:[2,71],49:[2,71],54:[2,71],57:[2,71],66:[2,71],67:[2,71],68:[2,71],69:[2,71],71:[2,71],73:[2,71],74:[2,71],78:[2,71],80:[2,71],84:[2,71],85:[2,71],86:[2,71],91:[2,71],93:[2,71],102:[2,71],104:[2,71],105:[2,71],106:[2,71],110:[2,71],118:[2,71],126:[2,71],128:[2,71],129:[2,71],130:[2,71],131:[2,71],132:[2,71],133:[2,71],134:[2,71],135:[2,71],136:[2,71],137:[2,71],138:[2,71]},{8:150,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:151,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:152,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{5:153,8:154,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,5],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{27:159,28:[1,73],44:160,58:161,59:162,64:155,76:[1,70],89:[1,114],90:[1,57],113:156,114:[1,157],115:158},{112:163,116:[1,164],117:[1,165]},{6:[2,91],11:169,25:[2,91],27:170,28:[1,73],29:171,30:[1,71],31:[1,72],41:167,42:168,44:172,46:[1,46],54:[2,91],77:166,78:[2,91],89:[1,114]},{1:[2,27],6:[2,27],25:[2,27],26:[2,27],43:[2,27],49:[2,27],54:[2,27],57:[2,27],66:[2,27],67:[2,27],68:[2,27],69:[2,27],71:[2,27],73:[2,27],74:[2,27],78:[2,27],84:[2,27],85:[2,27],86:[2,27],91:[2,27],93:[2,27],102:[2,27],104:[2,27],105:[2,27],106:[2,27],110:[2,27],118:[2,27],126:[2,27],128:[2,27],129:[2,27],132:[2,27],133:[2,27],134:[2,27],135:[2,27],136:[2,27],137:[2,27]},{1:[2,28],6:[2,28],25:[2,28],26:[2,28],43:[2,28],49:[2,28],54:[2,28],57:[2,28],66:[2,28],67:[2,28],68:[2,28],69:[2,28],71:[2,28],73:[2,28],74:[2,28],78:[2,28],84:[2,28],85:[2,28],86:[2,28],91:[2,28],93:[2,28],102:[2,28],104:[2,28],105:[2,28],106:[2,28],110:[2,28],118:[2,28],126:[2,28],128:[2,28],129:[2,28],132:[2,28],133:[2,28],134:[2,28],135:[2,28],136:[2,28],137:[2,28]},{1:[2,26],6:[2,26],25:[2,26],26:[2,26],40:[2,26],43:[2,26],49:[2,26],54:[2,26],57:[2,26],66:[2,26],67:[2,26],68:[2,26],69:[2,26],71:[2,26],73:[2,26],74:[2,26],78:[2,26],80:[2,26],84:[2,26],85:[2,26],86:[2,26],91:[2,26],93:[2,26],102:[2,26],104:[2,26],105:[2,26],106:[2,26],110:[2,26],116:[2,26],117:[2,26],118:[2,26],126:[2,26],128:[2,26],129:[2,26],130:[2,26],131:[2,26],132:[2,26],133:[2,26],134:[2,26],135:[2,26],136:[2,26],137:[2,26],138:[2,26]},{1:[2,6],6:[2,6],7:173,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[2,6],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],102:[2,6],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,3]},{1:[2,24],6:[2,24],25:[2,24],26:[2,24],49:[2,24],54:[2,24],57:[2,24],73:[2,24],78:[2,24],86:[2,24],91:[2,24],93:[2,24],98:[2,24],99:[2,24],102:[2,24],104:[2,24],105:[2,24],106:[2,24],110:[2,24],118:[2,24],121:[2,24],123:[2,24],126:[2,24],128:[2,24],129:[2,24],132:[2,24],133:[2,24],134:[2,24],135:[2,24],136:[2,24],137:[2,24]},{6:[1,74],26:[1,174]},{1:[2,194],6:[2,194],25:[2,194],26:[2,194],49:[2,194],54:[2,194],57:[2,194],73:[2,194],78:[2,194],86:[2,194],91:[2,194],93:[2,194],102:[2,194],104:[2,194],105:[2,194],106:[2,194],110:[2,194],118:[2,194],126:[2,194],128:[2,194],129:[2,194],132:[2,194],133:[2,194],134:[2,194],135:[2,194],136:[2,194],137:[2,194]},{8:175,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:176,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:177,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:178,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:179,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:180,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:181,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:182,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,149],6:[2,149],25:[2,149],26:[2,149],49:[2,149],54:[2,149],57:[2,149],73:[2,149],78:[2,149],86:[2,149],91:[2,149],93:[2,149],102:[2,149],104:[2,149],105:[2,149],106:[2,149],110:[2,149],118:[2,149],126:[2,149],128:[2,149],129:[2,149],132:[2,149],133:[2,149],134:[2,149],135:[2,149],136:[2,149],137:[2,149]},{1:[2,154],6:[2,154],25:[2,154],26:[2,154],49:[2,154],54:[2,154],57:[2,154],73:[2,154],78:[2,154],86:[2,154],91:[2,154],93:[2,154],102:[2,154],104:[2,154],105:[2,154],106:[2,154],110:[2,154],118:[2,154],126:[2,154],128:[2,154],129:[2,154],132:[2,154],133:[2,154],134:[2,154],135:[2,154],136:[2,154],137:[2,154]},{8:183,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,148],6:[2,148],25:[2,148],26:[2,148],49:[2,148],54:[2,148],57:[2,148],73:[2,148],78:[2,148],86:[2,148],91:[2,148],93:[2,148],102:[2,148],104:[2,148],105:[2,148],106:[2,148],110:[2,148],118:[2,148],126:[2,148],128:[2,148],129:[2,148],132:[2,148],133:[2,148],134:[2,148],135:[2,148],136:[2,148],137:[2,148]},{1:[2,153],6:[2,153],25:[2,153],26:[2,153],49:[2,153],54:[2,153],57:[2,153],73:[2,153],78:[2,153],86:[2,153],91:[2,153],93:[2,153],102:[2,153],104:[2,153],105:[2,153],106:[2,153],110:[2,153],118:[2,153],126:[2,153],128:[2,153],129:[2,153],132:[2,153],133:[2,153],134:[2,153],135:[2,153],136:[2,153],137:[2,153]},{82:184,85:[1,106]},{1:[2,69],6:[2,69],25:[2,69],26:[2,69],40:[2,69],49:[2,69],54:[2,69],57:[2,69],66:[2,69],67:[2,69],68:[2,69],69:[2,69],71:[2,69],73:[2,69],74:[2,69],78:[2,69],80:[2,69],84:[2,69],85:[2,69],86:[2,69],91:[2,69],93:[2,69],102:[2,69],104:[2,69],105:[2,69],106:[2,69],110:[2,69],118:[2,69],126:[2,69],128:[2,69],129:[2,69],130:[2,69],131:[2,69],132:[2,69],133:[2,69],134:[2,69],135:[2,69],136:[2,69],137:[2,69],138:[2,69]},{85:[2,109]},{27:185,28:[1,73]},{27:186,28:[1,73]},{1:[2,84],6:[2,84],25:[2,84],26:[2,84],27:187,28:[1,73],40:[2,84],49:[2,84],54:[2,84],57:[2,84],66:[2,84],67:[2,84],68:[2,84],69:[2,84],71:[2,84],73:[2,84],74:[2,84],78:[2,84],80:[2,84],84:[2,84],85:[2,84],86:[2,84],91:[2,84],93:[2,84],102:[2,84],104:[2,84],105:[2,84],106:[2,84],110:[2,84],118:[2,84],126:[2,84],128:[2,84],129:[2,84],130:[2,84],131:[2,84],132:[2,84],133:[2,84],134:[2,84],135:[2,84],136:[2,84],137:[2,84],138:[2,84]},{27:188,28:[1,73]},{1:[2,85],6:[2,85],25:[2,85],26:[2,85],40:[2,85],49:[2,85],54:[2,85],57:[2,85],66:[2,85],67:[2,85],68:[2,85],69:[2,85],71:[2,85],73:[2,85],74:[2,85],78:[2,85],80:[2,85],84:[2,85],85:[2,85],86:[2,85],91:[2,85],93:[2,85],102:[2,85],104:[2,85],105:[2,85],106:[2,85],110:[2,85],118:[2,85],126:[2,85],128:[2,85],129:[2,85],130:[2,85],131:[2,85],132:[2,85],133:[2,85],134:[2,85],135:[2,85],136:[2,85],137:[2,85],138:[2,85]},{8:190,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],57:[1,194],58:47,59:48,61:36,63:25,64:26,65:27,72:189,75:191,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],92:192,93:[1,193],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{70:195,71:[1,100],74:[1,101]},{82:196,85:[1,106]},{1:[2,70],6:[2,70],25:[2,70],26:[2,70],40:[2,70],49:[2,70],54:[2,70],57:[2,70],66:[2,70],67:[2,70],68:[2,70],69:[2,70],71:[2,70],73:[2,70],74:[2,70],78:[2,70],80:[2,70],84:[2,70],85:[2,70],86:[2,70],91:[2,70],93:[2,70],102:[2,70],104:[2,70],105:[2,70],106:[2,70],110:[2,70],118:[2,70],126:[2,70],128:[2,70],129:[2,70],130:[2,70],131:[2,70],132:[2,70],133:[2,70],134:[2,70],135:[2,70],136:[2,70],137:[2,70],138:[2,70]},{6:[1,198],8:197,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,199],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,107],6:[2,107],25:[2,107],26:[2,107],49:[2,107],54:[2,107],57:[2,107],66:[2,107],67:[2,107],68:[2,107],69:[2,107],71:[2,107],73:[2,107],74:[2,107],78:[2,107],84:[2,107],85:[2,107],86:[2,107],91:[2,107],93:[2,107],102:[2,107],104:[2,107],105:[2,107],106:[2,107],110:[2,107],118:[2,107],126:[2,107],128:[2,107],129:[2,107],132:[2,107],133:[2,107],134:[2,107],135:[2,107],136:[2,107],137:[2,107]},{8:202,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,147],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],86:[1,200],87:201,88:[1,58],89:[1,59],90:[1,57],94:146,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,53],25:[2,53],49:[1,203],53:205,54:[1,204]},{6:[2,56],25:[2,56],26:[2,56],49:[2,56],54:[2,56]},{6:[2,60],25:[2,60],26:[2,60],40:[1,207],49:[2,60],54:[2,60],57:[1,206]},{6:[2,63],25:[2,63],26:[2,63],40:[2,63],49:[2,63],54:[2,63],57:[2,63]},{6:[2,64],25:[2,64],26:[2,64],40:[2,64],49:[2,64],54:[2,64],57:[2,64]},{6:[2,65],25:[2,65],26:[2,65],40:[2,65],49:[2,65],54:[2,65],57:[2,65]},{6:[2,66],25:[2,66],26:[2,66],40:[2,66],49:[2,66],54:[2,66],57:[2,66]},{27:149,28:[1,73]},{8:202,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,147],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],87:145,88:[1,58],89:[1,59],90:[1,57],91:[1,144],94:146,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,50],6:[2,50],25:[2,50],26:[2,50],49:[2,50],54:[2,50],57:[2,50],73:[2,50],78:[2,50],86:[2,50],91:[2,50],93:[2,50],102:[2,50],104:[2,50],105:[2,50],106:[2,50],110:[2,50],118:[2,50],126:[2,50],128:[2,50],129:[2,50],132:[2,50],133:[2,50],134:[2,50],135:[2,50],136:[2,50],137:[2,50]},{1:[2,187],6:[2,187],25:[2,187],26:[2,187],49:[2,187],54:[2,187],57:[2,187],73:[2,187],78:[2,187],86:[2,187],91:[2,187],93:[2,187],102:[2,187],103:87,104:[2,187],105:[2,187],106:[2,187],109:88,110:[2,187],111:69,118:[2,187],126:[2,187],128:[2,187],129:[2,187],132:[1,78],133:[2,187],134:[2,187],135:[2,187],136:[2,187],137:[2,187]},{103:90,104:[1,65],106:[1,66],109:91,110:[1,68],111:69,126:[1,89]},{1:[2,188],6:[2,188],25:[2,188],26:[2,188],49:[2,188],54:[2,188],57:[2,188],73:[2,188],78:[2,188],86:[2,188],91:[2,188],93:[2,188],102:[2,188],103:87,104:[2,188],105:[2,188],106:[2,188],109:88,110:[2,188],111:69,118:[2,188],126:[2,188],128:[2,188],129:[2,188],132:[1,78],133:[2,188],134:[2,188],135:[2,188],136:[2,188],137:[2,188]},{1:[2,189],6:[2,189],25:[2,189],26:[2,189],49:[2,189],54:[2,189],57:[2,189],73:[2,189],78:[2,189],86:[2,189],91:[2,189],93:[2,189],102:[2,189],103:87,104:[2,189],105:[2,189],106:[2,189],109:88,110:[2,189],111:69,118:[2,189],126:[2,189],128:[2,189],129:[2,189],132:[1,78],133:[2,189],134:[2,189],135:[2,189],136:[2,189],137:[2,189]},{1:[2,190],6:[2,190],25:[2,190],26:[2,190],49:[2,190],54:[2,190],57:[2,190],66:[2,72],67:[2,72],68:[2,72],69:[2,72],71:[2,72],73:[2,190],74:[2,72],78:[2,190],84:[2,72],85:[2,72],86:[2,190],91:[2,190],93:[2,190],102:[2,190],104:[2,190],105:[2,190],106:[2,190],110:[2,190],118:[2,190],126:[2,190],128:[2,190],129:[2,190],132:[2,190],133:[2,190],134:[2,190],135:[2,190],136:[2,190],137:[2,190]},{62:93,66:[1,95],67:[1,96],68:[1,97],69:[1,98],70:99,71:[1,100],74:[1,101],81:92,84:[1,94],85:[2,108]},{62:103,66:[1,95],67:[1,96],68:[1,97],69:[1,98],70:99,71:[1,100],74:[1,101],81:102,84:[1,94],85:[2,108]},{66:[2,75],67:[2,75],68:[2,75],69:[2,75],71:[2,75],74:[2,75],84:[2,75],85:[2,75]},{1:[2,191],6:[2,191],25:[2,191],26:[2,191],49:[2,191],54:[2,191],57:[2,191],66:[2,72],67:[2,72],68:[2,72],69:[2,72],71:[2,72],73:[2,191],74:[2,72],78:[2,191],84:[2,72],85:[2,72],86:[2,191],91:[2,191],93:[2,191],102:[2,191],104:[2,191],105:[2,191],106:[2,191],110:[2,191],118:[2,191],126:[2,191],128:[2,191],129:[2,191],132:[2,191],133:[2,191],134:[2,191],135:[2,191],136:[2,191],137:[2,191]},{1:[2,192],6:[2,192],25:[2,192],26:[2,192],49:[2,192],54:[2,192],57:[2,192],73:[2,192],78:[2,192],86:[2,192],91:[2,192],93:[2,192],102:[2,192],104:[2,192],105:[2,192],106:[2,192],110:[2,192],118:[2,192],126:[2,192],128:[2,192],129:[2,192],132:[2,192],133:[2,192],134:[2,192],135:[2,192],136:[2,192],137:[2,192]},{1:[2,193],6:[2,193],25:[2,193],26:[2,193],49:[2,193],54:[2,193],57:[2,193],73:[2,193],78:[2,193],86:[2,193],91:[2,193],93:[2,193],102:[2,193],104:[2,193],105:[2,193],106:[2,193],110:[2,193],118:[2,193],126:[2,193],128:[2,193],129:[2,193],132:[2,193],133:[2,193],134:[2,193],135:[2,193],136:[2,193],137:[2,193]},{6:[1,210],8:208,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,209],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:211,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{5:212,25:[1,5],125:[1,213]},{1:[2,133],6:[2,133],25:[2,133],26:[2,133],49:[2,133],54:[2,133],57:[2,133],73:[2,133],78:[2,133],86:[2,133],91:[2,133],93:[2,133],97:214,98:[1,215],99:[1,216],102:[2,133],104:[2,133],105:[2,133],106:[2,133],110:[2,133],118:[2,133],126:[2,133],128:[2,133],129:[2,133],132:[2,133],133:[2,133],134:[2,133],135:[2,133],136:[2,133],137:[2,133]},{1:[2,147],6:[2,147],25:[2,147],26:[2,147],49:[2,147],54:[2,147],57:[2,147],73:[2,147],78:[2,147],86:[2,147],91:[2,147],93:[2,147],102:[2,147],104:[2,147],105:[2,147],106:[2,147],110:[2,147],118:[2,147],126:[2,147],128:[2,147],129:[2,147],132:[2,147],133:[2,147],134:[2,147],135:[2,147],136:[2,147],137:[2,147]},{1:[2,155],6:[2,155],25:[2,155],26:[2,155],49:[2,155],54:[2,155],57:[2,155],73:[2,155],78:[2,155],86:[2,155],91:[2,155],93:[2,155],102:[2,155],104:[2,155],105:[2,155],106:[2,155],110:[2,155],118:[2,155],126:[2,155],128:[2,155],129:[2,155],132:[2,155],133:[2,155],134:[2,155],135:[2,155],136:[2,155],137:[2,155]},{25:[1,217],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{120:218,122:219,123:[1,220]},{1:[2,97],6:[2,97],25:[2,97],26:[2,97],49:[2,97],54:[2,97],57:[2,97],73:[2,97],78:[2,97],86:[2,97],91:[2,97],93:[2,97],102:[2,97],104:[2,97],105:[2,97],106:[2,97],110:[2,97],118:[2,97],126:[2,97],128:[2,97],129:[2,97],132:[2,97],133:[2,97],134:[2,97],135:[2,97],136:[2,97],137:[2,97]},{8:221,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,100],5:222,6:[2,100],25:[1,5],26:[2,100],49:[2,100],54:[2,100],57:[2,100],66:[2,72],67:[2,72],68:[2,72],69:[2,72],71:[2,72],73:[2,100],74:[2,72],78:[2,100],80:[1,223],84:[2,72],85:[2,72],86:[2,100],91:[2,100],93:[2,100],102:[2,100],104:[2,100],105:[2,100],106:[2,100],110:[2,100],118:[2,100],126:[2,100],128:[2,100],129:[2,100],132:[2,100],133:[2,100],134:[2,100],135:[2,100],136:[2,100],137:[2,100]},{1:[2,140],6:[2,140],25:[2,140],26:[2,140],49:[2,140],54:[2,140],57:[2,140],73:[2,140],78:[2,140],86:[2,140],91:[2,140],93:[2,140],102:[2,140],103:87,104:[2,140],105:[2,140],106:[2,140],109:88,110:[2,140],111:69,118:[2,140],126:[2,140],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,46],6:[2,46],26:[2,46],102:[2,46],103:87,104:[2,46],106:[2,46],109:88,110:[2,46],111:69,126:[2,46],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[1,74],102:[1,224]},{4:225,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,129],25:[2,129],54:[2,129],57:[1,227],91:[2,129],92:226,93:[1,193],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,115],6:[2,115],25:[2,115],26:[2,115],40:[2,115],49:[2,115],54:[2,115],57:[2,115],66:[2,115],67:[2,115],68:[2,115],69:[2,115],71:[2,115],73:[2,115],74:[2,115],78:[2,115],84:[2,115],85:[2,115],86:[2,115],91:[2,115],93:[2,115],102:[2,115],104:[2,115],105:[2,115],106:[2,115],110:[2,115],116:[2,115],117:[2,115],118:[2,115],126:[2,115],128:[2,115],129:[2,115],132:[2,115],133:[2,115],134:[2,115],135:[2,115],136:[2,115],137:[2,115]},{6:[2,53],25:[2,53],53:228,54:[1,229],91:[2,53]},{6:[2,124],25:[2,124],26:[2,124],54:[2,124],86:[2,124],91:[2,124]},{8:202,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,147],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],87:230,88:[1,58],89:[1,59],90:[1,57],94:146,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,130],25:[2,130],26:[2,130],54:[2,130],86:[2,130],91:[2,130]},{1:[2,114],6:[2,114],25:[2,114],26:[2,114],40:[2,114],43:[2,114],49:[2,114],54:[2,114],57:[2,114],66:[2,114],67:[2,114],68:[2,114],69:[2,114],71:[2,114],73:[2,114],74:[2,114],78:[2,114],80:[2,114],84:[2,114],85:[2,114],86:[2,114],91:[2,114],93:[2,114],102:[2,114],104:[2,114],105:[2,114],106:[2,114],110:[2,114],116:[2,114],117:[2,114],118:[2,114],126:[2,114],128:[2,114],129:[2,114],130:[2,114],131:[2,114],132:[2,114],133:[2,114],134:[2,114],135:[2,114],136:[2,114],137:[2,114],138:[2,114]},{5:231,25:[1,5],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,143],6:[2,143],25:[2,143],26:[2,143],49:[2,143],54:[2,143],57:[2,143],73:[2,143],78:[2,143],86:[2,143],91:[2,143],93:[2,143],102:[2,143],103:87,104:[1,65],105:[1,232],106:[1,66],109:88,110:[1,68],111:69,118:[2,143],126:[2,143],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,145],6:[2,145],25:[2,145],26:[2,145],49:[2,145],54:[2,145],57:[2,145],73:[2,145],78:[2,145],86:[2,145],91:[2,145],93:[2,145],102:[2,145],103:87,104:[1,65],105:[1,233],106:[1,66],109:88,110:[1,68],111:69,118:[2,145],126:[2,145],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,151],6:[2,151],25:[2,151],26:[2,151],49:[2,151],54:[2,151],57:[2,151],73:[2,151],78:[2,151],86:[2,151],91:[2,151],93:[2,151],102:[2,151],104:[2,151],105:[2,151],106:[2,151],110:[2,151],118:[2,151],126:[2,151],128:[2,151],129:[2,151],132:[2,151],133:[2,151],134:[2,151],135:[2,151],136:[2,151],137:[2,151]},{1:[2,152],6:[2,152],25:[2,152],26:[2,152],49:[2,152],54:[2,152],57:[2,152],73:[2,152],78:[2,152],86:[2,152],91:[2,152],93:[2,152],102:[2,152],103:87,104:[1,65],105:[2,152],106:[1,66],109:88,110:[1,68],111:69,118:[2,152],126:[2,152],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,156],6:[2,156],25:[2,156],26:[2,156],49:[2,156],54:[2,156],57:[2,156],73:[2,156],78:[2,156],86:[2,156],91:[2,156],93:[2,156],102:[2,156],104:[2,156],105:[2,156],106:[2,156],110:[2,156],118:[2,156],126:[2,156],128:[2,156],129:[2,156],132:[2,156],133:[2,156],134:[2,156],135:[2,156],136:[2,156],137:[2,156]},{116:[2,158],117:[2,158]},{27:159,28:[1,73],44:160,58:161,59:162,76:[1,70],89:[1,114],90:[1,115],113:234,115:158},{54:[1,235],116:[2,164],117:[2,164]},{54:[2,160],116:[2,160],117:[2,160]},{54:[2,161],116:[2,161],117:[2,161]},{54:[2,162],116:[2,162],117:[2,162]},{54:[2,163],116:[2,163],117:[2,163]},{1:[2,157],6:[2,157],25:[2,157],26:[2,157],49:[2,157],54:[2,157],57:[2,157],73:[2,157],78:[2,157],86:[2,157],91:[2,157],93:[2,157],102:[2,157],104:[2,157],105:[2,157],106:[2,157],110:[2,157],118:[2,157],126:[2,157],128:[2,157],129:[2,157],132:[2,157],133:[2,157],134:[2,157],135:[2,157],136:[2,157],137:[2,157]},{8:236,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:237,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,53],25:[2,53],53:238,54:[1,239],78:[2,53]},{6:[2,92],25:[2,92],26:[2,92],54:[2,92],78:[2,92]},{6:[2,39],25:[2,39],26:[2,39],43:[1,240],54:[2,39],78:[2,39]},{6:[2,42],25:[2,42],26:[2,42],54:[2,42],78:[2,42]},{6:[2,43],25:[2,43],26:[2,43],43:[2,43],54:[2,43],78:[2,43]},{6:[2,44],25:[2,44],26:[2,44],43:[2,44],54:[2,44],78:[2,44]},{6:[2,45],25:[2,45],26:[2,45],43:[2,45],54:[2,45],78:[2,45]},{1:[2,5],6:[2,5],26:[2,5],102:[2,5]},{1:[2,25],6:[2,25],25:[2,25],26:[2,25],49:[2,25],54:[2,25],57:[2,25],73:[2,25],78:[2,25],86:[2,25],91:[2,25],93:[2,25],98:[2,25],99:[2,25],102:[2,25],104:[2,25],105:[2,25],106:[2,25],110:[2,25],118:[2,25],121:[2,25],123:[2,25],126:[2,25],128:[2,25],129:[2,25],132:[2,25],133:[2,25],134:[2,25],135:[2,25],136:[2,25],137:[2,25]},{1:[2,195],6:[2,195],25:[2,195],26:[2,195],49:[2,195],54:[2,195],57:[2,195],73:[2,195],78:[2,195],86:[2,195],91:[2,195],93:[2,195],102:[2,195],103:87,104:[2,195],105:[2,195],106:[2,195],109:88,110:[2,195],111:69,118:[2,195],126:[2,195],128:[2,195],129:[2,195],132:[1,78],133:[1,81],134:[2,195],135:[2,195],136:[2,195],137:[2,195]},{1:[2,196],6:[2,196],25:[2,196],26:[2,196],49:[2,196],54:[2,196],57:[2,196],73:[2,196],78:[2,196],86:[2,196],91:[2,196],93:[2,196],102:[2,196],103:87,104:[2,196],105:[2,196],106:[2,196],109:88,110:[2,196],111:69,118:[2,196],126:[2,196],128:[2,196],129:[2,196],132:[1,78],133:[1,81],134:[2,196],135:[2,196],136:[2,196],137:[2,196]},{1:[2,197],6:[2,197],25:[2,197],26:[2,197],49:[2,197],54:[2,197],57:[2,197],73:[2,197],78:[2,197],86:[2,197],91:[2,197],93:[2,197],102:[2,197],103:87,104:[2,197],105:[2,197],106:[2,197],109:88,110:[2,197],111:69,118:[2,197],126:[2,197],128:[2,197],129:[2,197],132:[1,78],133:[2,197],134:[2,197],135:[2,197],136:[2,197],137:[2,197]},{1:[2,198],6:[2,198],25:[2,198],26:[2,198],49:[2,198],54:[2,198],57:[2,198],73:[2,198],78:[2,198],86:[2,198],91:[2,198],93:[2,198],102:[2,198],103:87,104:[2,198],105:[2,198],106:[2,198],109:88,110:[2,198],111:69,118:[2,198],126:[2,198],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[2,198],135:[2,198],136:[2,198],137:[2,198]},{1:[2,199],6:[2,199],25:[2,199],26:[2,199],49:[2,199],54:[2,199],57:[2,199],73:[2,199],78:[2,199],86:[2,199],91:[2,199],93:[2,199],102:[2,199],103:87,104:[2,199],105:[2,199],106:[2,199],109:88,110:[2,199],111:69,118:[2,199],126:[2,199],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[2,199],136:[2,199],137:[1,85]},{1:[2,200],6:[2,200],25:[2,200],26:[2,200],49:[2,200],54:[2,200],57:[2,200],73:[2,200],78:[2,200],86:[2,200],91:[2,200],93:[2,200],102:[2,200],103:87,104:[2,200],105:[2,200],106:[2,200],109:88,110:[2,200],111:69,118:[2,200],126:[2,200],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[2,200],137:[1,85]},{1:[2,201],6:[2,201],25:[2,201],26:[2,201],49:[2,201],54:[2,201],57:[2,201],73:[2,201],78:[2,201],86:[2,201],91:[2,201],93:[2,201],102:[2,201],103:87,104:[2,201],105:[2,201],106:[2,201],109:88,110:[2,201],111:69,118:[2,201],126:[2,201],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[2,201],136:[2,201],137:[2,201]},{1:[2,186],6:[2,186],25:[2,186],26:[2,186],49:[2,186],54:[2,186],57:[2,186],73:[2,186],78:[2,186],86:[2,186],91:[2,186],93:[2,186],102:[2,186],103:87,104:[1,65],105:[2,186],106:[1,66],109:88,110:[1,68],111:69,118:[2,186],126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,185],6:[2,185],25:[2,185],26:[2,185],49:[2,185],54:[2,185],57:[2,185],73:[2,185],78:[2,185],86:[2,185],91:[2,185],93:[2,185],102:[2,185],103:87,104:[1,65],105:[2,185],106:[1,66],109:88,110:[1,68],111:69,118:[2,185],126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,104],6:[2,104],25:[2,104],26:[2,104],49:[2,104],54:[2,104],57:[2,104],66:[2,104],67:[2,104],68:[2,104],69:[2,104],71:[2,104],73:[2,104],74:[2,104],78:[2,104],84:[2,104],85:[2,104],86:[2,104],91:[2,104],93:[2,104],102:[2,104],104:[2,104],105:[2,104],106:[2,104],110:[2,104],118:[2,104],126:[2,104],128:[2,104],129:[2,104],132:[2,104],133:[2,104],134:[2,104],135:[2,104],136:[2,104],137:[2,104]},{1:[2,80],6:[2,80],25:[2,80],26:[2,80],40:[2,80],49:[2,80],54:[2,80],57:[2,80],66:[2,80],67:[2,80],68:[2,80],69:[2,80],71:[2,80],73:[2,80],74:[2,80],78:[2,80],80:[2,80],84:[2,80],85:[2,80],86:[2,80],91:[2,80],93:[2,80],102:[2,80],104:[2,80],105:[2,80],106:[2,80],110:[2,80],118:[2,80],126:[2,80],128:[2,80],129:[2,80],130:[2,80],131:[2,80],132:[2,80],133:[2,80],134:[2,80],135:[2,80],136:[2,80],137:[2,80],138:[2,80]},{1:[2,81],6:[2,81],25:[2,81],26:[2,81],40:[2,81],49:[2,81],54:[2,81],57:[2,81],66:[2,81],67:[2,81],68:[2,81],69:[2,81],71:[2,81],73:[2,81],74:[2,81],78:[2,81],80:[2,81],84:[2,81],85:[2,81],86:[2,81],91:[2,81],93:[2,81],102:[2,81],104:[2,81],105:[2,81],106:[2,81],110:[2,81],118:[2,81],126:[2,81],128:[2,81],129:[2,81],130:[2,81],131:[2,81],132:[2,81],133:[2,81],134:[2,81],135:[2,81],136:[2,81],137:[2,81],138:[2,81]},{1:[2,82],6:[2,82],25:[2,82],26:[2,82],40:[2,82],49:[2,82],54:[2,82],57:[2,82],66:[2,82],67:[2,82],68:[2,82],69:[2,82],71:[2,82],73:[2,82],74:[2,82],78:[2,82],80:[2,82],84:[2,82],85:[2,82],86:[2,82],91:[2,82],93:[2,82],102:[2,82],104:[2,82],105:[2,82],106:[2,82],110:[2,82],118:[2,82],126:[2,82],128:[2,82],129:[2,82],130:[2,82],131:[2,82],132:[2,82],133:[2,82],134:[2,82],135:[2,82],136:[2,82],137:[2,82],138:[2,82]},{1:[2,83],6:[2,83],25:[2,83],26:[2,83],40:[2,83],49:[2,83],54:[2,83],57:[2,83],66:[2,83],67:[2,83],68:[2,83],69:[2,83],71:[2,83],73:[2,83],74:[2,83],78:[2,83],80:[2,83],84:[2,83],85:[2,83],86:[2,83],91:[2,83],93:[2,83],102:[2,83],104:[2,83],105:[2,83],106:[2,83],110:[2,83],118:[2,83],126:[2,83],128:[2,83],129:[2,83],130:[2,83],131:[2,83],132:[2,83],133:[2,83],134:[2,83],135:[2,83],136:[2,83],137:[2,83],138:[2,83]},{73:[1,241]},{57:[1,194],73:[2,88],92:242,93:[1,193],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{73:[2,89]},{8:243,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,73:[2,123],76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{12:[2,117],28:[2,117],30:[2,117],31:[2,117],33:[2,117],34:[2,117],35:[2,117],36:[2,117],37:[2,117],38:[2,117],45:[2,117],46:[2,117],47:[2,117],51:[2,117],52:[2,117],73:[2,117],76:[2,117],79:[2,117],83:[2,117],88:[2,117],89:[2,117],90:[2,117],96:[2,117],100:[2,117],101:[2,117],104:[2,117],106:[2,117],108:[2,117],110:[2,117],119:[2,117],125:[2,117],127:[2,117],128:[2,117],129:[2,117],130:[2,117],131:[2,117]},{12:[2,118],28:[2,118],30:[2,118],31:[2,118],33:[2,118],34:[2,118],35:[2,118],36:[2,118],37:[2,118],38:[2,118],45:[2,118],46:[2,118],47:[2,118],51:[2,118],52:[2,118],73:[2,118],76:[2,118],79:[2,118],83:[2,118],88:[2,118],89:[2,118],90:[2,118],96:[2,118],100:[2,118],101:[2,118],104:[2,118],106:[2,118],108:[2,118],110:[2,118],119:[2,118],125:[2,118],127:[2,118],128:[2,118],129:[2,118],130:[2,118],131:[2,118]},{1:[2,87],6:[2,87],25:[2,87],26:[2,87],40:[2,87],49:[2,87],54:[2,87],57:[2,87],66:[2,87],67:[2,87],68:[2,87],69:[2,87],71:[2,87],73:[2,87],74:[2,87],78:[2,87],80:[2,87],84:[2,87],85:[2,87],86:[2,87],91:[2,87],93:[2,87],102:[2,87],104:[2,87],105:[2,87],106:[2,87],110:[2,87],118:[2,87],126:[2,87],128:[2,87],129:[2,87],130:[2,87],131:[2,87],132:[2,87],133:[2,87],134:[2,87],135:[2,87],136:[2,87],137:[2,87],138:[2,87]},{1:[2,105],6:[2,105],25:[2,105],26:[2,105],49:[2,105],54:[2,105],57:[2,105],66:[2,105],67:[2,105],68:[2,105],69:[2,105],71:[2,105],73:[2,105],74:[2,105],78:[2,105],84:[2,105],85:[2,105],86:[2,105],91:[2,105],93:[2,105],102:[2,105],104:[2,105],105:[2,105],106:[2,105],110:[2,105],118:[2,105],126:[2,105],128:[2,105],129:[2,105],132:[2,105],133:[2,105],134:[2,105],135:[2,105],136:[2,105],137:[2,105]},{1:[2,36],6:[2,36],25:[2,36],26:[2,36],49:[2,36],54:[2,36],57:[2,36],73:[2,36],78:[2,36],86:[2,36],91:[2,36],93:[2,36],102:[2,36],103:87,104:[2,36],105:[2,36],106:[2,36],109:88,110:[2,36],111:69,118:[2,36],126:[2,36],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{8:244,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:245,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,110],6:[2,110],25:[2,110],26:[2,110],49:[2,110],54:[2,110],57:[2,110],66:[2,110],67:[2,110],68:[2,110],69:[2,110],71:[2,110],73:[2,110],74:[2,110],78:[2,110],84:[2,110],85:[2,110],86:[2,110],91:[2,110],93:[2,110],102:[2,110],104:[2,110],105:[2,110],106:[2,110],110:[2,110],118:[2,110],126:[2,110],128:[2,110],129:[2,110],132:[2,110],133:[2,110],134:[2,110],135:[2,110],136:[2,110],137:[2,110]},{6:[2,53],25:[2,53],53:246,54:[1,229],86:[2,53]},{6:[2,129],25:[2,129],26:[2,129],54:[2,129],57:[1,247],86:[2,129],91:[2,129],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{50:248,51:[1,60],52:[1,61]},{6:[2,54],25:[2,54],26:[2,54],27:110,28:[1,73],44:111,55:249,56:109,58:112,59:113,76:[1,70],89:[1,114],90:[1,115]},{6:[1,250],25:[1,251]},{6:[2,61],25:[2,61],26:[2,61],49:[2,61],54:[2,61]},{8:252,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,202],6:[2,202],25:[2,202],26:[2,202],49:[2,202],54:[2,202],57:[2,202],73:[2,202],78:[2,202],86:[2,202],91:[2,202],93:[2,202],102:[2,202],103:87,104:[2,202],105:[2,202],106:[2,202],109:88,110:[2,202],111:69,118:[2,202],126:[2,202],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{8:253,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:254,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,205],6:[2,205],25:[2,205],26:[2,205],49:[2,205],54:[2,205],57:[2,205],73:[2,205],78:[2,205],86:[2,205],91:[2,205],93:[2,205],102:[2,205],103:87,104:[2,205],105:[2,205],106:[2,205],109:88,110:[2,205],111:69,118:[2,205],126:[2,205],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,184],6:[2,184],25:[2,184],26:[2,184],49:[2,184],54:[2,184],57:[2,184],73:[2,184],78:[2,184],86:[2,184],91:[2,184],93:[2,184],102:[2,184],104:[2,184],105:[2,184],106:[2,184],110:[2,184],118:[2,184],126:[2,184],128:[2,184],129:[2,184],132:[2,184],133:[2,184],134:[2,184],135:[2,184],136:[2,184],137:[2,184]},{8:255,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,134],6:[2,134],25:[2,134],26:[2,134],49:[2,134],54:[2,134],57:[2,134],73:[2,134],78:[2,134],86:[2,134],91:[2,134],93:[2,134],98:[1,256],102:[2,134],104:[2,134],105:[2,134],106:[2,134],110:[2,134],118:[2,134],126:[2,134],128:[2,134],129:[2,134],132:[2,134],133:[2,134],134:[2,134],135:[2,134],136:[2,134],137:[2,134]},{5:257,25:[1,5]},{5:260,25:[1,5],27:258,28:[1,73],59:259,76:[1,70]},{120:261,122:219,123:[1,220]},{26:[1,262],121:[1,263],122:264,123:[1,220]},{26:[2,177],121:[2,177],123:[2,177]},{8:266,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],95:265,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,98],5:267,6:[2,98],25:[1,5],26:[2,98],49:[2,98],54:[2,98],57:[2,98],73:[2,98],78:[2,98],86:[2,98],91:[2,98],93:[2,98],102:[2,98],103:87,104:[1,65],105:[2,98],106:[1,66],109:88,110:[1,68],111:69,118:[2,98],126:[2,98],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,101],6:[2,101],25:[2,101],26:[2,101],49:[2,101],54:[2,101],57:[2,101],73:[2,101],78:[2,101],86:[2,101],91:[2,101],93:[2,101],102:[2,101],104:[2,101],105:[2,101],106:[2,101],110:[2,101],118:[2,101],126:[2,101],128:[2,101],129:[2,101],132:[2,101],133:[2,101],134:[2,101],135:[2,101],136:[2,101],137:[2,101]},{8:268,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,141],6:[2,141],25:[2,141],26:[2,141],49:[2,141],54:[2,141],57:[2,141],66:[2,141],67:[2,141],68:[2,141],69:[2,141],71:[2,141],73:[2,141],74:[2,141],78:[2,141],84:[2,141],85:[2,141],86:[2,141],91:[2,141],93:[2,141],102:[2,141],104:[2,141],105:[2,141],106:[2,141],110:[2,141],118:[2,141],126:[2,141],128:[2,141],129:[2,141],132:[2,141],133:[2,141],134:[2,141],135:[2,141],136:[2,141],137:[2,141]},{6:[1,74],26:[1,269]},{8:270,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,67],12:[2,118],25:[2,67],28:[2,118],30:[2,118],31:[2,118],33:[2,118],34:[2,118],35:[2,118],36:[2,118],37:[2,118],38:[2,118],45:[2,118],46:[2,118],47:[2,118],51:[2,118],52:[2,118],54:[2,67],76:[2,118],79:[2,118],83:[2,118],88:[2,118],89:[2,118],90:[2,118],91:[2,67],96:[2,118],100:[2,118],101:[2,118],104:[2,118],106:[2,118],108:[2,118],110:[2,118],119:[2,118],125:[2,118],127:[2,118],128:[2,118],129:[2,118],130:[2,118],131:[2,118]},{6:[1,272],25:[1,273],91:[1,271]},{6:[2,54],8:202,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[2,54],26:[2,54],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],86:[2,54],88:[1,58],89:[1,59],90:[1,57],91:[2,54],94:274,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,53],25:[2,53],26:[2,53],53:275,54:[1,229]},{1:[2,181],6:[2,181],25:[2,181],26:[2,181],49:[2,181],54:[2,181],57:[2,181],73:[2,181],78:[2,181],86:[2,181],91:[2,181],93:[2,181],102:[2,181],104:[2,181],105:[2,181],106:[2,181],110:[2,181],118:[2,181],121:[2,181],126:[2,181],128:[2,181],129:[2,181],132:[2,181],133:[2,181],134:[2,181],135:[2,181],136:[2,181],137:[2,181]},{8:276,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:277,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{116:[2,159],117:[2,159]},{27:159,28:[1,73],44:160,58:161,59:162,76:[1,70],89:[1,114],90:[1,115],115:278},{1:[2,166],6:[2,166],25:[2,166],26:[2,166],49:[2,166],54:[2,166],57:[2,166],73:[2,166],78:[2,166],86:[2,166],91:[2,166],93:[2,166],102:[2,166],103:87,104:[2,166],105:[1,279],106:[2,166],109:88,110:[2,166],111:69,118:[1,280],126:[2,166],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,167],6:[2,167],25:[2,167],26:[2,167],49:[2,167],54:[2,167],57:[2,167],73:[2,167],78:[2,167],86:[2,167],91:[2,167],93:[2,167],102:[2,167],103:87,104:[2,167],105:[1,281],106:[2,167],109:88,110:[2,167],111:69,118:[2,167],126:[2,167],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[1,283],25:[1,284],78:[1,282]},{6:[2,54],11:169,25:[2,54],26:[2,54],27:170,28:[1,73],29:171,30:[1,71],31:[1,72],41:285,42:168,44:172,46:[1,46],78:[2,54],89:[1,114]},{8:286,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,287],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,86],6:[2,86],25:[2,86],26:[2,86],40:[2,86],49:[2,86],54:[2,86],57:[2,86],66:[2,86],67:[2,86],68:[2,86],69:[2,86],71:[2,86],73:[2,86],74:[2,86],78:[2,86],80:[2,86],84:[2,86],85:[2,86],86:[2,86],91:[2,86],93:[2,86],102:[2,86],104:[2,86],105:[2,86],106:[2,86],110:[2,86],118:[2,86],126:[2,86],128:[2,86],129:[2,86],130:[2,86],131:[2,86],132:[2,86],133:[2,86],134:[2,86],135:[2,86],136:[2,86],137:[2,86],138:[2,86]},{8:288,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,73:[2,121],76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{73:[2,122],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,37],6:[2,37],25:[2,37],26:[2,37],49:[2,37],54:[2,37],57:[2,37],73:[2,37],78:[2,37],86:[2,37],91:[2,37],93:[2,37],102:[2,37],103:87,104:[2,37],105:[2,37],106:[2,37],109:88,110:[2,37],111:69,118:[2,37],126:[2,37],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{26:[1,289],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[1,272],25:[1,273],86:[1,290]},{6:[2,67],25:[2,67],26:[2,67],54:[2,67],86:[2,67],91:[2,67]},{5:291,25:[1,5]},{6:[2,57],25:[2,57],26:[2,57],49:[2,57],54:[2,57]},{27:110,28:[1,73],44:111,55:292,56:109,58:112,59:113,76:[1,70],89:[1,114],90:[1,115]},{6:[2,55],25:[2,55],26:[2,55],27:110,28:[1,73],44:111,48:293,54:[2,55],55:108,56:109,58:112,59:113,76:[1,70],89:[1,114],90:[1,115]},{6:[2,62],25:[2,62],26:[2,62],49:[2,62],54:[2,62],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{26:[1,294],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,204],6:[2,204],25:[2,204],26:[2,204],49:[2,204],54:[2,204],57:[2,204],73:[2,204],78:[2,204],86:[2,204],91:[2,204],93:[2,204],102:[2,204],103:87,104:[2,204],105:[2,204],106:[2,204],109:88,110:[2,204],111:69,118:[2,204],126:[2,204],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{5:295,25:[1,5],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{5:296,25:[1,5]},{1:[2,135],6:[2,135],25:[2,135],26:[2,135],49:[2,135],54:[2,135],57:[2,135],73:[2,135],78:[2,135],86:[2,135],91:[2,135],93:[2,135],102:[2,135],104:[2,135],105:[2,135],106:[2,135],110:[2,135],118:[2,135],126:[2,135],128:[2,135],129:[2,135],132:[2,135],133:[2,135],134:[2,135],135:[2,135],136:[2,135],137:[2,135]},{5:297,25:[1,5]},{5:298,25:[1,5]},{1:[2,139],6:[2,139],25:[2,139],26:[2,139],49:[2,139],54:[2,139],57:[2,139],73:[2,139],78:[2,139],86:[2,139],91:[2,139],93:[2,139],98:[2,139],102:[2,139],104:[2,139],105:[2,139],106:[2,139],110:[2,139],118:[2,139],126:[2,139],128:[2,139],129:[2,139],132:[2,139],133:[2,139],134:[2,139],135:[2,139],136:[2,139],137:[2,139]},{26:[1,299],121:[1,300],122:264,123:[1,220]},{1:[2,175],6:[2,175],25:[2,175],26:[2,175],49:[2,175],54:[2,175],57:[2,175],73:[2,175],78:[2,175],86:[2,175],91:[2,175],93:[2,175],102:[2,175],104:[2,175],105:[2,175],106:[2,175],110:[2,175],118:[2,175],126:[2,175],128:[2,175],129:[2,175],132:[2,175],133:[2,175],134:[2,175],135:[2,175],136:[2,175],137:[2,175]},{5:301,25:[1,5]},{26:[2,178],121:[2,178],123:[2,178]},{5:302,25:[1,5],54:[1,303]},{25:[2,131],54:[2,131],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,99],6:[2,99],25:[2,99],26:[2,99],49:[2,99],54:[2,99],57:[2,99],73:[2,99],78:[2,99],86:[2,99],91:[2,99],93:[2,99],102:[2,99],104:[2,99],105:[2,99],106:[2,99],110:[2,99],118:[2,99],126:[2,99],128:[2,99],129:[2,99],132:[2,99],133:[2,99],134:[2,99],135:[2,99],136:[2,99],137:[2,99]},{1:[2,102],5:304,6:[2,102],25:[1,5],26:[2,102],49:[2,102],54:[2,102],57:[2,102],73:[2,102],78:[2,102],86:[2,102],91:[2,102],93:[2,102],102:[2,102],103:87,104:[1,65],105:[2,102],106:[1,66],109:88,110:[1,68],111:69,118:[2,102],126:[2,102],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{102:[1,305]},{91:[1,306],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,116],6:[2,116],25:[2,116],26:[2,116],40:[2,116],49:[2,116],54:[2,116],57:[2,116],66:[2,116],67:[2,116],68:[2,116],69:[2,116],71:[2,116],73:[2,116],74:[2,116],78:[2,116],84:[2,116],85:[2,116],86:[2,116],91:[2,116],93:[2,116],102:[2,116],104:[2,116],105:[2,116],106:[2,116],110:[2,116],116:[2,116],117:[2,116],118:[2,116],126:[2,116],128:[2,116],129:[2,116],132:[2,116],133:[2,116],134:[2,116],135:[2,116],136:[2,116],137:[2,116]},{8:202,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],94:307,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:202,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,147],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:148,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],87:308,88:[1,58],89:[1,59],90:[1,57],94:146,96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[2,125],25:[2,125],26:[2,125],54:[2,125],86:[2,125],91:[2,125]},{6:[1,272],25:[1,273],26:[1,309]},{1:[2,144],6:[2,144],25:[2,144],26:[2,144],49:[2,144],54:[2,144],57:[2,144],73:[2,144],78:[2,144],86:[2,144],91:[2,144],93:[2,144],102:[2,144],103:87,104:[1,65],105:[2,144],106:[1,66],109:88,110:[1,68],111:69,118:[2,144],126:[2,144],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,146],6:[2,146],25:[2,146],26:[2,146],49:[2,146],54:[2,146],57:[2,146],73:[2,146],78:[2,146],86:[2,146],91:[2,146],93:[2,146],102:[2,146],103:87,104:[1,65],105:[2,146],106:[1,66],109:88,110:[1,68],111:69,118:[2,146],126:[2,146],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{116:[2,165],117:[2,165]},{8:310,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:311,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:312,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,90],6:[2,90],25:[2,90],26:[2,90],40:[2,90],49:[2,90],54:[2,90],57:[2,90],66:[2,90],67:[2,90],68:[2,90],69:[2,90],71:[2,90],73:[2,90],74:[2,90],78:[2,90],84:[2,90],85:[2,90],86:[2,90],91:[2,90],93:[2,90],102:[2,90],104:[2,90],105:[2,90],106:[2,90],110:[2,90],116:[2,90],117:[2,90],118:[2,90],126:[2,90],128:[2,90],129:[2,90],132:[2,90],133:[2,90],134:[2,90],135:[2,90],136:[2,90],137:[2,90]},{11:169,27:170,28:[1,73],29:171,30:[1,71],31:[1,72],41:313,42:168,44:172,46:[1,46],89:[1,114]},{6:[2,91],11:169,25:[2,91],26:[2,91],27:170,28:[1,73],29:171,30:[1,71],31:[1,72],41:167,42:168,44:172,46:[1,46],54:[2,91],77:314,89:[1,114]},{6:[2,93],25:[2,93],26:[2,93],54:[2,93],78:[2,93]},{6:[2,40],25:[2,40],26:[2,40],54:[2,40],78:[2,40],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{8:315,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{73:[2,120],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,38],6:[2,38],25:[2,38],26:[2,38],49:[2,38],54:[2,38],57:[2,38],73:[2,38],78:[2,38],86:[2,38],91:[2,38],93:[2,38],102:[2,38],104:[2,38],105:[2,38],106:[2,38],110:[2,38],118:[2,38],126:[2,38],128:[2,38],129:[2,38],132:[2,38],133:[2,38],134:[2,38],135:[2,38],136:[2,38],137:[2,38]},{1:[2,111],6:[2,111],25:[2,111],26:[2,111],49:[2,111],54:[2,111],57:[2,111],66:[2,111],67:[2,111],68:[2,111],69:[2,111],71:[2,111],73:[2,111],74:[2,111],78:[2,111],84:[2,111],85:[2,111],86:[2,111],91:[2,111],93:[2,111],102:[2,111],104:[2,111],105:[2,111],106:[2,111],110:[2,111],118:[2,111],126:[2,111],128:[2,111],129:[2,111],132:[2,111],133:[2,111],134:[2,111],135:[2,111],136:[2,111],137:[2,111]},{1:[2,49],6:[2,49],25:[2,49],26:[2,49],49:[2,49],54:[2,49],57:[2,49],73:[2,49],78:[2,49],86:[2,49],91:[2,49],93:[2,49],102:[2,49],104:[2,49],105:[2,49],106:[2,49],110:[2,49],118:[2,49],126:[2,49],128:[2,49],129:[2,49],132:[2,49],133:[2,49],134:[2,49],135:[2,49],136:[2,49],137:[2,49]},{6:[2,58],25:[2,58],26:[2,58],49:[2,58],54:[2,58]},{6:[2,53],25:[2,53],26:[2,53],53:316,54:[1,204]},{1:[2,203],6:[2,203],25:[2,203],26:[2,203],49:[2,203],54:[2,203],57:[2,203],73:[2,203],78:[2,203],86:[2,203],91:[2,203],93:[2,203],102:[2,203],104:[2,203],105:[2,203],106:[2,203],110:[2,203],118:[2,203],126:[2,203],128:[2,203],129:[2,203],132:[2,203],133:[2,203],134:[2,203],135:[2,203],136:[2,203],137:[2,203]},{1:[2,182],6:[2,182],25:[2,182],26:[2,182],49:[2,182],54:[2,182],57:[2,182],73:[2,182],78:[2,182],86:[2,182],91:[2,182],93:[2,182],102:[2,182],104:[2,182],105:[2,182],106:[2,182],110:[2,182],118:[2,182],121:[2,182],126:[2,182],128:[2,182],129:[2,182],132:[2,182],133:[2,182],134:[2,182],135:[2,182],136:[2,182],137:[2,182]},{1:[2,136],6:[2,136],25:[2,136],26:[2,136],49:[2,136],54:[2,136],57:[2,136],73:[2,136],78:[2,136],86:[2,136],91:[2,136],93:[2,136],102:[2,136],104:[2,136],105:[2,136],106:[2,136],110:[2,136],118:[2,136],126:[2,136],128:[2,136],129:[2,136],132:[2,136],133:[2,136],134:[2,136],135:[2,136],136:[2,136],137:[2,136]},{1:[2,137],6:[2,137],25:[2,137],26:[2,137],49:[2,137],54:[2,137],57:[2,137],73:[2,137],78:[2,137],86:[2,137],91:[2,137],93:[2,137],98:[2,137],102:[2,137],104:[2,137],105:[2,137],106:[2,137],110:[2,137],118:[2,137],126:[2,137],128:[2,137],129:[2,137],132:[2,137],133:[2,137],134:[2,137],135:[2,137],136:[2,137],137:[2,137]},{1:[2,138],6:[2,138],25:[2,138],26:[2,138],49:[2,138],54:[2,138],57:[2,138],73:[2,138],78:[2,138],86:[2,138],91:[2,138],93:[2,138],98:[2,138],102:[2,138],104:[2,138],105:[2,138],106:[2,138],110:[2,138],118:[2,138],126:[2,138],128:[2,138],129:[2,138],132:[2,138],133:[2,138],134:[2,138],135:[2,138],136:[2,138],137:[2,138]},{1:[2,173],6:[2,173],25:[2,173],26:[2,173],49:[2,173],54:[2,173],57:[2,173],73:[2,173],78:[2,173],86:[2,173],91:[2,173],93:[2,173],102:[2,173],104:[2,173],105:[2,173],106:[2,173],110:[2,173],118:[2,173],126:[2,173],128:[2,173],129:[2,173],132:[2,173],133:[2,173],134:[2,173],135:[2,173],136:[2,173],137:[2,173]},{5:317,25:[1,5]},{26:[1,318]},{6:[1,319],26:[2,179],121:[2,179],123:[2,179]},{8:320,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{1:[2,103],6:[2,103],25:[2,103],26:[2,103],49:[2,103],54:[2,103],57:[2,103],73:[2,103],78:[2,103],86:[2,103],91:[2,103],93:[2,103],102:[2,103],104:[2,103],105:[2,103],106:[2,103],110:[2,103],118:[2,103],126:[2,103],128:[2,103],129:[2,103],132:[2,103],133:[2,103],134:[2,103],135:[2,103],136:[2,103],137:[2,103]},{1:[2,142],6:[2,142],25:[2,142],26:[2,142],49:[2,142],54:[2,142],57:[2,142],66:[2,142],67:[2,142],68:[2,142],69:[2,142],71:[2,142],73:[2,142],74:[2,142],78:[2,142],84:[2,142],85:[2,142],86:[2,142],91:[2,142],93:[2,142],102:[2,142],104:[2,142],105:[2,142],106:[2,142],110:[2,142],118:[2,142],126:[2,142],128:[2,142],129:[2,142],132:[2,142],133:[2,142],134:[2,142],135:[2,142],136:[2,142],137:[2,142]},{1:[2,119],6:[2,119],25:[2,119],26:[2,119],49:[2,119],54:[2,119],57:[2,119],66:[2,119],67:[2,119],68:[2,119],69:[2,119],71:[2,119],73:[2,119],74:[2,119],78:[2,119],84:[2,119],85:[2,119],86:[2,119],91:[2,119],93:[2,119],102:[2,119],104:[2,119],105:[2,119],106:[2,119],110:[2,119],118:[2,119],126:[2,119],128:[2,119],129:[2,119],132:[2,119],133:[2,119],134:[2,119],135:[2,119],136:[2,119],137:[2,119]},{6:[2,126],25:[2,126],26:[2,126],54:[2,126],86:[2,126],91:[2,126]},{6:[2,53],25:[2,53],26:[2,53],53:321,54:[1,229]},{6:[2,127],25:[2,127],26:[2,127],54:[2,127],86:[2,127],91:[2,127]},{1:[2,168],6:[2,168],25:[2,168],26:[2,168],49:[2,168],54:[2,168],57:[2,168],73:[2,168],78:[2,168],86:[2,168],91:[2,168],93:[2,168],102:[2,168],103:87,104:[2,168],105:[2,168],106:[2,168],109:88,110:[2,168],111:69,118:[1,322],126:[2,168],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,170],6:[2,170],25:[2,170],26:[2,170],49:[2,170],54:[2,170],57:[2,170],73:[2,170],78:[2,170],86:[2,170],91:[2,170],93:[2,170],102:[2,170],103:87,104:[2,170],105:[1,323],106:[2,170],109:88,110:[2,170],111:69,118:[2,170],126:[2,170],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,169],6:[2,169],25:[2,169],26:[2,169],49:[2,169],54:[2,169],57:[2,169],73:[2,169],78:[2,169],86:[2,169],91:[2,169],93:[2,169],102:[2,169],103:87,104:[2,169],105:[2,169],106:[2,169],109:88,110:[2,169],111:69,118:[2,169],126:[2,169],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[2,94],25:[2,94],26:[2,94],54:[2,94],78:[2,94]},{6:[2,53],25:[2,53],26:[2,53],53:324,54:[1,239]},{26:[1,325],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[1,250],25:[1,251],26:[1,326]},{26:[1,327]},{1:[2,176],6:[2,176],25:[2,176],26:[2,176],49:[2,176],54:[2,176],57:[2,176],73:[2,176],78:[2,176],86:[2,176],91:[2,176],93:[2,176],102:[2,176],104:[2,176],105:[2,176],106:[2,176],110:[2,176],118:[2,176],126:[2,176],128:[2,176],129:[2,176],132:[2,176],133:[2,176],134:[2,176],135:[2,176],136:[2,176],137:[2,176]},{26:[2,180],121:[2,180],123:[2,180]},{25:[2,132],54:[2,132],103:87,104:[1,65],106:[1,66],109:88,110:[1,68],111:69,126:[1,86],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[1,272],25:[1,273],26:[1,328]},{8:329,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{8:330,9:118,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,76:[1,70],79:[1,43],83:[1,28],88:[1,58],89:[1,59],90:[1,57],96:[1,38],100:[1,44],101:[1,56],103:39,104:[1,65],106:[1,66],107:40,108:[1,67],109:41,110:[1,68],111:69,119:[1,42],124:37,125:[1,64],127:[1,31],128:[1,32],129:[1,33],130:[1,34],131:[1,35]},{6:[1,283],25:[1,284],26:[1,331]},{6:[2,41],25:[2,41],26:[2,41],54:[2,41],78:[2,41]},{6:[2,59],25:[2,59],26:[2,59],49:[2,59],54:[2,59]},{1:[2,174],6:[2,174],25:[2,174],26:[2,174],49:[2,174],54:[2,174],57:[2,174],73:[2,174],78:[2,174],86:[2,174],91:[2,174],93:[2,174],102:[2,174],104:[2,174],105:[2,174],106:[2,174],110:[2,174],118:[2,174],126:[2,174],128:[2,174],129:[2,174],132:[2,174],133:[2,174],134:[2,174],135:[2,174],136:[2,174],137:[2,174]},{6:[2,128],25:[2,128],26:[2,128],54:[2,128],86:[2,128],91:[2,128]},{1:[2,171],6:[2,171],25:[2,171],26:[2,171],49:[2,171],54:[2,171],57:[2,171],73:[2,171],78:[2,171],86:[2,171],91:[2,171],93:[2,171],102:[2,171],103:87,104:[2,171],105:[2,171],106:[2,171],109:88,110:[2,171],111:69,118:[2,171],126:[2,171],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{1:[2,172],6:[2,172],25:[2,172],26:[2,172],49:[2,172],54:[2,172],57:[2,172],73:[2,172],78:[2,172],86:[2,172],91:[2,172],93:[2,172],102:[2,172],103:87,104:[2,172],105:[2,172],106:[2,172],109:88,110:[2,172],111:69,118:[2,172],126:[2,172],128:[1,80],129:[1,79],132:[1,78],133:[1,81],134:[1,82],135:[1,83],136:[1,84],137:[1,85]},{6:[2,95],25:[2,95],26:[2,95],54:[2,95],78:[2,95]}],
 defaultActions: {60:[2,51],61:[2,52],75:[2,3],94:[2,109],191:[2,89]},
 parseError: function parseError(str, hash) {
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/repl.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/repl.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/repl.js	(revision 516)
@@ -1,5 +1,9 @@
-// Generated by CoffeeScript 1.6.2
+// Generated by CoffeeScript 1.6.3
 (function() {
-  var CoffeeScript, addMultilineHandler, merge, nodeREPL, prettyErrorMessage, replDefaults, vm, _ref;
+  var CoffeeScript, addHistory, addMultilineHandler, fs, merge, nodeREPL, path, prettyErrorMessage, replDefaults, vm, _ref;
+
+  fs = require('fs');
+
+  path = require('path');
 
   vm = require('vm');
@@ -13,7 +17,8 @@
   replDefaults = {
     prompt: 'coffee> ',
+    historyFile: process.env.HOME ? path.join(process.env.HOME, '.coffee_history') : void 0,
+    historyMaxInputSize: 10240,
     "eval": function(input, context, filename, cb) {
       var Assign, Block, Literal, Value, ast, err, js, _ref1;
-
       input = input.replace(/\uFF00/g, '\n');
       input = input.replace(/^\(([\s\S]*)\n\)$/m, '$1');
@@ -36,5 +41,4 @@
   addMultilineHandler = function(repl) {
     var inputStream, multiline, nodeLineListener, outputStream, rli;
-
     rli = repl.rli, inputStream = repl.inputStream, outputStream = repl.outputStream;
     multiline = {
@@ -89,8 +93,45 @@
   };
 
+  addHistory = function(repl, filename, maxSize) {
+    var buffer, fd, lastLine, readFd, size, stat;
+    lastLine = null;
+    try {
+      stat = fs.statSync(filename);
+      size = Math.min(maxSize, stat.size);
+      readFd = fs.openSync(filename, 'r');
+      buffer = new Buffer(size);
+      fs.readSync(readFd, buffer, 0, size, stat.size - size);
+      repl.rli.history = buffer.toString().split('\n').reverse();
+      if (stat.size > maxSize) {
+        repl.rli.history.pop();
+      }
+      if (repl.rli.history[0] === '') {
+        repl.rli.history.shift();
+      }
+      repl.rli.historyIndex = -1;
+      lastLine = repl.rli.history[0];
+    } catch (_error) {}
+    fd = fs.openSync(filename, 'a');
+    repl.rli.addListener('line', function(code) {
+      if (code && code.length && code !== '.history' && lastLine !== code) {
+        fs.write(fd, "" + code + "\n");
+        return lastLine = code;
+      }
+    });
+    repl.rli.on('exit', function() {
+      return fs.close(fd);
+    });
+    return repl.commands['.history'] = {
+      help: 'Show command history',
+      action: function() {
+        repl.outputStream.write("" + (repl.rli.history.slice(0).reverse().join('\n')) + "\n");
+        return repl.displayPrompt();
+      }
+    };
+  };
+
   module.exports = {
     start: function(opts) {
       var build, major, minor, repl, _ref1;
-
       if (opts == null) {
         opts = {};
@@ -109,4 +150,7 @@
       });
       addMultilineHandler(repl);
+      if (opts.historyFile) {
+        addHistory(repl, opts.historyFile, opts.historyMaxInputSize);
+      }
       return repl;
     }
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/rewriter.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/rewriter.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/rewriter.js	(revision 516)
@@ -1,5 +1,5 @@
-// Generated by CoffeeScript 1.6.2
+// Generated by CoffeeScript 1.6.3
 (function() {
-  var BALANCED_PAIRS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_BLOCK, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, SINGLE_CLOSERS, SINGLE_LINERS, generate, left, rite, _i, _len, _ref,
+  var BALANCED_PAIRS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, SINGLE_CLOSERS, SINGLE_LINERS, generate, left, rite, _i, _len, _ref,
     __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
     __slice = [].slice;
@@ -7,5 +7,4 @@
   generate = function(tag, value) {
     var tok;
-
     tok = [tag, value];
     tok.generated = true;
@@ -31,5 +30,4 @@
     Rewriter.prototype.scanTokens = function(block) {
       var i, token, tokens;
-
       tokens = this.tokens;
       i = 0;
@@ -42,5 +40,4 @@
     Rewriter.prototype.detectEnd = function(i, condition, action) {
       var levels, token, tokens, _ref, _ref1;
-
       tokens = this.tokens;
       levels = 0;
@@ -64,5 +61,4 @@
     Rewriter.prototype.removeLeadingNewlines = function() {
       var i, tag, _i, _len, _ref;
-
       _ref = this.tokens;
       for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {
@@ -80,5 +76,4 @@
       return this.scanTokens(function(token, i, tokens) {
         var _ref;
-
         if (!(token[0] === 'TERMINATOR' && (_ref = this.tag(i + 1), __indexOf.call(EXPRESSION_CLOSE, _ref) >= 0))) {
           return 1;
@@ -91,8 +86,6 @@
     Rewriter.prototype.closeOpenCalls = function() {
       var action, condition;
-
       condition = function(token, i) {
         var _ref;
-
         return ((_ref = token[0]) === ')' || _ref === 'CALL_END') || token[0] === 'OUTDENT' && this.tag(i - 1) === ')';
       };
@@ -110,8 +103,6 @@
     Rewriter.prototype.closeOpenIndexes = function() {
       var action, condition;
-
       condition = function(token, i) {
         var _ref;
-
         return (_ref = token[0]) === ']' || _ref === 'INDEX_END';
       };
@@ -129,5 +120,4 @@
     Rewriter.prototype.matchTags = function() {
       var fuzz, i, j, pattern, _i, _ref, _ref1;
-
       i = arguments[0], pattern = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
       fuzz = 0;
@@ -155,5 +145,4 @@
     Rewriter.prototype.findTagsBackwards = function(i, tags) {
       var backStack, _ref, _ref1, _ref2, _ref3, _ref4, _ref5;
-
       backStack = [];
       while (i >= 0 && (backStack.length || (_ref2 = this.tag(i), __indexOf.call(tags, _ref2) < 0) && ((_ref3 = this.tag(i), __indexOf.call(EXPRESSION_START, _ref3) < 0) || this.tokens[i].generated) && (_ref4 = this.tag(i), __indexOf.call(LINEBREAKS, _ref4) < 0))) {
@@ -171,9 +160,7 @@
     Rewriter.prototype.addImplicitBracesAndParens = function() {
       var stack;
-
       stack = [];
       return this.scanTokens(function(token, i, tokens) {
         var endImplicitCall, endImplicitObject, forward, inImplicit, inImplicitCall, inImplicitControl, inImplicitObject, nextTag, offset, prevTag, s, sameLine, stackIdx, stackTag, stackTop, startIdx, startImplicitCall, startImplicitObject, startsLine, tag, _ref, _ref1, _ref2, _ref3, _ref4, _ref5;
-
         tag = token[0];
         prevTag = (i > 0 ? tokens[i - 1] : [])[0];
@@ -188,25 +175,20 @@
         inImplicit = function() {
           var _ref, _ref1;
-
           return (_ref = stackTop()) != null ? (_ref1 = _ref[2]) != null ? _ref1.ours : void 0 : void 0;
         };
         inImplicitCall = function() {
           var _ref;
-
           return inImplicit() && ((_ref = stackTop()) != null ? _ref[0] : void 0) === '(';
         };
         inImplicitObject = function() {
           var _ref;
-
           return inImplicit() && ((_ref = stackTop()) != null ? _ref[0] : void 0) === '{';
         };
         inImplicitControl = function() {
           var _ref;
-
           return inImplicit && ((_ref = stackTop()) != null ? _ref[0] : void 0) === 'CONTROL';
         };
         startImplicitCall = function(j) {
           var idx;
-
           idx = j != null ? j : i;
           stack.push([
@@ -227,5 +209,4 @@
         startImplicitObject = function(j, startsLine) {
           var idx;
-
           if (startsLine == null) {
             startsLine = true;
@@ -293,5 +274,5 @@
           return forward(2);
         }
-        if (this.matchTags(i, IMPLICIT_FUNC, 'INDENT', null, ':') && !this.findTagsBackwards(i, ['CLASS', 'EXTENDS', 'IF', 'CATCH', 'SWITCH', 'LEADING_WHEN', 'FOR', 'WHILE', 'UNTIL'])) {
+        if (__indexOf.call(IMPLICIT_FUNC, tag) >= 0 && this.matchTags(i + 1, 'INDENT', null, ':') && !this.findTagsBackwards(i, ['CLASS', 'EXTENDS', 'IF', 'CATCH', 'SWITCH', 'LEADING_WHEN', 'FOR', 'WHILE', 'UNTIL'])) {
           startImplicitCall(i + 1);
           stack.push(['INDENT', i + 2]);
@@ -351,5 +332,4 @@
       return this.scanTokens(function(token, i, tokens) {
         var column, line, nextLocation, prevLocation, _ref, _ref1;
-
         if (token[2]) {
           return 1;
@@ -377,10 +357,8 @@
     Rewriter.prototype.addImplicitIndentation = function() {
       var action, condition, indent, outdent, starter;
-
       starter = indent = outdent = null;
       condition = function(token, i) {
-        var _ref;
-
-        return token[1] !== ';' && (_ref = token[0], __indexOf.call(SINGLE_CLOSERS, _ref) >= 0) && !(token[0] === 'ELSE' && (starter !== 'IF' && starter !== 'THEN'));
+        var _ref, _ref1;
+        return token[1] !== ';' && (_ref = token[0], __indexOf.call(SINGLE_CLOSERS, _ref) >= 0) && !(token[0] === 'ELSE' && starter !== 'THEN') && !(((_ref1 = token[0]) === 'CATCH' || _ref1 === 'FINALLY') && (starter === '->' || starter === '=>'));
       };
       action = function(token, i) {
@@ -388,6 +366,5 @@
       };
       return this.scanTokens(function(token, i, tokens) {
-        var tag, _ref, _ref1;
-
+        var j, tag, _i, _ref, _ref1;
         tag = token[0];
         if (tag === 'TERMINATOR' && this.tag(i + 1) === 'THEN') {
@@ -399,7 +376,12 @@
           return 2;
         }
-        if (tag === 'CATCH' && ((_ref = this.tag(i + 2)) === 'OUTDENT' || _ref === 'TERMINATOR' || _ref === 'FINALLY')) {
-          tokens.splice.apply(tokens, [i + 2, 0].concat(__slice.call(this.indentation())));
-          return 4;
+        if (tag === 'CATCH') {
+          for (j = _i = 1; _i <= 2; j = ++_i) {
+            if (!((_ref = this.tag(i + j)) === 'OUTDENT' || _ref === 'TERMINATOR' || _ref === 'FINALLY')) {
+              continue;
+            }
+            tokens.splice.apply(tokens, [i + j, 0].concat(__slice.call(this.indentation())));
+            return 2 + j;
+          }
         }
         if (__indexOf.call(SINGLE_LINERS, tag) >= 0 && this.tag(i + 1) !== 'INDENT' && !(tag === 'ELSE' && this.tag(i + 1) === 'IF')) {
@@ -422,9 +404,7 @@
     Rewriter.prototype.tagPostfixConditionals = function() {
       var action, condition, original;
-
       original = null;
       condition = function(token, i) {
         var prevTag, tag;
-
         tag = token[0];
         prevTag = this.tokens[i - 1][0];
@@ -448,5 +428,4 @@
     Rewriter.prototype.indentation = function(implicit) {
       var indent, outdent;
-
       if (implicit == null) {
         implicit = false;
@@ -467,5 +446,4 @@
     Rewriter.prototype.tag = function(i) {
       var _ref;
-
       return (_ref = this.tokens[i]) != null ? _ref[0] : void 0;
     };
@@ -497,6 +475,4 @@
   IMPLICIT_UNSPACED_CALL = ['+', '-'];
 
-  IMPLICIT_BLOCK = ['->', '=>', '{', '[', ','];
-
   IMPLICIT_END = ['POST_IF', 'FOR', 'WHILE', 'UNTIL', 'WHEN', 'BY', 'LOOP', 'TERMINATOR'];
 
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/scope.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/scope.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/scope.js	(revision 516)
@@ -1,3 +1,3 @@
-// Generated by CoffeeScript 1.6.2
+// Generated by CoffeeScript 1.6.3
 (function() {
   var Scope, extend, last, _ref;
@@ -40,5 +40,4 @@
     Scope.prototype.namedMethod = function() {
       var _ref1;
-
       if (((_ref1 = this.method) != null ? _ref1.name : void 0) || !this.parent) {
         return this.method;
@@ -64,5 +63,4 @@
     Scope.prototype.check = function(name) {
       var _ref1;
-
       return !!(this.type(name) || ((_ref1 = this.parent) != null ? _ref1.check(name) : void 0));
     };
@@ -78,5 +76,4 @@
     Scope.prototype.type = function(name) {
       var v, _i, _len, _ref1;
-
       _ref1 = this.variables;
       for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
@@ -91,5 +88,4 @@
     Scope.prototype.freeVariable = function(name, reserve) {
       var index, temp;
-
       if (reserve == null) {
         reserve = true;
@@ -119,5 +115,4 @@
     Scope.prototype.declaredVariables = function() {
       var realVars, tempVars, v, _i, _len, _ref1;
-
       realVars = [];
       tempVars = [];
@@ -134,5 +129,4 @@
     Scope.prototype.assignedVariables = function() {
       var v, _i, _len, _ref1, _results;
-
       _ref1 = this.variables;
       _results = [];
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/sourcemap.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/sourcemap.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/lib/coffee-script/sourcemap.js	(revision 516)
@@ -1,115 +1,154 @@
-// Generated by CoffeeScript 1.6.2
+// Generated by CoffeeScript 1.6.3
 (function() {
-  var BASE64_CHARS, LineMapping, MAX_BASE64_VALUE, VLQ_CONTINUATION_BIT, VLQ_SHIFT, VLQ_VALUE_MASK, decodeBase64Char, encodeBase64Char;
+  var LineMap, SourceMap;
 
-  LineMapping = (function() {
-    function LineMapping(generatedLine) {
-      this.generatedLine = generatedLine;
-      this.columnMap = {};
-      this.columnMappings = [];
+  LineMap = (function() {
+    function LineMap(line) {
+      this.line = line;
+      this.columns = [];
     }
 
-    LineMapping.prototype.addMapping = function(generatedColumn, _arg, options) {
+    LineMap.prototype.add = function(column, _arg, options) {
       var sourceColumn, sourceLine;
-
       sourceLine = _arg[0], sourceColumn = _arg[1];
       if (options == null) {
         options = {};
       }
-      if (this.columnMap[generatedColumn] && options.noReplace) {
+      if (this.columns[column] && options.noReplace) {
         return;
       }
-      this.columnMap[generatedColumn] = {
-        generatedLine: this.generatedLine,
-        generatedColumn: generatedColumn,
+      return this.columns[column] = {
+        line: this.line,
+        column: column,
         sourceLine: sourceLine,
         sourceColumn: sourceColumn
       };
-      this.columnMappings.push(this.columnMap[generatedColumn]);
-      return this.columnMappings.sort(function(a, b) {
-        return a.generatedColumn - b.generatedColumn;
-      });
     };
 
-    LineMapping.prototype.getSourcePosition = function(generatedColumn) {
-      var answer, columnMapping, lastColumnMapping, _i, _len, _ref;
-
-      answer = null;
-      lastColumnMapping = null;
-      _ref = this.columnMappings;
-      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
-        columnMapping = _ref[_i];
-        if (columnMapping.generatedColumn > generatedColumn) {
-          break;
-        } else {
-          lastColumnMapping = columnMapping;
-        }
+    LineMap.prototype.sourceLocation = function(column) {
+      var mapping;
+      while (!((mapping = this.columns[column]) || (column <= 0))) {
+        column--;
       }
-      if (lastColumnMapping) {
-        return answer = [lastColumnMapping.sourceLine, lastColumnMapping.sourceColumn];
-      }
+      return mapping && [mapping.sourceLine, mapping.sourceColumn];
     };
 
-    return LineMapping;
+    return LineMap;
 
   })();
 
-  exports.SourceMap = (function() {
+  SourceMap = (function() {
+    var BASE64_CHARS, VLQ_CONTINUATION_BIT, VLQ_SHIFT, VLQ_VALUE_MASK;
+
     function SourceMap() {
-      this.generatedLines = [];
+      this.lines = [];
     }
 
-    SourceMap.prototype.addMapping = function(sourceLocation, generatedLocation, options) {
-      var generatedColumn, generatedLine, lineMapping;
-
+    SourceMap.prototype.add = function(sourceLocation, generatedLocation, options) {
+      var column, line, lineMap, _base;
       if (options == null) {
         options = {};
       }
-      generatedLine = generatedLocation[0], generatedColumn = generatedLocation[1];
-      lineMapping = this.generatedLines[generatedLine];
-      if (!lineMapping) {
-        lineMapping = this.generatedLines[generatedLine] = new LineMapping(generatedLine);
-      }
-      return lineMapping.addMapping(generatedColumn, sourceLocation, options);
+      line = generatedLocation[0], column = generatedLocation[1];
+      lineMap = ((_base = this.lines)[line] || (_base[line] = new LineMap(line)));
+      return lineMap.add(column, sourceLocation, options);
     };
 
-    SourceMap.prototype.getSourcePosition = function(_arg) {
-      var answer, generatedColumn, generatedLine, lineMapping;
+    SourceMap.prototype.sourceLocation = function(_arg) {
+      var column, line, lineMap;
+      line = _arg[0], column = _arg[1];
+      while (!((lineMap = this.lines[line]) || (line <= 0))) {
+        line--;
+      }
+      return lineMap && lineMap.sourceLocation(column);
+    };
 
-      generatedLine = _arg[0], generatedColumn = _arg[1];
-      answer = null;
-      lineMapping = this.generatedLines[generatedLine];
-      if (!lineMapping) {
+    SourceMap.prototype.generate = function(options, code) {
+      var buffer, lastColumn, lastSourceColumn, lastSourceLine, lineMap, lineNumber, mapping, needComma, v3, writingline, _i, _j, _len, _len1, _ref, _ref1;
+      if (options == null) {
+        options = {};
+      }
+      if (code == null) {
+        code = null;
+      }
+      writingline = 0;
+      lastColumn = 0;
+      lastSourceLine = 0;
+      lastSourceColumn = 0;
+      needComma = false;
+      buffer = "";
+      _ref = this.lines;
+      for (lineNumber = _i = 0, _len = _ref.length; _i < _len; lineNumber = ++_i) {
+        lineMap = _ref[lineNumber];
+        if (lineMap) {
+          _ref1 = lineMap.columns;
+          for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
+            mapping = _ref1[_j];
+            if (!(mapping)) {
+              continue;
+            }
+            while (writingline < mapping.line) {
+              lastColumn = 0;
+              needComma = false;
+              buffer += ";";
+              writingline++;
+            }
+            if (needComma) {
+              buffer += ",";
+              needComma = false;
+            }
+            buffer += this.encodeVlq(mapping.column - lastColumn);
+            lastColumn = mapping.column;
+            buffer += this.encodeVlq(0);
+            buffer += this.encodeVlq(mapping.sourceLine - lastSourceLine);
+            lastSourceLine = mapping.sourceLine;
+            buffer += this.encodeVlq(mapping.sourceColumn - lastSourceColumn);
+            lastSourceColumn = mapping.sourceColumn;
+            needComma = true;
+          }
+        }
+      }
+      v3 = {
+        version: 3,
+        file: options.generatedFile || '',
+        sourceRoot: options.sourceRoot || '',
+        sources: options.sourceFiles || [''],
+        names: [],
+        mappings: buffer
+      };
+      if (options.inline) {
+        v3.sourcesContent = [code];
+      }
+      return JSON.stringify(v3, null, 2);
+    };
 
-      } else {
-        answer = lineMapping.getSourcePosition(generatedColumn);
+    VLQ_SHIFT = 5;
+
+    VLQ_CONTINUATION_BIT = 1 << VLQ_SHIFT;
+
+    VLQ_VALUE_MASK = VLQ_CONTINUATION_BIT - 1;
+
+    SourceMap.prototype.encodeVlq = function(value) {
+      var answer, nextChunk, signBit, valueToEncode;
+      answer = '';
+      signBit = value < 0 ? 1 : 0;
+      valueToEncode = (Math.abs(value) << 1) + signBit;
+      while (valueToEncode || !answer) {
+        nextChunk = valueToEncode & VLQ_VALUE_MASK;
+        valueToEncode = valueToEncode >> VLQ_SHIFT;
+        if (valueToEncode) {
+          nextChunk |= VLQ_CONTINUATION_BIT;
+        }
+        answer += this.encodeBase64(nextChunk);
       }
       return answer;
     };
 
-    SourceMap.prototype.forEachMapping = function(fn) {
-      var columnMapping, generatedLineNumber, lineMapping, _i, _len, _ref, _results;
+    BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
 
-      _ref = this.generatedLines;
-      _results = [];
-      for (generatedLineNumber = _i = 0, _len = _ref.length; _i < _len; generatedLineNumber = ++_i) {
-        lineMapping = _ref[generatedLineNumber];
-        if (lineMapping) {
-          _results.push((function() {
-            var _j, _len1, _ref1, _results1;
-
-            _ref1 = lineMapping.columnMappings;
-            _results1 = [];
-            for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
-              columnMapping = _ref1[_j];
-              _results1.push(fn(columnMapping));
-            }
-            return _results1;
-          })());
-        } else {
-          _results.push(void 0);
-        }
-      }
-      return _results;
+    SourceMap.prototype.encodeBase64 = function(value) {
+      return BASE64_CHARS[value] || (function() {
+        throw new Error("Cannot Base64 encode value: " + value);
+      })();
     };
 
@@ -118,131 +157,5 @@
   })();
 
-  exports.generateV3SourceMap = function(sourceMap, options, code) {
-    var answer, generatedFile, lastGeneratedColumnWritten, lastSourceColumnWritten, lastSourceLineWritten, mappings, needComma, sourceFiles, sourceRoot, writingGeneratedLine;
-
-    if (options == null) {
-      options = {};
-    }
-    sourceRoot = options.sourceRoot || "";
-    sourceFiles = options.sourceFiles || [""];
-    generatedFile = options.generatedFile || "";
-    writingGeneratedLine = 0;
-    lastGeneratedColumnWritten = 0;
-    lastSourceLineWritten = 0;
-    lastSourceColumnWritten = 0;
-    needComma = false;
-    mappings = "";
-    sourceMap.forEachMapping(function(mapping) {
-      while (writingGeneratedLine < mapping.generatedLine) {
-        lastGeneratedColumnWritten = 0;
-        needComma = false;
-        mappings += ";";
-        writingGeneratedLine++;
-      }
-      if (needComma) {
-        mappings += ",";
-        needComma = false;
-      }
-      mappings += exports.vlqEncodeValue(mapping.generatedColumn - lastGeneratedColumnWritten);
-      lastGeneratedColumnWritten = mapping.generatedColumn;
-      mappings += exports.vlqEncodeValue(0);
-      mappings += exports.vlqEncodeValue(mapping.sourceLine - lastSourceLineWritten);
-      lastSourceLineWritten = mapping.sourceLine;
-      mappings += exports.vlqEncodeValue(mapping.sourceColumn - lastSourceColumnWritten);
-      lastSourceColumnWritten = mapping.sourceColumn;
-      return needComma = true;
-    });
-    answer = {
-      version: 3,
-      file: generatedFile,
-      sourceRoot: sourceRoot,
-      sources: sourceFiles,
-      names: [],
-      mappings: mappings
-    };
-    if (options.inline) {
-      answer.sourcesContent = [code];
-    }
-    return JSON.stringify(answer, null, 2);
-  };
-
-  exports.loadV3SourceMap = function(sourceMap) {
-    return todo();
-  };
-
-  BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
-
-  MAX_BASE64_VALUE = BASE64_CHARS.length - 1;
-
-  encodeBase64Char = function(value) {
-    if (value > MAX_BASE64_VALUE) {
-      throw new Error("Cannot encode value " + value + " > " + MAX_BASE64_VALUE);
-    } else if (value < 0) {
-      throw new Error("Cannot encode value " + value + " < 0");
-    }
-    return BASE64_CHARS[value];
-  };
-
-  decodeBase64Char = function(char) {
-    var value;
-
-    value = BASE64_CHARS.indexOf(char);
-    if (value === -1) {
-      throw new Error("Invalid Base 64 character: " + char);
-    }
-    return value;
-  };
-
-  VLQ_SHIFT = 5;
-
-  VLQ_CONTINUATION_BIT = 1 << VLQ_SHIFT;
-
-  VLQ_VALUE_MASK = VLQ_CONTINUATION_BIT - 1;
-
-  exports.vlqEncodeValue = function(value) {
-    var answer, nextVlqChunk, signBit, valueToEncode;
-
-    signBit = value < 0 ? 1 : 0;
-    valueToEncode = (Math.abs(value) << 1) + signBit;
-    answer = "";
-    while (valueToEncode || !answer) {
-      nextVlqChunk = valueToEncode & VLQ_VALUE_MASK;
-      valueToEncode = valueToEncode >> VLQ_SHIFT;
-      if (valueToEncode) {
-        nextVlqChunk |= VLQ_CONTINUATION_BIT;
-      }
-      answer += encodeBase64Char(nextVlqChunk);
-    }
-    return answer;
-  };
-
-  exports.vlqDecodeValue = function(str, offset) {
-    var consumed, continuationShift, done, nextChunkValue, nextVlqChunk, position, signBit, value;
-
-    if (offset == null) {
-      offset = 0;
-    }
-    position = offset;
-    done = false;
-    value = 0;
-    continuationShift = 0;
-    while (!done) {
-      nextVlqChunk = decodeBase64Char(str[position]);
-      position += 1;
-      nextChunkValue = nextVlqChunk & VLQ_VALUE_MASK;
-      value += nextChunkValue << continuationShift;
-      if (!(nextVlqChunk & VLQ_CONTINUATION_BIT)) {
-        done = true;
-      }
-      continuationShift += VLQ_SHIFT;
-    }
-    consumed = position - offset;
-    signBit = value & 1;
-    value = value >> 1;
-    if (signBit) {
-      value = -value;
-    }
-    return [value, consumed];
-  };
+  module.exports = SourceMap;
 
 }).call(this);
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/coffee-script/package.json	(revision 516)
@@ -11,5 +11,5 @@
     "name": "Jeremy Ashkenas"
   },
-  "version": "1.6.2",
+  "version": "1.6.3",
   "licenses": [
     {
@@ -46,9 +46,5 @@
   "readme": "\n            {\n         }   }   {\n        {   {  }  }\n         }   }{  {\n        {  }{  }  }                    _____       __  __\n       ( }{ }{  { )                   / ____|     / _|/ _|\n     .- { { }  { }} -.               | |     ___ | |_| |_ ___  ___\n    (  ( } { } { } }  )              | |    / _ \\|  _|  _/ _ \\/ _ \\\n    |`-..________ ..-'|              | |___| (_) | | | ||  __/  __/\n    |                 |               \\_____\\___/|_| |_| \\___|\\___|\n    |                 ;--.\n    |                (__  \\            _____           _       _\n    |                 | )  )          / ____|         (_)     | |\n    |                 |/  /          | (___   ___ _ __ _ _ __ | |_\n    |                 (  /            \\___ \\ / __| '__| | '_ \\| __|\n    |                 |/              ____) | (__| |  | | |_) | |_\n    |                 |              |_____/ \\___|_|  |_| .__/ \\__|\n     `-.._________..-'                                  | |\n                                                        |_|\n\n\n  CoffeeScript is a little language that compiles into JavaScript.\n\n  Install Node.js, and then the CoffeeScript compiler:\n  sudo bin/cake install\n\n  Or, if you have the Node Package Manager installed:\n  npm install -g coffee-script\n  (Leave off the -g if you don't wish to install globally.)\n\n  Execute a script:\n  coffee /path/to/script.coffee\n\n  Compile a script:\n  coffee -c /path/to/script.coffee\n\n  For documentation, usage, and examples, see:\n  http://coffeescript.org/\n\n  To suggest a feature, report a bug, or general discussion:\n  http://github.com/jashkenas/coffee-script/issues/\n\n  If you'd like to chat, drop by #coffeescript on Freenode IRC,\n  or on webchat.freenode.net.\n\n  The source repository:\n  git://github.com/jashkenas/coffee-script.git\n\n  All contributors are listed here:\n  http://github.com/jashkenas/coffee-script/contributors\n",
   "readmeFilename": "README",
-  "_id": "coffee-script@1.6.2",
-  "dist": {
-    "shasum": "800f724d18d1103902711ce5345000261f2a2c3b"
-  },
-  "_from": "coffee-script@1.6.2",
-  "_resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.6.2.tgz"
+  "_id": "coffee-script@1.6.3",
+  "_from": "coffee-script@1.6.x"
 }
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/README.md	(revision 516)
@@ -1,3 +1,5 @@
 # Glob
+
+Match files using the patterns the shell uses, like stars and stuff.
 
 This is a glob implementation in JavaScript.  It uses the `minimatch`
@@ -58,5 +60,5 @@
 Perform an asynchronous glob search.
 
-## glob.sync(pattern, [options]
+## glob.sync(pattern, [options])
 
 * `pattern` {String} Pattern to be matched
@@ -98,4 +100,14 @@
   is no way at this time to continue a glob search after aborting, but
   you can re-use the statCache to avoid having to duplicate syscalls.
+* `statCache` Collection of all the stat results the glob search
+  performed.
+* `cache` Convenience object.  Each field has the following possible
+  values:
+  * `false` - Path does not exist
+  * `true` - Path exists
+  * `1` - Path exists, and is not a directory
+  * `2` - Path exists, and is a directory
+  * `[file, entries, ...]` - Path exists, is a directory, and the
+    array value is the results of `fs.readdir`
 
 ### Events
@@ -129,4 +141,7 @@
   onto.  Defaults to `path.resolve(options.cwd, "/")` (`/` on Unix
   systems, and `C:\` or some such on Windows.)
+* `dot` Include `.dot` files in normal matches and `globstar` matches.
+  Note that an explicit dot in a portion of the pattern will always
+  match dot files.
 * `nomount` By default, a pattern starting with a forward-slash will be
   "mounted" onto the root setting, so that a valid filesystem path is
@@ -147,4 +162,6 @@
   in search of other matches.  Set the `strict` option to raise an error
   in these cases.
+* `cache` See `cache` property above.  Pass in a previously generated
+  cache object to save some fs calls.
 * `statCache` A cache of results of filesystem information, to prevent
   unnecessary stat calls.  While it should not normally be necessary to
@@ -187,6 +204,5 @@
 and bash 4.1, where `**` only has special significance if it is the only
 thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
-`a/**b` will not.  **Note that this is different from the way that `**` is
-handled by ruby's `Dir` class.**
+`a/**b` will not.
 
 If an escaped pattern has no matches, and the `nonull` flag is set,
@@ -227,7 +243,8 @@
 and readdir calls that it makes, in order to cut down on system
 overhead.  However, this also makes it even more susceptible to races,
-especially if the statCache object is reused between glob calls.
-
-Users are thus advised not to use a glob result as a
-guarantee of filesystem state in the face of rapid changes.
-For the vast majority of operations, this is never a problem.
+especially if the cache or statCache objects are reused between glob
+calls.
+
+Users are thus advised not to use a glob result as a guarantee of
+filesystem state in the face of rapid changes.  For the vast majority
+of operations, this is never a problem.
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/glob.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/glob.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/glob.js	(revision 516)
@@ -23,5 +23,5 @@
 //   else // not globstar
 //     for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
-//       Test ENTRY against pattern[n+1]
+//       Test ENTRY against pattern[n]
 //       If fails, continue
 //       If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
@@ -37,5 +37,5 @@
 module.exports = glob
 
-var fs = require("graceful-fs")
+var fs = require("fs")
 , minimatch = require("minimatch")
 , Minimatch = minimatch.Minimatch
@@ -77,4 +77,5 @@
 }
 
+this._processingEmitQueue = false
 
 glob.Glob = Glob
@@ -85,8 +86,12 @@
   }
 
+  if (typeof options === "function") {
+    cb = options
+    options = null
+  }
+
   if (typeof cb === "function") {
     this.on("error", cb)
     this.on("end", function (matches) {
-      // console.error("cb with matches", matches)
       cb(null, matches)
     })
@@ -95,9 +100,14 @@
   options = options || {}
 
+  this._endEmitted = false
   this.EOF = {}
   this._emitQueue = []
 
+  this.paused = false
+  this._processingEmitQueue = false
+
   this.maxDepth = options.maxDepth || 1000
   this.maxLength = options.maxLength || Infinity
+  this.cache = options.cache || {}
   this.statCache = options.statCache || {}
 
@@ -112,4 +122,6 @@
   this.root = options.root || path.resolve(this.cwd, "/")
   this.root = path.resolve(this.root)
+  if (process.platform === "win32")
+    this.root = this.root.replace(/\\/g, "/")
 
   this.nomount = !!options.nomount
@@ -127,4 +139,5 @@
   }
 
+  this.strict = options.strict !== false
   this.dot = !!options.dot
   this.mark = !!options.mark
@@ -135,5 +148,9 @@
   this.nocase = !!options.nocase
   this.stat = !!options.stat
+
   this.debug = !!options.debug || !!options.globDebug
+  if (this.debug)
+    this.log = console.error
+
   this.silent = !!options.silent
 
@@ -144,4 +161,8 @@
   this.error = null
   this.aborted = false
+
+  // list of all the patterns that ** has resolved do, so
+  // we can avoid visiting multiple times.
+  this._globstars = {}
 
   EE.call(this)
@@ -165,4 +186,6 @@
 }
 
+Glob.prototype.log = function () {}
+
 Glob.prototype._finish = function () {
   assert(this instanceof Glob)
@@ -173,5 +196,5 @@
   for (var i = 0, l = this.matches.length; i < l; i ++) {
     var matches = this.matches[i]
-    if (this.debug) console.error("matches[%d] =", i, matches)
+    this.log("matches[%d] =", i, matches)
     // do like the shell, and spit out the literal glob
     if (!matches) {
@@ -199,20 +222,8 @@
   if (this.mark) {
     // at *some* point we statted all of these
-    all = all.map(function (m) {
-      var sc = this.statCache[m]
-      if (!sc)
-        return m
-      var isDir = (Array.isArray(sc) || sc === 2)
-      if (isDir && m.slice(-1) !== "/") {
-        return m + "/"
-      }
-      if (!isDir && m.slice(-1) === "/") {
-        return m.replace(/\/+$/, "")
-      }
-      return m
-    }, this)
-  }
-
-  if (this.debug) console.error("emitting end", all)
+    all = all.map(this._mark, this)
+  }
+
+  this.log("emitting end", all)
 
   this.EOF = this.found = all
@@ -228,4 +239,25 @@
 function alphasort (a, b) {
   return a > b ? 1 : a < b ? -1 : 0
+}
+
+Glob.prototype._mark = function (p) {
+  var c = this.cache[p]
+  var m = p
+  if (c) {
+    var isDir = c === 2 || Array.isArray(c)
+    var slash = p.slice(-1) === '/'
+
+    if (isDir && !slash)
+      m += '/'
+    else if (!isDir && slash)
+      m = m.slice(0, -1)
+
+    if (m !== p) {
+      this.statCache[m] = this.statCache[p]
+      this.cache[m] = this.cache[p]
+    }
+  }
+
+  return m
 }
 
@@ -254,4 +286,5 @@
 
 Glob.prototype.emitMatch = function (m) {
+  this.log('emitMatch', m)
   this._emitQueue.push(m)
   this._processEmitQueue()
@@ -259,18 +292,60 @@
 
 Glob.prototype._processEmitQueue = function (m) {
+  this.log("pEQ paused=%j processing=%j m=%j", this.paused,
+           this._processingEmitQueue, m)
+  var done = false
   while (!this._processingEmitQueue &&
          !this.paused) {
     this._processingEmitQueue = true
     var m = this._emitQueue.shift()
+    this.log(">processEmitQueue", m === this.EOF ? ":EOF:" : m)
     if (!m) {
+      this.log(">processEmitQueue, falsey m")
       this._processingEmitQueue = false
       break
     }
-    if (this.debug) {
-      console.error('emit!', m === this.EOF ? "end" : "match")
-    }
-    this.emit(m === this.EOF ? "end" : "match", m)
-    this._processingEmitQueue = false
-  }
+
+    if (m === this.EOF || !(this.mark && !this.stat)) {
+      this.log("peq: unmarked, or eof")
+      next.call(this, 0, false)
+    } else if (this.statCache[m]) {
+      var sc = this.statCache[m]
+      var exists
+      if (sc)
+        exists = sc.isDirectory() ? 2 : 1
+      this.log("peq: stat cached")
+      next.call(this, exists, exists === 2)
+    } else {
+      this.log("peq: _stat, then next")
+      this._stat(m, next)
+    }
+
+    function next(exists, isDir) {
+      this.log("next", m, exists, isDir)
+      var ev = m === this.EOF ? "end" : "match"
+
+      // "end" can only happen once.
+      assert(!this._endEmitted)
+      if (ev === "end")
+        this._endEmitted = true
+
+      if (exists) {
+        // Doesn't mean it necessarily doesn't exist, it's possible
+        // we just didn't check because we don't care that much, or
+        // this is EOF anyway.
+        if (isDir && !m.match(/\/$/)) {
+          m = m + "/"
+        } else if (!isDir && m.match(/\/$/)) {
+          m = m.replace(/\/+$/, "")
+        }
+      }
+      this.log("emit", ev, m)
+      this.emit(ev, m)
+      this._processingEmitQueue = false
+      if (done && m !== this.EOF && !this.paused)
+        this._processEmitQueue()
+    }
+  }
+  done = true
 }
 
@@ -316,7 +391,15 @@
         // nothing more to do, either way.
         if (exists) {
-          if (prefix.charAt(0) === "/" && !this.nomount) {
-            prefix = path.join(this.root, prefix)
+          if (prefix && isAbsolute(prefix) && !this.nomount) {
+            if (prefix.charAt(0) === "/") {
+              prefix = path.join(this.root, prefix)
+            } else {
+              prefix = path.resolve(this.root, prefix)
+            }
           }
+
+          if (process.platform === "win32")
+            prefix = prefix.replace(/\\/g, "/")
+
           this.matches[index] = this.matches[index] || {}
           this.matches[index][prefix] = true
@@ -345,10 +428,20 @@
   var read
   if (prefix === null) read = "."
-  else if (isAbsolute(prefix)) {
-    read = prefix = path.resolve("/", prefix)
-    if (this.debug) console.error('absolute: ', prefix, this.root, pattern)
-  } else read = prefix
-
-  if (this.debug) console.error('readdir(%j)', read, this.cwd, this.root)
+  else if (isAbsolute(prefix) || isAbsolute(pattern.join("/"))) {
+    if (!prefix || !isAbsolute(prefix)) {
+      prefix = path.join("/", prefix)
+    }
+    read = prefix = path.resolve(prefix)
+
+    // if (process.platform === "win32")
+    //   read = prefix = prefix.replace(/^[a-zA-Z]:|\\/g, "/")
+
+    this.log('absolute: ', prefix, this.root, pattern, read)
+  } else {
+    read = prefix
+  }
+
+  this.log('readdir(%j)', read, this.cwd, this.root)
+
   return this._readdir(read, function (er, entries) {
     if (er) {
@@ -371,4 +464,14 @@
       }, this)
 
+      s = s.filter(function (pattern) {
+        var key = gsKey(pattern)
+        var seen = !this._globstars[key]
+        this._globstars[key] = true
+        return seen
+      }, this)
+
+      if (!s.length)
+        return cb()
+
       // now asyncForEach over this
       var l = s.length
@@ -389,17 +492,11 @@
     // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
     var pn = pattern[n]
-    if (typeof pn === "string") {
-      var found = entries.indexOf(pn) !== -1
-      entries = found ? entries[pn] : []
-    } else {
-      var rawGlob = pattern[n]._glob
-      , dotOk = this.dot || rawGlob.charAt(0) === "."
-
-      entries = entries.filter(function (e) {
-        return (e.charAt(0) !== "." || dotOk) &&
-               (typeof pattern[n] === "string" && e === pattern[n] ||
-                e.match(pattern[n]))
-      })
-    }
+    var rawGlob = pattern[n]._glob
+    , dotOk = this.dot || rawGlob.charAt(0) === "."
+
+    entries = entries.filter(function (e) {
+      return (e.charAt(0) !== "." || dotOk) &&
+             e.match(pattern[n])
+    })
 
     // If n === pattern.length - 1, then there's no need for the extra stat
@@ -418,4 +515,7 @@
         }
 
+        if (process.platform === "win32")
+          e = e.replace(/\\/g, "/")
+
         this.matches[index] = this.matches[index] || {}
         this.matches[index][e] = true
@@ -443,4 +543,10 @@
 }
 
+function gsKey (pattern) {
+  return '**' + pattern.map(function (p) {
+    return (p === minimatch.GLOBSTAR) ? '**' : (''+p)
+  }).join('/')
+}
+
 Glob.prototype._stat = function (f, cb) {
   assert(this instanceof Glob)
@@ -451,5 +557,5 @@
     abs = path.resolve(this.cwd, f)
   }
-  if (this.debug) console.error('stat', [this.cwd, f, '=', abs])
+
   if (f.length > this.maxLength) {
     var er = new Error("Path name too long")
@@ -459,6 +565,8 @@
   }
 
-  if (this.statCache.hasOwnProperty(f)) {
-    var exists = this.statCache[f]
+  this.log('stat', [this.cwd, f, '=', abs])
+
+  if (!this.stat && this.cache.hasOwnProperty(f)) {
+    var exists = this.cache[f]
     , isDir = exists && (Array.isArray(exists) || exists === 2)
     if (this.sync) return cb.call(this, !!exists, isDir)
@@ -466,6 +574,7 @@
   }
 
-  if (this.sync) {
-    var er, stat
+  var stat = this.statCache[abs]
+  if (this.sync || stat) {
+    var er
     try {
       stat = fs.statSync(abs)
@@ -482,10 +591,25 @@
   var exists
   assert(this instanceof Glob)
+
+  if (abs.slice(-1) === "/" && stat && !stat.isDirectory()) {
+    this.log("should be ENOTDIR, fake it")
+
+    er = new Error("ENOTDIR, not a directory '" + abs + "'")
+    er.path = abs
+    er.code = "ENOTDIR"
+    stat = null
+  }
+
+  var emit = !this.statCache[abs]
+  this.statCache[abs] = stat
+
   if (er || !stat) {
     exists = false
   } else {
     exists = stat.isDirectory() ? 2 : 1
-  }
-  this.statCache[f] = this.statCache[f] || exists
+    if (emit)
+      this.emit('stat', f, stat)
+  }
+  this.cache[f] = this.cache[f] || exists
   cb.call(this, !!exists, exists === 2)
 }
@@ -502,5 +626,4 @@
   }
 
-  if (this.debug) console.error('readdir', [this.cwd, f, abs])
   if (f.length > this.maxLength) {
     var er = new Error("Path name too long")
@@ -510,6 +633,7 @@
   }
 
-  if (this.statCache.hasOwnProperty(f)) {
-    var c = this.statCache[f]
+  this.log('readdir', [this.cwd, f, abs])
+  if (this.cache.hasOwnProperty(f)) {
+    var c = this.cache[f]
     if (Array.isArray(c)) {
       if (this.sync) return cb.call(this, null, c)
@@ -523,5 +647,5 @@
       er.path = f
       er.code = code
-      if (this.debug) console.error(f, er)
+      this.log(f, er)
       if (this.sync) return cb.call(this, er)
       return process.nextTick(cb.bind(this, er))
@@ -549,5 +673,5 @@
   assert(this instanceof Glob)
   if (entries && !er) {
-    this.statCache[f] = entries
+    this.cache[f] = entries
     // if we haven't asked to stat everything for suresies, then just
     // assume that everything in there exists, so we can avoid
@@ -558,5 +682,5 @@
         if (f === "/") e = f + e
         else e = f + "/" + e
-        this.statCache[e] = true
+        this.cache[e] = true
       }, this)
     }
@@ -568,5 +692,5 @@
   if (er) switch (er.code) {
     case "ENOTDIR": // totally normal. means it *does* exist.
-      this.statCache[f] = 1
+      this.cache[f] = 1
       return cb.call(this, er)
     case "ENOENT": // not terribly unusual
@@ -574,8 +698,8 @@
     case "ENAMETOOLONG":
     case "UNKNOWN":
-      this.statCache[f] = false
+      this.cache[f] = false
       return cb.call(this, er)
     default: // some unusual error.  Treat as failure.
-      this.statCache[f] = false
+      this.cache[f] = false
       if (this.strict) this.emit("error", er)
       if (!this.silent) console.error("glob error", er)
@@ -591,5 +715,5 @@
   // from node's lib/path.js
   var splitDeviceRe =
-        /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?([\\\/])?/
+      /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/
     , result = splitDeviceRe.exec(p)
     , device = result[1] || ''
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/inherits/LICENSE
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/inherits/LICENSE	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/inherits/LICENSE	(revision 516)
@@ -0,0 +1,16 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/inherits/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/inherits/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/inherits/README.md	(revision 516)
@@ -1,51 +1,42 @@
-A dead simple way to do inheritance in JS.
+Browser-friendly inheritance fully compatible with standard node.js
+[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).
 
-    var inherits = require("inherits")
+This package exports standard `inherits` from node.js `util` module in
+node environment, but also provides alternative browser-friendly
+implementation through [browser
+field](https://gist.github.com/shtylman/4339901). Alternative
+implementation is a literal copy of standard one located in standalone
+module to avoid requiring of `util`. It also has a shim for old
+browsers with no `Object.create` support.
 
-    function Animal () {
-      this.alive = true
-    }
-    Animal.prototype.say = function (what) {
-      console.log(what)
-    }
+While keeping you sure you are using standard `inherits`
+implementation in node.js environment, it allows bundlers such as
+[browserify](https://github.com/substack/node-browserify) to not
+include full `util` package to your client code if all you need is
+just `inherits` function. It worth, because browser shim for `util`
+package is large and `inherits` is often the single function you need
+from it.
 
-    inherits(Dog, Animal)
-    function Dog () {
-      Dog.super.apply(this)
-    }
-    Dog.prototype.sniff = function () {
-      this.say("sniff sniff")
-    }
-    Dog.prototype.bark = function () {
-      this.say("woof woof")
-    }
+It's recommended to use this package instead of
+`require('util').inherits` for any code that has chances to be used
+not only in node.js but in browser too.
 
-    inherits(Chihuahua, Dog)
-    function Chihuahua () {
-      Chihuahua.super.apply(this)
-    }
-    Chihuahua.prototype.bark = function () {
-      this.say("yip yip")
-    }
+## usage
 
-    // also works
-    function Cat () {
-      Cat.super.apply(this)
-    }
-    Cat.prototype.hiss = function () {
-      this.say("CHSKKSS!!")
-    }
-    inherits(Cat, Animal, {
-      meow: function () { this.say("miao miao") }
-    })
-    Cat.prototype.purr = function () {
-      this.say("purr purr")
-    }
+```js
+var inherits = require('inherits');
+// then use exactly as the standard one
+```
 
+## note on version ~1.0
 
-    var c = new Chihuahua
-    assert(c instanceof Chihuahua)
-    assert(c instanceof Dog)
-    assert(c instanceof Animal)
+Version ~1.0 had completely different motivation and is not compatible
+neither with 2.0 nor with standard node.js `inherits`.
 
-The actual function is laughably small.  10-lines small.
+If you are using version ~1.0 and planning to switch to ~2.0, be
+careful:
+
+* new version uses `super_` instead of `super` for referencing
+  superclass
+* new version overwrites current prototype while old one preserves any
+  existing fields on it
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/inherits/inherits.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/inherits/inherits.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/inherits/inherits.js	(revision 516)
@@ -1,29 +1,1 @@
-module.exports = inherits
-
-function inherits (c, p, proto) {
-  proto = proto || {}
-  var e = {}
-  ;[c.prototype, proto].forEach(function (s) {
-    Object.getOwnPropertyNames(s).forEach(function (k) {
-      e[k] = Object.getOwnPropertyDescriptor(s, k)
-    })
-  })
-  c.prototype = Object.create(p.prototype, e)
-  c.super = p
-}
-
-//function Child () {
-//  Child.super.call(this)
-//  console.error([this
-//                ,this.constructor
-//                ,this.constructor === Child
-//                ,this.constructor.super === Parent
-//                ,Object.getPrototypeOf(this) === Child.prototype
-//                ,Object.getPrototypeOf(Object.getPrototypeOf(this))
-//                 === Parent.prototype
-//                ,this instanceof Child
-//                ,this instanceof Parent])
-//}
-//function Parent () {}
-//inherits(Child, Parent)
-//new Child
+module.exports = require('util').inherits
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/inherits/inherits_browser.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/inherits/inherits_browser.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/inherits/inherits_browser.js	(revision 516)
@@ -0,0 +1,23 @@
+if (typeof Object.create === 'function') {
+  // implementation from standard node.js 'util' module
+  module.exports = function inherits(ctor, superCtor) {
+    ctor.super_ = superCtor
+    ctor.prototype = Object.create(superCtor.prototype, {
+      constructor: {
+        value: ctor,
+        enumerable: false,
+        writable: true,
+        configurable: true
+      }
+    });
+  };
+} else {
+  // old school shim for old browsers
+  module.exports = function inherits(ctor, superCtor) {
+    ctor.super_ = superCtor
+    var TempCtor = function () {}
+    TempCtor.prototype = superCtor.prototype
+    ctor.prototype = new TempCtor()
+    ctor.prototype.constructor = ctor
+  }
+}
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/inherits/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/inherits/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/inherits/package.json	(revision 516)
@@ -1,6 +1,6 @@
 {
   "name": "inherits",
-  "description": "A tiny simple way to do classic inheritance in js",
-  "version": "1.0.0",
+  "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()",
+  "version": "2.0.1",
   "keywords": [
     "inheritance",
@@ -8,17 +8,20 @@
     "klass",
     "oop",
-    "object-oriented"
+    "object-oriented",
+    "inherits",
+    "browser",
+    "browserify"
   ],
   "main": "./inherits.js",
+  "browser": "./inherits_browser.js",
   "repository": {
     "type": "git",
-    "url": "https://github.com/isaacs/inherits"
+    "url": "git://github.com/isaacs/inherits"
   },
-  "author": {
-    "name": "Isaac Z. Schlueter",
-    "email": "i@izs.me",
-    "url": "http://blog.izs.me/"
+  "license": "ISC",
+  "scripts": {
+    "test": "node test"
   },
-  "readme": "A dead simple way to do inheritance in JS.\n\n    var inherits = require(\"inherits\")\n\n    function Animal () {\n      this.alive = true\n    }\n    Animal.prototype.say = function (what) {\n      console.log(what)\n    }\n\n    inherits(Dog, Animal)\n    function Dog () {\n      Dog.super.apply(this)\n    }\n    Dog.prototype.sniff = function () {\n      this.say(\"sniff sniff\")\n    }\n    Dog.prototype.bark = function () {\n      this.say(\"woof woof\")\n    }\n\n    inherits(Chihuahua, Dog)\n    function Chihuahua () {\n      Chihuahua.super.apply(this)\n    }\n    Chihuahua.prototype.bark = function () {\n      this.say(\"yip yip\")\n    }\n\n    // also works\n    function Cat () {\n      Cat.super.apply(this)\n    }\n    Cat.prototype.hiss = function () {\n      this.say(\"CHSKKSS!!\")\n    }\n    inherits(Cat, Animal, {\n      meow: function () { this.say(\"miao miao\") }\n    })\n    Cat.prototype.purr = function () {\n      this.say(\"purr purr\")\n    }\n\n\n    var c = new Chihuahua\n    assert(c instanceof Chihuahua)\n    assert(c instanceof Dog)\n    assert(c instanceof Animal)\n\nThe actual function is laughably small.  10-lines small.\n",
+  "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n  superclass\n* new version overwrites current prototype while old one preserves any\n  existing fields on it\n",
   "readmeFilename": "README.md",
   "bugs": {
@@ -26,9 +29,5 @@
   },
   "homepage": "https://github.com/isaacs/inherits",
-  "_id": "inherits@1.0.0",
-  "dist": {
-    "shasum": "26467026b3b86de1c6f72f00d9a31b1c97077a92"
-  },
-  "_from": "inherits@1",
-  "_resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz"
+  "_id": "inherits@2.0.1",
+  "_from": "inherits@2"
 }
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/inherits/test.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/inherits/test.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/inherits/test.js	(revision 516)
@@ -0,0 +1,25 @@
+var inherits = require('./inherits.js')
+var assert = require('assert')
+
+function test(c) {
+  assert(c.constructor === Child)
+  assert(c.constructor.super_ === Parent)
+  assert(Object.getPrototypeOf(c) === Child.prototype)
+  assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype)
+  assert(c instanceof Child)
+  assert(c instanceof Parent)
+}
+
+function Child() {
+  Parent.call(this)
+  test(this)
+}
+
+function Parent() {}
+
+inherits(Child, Parent)
+
+var c = new Child
+test(c)
+
+console.log('ok')
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/.npmignore
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/.npmignore	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/.npmignore	(revision 516)
@@ -0,0 +1,1 @@
+node_modules
Index: v/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/.travis.yml
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/.travis.yml	(revision 515)
+++ 	(revision )
@@ -1,4 +1,0 @@
-language: node_js
-node_js:
-  - 0.4
-  - 0.6
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/README.md	(revision 516)
@@ -20,4 +20,5 @@
 minimatch("bar.foo", "*.foo") // true!
 minimatch("bar.foo", "*.bar") // false!
+minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy!
 ```
 
@@ -36,42 +37,4 @@
 * `man 3 fnmatch`
 * `man 5 gitignore`
-
-### Comparisons to other fnmatch/glob implementations
-
-While strict compliance with the existing standards is a worthwhile
-goal, some discrepancies exist between minimatch and other
-implementations, and are intentional.
-
-If the pattern starts with a `!` character, then it is negated.  Set the
-`nonegate` flag to suppress this behavior, and treat leading `!`
-characters normally.  This is perhaps relevant if you wish to start the
-pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
-characters at the start of a pattern will negate the pattern multiple
-times.
-
-If a pattern starts with `#`, then it is treated as a comment, and
-will not match anything.  Use `\#` to match a literal `#` at the
-start of a line, or set the `nocomment` flag to suppress this behavior.
-
-The double-star character `**` is supported by default, unless the
-`noglobstar` flag is set.  This is supported in the manner of bsdglob
-and bash 4.1, where `**` only has special significance if it is the only
-thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
-`a/**b` will not.  **Note that this is different from the way that `**` is
-handled by ruby's `Dir` class.**
-
-If an escaped pattern has no matches, and the `nonull` flag is set,
-then minimatch.match returns the pattern as-provided, rather than
-interpreting the character escapes.  For example,
-`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
-`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
-that it does not resolve escaped pattern characters.
-
-If brace expansion is not disabled, then it is performed before any
-other interpretation of the glob pattern.  Thus, a pattern like
-`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
-**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
-checked for validity.  Since those two are valid, matching proceeds.
-
 
 ## Minimatch Class
@@ -217,2 +180,39 @@
 Returns from negate expressions the same as if they were not negated.
 (Ie, true on a hit, false on a miss.)
+
+
+## Comparisons to other fnmatch/glob implementations
+
+While strict compliance with the existing standards is a worthwhile
+goal, some discrepancies exist between minimatch and other
+implementations, and are intentional.
+
+If the pattern starts with a `!` character, then it is negated.  Set the
+`nonegate` flag to suppress this behavior, and treat leading `!`
+characters normally.  This is perhaps relevant if you wish to start the
+pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
+characters at the start of a pattern will negate the pattern multiple
+times.
+
+If a pattern starts with `#`, then it is treated as a comment, and
+will not match anything.  Use `\#` to match a literal `#` at the
+start of a line, or set the `nocomment` flag to suppress this behavior.
+
+The double-star character `**` is supported by default, unless the
+`noglobstar` flag is set.  This is supported in the manner of bsdglob
+and bash 4.1, where `**` only has special significance if it is the only
+thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
+`a/**b` will not.
+
+If an escaped pattern has no matches, and the `nonull` flag is set,
+then minimatch.match returns the pattern as-provided, rather than
+interpreting the character escapes.  For example,
+`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
+`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
+that it does not resolve escaped pattern characters.
+
+If brace expansion is not disabled, then it is performed before any
+other interpretation of the glob pattern.  Thus, a pattern like
+`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
+**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
+checked for validity.  Since those two are valid, matching proceeds.
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/minimatch.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/minimatch.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/minimatch.js	(revision 516)
@@ -69,15 +69,4 @@
 var slashSplit = /\/+/
 
-minimatch.monkeyPatch = monkeyPatch
-function monkeyPatch () {
-  var desc = Object.getOwnPropertyDescriptor(String.prototype, "match")
-  var orig = desc.value
-  desc.value = function (p) {
-    if (p instanceof Minimatch) return p.match(this)
-    return orig.call(this, p)
-  }
-  Object.defineProperty(String.prototype, desc)
-}
-
 minimatch.filter = filter
 function filter (pattern, options) {
@@ -179,4 +168,6 @@
 }
 
+Minimatch.prototype.debug = function() {}
+
 Minimatch.prototype.make = make
 function make () {
@@ -203,5 +194,7 @@
   var set = this.globSet = this.braceExpand()
 
-  if (options.debug) console.error(this.pattern, set)
+  if (options.debug) this.debug = console.error
+
+  this.debug(this.pattern, set)
 
   // step 3: now we have a set, so turn each one into a series of path-portion
@@ -214,5 +207,5 @@
   })
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   // glob --> regexps
@@ -221,5 +214,5 @@
   }, this)
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   // filter out everything that didn't compile properly.
@@ -228,5 +221,5 @@
   })
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   this.set = set
@@ -303,9 +296,9 @@
   // and then prepend it to everything we find.
   if (pattern.charAt(0) !== "{") {
-    // console.error(pattern)
+    this.debug(pattern)
     var prefix = null
     for (var i = 0, l = pattern.length; i < l; i ++) {
       var c = pattern.charAt(i)
-      // console.error(i, c)
+      this.debug(i, c)
       if (c === "\\") {
         escaping = !escaping
@@ -318,9 +311,9 @@
     // actually no sets, all { were escaped.
     if (prefix === null) {
-      // console.error("no sets")
+      this.debug("no sets")
       return [pattern]
     }
 
-    var tail = braceExpand(pattern.substr(i), options)
+   var tail = braceExpand.call(this, pattern.substr(i), options)
     return tail.map(function (t) {
       return prefix + t
@@ -337,6 +330,6 @@
   var numset = pattern.match(/^\{(-?[0-9]+)\.\.(-?[0-9]+)\}/)
   if (numset) {
-    // console.error("numset", numset[1], numset[2])
-    var suf = braceExpand(pattern.substr(numset[0].length), options)
+    this.debug("numset", numset[1], numset[2])
+    var suf = braceExpand.call(this, pattern.substr(numset[0].length), options)
       , start = +numset[1]
       , end = +numset[2]
@@ -370,8 +363,8 @@
   }
 
-  // console.error("Entering for")
+  this.debug("Entering for")
   FOR: for (i = 1, l = pattern.length; i < l; i ++) {
     var c = pattern.charAt(i)
-    // console.error("", i, c)
+    this.debug("", i, c)
 
     if (escaping) {
@@ -421,20 +414,20 @@
   // and need to escape the leading brace
   if (depth !== 0) {
-    // console.error("didn't close", pattern)
-    return braceExpand("\\" + pattern, options)
+    this.debug("didn't close", pattern)
+    return braceExpand.call(this, "\\" + pattern, options)
   }
 
   // x{y,z} -> ["xy", "xz"]
-  // console.error("set", set)
-  // console.error("suffix", pattern.substr(i))
-  var suf = braceExpand(pattern.substr(i), options)
+  this.debug("set", set)
+  this.debug("suffix", pattern.substr(i))
+  var suf = braceExpand.call(this, pattern.substr(i), options)
   // ["b", "c{d,e}","{f,g}h"] ->
   //   [["b"], ["cd", "ce"], ["fh", "gh"]]
   var addBraces = set.length === 1
-  // console.error("set pre-expanded", set)
+  this.debug("set pre-expanded", set)
   set = set.map(function (p) {
-    return braceExpand(p, options)
-  })
-  // console.error("set expanded", set)
+    return braceExpand.call(this, p, options)
+  }, this)
+  this.debug("set expanded", set)
 
 
@@ -482,5 +475,5 @@
 
   var re = ""
-    , hasMagic = false
+    , hasMagic = !!options.nocase
     , escaping = false
     // ? => one single character
@@ -497,4 +490,5 @@
       : options.dot ? "(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))"
       : "(?!\\.)"
+    , self = this
 
   function clearStateChar () {
@@ -515,4 +509,5 @@
           break
       }
+      self.debug('clearStateChar %j %j', stateChar, re)
       stateChar = false
     }
@@ -523,7 +518,5 @@
       ; i ++ ) {
 
-    if (options.debug) {
-      console.error("%s\t%s %s %j", pattern, i, re, c)
-    }
+    this.debug("%s\t%s %s %j", pattern, i, re, c)
 
     // skip over any that are escaped.
@@ -552,11 +545,10 @@
       case "@":
       case "!":
-        if (options.debug) {
-          console.error("%s\t%s %s %j <-- stateChar", pattern, i, re, c)
-        }
+        this.debug("%s\t%s %s %j <-- stateChar", pattern, i, re, c)
 
         // all of those are literals inside a class, except that
         // the glob [!a] means [^a] in regexp
         if (inClass) {
+          this.debug('  in class')
           if (c === "!" && i === classStart + 1) c = "^"
           re += c
@@ -567,4 +559,5 @@
         // that there was something like ** or +? in there.
         // Handle the stateChar, then proceed with this one.
+        self.debug('call clearStateChar %j', stateChar)
         clearStateChar()
         stateChar = c
@@ -592,4 +585,5 @@
         // negation is (?:(?!js)[^/]*)
         re += stateChar === "!" ? "(?:(?!" : "(?:"
+        this.debug('plType %j %j', stateChar, re)
         stateChar = false
         continue
@@ -601,4 +595,5 @@
         }
 
+        clearStateChar()
         hasMagic = true
         re += ")"
@@ -624,4 +619,5 @@
         }
 
+        clearStateChar()
         re += "|"
         continue
@@ -716,5 +712,5 @@
     })
 
-    // console.error("tail=%j\n   %s", tail, tail)
+    this.debug("tail=%j\n   %s", tail, tail)
     var t = pl.type === "*" ? star
           : pl.type === "?" ? qmark
@@ -805,5 +801,5 @@
   // must match entire pattern
   // ending in a * or ** will make it less strict.
-  re = "^" + re + "$"
+  re = "^(?:" + re + ")$"
 
   // can match anything, as long as it's not this.
@@ -830,5 +826,5 @@
 Minimatch.prototype.match = match
 function match (f, partial) {
-  // console.error("match", f, this.pattern)
+  this.debug("match", f, this.pattern)
   // short-circuit in the case of busted things.
   // comments, etc.
@@ -848,7 +844,5 @@
   // treat the test path as a set of pathparts.
   f = f.split(slashSplit)
-  if (options.debug) {
-    console.error(this.pattern, "split", f)
-  }
+  this.debug(this.pattern, "split", f)
 
   // just ONE of the pattern sets in this.set needs to match
@@ -858,9 +852,14 @@
 
   var set = this.set
-  // console.error(this.pattern, "set", set)
+  this.debug(this.pattern, "set", set)
+
+  var splitFile = path.basename(f.join("/")).split("/")
 
   for (var i = 0, l = set.length; i < l; i ++) {
-    var pattern = set[i]
-    var hit = this.matchOne(f, pattern, partial)
+    var pattern = set[i], file = f
+    if (options.matchBase && pattern.length === 1) {
+      file = splitFile
+    }
+    var hit = this.matchOne(file, pattern, partial)
     if (hit) {
       if (options.flipNegate) return true
@@ -883,18 +882,10 @@
   var options = this.options
 
-  if (options.debug) {
-    console.error("matchOne",
-                  { "this": this
-                  , file: file
-                  , pattern: pattern })
-  }
-
-  if (options.matchBase && pattern.length === 1) {
-    file = path.basename(file.join("/")).split("/")
-  }
-
-  if (options.debug) {
-    console.error("matchOne", file.length, pattern.length)
-  }
+  this.debug("matchOne",
+              { "this": this
+              , file: file
+              , pattern: pattern })
+
+  this.debug("matchOne", file.length, pattern.length)
 
   for ( var fi = 0
@@ -905,13 +896,9 @@
       ; fi ++, pi ++ ) {
 
-    if (options.debug) {
-      console.error("matchOne loop")
-    }
+    this.debug("matchOne loop")
     var p = pattern[pi]
       , f = file[fi]
 
-    if (options.debug) {
-      console.error(pattern, p, f)
-    }
+    this.debug(pattern, p, f)
 
     // should be impossible.
@@ -920,6 +907,5 @@
 
     if (p === GLOBSTAR) {
-      if (options.debug)
-        console.error('GLOBSTAR', [pattern, p, f])
+      this.debug('GLOBSTAR', [pattern, p, f])
 
       // "**"
@@ -948,6 +934,5 @@
         , pr = pi + 1
       if (pr === pl) {
-        if (options.debug)
-          console.error('** at the end')
+        this.debug('** at the end')
         // a ** at the end will just swallow the rest.
         // We have found a match.
@@ -967,13 +952,10 @@
         var swallowee = file[fr]
 
-        if (options.debug) {
-          console.error('\nglobstar while',
-                        file, fr, pattern, pr, swallowee)
-        }
+        this.debug('\nglobstar while',
+                    file, fr, pattern, pr, swallowee)
 
         // XXX remove this slice.  Just pass the start index.
         if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
-          if (options.debug)
-            console.error('globstar found match!', fr, fl, swallowee)
+          this.debug('globstar found match!', fr, fl, swallowee)
           // found a match.
           return true
@@ -983,12 +965,10 @@
           if (swallowee === "." || swallowee === ".." ||
               (!options.dot && swallowee.charAt(0) === ".")) {
-            if (options.debug)
-              console.error("dot detected!", file, fr, pattern, pr)
+            this.debug("dot detected!", file, fr, pattern, pr)
             break WHILE
           }
 
           // ** swallows a segment, and continue.
-          if (options.debug)
-            console.error('globstar swallow a segment, and continue')
+          this.debug('globstar swallow a segment, and continue')
           fr ++
         }
@@ -999,5 +979,5 @@
       if (partial) {
         // ran out of file
-        // console.error("\n>>> no match, partial?", file, fr, pattern, pr)
+        this.debug("\n>>> no match, partial?", file, fr, pattern, pr)
         if (fr === fl) return true
       }
@@ -1015,12 +995,8 @@
         hit = f === p
       }
-      if (options.debug) {
-        console.error("string match", p, f, hit)
-      }
+      this.debug("string match", p, f, hit)
     } else {
       hit = f.match(p)
-      if (options.debug) {
-        console.error("pattern match", p, f, hit)
-      }
+      this.debug("pattern match", p, f, hit)
     }
 
Index: v/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/AUTHORS
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/AUTHORS	(revision 515)
+++ 	(revision )
@@ -1,8 +1,0 @@
-# Authors, sorted by whether or not they are me
-Isaac Z. Schlueter <i@izs.me>
-Carlos Brito Lage <carlos@carloslage.net>
-Marko Mikulicic <marko.mikulicic@isti.cnr.it>
-Trent Mick <trentm@gmail.com>
-Kevin O'Hara <kevinohara80@gmail.com>
-Marco Rogers <marco.rogers@gmail.com>
-Jesse Dailey <jesse.dailey@gmail.com>
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS	(revision 516)
@@ -0,0 +1,14 @@
+# Authors, sorted by whether or not they are me
+Isaac Z. Schlueter <i@izs.me>
+Brian Cottingham <spiffytech@gmail.com>
+Carlos Brito Lage <carlos@carloslage.net>
+Jesse Dailey <jesse.dailey@gmail.com>
+Kevin O'Hara <kevinohara80@gmail.com>
+Marco Rogers <marco.rogers@gmail.com>
+Mark Cavage <mcavage@gmail.com>
+Marko Mikulicic <marko.mikulicic@isti.cnr.it>
+Nathan Rajlich <nathan@tootallnate.net>
+Satheesh Natesan <snateshan@myspace-inc.com>
+Trent Mick <trentm@gmail.com>
+ashleybrener <ashley@starlogik.com>
+n4kz <n4kz@n4kz.com>
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md	(revision 516)
@@ -27,5 +27,6 @@
 ## Options
 
-* `max` The maximum number of items.  Not setting this is kind of
+* `max` The maximum size of the cache, checked by applying the length
+  function to all values in the cache.  Not setting this is kind of
   silly, since that's the whole purpose of this lib, but it defaults
   to `Infinity`.
@@ -45,2 +46,52 @@
   to immediately put it back in, you'll have to do that in a
   `nextTick` or `setTimeout` callback or it won't do anything.
+* `stale` By default, if you set a `maxAge`, it'll only actually pull
+  stale items out of the cache when you `get(key)`.  (That is, it's
+  not pre-emptively doing a `setTimeout` or anything.)  If you set
+  `stale:true`, it'll return the stale value before deleting it.  If
+  you don't set this, then it'll return `undefined` when you try to
+  get a stale entry, as if it had already been deleted.
+
+## API
+
+* `set(key, value)`
+* `get(key) => value`
+
+    Both of these will update the "recently used"-ness of the key.
+    They do what you think.
+
+* `peek(key)`
+
+    Returns the key value (or `undefined` if not found) without
+    updating the "recently used"-ness of the key.
+
+    (If you find yourself using this a lot, you *might* be using the
+    wrong sort of data structure, but there are some use cases where
+    it's handy.)
+
+* `del(key)`
+
+    Deletes a key out of the cache.
+
+* `reset()`
+
+    Clear the cache entirely, throwing away all values.
+
+* `has(key)`
+
+    Check if a key is in the cache, without updating the recent-ness
+    or deleting it for being stale.
+
+* `forEach(function(value,key,cache), [thisp])`
+
+    Just like `Array.prototype.forEach`.  Iterates over all the keys
+    in the cache, in order of recent-ness.  (Ie, more recently used
+    items are iterated over first.)
+
+* `keys()`
+
+    Return an array of the keys in the cache.
+
+* `values()`
+
+    Return an array of the values in the cache.
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js	(revision 516)
@@ -15,176 +15,237 @@
 
 function LRUCache (options) {
-  if (!(this instanceof LRUCache)) {
+  if (!(this instanceof LRUCache))
     return new LRUCache(options)
-  }
-
-  var max
-  if (typeof options === 'number') {
-    max = options
-    options = { max: max }
-  }
-  max = options.max
-
-  if (!options) options = {}
-
-  var lengthCalculator = options.length || naiveLength
-
-  if (typeof lengthCalculator !== "function") {
-    lengthCalculator = naiveLength
-  }
-  if (!max || !(typeof max === "number") || max <= 0 ) {
-    // a little bit silly.  maybe this should throw?
-    max = Infinity
-  }
-
-  var maxAge = options.maxAge || null
-
-  var dispose = options.dispose
-
-  var cache = Object.create(null) // hash of items by key
-    , lruList = Object.create(null) // list of items in order of use recency
-    , mru = 0 // most recently used
-    , length = 0 // number of items in the list
-    , itemCount = 0
-
-
-  // resize the cache when the max changes.
-  Object.defineProperty(this, "max",
-    { set : function (mL) {
-        if (!mL || !(typeof mL === "number") || mL <= 0 ) mL = Infinity
-        max = mL
-        // if it gets above double max, trim right away.
-        // otherwise, do it whenever it's convenient.
-        if (length > max) trim()
+
+  if (typeof options === 'number')
+    options = { max: options }
+
+  if (!options)
+    options = {}
+
+  this._max = options.max
+  // Kind of weird to have a default max of Infinity, but oh well.
+  if (!this._max || !(typeof this._max === "number") || this._max <= 0 )
+    this._max = Infinity
+
+  this._lengthCalculator = options.length || naiveLength
+  if (typeof this._lengthCalculator !== "function")
+    this._lengthCalculator = naiveLength
+
+  this._allowStale = options.stale || false
+  this._maxAge = options.maxAge || null
+  this._dispose = options.dispose
+  this.reset()
+}
+
+// resize the cache when the max changes.
+Object.defineProperty(LRUCache.prototype, "max",
+  { set : function (mL) {
+      if (!mL || !(typeof mL === "number") || mL <= 0 ) mL = Infinity
+      this._max = mL
+      if (this._length > this._max) trim(this)
+    }
+  , get : function () { return this._max }
+  , enumerable : true
+  })
+
+// resize the cache when the lengthCalculator changes.
+Object.defineProperty(LRUCache.prototype, "lengthCalculator",
+  { set : function (lC) {
+      if (typeof lC !== "function") {
+        this._lengthCalculator = naiveLength
+        this._length = this._itemCount
+        for (var key in this._cache) {
+          this._cache[key].length = 1
+        }
+      } else {
+        this._lengthCalculator = lC
+        this._length = 0
+        for (var key in this._cache) {
+          this._cache[key].length = this._lengthCalculator(this._cache[key].value)
+          this._length += this._cache[key].length
+        }
       }
-    , get : function () { return max }
-    , enumerable : true
-    })
-
-  // resize the cache when the lengthCalculator changes.
-  Object.defineProperty(this, "lengthCalculator",
-    { set : function (lC) {
-        if (typeof lC !== "function") {
-          lengthCalculator = naiveLength
-          length = itemCount
-          for (var key in cache) {
-            cache[key].length = 1
-          }
-        } else {
-          lengthCalculator = lC
-          length = 0
-          for (var key in cache) {
-            cache[key].length = lengthCalculator(cache[key].value)
-            length += cache[key].length
-          }
-        }
-
-        if (length > max) trim()
-      }
-    , get : function () { return lengthCalculator }
-    , enumerable : true
-    })
-
-  Object.defineProperty(this, "length",
-    { get : function () { return length }
-    , enumerable : true
-    })
-
-
-  Object.defineProperty(this, "itemCount",
-    { get : function () { return itemCount }
-    , enumerable : true
-    })
-
-  this.reset = function () {
-    if (dispose) {
-      for (var k in cache) {
-        dispose(k, cache[k].value)
-      }
-    }
-    cache = {}
-    lruList = {}
-    mru = 0
-    length = 0
-    itemCount = 0
-  }
-
-  // Provided for debugging/dev purposes only. No promises whatsoever that
-  // this API stays stable.
-  this.dump = function () {
-    return cache
-  }
-
-  this.set = function (key, value) {
-    if (hOP(cache, key)) {
-      // dispose of the old one before overwriting
-      if (dispose) dispose(key, cache[key].value)
-      if (maxAge) cache[key].now = Date.now()
-      cache[key].value = value
-      this.get(key)
-      return true
-    }
-
-    var len = lengthCalculator(value)
-    var age = maxAge ? Date.now() : 0
-    var hit = new Entry(key, value, mru++, len, age)
-
-    // oversized objects fall out of cache automatically.
-    if (hit.length > max) {
-      if (dispose) dispose(key, value)
-      return false
-    }
-
-    length += hit.length
-    lruList[hit.lu] = cache[key] = hit
-    itemCount ++
-
-    if (length > max) trim()
+
+      if (this._length > this._max) trim(this)
+    }
+  , get : function () { return this._lengthCalculator }
+  , enumerable : true
+  })
+
+Object.defineProperty(LRUCache.prototype, "length",
+  { get : function () { return this._length }
+  , enumerable : true
+  })
+
+
+Object.defineProperty(LRUCache.prototype, "itemCount",
+  { get : function () { return this._itemCount }
+  , enumerable : true
+  })
+
+LRUCache.prototype.forEach = function (fn, thisp) {
+  thisp = thisp || this
+  var i = 0;
+  for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) {
+    i++
+    var hit = this._lruList[k]
+    if (this._maxAge && (Date.now() - hit.now > this._maxAge)) {
+      del(this, hit)
+      if (!this._allowStale) hit = undefined
+    }
+    if (hit) {
+      fn.call(thisp, hit.value, hit.key, this)
+    }
+  }
+}
+
+LRUCache.prototype.keys = function () {
+  var keys = new Array(this._itemCount)
+  var i = 0
+  for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) {
+    var hit = this._lruList[k]
+    keys[i++] = hit.key
+  }
+  return keys
+}
+
+LRUCache.prototype.values = function () {
+  var values = new Array(this._itemCount)
+  var i = 0
+  for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) {
+    var hit = this._lruList[k]
+    values[i++] = hit.value
+  }
+  return values
+}
+
+LRUCache.prototype.reset = function () {
+  if (this._dispose && this._cache) {
+    for (var k in this._cache) {
+      this._dispose(k, this._cache[k].value)
+    }
+  }
+
+  this._cache = Object.create(null) // hash of items by key
+  this._lruList = Object.create(null) // list of items in order of use recency
+  this._mru = 0 // most recently used
+  this._lru = 0 // least recently used
+  this._length = 0 // number of items in the list
+  this._itemCount = 0
+}
+
+// Provided for debugging/dev purposes only. No promises whatsoever that
+// this API stays stable.
+LRUCache.prototype.dump = function () {
+  return this._cache
+}
+
+LRUCache.prototype.dumpLru = function () {
+  return this._lruList
+}
+
+LRUCache.prototype.set = function (key, value) {
+  if (hOP(this._cache, key)) {
+    // dispose of the old one before overwriting
+    if (this._dispose) this._dispose(key, this._cache[key].value)
+    if (this._maxAge) this._cache[key].now = Date.now()
+    this._cache[key].value = value
+    this.get(key)
     return true
   }
 
-  this.get = function (key) {
-    if (!hOP(cache, key)) return
-    var hit = cache[key]
-    if (maxAge && (Date.now() - hit.now > maxAge)) {
-      this.del(key)
-      return
-    }
-    delete lruList[hit.lu]
-    hit.lu = mru ++
-    lruList[hit.lu] = hit
-    return hit.value
-  }
-
-  this.del = function (key) {
-    if (!hOP(cache, key)) return
-    var hit = cache[key]
-    if (dispose) dispose(key, hit.value)
-    delete cache[key]
-    delete lruList[hit.lu]
-    length -= hit.length
-    itemCount --
-  }
-
-  function trim () {
-    if (length <= max) return
-    for (var k in lruList) {
-      if (length <= max) break;
-      var hit = lruList[k]
-      if (dispose) dispose(hit.key, hit.value)
-      length -= hit.length
-      delete cache[ hit.key ]
-      delete lruList[k]
-    }
+  var len = this._lengthCalculator(value)
+  var age = this._maxAge ? Date.now() : 0
+  var hit = new Entry(key, value, this._mru++, len, age)
+
+  // oversized objects fall out of cache automatically.
+  if (hit.length > this._max) {
+    if (this._dispose) this._dispose(key, value)
+    return false
+  }
+
+  this._length += hit.length
+  this._lruList[hit.lu] = this._cache[key] = hit
+  this._itemCount ++
+
+  if (this._length > this._max) trim(this)
+  return true
+}
+
+LRUCache.prototype.has = function (key) {
+  if (!hOP(this._cache, key)) return false
+  var hit = this._cache[key]
+  if (this._maxAge && (Date.now() - hit.now > this._maxAge)) {
+    return false
+  }
+  return true
+}
+
+LRUCache.prototype.get = function (key) {
+  return get(this, key, true)
+}
+
+LRUCache.prototype.peek = function (key) {
+  return get(this, key, false)
+}
+
+LRUCache.prototype.pop = function () {
+  var hit = this._lruList[this._lru]
+  del(this, hit)
+  return hit || null
+}
+
+LRUCache.prototype.del = function (key) {
+  del(this, this._cache[key])
+}
+
+function get (self, key, doUse) {
+  var hit = self._cache[key]
+  if (hit) {
+    if (self._maxAge && (Date.now() - hit.now > self._maxAge)) {
+      del(self, hit)
+      if (!self._allowStale) hit = undefined
+    } else {
+      if (doUse) use(self, hit)
+    }
+    if (hit) hit = hit.value
+  }
+  return hit
+}
+
+function use (self, hit) {
+  shiftLU(self, hit)
+  hit.lu = self._mru ++
+  self._lruList[hit.lu] = hit
+}
+
+function trim (self) {
+  while (self._lru < self._mru && self._length > self._max)
+    del(self, self._lruList[self._lru])
+}
+
+function shiftLU (self, hit) {
+  delete self._lruList[ hit.lu ]
+  while (self._lru < self._mru && !self._lruList[self._lru]) self._lru ++
+}
+
+function del (self, hit) {
+  if (hit) {
+    if (self._dispose) self._dispose(hit.key, hit.value)
+    self._length -= hit.length
+    self._itemCount --
+    delete self._cache[ hit.key ]
+    shiftLU(self, hit)
   }
 }
 
 // classy, since V8 prefers predictable objects.
-function Entry (key, value, mru, len, age) {
+function Entry (key, value, lu, length, now) {
   this.key = key
   this.value = value
-  this.lu = mru
-  this.length = len
-  this.now = age
+  this.lu = lu
+  this.length = length
+  this.now = now
 }
 
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json	(revision 516)
@@ -2,5 +2,5 @@
   "name": "lru-cache",
   "description": "A cache object that deletes the least-recently-used items.",
-  "version": "2.0.4",
+  "version": "2.5.0",
   "author": {
     "name": "Isaac Z. Schlueter",
@@ -8,5 +8,5 @@
   },
   "scripts": {
-    "test": "tap test"
+    "test": "tap test --gc"
   },
   "main": "lib/lru-cache.js",
@@ -16,5 +16,6 @@
   },
   "devDependencies": {
-    "tap": ""
+    "tap": "",
+    "weak": ""
   },
   "license": {
@@ -22,35 +23,5 @@
     "url": "http://github.com/isaacs/node-lru-cache/raw/master/LICENSE"
   },
-  "contributors": [
-    {
-      "name": "Isaac Z. Schlueter",
-      "email": "i@izs.me"
-    },
-    {
-      "name": "Carlos Brito Lage",
-      "email": "carlos@carloslage.net"
-    },
-    {
-      "name": "Marko Mikulicic",
-      "email": "marko.mikulicic@isti.cnr.it"
-    },
-    {
-      "name": "Trent Mick",
-      "email": "trentm@gmail.com"
-    },
-    {
-      "name": "Kevin O'Hara",
-      "email": "kevinohara80@gmail.com"
-    },
-    {
-      "name": "Marco Rogers",
-      "email": "marco.rogers@gmail.com"
-    },
-    {
-      "name": "Jesse Dailey",
-      "email": "jesse.dailey@gmail.com"
-    }
-  ],
-  "readme": "# lru cache\n\nA cache object that deletes the least-recently-used items.\n\n## Usage:\n\n```javascript\nvar LRU = require(\"lru-cache\")\n  , options = { max: 500\n              , length: function (n) { return n * 2 }\n              , dispose: function (key, n) { n.close() }\n              , maxAge: 1000 * 60 * 60 }\n  , cache = LRU(options)\n  , otherCache = LRU(50) // sets just the max size\n\ncache.set(\"key\", \"value\")\ncache.get(\"key\") // \"value\"\n\ncache.reset()    // empty the cache\n```\n\nIf you put more stuff in it, then items will fall out.\n\nIf you try to put an oversized thing in it, then it'll fall out right\naway.\n\n## Options\n\n* `max` The maximum number of items.  Not setting this is kind of\n  silly, since that's the whole purpose of this lib, but it defaults\n  to `Infinity`.\n* `maxAge` Maximum age in ms.  Items are not pro-actively pruned out\n  as they age, but if you try to get an item that is too old, it'll\n  drop it and return undefined instead of giving it to you.\n* `length` Function that is used to calculate the length of stored\n  items.  If you're storing strings or buffers, then you probably want\n  to do something like `function(n){return n.length}`.  The default is\n  `function(n){return 1}`, which is fine if you want to store `n`\n  like-sized things.\n* `dispose` Function that is called on items when they are dropped\n  from the cache.  This can be handy if you want to close file\n  descriptors or do other cleanup tasks when items are no longer\n  accessible.  Called with `key, value`.  It's called *before*\n  actually removing the item from the internal cache, so if you want\n  to immediately put it back in, you'll have to do that in a\n  `nextTick` or `setTimeout` callback or it won't do anything.\n",
+  "readme": "# lru cache\n\nA cache object that deletes the least-recently-used items.\n\n## Usage:\n\n```javascript\nvar LRU = require(\"lru-cache\")\n  , options = { max: 500\n              , length: function (n) { return n * 2 }\n              , dispose: function (key, n) { n.close() }\n              , maxAge: 1000 * 60 * 60 }\n  , cache = LRU(options)\n  , otherCache = LRU(50) // sets just the max size\n\ncache.set(\"key\", \"value\")\ncache.get(\"key\") // \"value\"\n\ncache.reset()    // empty the cache\n```\n\nIf you put more stuff in it, then items will fall out.\n\nIf you try to put an oversized thing in it, then it'll fall out right\naway.\n\n## Options\n\n* `max` The maximum size of the cache, checked by applying the length\n  function to all values in the cache.  Not setting this is kind of\n  silly, since that's the whole purpose of this lib, but it defaults\n  to `Infinity`.\n* `maxAge` Maximum age in ms.  Items are not pro-actively pruned out\n  as they age, but if you try to get an item that is too old, it'll\n  drop it and return undefined instead of giving it to you.\n* `length` Function that is used to calculate the length of stored\n  items.  If you're storing strings or buffers, then you probably want\n  to do something like `function(n){return n.length}`.  The default is\n  `function(n){return 1}`, which is fine if you want to store `n`\n  like-sized things.\n* `dispose` Function that is called on items when they are dropped\n  from the cache.  This can be handy if you want to close file\n  descriptors or do other cleanup tasks when items are no longer\n  accessible.  Called with `key, value`.  It's called *before*\n  actually removing the item from the internal cache, so if you want\n  to immediately put it back in, you'll have to do that in a\n  `nextTick` or `setTimeout` callback or it won't do anything.\n* `stale` By default, if you set a `maxAge`, it'll only actually pull\n  stale items out of the cache when you `get(key)`.  (That is, it's\n  not pre-emptively doing a `setTimeout` or anything.)  If you set\n  `stale:true`, it'll return the stale value before deleting it.  If\n  you don't set this, then it'll return `undefined` when you try to\n  get a stale entry, as if it had already been deleted.\n\n## API\n\n* `set(key, value)`\n* `get(key) => value`\n\n    Both of these will update the \"recently used\"-ness of the key.\n    They do what you think.\n\n* `peek(key)`\n\n    Returns the key value (or `undefined` if not found) without\n    updating the \"recently used\"-ness of the key.\n\n    (If you find yourself using this a lot, you *might* be using the\n    wrong sort of data structure, but there are some use cases where\n    it's handy.)\n\n* `del(key)`\n\n    Deletes a key out of the cache.\n\n* `reset()`\n\n    Clear the cache entirely, throwing away all values.\n\n* `has(key)`\n\n    Check if a key is in the cache, without updating the recent-ness\n    or deleting it for being stale.\n\n* `forEach(function(value,key,cache), [thisp])`\n\n    Just like `Array.prototype.forEach`.  Iterates over all the keys\n    in the cache, in order of recent-ness.  (Ie, more recently used\n    items are iterated over first.)\n\n* `keys()`\n\n    Return an array of the keys in the cache.\n\n* `values()`\n\n    Return an array of the values in the cache.\n",
   "readmeFilename": "README.md",
   "bugs": {
@@ -58,9 +29,5 @@
   },
   "homepage": "https://github.com/isaacs/node-lru-cache",
-  "_id": "lru-cache@2.0.4",
-  "dist": {
-    "shasum": "65a440a9ccba331dd1a4cabc937c22dba39bb105"
-  },
-  "_from": "lru-cache@2.0.4",
-  "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.0.4.tgz"
+  "_id": "lru-cache@2.5.0",
+  "_from": "lru-cache@2"
 }
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js	(revision 516)
@@ -266,2 +266,104 @@
   t.end()
 })
+
+test("has()", function(t) {
+  var cache = new LRU({
+    max: 1,
+    maxAge: 10
+  })
+
+  cache.set('foo', 'bar')
+  t.equal(cache.has('foo'), true)
+  cache.set('blu', 'baz')
+  t.equal(cache.has('foo'), false)
+  t.equal(cache.has('blu'), true)
+  setTimeout(function() {
+    t.equal(cache.has('blu'), false)
+    t.end()
+  }, 15)
+})
+
+test("stale", function(t) {
+  var cache = new LRU({
+    maxAge: 10,
+    stale: true
+  })
+
+  cache.set('foo', 'bar')
+  t.equal(cache.get('foo'), 'bar')
+  t.equal(cache.has('foo'), true)
+  setTimeout(function() {
+    t.equal(cache.has('foo'), false)
+    t.equal(cache.get('foo'), 'bar')
+    t.equal(cache.get('foo'), undefined)
+    t.end()
+  }, 15)
+})
+
+test("lru update via set", function(t) {
+  var cache = LRU({ max: 2 });
+
+  cache.set('foo', 1);
+  cache.set('bar', 2);
+  cache.del('bar');
+  cache.set('baz', 3);
+  cache.set('qux', 4);
+
+  t.equal(cache.get('foo'), undefined)
+  t.equal(cache.get('bar'), undefined)
+  t.equal(cache.get('baz'), 3)
+  t.equal(cache.get('qux'), 4)
+  t.end()
+})
+
+test("least recently set w/ peek", function (t) {
+  var cache = new LRU(2)
+  cache.set("a", "A")
+  cache.set("b", "B")
+  t.equal(cache.peek("a"), "A")
+  cache.set("c", "C")
+  t.equal(cache.get("c"), "C")
+  t.equal(cache.get("b"), "B")
+  t.equal(cache.get("a"), undefined)
+  t.end()
+})
+
+test("pop the least used item", function (t) {
+  var cache = new LRU(3)
+  , last
+
+  cache.set("a", "A")
+  cache.set("b", "B")
+  cache.set("c", "C")
+
+  t.equal(cache.length, 3)
+  t.equal(cache.max, 3)
+
+  // Ensure we pop a, c, b
+  cache.get("b", "B")
+
+  last = cache.pop()
+  t.equal(last.key, "a")
+  t.equal(last.value, "A")
+  t.equal(cache.length, 2)
+  t.equal(cache.max, 3)
+
+  last = cache.pop()
+  t.equal(last.key, "c")
+  t.equal(last.value, "C")
+  t.equal(cache.length, 1)
+  t.equal(cache.max, 3)
+
+  last = cache.pop()
+  t.equal(last.key, "b")
+  t.equal(last.value, "B")
+  t.equal(cache.length, 0)
+  t.equal(cache.max, 3)
+
+  last = cache.pop()
+  t.equal(last, null)
+  t.equal(cache.length, 0)
+  t.equal(cache.max, 3)
+
+  t.end()
+})
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js	(revision 516)
@@ -0,0 +1,52 @@
+var test = require('tap').test
+var LRU = require('../')
+
+test('forEach', function (t) {
+  var l = new LRU(5)
+  for (var i = 0; i < 10; i ++) {
+    l.set(i.toString(), i.toString(2))
+  }
+
+  var i = 9
+  l.forEach(function (val, key, cache) {
+    t.equal(cache, l)
+    t.equal(key, i.toString())
+    t.equal(val, i.toString(2))
+    i -= 1
+  })
+
+  // get in order of most recently used
+  l.get(6)
+  l.get(8)
+
+  var order = [ 8, 6, 9, 7, 5 ]
+  var i = 0
+
+  l.forEach(function (val, key, cache) {
+    var j = order[i ++]
+    t.equal(cache, l)
+    t.equal(key, j.toString())
+    t.equal(val, j.toString(2))
+  })
+
+  t.end()
+})
+
+test('keys() and values()', function (t) {
+  var l = new LRU(5)
+  for (var i = 0; i < 10; i ++) {
+    l.set(i.toString(), i.toString(2))
+  }
+
+  t.similar(l.keys(), ['9', '8', '7', '6', '5'])
+  t.similar(l.values(), ['1001', '1000', '111', '110', '101'])
+
+  // get in order of most recently used
+  l.get(6)
+  l.get(8)
+
+  t.similar(l.keys(), ['8', '6', '9', '7', '5'])
+  t.similar(l.values(), ['1000', '110', '1001', '111', '101'])
+
+  t.end()
+})
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js	(revision 516)
@@ -0,0 +1,50 @@
+#!/usr/bin/env node --expose_gc
+
+var weak = require('weak');
+var test = require('tap').test
+var LRU = require('../')
+var l = new LRU({ max: 10 })
+var refs = 0
+function X() {
+  refs ++
+  weak(this, deref)
+}
+
+function deref() {
+  refs --
+}
+
+test('no leaks', function (t) {
+  // fill up the cache
+  for (var i = 0; i < 100; i++) {
+    l.set(i, new X);
+    // throw some gets in there, too.
+    if (i % 2 === 0)
+      l.get(i / 2)
+  }
+
+  gc()
+
+  var start = process.memoryUsage()
+
+  // capture the memory
+  var startRefs = refs
+
+  // do it again, but more
+  for (var i = 0; i < 10000; i++) {
+    l.set(i, new X);
+    // throw some gets in there, too.
+    if (i % 2 === 0)
+      l.get(i / 2)
+  }
+
+  gc()
+
+  var end = process.memoryUsage()
+  t.equal(refs, startRefs, 'no leaky refs')
+
+  console.error('start: %j\n' +
+                'end:   %j', start, end);
+  t.pass();
+  t.end();
+})
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json	(revision 516)
@@ -39,8 +39,4 @@
   "homepage": "https://github.com/isaacs/sigmund",
   "_id": "sigmund@1.0.0",
-  "_from": "sigmund@1.0.0",
-  "dist": {
-    "shasum": "4d1a782fdcf140509fd8ea166574e0665819b881"
-  },
-  "_resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz"
+  "_from": "sigmund@~1.0.0"
 }
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/package.json	(revision 516)
@@ -7,5 +7,5 @@
   "name": "minimatch",
   "description": "a glob matcher in javascript",
-  "version": "0.2.9",
+  "version": "0.2.14",
   "repository": {
     "type": "git",
@@ -14,5 +14,5 @@
   "main": "minimatch.js",
   "scripts": {
-    "test": "tap test"
+    "test": "tap test/*.js"
   },
   "engines": {
@@ -20,5 +20,5 @@
   },
   "dependencies": {
-    "lru-cache": "~2.0.0",
+    "lru-cache": "2",
     "sigmund": "~1.0.0"
   },
@@ -30,5 +30,5 @@
     "url": "http://github.com/isaacs/minimatch/raw/master/LICENSE"
   },
-  "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n### Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated.  Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally.  This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything.  Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set.  This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.  **Note that this is different from the way that `**` is\nhandled by ruby's `Dir` class.**\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes.  For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`.  This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern.  Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity.  Since those two are valid, matching proceeds.\n\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n  Each row in the\n  array corresponds to a brace-expanded pattern.  Each item in the row\n  corresponds to a single path-part.  For example, the pattern\n  `{a,b/c}/d` would expand to a set of patterns like:\n\n        [ [ a, d ]\n        , [ b, c, d ] ]\n\n    If a portion of the pattern doesn't have any \"magic\" in it\n    (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n    will be left as a string rather than converted to a regular\n    expression.\n\n* `regexp` Created by the `makeRe` method.  A single regular expression\n  expressing the entire pattern.  This is useful in cases where you wish\n  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n  Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n  false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n  filename, and match it against a single row in the `regExpSet`.  This\n  method is mainly for internal use, but is exposed so that it can be\n  used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items.  So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export.  Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`.  Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob.  If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself.  When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes.  For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n",
+  "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\nminimatch(\"bar.foo\", \"*.+(bar|foo)\", { debug: true }) // true, and noisy!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n  Each row in the\n  array corresponds to a brace-expanded pattern.  Each item in the row\n  corresponds to a single path-part.  For example, the pattern\n  `{a,b/c}/d` would expand to a set of patterns like:\n\n        [ [ a, d ]\n        , [ b, c, d ] ]\n\n    If a portion of the pattern doesn't have any \"magic\" in it\n    (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n    will be left as a string rather than converted to a regular\n    expression.\n\n* `regexp` Created by the `makeRe` method.  A single regular expression\n  expressing the entire pattern.  This is useful in cases where you wish\n  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n  Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n  false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n  filename, and match it against a single row in the `regExpSet`.  This\n  method is mainly for internal use, but is exposed so that it can be\n  used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items.  So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export.  Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`.  Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob.  If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself.  When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes.  For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated.  Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally.  This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything.  Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set.  This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes.  For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`.  This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern.  Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity.  Since those two are valid, matching proceeds.\n",
   "readmeFilename": "README.md",
   "bugs": {
@@ -36,9 +36,5 @@
   },
   "homepage": "https://github.com/isaacs/minimatch",
-  "_id": "minimatch@0.2.9",
-  "dist": {
-    "shasum": "451806a2fb9fdc263b5a2d340bda92d62590b4f4"
-  },
-  "_from": "minimatch@0.2.9",
-  "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.9.tgz"
+  "_id": "minimatch@0.2.14",
+  "_from": "minimatch@~0.2.11"
 }
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/test/basic.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/test/basic.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/test/basic.js	(revision 516)
@@ -14,272 +14,374 @@
                         , ".x", ".y" ])
 
+
+var patterns =
+  [ "http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test"
+  , ["a*", ["a", "abc", "abd", "abe"]]
+  , ["X*", ["X*"], {nonull: true}]
+
+  // allow null glob expansion
+  , ["X*", []]
+
+  // isaacs: Slightly different than bash/sh/ksh
+  // \\* is not un-escaped to literal "*" in a failed match,
+  // but it does make it get treated as a literal star
+  , ["\\*", ["\\*"], {nonull: true}]
+  , ["\\**", ["\\**"], {nonull: true}]
+  , ["\\*\\*", ["\\*\\*"], {nonull: true}]
+
+  , ["b*/", ["bdir/"]]
+  , ["c*", ["c", "ca", "cb"]]
+  , ["**", files]
+
+  , ["\\.\\./*/", ["\\.\\./*/"], {nonull: true}]
+  , ["s/\\..*//", ["s/\\..*//"], {nonull: true}]
+
+  , "legendary larry crashes bashes"
+  , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"
+    , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"], {nonull: true}]
+  , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"
+    , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"], {nonull: true}]
+
+  , "character classes"
+  , ["[a-c]b*", ["abc", "abd", "abe", "bb", "cb"]]
+  , ["[a-y]*[^c]", ["abd", "abe", "bb", "bcd",
+     "bdir/", "ca", "cb", "dd", "de"]]
+  , ["a*[^c]", ["abd", "abe"]]
+  , function () { files.push("a-b", "aXb") }
+  , ["a[X-]b", ["a-b", "aXb"]]
+  , function () { files.push(".x", ".y") }
+  , ["[^a-c]*", ["d", "dd", "de"]]
+  , function () { files.push("a*b/", "a*b/ooo") }
+  , ["a\\*b/*", ["a*b/ooo"]]
+  , ["a\\*?/*", ["a*b/ooo"]]
+  , ["*\\\\!*", [], {null: true}, ["echo !7"]]
+  , ["*\\!*", ["echo !7"], null, ["echo !7"]]
+  , ["*.\\*", ["r.*"], null, ["r.*"]]
+  , ["a[b]c", ["abc"]]
+  , ["a[\\b]c", ["abc"]]
+  , ["a?c", ["abc"]]
+  , ["a\\*c", [], {null: true}, ["abc"]]
+  , ["", [""], { null: true }, [""]]
+
+  , "http://www.opensource.apple.com/source/bash/bash-23/" +
+    "bash/tests/glob-test"
+  , function () { files.push("man/", "man/man1/", "man/man1/bash.1") }
+  , ["*/man*/bash.*", ["man/man1/bash.1"]]
+  , ["man/man1/bash.1", ["man/man1/bash.1"]]
+  , ["a***c", ["abc"], null, ["abc"]]
+  , ["a*****?c", ["abc"], null, ["abc"]]
+  , ["?*****??", ["abc"], null, ["abc"]]
+  , ["*****??", ["abc"], null, ["abc"]]
+  , ["?*****?c", ["abc"], null, ["abc"]]
+  , ["?***?****c", ["abc"], null, ["abc"]]
+  , ["?***?****?", ["abc"], null, ["abc"]]
+  , ["?***?****", ["abc"], null, ["abc"]]
+  , ["*******c", ["abc"], null, ["abc"]]
+  , ["*******?", ["abc"], null, ["abc"]]
+  , ["a*cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]]
+  , ["a**?**cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]]
+  , ["a**?**cd**?**??k***", ["abcdecdhjk"], null, ["abcdecdhjk"]]
+  , ["a**?**cd**?**??***k", ["abcdecdhjk"], null, ["abcdecdhjk"]]
+  , ["a**?**cd**?**??***k**", ["abcdecdhjk"], null, ["abcdecdhjk"]]
+  , ["a****c**?**??*****", ["abcdecdhjk"], null, ["abcdecdhjk"]]
+  , ["[-abc]", ["-"], null, ["-"]]
+  , ["[abc-]", ["-"], null, ["-"]]
+  , ["\\", ["\\"], null, ["\\"]]
+  , ["[\\\\]", ["\\"], null, ["\\"]]
+  , ["[[]", ["["], null, ["["]]
+  , ["[", ["["], null, ["["]]
+  , ["[*", ["[abc"], null, ["[abc"]]
+  , "a right bracket shall lose its special meaning and\n" +
+    "represent itself in a bracket expression if it occurs\n" +
+    "first in the list.  -- POSIX.2 2.8.3.2"
+  , ["[]]", ["]"], null, ["]"]]
+  , ["[]-]", ["]"], null, ["]"]]
+  , ["[a-\z]", ["p"], null, ["p"]]
+  , ["??**********?****?", [], { null: true }, ["abc"]]
+  , ["??**********?****c", [], { null: true }, ["abc"]]
+  , ["?************c****?****", [], { null: true }, ["abc"]]
+  , ["*c*?**", [], { null: true }, ["abc"]]
+  , ["a*****c*?**", [], { null: true }, ["abc"]]
+  , ["a********???*******", [], { null: true }, ["abc"]]
+  , ["[]", [], { null: true }, ["a"]]
+  , ["[abc", [], { null: true }, ["["]]
+
+  , "nocase tests"
+  , ["XYZ", ["xYz"], { nocase: true, null: true }
+    , ["xYz", "ABC", "IjK"]]
+  , ["ab*", ["ABC"], { nocase: true, null: true }
+    , ["xYz", "ABC", "IjK"]]
+  , ["[ia]?[ck]", ["ABC", "IjK"], { nocase: true, null: true }
+    , ["xYz", "ABC", "IjK"]]
+
+  // [ pattern, [matches], MM opts, files, TAP opts]
+  , "onestar/twostar"
+  , ["{/*,*}", [], {null: true}, ["/asdf/asdf/asdf"]]
+  , ["{/?,*}", ["/a", "bb"], {null: true}
+    , ["/a", "/b/b", "/a/b/c", "bb"]]
+
+  , "dots should not match unless requested"
+  , ["**", ["a/b"], {}, ["a/b", "a/.d", ".a/.d"]]
+
+  // .. and . can only match patterns starting with .,
+  // even when options.dot is set.
+  , function () {
+      files = ["a/./b", "a/../b", "a/c/b", "a/.d/b"]
+    }
+  , ["a/*/b", ["a/c/b", "a/.d/b"], {dot: true}]
+  , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: true}]
+  , ["a/*/b", ["a/c/b"], {dot:false}]
+  , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: false}]
+
+
+  // this also tests that changing the options needs
+  // to change the cache key, even if the pattern is
+  // the same!
+  , ["**", ["a/b","a/.d",".a/.d"], { dot: true }
+    , [ ".a/.d", "a/.d", "a/b"]]
+
+  , "paren sets cannot contain slashes"
+  , ["*(a/b)", ["*(a/b)"], {nonull: true}, ["a/b"]]
+
+  // brace sets trump all else.
+  //
+  // invalid glob pattern.  fails on bash4 and bsdglob.
+  // however, in this implementation, it's easier just
+  // to do the intuitive thing, and let brace-expansion
+  // actually come before parsing any extglob patterns,
+  // like the documentation seems to say.
+  //
+  // XXX: if anyone complains about this, either fix it
+  // or tell them to grow up and stop complaining.
+  //
+  // bash/bsdglob says this:
+  // , ["*(a|{b),c)}", ["*(a|{b),c)}"], {}, ["a", "ab", "ac", "ad"]]
+  // but we do this instead:
+  , ["*(a|{b),c)}", ["a", "ab", "ac"], {}, ["a", "ab", "ac", "ad"]]
+
+  // test partial parsing in the presence of comment/negation chars
+  , ["[!a*", ["[!ab"], {}, ["[!ab", "[ab"]]
+  , ["[#a*", ["[#ab"], {}, ["[#ab", "[ab"]]
+
+  // like: {a,b|c\\,d\\\|e} except it's unclosed, so it has to be escaped.
+  , ["+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g"
+    , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g"]
+    , {}
+    , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g", "a", "b\\c"]]
+
+
+  // crazy nested {,,} and *(||) tests.
+  , function () {
+      files = [ "a", "b", "c", "d"
+              , "ab", "ac", "ad"
+              , "bc", "cb"
+              , "bc,d", "c,db", "c,d"
+              , "d)", "(b|c", "*(b|c"
+              , "b|c", "b|cc", "cb|c"
+              , "x(a|b|c)", "x(a|c)"
+              , "(a|b|c)", "(a|c)"]
+    }
+  , ["*(a|{b,c})", ["a", "b", "c", "ab", "ac"]]
+  , ["{a,*(b|c,d)}", ["a","(b|c", "*(b|c", "d)"]]
+  // a
+  // *(b|c)
+  // *(b|d)
+  , ["{a,*(b|{c,d})}", ["a","b", "bc", "cb", "c", "d"]]
+  , ["*(a|{b|c,c})", ["a", "b", "c", "ab", "ac", "bc", "cb"]]
+
+
+  // test various flag settings.
+  , [ "*(a|{b|c,c})", ["x(a|b|c)", "x(a|c)", "(a|b|c)", "(a|c)"]
+    , { noext: true } ]
+  , ["a?b", ["x/y/acb", "acb/"], {matchBase: true}
+    , ["x/y/acb", "acb/", "acb/d/e", "x/y/acb/d"] ]
+  , ["#*", ["#a", "#b"], {nocomment: true}, ["#a", "#b", "c#d"]]
+
+
+  // begin channelling Boole and deMorgan...
+  , "negation tests"
+  , function () {
+      files = ["d", "e", "!ab", "!abc", "a!b", "\\!a"]
+    }
+
+  // anything that is NOT a* matches.
+  , ["!a*", ["\\!a", "d", "e", "!ab", "!abc"]]
+
+  // anything that IS !a* matches.
+  , ["!a*", ["!ab", "!abc"], {nonegate: true}]
+
+  // anything that IS a* matches
+  , ["!!a*", ["a!b"]]
+
+  // anything that is NOT !a* matches
+  , ["!\\!a*", ["a!b", "d", "e", "\\!a"]]
+
+  // negation nestled within a pattern
+  , function () {
+      files = [ "foo.js"
+              , "foo.bar"
+              // can't match this one without negative lookbehind.
+              , "foo.js.js"
+              , "blar.js"
+              , "foo."
+              , "boo.js.boo" ]
+    }
+  , ["*.!(js)", ["foo.bar", "foo.", "boo.js.boo"] ]
+
+  // https://github.com/isaacs/minimatch/issues/5
+  , function () {
+      files = [ 'a/b/.x/c'
+              , 'a/b/.x/c/d'
+              , 'a/b/.x/c/d/e'
+              , 'a/b/.x'
+              , 'a/b/.x/'
+              , 'a/.x/b'
+              , '.x'
+              , '.x/'
+              , '.x/a'
+              , '.x/a/b'
+              , 'a/.x/b/.x/c'
+              , '.x/.x' ]
+  }
+  , ["**/.x/**", [ '.x/'
+                 , '.x/a'
+                 , '.x/a/b'
+                 , 'a/.x/b'
+                 , 'a/b/.x/'
+                 , 'a/b/.x/c'
+                 , 'a/b/.x/c/d'
+                 , 'a/b/.x/c/d/e' ] ]
+
+  ]
+
+var regexps =
+  [ '/^(?:(?=.)a[^/]*?)$/',
+    '/^(?:(?=.)X[^/]*?)$/',
+    '/^(?:(?=.)X[^/]*?)$/',
+    '/^(?:\\*)$/',
+    '/^(?:(?=.)\\*[^/]*?)$/',
+    '/^(?:\\*\\*)$/',
+    '/^(?:(?=.)b[^/]*?\\/)$/',
+    '/^(?:(?=.)c[^/]*?)$/',
+    '/^(?:(?:(?!(?:\\/|^)\\.).)*?)$/',
+    '/^(?:\\.\\.\\/(?!\\.)(?=.)[^/]*?\\/)$/',
+    '/^(?:s\\/(?=.)\\.\\.[^/]*?\\/)$/',
+    '/^(?:\\/\\^root:\\/\\{s\\/(?=.)\\^[^:][^/]*?:[^:][^/]*?:\\([^:]\\)[^/]*?\\.[^/]*?\\$\\/1\\/)$/',
+    '/^(?:\\/\\^root:\\/\\{s\\/(?=.)\\^[^:][^/]*?:[^:][^/]*?:\\([^:]\\)[^/]*?\\.[^/]*?\\$\\/\u0001\\/)$/',
+    '/^(?:(?!\\.)(?=.)[a-c]b[^/]*?)$/',
+    '/^(?:(?!\\.)(?=.)[a-y][^/]*?[^c])$/',
+    '/^(?:(?=.)a[^/]*?[^c])$/',
+    '/^(?:(?=.)a[X-]b)$/',
+    '/^(?:(?!\\.)(?=.)[^a-c][^/]*?)$/',
+    '/^(?:a\\*b\\/(?!\\.)(?=.)[^/]*?)$/',
+    '/^(?:(?=.)a\\*[^/]\\/(?!\\.)(?=.)[^/]*?)$/',
+    '/^(?:(?!\\.)(?=.)[^/]*?\\\\\\![^/]*?)$/',
+    '/^(?:(?!\\.)(?=.)[^/]*?\\![^/]*?)$/',
+    '/^(?:(?!\\.)(?=.)[^/]*?\\.\\*)$/',
+    '/^(?:(?=.)a[b]c)$/',
+    '/^(?:(?=.)a[b]c)$/',
+    '/^(?:(?=.)a[^/]c)$/',
+    '/^(?:a\\*c)$/',
+    'false',
+    '/^(?:(?!\\.)(?=.)[^/]*?\\/(?=.)man[^/]*?\\/(?=.)bash\\.[^/]*?)$/',
+    '/^(?:man\\/man1\\/bash\\.1)$/',
+    '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?c)$/',
+    '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/',
+    '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/',
+    '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/',
+    '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/',
+    '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/',
+    '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/',
+    '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/',
+    '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c)$/',
+    '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/])$/',
+    '/^(?:(?=.)a[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/',
+    '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/',
+    '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k[^/]*?[^/]*?[^/]*?)$/',
+    '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k)$/',
+    '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k[^/]*?[^/]*?)$/',
+    '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/',
+    '/^(?:(?!\\.)(?=.)[-abc])$/',
+    '/^(?:(?!\\.)(?=.)[abc-])$/',
+    '/^(?:\\\\)$/',
+    '/^(?:(?!\\.)(?=.)[\\\\])$/',
+    '/^(?:(?!\\.)(?=.)[\\[])$/',
+    '/^(?:\\[)$/',
+    '/^(?:(?=.)\\[(?!\\.)(?=.)[^/]*?)$/',
+    '/^(?:(?!\\.)(?=.)[\\]])$/',
+    '/^(?:(?!\\.)(?=.)[\\]-])$/',
+    '/^(?:(?!\\.)(?=.)[a-z])$/',
+    '/^(?:(?!\\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/',
+    '/^(?:(?!\\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/',
+    '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/',
+    '/^(?:(?!\\.)(?=.)[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/',
+    '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/',
+    '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/',
+    '/^(?:\\[\\])$/',
+    '/^(?:\\[abc)$/',
+    '/^(?:(?=.)XYZ)$/i',
+    '/^(?:(?=.)ab[^/]*?)$/i',
+    '/^(?:(?!\\.)(?=.)[ia][^/][ck])$/i',
+    '/^(?:\\/(?!\\.)(?=.)[^/]*?|(?!\\.)(?=.)[^/]*?)$/',
+    '/^(?:\\/(?!\\.)(?=.)[^/]|(?!\\.)(?=.)[^/]*?)$/',
+    '/^(?:(?:(?!(?:\\/|^)\\.).)*?)$/',
+    '/^(?:a\\/(?!(?:^|\\/)\\.{1,2}(?:$|\\/))(?=.)[^/]*?\\/b)$/',
+    '/^(?:a\\/(?=.)\\.[^/]*?\\/b)$/',
+    '/^(?:a\\/(?!\\.)(?=.)[^/]*?\\/b)$/',
+    '/^(?:a\\/(?=.)\\.[^/]*?\\/b)$/',
+    '/^(?:(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?)$/',
+    '/^(?:(?!\\.)(?=.)[^/]*?\\(a\\/b\\))$/',
+    '/^(?:(?!\\.)(?=.)(?:a|b)*|(?!\\.)(?=.)(?:a|c)*)$/',
+    '/^(?:(?=.)\\[(?=.)\\!a[^/]*?)$/',
+    '/^(?:(?=.)\\[(?=.)#a[^/]*?)$/',
+    '/^(?:(?=.)\\+\\(a\\|[^/]*?\\|c\\\\\\\\\\|d\\\\\\\\\\|e\\\\\\\\\\\\\\\\\\|f\\\\\\\\\\\\\\\\\\|g)$/',
+    '/^(?:(?!\\.)(?=.)(?:a|b)*|(?!\\.)(?=.)(?:a|c)*)$/',
+    '/^(?:a|(?!\\.)(?=.)[^/]*?\\(b\\|c|d\\))$/',
+    '/^(?:a|(?!\\.)(?=.)(?:b|c)*|(?!\\.)(?=.)(?:b|d)*)$/',
+    '/^(?:(?!\\.)(?=.)(?:a|b|c)*|(?!\\.)(?=.)(?:a|c)*)$/',
+    '/^(?:(?!\\.)(?=.)[^/]*?\\(a\\|b\\|c\\)|(?!\\.)(?=.)[^/]*?\\(a\\|c\\))$/',
+    '/^(?:(?=.)a[^/]b)$/',
+    '/^(?:(?=.)#[^/]*?)$/',
+    '/^(?!^(?:(?=.)a[^/]*?)$).*$/',
+    '/^(?:(?=.)\\!a[^/]*?)$/',
+    '/^(?:(?=.)a[^/]*?)$/',
+    '/^(?!^(?:(?=.)\\!a[^/]*?)$).*$/',
+    '/^(?:(?!\\.)(?=.)[^/]*?\\.(?:(?!js)[^/]*?))$/',
+    '/^(?:(?:(?!(?:\\/|^)\\.).)*?\\/\\.x\\/(?:(?!(?:\\/|^)\\.).)*?)$/' ]
+var re = 0;
+
 tap.test("basic tests", function (t) {
   var start = Date.now()
 
   // [ pattern, [matches], MM opts, files, TAP opts]
-  ; [ "http://www.bashcookbook.com/bashinfo" +
-      "/source/bash-1.14.7/tests/glob-test"
-    , ["a*", ["a", "abc", "abd", "abe"]]
-    , ["X*", ["X*"], {nonull: true}]
-
-    // allow null glob expansion
-    , ["X*", []]
-
-    // isaacs: Slightly different than bash/sh/ksh
-    // \\* is not un-escaped to literal "*" in a failed match,
-    // but it does make it get treated as a literal star
-    , ["\\*", ["\\*"], {nonull: true}]
-    , ["\\**", ["\\**"], {nonull: true}]
-    , ["\\*\\*", ["\\*\\*"], {nonull: true}]
-
-    , ["b*/", ["bdir/"]]
-    , ["c*", ["c", "ca", "cb"]]
-    , ["**", files]
-
-    , ["\\.\\./*/", ["\\.\\./*/"], {nonull: true}]
-    , ["s/\\..*//", ["s/\\..*//"], {nonull: true}]
-
-    , "legendary larry crashes bashes"
-    , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"
-      , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"], {nonull: true}]
-    , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"
-      , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"], {nonull: true}]
-
-    , "character classes"
-    , ["[a-c]b*", ["abc", "abd", "abe", "bb", "cb"]]
-    , ["[a-y]*[^c]", ["abd", "abe", "bb", "bcd",
-       "bdir/", "ca", "cb", "dd", "de"]]
-    , ["a*[^c]", ["abd", "abe"]]
-    , function () { files.push("a-b", "aXb") }
-    , ["a[X-]b", ["a-b", "aXb"]]
-    , function () { files.push(".x", ".y") }
-    , ["[^a-c]*", ["d", "dd", "de"]]
-    , function () { files.push("a*b/", "a*b/ooo") }
-    , ["a\\*b/*", ["a*b/ooo"]]
-    , ["a\\*?/*", ["a*b/ooo"]]
-    , ["*\\\\!*", [], {null: true}, ["echo !7"]]
-    , ["*\\!*", ["echo !7"], null, ["echo !7"]]
-    , ["*.\\*", ["r.*"], null, ["r.*"]]
-    , ["a[b]c", ["abc"]]
-    , ["a[\\b]c", ["abc"]]
-    , ["a?c", ["abc"]]
-    , ["a\\*c", [], {null: true}, ["abc"]]
-    , ["", [""], { null: true }, [""]]
-
-    , "http://www.opensource.apple.com/source/bash/bash-23/" +
-      "bash/tests/glob-test"
-    , function () { files.push("man/", "man/man1/", "man/man1/bash.1") }
-    , ["*/man*/bash.*", ["man/man1/bash.1"]]
-    , ["man/man1/bash.1", ["man/man1/bash.1"]]
-    , ["a***c", ["abc"], null, ["abc"]]
-    , ["a*****?c", ["abc"], null, ["abc"]]
-    , ["?*****??", ["abc"], null, ["abc"]]
-    , ["*****??", ["abc"], null, ["abc"]]
-    , ["?*****?c", ["abc"], null, ["abc"]]
-    , ["?***?****c", ["abc"], null, ["abc"]]
-    , ["?***?****?", ["abc"], null, ["abc"]]
-    , ["?***?****", ["abc"], null, ["abc"]]
-    , ["*******c", ["abc"], null, ["abc"]]
-    , ["*******?", ["abc"], null, ["abc"]]
-    , ["a*cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]]
-    , ["a**?**cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]]
-    , ["a**?**cd**?**??k***", ["abcdecdhjk"], null, ["abcdecdhjk"]]
-    , ["a**?**cd**?**??***k", ["abcdecdhjk"], null, ["abcdecdhjk"]]
-    , ["a**?**cd**?**??***k**", ["abcdecdhjk"], null, ["abcdecdhjk"]]
-    , ["a****c**?**??*****", ["abcdecdhjk"], null, ["abcdecdhjk"]]
-    , ["[-abc]", ["-"], null, ["-"]]
-    , ["[abc-]", ["-"], null, ["-"]]
-    , ["\\", ["\\"], null, ["\\"]]
-    , ["[\\\\]", ["\\"], null, ["\\"]]
-    , ["[[]", ["["], null, ["["]]
-    , ["[", ["["], null, ["["]]
-    , ["[*", ["[abc"], null, ["[abc"]]
-    , "a right bracket shall lose its special meaning and\n" +
-      "represent itself in a bracket expression if it occurs\n" +
-      "first in the list.  -- POSIX.2 2.8.3.2"
-    , ["[]]", ["]"], null, ["]"]]
-    , ["[]-]", ["]"], null, ["]"]]
-    , ["[a-\z]", ["p"], null, ["p"]]
-    , ["??**********?****?", [], { null: true }, ["abc"]]
-    , ["??**********?****c", [], { null: true }, ["abc"]]
-    , ["?************c****?****", [], { null: true }, ["abc"]]
-    , ["*c*?**", [], { null: true }, ["abc"]]
-    , ["a*****c*?**", [], { null: true }, ["abc"]]
-    , ["a********???*******", [], { null: true }, ["abc"]]
-    , ["[]", [], { null: true }, ["a"]]
-    , ["[abc", [], { null: true }, ["["]]
-
-    , "nocase tests"
-    , ["XYZ", ["xYz"], { nocase: true, null: true }
-      , ["xYz", "ABC", "IjK"]]
-    , ["ab*", ["ABC"], { nocase: true, null: true }
-      , ["xYz", "ABC", "IjK"]]
-    , ["[ia]?[ck]", ["ABC", "IjK"], { nocase: true, null: true }
-      , ["xYz", "ABC", "IjK"]]
-
-    // [ pattern, [matches], MM opts, files, TAP opts]
-    , "onestar/twostar"
-    , ["{/*,*}", [], {null: true}, ["/asdf/asdf/asdf"]]
-    , ["{/?,*}", ["/a", "bb"], {null: true}
-      , ["/a", "/b/b", "/a/b/c", "bb"]]
-
-    , "dots should not match unless requested"
-    , ["**", ["a/b"], {}, ["a/b", "a/.d", ".a/.d"]]
-
-    // .. and . can only match patterns starting with .,
-    // even when options.dot is set.
-    , function () {
-        files = ["a/./b", "a/../b", "a/c/b", "a/.d/b"]
-      }
-    , ["a/*/b", ["a/c/b", "a/.d/b"], {dot: true}]
-    , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: true}]
-    , ["a/*/b", ["a/c/b"], {dot:false}]
-    , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: false}]
-
-
-    // this also tests that changing the options needs
-    // to change the cache key, even if the pattern is
-    // the same!
-    , ["**", ["a/b","a/.d",".a/.d"], { dot: true }
-      , [ ".a/.d", "a/.d", "a/b"]]
-
-    , "paren sets cannot contain slashes"
-    , ["*(a/b)", ["*(a/b)"], {nonull: true}, ["a/b"]]
-
-    // brace sets trump all else.
-    //
-    // invalid glob pattern.  fails on bash4 and bsdglob.
-    // however, in this implementation, it's easier just
-    // to do the intuitive thing, and let brace-expansion
-    // actually come before parsing any extglob patterns,
-    // like the documentation seems to say.
-    //
-    // XXX: if anyone complains about this, either fix it
-    // or tell them to grow up and stop complaining.
-    //
-    // bash/bsdglob says this:
-    // , ["*(a|{b),c)}", ["*(a|{b),c)}"], {}, ["a", "ab", "ac", "ad"]]
-    // but we do this instead:
-    , ["*(a|{b),c)}", ["a", "ab", "ac"], {}, ["a", "ab", "ac", "ad"]]
-
-    // test partial parsing in the presence of comment/negation chars
-    , ["[!a*", ["[!ab"], {}, ["[!ab", "[ab"]]
-    , ["[#a*", ["[#ab"], {}, ["[#ab", "[ab"]]
-
-    // like: {a,b|c\\,d\\\|e} except it's unclosed, so it has to be escaped.
-    , ["+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g"
-      , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g"]
-      , {}
-      , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g", "a", "b\\c"]]
-
-
-    // crazy nested {,,} and *(||) tests.
-    , function () {
-        files = [ "a", "b", "c", "d"
-                , "ab", "ac", "ad"
-                , "bc", "cb"
-                , "bc,d", "c,db", "c,d"
-                , "d)", "(b|c", "*(b|c"
-                , "b|c", "b|cc", "cb|c"
-                , "x(a|b|c)", "x(a|c)"
-                , "(a|b|c)", "(a|c)"]
-      }
-    , ["*(a|{b,c})", ["a", "b", "c", "ab", "ac"]]
-    , ["{a,*(b|c,d)}", ["a","(b|c", "*(b|c", "d)"]]
-    // a
-    // *(b|c)
-    // *(b|d)
-    , ["{a,*(b|{c,d})}", ["a","b", "bc", "cb", "c", "d"]]
-    , ["*(a|{b|c,c})", ["a", "b", "c", "ab", "ac", "bc", "cb"]]
-
-
-    // test various flag settings.
-    , [ "*(a|{b|c,c})", ["x(a|b|c)", "x(a|c)", "(a|b|c)", "(a|c)"]
-      , { noext: true } ]
-    , ["a?b", ["x/y/acb", "acb/"], {matchBase: true}
-      , ["x/y/acb", "acb/", "acb/d/e", "x/y/acb/d"] ]
-    , ["#*", ["#a", "#b"], {nocomment: true}, ["#a", "#b", "c#d"]]
-
-
-    // begin channelling Boole and deMorgan...
-    , "negation tests"
-    , function () {
-        files = ["d", "e", "!ab", "!abc", "a!b", "\\!a"]
-      }
-
-    // anything that is NOT a* matches.
-    , ["!a*", ["\\!a", "d", "e", "!ab", "!abc"]]
-
-    // anything that IS !a* matches.
-    , ["!a*", ["!ab", "!abc"], {nonegate: true}]
-
-    // anything that IS a* matches
-    , ["!!a*", ["a!b"]]
-
-    // anything that is NOT !a* matches
-    , ["!\\!a*", ["a!b", "d", "e", "\\!a"]]
-
-    // negation nestled within a pattern
-    , function () {
-        files = [ "foo.js"
-                , "foo.bar"
-                // can't match this one without negative lookbehind.
-                , "foo.js.js"
-                , "blar.js"
-                , "foo."
-                , "boo.js.boo" ]
-      }
-    , ["*.!(js)", ["foo.bar", "foo.", "boo.js.boo"] ]
-
-    // https://github.com/isaacs/minimatch/issues/5
-    , function () {
-        files = [ 'a/b/.x/c'
-                , 'a/b/.x/c/d'
-                , 'a/b/.x/c/d/e'
-                , 'a/b/.x'
-                , 'a/b/.x/'
-                , 'a/.x/b'
-                , '.x'
-                , '.x/'
-                , '.x/a'
-                , '.x/a/b'
-                , 'a/.x/b/.x/c'
-                , '.x/.x' ]
-    }
-    , ["**/.x/**", [ '.x/'
-                   , '.x/a'
-                   , '.x/a/b'
-                   , 'a/.x/b'
-                   , 'a/b/.x/'
-                   , 'a/b/.x/c'
-                   , 'a/b/.x/c/d'
-                   , 'a/b/.x/c/d/e' ] ]
-
-    ].forEach(function (c) {
-      if (typeof c === "function") return c()
-      if (typeof c === "string") return t.comment(c)
-
-      var pattern = c[0]
-        , expect = c[1].sort(alpha)
-        , options = c[2] || {}
-        , f = c[3] || files
-        , tapOpts = c[4] || {}
-
-      // options.debug = true
-      var m = new mm.Minimatch(pattern, options)
-      var r = m.makeRe()
-      tapOpts.re = String(r) || JSON.stringify(r)
-      tapOpts.files = JSON.stringify(f)
-      tapOpts.pattern = pattern
-      tapOpts.set = m.set
-      tapOpts.negated = m.negate
-
-      var actual = mm.match(f, pattern, options)
-      actual.sort(alpha)
-
-      t.equivalent( actual, expect
-                  , JSON.stringify(pattern) + " " + JSON.stringify(expect)
-                  , tapOpts )
-    })
+  patterns.forEach(function (c) {
+    if (typeof c === "function") return c()
+    if (typeof c === "string") return t.comment(c)
+
+    var pattern = c[0]
+      , expect = c[1].sort(alpha)
+      , options = c[2] || {}
+      , f = c[3] || files
+      , tapOpts = c[4] || {}
+
+    // options.debug = true
+    var m = new mm.Minimatch(pattern, options)
+    var r = m.makeRe()
+    var expectRe = regexps[re++]
+    tapOpts.re = String(r) || JSON.stringify(r)
+    tapOpts.files = JSON.stringify(f)
+    tapOpts.pattern = pattern
+    tapOpts.set = m.set
+    tapOpts.negated = m.negate
+
+    var actual = mm.match(f, pattern, options)
+    actual.sort(alpha)
+
+    t.equivalent( actual, expect
+                , JSON.stringify(pattern) + " " + JSON.stringify(expect)
+                , tapOpts )
+
+    t.equal(tapOpts.re, expectRe, tapOpts)
+  })
 
   t.comment("time=" + (Date.now() - start) + "ms")
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js	(revision 516)
@@ -0,0 +1,8 @@
+var test = require('tap').test
+var minimatch = require('../')
+
+test('extglob ending with statechar', function(t) {
+  t.notOk(minimatch('ax', 'a?(b*)'))
+  t.ok(minimatch('ax', '?(a*|b)'))
+  t.end()
+})
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/package.json	(revision 516)
@@ -7,5 +7,5 @@
   "name": "glob",
   "description": "a little globber",
-  "version": "3.1.14",
+  "version": "3.2.9",
   "repository": {
     "type": "git",
@@ -17,18 +17,18 @@
   },
   "dependencies": {
-    "minimatch": "0.2",
-    "graceful-fs": "~1.1.2",
-    "inherits": "1"
+    "minimatch": "~0.2.11",
+    "inherits": "2"
   },
   "devDependencies": {
-    "tap": "~0.3",
+    "tap": "~0.4.0",
     "mkdirp": "0",
     "rimraf": "1"
   },
   "scripts": {
-    "test": "tap test/*.js"
+    "test": "tap test/*.js",
+    "test-regen": "TEST_REGEN=1 node test/00-setup.js"
   },
   "license": "BSD",
-  "readme": "# Glob\n\nThis is a glob implementation in JavaScript.  It uses the `minimatch`\nlibrary to do its matching.\n\n## Attention: node-glob users!\n\nThe API has changed dramatically between 2.x and 3.x. This library is\nnow 100% JavaScript, and the integer flags have been replaced with an\noptions object.\n\nAlso, there's an event emitter class, proper tests, and all the other\nthings you've come to expect from node modules.\n\nAnd best of all, no compilation!\n\n## Usage\n\n```javascript\nvar glob = require(\"glob\")\n\n// options is optional\nglob(\"**/*.js\", options, function (er, files) {\n  // files is an array of filenames.\n  // If the `nonull` option is set, and nothing\n  // was found, then files is [\"**/*.js\"]\n  // er is an error object or null.\n})\n```\n\n## Features\n\nPlease see the [minimatch\ndocumentation](https://github.com/isaacs/minimatch) for more details.\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n* [minimatch documentation](https://github.com/isaacs/minimatch)\n\n## glob(pattern, [options], cb)\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* `cb` {Function}\n  * `err` {Error | null}\n  * `matches` {Array<String>} filenames found matching the pattern\n\nPerform an asynchronous glob search.\n\n## glob.sync(pattern, [options]\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* return: {Array<String>} filenames found matching the pattern\n\nPerform a synchronous glob search.\n\n## Class: glob.Glob\n\nCreate a Glob object by instanting the `glob.Glob` class.\n\n```javascript\nvar Glob = require(\"glob\").Glob\nvar mg = new Glob(pattern, options, cb)\n```\n\nIt's an EventEmitter, and starts walking the filesystem to find matches\nimmediately.\n\n### new glob.Glob(pattern, [options], [cb])\n\n* `pattern` {String} pattern to search for\n* `options` {Object}\n* `cb` {Function} Called when an error occurs, or matches are found\n  * `err` {Error | null}\n  * `matches` {Array<String>} filenames found matching the pattern\n\nNote that if the `sync` flag is set in the options, then matches will\nbe immediately available on the `g.found` member.\n\n### Properties\n\n* `minimatch` The minimatch object that the glob uses.\n* `options` The options object passed in.\n* `error` The error encountered.  When an error is encountered, the\n  glob object is in an undefined state, and should be discarded.\n* `aborted` Boolean which is set to true when calling `abort()`.  There\n  is no way at this time to continue a glob search after aborting, but\n  you can re-use the statCache to avoid having to duplicate syscalls.\n\n### Events\n\n* `end` When the matching is finished, this is emitted with all the\n  matches found.  If the `nonull` option is set, and no match was found,\n  then the `matches` list contains the original pattern.  The matches\n  are sorted, unless the `nosort` flag is set.\n* `match` Every time a match is found, this is emitted with the matched.\n* `error` Emitted when an unexpected error is encountered, or whenever\n  any fs error occurs if `options.strict` is set.\n* `abort` When `abort()` is called, this event is raised.\n\n### Methods\n\n* `abort` Stop the search.\n\n### Options\n\nAll the options that can be passed to Minimatch can also be passed to\nGlob to change pattern matching behavior.  Also, some have been added,\nor have glob-specific ramifications.\n\nAll options are false by default, unless otherwise noted.\n\nAll options are added to the glob object, as well.\n\n* `cwd` The current working directory in which to search.  Defaults\n  to `process.cwd()`.\n* `root` The place where patterns starting with `/` will be mounted\n  onto.  Defaults to `path.resolve(options.cwd, \"/\")` (`/` on Unix\n  systems, and `C:\\` or some such on Windows.)\n* `nomount` By default, a pattern starting with a forward-slash will be\n  \"mounted\" onto the root setting, so that a valid filesystem path is\n  returned.  Set this flag to disable that behavior.\n* `mark` Add a `/` character to directory matches.  Note that this\n  requires additional stat calls.\n* `nosort` Don't sort the results.\n* `stat` Set to true to stat *all* results.  This reduces performance\n  somewhat, and is completely unnecessary, unless `readdir` is presumed\n  to be an untrustworthy indicator of file existence.  It will cause\n  ELOOP to be triggered one level sooner in the case of cyclical\n  symbolic links.\n* `silent` When an unusual error is encountered\n  when attempting to read a directory, a warning will be printed to\n  stderr.  Set the `silent` option to true to suppress these warnings.\n* `strict` When an unusual error is encountered\n  when attempting to read a directory, the process will just continue on\n  in search of other matches.  Set the `strict` option to raise an error\n  in these cases.\n* `statCache` A cache of results of filesystem information, to prevent\n  unnecessary stat calls.  While it should not normally be necessary to\n  set this, you may pass the statCache from one glob() call to the\n  options object of another, if you know that the filesystem will not\n  change between calls.  (See \"Race Conditions\" below.)\n* `sync` Perform a synchronous glob search.\n* `nounique` In some cases, brace-expanded patterns can result in the\n  same file showing up multiple times in the result set.  By default,\n  this implementation prevents duplicates in the result set.\n  Set this flag to disable that behavior.\n* `nonull` Set to never return an empty set, instead returning a set\n  containing the pattern itself.  This is the default in glob(3).\n* `nocase` Perform a case-insensitive match.  Note that case-insensitive\n  filesystems will sometimes result in glob returning results that are\n  case-insensitively matched anyway, since readdir and stat will not\n  raise an error.\n* `debug` Set to enable debug logging in minimatch and glob.\n* `globDebug` Set to enable debug logging in glob, but not minimatch.\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between node-glob and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated.  Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally.  This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything.  Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set.  This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.  **Note that this is different from the way that `**` is\nhandled by ruby's `Dir` class.**\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen glob returns the pattern as-provided, rather than\ninterpreting the character escapes.  For example,\n`glob.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`.  This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern.  Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity.  Since those two are valid, matching proceeds.\n\n## Windows\n\n**Please only use forward-slashes in glob expressions.**\n\nThough windows uses either `/` or `\\` as its path separator, only `/`\ncharacters are used by this glob implementation.  You must use\nforward-slashes **only** in glob expressions.  Back-slashes will always\nbe interpreted as escape characters, not path separators.\n\nResults from absolute patterns such as `/foo/*` are mounted onto the\nroot setting using `path.join`.  On windows, this will by default result\nin `/foo/*` matching `C:\\foo\\bar.txt`.\n\n## Race Conditions\n\nGlob searching, by its very nature, is susceptible to race conditions,\nsince it relies on directory walking and such.\n\nAs a result, it is possible that a file that exists when glob looks for\nit may have been deleted or modified by the time it returns the result.\n\nAs part of its internal implementation, this program caches all stat\nand readdir calls that it makes, in order to cut down on system\noverhead.  However, this also makes it even more susceptible to races,\nespecially if the statCache object is reused between glob calls.\n\nUsers are thus advised not to use a glob result as a\nguarantee of filesystem state in the face of rapid changes.\nFor the vast majority of operations, this is never a problem.\n",
+  "readme": "# Glob\n\nMatch files using the patterns the shell uses, like stars and stuff.\n\nThis is a glob implementation in JavaScript.  It uses the `minimatch`\nlibrary to do its matching.\n\n## Attention: node-glob users!\n\nThe API has changed dramatically between 2.x and 3.x. This library is\nnow 100% JavaScript, and the integer flags have been replaced with an\noptions object.\n\nAlso, there's an event emitter class, proper tests, and all the other\nthings you've come to expect from node modules.\n\nAnd best of all, no compilation!\n\n## Usage\n\n```javascript\nvar glob = require(\"glob\")\n\n// options is optional\nglob(\"**/*.js\", options, function (er, files) {\n  // files is an array of filenames.\n  // If the `nonull` option is set, and nothing\n  // was found, then files is [\"**/*.js\"]\n  // er is an error object or null.\n})\n```\n\n## Features\n\nPlease see the [minimatch\ndocumentation](https://github.com/isaacs/minimatch) for more details.\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n* [minimatch documentation](https://github.com/isaacs/minimatch)\n\n## glob(pattern, [options], cb)\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* `cb` {Function}\n  * `err` {Error | null}\n  * `matches` {Array<String>} filenames found matching the pattern\n\nPerform an asynchronous glob search.\n\n## glob.sync(pattern, [options])\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* return: {Array<String>} filenames found matching the pattern\n\nPerform a synchronous glob search.\n\n## Class: glob.Glob\n\nCreate a Glob object by instanting the `glob.Glob` class.\n\n```javascript\nvar Glob = require(\"glob\").Glob\nvar mg = new Glob(pattern, options, cb)\n```\n\nIt's an EventEmitter, and starts walking the filesystem to find matches\nimmediately.\n\n### new glob.Glob(pattern, [options], [cb])\n\n* `pattern` {String} pattern to search for\n* `options` {Object}\n* `cb` {Function} Called when an error occurs, or matches are found\n  * `err` {Error | null}\n  * `matches` {Array<String>} filenames found matching the pattern\n\nNote that if the `sync` flag is set in the options, then matches will\nbe immediately available on the `g.found` member.\n\n### Properties\n\n* `minimatch` The minimatch object that the glob uses.\n* `options` The options object passed in.\n* `error` The error encountered.  When an error is encountered, the\n  glob object is in an undefined state, and should be discarded.\n* `aborted` Boolean which is set to true when calling `abort()`.  There\n  is no way at this time to continue a glob search after aborting, but\n  you can re-use the statCache to avoid having to duplicate syscalls.\n* `statCache` Collection of all the stat results the glob search\n  performed.\n* `cache` Convenience object.  Each field has the following possible\n  values:\n  * `false` - Path does not exist\n  * `true` - Path exists\n  * `1` - Path exists, and is not a directory\n  * `2` - Path exists, and is a directory\n  * `[file, entries, ...]` - Path exists, is a directory, and the\n    array value is the results of `fs.readdir`\n\n### Events\n\n* `end` When the matching is finished, this is emitted with all the\n  matches found.  If the `nonull` option is set, and no match was found,\n  then the `matches` list contains the original pattern.  The matches\n  are sorted, unless the `nosort` flag is set.\n* `match` Every time a match is found, this is emitted with the matched.\n* `error` Emitted when an unexpected error is encountered, or whenever\n  any fs error occurs if `options.strict` is set.\n* `abort` When `abort()` is called, this event is raised.\n\n### Methods\n\n* `abort` Stop the search.\n\n### Options\n\nAll the options that can be passed to Minimatch can also be passed to\nGlob to change pattern matching behavior.  Also, some have been added,\nor have glob-specific ramifications.\n\nAll options are false by default, unless otherwise noted.\n\nAll options are added to the glob object, as well.\n\n* `cwd` The current working directory in which to search.  Defaults\n  to `process.cwd()`.\n* `root` The place where patterns starting with `/` will be mounted\n  onto.  Defaults to `path.resolve(options.cwd, \"/\")` (`/` on Unix\n  systems, and `C:\\` or some such on Windows.)\n* `dot` Include `.dot` files in normal matches and `globstar` matches.\n  Note that an explicit dot in a portion of the pattern will always\n  match dot files.\n* `nomount` By default, a pattern starting with a forward-slash will be\n  \"mounted\" onto the root setting, so that a valid filesystem path is\n  returned.  Set this flag to disable that behavior.\n* `mark` Add a `/` character to directory matches.  Note that this\n  requires additional stat calls.\n* `nosort` Don't sort the results.\n* `stat` Set to true to stat *all* results.  This reduces performance\n  somewhat, and is completely unnecessary, unless `readdir` is presumed\n  to be an untrustworthy indicator of file existence.  It will cause\n  ELOOP to be triggered one level sooner in the case of cyclical\n  symbolic links.\n* `silent` When an unusual error is encountered\n  when attempting to read a directory, a warning will be printed to\n  stderr.  Set the `silent` option to true to suppress these warnings.\n* `strict` When an unusual error is encountered\n  when attempting to read a directory, the process will just continue on\n  in search of other matches.  Set the `strict` option to raise an error\n  in these cases.\n* `cache` See `cache` property above.  Pass in a previously generated\n  cache object to save some fs calls.\n* `statCache` A cache of results of filesystem information, to prevent\n  unnecessary stat calls.  While it should not normally be necessary to\n  set this, you may pass the statCache from one glob() call to the\n  options object of another, if you know that the filesystem will not\n  change between calls.  (See \"Race Conditions\" below.)\n* `sync` Perform a synchronous glob search.\n* `nounique` In some cases, brace-expanded patterns can result in the\n  same file showing up multiple times in the result set.  By default,\n  this implementation prevents duplicates in the result set.\n  Set this flag to disable that behavior.\n* `nonull` Set to never return an empty set, instead returning a set\n  containing the pattern itself.  This is the default in glob(3).\n* `nocase` Perform a case-insensitive match.  Note that case-insensitive\n  filesystems will sometimes result in glob returning results that are\n  case-insensitively matched anyway, since readdir and stat will not\n  raise an error.\n* `debug` Set to enable debug logging in minimatch and glob.\n* `globDebug` Set to enable debug logging in glob, but not minimatch.\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between node-glob and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated.  Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally.  This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything.  Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set.  This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen glob returns the pattern as-provided, rather than\ninterpreting the character escapes.  For example,\n`glob.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`.  This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern.  Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity.  Since those two are valid, matching proceeds.\n\n## Windows\n\n**Please only use forward-slashes in glob expressions.**\n\nThough windows uses either `/` or `\\` as its path separator, only `/`\ncharacters are used by this glob implementation.  You must use\nforward-slashes **only** in glob expressions.  Back-slashes will always\nbe interpreted as escape characters, not path separators.\n\nResults from absolute patterns such as `/foo/*` are mounted onto the\nroot setting using `path.join`.  On windows, this will by default result\nin `/foo/*` matching `C:\\foo\\bar.txt`.\n\n## Race Conditions\n\nGlob searching, by its very nature, is susceptible to race conditions,\nsince it relies on directory walking and such.\n\nAs a result, it is possible that a file that exists when glob looks for\nit may have been deleted or modified by the time it returns the result.\n\nAs part of its internal implementation, this program caches all stat\nand readdir calls that it makes, in order to cut down on system\noverhead.  However, this also makes it even more susceptible to races,\nespecially if the cache or statCache objects are reused between glob\ncalls.\n\nUsers are thus advised not to use a glob result as a guarantee of\nfilesystem state in the face of rapid changes.  For the vast majority\nof operations, this is never a problem.\n",
   "readmeFilename": "README.md",
   "bugs": {
@@ -36,9 +36,5 @@
   },
   "homepage": "https://github.com/isaacs/node-glob",
-  "_id": "glob@3.1.14",
-  "dist": {
-    "shasum": "d76e8de8f257e1f7409dac971bfd2436b0e444dd"
-  },
-  "_from": "glob@3.1.14",
-  "_resolved": "https://registry.npmjs.org/glob/-/glob-3.1.14.tgz"
+  "_id": "glob@3.2.9",
+  "_from": "glob@>=3.1.9"
 }
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/00-setup.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/00-setup.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/00-setup.js	(revision 516)
@@ -49,13 +49,128 @@
 })
 
-tap.test("symlinky", function (t) {
-  var d = path.dirname(symlinkTo)
-  console.error("mkdirp", d)
-  mkdirp(d, 0755, function (er) {
-    t.ifError(er)
-    fs.symlink(symlinkFrom, symlinkTo, function (er) {
-      t.ifError(er, "make symlink")
+if (process.platform !== "win32") {
+  tap.test("symlinky", function (t) {
+    var d = path.dirname(symlinkTo)
+    console.error("mkdirp", d)
+    mkdirp(d, 0755, function (er) {
+      t.ifError(er)
+      fs.symlink(symlinkFrom, symlinkTo, "dir", function (er) {
+        t.ifError(er, "make symlink")
+        t.end()
+      })
+    })
+  })
+}
+
+;["foo","bar","baz","asdf","quux","qwer","rewq"].forEach(function (w) {
+  w = "/tmp/glob-test/" + w
+  tap.test("create " + w, function (t) {
+    mkdirp(w, function (er) {
+      if (er)
+        throw er
+      t.pass(w)
       t.end()
     })
   })
 })
+
+
+// generate the bash pattern test-fixtures if possible
+if (process.platform === "win32" || !process.env.TEST_REGEN) {
+  console.error("Windows, or TEST_REGEN unset.  Using cached fixtures.")
+  return
+}
+
+var spawn = require("child_process").spawn;
+var globs =
+  // put more patterns here.
+  // anything that would be directly in / should be in /tmp/glob-test
+  ["test/a/*/+(c|g)/./d"
+  ,"test/a/**/[cg]/../[cg]"
+  ,"test/a/{b,c,d,e,f}/**/g"
+  ,"test/a/b/**"
+  ,"test/**/g"
+  ,"test/a/abc{fed,def}/g/h"
+  ,"test/a/abc{fed/g,def}/**/"
+  ,"test/a/abc{fed/g,def}/**///**/"
+  ,"test/**/a/**/"
+  ,"test/+(a|b|c)/a{/,bc*}/**"
+  ,"test/*/*/*/f"
+  ,"test/**/f"
+  ,"test/a/symlink/a/b/c/a/b/c/a/b/c//a/b/c////a/b/c/**/b/c/**"
+  ,"{./*/*,/tmp/glob-test/*}"
+  ,"{/tmp/glob-test/*,*}" // evil owl face!  how you taunt me!
+  ,"test/a/!(symlink)/**"
+  ]
+var bashOutput = {}
+var fs = require("fs")
+
+globs.forEach(function (pattern) {
+  tap.test("generate fixture " + pattern, function (t) {
+    var cmd = "shopt -s globstar && " +
+              "shopt -s extglob && " +
+              "shopt -s nullglob && " +
+              // "shopt >&2; " +
+              "eval \'for i in " + pattern + "; do echo $i; done\'"
+    var cp = spawn("bash", ["-c", cmd], { cwd: path.dirname(__dirname) })
+    var out = []
+    cp.stdout.on("data", function (c) {
+      out.push(c)
+    })
+    cp.stderr.pipe(process.stderr)
+    cp.on("close", function (code) {
+      out = flatten(out)
+      if (!out)
+        out = []
+      else
+        out = cleanResults(out.split(/\r*\n/))
+
+      bashOutput[pattern] = out
+      t.notOk(code, "bash test should finish nicely")
+      t.end()
+    })
+  })
+})
+
+tap.test("save fixtures", function (t) {
+  var fname = path.resolve(__dirname, "bash-results.json")
+  var data = JSON.stringify(bashOutput, null, 2) + "\n"
+  fs.writeFile(fname, data, function (er) {
+    t.ifError(er)
+    t.end()
+  })
+})
+
+function cleanResults (m) {
+  // normalize discrepancies in ordering, duplication,
+  // and ending slashes.
+  return m.map(function (m) {
+    return m.replace(/\/+/g, "/").replace(/\/$/, "")
+  }).sort(alphasort).reduce(function (set, f) {
+    if (f !== set[set.length - 1]) set.push(f)
+    return set
+  }, []).sort(alphasort).map(function (f) {
+    // de-windows
+    return (process.platform !== 'win32') ? f
+           : f.replace(/^[a-zA-Z]:\\\\/, '/').replace(/\\/g, '/')
+  })
+}
+
+function flatten (chunks) {
+  var s = 0
+  chunks.forEach(function (c) { s += c.length })
+  var out = new Buffer(s)
+  s = 0
+  chunks.forEach(function (c) {
+    c.copy(out, s)
+    s += c.length
+  })
+
+  return out.toString().trim()
+}
+
+function alphasort (a, b) {
+  a = a.toLowerCase()
+  b = b.toLowerCase()
+  return a > b ? 1 : a < b ? -1 : 0
+}
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/bash-comparison.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/bash-comparison.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/bash-comparison.js	(revision 516)
@@ -3,23 +3,6 @@
 var tap = require("tap")
 , child_process = require("child_process")
-
-// put more patterns here.
-, globs =
-  ["test/a/*/+(c|g)/./d"
-  ,"test/a/**/[cg]/../[cg]"
-  ,"test/a/{b,c,d,e,f}/**/g"
-  ,"test/a/b/**"
-  ,"test/**/g"
-  ,"test/a/abc{fed,def}/g/h"
-  ,"test/a/abc{fed/g,def}/**/"
-  ,"test/a/abc{fed/g,def}/**///**/"
-  ,"test/**/a/**/"
-  ,"test/+(a|b|c)/a{/,bc*}/**"
-  ,"test/*/*/*/f"
-  ,"test/**/f"
-  ,"test/a/symlink/a/b/c/a/b/c/a/b/c//a/b/c////a/b/c/**/b/c/**"
-  ,"{./*/*,/usr/local/*}"
-  ,"{/*,*}" // evil owl face!  how you taunt me!
-  ]
+, bashResults = require("./bash-results.json")
+, globs = Object.keys(bashResults)
 , glob = require("../")
 , path = require("path")
@@ -36,83 +19,45 @@
 
 globs.forEach(function (pattern) {
-  var echoOutput
+  var expect = bashResults[pattern]
+  // anything regarding the symlink thing will fail on windows, so just skip it
+  if (process.platform === "win32" &&
+      expect.some(function (m) {
+        return /\/symlink\//.test(m)
+      }))
+    return
+
   tap.test(pattern, function (t) {
-    var bashPattern = pattern
-    , cmd = "shopt -s globstar && " +
-            "shopt -s extglob && " +
-            "shopt -s nullglob && " +
-            // "shopt >&2; " +
-            "eval \'for i in " + bashPattern + "; do echo $i; done\'"
-    , cp = child_process.spawn("bash", ["-c",cmd])
-    , out = []
-    , globResult
-    cp.stdout.on("data", function (c) {
-      out.push(c)
+    glob(pattern, function (er, matches) {
+      if (er)
+        throw er
+
+      // sort and unmark, just to match the shell results
+      matches = cleanResults(matches)
+
+      t.deepEqual(matches, expect, pattern)
+      t.end()
     })
-    cp.stderr.on("data", function (c) {
-      process.stderr.write(c)
-    })
-    cp.on("close", function () {
-      echoOutput = flatten(out)
-      if (!echoOutput) echoOutput = []
-      else {
-        echoOutput = echoOutput.split(/\r*\n/).map(function (m) {
-          // Bash is a oddly inconsistent with slashes in the
-          // the results.  This implementation is a bit more
-          // normalized.  Account for this in the test results.
-          return m.replace(/\/+/g, "/").replace(/\/$/, "")
-        }).sort(alphasort).reduce(function (set, f) {
-          if (f !== set[set.length - 1]) set.push(f)
-          return set
-        }, []).sort(alphasort)
-      }
-      next()
-    })
-
-    glob(pattern, function (er, matches) {
-      // sort and unpark, just to match the shell results
-      matches = matches.map(function (m) {
-        return m.replace(/\/+/g, "/").replace(/\/$/, "")
-      }).sort(alphasort).reduce(function (set, f) {
-        if (f !== set[set.length - 1]) set.push(f)
-        return set
-      }, []).sort(alphasort)
-
-      t.ifError(er, pattern + " should not error")
-      globResult = matches
-      next()
-    })
-
-    function next () {
-      if (!echoOutput || !globResult) return
-
-      t.deepEqual(globResult, echoOutput, "should match shell")
-      t.end()
-    }
   })
 
   tap.test(pattern + " sync", function (t) {
-    var matches = glob.sync(pattern).map(function (m) {
-        return m.replace(/\/+/g, "/").replace(/\/$/, "")
-      }).sort(alphasort).reduce(function (set, f) {
-        if (f !== set[set.length - 1]) set.push(f)
-        return set
-      }, []).sort(alphasort)
+    var matches = cleanResults(glob.sync(pattern))
 
-    t.deepEqual(matches, echoOutput, "should match shell")
+    t.deepEqual(matches, expect, "should match shell")
     t.end()
   })
 })
 
-function flatten (chunks) {
-  var s = 0
-  chunks.forEach(function (c) { s += c.length })
-  var out = new Buffer(s)
-  s = 0
-  chunks.forEach(function (c) {
-    c.copy(out, s)
-    s += c.length
+function cleanResults (m) {
+  // normalize discrepancies in ordering, duplication,
+  // and ending slashes.
+  return m.map(function (m) {
+    return m.replace(/\/+/g, "/").replace(/\/$/, "")
+  }).sort(alphasort).reduce(function (set, f) {
+    if (f !== set[set.length - 1]) set.push(f)
+    return set
+  }, []).sort(alphasort).map(function (f) {
+    // de-windows
+    return (process.platform !== 'win32') ? f
+           : f.replace(/^[a-zA-Z]:[\/\\]+/, '/').replace(/[\\\/]+/g, '/')
   })
-
-  return out.toString().trim()
 }
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/bash-results.json
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/bash-results.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/bash-results.json	(revision 516)
@@ -0,0 +1,351 @@
+{
+  "test/a/*/+(c|g)/./d": [
+    "test/a/b/c/./d"
+  ],
+  "test/a/**/[cg]/../[cg]": [
+    "test/a/abcdef/g/../g",
+    "test/a/abcfed/g/../g",
+    "test/a/b/c/../c",
+    "test/a/c/../c",
+    "test/a/c/d/c/../c",
+    "test/a/symlink/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c"
+  ],
+  "test/a/{b,c,d,e,f}/**/g": [],
+  "test/a/b/**": [
+    "test/a/b",
+    "test/a/b/c",
+    "test/a/b/c/d"
+  ],
+  "test/**/g": [
+    "test/a/abcdef/g",
+    "test/a/abcfed/g"
+  ],
+  "test/a/abc{fed,def}/g/h": [
+    "test/a/abcdef/g/h",
+    "test/a/abcfed/g/h"
+  ],
+  "test/a/abc{fed/g,def}/**/": [
+    "test/a/abcdef",
+    "test/a/abcdef/g",
+    "test/a/abcfed/g"
+  ],
+  "test/a/abc{fed/g,def}/**///**/": [
+    "test/a/abcdef",
+    "test/a/abcdef/g",
+    "test/a/abcfed/g"
+  ],
+  "test/**/a/**/": [
+    "test/a",
+    "test/a/abcdef",
+    "test/a/abcdef/g",
+    "test/a/abcfed",
+    "test/a/abcfed/g",
+    "test/a/b",
+    "test/a/b/c",
+    "test/a/bc",
+    "test/a/bc/e",
+    "test/a/c",
+    "test/a/c/d",
+    "test/a/c/d/c",
+    "test/a/cb",
+    "test/a/cb/e",
+    "test/a/symlink",
+    "test/a/symlink/a",
+    "test/a/symlink/a/b",
+    "test/a/symlink/a/b/c",
+    "test/a/symlink/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b"
+  ],
+  "test/+(a|b|c)/a{/,bc*}/**": [
+    "test/a/abcdef",
+    "test/a/abcdef/g",
+    "test/a/abcdef/g/h",
+    "test/a/abcfed",
+    "test/a/abcfed/g",
+    "test/a/abcfed/g/h"
+  ],
+  "test/*/*/*/f": [
+    "test/a/bc/e/f",
+    "test/a/cb/e/f"
+  ],
+  "test/**/f": [
+    "test/a/bc/e/f",
+    "test/a/cb/e/f"
+  ],
+  "test/a/symlink/a/b/c/a/b/c/a/b/c//a/b/c////a/b/c/**/b/c/**": [
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b",
+    "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c"
+  ],
+  "{./*/*,/tmp/glob-test/*}": [
+    "./examples/g.js",
+    "./examples/usr-local.js",
+    "./node_modules/inherits",
+    "./node_modules/minimatch",
+    "./node_modules/mkdirp",
+    "./node_modules/rimraf",
+    "./node_modules/tap",
+    "./test/00-setup.js",
+    "./test/a",
+    "./test/bash-comparison.js",
+    "./test/bash-results.json",
+    "./test/cwd-test.js",
+    "./test/globstar-match.js",
+    "./test/mark.js",
+    "./test/new-glob-optional-options.js",
+    "./test/nocase-nomagic.js",
+    "./test/pause-resume.js",
+    "./test/readme-issue.js",
+    "./test/root-nomount.js",
+    "./test/root.js",
+    "./test/stat.js",
+    "./test/zz-cleanup.js",
+    "/tmp/glob-test/asdf",
+    "/tmp/glob-test/bar",
+    "/tmp/glob-test/baz",
+    "/tmp/glob-test/foo",
+    "/tmp/glob-test/quux",
+    "/tmp/glob-test/qwer",
+    "/tmp/glob-test/rewq"
+  ],
+  "{/tmp/glob-test/*,*}": [
+    "/tmp/glob-test/asdf",
+    "/tmp/glob-test/bar",
+    "/tmp/glob-test/baz",
+    "/tmp/glob-test/foo",
+    "/tmp/glob-test/quux",
+    "/tmp/glob-test/qwer",
+    "/tmp/glob-test/rewq",
+    "examples",
+    "glob.js",
+    "LICENSE",
+    "node_modules",
+    "package.json",
+    "README.md",
+    "test"
+  ],
+  "test/a/!(symlink)/**": [
+    "test/a/abcdef",
+    "test/a/abcdef/g",
+    "test/a/abcdef/g/h",
+    "test/a/abcfed",
+    "test/a/abcfed/g",
+    "test/a/abcfed/g/h",
+    "test/a/b",
+    "test/a/b/c",
+    "test/a/b/c/d",
+    "test/a/bc",
+    "test/a/bc/e",
+    "test/a/bc/e/f",
+    "test/a/c",
+    "test/a/c/d",
+    "test/a/c/d/c",
+    "test/a/c/d/c/b",
+    "test/a/cb",
+    "test/a/cb/e",
+    "test/a/cb/e/f"
+  ]
+}
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/globstar-match.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/globstar-match.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/globstar-match.js	(revision 516)
@@ -0,0 +1,19 @@
+var Glob = require("../glob.js").Glob
+var test = require('tap').test
+
+test('globstar should not have dupe matches', function(t) {
+  var pattern = 'a/**/[gh]'
+  var g = new Glob(pattern, { cwd: __dirname })
+  var matches = []
+  g.on('match', function(m) {
+    console.error('match %j', m)
+    matches.push(m)
+  })
+  g.on('end', function(set) {
+    console.error('set', set)
+    matches = matches.sort()
+    set = set.sort()
+    t.same(matches, set, 'should have same set of matches')
+    t.end()
+  })
+})
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/mark.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/mark.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/mark.js	(revision 516)
@@ -2,4 +2,40 @@
 var glob = require('../')
 process.chdir(__dirname)
+
+// expose timing issues
+var lag = 5
+glob.Glob.prototype._stat = function(o) { return function(f, cb) {
+  var args = arguments
+  setTimeout(function() {
+    o.call(this, f, cb)
+  }.bind(this), lag += 5)
+}}(glob.Glob.prototype._stat)
+
+
+test("mark, with **", function (t) {
+  glob("a/*b*/**", {mark: true}, function (er, results) {
+    if (er)
+      throw er
+    var expect =
+      [ 'a/abcdef/',
+        'a/abcdef/g/',
+        'a/abcdef/g/h',
+        'a/abcfed/',
+        'a/abcfed/g/',
+        'a/abcfed/g/h',
+        'a/b/',
+        'a/b/c/',
+        'a/b/c/d',
+        'a/bc/',
+        'a/bc/e/',
+        'a/bc/e/f',
+        'a/cb/',
+        'a/cb/e/',
+        'a/cb/e/f' ]
+
+    t.same(results, expect)
+    t.end()
+  })
+})
 
 test("mark, no / on pattern", function (t) {
@@ -7,12 +43,18 @@
     if (er)
       throw er
-    t.same(results, [ 'a/abcdef/',
-                      'a/abcfed/',
-                      'a/b/',
-                      'a/bc/',
-                      'a/c/',
-                      'a/cb/',
-                      'a/symlink/' ])
+    var expect = [ 'a/abcdef/',
+                   'a/abcfed/',
+                   'a/b/',
+                   'a/bc/',
+                   'a/c/',
+                   'a/cb/' ]
+
+    if (process.platform !== "win32")
+      expect.push('a/symlink/')
+
+    t.same(results, expect)
     t.end()
+  }).on('match', function(m) {
+    t.similar(m, /\/$/)
   })
 })
@@ -22,12 +64,17 @@
     if (er)
       throw er
-    t.same(results, [ 'a/abcdef',
-                      'a/abcfed',
-                      'a/b',
-                      'a/bc',
-                      'a/c',
-                      'a/cb',
-                      'a/symlink' ])
+    var expect = [ 'a/abcdef',
+                   'a/abcfed',
+                   'a/b',
+                   'a/bc',
+                   'a/c',
+                   'a/cb' ]
+
+    if (process.platform !== "win32")
+      expect.push('a/symlink')
+    t.same(results, expect)
     t.end()
+  }).on('match', function(m) {
+    t.similar(m, /[^\/]$/)
   })
 })
@@ -37,12 +84,16 @@
     if (er)
       throw er
-    t.same(results, [ 'a/abcdef/',
-                      'a/abcfed/',
-                      'a/b/',
-                      'a/bc/',
-                      'a/c/',
-                      'a/cb/',
-                      'a/symlink/' ])
+    var expect = [ 'a/abcdef/',
+                    'a/abcfed/',
+                    'a/b/',
+                    'a/bc/',
+                    'a/c/',
+                    'a/cb/' ]
+    if (process.platform !== "win32")
+      expect.push('a/symlink/')
+    t.same(results, expect)
     t.end()
+  }).on('match', function(m) {
+    t.similar(m, /\/$/)
   })
 })
@@ -52,12 +103,16 @@
     if (er)
       throw er
-    t.same(results, [ 'a/abcdef/',
-                      'a/abcfed/',
-                      'a/b/',
-                      'a/bc/',
-                      'a/c/',
-                      'a/cb/',
-                      'a/symlink/' ])
+    var expect = [ 'a/abcdef/',
+                   'a/abcfed/',
+                   'a/b/',
+                   'a/bc/',
+                   'a/c/',
+                   'a/cb/' ]
+    if (process.platform !== "win32")
+      expect.push('a/symlink/')
+    t.same(results, expect)
     t.end()
+  }).on('match', function(m) {
+    t.similar(m, /\/$/)
   })
 })
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/new-glob-optional-options.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/new-glob-optional-options.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/new-glob-optional-options.js	(revision 516)
@@ -0,0 +1,10 @@
+var Glob = require('../glob.js').Glob;
+var test = require('tap').test;
+
+test('new glob, with cb, and no options', function (t) {
+  new Glob(__filename, function(er, results) {
+    if (er) throw er;
+    t.same(results, [__filename]);
+    t.end();
+  });
+});
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/nocase-nomagic.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/nocase-nomagic.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/nocase-nomagic.js	(revision 516)
@@ -0,0 +1,113 @@
+var fs = require('fs');
+var test = require('tap').test;
+var glob = require('../');
+
+test('mock fs', function(t) {
+  var stat = fs.stat
+  var statSync = fs.statSync
+  var readdir = fs.readdir
+  var readdirSync = fs.readdirSync
+
+  function fakeStat(path) {
+    var ret
+    switch (path.toLowerCase()) {
+      case '/tmp': case '/tmp/':
+        ret = { isDirectory: function() { return true } }
+        break
+      case '/tmp/a':
+        ret = { isDirectory: function() { return false } }
+        break
+    }
+    return ret
+  }
+
+  fs.stat = function(path, cb) {
+    var f = fakeStat(path);
+    if (f) {
+      process.nextTick(function() {
+        cb(null, f)
+      })
+    } else {
+      stat.call(fs, path, cb)
+    }
+  }
+
+  fs.statSync = function(path) {
+    return fakeStat(path) || statSync.call(fs, path)
+  }
+
+  function fakeReaddir(path) {
+    var ret
+    switch (path.toLowerCase()) {
+      case '/tmp': case '/tmp/':
+        ret = [ 'a', 'A' ]
+        break
+      case '/':
+        ret = ['tmp', 'tMp', 'tMP', 'TMP']
+    }
+    return ret
+  }
+
+  fs.readdir = function(path, cb) {
+    var f = fakeReaddir(path)
+    if (f)
+      process.nextTick(function() {
+        cb(null, f)
+      })
+    else
+      readdir.call(fs, path, cb)
+  }
+
+  fs.readdirSync = function(path) {
+    return fakeReaddir(path) || readdirSync.call(fs, path)
+  }
+
+  t.pass('mocked')
+  t.end()
+})
+
+test('nocase, nomagic', function(t) {
+  var n = 2
+  var want = [ '/TMP/A',
+               '/TMP/a',
+               '/tMP/A',
+               '/tMP/a',
+               '/tMp/A',
+               '/tMp/a',
+               '/tmp/A',
+               '/tmp/a' ]
+  glob('/tmp/a', { nocase: true }, function(er, res) {
+    if (er)
+      throw er
+    t.same(res.sort(), want)
+    if (--n === 0) t.end()
+  })
+  glob('/tmp/A', { nocase: true }, function(er, res) {
+    if (er)
+      throw er
+    t.same(res.sort(), want)
+    if (--n === 0) t.end()
+  })
+})
+
+test('nocase, with some magic', function(t) {
+  t.plan(2)
+  var want = [ '/TMP/A',
+               '/TMP/a',
+               '/tMP/A',
+               '/tMP/a',
+               '/tMp/A',
+               '/tMp/a',
+               '/tmp/A',
+               '/tmp/a' ]
+  glob('/tmp/*', { nocase: true }, function(er, res) {
+    if (er)
+      throw er
+    t.same(res.sort(), want)
+  })
+  glob('/tmp/*', { nocase: true }, function(er, res) {
+    if (er)
+      throw er
+    t.same(res.sort(), want)
+  })
+})
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/pause-resume.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/pause-resume.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/pause-resume.js	(revision 516)
@@ -4,4 +4,6 @@
 // just some gnarly pattern with lots of matches
 , pattern = "test/a/!(symlink)/**"
+, bashResults = require("./bash-results.json")
+, patterns = Object.keys(bashResults)
 , glob = require("../")
 , Glob = glob.Glob
@@ -26,46 +28,10 @@
     if (f !== set[set.length - 1]) set.push(f)
     return set
-  }, []).sort(alphasort)
+  }, []).sort(alphasort).map(function (f) {
+    // de-windows
+    return (process.platform !== 'win32') ? f
+           : f.replace(/^[a-zA-Z]:\\\\/, '/').replace(/\\/g, '/')
+  })
 }
-
-function flatten (chunks) {
-  var s = 0
-  chunks.forEach(function (c) { s += c.length })
-  var out = new Buffer(s)
-  s = 0
-  chunks.forEach(function (c) {
-    c.copy(out, s)
-    s += c.length
-  })
-
-  return out.toString().trim()
-}
-var bashResults
-tap.test("get bash output", function (t) {
-  var bashPattern = pattern
-  , cmd = "shopt -s globstar && " +
-          "shopt -s extglob && " +
-          "shopt -s nullglob && " +
-          // "shopt >&2; " +
-          "eval \'for i in " + bashPattern + "; do echo $i; done\'"
-  , cp = child_process.spawn("bash", ["-c",cmd])
-  , out = []
-  , globResult
-  cp.stdout.on("data", function (c) {
-    out.push(c)
-  })
-  cp.stderr.on("data", function (c) {
-    process.stderr.write(c)
-  })
-  cp.on("close", function () {
-    bashResults = flatten(out)
-    if (!bashResults) return t.fail("Didn't get results from bash")
-    else {
-      bashResults = cleanResults(bashResults.split(/\r*\n/))
-    }
-    t.ok(bashResults.length, "got some results")
-    t.end()
-  })
-})
 
 var globResults = []
@@ -74,4 +40,5 @@
   , paused = false
   , res = []
+  , expect = bashResults[pattern]
 
   g.on("pause", function () {
@@ -98,5 +65,5 @@
       "end event matches should be the same as match events")
 
-    t.deepEqual(matches, bashResults,
+    t.deepEqual(matches, expect,
       "glob matches should be the same as bash results")
 
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/readme-issue.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/readme-issue.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/readme-issue.js	(revision 516)
@@ -0,0 +1,36 @@
+var test = require("tap").test
+var glob = require("../")
+
+var mkdirp = require("mkdirp")
+var fs = require("fs")
+var rimraf = require("rimraf")
+var dir = __dirname + "/package"
+
+test("setup", function (t) {
+  mkdirp.sync(dir)
+  fs.writeFileSync(dir + "/package.json", "{}", "ascii")
+  fs.writeFileSync(dir + "/README", "x", "ascii")
+  t.pass("setup done")
+  t.end()
+})
+
+test("glob", function (t) {
+  var opt = {
+    cwd: dir,
+    nocase: true,
+    mark: true
+  }
+
+  glob("README?(.*)", opt, function (er, files) {
+    if (er)
+      throw er
+    t.same(files, ["README"])
+    t.end()
+  })
+})
+
+test("cleanup", function (t) {
+  rimraf.sync(dir)
+  t.pass("clean")
+  t.end()
+})
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/root.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/root.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/root.js	(revision 516)
@@ -1,43 +1,46 @@
-var tap = require("tap")
+var t = require("tap")
 
 var origCwd = process.cwd()
 process.chdir(__dirname)
 
-tap.test("changing root and searching for /b*/**", function (t) {
-  var glob = require('../')
-  var path = require('path')
-  t.test('.', function (t) {
-    glob('/b*/**', { globDebug: true, root: '.' }, function (er, matches) {
-      t.ifError(er)
-      t.like(matches, [])
-      t.end()
-    })
-  })
+var glob = require('../')
+var path = require('path')
 
-  t.test('a', function (t) {
-    glob('/b*/**', { globDebug: true, root: path.resolve('a') }, function (er, matches) {
-      t.ifError(er)
-      t.like(matches, [ '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' ].map(function (m) {
-        return path.join(path.resolve('a'), m)
-      }))
-      t.end()
-    })
-  })
-
-  t.test('root=a, cwd=a/b', function (t) {
-    glob('/b*/**', { globDebug: true, root: 'a', cwd: path.resolve('a/b') }, function (er, matches) {
-      t.ifError(er)
-      t.like(matches, [ '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' ].map(function (m) {
-        return path.join(path.resolve('a'), m)
-      }))
-      t.end()
-    })
-  })
-
-  t.test('cd -', function (t) {
-    process.chdir(origCwd)
+t.test('.', function (t) {
+  glob('/b*/**', { globDebug: true, root: '.' }, function (er, matches) {
+    t.ifError(er)
+    t.like(matches, [])
     t.end()
   })
+})
 
+
+t.test('a', function (t) {
+  console.error("root=" + path.resolve('a'))
+  glob('/b*/**', { globDebug: true, root: path.resolve('a') }, function (er, matches) {
+    t.ifError(er)
+    var wanted = [
+        '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f'
+      ].map(function (m) {
+        return path.join(path.resolve('a'), m).replace(/\\/g, '/')
+      })
+
+    t.like(matches, wanted)
+    t.end()
+  })
+})
+
+t.test('root=a, cwd=a/b', function (t) {
+  glob('/b*/**', { globDebug: true, root: 'a', cwd: path.resolve('a/b') }, function (er, matches) {
+    t.ifError(er)
+    t.like(matches, [ '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' ].map(function (m) {
+      return path.join(path.resolve('a'), m).replace(/\\/g, '/')
+    }))
+    t.end()
+  })
+})
+
+t.test('cd -', function (t) {
+  process.chdir(origCwd)
   t.end()
 })
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/stat.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/stat.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/glob/test/stat.js	(revision 516)
@@ -0,0 +1,32 @@
+var glob = require('../')
+var test = require('tap').test
+var path = require('path')
+
+test('stat all the things', function(t) {
+  var g = new glob.Glob('a/*abc*/**', { stat: true, cwd: __dirname })
+  var matches = []
+  g.on('match', function(m) {
+    matches.push(m)
+  })
+  var stats = []
+  g.on('stat', function(m) {
+    stats.push(m)
+  })
+  g.on('end', function(eof) {
+    stats = stats.sort()
+    matches = matches.sort()
+    eof = eof.sort()
+    t.same(stats, matches)
+    t.same(eof, matches)
+    var cache = Object.keys(this.statCache)
+    t.same(cache.map(function (f) {
+      return path.relative(__dirname, f)
+    }).sort(), matches)
+
+    cache.forEach(function(c) {
+      t.equal(typeof this.statCache[c], 'object')
+    }, this)
+
+    t.end()
+  })
+})
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/.travis.yml
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/.travis.yml	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/.travis.yml	(revision 516)
@@ -1,4 +1,4 @@
 language: node_js
 node_js:
-  - 0.6
-  - 0.8
+  - "0.8"
+  - "0.10"
Index: v/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/README.markdown
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/README.markdown	(revision 515)
+++ 	(revision )
@@ -1,487 +1,0 @@
-optimist
-========
-
-Optimist is a node.js library for option parsing for people who hate option
-parsing. More specifically, this module is for people who like all the --bells
-and -whistlz of program usage but think optstrings are a waste of time.
-
-With optimist, option parsing doesn't have to suck (as much).
-
-[![build status](https://secure.travis-ci.org/substack/node-optimist.png)](http://travis-ci.org/substack/node-optimist)
-
-examples
-========
-
-With Optimist, the options are just a hash! No optstrings attached.
--------------------------------------------------------------------
-
-xup.js:
-
-````javascript
-#!/usr/bin/env node
-var argv = require('optimist').argv;
-
-if (argv.rif - 5 * argv.xup > 7.138) {
-    console.log('Buy more riffiwobbles');
-}
-else {
-    console.log('Sell the xupptumblers');
-}
-````
-
-***
-
-    $ ./xup.js --rif=55 --xup=9.52
-    Buy more riffiwobbles
-    
-    $ ./xup.js --rif 12 --xup 8.1
-    Sell the xupptumblers
-
-![This one's optimistic.](http://substack.net/images/optimistic.png)
-
-But wait! There's more! You can do short options:
--------------------------------------------------
- 
-short.js:
-
-````javascript
-#!/usr/bin/env node
-var argv = require('optimist').argv;
-console.log('(%d,%d)', argv.x, argv.y);
-````
-
-***
-
-    $ ./short.js -x 10 -y 21
-    (10,21)
-
-And booleans, both long and short (and grouped):
-----------------------------------
-
-bool.js:
-
-````javascript
-#!/usr/bin/env node
-var util = require('util');
-var argv = require('optimist').argv;
-
-if (argv.s) {
-    util.print(argv.fr ? 'Le chat dit: ' : 'The cat says: ');
-}
-console.log(
-    (argv.fr ? 'miaou' : 'meow') + (argv.p ? '.' : '')
-);
-````
-
-***
-
-    $ ./bool.js -s
-    The cat says: meow
-    
-    $ ./bool.js -sp
-    The cat says: meow.
-
-    $ ./bool.js -sp --fr
-    Le chat dit: miaou.
-
-And non-hypenated options too! Just use `argv._`!
--------------------------------------------------
- 
-nonopt.js:
-
-````javascript
-#!/usr/bin/env node
-var argv = require('optimist').argv;
-console.log('(%d,%d)', argv.x, argv.y);
-console.log(argv._);
-````
-
-***
-
-    $ ./nonopt.js -x 6.82 -y 3.35 moo
-    (6.82,3.35)
-    [ 'moo' ]
-    
-    $ ./nonopt.js foo -x 0.54 bar -y 1.12 baz
-    (0.54,1.12)
-    [ 'foo', 'bar', 'baz' ]
-
-Plus, Optimist comes with .usage() and .demand()!
--------------------------------------------------
-
-divide.js:
-
-````javascript
-#!/usr/bin/env node
-var argv = require('optimist')
-    .usage('Usage: $0 -x [num] -y [num]')
-    .demand(['x','y'])
-    .argv;
-
-console.log(argv.x / argv.y);
-````
-
-***
- 
-    $ ./divide.js -x 55 -y 11
-    5
-    
-    $ node ./divide.js -x 4.91 -z 2.51
-    Usage: node ./divide.js -x [num] -y [num]
-
-    Options:
-      -x  [required]
-      -y  [required]
-
-    Missing required arguments: y
-
-EVEN MORE HOLY COW
-------------------
-
-default_singles.js:
-
-````javascript
-#!/usr/bin/env node
-var argv = require('optimist')
-    .default('x', 10)
-    .default('y', 10)
-    .argv
-;
-console.log(argv.x + argv.y);
-````
-
-***
-
-    $ ./default_singles.js -x 5
-    15
-
-default_hash.js:
-
-````javascript
-#!/usr/bin/env node
-var argv = require('optimist')
-    .default({ x : 10, y : 10 })
-    .argv
-;
-console.log(argv.x + argv.y);
-````
-
-***
-
-    $ ./default_hash.js -y 7
-    17
-
-And if you really want to get all descriptive about it...
----------------------------------------------------------
-
-boolean_single.js
-
-````javascript
-#!/usr/bin/env node
-var argv = require('optimist')
-    .boolean('v')
-    .argv
-;
-console.dir(argv);
-````
-
-***
-
-    $ ./boolean_single.js -v foo bar baz
-    true
-    [ 'bar', 'baz', 'foo' ]
-
-boolean_double.js
-
-````javascript
-#!/usr/bin/env node
-var argv = require('optimist')
-    .boolean(['x','y','z'])
-    .argv
-;
-console.dir([ argv.x, argv.y, argv.z ]);
-console.dir(argv._);
-````
-
-***
-
-    $ ./boolean_double.js -x -z one two three
-    [ true, false, true ]
-    [ 'one', 'two', 'three' ]
-
-Optimist is here to help...
----------------------------
-
-You can describe parameters for help messages and set aliases. Optimist figures
-out how to format a handy help string automatically.
-
-line_count.js
-
-````javascript
-#!/usr/bin/env node
-var argv = require('optimist')
-    .usage('Count the lines in a file.\nUsage: $0')
-    .demand('f')
-    .alias('f', 'file')
-    .describe('f', 'Load a file')
-    .argv
-;
-
-var fs = require('fs');
-var s = fs.createReadStream(argv.file);
-
-var lines = 0;
-s.on('data', function (buf) {
-    lines += buf.toString().match(/\n/g).length;
-});
-
-s.on('end', function () {
-    console.log(lines);
-});
-````
-
-***
-
-    $ node line_count.js
-    Count the lines in a file.
-    Usage: node ./line_count.js
-
-    Options:
-      -f, --file  Load a file  [required]
-
-    Missing required arguments: f
-
-    $ node line_count.js --file line_count.js 
-    20
-    
-    $ node line_count.js -f line_count.js 
-    20
-
-methods
-=======
-
-By itself,
-
-````javascript
-require('optimist').argv
-`````
-
-will use `process.argv` array to construct the `argv` object.
-
-You can pass in the `process.argv` yourself:
-
-````javascript
-require('optimist')([ '-x', '1', '-y', '2' ]).argv
-````
-
-or use .parse() to do the same thing:
-
-````javascript
-require('optimist').parse([ '-x', '1', '-y', '2' ])
-````
-
-The rest of these methods below come in just before the terminating `.argv`.
-
-.alias(key, alias)
-------------------
-
-Set key names as equivalent such that updates to a key will propagate to aliases
-and vice-versa.
-
-Optionally `.alias()` can take an object that maps keys to aliases.
-
-.default(key, value)
---------------------
-
-Set `argv[key]` to `value` if no option was specified on `process.argv`.
-
-Optionally `.default()` can take an object that maps keys to default values.
-
-.demand(key)
-------------
-
-If `key` is a string, show the usage information and exit if `key` wasn't
-specified in `process.argv`.
-
-If `key` is a number, demand at least as many non-option arguments, which show
-up in `argv._`.
-
-If `key` is an Array, demand each element.
-
-.describe(key, desc)
---------------------
-
-Describe a `key` for the generated usage information.
-
-Optionally `.describe()` can take an object that maps keys to descriptions.
-
-.options(key, opt)
-------------------
-
-Instead of chaining together `.alias().demand().default()`, you can specify
-keys in `opt` for each of the chainable methods.
-
-For example:
-
-````javascript
-var argv = require('optimist')
-    .options('f', {
-        alias : 'file',
-        default : '/etc/passwd',
-    })
-    .argv
-;
-````
-
-is the same as
-
-````javascript
-var argv = require('optimist')
-    .alias('f', 'file')
-    .default('f', '/etc/passwd')
-    .argv
-;
-````
-
-Optionally `.options()` can take an object that maps keys to `opt` parameters.
-
-.usage(message)
----------------
-
-Set a usage message to show which commands to use. Inside `message`, the string
-`$0` will get interpolated to the current script name or node command for the
-present script similar to how `$0` works in bash or perl.
-
-.check(fn)
-----------
-
-Check that certain conditions are met in the provided arguments.
-
-If `fn` throws or returns `false`, show the thrown error, usage information, and
-exit.
-
-.boolean(key)
--------------
-
-Interpret `key` as a boolean. If a non-flag option follows `key` in
-`process.argv`, that string won't get set as the value of `key`.
-
-If `key` never shows up as a flag in `process.arguments`, `argv[key]` will be
-`false`.
-
-If `key` is an Array, interpret all the elements as booleans.
-
-.string(key)
-------------
-
-Tell the parser logic not to interpret `key` as a number or boolean.
-This can be useful if you need to preserve leading zeros in an input.
-
-If `key` is an Array, interpret all the elements as strings.
-
-.wrap(columns)
---------------
-
-Format usage output to wrap at `columns` many columns.
-
-.help()
--------
-
-Return the generated usage string.
-
-.showHelp(fn=console.error)
----------------------------
-
-Print the usage data using `fn` for printing.
-
-.parse(args)
-------------
-
-Parse `args` instead of `process.argv`. Returns the `argv` object.
-
-.argv
------
-
-Get the arguments as a plain old object.
-
-Arguments without a corresponding flag show up in the `argv._` array.
-
-The script name or node command is available at `argv.$0` similarly to how `$0`
-works in bash or perl.
-
-parsing tricks
-==============
-
-stop parsing
-------------
-
-Use `--` to stop parsing flags and stuff the remainder into `argv._`.
-
-    $ node examples/reflect.js -a 1 -b 2 -- -c 3 -d 4
-    { _: [ '-c', '3', '-d', '4' ],
-      '$0': 'node ./examples/reflect.js',
-      a: 1,
-      b: 2 }
-
-negate fields
--------------
-
-If you want to explicity set a field to false instead of just leaving it
-undefined or to override a default you can do `--no-key`.
-
-    $ node examples/reflect.js -a --no-b
-    { _: [],
-      '$0': 'node ./examples/reflect.js',
-      a: true,
-      b: false }
-
-numbers
--------
-
-Every argument that looks like a number (`!isNaN(Number(arg))`) is converted to
-one. This way you can just `net.createConnection(argv.port)` and you can add
-numbers out of `argv` with `+` without having that mean concatenation,
-which is super frustrating.
-
-duplicates
-----------
-
-If you specify a flag multiple times it will get turned into an array containing
-all the values in order.
-
-    $ node examples/reflect.js -x 5 -x 8 -x 0
-    { _: [],
-      '$0': 'node ./examples/reflect.js',
-        x: [ 5, 8, 0 ] }
-
-dot notation
-------------
-
-When you use dots (`.`s) in argument names, an implicit object path is assumed.
-This lets you organize arguments into nested objects.
-
-     $ node examples/reflect.js --foo.bar.baz=33 --foo.quux=5
-     { _: [],
-       '$0': 'node ./examples/reflect.js',
-         foo: { bar: { baz: 33 }, quux: 5 } }
-
-installation
-============
-
-With [npm](http://github.com/isaacs/npm), just do:
-    npm install optimist
- 
-or clone this project on github:
-
-    git clone http://github.com/substack/node-optimist.git
-
-To run the tests with [expresso](http://github.com/visionmedia/expresso),
-just do:
-    
-    expresso
-
-inspired By
-===========
-
-This module is loosely inspired by Perl's
-[Getopt::Casual](http://search.cpan.org/~photo/Getopt-Casual-0.13.1/Casual.pm).
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/index.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/index.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/index.js	(revision 516)
@@ -1,3 +1,4 @@
 var path = require('path');
+var minimist = require('minimist');
 var wordwrap = require('wordwrap');
 
@@ -18,5 +19,5 @@
 
 var exports = module.exports = Argv;
-function Argv (args, cwd) {
+function Argv (processArgs, cwd) {
     var self = {};
     if (!cwd) cwd = process.cwd();
@@ -32,5 +33,5 @@
     ;
     
-    if (process.argv[1] == process.env._) {
+    if (process.env._ != undefined && process.argv[1] == process.env._) {
         self.$0 = process.env._.replace(
             path.dirname(process.execPath) + '/', ''
@@ -38,31 +39,33 @@
     }
     
-    var flags = { bools : {}, strings : {} };
+    var options = {
+        boolean: [],
+        string: [],
+        alias: {},
+        default: []
+    };
     
     self.boolean = function (bools) {
-        if (!Array.isArray(bools)) {
-            bools = [].slice.call(arguments);
-        }
-        
-        bools.forEach(function (name) {
-            flags.bools[name] = true;
-        });
-        
+        options.boolean.push.apply(options.boolean, [].concat(bools));
         return self;
     };
     
     self.string = function (strings) {
-        if (!Array.isArray(strings)) {
-            strings = [].slice.call(arguments);
-        }
-        
-        strings.forEach(function (name) {
-            flags.strings[name] = true;
-        });
-        
-        return self;
-    };
-    
-    var aliases = {};
+        options.string.push.apply(options.string, [].concat(strings));
+        return self;
+    };
+    
+    self.default = function (key, value) {
+        if (typeof key === 'object') {
+            Object.keys(key).forEach(function (k) {
+                self.default(k, key[k]);
+            });
+        }
+        else {
+            options.default[key] = value;
+        }
+        return self;
+    };
+    
     self.alias = function (x, y) {
         if (typeof x === 'object') {
@@ -71,15 +74,7 @@
             });
         }
-        else if (Array.isArray(y)) {
-            y.forEach(function (yy) {
-                self.alias(x, yy);
-            });
-        }
-        else {
-            var zs = (aliases[x] || []).concat(aliases[y] || []).concat(x, y);
-            aliases[x] = zs.filter(function (z) { return z != x });
-            aliases[y] = zs.filter(function (z) { return z != y });
-        }
-        
+        else {
+            options.alias[x] = (options.alias[x] || []).concat(y);
+        }
         return self;
     };
@@ -129,18 +124,4 @@
     };
     
-    var defaults = {};
-    self.default = function (key, value) {
-        if (typeof key === 'object') {
-            Object.keys(key).forEach(function (k) {
-                self.default(k, key[k]);
-            });
-        }
-        else {
-            defaults[key] = value;
-        }
-        
-        return self;
-    };
-    
     var descriptions = {};
     self.describe = function (key, desc) {
@@ -157,5 +138,5 @@
     
     self.parse = function (args) {
-        return Argv(args).argv;
+        return parseArgs(args);
     };
     
@@ -204,5 +185,5 @@
             Object.keys(descriptions)
             .concat(Object.keys(demanded))
-            .concat(Object.keys(defaults))
+            .concat(Object.keys(options.default))
             .reduce(function (acc, key) {
                 if (key !== '_') acc[key] = true;
@@ -218,5 +199,5 @@
         
         var switches = keys.reduce(function (acc, key) {
-            acc[key] = [ key ].concat(aliases[key] || [])
+            acc[key] = [ key ].concat(options.alias[key] || [])
                 .map(function (sw) {
                     return (sw.length > 1 ? '--' : '-') + sw
@@ -255,6 +236,6 @@
             var type = null;
             
-            if (flags.bools[key]) type = '[boolean]';
-            if (flags.strings[key]) type = '[string]';
+            if (options.boolean[key]) type = '[boolean]';
+            if (options.string[key]) type = '[string]';
             
             if (!wrap && dpadding.length > 0) {
@@ -269,6 +250,6 @@
                     : null
                 ,
-                defaults[key] !== undefined
-                    ? '[default: ' + JSON.stringify(defaults[key]) + ']'
+                options.default[key] !== undefined
+                    ? '[default: ' + JSON.stringify(options.default[key]) + ']'
                     : null
                 ,
@@ -299,105 +280,11 @@
     
     Object.defineProperty(self, 'argv', {
-        get : parseArgs,
+        get : function () { return parseArgs(processArgs) },
         enumerable : true,
     });
     
-    function parseArgs () {
-        var argv = { _ : [], $0 : self.$0 };
-        Object.keys(flags.bools).forEach(function (key) {
-            setArg(key, defaults[key] || false);
-        });
-        
-        function setArg (key, val) {
-            var num = Number(val);
-            var value = typeof val !== 'string' || isNaN(num) ? val : num;
-            if (flags.strings[key]) value = val;
-            
-            setKey(argv, key.split('.'), value);
-            
-            (aliases[key] || []).forEach(function (x) {
-                argv[x] = argv[key];
-            });
-        }
-        
-        for (var i = 0; i < args.length; i++) {
-            var arg = args[i];
-            
-            if (arg === '--') {
-                argv._.push.apply(argv._, args.slice(i + 1));
-                break;
-            }
-            else if (arg.match(/^--.+=/)) {
-                var m = arg.match(/^--([^=]+)=(.*)/);
-                setArg(m[1], m[2]);
-            }
-            else if (arg.match(/^--no-.+/)) {
-                var key = arg.match(/^--no-(.+)/)[1];
-                setArg(key, false);
-            }
-            else if (arg.match(/^--.+/)) {
-                var key = arg.match(/^--(.+)/)[1];
-                var next = args[i + 1];
-                if (next !== undefined && !next.match(/^-/)
-                && !flags.bools[key]
-                && (aliases[key] ? !flags.bools[aliases[key]] : true)) {
-                    setArg(key, next);
-                    i++;
-                }
-                else if (/^(true|false)$/.test(next)) {
-                    setArg(key, next === 'true');
-                    i++;
-                }
-                else {
-                    setArg(key, true);
-                }
-            }
-            else if (arg.match(/^-[^-]+/)) {
-                var letters = arg.slice(1,-1).split('');
-                
-                var broken = false;
-                for (var j = 0; j < letters.length; j++) {
-                    if (letters[j+1] && letters[j+1].match(/\W/)) {
-                        setArg(letters[j], arg.slice(j+2));
-                        broken = true;
-                        break;
-                    }
-                    else {
-                        setArg(letters[j], true);
-                    }
-                }
-                
-                if (!broken) {
-                    var key = arg.slice(-1)[0];
-                    
-                    if (args[i+1] && !args[i+1].match(/^-/)
-                    && !flags.bools[key]
-                    && (aliases[key] ? !flags.bools[aliases[key]] : true)) {
-                        setArg(key, args[i+1]);
-                        i++;
-                    }
-                    else if (args[i+1] && /true|false/.test(args[i+1])) {
-                        setArg(key, args[i+1] === 'true');
-                        i++;
-                    }
-                    else {
-                        setArg(key, true);
-                    }
-                }
-            }
-            else {
-                var n = Number(arg);
-                argv._.push(flags.strings['_'] || isNaN(n) ? arg : n);
-            }
-        }
-        
-        Object.keys(defaults).forEach(function (key) {
-            if (!(key in argv)) {
-                argv[key] = defaults[key];
-                if (key in aliases) {
-                    argv[aliases[key]] = defaults[key];
-                }
-            }
-        });
+    function parseArgs (args) {
+        var argv = minimist(args, options);
+        argv.$0 = self.$0;
         
         if (demanded._ && argv._.length < demanded._) {
@@ -455,21 +342,2 @@
     return p.match(/^[.\/]/) ? p : './' + p;
 };
-
-function setKey (obj, keys, value) {
-    var o = obj;
-    keys.slice(0,-1).forEach(function (key) {
-        if (o[key] === undefined) o[key] = {};
-        o = o[key];
-    });
-    
-    var key = keys[keys.length - 1];
-    if (o[key] === undefined || typeof o[key] === 'boolean') {
-        o[key] = value;
-    }
-    else if (Array.isArray(o[key])) {
-        o[key].push(value);
-    }
-    else {
-        o[key] = [ o[key], value ];
-    }
-}
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/.travis.yml
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/.travis.yml	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/.travis.yml	(revision 516)
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+  - "0.8"
+  - "0.10"
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/LICENSE
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/LICENSE	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/LICENSE	(revision 516)
@@ -0,0 +1,18 @@
+This software is released under the MIT license:
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/example/parse.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/example/parse.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/example/parse.js	(revision 516)
@@ -0,0 +1,2 @@
+var argv = require('../')(process.argv.slice(2));
+console.dir(argv);
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/index.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/index.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/index.js	(revision 516)
@@ -0,0 +1,187 @@
+module.exports = function (args, opts) {
+    if (!opts) opts = {};
+    
+    var flags = { bools : {}, strings : {} };
+    
+    [].concat(opts['boolean']).filter(Boolean).forEach(function (key) {
+        flags.bools[key] = true;
+    });
+    
+    [].concat(opts.string).filter(Boolean).forEach(function (key) {
+        flags.strings[key] = true;
+    });
+    
+    var aliases = {};
+    Object.keys(opts.alias || {}).forEach(function (key) {
+        aliases[key] = [].concat(opts.alias[key]);
+        aliases[key].forEach(function (x) {
+            aliases[x] = [key].concat(aliases[key].filter(function (y) {
+                return x !== y;
+            }));
+        });
+    });
+    
+    var defaults = opts['default'] || {};
+    
+    var argv = { _ : [] };
+    Object.keys(flags.bools).forEach(function (key) {
+        setArg(key, defaults[key] === undefined ? false : defaults[key]);
+    });
+    
+    var notFlags = [];
+
+    if (args.indexOf('--') !== -1) {
+        notFlags = args.slice(args.indexOf('--')+1);
+        args = args.slice(0, args.indexOf('--'));
+    }
+
+    function setArg (key, val) {
+        var value = !flags.strings[key] && isNumber(val)
+            ? Number(val) : val
+        ;
+        setKey(argv, key.split('.'), value);
+        
+        (aliases[key] || []).forEach(function (x) {
+            setKey(argv, x.split('.'), value);
+        });
+    }
+    
+    for (var i = 0; i < args.length; i++) {
+        var arg = args[i];
+        
+        if (/^--.+=/.test(arg)) {
+            // Using [\s\S] instead of . because js doesn't support the
+            // 'dotall' regex modifier. See:
+            // http://stackoverflow.com/a/1068308/13216
+            var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
+            setArg(m[1], m[2]);
+        }
+        else if (/^--no-.+/.test(arg)) {
+            var key = arg.match(/^--no-(.+)/)[1];
+            setArg(key, false);
+        }
+        else if (/^--.+/.test(arg)) {
+            var key = arg.match(/^--(.+)/)[1];
+            var next = args[i + 1];
+            if (next !== undefined && !/^-/.test(next)
+            && !flags.bools[key]
+            && (aliases[key] ? !flags.bools[aliases[key]] : true)) {
+                setArg(key, next);
+                i++;
+            }
+            else if (/^(true|false)$/.test(next)) {
+                setArg(key, next === 'true');
+                i++;
+            }
+            else {
+                setArg(key, flags.strings[key] ? '' : true);
+            }
+        }
+        else if (/^-[^-]+/.test(arg)) {
+            var letters = arg.slice(1,-1).split('');
+            
+            var broken = false;
+            for (var j = 0; j < letters.length; j++) {
+                var next = arg.slice(j+2);
+                
+                if (next === '-') {
+                    setArg(letters[j], next)
+                    continue;
+                }
+                
+                if (/[A-Za-z]/.test(letters[j])
+                && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
+                    setArg(letters[j], next);
+                    broken = true;
+                    break;
+                }
+                
+                if (letters[j+1] && letters[j+1].match(/\W/)) {
+                    setArg(letters[j], arg.slice(j+2));
+                    broken = true;
+                    break;
+                }
+                else {
+                    setArg(letters[j], flags.strings[letters[j]] ? '' : true);
+                }
+            }
+            
+            var key = arg.slice(-1)[0];
+            if (!broken && key !== '-') {
+                if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1])
+                && !flags.bools[key]
+                && (aliases[key] ? !flags.bools[aliases[key]] : true)) {
+                    setArg(key, args[i+1]);
+                    i++;
+                }
+                else if (args[i+1] && /true|false/.test(args[i+1])) {
+                    setArg(key, args[i+1] === 'true');
+                    i++;
+                }
+                else {
+                    setArg(key, flags.strings[key] ? '' : true);
+                }
+            }
+        }
+        else {
+            argv._.push(
+                flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)
+            );
+        }
+    }
+    
+    Object.keys(defaults).forEach(function (key) {
+        if (!hasKey(argv, key.split('.'))) {
+            setKey(argv, key.split('.'), defaults[key]);
+            
+            (aliases[key] || []).forEach(function (x) {
+                setKey(argv, x.split('.'), defaults[key]);
+            });
+        }
+    });
+    
+    notFlags.forEach(function(key) {
+        argv._.push(key);
+    });
+
+    return argv;
+};
+
+function hasKey (obj, keys) {
+    var o = obj;
+    keys.slice(0,-1).forEach(function (key) {
+        o = (o[key] || {});
+    });
+
+    var key = keys[keys.length - 1];
+    return key in o;
+}
+
+function setKey (obj, keys, value) {
+    var o = obj;
+    keys.slice(0,-1).forEach(function (key) {
+        if (o[key] === undefined) o[key] = {};
+        o = o[key];
+    });
+    
+    var key = keys[keys.length - 1];
+    if (o[key] === undefined || typeof o[key] === 'boolean') {
+        o[key] = value;
+    }
+    else if (Array.isArray(o[key])) {
+        o[key].push(value);
+    }
+    else {
+        o[key] = [ o[key], value ];
+    }
+}
+
+function isNumber (x) {
+    if (typeof x === 'number') return true;
+    if (/^0x[0-9a-f]+$/i.test(x)) return true;
+    return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x);
+}
+
+function longest (xs) {
+    return Math.max.apply(null, xs.map(function (x) { return x.length }));
+}
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/package.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/package.json	(revision 516)
@@ -0,0 +1,50 @@
+{
+  "name": "minimist",
+  "version": "0.0.8",
+  "description": "parse argument options",
+  "main": "index.js",
+  "devDependencies": {
+    "tape": "~1.0.4",
+    "tap": "~0.4.0"
+  },
+  "scripts": {
+    "test": "tap test/*.js"
+  },
+  "testling": {
+    "files": "test/*.js",
+    "browsers": [
+      "ie/6..latest",
+      "ff/5",
+      "firefox/latest",
+      "chrome/10",
+      "chrome/latest",
+      "safari/5.1",
+      "safari/latest",
+      "opera/12"
+    ]
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/substack/minimist.git"
+  },
+  "homepage": "https://github.com/substack/minimist",
+  "keywords": [
+    "argv",
+    "getopt",
+    "parser",
+    "optimist"
+  ],
+  "author": {
+    "name": "James Halliday",
+    "email": "mail@substack.net",
+    "url": "http://substack.net"
+  },
+  "license": "MIT",
+  "readme": "# minimist\n\nparse argument options\n\nThis module is the guts of optimist's argument parser without all the\nfanciful decoration.\n\n[![browser support](https://ci.testling.com/substack/minimist.png)](http://ci.testling.com/substack/minimist)\n\n[![build status](https://secure.travis-ci.org/substack/minimist.png)](http://travis-ci.org/substack/minimist)\n\n# example\n\n``` js\nvar argv = require('minimist')(process.argv.slice(2));\nconsole.dir(argv);\n```\n\n```\n$ node example/parse.js -a beep -b boop\n{ _: [], a: 'beep', b: 'boop' }\n```\n\n```\n$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz\n{ _: [ 'foo', 'bar', 'baz' ],\n  x: 3,\n  y: 4,\n  n: 5,\n  a: true,\n  b: true,\n  c: true,\n  beep: 'boop' }\n```\n\n# methods\n\n``` js\nvar parseArgs = require('minimist')\n```\n\n## var argv = parseArgs(args, opts={})\n\nReturn an argument object `argv` populated with the array arguments from `args`.\n\n`argv._` contains all the arguments that didn't have an option associated with\nthem.\n\nNumeric-looking arguments will be returned as numbers unless `opts.string` or\n`opts.boolean` is set for that argument name.\n\nAny arguments after `'--'` will not be parsed and will end up in `argv._`.\n\noptions can be:\n\n* `opts.string` - a string or array of strings argument names to always treat as\nstrings\n* `opts.boolean` - a string or array of strings to always treat as booleans\n* `opts.alias` - an object mapping string names to strings or arrays of string\nargument names to use as aliases\n* `opts.default` - an object mapping string argument names to default values\n\n# install\n\nWith [npm](https://npmjs.org) do:\n\n```\nnpm install minimist\n```\n\n# license\n\nMIT\n",
+  "readmeFilename": "readme.markdown",
+  "bugs": {
+    "url": "https://github.com/substack/minimist/issues"
+  },
+  "_id": "minimist@0.0.8",
+  "_from": "minimist@~0.0.1"
+}
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/readme.markdown
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/readme.markdown	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/readme.markdown	(revision 516)
@@ -0,0 +1,73 @@
+# minimist
+
+parse argument options
+
+This module is the guts of optimist's argument parser without all the
+fanciful decoration.
+
+[![browser support](https://ci.testling.com/substack/minimist.png)](http://ci.testling.com/substack/minimist)
+
+[![build status](https://secure.travis-ci.org/substack/minimist.png)](http://travis-ci.org/substack/minimist)
+
+# example
+
+``` js
+var argv = require('minimist')(process.argv.slice(2));
+console.dir(argv);
+```
+
+```
+$ node example/parse.js -a beep -b boop
+{ _: [], a: 'beep', b: 'boop' }
+```
+
+```
+$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz
+{ _: [ 'foo', 'bar', 'baz' ],
+  x: 3,
+  y: 4,
+  n: 5,
+  a: true,
+  b: true,
+  c: true,
+  beep: 'boop' }
+```
+
+# methods
+
+``` js
+var parseArgs = require('minimist')
+```
+
+## var argv = parseArgs(args, opts={})
+
+Return an argument object `argv` populated with the array arguments from `args`.
+
+`argv._` contains all the arguments that didn't have an option associated with
+them.
+
+Numeric-looking arguments will be returned as numbers unless `opts.string` or
+`opts.boolean` is set for that argument name.
+
+Any arguments after `'--'` will not be parsed and will end up in `argv._`.
+
+options can be:
+
+* `opts.string` - a string or array of strings argument names to always treat as
+strings
+* `opts.boolean` - a string or array of strings to always treat as booleans
+* `opts.alias` - an object mapping string names to strings or arrays of string
+argument names to use as aliases
+* `opts.default` - an object mapping string argument names to default values
+
+# install
+
+With [npm](https://npmjs.org) do:
+
+```
+npm install minimist
+```
+
+# license
+
+MIT
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/dash.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/dash.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/dash.js	(revision 516)
@@ -0,0 +1,24 @@
+var parse = require('../');
+var test = require('tape');
+
+test('-', function (t) {
+    t.plan(5);
+    t.deepEqual(parse([ '-n', '-' ]), { n: '-', _: [] });
+    t.deepEqual(parse([ '-' ]), { _: [ '-' ] });
+    t.deepEqual(parse([ '-f-' ]), { f: '-', _: [] });
+    t.deepEqual(
+        parse([ '-b', '-' ], { boolean: 'b' }),
+        { b: true, _: [ '-' ] }
+    );
+    t.deepEqual(
+        parse([ '-s', '-' ], { string: 's' }),
+        { s: '-', _: [] }
+    );
+});
+
+test('-a -- b', function (t) {
+    t.plan(3);
+    t.deepEqual(parse([ '-a', '--', 'b' ]), { a: true, _: [ 'b' ] });
+    t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] });
+    t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] });
+});
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/default_bool.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/default_bool.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/default_bool.js	(revision 516)
@@ -0,0 +1,20 @@
+var test = require('tape');
+var parse = require('../');
+
+test('boolean default true', function (t) {
+    var argv = parse([], {
+        boolean: 'sometrue',
+        default: { sometrue: true }
+    });
+    t.equal(argv.sometrue, true);
+    t.end();
+});
+
+test('boolean default false', function (t) {
+    var argv = parse([], {
+        boolean: 'somefalse',
+        default: { somefalse: false }
+    });
+    t.equal(argv.somefalse, false);
+    t.end();
+});
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/dotted.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/dotted.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/dotted.js	(revision 516)
@@ -0,0 +1,16 @@
+var parse = require('../');
+var test = require('tape');
+
+test('dotted alias', function (t) {
+    var argv = parse(['--a.b', '22'], {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}});
+    t.equal(argv.a.b, 22);
+    t.equal(argv.aa.bb, 22);
+    t.end();
+});
+
+test('dotted default', function (t) {
+    var argv = parse('', {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}});
+    t.equal(argv.a.b, 11);
+    t.equal(argv.aa.bb, 11);
+    t.end();
+});
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/long.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/long.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/long.js	(revision 516)
@@ -0,0 +1,31 @@
+var test = require('tape');
+var parse = require('../');
+
+test('long opts', function (t) {
+    t.deepEqual(
+        parse([ '--bool' ]),
+        { bool : true, _ : [] },
+        'long boolean'
+    );
+    t.deepEqual(
+        parse([ '--pow', 'xixxle' ]),
+        { pow : 'xixxle', _ : [] },
+        'long capture sp'
+    );
+    t.deepEqual(
+        parse([ '--pow=xixxle' ]),
+        { pow : 'xixxle', _ : [] },
+        'long capture eq'
+    );
+    t.deepEqual(
+        parse([ '--host', 'localhost', '--port', '555' ]),
+        { host : 'localhost', port : 555, _ : [] },
+        'long captures sp'
+    );
+    t.deepEqual(
+        parse([ '--host=localhost', '--port=555' ]),
+        { host : 'localhost', port : 555, _ : [] },
+        'long captures eq'
+    );
+    t.end();
+});
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/parse.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/parse.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/parse.js	(revision 516)
@@ -0,0 +1,318 @@
+var parse = require('../');
+var test = require('tape');
+
+test('parse args', function (t) {
+    t.deepEqual(
+        parse([ '--no-moo' ]),
+        { moo : false, _ : [] },
+        'no'
+    );
+    t.deepEqual(
+        parse([ '-v', 'a', '-v', 'b', '-v', 'c' ]),
+        { v : ['a','b','c'], _ : [] },
+        'multi'
+    );
+    t.end();
+});
+ 
+test('comprehensive', function (t) {
+    t.deepEqual(
+        parse([
+            '--name=meowmers', 'bare', '-cats', 'woo',
+            '-h', 'awesome', '--multi=quux',
+            '--key', 'value',
+            '-b', '--bool', '--no-meep', '--multi=baz',
+            '--', '--not-a-flag', 'eek'
+        ]),
+        {
+            c : true,
+            a : true,
+            t : true,
+            s : 'woo',
+            h : 'awesome',
+            b : true,
+            bool : true,
+            key : 'value',
+            multi : [ 'quux', 'baz' ],
+            meep : false,
+            name : 'meowmers',
+            _ : [ 'bare', '--not-a-flag', 'eek' ]
+        }
+    );
+    t.end();
+});
+
+test('nums', function (t) {
+    var argv = parse([
+        '-x', '1234',
+        '-y', '5.67',
+        '-z', '1e7',
+        '-w', '10f',
+        '--hex', '0xdeadbeef',
+        '789'
+    ]);
+    t.deepEqual(argv, {
+        x : 1234,
+        y : 5.67,
+        z : 1e7,
+        w : '10f',
+        hex : 0xdeadbeef,
+        _ : [ 789 ]
+    });
+    t.deepEqual(typeof argv.x, 'number');
+    t.deepEqual(typeof argv.y, 'number');
+    t.deepEqual(typeof argv.z, 'number');
+    t.deepEqual(typeof argv.w, 'string');
+    t.deepEqual(typeof argv.hex, 'number');
+    t.deepEqual(typeof argv._[0], 'number');
+    t.end();
+});
+
+test('flag boolean', function (t) {
+    var argv = parse([ '-t', 'moo' ], { boolean: 't' });
+    t.deepEqual(argv, { t : true, _ : [ 'moo' ] });
+    t.deepEqual(typeof argv.t, 'boolean');
+    t.end();
+});
+
+test('flag boolean value', function (t) {
+    var argv = parse(['--verbose', 'false', 'moo', '-t', 'true'], {
+        boolean: [ 't', 'verbose' ],
+        default: { verbose: true }
+    });
+    
+    t.deepEqual(argv, {
+        verbose: false,
+        t: true,
+        _: ['moo']
+    });
+    
+    t.deepEqual(typeof argv.verbose, 'boolean');
+    t.deepEqual(typeof argv.t, 'boolean');
+    t.end();
+});
+
+test('flag boolean default false', function (t) {
+    var argv = parse(['moo'], {
+        boolean: ['t', 'verbose'],
+        default: { verbose: false, t: false }
+    });
+    
+    t.deepEqual(argv, {
+        verbose: false,
+        t: false,
+        _: ['moo']
+    });
+    
+    t.deepEqual(typeof argv.verbose, 'boolean');
+    t.deepEqual(typeof argv.t, 'boolean');
+    t.end();
+
+});
+
+test('boolean groups', function (t) {
+    var argv = parse([ '-x', '-z', 'one', 'two', 'three' ], {
+        boolean: ['x','y','z']
+    });
+    
+    t.deepEqual(argv, {
+        x : true,
+        y : false,
+        z : true,
+        _ : [ 'one', 'two', 'three' ]
+    });
+    
+    t.deepEqual(typeof argv.x, 'boolean');
+    t.deepEqual(typeof argv.y, 'boolean');
+    t.deepEqual(typeof argv.z, 'boolean');
+    t.end();
+});
+
+test('newlines in params' , function (t) {
+    var args = parse([ '-s', "X\nX" ])
+    t.deepEqual(args, { _ : [], s : "X\nX" });
+    
+    // reproduce in bash:
+    // VALUE="new
+    // line"
+    // node program.js --s="$VALUE"
+    args = parse([ "--s=X\nX" ])
+    t.deepEqual(args, { _ : [], s : "X\nX" });
+    t.end();
+});
+
+test('strings' , function (t) {
+    var s = parse([ '-s', '0001234' ], { string: 's' }).s;
+    t.equal(s, '0001234');
+    t.equal(typeof s, 'string');
+    
+    var x = parse([ '-x', '56' ], { string: 'x' }).x;
+    t.equal(x, '56');
+    t.equal(typeof x, 'string');
+    t.end();
+});
+
+test('stringArgs', function (t) {
+    var s = parse([ '  ', '  ' ], { string: '_' })._;
+    t.same(s.length, 2);
+    t.same(typeof s[0], 'string');
+    t.same(s[0], '  ');
+    t.same(typeof s[1], 'string');
+    t.same(s[1], '  ');
+    t.end();
+});
+
+test('empty strings', function(t) {
+    var s = parse([ '-s' ], { string: 's' }).s;
+    t.equal(s, '');
+    t.equal(typeof s, 'string');
+
+    var str = parse([ '--str' ], { string: 'str' }).str;
+    t.equal(str, '');
+    t.equal(typeof str, 'string');
+
+    var letters = parse([ '-art' ], {
+        string: [ 'a', 't' ]
+    });
+
+    t.equal(letters.a, '');
+    t.equal(letters.r, true);
+    t.equal(letters.t, '');
+
+    t.end();
+});
+
+
+test('slashBreak', function (t) {
+    t.same(
+        parse([ '-I/foo/bar/baz' ]),
+        { I : '/foo/bar/baz', _ : [] }
+    );
+    t.same(
+        parse([ '-xyz/foo/bar/baz' ]),
+        { x : true, y : true, z : '/foo/bar/baz', _ : [] }
+    );
+    t.end();
+});
+
+test('alias', function (t) {
+    var argv = parse([ '-f', '11', '--zoom', '55' ], {
+        alias: { z: 'zoom' }
+    });
+    t.equal(argv.zoom, 55);
+    t.equal(argv.z, argv.zoom);
+    t.equal(argv.f, 11);
+    t.end();
+});
+
+test('multiAlias', function (t) {
+    var argv = parse([ '-f', '11', '--zoom', '55' ], {
+        alias: { z: [ 'zm', 'zoom' ] }
+    });
+    t.equal(argv.zoom, 55);
+    t.equal(argv.z, argv.zoom);
+    t.equal(argv.z, argv.zm);
+    t.equal(argv.f, 11);
+    t.end();
+});
+
+test('nested dotted objects', function (t) {
+    var argv = parse([
+        '--foo.bar', '3', '--foo.baz', '4',
+        '--foo.quux.quibble', '5', '--foo.quux.o_O',
+        '--beep.boop'
+    ]);
+    
+    t.same(argv.foo, {
+        bar : 3,
+        baz : 4,
+        quux : {
+            quibble : 5,
+            o_O : true
+        }
+    });
+    t.same(argv.beep, { boop : true });
+    t.end();
+});
+
+test('boolean and alias with chainable api', function (t) {
+    var aliased = [ '-h', 'derp' ];
+    var regular = [ '--herp',  'derp' ];
+    var opts = {
+        herp: { alias: 'h', boolean: true }
+    };
+    var aliasedArgv = parse(aliased, {
+        boolean: 'herp',
+        alias: { h: 'herp' }
+    });
+    var propertyArgv = parse(regular, {
+        boolean: 'herp',
+        alias: { h: 'herp' }
+    });
+    var expected = {
+        herp: true,
+        h: true,
+        '_': [ 'derp' ]
+    };
+    
+    t.same(aliasedArgv, expected);
+    t.same(propertyArgv, expected); 
+    t.end();
+});
+
+test('boolean and alias with options hash', function (t) {
+    var aliased = [ '-h', 'derp' ];
+    var regular = [ '--herp', 'derp' ];
+    var opts = {
+        alias: { 'h': 'herp' },
+        boolean: 'herp'
+    };
+    var aliasedArgv = parse(aliased, opts);
+    var propertyArgv = parse(regular, opts);
+    var expected = {
+        herp: true,
+        h: true,
+        '_': [ 'derp' ]
+    };
+    t.same(aliasedArgv, expected);
+    t.same(propertyArgv, expected);
+    t.end();
+});
+
+test('boolean and alias using explicit true', function (t) {
+    var aliased = [ '-h', 'true' ];
+    var regular = [ '--herp',  'true' ];
+    var opts = {
+        alias: { h: 'herp' },
+        boolean: 'h'
+    };
+    var aliasedArgv = parse(aliased, opts);
+    var propertyArgv = parse(regular, opts);
+    var expected = {
+        herp: true,
+        h: true,
+        '_': [ ]
+    };
+
+    t.same(aliasedArgv, expected);
+    t.same(propertyArgv, expected); 
+    t.end();
+});
+
+// regression, see https://github.com/substack/node-optimist/issues/71
+test('boolean and --x=true', function(t) {
+    var parsed = parse(['--boool', '--other=true'], {
+        boolean: 'boool'
+    });
+
+    t.same(parsed.boool, true);
+    t.same(parsed.other, 'true');
+
+    parsed = parse(['--boool', '--other=false'], {
+        boolean: 'boool'
+    });
+    
+    t.same(parsed.boool, true);
+    t.same(parsed.other, 'false');
+    t.end();
+});
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/parse_modified.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/parse_modified.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/parse_modified.js	(revision 516)
@@ -0,0 +1,9 @@
+var parse = require('../');
+var test = require('tape');
+
+test('parse with modifier functions' , function (t) {
+    t.plan(1);
+    
+    var argv = parse([ '-b', '123' ], { boolean: 'b' });
+    t.deepEqual(argv, { b: true, _: ['123'] });
+});
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/short.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/short.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/short.js	(revision 516)
@@ -0,0 +1,67 @@
+var parse = require('../');
+var test = require('tape');
+
+test('numeric short args', function (t) {
+    t.plan(2);
+    t.deepEqual(parse([ '-n123' ]), { n: 123, _: [] });
+    t.deepEqual(
+        parse([ '-123', '456' ]),
+        { 1: true, 2: true, 3: 456, _: [] }
+    );
+});
+
+test('short', function (t) {
+    t.deepEqual(
+        parse([ '-b' ]),
+        { b : true, _ : [] },
+        'short boolean'
+    );
+    t.deepEqual(
+        parse([ 'foo', 'bar', 'baz' ]),
+        { _ : [ 'foo', 'bar', 'baz' ] },
+        'bare'
+    );
+    t.deepEqual(
+        parse([ '-cats' ]),
+        { c : true, a : true, t : true, s : true, _ : [] },
+        'group'
+    );
+    t.deepEqual(
+        parse([ '-cats', 'meow' ]),
+        { c : true, a : true, t : true, s : 'meow', _ : [] },
+        'short group next'
+    );
+    t.deepEqual(
+        parse([ '-h', 'localhost' ]),
+        { h : 'localhost', _ : [] },
+        'short capture'
+    );
+    t.deepEqual(
+        parse([ '-h', 'localhost', '-p', '555' ]),
+        { h : 'localhost', p : 555, _ : [] },
+        'short captures'
+    );
+    t.end();
+});
+ 
+test('mixed short bool and capture', function (t) {
+    t.same(
+        parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]),
+        {
+            f : true, p : 555, h : 'localhost',
+            _ : [ 'script.js' ]
+        }
+    );
+    t.end();
+});
+ 
+test('short and long', function (t) {
+    t.deepEqual(
+        parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]),
+        {
+            f : true, p : 555, h : 'localhost',
+            _ : [ 'script.js' ]
+        }
+    );
+    t.end();
+});
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/whitespace.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/whitespace.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/minimist/test/whitespace.js	(revision 516)
@@ -0,0 +1,8 @@
+var parse = require('../');
+var test = require('tape');
+
+test('whitespace should be whitespace' , function (t) {
+    t.plan(1);
+    var x = parse([ '-x', '\t' ]).x;
+    t.equal(x, '\t');
+});
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/wordwrap/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/wordwrap/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/node_modules/wordwrap/package.json	(revision 516)
@@ -42,8 +42,4 @@
   "homepage": "https://github.com/substack/node-wordwrap",
   "_id": "wordwrap@0.0.2",
-  "dist": {
-    "shasum": "0e59bfdfda36959a4255195af71166e90abb9a7f"
-  },
-  "_from": "wordwrap@0.0.2",
-  "_resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz"
+  "_from": "wordwrap@~0.0.2"
 }
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/package.json	(revision 516)
@@ -1,18 +1,14 @@
 {
   "name": "optimist",
-  "version": "0.3.5",
+  "version": "0.6.1",
   "description": "Light-weight option parsing with an argv hash. No optstrings attached.",
   "main": "./index.js",
-  "directories": {
-    "lib": ".",
-    "test": "test",
-    "example": "example"
-  },
   "dependencies": {
-    "wordwrap": "~0.0.2"
+    "wordwrap": "~0.0.2",
+    "minimist": "~0.0.1"
   },
   "devDependencies": {
     "hashish": "~0.0.4",
-    "tap": "~0.2.4"
+    "tap": "~0.4.0"
   },
   "scripts": {
@@ -41,15 +37,15 @@
     "node": ">=0.4"
   },
-  "readme": "optimist\n========\n\nOptimist is a node.js library for option parsing for people who hate option\nparsing. More specifically, this module is for people who like all the --bells\nand -whistlz of program usage but think optstrings are a waste of time.\n\nWith optimist, option parsing doesn't have to suck (as much).\n\n[![build status](https://secure.travis-ci.org/substack/node-optimist.png)](http://travis-ci.org/substack/node-optimist)\n\nexamples\n========\n\nWith Optimist, the options are just a hash! No optstrings attached.\n-------------------------------------------------------------------\n\nxup.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist').argv;\n\nif (argv.rif - 5 * argv.xup > 7.138) {\n    console.log('Buy more riffiwobbles');\n}\nelse {\n    console.log('Sell the xupptumblers');\n}\n````\n\n***\n\n    $ ./xup.js --rif=55 --xup=9.52\n    Buy more riffiwobbles\n    \n    $ ./xup.js --rif 12 --xup 8.1\n    Sell the xupptumblers\n\n![This one's optimistic.](http://substack.net/images/optimistic.png)\n\nBut wait! There's more! You can do short options:\n-------------------------------------------------\n \nshort.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist').argv;\nconsole.log('(%d,%d)', argv.x, argv.y);\n````\n\n***\n\n    $ ./short.js -x 10 -y 21\n    (10,21)\n\nAnd booleans, both long and short (and grouped):\n----------------------------------\n\nbool.js:\n\n````javascript\n#!/usr/bin/env node\nvar util = require('util');\nvar argv = require('optimist').argv;\n\nif (argv.s) {\n    util.print(argv.fr ? 'Le chat dit: ' : 'The cat says: ');\n}\nconsole.log(\n    (argv.fr ? 'miaou' : 'meow') + (argv.p ? '.' : '')\n);\n````\n\n***\n\n    $ ./bool.js -s\n    The cat says: meow\n    \n    $ ./bool.js -sp\n    The cat says: meow.\n\n    $ ./bool.js -sp --fr\n    Le chat dit: miaou.\n\nAnd non-hypenated options too! Just use `argv._`!\n-------------------------------------------------\n \nnonopt.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist').argv;\nconsole.log('(%d,%d)', argv.x, argv.y);\nconsole.log(argv._);\n````\n\n***\n\n    $ ./nonopt.js -x 6.82 -y 3.35 moo\n    (6.82,3.35)\n    [ 'moo' ]\n    \n    $ ./nonopt.js foo -x 0.54 bar -y 1.12 baz\n    (0.54,1.12)\n    [ 'foo', 'bar', 'baz' ]\n\nPlus, Optimist comes with .usage() and .demand()!\n-------------------------------------------------\n\ndivide.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n    .usage('Usage: $0 -x [num] -y [num]')\n    .demand(['x','y'])\n    .argv;\n\nconsole.log(argv.x / argv.y);\n````\n\n***\n \n    $ ./divide.js -x 55 -y 11\n    5\n    \n    $ node ./divide.js -x 4.91 -z 2.51\n    Usage: node ./divide.js -x [num] -y [num]\n\n    Options:\n      -x  [required]\n      -y  [required]\n\n    Missing required arguments: y\n\nEVEN MORE HOLY COW\n------------------\n\ndefault_singles.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n    .default('x', 10)\n    .default('y', 10)\n    .argv\n;\nconsole.log(argv.x + argv.y);\n````\n\n***\n\n    $ ./default_singles.js -x 5\n    15\n\ndefault_hash.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n    .default({ x : 10, y : 10 })\n    .argv\n;\nconsole.log(argv.x + argv.y);\n````\n\n***\n\n    $ ./default_hash.js -y 7\n    17\n\nAnd if you really want to get all descriptive about it...\n---------------------------------------------------------\n\nboolean_single.js\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n    .boolean('v')\n    .argv\n;\nconsole.dir(argv);\n````\n\n***\n\n    $ ./boolean_single.js -v foo bar baz\n    true\n    [ 'bar', 'baz', 'foo' ]\n\nboolean_double.js\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n    .boolean(['x','y','z'])\n    .argv\n;\nconsole.dir([ argv.x, argv.y, argv.z ]);\nconsole.dir(argv._);\n````\n\n***\n\n    $ ./boolean_double.js -x -z one two three\n    [ true, false, true ]\n    [ 'one', 'two', 'three' ]\n\nOptimist is here to help...\n---------------------------\n\nYou can describe parameters for help messages and set aliases. Optimist figures\nout how to format a handy help string automatically.\n\nline_count.js\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n    .usage('Count the lines in a file.\\nUsage: $0')\n    .demand('f')\n    .alias('f', 'file')\n    .describe('f', 'Load a file')\n    .argv\n;\n\nvar fs = require('fs');\nvar s = fs.createReadStream(argv.file);\n\nvar lines = 0;\ns.on('data', function (buf) {\n    lines += buf.toString().match(/\\n/g).length;\n});\n\ns.on('end', function () {\n    console.log(lines);\n});\n````\n\n***\n\n    $ node line_count.js\n    Count the lines in a file.\n    Usage: node ./line_count.js\n\n    Options:\n      -f, --file  Load a file  [required]\n\n    Missing required arguments: f\n\n    $ node line_count.js --file line_count.js \n    20\n    \n    $ node line_count.js -f line_count.js \n    20\n\nmethods\n=======\n\nBy itself,\n\n````javascript\nrequire('optimist').argv\n`````\n\nwill use `process.argv` array to construct the `argv` object.\n\nYou can pass in the `process.argv` yourself:\n\n````javascript\nrequire('optimist')([ '-x', '1', '-y', '2' ]).argv\n````\n\nor use .parse() to do the same thing:\n\n````javascript\nrequire('optimist').parse([ '-x', '1', '-y', '2' ])\n````\n\nThe rest of these methods below come in just before the terminating `.argv`.\n\n.alias(key, alias)\n------------------\n\nSet key names as equivalent such that updates to a key will propagate to aliases\nand vice-versa.\n\nOptionally `.alias()` can take an object that maps keys to aliases.\n\n.default(key, value)\n--------------------\n\nSet `argv[key]` to `value` if no option was specified on `process.argv`.\n\nOptionally `.default()` can take an object that maps keys to default values.\n\n.demand(key)\n------------\n\nIf `key` is a string, show the usage information and exit if `key` wasn't\nspecified in `process.argv`.\n\nIf `key` is a number, demand at least as many non-option arguments, which show\nup in `argv._`.\n\nIf `key` is an Array, demand each element.\n\n.describe(key, desc)\n--------------------\n\nDescribe a `key` for the generated usage information.\n\nOptionally `.describe()` can take an object that maps keys to descriptions.\n\n.options(key, opt)\n------------------\n\nInstead of chaining together `.alias().demand().default()`, you can specify\nkeys in `opt` for each of the chainable methods.\n\nFor example:\n\n````javascript\nvar argv = require('optimist')\n    .options('f', {\n        alias : 'file',\n        default : '/etc/passwd',\n    })\n    .argv\n;\n````\n\nis the same as\n\n````javascript\nvar argv = require('optimist')\n    .alias('f', 'file')\n    .default('f', '/etc/passwd')\n    .argv\n;\n````\n\nOptionally `.options()` can take an object that maps keys to `opt` parameters.\n\n.usage(message)\n---------------\n\nSet a usage message to show which commands to use. Inside `message`, the string\n`$0` will get interpolated to the current script name or node command for the\npresent script similar to how `$0` works in bash or perl.\n\n.check(fn)\n----------\n\nCheck that certain conditions are met in the provided arguments.\n\nIf `fn` throws or returns `false`, show the thrown error, usage information, and\nexit.\n\n.boolean(key)\n-------------\n\nInterpret `key` as a boolean. If a non-flag option follows `key` in\n`process.argv`, that string won't get set as the value of `key`.\n\nIf `key` never shows up as a flag in `process.arguments`, `argv[key]` will be\n`false`.\n\nIf `key` is an Array, interpret all the elements as booleans.\n\n.string(key)\n------------\n\nTell the parser logic not to interpret `key` as a number or boolean.\nThis can be useful if you need to preserve leading zeros in an input.\n\nIf `key` is an Array, interpret all the elements as strings.\n\n.wrap(columns)\n--------------\n\nFormat usage output to wrap at `columns` many columns.\n\n.help()\n-------\n\nReturn the generated usage string.\n\n.showHelp(fn=console.error)\n---------------------------\n\nPrint the usage data using `fn` for printing.\n\n.parse(args)\n------------\n\nParse `args` instead of `process.argv`. Returns the `argv` object.\n\n.argv\n-----\n\nGet the arguments as a plain old object.\n\nArguments without a corresponding flag show up in the `argv._` array.\n\nThe script name or node command is available at `argv.$0` similarly to how `$0`\nworks in bash or perl.\n\nparsing tricks\n==============\n\nstop parsing\n------------\n\nUse `--` to stop parsing flags and stuff the remainder into `argv._`.\n\n    $ node examples/reflect.js -a 1 -b 2 -- -c 3 -d 4\n    { _: [ '-c', '3', '-d', '4' ],\n      '$0': 'node ./examples/reflect.js',\n      a: 1,\n      b: 2 }\n\nnegate fields\n-------------\n\nIf you want to explicity set a field to false instead of just leaving it\nundefined or to override a default you can do `--no-key`.\n\n    $ node examples/reflect.js -a --no-b\n    { _: [],\n      '$0': 'node ./examples/reflect.js',\n      a: true,\n      b: false }\n\nnumbers\n-------\n\nEvery argument that looks like a number (`!isNaN(Number(arg))`) is converted to\none. This way you can just `net.createConnection(argv.port)` and you can add\nnumbers out of `argv` with `+` without having that mean concatenation,\nwhich is super frustrating.\n\nduplicates\n----------\n\nIf you specify a flag multiple times it will get turned into an array containing\nall the values in order.\n\n    $ node examples/reflect.js -x 5 -x 8 -x 0\n    { _: [],\n      '$0': 'node ./examples/reflect.js',\n        x: [ 5, 8, 0 ] }\n\ndot notation\n------------\n\nWhen you use dots (`.`s) in argument names, an implicit object path is assumed.\nThis lets you organize arguments into nested objects.\n\n     $ node examples/reflect.js --foo.bar.baz=33 --foo.quux=5\n     { _: [],\n       '$0': 'node ./examples/reflect.js',\n         foo: { bar: { baz: 33 }, quux: 5 } }\n\ninstallation\n============\n\nWith [npm](http://github.com/isaacs/npm), just do:\n    npm install optimist\n \nor clone this project on github:\n\n    git clone http://github.com/substack/node-optimist.git\n\nTo run the tests with [expresso](http://github.com/visionmedia/expresso),\njust do:\n    \n    expresso\n\ninspired By\n===========\n\nThis module is loosely inspired by Perl's\n[Getopt::Casual](http://search.cpan.org/~photo/Getopt-Casual-0.13.1/Casual.pm).\n",
-  "readmeFilename": "README.markdown",
+  "readme": "# DEPRECATION NOTICE\n\nI don't want to maintain this module anymore since I just use\n[minimist](https://npmjs.org/package/minimist), the argument parsing engine,\ndirectly instead nowadays.\n\nSee [yargs](https://github.com/chevex/yargs) for the modern, pirate-themed\nsuccessor to optimist.\n\n[![yarrrrrrrgs!](http://i.imgur.com/4WFGVJ9.png)](https://github.com/chevex/yargs)\n\nYou should also consider [nomnom](https://github.com/harthur/nomnom).\n\noptimist\n========\n\nOptimist is a node.js library for option parsing for people who hate option\nparsing. More specifically, this module is for people who like all the --bells\nand -whistlz of program usage but think optstrings are a waste of time.\n\nWith optimist, option parsing doesn't have to suck (as much).\n\n[![build status](https://secure.travis-ci.org/substack/node-optimist.png)](http://travis-ci.org/substack/node-optimist)\n\nexamples\n========\n\nWith Optimist, the options are just a hash! No optstrings attached.\n-------------------------------------------------------------------\n\nxup.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist').argv;\n\nif (argv.rif - 5 * argv.xup > 7.138) {\n    console.log('Buy more riffiwobbles');\n}\nelse {\n    console.log('Sell the xupptumblers');\n}\n````\n\n***\n\n    $ ./xup.js --rif=55 --xup=9.52\n    Buy more riffiwobbles\n    \n    $ ./xup.js --rif 12 --xup 8.1\n    Sell the xupptumblers\n\n![This one's optimistic.](http://substack.net/images/optimistic.png)\n\nBut wait! There's more! You can do short options:\n-------------------------------------------------\n \nshort.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist').argv;\nconsole.log('(%d,%d)', argv.x, argv.y);\n````\n\n***\n\n    $ ./short.js -x 10 -y 21\n    (10,21)\n\nAnd booleans, both long and short (and grouped):\n----------------------------------\n\nbool.js:\n\n````javascript\n#!/usr/bin/env node\nvar util = require('util');\nvar argv = require('optimist').argv;\n\nif (argv.s) {\n    util.print(argv.fr ? 'Le chat dit: ' : 'The cat says: ');\n}\nconsole.log(\n    (argv.fr ? 'miaou' : 'meow') + (argv.p ? '.' : '')\n);\n````\n\n***\n\n    $ ./bool.js -s\n    The cat says: meow\n    \n    $ ./bool.js -sp\n    The cat says: meow.\n\n    $ ./bool.js -sp --fr\n    Le chat dit: miaou.\n\nAnd non-hypenated options too! Just use `argv._`!\n-------------------------------------------------\n \nnonopt.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist').argv;\nconsole.log('(%d,%d)', argv.x, argv.y);\nconsole.log(argv._);\n````\n\n***\n\n    $ ./nonopt.js -x 6.82 -y 3.35 moo\n    (6.82,3.35)\n    [ 'moo' ]\n    \n    $ ./nonopt.js foo -x 0.54 bar -y 1.12 baz\n    (0.54,1.12)\n    [ 'foo', 'bar', 'baz' ]\n\nPlus, Optimist comes with .usage() and .demand()!\n-------------------------------------------------\n\ndivide.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n    .usage('Usage: $0 -x [num] -y [num]')\n    .demand(['x','y'])\n    .argv;\n\nconsole.log(argv.x / argv.y);\n````\n\n***\n \n    $ ./divide.js -x 55 -y 11\n    5\n    \n    $ node ./divide.js -x 4.91 -z 2.51\n    Usage: node ./divide.js -x [num] -y [num]\n\n    Options:\n      -x  [required]\n      -y  [required]\n\n    Missing required arguments: y\n\nEVEN MORE HOLY COW\n------------------\n\ndefault_singles.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n    .default('x', 10)\n    .default('y', 10)\n    .argv\n;\nconsole.log(argv.x + argv.y);\n````\n\n***\n\n    $ ./default_singles.js -x 5\n    15\n\ndefault_hash.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n    .default({ x : 10, y : 10 })\n    .argv\n;\nconsole.log(argv.x + argv.y);\n````\n\n***\n\n    $ ./default_hash.js -y 7\n    17\n\nAnd if you really want to get all descriptive about it...\n---------------------------------------------------------\n\nboolean_single.js\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n    .boolean('v')\n    .argv\n;\nconsole.dir(argv);\n````\n\n***\n\n    $ ./boolean_single.js -v foo bar baz\n    true\n    [ 'bar', 'baz', 'foo' ]\n\nboolean_double.js\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n    .boolean(['x','y','z'])\n    .argv\n;\nconsole.dir([ argv.x, argv.y, argv.z ]);\nconsole.dir(argv._);\n````\n\n***\n\n    $ ./boolean_double.js -x -z one two three\n    [ true, false, true ]\n    [ 'one', 'two', 'three' ]\n\nOptimist is here to help...\n---------------------------\n\nYou can describe parameters for help messages and set aliases. Optimist figures\nout how to format a handy help string automatically.\n\nline_count.js\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n    .usage('Count the lines in a file.\\nUsage: $0')\n    .demand('f')\n    .alias('f', 'file')\n    .describe('f', 'Load a file')\n    .argv\n;\n\nvar fs = require('fs');\nvar s = fs.createReadStream(argv.file);\n\nvar lines = 0;\ns.on('data', function (buf) {\n    lines += buf.toString().match(/\\n/g).length;\n});\n\ns.on('end', function () {\n    console.log(lines);\n});\n````\n\n***\n\n    $ node line_count.js\n    Count the lines in a file.\n    Usage: node ./line_count.js\n\n    Options:\n      -f, --file  Load a file  [required]\n\n    Missing required arguments: f\n\n    $ node line_count.js --file line_count.js \n    20\n    \n    $ node line_count.js -f line_count.js \n    20\n\nmethods\n=======\n\nBy itself,\n\n````javascript\nrequire('optimist').argv\n`````\n\nwill use `process.argv` array to construct the `argv` object.\n\nYou can pass in the `process.argv` yourself:\n\n````javascript\nrequire('optimist')([ '-x', '1', '-y', '2' ]).argv\n````\n\nor use .parse() to do the same thing:\n\n````javascript\nrequire('optimist').parse([ '-x', '1', '-y', '2' ])\n````\n\nThe rest of these methods below come in just before the terminating `.argv`.\n\n.alias(key, alias)\n------------------\n\nSet key names as equivalent such that updates to a key will propagate to aliases\nand vice-versa.\n\nOptionally `.alias()` can take an object that maps keys to aliases.\n\n.default(key, value)\n--------------------\n\nSet `argv[key]` to `value` if no option was specified on `process.argv`.\n\nOptionally `.default()` can take an object that maps keys to default values.\n\n.demand(key)\n------------\n\nIf `key` is a string, show the usage information and exit if `key` wasn't\nspecified in `process.argv`.\n\nIf `key` is a number, demand at least as many non-option arguments, which show\nup in `argv._`.\n\nIf `key` is an Array, demand each element.\n\n.describe(key, desc)\n--------------------\n\nDescribe a `key` for the generated usage information.\n\nOptionally `.describe()` can take an object that maps keys to descriptions.\n\n.options(key, opt)\n------------------\n\nInstead of chaining together `.alias().demand().default()`, you can specify\nkeys in `opt` for each of the chainable methods.\n\nFor example:\n\n````javascript\nvar argv = require('optimist')\n    .options('f', {\n        alias : 'file',\n        default : '/etc/passwd',\n    })\n    .argv\n;\n````\n\nis the same as\n\n````javascript\nvar argv = require('optimist')\n    .alias('f', 'file')\n    .default('f', '/etc/passwd')\n    .argv\n;\n````\n\nOptionally `.options()` can take an object that maps keys to `opt` parameters.\n\n.usage(message)\n---------------\n\nSet a usage message to show which commands to use. Inside `message`, the string\n`$0` will get interpolated to the current script name or node command for the\npresent script similar to how `$0` works in bash or perl.\n\n.check(fn)\n----------\n\nCheck that certain conditions are met in the provided arguments.\n\nIf `fn` throws or returns `false`, show the thrown error, usage information, and\nexit.\n\n.boolean(key)\n-------------\n\nInterpret `key` as a boolean. If a non-flag option follows `key` in\n`process.argv`, that string won't get set as the value of `key`.\n\nIf `key` never shows up as a flag in `process.arguments`, `argv[key]` will be\n`false`.\n\nIf `key` is an Array, interpret all the elements as booleans.\n\n.string(key)\n------------\n\nTell the parser logic not to interpret `key` as a number or boolean.\nThis can be useful if you need to preserve leading zeros in an input.\n\nIf `key` is an Array, interpret all the elements as strings.\n\n.wrap(columns)\n--------------\n\nFormat usage output to wrap at `columns` many columns.\n\n.help()\n-------\n\nReturn the generated usage string.\n\n.showHelp(fn=console.error)\n---------------------------\n\nPrint the usage data using `fn` for printing.\n\n.parse(args)\n------------\n\nParse `args` instead of `process.argv`. Returns the `argv` object.\n\n.argv\n-----\n\nGet the arguments as a plain old object.\n\nArguments without a corresponding flag show up in the `argv._` array.\n\nThe script name or node command is available at `argv.$0` similarly to how `$0`\nworks in bash or perl.\n\nparsing tricks\n==============\n\nstop parsing\n------------\n\nUse `--` to stop parsing flags and stuff the remainder into `argv._`.\n\n    $ node examples/reflect.js -a 1 -b 2 -- -c 3 -d 4\n    { _: [ '-c', '3', '-d', '4' ],\n      '$0': 'node ./examples/reflect.js',\n      a: 1,\n      b: 2 }\n\nnegate fields\n-------------\n\nIf you want to explicity set a field to false instead of just leaving it\nundefined or to override a default you can do `--no-key`.\n\n    $ node examples/reflect.js -a --no-b\n    { _: [],\n      '$0': 'node ./examples/reflect.js',\n      a: true,\n      b: false }\n\nnumbers\n-------\n\nEvery argument that looks like a number (`!isNaN(Number(arg))`) is converted to\none. This way you can just `net.createConnection(argv.port)` and you can add\nnumbers out of `argv` with `+` without having that mean concatenation,\nwhich is super frustrating.\n\nduplicates\n----------\n\nIf you specify a flag multiple times it will get turned into an array containing\nall the values in order.\n\n    $ node examples/reflect.js -x 5 -x 8 -x 0\n    { _: [],\n      '$0': 'node ./examples/reflect.js',\n        x: [ 5, 8, 0 ] }\n\ndot notation\n------------\n\nWhen you use dots (`.`s) in argument names, an implicit object path is assumed.\nThis lets you organize arguments into nested objects.\n\n     $ node examples/reflect.js --foo.bar.baz=33 --foo.quux=5\n     { _: [],\n       '$0': 'node ./examples/reflect.js',\n         foo: { bar: { baz: 33 }, quux: 5 } }\n\nshort numbers\n-------------\n\nShort numeric `head -n5` style argument work too:\n\n    $ node reflect.js -n123 -m456\n    { '3': true,\n      '6': true,\n      _: [],\n      '$0': 'node ./reflect.js',\n      n: 123,\n      m: 456 }\n\ninstallation\n============\n\nWith [npm](http://github.com/isaacs/npm), just do:\n    npm install optimist\n \nor clone this project on github:\n\n    git clone http://github.com/substack/node-optimist.git\n\nTo run the tests with [expresso](http://github.com/visionmedia/expresso),\njust do:\n    \n    expresso\n\ninspired By\n===========\n\nThis module is loosely inspired by Perl's\n[Getopt::Casual](http://search.cpan.org/~photo/Getopt-Casual-0.13.1/Casual.pm).\n",
+  "readmeFilename": "readme.markdown",
   "bugs": {
     "url": "https://github.com/substack/node-optimist/issues"
   },
   "homepage": "https://github.com/substack/node-optimist",
-  "_id": "optimist@0.3.5",
+  "_id": "optimist@0.6.1",
   "dist": {
-    "shasum": "4a95a366d4f292cb5930c16e82ef690885770fa2"
+    "shasum": "6ae855b9e52eb22c5af7b5e570013807be575bc3"
   },
-  "_from": "optimist@0.3.5",
-  "_resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.5.tgz"
+  "_from": "optimist@>=0.2.8",
+  "_resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz"
 }
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/readme.markdown
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/readme.markdown	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/readme.markdown	(revision 516)
@@ -0,0 +1,513 @@
+# DEPRECATION NOTICE
+
+I don't want to maintain this module anymore since I just use
+[minimist](https://npmjs.org/package/minimist), the argument parsing engine,
+directly instead nowadays.
+
+See [yargs](https://github.com/chevex/yargs) for the modern, pirate-themed
+successor to optimist.
+
+[![yarrrrrrrgs!](http://i.imgur.com/4WFGVJ9.png)](https://github.com/chevex/yargs)
+
+You should also consider [nomnom](https://github.com/harthur/nomnom).
+
+optimist
+========
+
+Optimist is a node.js library for option parsing for people who hate option
+parsing. More specifically, this module is for people who like all the --bells
+and -whistlz of program usage but think optstrings are a waste of time.
+
+With optimist, option parsing doesn't have to suck (as much).
+
+[![build status](https://secure.travis-ci.org/substack/node-optimist.png)](http://travis-ci.org/substack/node-optimist)
+
+examples
+========
+
+With Optimist, the options are just a hash! No optstrings attached.
+-------------------------------------------------------------------
+
+xup.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+
+if (argv.rif - 5 * argv.xup > 7.138) {
+    console.log('Buy more riffiwobbles');
+}
+else {
+    console.log('Sell the xupptumblers');
+}
+````
+
+***
+
+    $ ./xup.js --rif=55 --xup=9.52
+    Buy more riffiwobbles
+    
+    $ ./xup.js --rif 12 --xup 8.1
+    Sell the xupptumblers
+
+![This one's optimistic.](http://substack.net/images/optimistic.png)
+
+But wait! There's more! You can do short options:
+-------------------------------------------------
+ 
+short.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+console.log('(%d,%d)', argv.x, argv.y);
+````
+
+***
+
+    $ ./short.js -x 10 -y 21
+    (10,21)
+
+And booleans, both long and short (and grouped):
+----------------------------------
+
+bool.js:
+
+````javascript
+#!/usr/bin/env node
+var util = require('util');
+var argv = require('optimist').argv;
+
+if (argv.s) {
+    util.print(argv.fr ? 'Le chat dit: ' : 'The cat says: ');
+}
+console.log(
+    (argv.fr ? 'miaou' : 'meow') + (argv.p ? '.' : '')
+);
+````
+
+***
+
+    $ ./bool.js -s
+    The cat says: meow
+    
+    $ ./bool.js -sp
+    The cat says: meow.
+
+    $ ./bool.js -sp --fr
+    Le chat dit: miaou.
+
+And non-hypenated options too! Just use `argv._`!
+-------------------------------------------------
+ 
+nonopt.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+console.log('(%d,%d)', argv.x, argv.y);
+console.log(argv._);
+````
+
+***
+
+    $ ./nonopt.js -x 6.82 -y 3.35 moo
+    (6.82,3.35)
+    [ 'moo' ]
+    
+    $ ./nonopt.js foo -x 0.54 bar -y 1.12 baz
+    (0.54,1.12)
+    [ 'foo', 'bar', 'baz' ]
+
+Plus, Optimist comes with .usage() and .demand()!
+-------------------------------------------------
+
+divide.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+    .usage('Usage: $0 -x [num] -y [num]')
+    .demand(['x','y'])
+    .argv;
+
+console.log(argv.x / argv.y);
+````
+
+***
+ 
+    $ ./divide.js -x 55 -y 11
+    5
+    
+    $ node ./divide.js -x 4.91 -z 2.51
+    Usage: node ./divide.js -x [num] -y [num]
+
+    Options:
+      -x  [required]
+      -y  [required]
+
+    Missing required arguments: y
+
+EVEN MORE HOLY COW
+------------------
+
+default_singles.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+    .default('x', 10)
+    .default('y', 10)
+    .argv
+;
+console.log(argv.x + argv.y);
+````
+
+***
+
+    $ ./default_singles.js -x 5
+    15
+
+default_hash.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+    .default({ x : 10, y : 10 })
+    .argv
+;
+console.log(argv.x + argv.y);
+````
+
+***
+
+    $ ./default_hash.js -y 7
+    17
+
+And if you really want to get all descriptive about it...
+---------------------------------------------------------
+
+boolean_single.js
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+    .boolean('v')
+    .argv
+;
+console.dir(argv);
+````
+
+***
+
+    $ ./boolean_single.js -v foo bar baz
+    true
+    [ 'bar', 'baz', 'foo' ]
+
+boolean_double.js
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+    .boolean(['x','y','z'])
+    .argv
+;
+console.dir([ argv.x, argv.y, argv.z ]);
+console.dir(argv._);
+````
+
+***
+
+    $ ./boolean_double.js -x -z one two three
+    [ true, false, true ]
+    [ 'one', 'two', 'three' ]
+
+Optimist is here to help...
+---------------------------
+
+You can describe parameters for help messages and set aliases. Optimist figures
+out how to format a handy help string automatically.
+
+line_count.js
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+    .usage('Count the lines in a file.\nUsage: $0')
+    .demand('f')
+    .alias('f', 'file')
+    .describe('f', 'Load a file')
+    .argv
+;
+
+var fs = require('fs');
+var s = fs.createReadStream(argv.file);
+
+var lines = 0;
+s.on('data', function (buf) {
+    lines += buf.toString().match(/\n/g).length;
+});
+
+s.on('end', function () {
+    console.log(lines);
+});
+````
+
+***
+
+    $ node line_count.js
+    Count the lines in a file.
+    Usage: node ./line_count.js
+
+    Options:
+      -f, --file  Load a file  [required]
+
+    Missing required arguments: f
+
+    $ node line_count.js --file line_count.js 
+    20
+    
+    $ node line_count.js -f line_count.js 
+    20
+
+methods
+=======
+
+By itself,
+
+````javascript
+require('optimist').argv
+`````
+
+will use `process.argv` array to construct the `argv` object.
+
+You can pass in the `process.argv` yourself:
+
+````javascript
+require('optimist')([ '-x', '1', '-y', '2' ]).argv
+````
+
+or use .parse() to do the same thing:
+
+````javascript
+require('optimist').parse([ '-x', '1', '-y', '2' ])
+````
+
+The rest of these methods below come in just before the terminating `.argv`.
+
+.alias(key, alias)
+------------------
+
+Set key names as equivalent such that updates to a key will propagate to aliases
+and vice-versa.
+
+Optionally `.alias()` can take an object that maps keys to aliases.
+
+.default(key, value)
+--------------------
+
+Set `argv[key]` to `value` if no option was specified on `process.argv`.
+
+Optionally `.default()` can take an object that maps keys to default values.
+
+.demand(key)
+------------
+
+If `key` is a string, show the usage information and exit if `key` wasn't
+specified in `process.argv`.
+
+If `key` is a number, demand at least as many non-option arguments, which show
+up in `argv._`.
+
+If `key` is an Array, demand each element.
+
+.describe(key, desc)
+--------------------
+
+Describe a `key` for the generated usage information.
+
+Optionally `.describe()` can take an object that maps keys to descriptions.
+
+.options(key, opt)
+------------------
+
+Instead of chaining together `.alias().demand().default()`, you can specify
+keys in `opt` for each of the chainable methods.
+
+For example:
+
+````javascript
+var argv = require('optimist')
+    .options('f', {
+        alias : 'file',
+        default : '/etc/passwd',
+    })
+    .argv
+;
+````
+
+is the same as
+
+````javascript
+var argv = require('optimist')
+    .alias('f', 'file')
+    .default('f', '/etc/passwd')
+    .argv
+;
+````
+
+Optionally `.options()` can take an object that maps keys to `opt` parameters.
+
+.usage(message)
+---------------
+
+Set a usage message to show which commands to use. Inside `message`, the string
+`$0` will get interpolated to the current script name or node command for the
+present script similar to how `$0` works in bash or perl.
+
+.check(fn)
+----------
+
+Check that certain conditions are met in the provided arguments.
+
+If `fn` throws or returns `false`, show the thrown error, usage information, and
+exit.
+
+.boolean(key)
+-------------
+
+Interpret `key` as a boolean. If a non-flag option follows `key` in
+`process.argv`, that string won't get set as the value of `key`.
+
+If `key` never shows up as a flag in `process.arguments`, `argv[key]` will be
+`false`.
+
+If `key` is an Array, interpret all the elements as booleans.
+
+.string(key)
+------------
+
+Tell the parser logic not to interpret `key` as a number or boolean.
+This can be useful if you need to preserve leading zeros in an input.
+
+If `key` is an Array, interpret all the elements as strings.
+
+.wrap(columns)
+--------------
+
+Format usage output to wrap at `columns` many columns.
+
+.help()
+-------
+
+Return the generated usage string.
+
+.showHelp(fn=console.error)
+---------------------------
+
+Print the usage data using `fn` for printing.
+
+.parse(args)
+------------
+
+Parse `args` instead of `process.argv`. Returns the `argv` object.
+
+.argv
+-----
+
+Get the arguments as a plain old object.
+
+Arguments without a corresponding flag show up in the `argv._` array.
+
+The script name or node command is available at `argv.$0` similarly to how `$0`
+works in bash or perl.
+
+parsing tricks
+==============
+
+stop parsing
+------------
+
+Use `--` to stop parsing flags and stuff the remainder into `argv._`.
+
+    $ node examples/reflect.js -a 1 -b 2 -- -c 3 -d 4
+    { _: [ '-c', '3', '-d', '4' ],
+      '$0': 'node ./examples/reflect.js',
+      a: 1,
+      b: 2 }
+
+negate fields
+-------------
+
+If you want to explicity set a field to false instead of just leaving it
+undefined or to override a default you can do `--no-key`.
+
+    $ node examples/reflect.js -a --no-b
+    { _: [],
+      '$0': 'node ./examples/reflect.js',
+      a: true,
+      b: false }
+
+numbers
+-------
+
+Every argument that looks like a number (`!isNaN(Number(arg))`) is converted to
+one. This way you can just `net.createConnection(argv.port)` and you can add
+numbers out of `argv` with `+` without having that mean concatenation,
+which is super frustrating.
+
+duplicates
+----------
+
+If you specify a flag multiple times it will get turned into an array containing
+all the values in order.
+
+    $ node examples/reflect.js -x 5 -x 8 -x 0
+    { _: [],
+      '$0': 'node ./examples/reflect.js',
+        x: [ 5, 8, 0 ] }
+
+dot notation
+------------
+
+When you use dots (`.`s) in argument names, an implicit object path is assumed.
+This lets you organize arguments into nested objects.
+
+     $ node examples/reflect.js --foo.bar.baz=33 --foo.quux=5
+     { _: [],
+       '$0': 'node ./examples/reflect.js',
+         foo: { bar: { baz: 33 }, quux: 5 } }
+
+short numbers
+-------------
+
+Short numeric `head -n5` style argument work too:
+
+    $ node reflect.js -n123 -m456
+    { '3': true,
+      '6': true,
+      _: [],
+      '$0': 'node ./reflect.js',
+      n: 123,
+      m: 456 }
+
+installation
+============
+
+With [npm](http://github.com/isaacs/npm), just do:
+    npm install optimist
+ 
+or clone this project on github:
+
+    git clone http://github.com/substack/node-optimist.git
+
+To run the tests with [expresso](http://github.com/visionmedia/expresso),
+just do:
+    
+    expresso
+
+inspired By
+===========
+
+This module is loosely inspired by Perl's
+[Getopt::Casual](http://search.cpan.org/~photo/Getopt-Casual-0.13.1/Casual.pm).
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/test/dash.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/test/dash.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/test/dash.js	(revision 516)
@@ -0,0 +1,31 @@
+var optimist = require('../index');
+var test = require('tap').test;
+
+test('-', function (t) {
+    t.plan(5);
+    t.deepEqual(
+        fix(optimist.parse([ '-n', '-' ])),
+        { n: '-', _: [] }
+    );
+    t.deepEqual(
+        fix(optimist.parse([ '-' ])),
+        { _: [ '-' ] }
+    );
+    t.deepEqual(
+        fix(optimist.parse([ '-f-' ])),
+        { f: '-', _: [] }
+    );
+    t.deepEqual(
+        fix(optimist([ '-b', '-' ]).boolean('b').argv),
+        { b: true, _: [ '-' ] }
+    );
+    t.deepEqual(
+        fix(optimist([ '-s', '-' ]).string('s').argv),
+        { s: '-', _: [] }
+    );
+});
+
+function fix (obj) {
+    delete obj.$0;
+    return obj;
+}
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/test/parse.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/test/parse.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/test/parse.js	(revision 516)
@@ -245,4 +245,17 @@
 });
 
+test('newlines in params' , function (t) {
+    var args = optimist.parse([ '-s', "X\nX" ])
+    t.same(args, { _ : [], s : "X\nX", $0 : $0 });
+
+    // reproduce in bash:
+    // VALUE="new
+    // line"
+    // node program.js --s="$VALUE"
+    args = optimist.parse([ "--s=X\nX" ])
+    t.same(args, { _ : [], s : "X\nX", $0 : $0 });
+    t.end();
+});
+
 test('strings' , function (t) {
     var s = optimist([ '-s', '0001234' ]).string('s').argv.s;
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/test/parse_modified.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/test/parse_modified.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/test/parse_modified.js	(revision 516)
@@ -0,0 +1,14 @@
+var optimist = require('../');
+var test = require('tap').test;
+
+test('parse with modifier functions' , function (t) {
+    t.plan(1);
+    
+    var argv = optimist().boolean('b').parse([ '-b', '123' ]);
+    t.deepEqual(fix(argv), { b: true, _: ['123'] });
+});
+
+function fix (obj) {
+    delete obj.$0;
+    return obj;
+}
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/test/short.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/test/short.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/test/short.js	(revision 516)
@@ -0,0 +1,16 @@
+var optimist = require('../index');
+var test = require('tap').test;
+
+test('-n123', function (t) {
+    t.plan(1);
+    var parse = optimist.parse([ '-n123' ]);
+    t.equal(parse.n, 123);
+});
+
+test('-123', function (t) {
+    t.plan(3);
+    var parse = optimist.parse([ '-123', '456' ]);
+    t.equal(parse['1'], true);
+    t.equal(parse['2'], true);
+    t.equal(parse['3'], 456);
+});
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/test/whitespace.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/test/whitespace.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/test/whitespace.js	(revision 516)
@@ -0,0 +1,8 @@
+var optimist = require('../');
+var test = require('tap').test;
+
+test('whitespace should be whitespace' , function (t) {
+    t.plan(1);
+    var x = optimist.parse([ '-x', '\t' ]).x;
+    t.equal(x, '\t');
+});
Index: v/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/x.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/node_modules/optimist/x.js	(revision 515)
+++ 	(revision )
@@ -1,1 +1,0 @@
-console.dir(require('./').argv);
Index: v/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/npm-shrinkwrap.json
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/npm-shrinkwrap.json	(revision 515)
+++ 	(revision )
@@ -1,50 +1,0 @@
-{
-  "name": "coffeelint",
-  "version": "0.5.7",
-  "dependencies": {
-    "optimist": {
-      "version": "0.3.5",
-      "dependencies": {
-        "wordwrap": {
-          "version": "0.0.2"
-        }
-      }
-    },
-    "coffee-script": {
-      "version": "1.6.2"
-    },
-    "glob": {
-      "version": "3.1.14",
-      "dependencies": {
-        "minimatch": {
-          "version": "0.2.9",
-          "dependencies": {
-            "lru-cache": {
-              "version": "2.0.4"
-            },
-            "sigmund": {
-              "version": "1.0.0"
-            }
-          }
-        },
-        "graceful-fs": {
-          "version": "1.1.14"
-        },
-        "inherits": {
-          "version": "1.0.0"
-        }
-      }
-    },
-    "vows": {
-      "version": "0.7.0",
-      "dependencies": {
-        "eyes": {
-          "version": "0.1.8"
-        },
-        "diff": {
-          "version": "1.0.4"
-        }
-      }
-    }
-  }
-}
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/package.json	(revision 516)
@@ -2,5 +2,5 @@
   "name": "coffeelint",
   "description": "Lint your CoffeeScript",
-  "version": "0.5.7",
+  "version": "1.0.8",
   "homepage": "http://www.coffeelint.org",
   "keywords": [
@@ -14,4 +14,7 @@
   },
   "main": "./lib/coffeelint.js",
+  "engines": {
+    "node": ">=0.8.0"
+  },
   "repository": {
     "type": "git",
@@ -23,5 +26,5 @@
   "dependencies": {
     "optimist": ">=0.2.8",
-    "coffee-script": ">=1.6.0",
+    "coffee-script": "1.6.x",
     "glob": ">=3.1.9"
   },
@@ -37,13 +40,13 @@
   ],
   "scripts": {
-    "pretest": "npm run compile",
+    "pretest": "cake compile",
     "test": "vows --spec test/*.coffee test/*.litcoffee",
     "posttest": "npm run lint",
-    "prepublish": "npm run compile",
-    "install": "[ -e lib/commandline.js ] || npm run compile",
-    "lint": "npm run compile && ./bin/coffeelint -f test/fixtures/coffeelint.json src/*.coffee test/*.coffee test/*.litcoffee",
-    "lint-csv": "npm run compile && ./bin/coffeelint --csv -f test/fixtures/coffeelint.json src/*.coffee test/*.coffee",
-    "lint-jslint": "npm run compile && ./bin/coffeelint --jslint -f test/fixtures/coffeelint.json src/*.coffee test/*.coffee",
-    "compile": "coffee -c -o lib src"
+    "prepublish": "cake prepublish",
+    "publish": "cake publish",
+    "lint": "cake compile && ./bin/coffeelint -f coffeelint.json src/*.coffee test/*.coffee test/*.litcoffee",
+    "lint-csv": "cake compile && ./bin/coffeelint --csv -f coffeelint.json src/*.coffee test/*.coffee",
+    "lint-jslint": "cake compile && ./bin/coffeelint --jslint -f coffeelint.json src/*.coffee test/*.coffee",
+    "compile": "cake compile"
   },
   "readme": "CoffeeLint\n==========\n\nCoffeeLint is a style checker that helps keep CoffeeScript code\nclean and consistent.\n\nFor guides on installing, using and configuring CoffeeLint, head over\n[here](http://www.coffeelint.org).\n\nTo suggest a feature, report a bug, or general discussion, head over\n[here](http://github.com/clutchski/coffeelint/issues/).\n\n[![Build Status](https://secure.travis-ci.org/clutchski/coffeelint.png)](http://travis-ci.org/clutchski/coffeelint)\n",
@@ -52,9 +55,9 @@
     "url": "https://github.com/clutchski/coffeelint/issues"
   },
-  "_id": "coffeelint@0.5.7",
+  "_id": "coffeelint@1.0.8",
   "dist": {
-    "shasum": "4464b58e383f9fd3cd1da521b404301bdbc39e05"
+    "shasum": "24f415956f9b6dc01d1ee428f2bbe2d200eee9a7"
   },
-  "_from": "coffeelint@~0.5",
-  "_resolved": "https://registry.npmjs.org/coffeelint/-/coffeelint-0.5.7.tgz"
+  "_from": "coffeelint@~1.0",
+  "_resolved": "https://registry.npmjs.org/coffeelint/-/coffeelint-1.0.8.tgz"
 }
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/ast_linter.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/ast_linter.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/ast_linter.coffee	(revision 516)
@@ -0,0 +1,62 @@
+BaseLinter = require './base_linter.coffee'
+
+class ASTApi
+    constructor: (@config) ->
+
+# A class that performs static analysis of the abstract
+# syntax tree.
+module.exports = class ASTLinter extends BaseLinter
+
+    constructor : (source, config, rules, @CoffeeScript) ->
+        super source, config, rules
+        @astApi = new ASTApi @config
+
+    # This uses lintAST instead of lintNode because I think it makes it a bit
+    # more clear that the rule needs to walk the AST on its own.
+    acceptRule: (rule) ->
+        return typeof rule.lintAST is 'function'
+
+    lint : () ->
+        errors = []
+        try
+            @node = @CoffeeScript.nodes(@source)
+        catch coffeeError
+            # If for some reason you shut off the 'coffeescript_error' rule err
+            # will be null and should NOT be added to errors
+            err = @_parseCoffeeScriptError(coffeeError)
+            errors.push err if err?
+            return errors
+
+        for rule in @rules
+            @astApi.createError = (attrs = {}) =>
+                @createError rule.rule.name, attrs
+
+            # HACK: Push the local errors object into the plugin. This is a
+            # temporary solution until I have a way for it to really return
+            # multiple errors.
+            rule.errors = errors
+            v = @normalizeResult rule, rule.lintAST(@node, @astApi)
+
+            return v if v?
+        errors
+
+    _parseCoffeeScriptError : (coffeeError) ->
+        rule = @config['coffeescript_error']
+
+        message = coffeeError.toString()
+
+        # Parse the line number
+        lineNumber = -1
+        if coffeeError.location?
+            lineNumber = coffeeError.location.first_line + 1
+        else
+            match = /line (\d+)/.exec message
+            lineNumber = parseInt match[1], 10 if match?.length > 1
+        attrs = {
+            message: message
+            level: rule.level
+            lineNumber: lineNumber
+        }
+        return  @createError 'coffeescript_error', attrs
+
+
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/base_linter.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/base_linter.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/base_linter.coffee	(revision 516)
@@ -0,0 +1,55 @@
+# Patch the source properties onto the destination.
+extend = (destination, sources...) ->
+    for source in sources
+        (destination[k] = v for k, v of source)
+    return destination
+
+# Patch any missing attributes from defaults to source.
+defaults = (source, defaults) ->
+    extend({}, defaults, source)
+
+module.exports = class BaseLinter
+
+    constructor: (@source, @config, rules) ->
+        @setupRules rules
+
+    isObject: (obj) ->
+        obj is Object(obj)
+
+    # Create an error object for the given rule with the given
+    # attributes.
+    createError: (ruleName, attrs = {}) ->
+
+        # Level should default to what's in the config, but can be overridden.
+        attrs.level ?= @config[ruleName].level
+
+        level = attrs.level
+        if level not in ['ignore', 'warn', 'error']
+            throw new Error("unknown level #{level}")
+
+        if level in ['error', 'warn']
+            attrs.rule = ruleName
+            return defaults(attrs, @config[ruleName])
+        else
+            null
+
+    acceptRule: (rule) ->
+        throw new Error "acceptRule needs to be overridden in the subclass"
+
+    # Only rules that have a level of error or warn will even get constructed.
+    setupRules: (rules) ->
+        @rules = []
+        for name, RuleConstructor of rules
+            level = @config[name].level
+            if level in ['error', 'warn']
+                rule = new RuleConstructor this, @config
+                if @acceptRule(rule)
+                    @rules.push rule
+            else if level isnt 'ignore'
+                throw new Error("unknown level #{level}")
+
+    normalizeResult: (p, result) ->
+        if result is true
+            return @createError p.rule.name
+        if @isObject result
+            return @createError p.rule.name, result
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/coffeelint.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/coffeelint.coffee	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/coffeelint.coffee	(revision 516)
@@ -8,21 +8,25 @@
 
 # Coffeelint's namespace.
-coffeelint = {}
-
-if exports?
-    # If we're running in node, export our module and
-    # load dependencies.
-    coffeelint = exports
-    CoffeeScript = require 'coffee-script'
+# Browserify wrapps this file in a UMD that will set window.coffeelint to
+# exports
+coffeelint = exports
+
+if window?
+    # If we're in the browser assume CoffeeScript is already loaded.
+    CoffeeScript = window.CoffeeScript
 else
-    # If we're in the browser, export out module to
-    # global scope. Assume CoffeeScript is already
-    # loaded.
-    this.coffeelint = coffeelint
-    CoffeeScript = this.CoffeeScript
-
+    # By storing this in a variable it prevents browserify from finding this
+    # dependency. If it isn't hidden there is an error attempting to inline
+    # CoffeeScript.  if browserify uses `-i` to ignore the dependency it
+    # creates an empty shim which breaks NodeJS
+    # https://github.com/substack/node-browserify/issues/471
+    cs = 'coffee-script'
+    CoffeeScript = require cs
+
+# Browserify will inline the file at compile time.
+packageJSON = require('./../package.json')
 
 # The current version of Coffeelint.
-coffeelint.VERSION = "0.5.7"
+coffeelint.VERSION = packageJSON.version
 
 
@@ -32,284 +36,5 @@
 IGNORE  = 'ignore'
 
-
-# CoffeeLint's default rule configuration.
-coffeelint.RULES = RULES =
-
-    no_tabs :
-        level : ERROR
-        message : 'Line contains tab indentation'
-        description: """
-            This rule forbids tabs in indentation. Enough said. It is enabled by
-            default.
-            """
-
-    no_trailing_whitespace :
-        level : ERROR
-        message : 'Line ends with trailing whitespace'
-        allowed_in_comments : false
-        description: """
-            This rule forbids trailing whitespace in your code, since it is
-            needless cruft. It is enabled by default.
-            """
-
-    max_line_length :
-        value: 80
-        level : ERROR
-        message : 'Line exceeds maximum allowed length'
-        description: """
-            This rule imposes a maximum line length on your code. <a
-            href="http://www.python.org/dev/peps/pep-0008/">Python's style
-            guide</a> does a good job explaining why you might want to limit the
-            length of your lines, though this is a matter of taste.
-
-            Lines can be no longer than eighty characters by default.
-            """
-
-    camel_case_classes :
-        level : ERROR
-        message : 'Class names should be camel cased'
-        description: """
-            This rule mandates that all class names are camel cased. Camel
-            casing class names is a generally accepted way of distinguishing
-            constructor functions - which require the 'new' prefix to behave
-            properly - from plain old functions.
-            <pre>
-            <code># Good!
-            class BoaConstrictor
-
-            # Bad!
-            class boaConstrictor
-            </code>
-            </pre>
-            This rule is enabled by default.
-            """
-    indentation :
-        value : 2
-        level : ERROR
-        message : 'Line contains inconsistent indentation'
-        description: """
-            This rule imposes a standard number of spaces to be used for
-            indentation. Since whitespace is significant in CoffeeScript, it's
-            critical that a project chooses a standard indentation format and
-            stays consistent. Other roads lead to darkness. <pre> <code>#
-            Enabling this option will prevent this ugly
-            # but otherwise valid CoffeeScript.
-            twoSpaces = () ->
-              fourSpaces = () ->
-                  eightSpaces = () ->
-                        'this is valid CoffeeScript'
-
-            </code>
-            </pre>
-            Two space indentation is enabled by default.
-            """
-
-    no_implicit_braces :
-        level : IGNORE
-        message : 'Implicit braces are forbidden'
-        description: """
-            This rule prohibits implicit braces when declaring object literals.
-            Implicit braces can make code more difficult to understand,
-            especially when used in combination with optional parenthesis.
-            <pre>
-            <code># Do you find this code ambiguous? Is it a
-            # function call with three arguments or four?
-            myFunction a, b, 1:2, 3:4
-
-            # While the same code written in a more
-            # explicit manner has no ambiguity.
-            myFunction(a, b, {1:2, 3:4})
-            </code>
-            </pre>
-            Implicit braces are permitted by default, since their use is
-            idiomatic CoffeeScript.
-            """
-
-    no_trailing_semicolons:
-        level : ERROR
-        message : 'Line contains a trailing semicolon'
-        description: """
-            This rule prohibits trailing semicolons, since they are needless
-            cruft in CoffeeScript.
-            <pre>
-            <code># This semicolon is meaningful.
-            x = '1234'; console.log(x)
-
-            # This semicolon is redundant.
-            alert('end of line');
-            </code>
-            </pre>
-            Trailing semicolons are forbidden by default.
-            """
-
-    no_plusplus:
-        level : IGNORE
-        message : 'The increment and decrement operators are forbidden'
-        description: """
-            This rule forbids the increment and decrement arithmetic operators.
-            Some people believe the <tt>++</tt> and <tt>--</tt> to be cryptic
-            and the cause of bugs due to misunderstandings of their precedence
-            rules.
-            This rule is disabled by default.
-            """
-
-    no_throwing_strings:
-        level : ERROR
-        message : 'Throwing strings is forbidden'
-        description: """
-            This rule forbids throwing string literals or interpolations. While
-            JavaScript (and CoffeeScript by extension) allow any expression to
-            be thrown, it is best to only throw <a
-            href="https://developer.mozilla.org
-            /en/JavaScript/Reference/Global_Objects/Error"> Error</a> objects,
-            because they contain valuable debugging information like the stack
-            trace. Because of JavaScript's dynamic nature, CoffeeLint cannot
-            ensure you are always throwing instances of <tt>Error</tt>. It will
-            only catch the simple but real case of throwing literal strings.
-            <pre>
-            <code># CoffeeLint will catch this:
-            throw "i made a boo boo"
-
-            # ... but not this:
-            throw getSomeString()
-            </code>
-            </pre>
-            This rule is enabled by default.
-            """
-
-    cyclomatic_complexity:
-        value : 10
-        level : IGNORE
-        message : 'The cyclomatic complexity is too damn high'
-
-    no_backticks:
-        level : ERROR
-        message : 'Backticks are forbidden'
-        description: """
-            Backticks allow snippets of JavaScript to be embedded in
-            CoffeeScript. While some folks consider backticks useful in a few
-            niche circumstances, they should be avoided because so none of
-            JavaScript's "bad parts", like <tt>with</tt> and <tt>eval</tt>,
-            sneak into CoffeeScript.
-            This rule is enabled by default.
-            """
-
-    line_endings:
-        level : IGNORE
-        value : 'unix' # or 'windows'
-        message : 'Line contains incorrect line endings'
-        description: """
-            This rule ensures your project uses only <tt>windows</tt> or
-            <tt>unix</tt> line endings. This rule is disabled by default.
-            """
-    no_implicit_parens :
-        level : IGNORE
-        message : 'Implicit parens are forbidden'
-        description: """
-            This rule prohibits implicit parens on function calls.
-            <pre>
-            <code># Some folks don't like this style of coding.
-            myFunction a, b, c
-
-            # And would rather it always be written like this:
-            myFunction(a, b, c)
-            </code>
-            </pre>
-            Implicit parens are permitted by default, since their use is
-            idiomatic CoffeeScript.
-            """
-
-    empty_constructor_needs_parens :
-        level : IGNORE
-        message : 'Invoking a constructor without parens and without arguments'
-
-    non_empty_constructor_needs_parens :
-        level : IGNORE
-        message : 'Invoking a constructor without parens and with arguments'
-
-    no_empty_param_list :
-        level : IGNORE
-        message : 'Empty parameter list is forbidden'
-        description: """
-            This rule prohibits empty parameter lists in function definitions.
-            <pre>
-            <code># The empty parameter list in here is unnecessary:
-            myFunction = () -&gt;
-
-            # We might favor this instead:
-            myFunction = -&gt;
-            </code>
-            </pre>
-            Empty parameter lists are permitted by default.
-            """
-
-
-    space_operators :
-        level : IGNORE
-        message : 'Operators must be spaced properly'
-
-    # I don't know of any legitimate reason to define duplicate keys in an
-    # object. It seems to always be a mistake, it's also a syntax error in
-    # strict mode.
-    # See http://jslinterrors.com/duplicate-key-a/
-    duplicate_key :
-        level : ERROR
-        message : 'Duplicate key defined in object or class'
-
-    newlines_after_classes :
-        value : 3
-        level : IGNORE
-        message : 'Wrong count of newlines between a class and other code'
-
-    no_stand_alone_at :
-        level : IGNORE
-        message : '@ must not be used stand alone'
-        description: """
-            This rule checks that no stand alone @ are in use, they are
-            discouraged. Further information in CoffeScript issue <a
-            href="https://github.com/jashkenas/coffee-script/issues/1601">
-            #1601</a>
-            """
-
-    arrow_spacing :
-        level : IGNORE
-        message : 'Function arrow (->) must be spaced properly'
-        description: """
-            <p>This rule checks to see that there is spacing before and after
-            the arrow operator that declares a function. This rule is disabled
-            by default.</p> <p>Note that if arrow_spacing is enabled, and you
-            pass an empty function as a parameter, arrow_spacing will accept
-            either a space or no space in-between the arrow operator and the
-            parenthesis</p>
-            <pre><code># Both of this will not trigger an error,
-            # even with arrow_spacing enabled.
-            x(-> 3)
-            x( -> 3)
-
-            # However, this will trigger an error
-            x((a,b)-> 3)
-            </code>
-            </pre>
-             """
-
-    coffeescript_error :
-        level : ERROR
-        message : '' # The default coffeescript error is fine.
-
-
-# Some repeatedly used regular expressions.
-regexes =
-    trailingWhitespace : /[^\s]+[\t ]+\r?$/
-    lineHasComment : /^\s*[^\#]*\#/
-    indentation: /\S/
-    longUrlComment: ///
-      ^\s*\# # indentation, up to comment
-      \s*
-      http[^\s]+$ # Link that takes up the rest of the line without spaces.
-    ///
-    camelCase: /^[A-Z][a-zA-Z\d]*$/
-    trailingSemicolon: /;\r?$/
-    configStatement: /coffeelint:\s*(disable|enable)(?:=([\w\s,]*))?/
-
+coffeelint.RULES = RULES = require './rules.coffee'
 
 # Patch the source properties onto the destination.
@@ -323,706 +48,16 @@
     extend({}, defaults, source)
 
-
-# Create an error object for the given rule with the given
-# attributes.
-createError = (rule, attrs = {}) ->
-    level = attrs.level
-    if level not in [IGNORE, WARN, ERROR]
-        throw new Error("unknown level #{level}")
-
-    if level in [ERROR, WARN]
-        attrs.rule = rule
-        return defaults(attrs, RULES[rule])
-    else
-        null
-
-# Store suppressions in the form of { line #: type }
-block_config =
-    enable: {}
-    disable: {}
-
-#
-# A class that performs regex checks on each line of the source.
-#
-class LineLinter
-
-    constructor : (source, config, tokensByLine) ->
-        @source = source
-        @config = config
-        @line = null
-        @lineNumber = 0
-        @tokensByLine = tokensByLine
-        @lines = @source.split('\n')
-        @lineCount = @lines.length
-
-        # maintains some contextual information
-        #   inClass: bool; in class or not
-        #   lastUnemptyLineInClass: null or lineNumber, if the last not-empty
-        #                     line was in a class it holds its number
-        #   classIndents: the number of indents within a class
-        @context = {
-            class: {
-                inClass: false
-                lastUnemptyLineInClass: null
-                classIndents: null
-            }
-        }
-
-    lint : () ->
-        errors = []
-        for line, lineNumber in @lines
-            @lineNumber = lineNumber
-            @line = line
-            @maintainClassContext()
-            error = @lintLine()
-            errors.push(error) if error
-        errors
-
-    # Return an error if the line contained failed a rule, null otherwise.
-    lintLine : () ->
-        return @checkTabs() or
-               @checkTrailingWhitespace() or
-               @checkLineLength() or
-               @checkTrailingSemicolon() or
-               @checkLineEndings() or
-               @checkComments() or
-               @checkNewlinesAfterClasses()
-
-    checkTabs : () ->
-        # Only check lines that have compiled tokens. This helps
-        # us ignore tabs in the middle of multi line strings, heredocs, etc.
-        # since they are all reduced to a single token whose line number
-        # is the start of the expression.
-        indentation = @line.split(regexes.indentation)[0]
-        if @lineHasToken() and '\t' in indentation
-            @createLineError('no_tabs')
+# Helper to remove rules from disabled list
+difference = (a, b) ->
+    j = 0
+    while j < a.length
+        if a[j] in b
+            a.splice(j, 1)
         else
-            null
-
-    checkTrailingWhitespace : () ->
-        if regexes.trailingWhitespace.test(@line)
-            # By default only the regex above is needed.
-            if !@config['no_trailing_whitespace']?.allowed_in_comments
-                return @createLineError('no_trailing_whitespace')
-
-            line = @line
-            tokens = @tokensByLine[@lineNumber]
-
-            # If we're in a block comment there won't be any tokens on this
-            # line. Some previous line holds the token spanning multiple lines.
-            if !tokens
-                return null
-
-            # To avoid confusion when a string might contain a "#", every string
-            # on this line will be removed. before checking for a comment
-            for str in (token[1] for token in tokens when token[0] == 'STRING')
-                line = line.replace(str, 'STRING')
-
-            if !regexes.lineHasComment.test(line)
-                return @createLineError('no_trailing_whitespace')
-            else
-                return null
-        else
-            return null
-
-    checkLineLength : () ->
-        rule = 'max_line_length'
-        max = @config[rule]?.value
-        if max and max < @line.length and not regexes.longUrlComment.test(@line)
-            attrs =
-                context: "Length is #{@line.length}, max is #{max}"
-            @createLineError(rule, attrs)
-        else
-            null
-
-    checkTrailingSemicolon : () ->
-        hasSemicolon = regexes.trailingSemicolon.test(@line)
-        [first..., last] = @getLineTokens()
-        hasNewLine = last and last.newLine?
-        # Don't throw errors when the contents of  multiline strings,
-        # regexes and the like end in ";"
-        if hasSemicolon and not hasNewLine and @lineHasToken()
-            @createLineError('no_trailing_semicolons')
-        else
-            return null
-
-    checkLineEndings : () ->
-        rule = 'line_endings'
-        ending = @config[rule]?.value
-
-        return null if not ending or @isLastLine() or not @line
-
-        lastChar = @line[@line.length - 1]
-        valid = if ending == 'windows'
-            lastChar == '\r'
-        else if ending == 'unix'
-            lastChar != '\r'
-        else
-            throw new Error("unknown line ending type: #{ending}")
-        if not valid
-            return @createLineError(rule, {context:"Expected #{ending}"})
-        else
-            return null
-
-    checkComments : () ->
-        # Check for block config statements enable and disable
-        result = regexes.configStatement.exec(@line)
-        if result?
-            cmd = result[1]
-            rules = []
-            if result[2]?
-                for r in result[2].split(',')
-                    rules.push r.replace(/^\s+|\s+$/g, "")
-            block_config[cmd][@lineNumber] = rules
-        return null
-
-    checkNewlinesAfterClasses : () ->
-        rule = 'newlines_after_classes'
-        ending = @config[rule].value
-
-        return null if not ending or @isLastLine()
-
-        if not @context.class.inClass and
-                @context.class.lastUnemptyLineInClass? and
-                ((@lineNumber - 1) - @context.class.lastUnemptyLineInClass) isnt
-                ending
-            got = (@lineNumber - 1) - @context.class.lastUnemptyLineInClass
-            return @createLineError( rule, {
-                context: "Expected #{ending} got #{got}"
-            } )
-
-        null
-
-    createLineError : (rule, attrs = {}) ->
-        attrs.lineNumber = @lineNumber + 1 # Lines are indexed by zero.
-        attrs.level = @config[rule]?.level
-        createError(rule, attrs)
-
-    isLastLine : () ->
-        return @lineNumber == @lineCount - 1
-
-    # Return true if the given line actually has tokens.
-    # Optional parameter to check for a specific token type and line number.
-    lineHasToken : (tokenType = null, lineNumber = null) ->
-        lineNumber = lineNumber ? @lineNumber
-        unless tokenType?
-            return @tokensByLine[lineNumber]?
-        else
-            tokens = @tokensByLine[lineNumber]
-            return null unless tokens?
-            for token in tokens
-                return true if token[0] == tokenType
-            return false
-
-    # Return tokens for the given line number.
-    getLineTokens : () ->
-        @tokensByLine[@lineNumber] || []
-
-    # maintain the contextual information for class-related stuff
-    maintainClassContext: () ->
-        if @context.class.inClass
-            if @lineHasToken 'INDENT'
-                @context.class.classIndents++
-            else if @lineHasToken 'OUTDENT'
-                @context.class.classIndents--
-                if @context.class.classIndents is 0
-                    @context.class.inClass = false
-                    @context.class.classIndents = null
-
-            if @context.class.inClass and not @line.match( /^\s*$/ )
-                @context.class.lastUnemptyLineInClass = @lineNumber
-        else
-            unless @line.match(/\\s*/)
-                @context.class.lastUnemptyLineInClass = null
-
-            if @lineHasToken 'CLASS'
-                @context.class.inClass = true
-                @context.class.lastUnemptyLineInClass = @lineNumber
-                @context.class.classIndents = 0
-
-        null
-
-#
-# A class that performs checks on the output of CoffeeScript's lexer.
-#
-class LexicalLinter
-
-    constructor : (source, config) ->
-        @source = source
-        @tokens = CoffeeScript.tokens(source)
-        @config = config
-        @i = 0              # The index of the current token we're linting.
-        @tokensByLine = {}  # A map of tokens by line.
-        @arrayTokens = []   # A stack tracking the array token pairs.
-        @parenTokens = []   # A stack tracking the parens token pairs.
-        @callTokens = []    # A stack tracking the call token pairs.
-        @lines = source.split('\n')
-        @braceScopes = []   # A stack tracking keys defined in nexted scopes.
-
-    # Return a list of errors encountered in the given source.
-    lint : () ->
-        errors = []
-
-        for token, i in @tokens
-            @i = i
-            error = @lintToken(token)
-            errors.push(error) if error
-        errors
-
-    # Return an error if the given token fails a lint check, false otherwise.
-    lintToken : (token) ->
-        [type, value, lineNumber] = token
-
-        if typeof lineNumber == "object"
-            if type == 'OUTDENT' or type == 'INDENT'
-                lineNumber = lineNumber.last_line
-            else
-                lineNumber = lineNumber.first_line
-        @tokensByLine[lineNumber] ?= []
-        @tokensByLine[lineNumber].push(token)
-        # CoffeeScript loses line numbers of interpolations and multi-line
-        # regexes, so fake it by using the last line number we know.
-        @lineNumber = lineNumber or @lineNumber or 0
-        # Now lint it.
-        switch type
-            when "->"                     then @lintArrowSpacing(token)
-            when "INDENT"                 then @lintIndentation(token)
-            when "CLASS"                  then @lintClass(token)
-            when "UNARY"                  then @lintUnary(token)
-            when "{","}"                  then @lintBrace(token)
-            when "IDENTIFIER"             then @lintIdentifier(token)
-            when "++", "--"               then @lintIncrement(token)
-            when "THROW"                  then @lintThrow(token)
-            when "[", "]"                 then @lintArray(token)
-            when "(", ")"                 then @lintParens(token)
-            when "JS"                     then @lintJavascript(token)
-            when "CALL_START", "CALL_END" then @lintCall(token)
-            when "PARAM_START"            then @lintParam(token)
-            when "@"                      then @lintStandaloneAt(token)
-            when "+", "-"                 then @lintPlus(token)
-            when "=", "MATH", "COMPARE", "LOGIC", "COMPOUND_ASSIGN"
-                @lintMath(token)
-            else null
-
-    lintUnary: (token) ->
-        if token[1] is 'new'
-            # Find the last chained identifier, e.g. Bar in new foo.bar.Bar().
-            identifierIndex = 1
-            loop
-                expectedIdentifier = @peek(identifierIndex)
-                expectedCallStart  = @peek(identifierIndex + 1)
-                if expectedIdentifier?[0] is 'IDENTIFIER'
-                    if expectedCallStart?[0] is '.'
-                        identifierIndex += 2
-                        continue
-                break
-
-            # The callStart is generated if your parameters are all on the same
-            # line with implicit parens, and if your parameters start on the
-            # next line, but is missing if there are no params and no parens.
-            if expectedIdentifier?[0] is 'IDENTIFIER' and expectedCallStart?
-                if expectedCallStart[0] is 'CALL_START'
-                    if expectedCallStart.generated
-                        @createLexError('non_empty_constructor_needs_parens')
-                else
-                    @createLexError('empty_constructor_needs_parens')
-
-    # Lint the given array token.
-    lintArray : (token) ->
-        # Track the array token pairs
-        if token[0] == '['
-            @arrayTokens.push(token)
-        else if token[0] == ']'
-            @arrayTokens.pop()
-        # Return null, since we're not really linting
-        # anything here.
-        null
-
-    lintParens : (token) ->
-        if token[0] == '('
-            p1 = @peek(-1)
-            n1 = @peek(1)
-            n2 = @peek(2)
-            # String interpolations start with '' + so start the type co-ercion,
-            # so track if we're inside of one. This is most definitely not
-            # 100% true but what else can we do?
-            i = n1 and n2 and n1[0] == 'STRING' and n2[0] == '+'
-            token.isInterpolation = i
-            @parenTokens.push(token)
-        else
-            @parenTokens.pop()
-        # We're not linting, just tracking interpolations.
-        null
-
-    isInInterpolation : () ->
-        for t in @parenTokens
-            return true if t.isInterpolation
-        return false
-
-    isInExtendedRegex : () ->
-        for t in @callTokens
-            return true if t.isRegex
-        return false
-
-    lintPlus : (token) ->
-        # We can't check this inside of interpolations right now, because the
-        # plusses used for the string type co-ercion are marked not spaced.
-        return null if @isInInterpolation() or @isInExtendedRegex()
-
-        p = @peek(-1)
-        unaries = ['TERMINATOR', '(', '=', '-', '+', ',', 'CALL_START',
-                    'INDEX_START', '..', '...', 'COMPARE', 'IF',
-                    'THROW', 'LOGIC', 'POST_IF', ':', '[', 'INDENT',
-                    'COMPOUND_ASSIGN', 'RETURN', 'MATH']
-        isUnary = if not p then false else p[0] in unaries
-        if (isUnary and token.spaced) or
-                    (not isUnary and not token.spaced and not token.newLine)
-            @createLexError('space_operators', {context: token[1]})
-        else
-            null
-
-    lintMath: (token) ->
-        if not token.spaced and not token.newLine
-            @createLexError('space_operators', {context: token[1]})
-        else
-            null
-
-    lintCall : (token) ->
-        if token[0] == 'CALL_START'
-            p = @peek(-1)
-            # Track regex calls, to know (approximately) if we're in an
-            # extended regex.
-            token.isRegex = p and p[0] == 'IDENTIFIER' and p[1] == 'RegExp'
-            @callTokens.push(token)
-            if token.generated
-                return @createLexError('no_implicit_parens')
-            else
-                return null
-        else
-            @callTokens.pop()
-            return null
-
-    lintParam : (token) ->
-        nextType = @peek()[0]
-        if nextType == 'PARAM_END'
-            @createLexError('no_empty_param_list')
-        else
-            null
-
-    lintIdentifier: (token) ->
-        key = token[1]
-
-        # Class names might not be in a scope
-        return null if not @currentScope?
-        nextToken = @peek(1)
-
-        # Exit if this identifier isn't being assigned. A and B
-        # are identifiers, but only A should be examined:
-        # A = B
-        return null if nextToken[1] isnt ':'
-        previousToken = @peek(-1)
-
-        # Assigning "@something" and "something" are not the same thing
-        key = "@#{key}" if previousToken[0] == '@'
-
-        # Added a prefix to not interfere with things like "constructor".
-        key = "identifier-#{key}"
-        if @currentScope[key]
-            @createLexError('duplicate_key')
-        else
-            @currentScope[key] = token
-            null
-
-    lintBrace : (token) ->
-        if token[0] == '{'
-            @braceScopes.push @currentScope if @currentScope?
-            @currentScope = {}
-        else
-            @currentScope = @braceScopes.pop()
-
-        if token.generated and token[0] == '{'
-            # Peek back to the last line break. If there is a class
-            # definition, ignore the generated brace.
-            i = -1
-            loop
-                t = @peek(i)
-                if not t? or t[0] == 'TERMINATOR'
-                    return @createLexError('no_implicit_braces')
-                if t[0] == 'CLASS'
-                    return null
-                i -= 1
-        else
-            return null
-
-    lintJavascript :(token) ->
-        @createLexError('no_backticks')
-
-    lintThrow : (token) ->
-        [n1, n2] = [@peek(), @peek(2)]
-        # Catch literals and string interpolations, which are wrapped in
-        # parens.
-        nextIsString = n1[0] == 'STRING' or (n1[0] == '(' and n2[0] == 'STRING')
-        @createLexError('no_throwing_strings') if nextIsString
-
-    lintIncrement : (token) ->
-        attrs = {context : "found '#{token[0]}'"}
-        @createLexError('no_plusplus', attrs)
-
-    lintStandaloneAt: (token) ->
-        nextToken = @peek()
-        spaced = token.spaced
-        isIdentifier = nextToken[0] == 'IDENTIFIER'
-        isIndexStart = nextToken[0] == 'INDEX_START'
-        isDot = nextToken[0] == '.'
-
-        # https://github.com/jashkenas/coffee-script/issues/1601
-        # @::foo is valid, but @:: behaves inconsistently and is planned for
-        # removal. Technically @:: is a stand alone ::, but I think it makes
-        # sense to group it into no_stand_alone_at
-        if nextToken[0] == '::'
-            protoProperty = @peek(2)
-            isValidProtoProperty = protoProperty[0] == 'IDENTIFIER'
-
-        if spaced or (not isIdentifier and not isIndexStart and
-        not isDot and not isValidProtoProperty)
-            @createLexError('no_stand_alone_at')
-
-
-    # Return an error if the given indentation token is not correct.
-    lintIndentation : (token) ->
-        [type, numIndents, lineNumber] = token
-
-        return null if token.generated?
-
-        # HACK: CoffeeScript's lexer insert indentation in string
-        # interpolations that start with spaces e.g. "#{ 123 }"
-        # so ignore such cases. Are there other times an indentation
-        # could possibly follow a '+'?
-        previous = @peek(-2)
-        isInterpIndent = previous and previous[0] == '+'
-
-        # Ignore the indentation inside of an array, so that
-        # we can allow things like:
-        #   x = ["foo",
-        #             "bar"]
-        previous = @peek(-1)
-        isArrayIndent = @inArray() and previous?.newLine
-
-        # Ignore indents used to for formatting on multi-line expressions, so
-        # we can allow things like:
-        #   a = b =
-        #     c = d
-        previousSymbol = @peek(-1)?[0]
-        isMultiline = previousSymbol in ['=', ',']
-
-        # Summarize the indentation conditions we'd like to ignore
-        ignoreIndent = isInterpIndent or isArrayIndent or isMultiline
-
-        # Compensate for indentation in function invocations that span multiple
-        # lines, which can be ignored.
-        if @isChainedCall()
-            currentLine = @lines[@lineNumber]
-            prevNum = 1
-
-            # keep going back until we are not at a comment or a blank line
-            prevNum += 1 while (/^\s*(#|$)/.test(@lines[@lineNumber - prevNum]))
-            previousLine = @lines[@lineNumber - prevNum]
-
-            previousIndentation = previousLine.match(/^(\s*)/)[1].length
-            # I don't know why, but when inside a function, you make a chained
-            # call and define an inline callback as a parameter, the body of
-            # that callback gets the indentation reported higher than it really
-            # is. See issue #88
-            # NOTE: Adding this line moved the cyclomatic complexity over the
-            # limit, I'm not sure why
-            numIndents = currentLine.match(/^(\s*)/)[1].length
-            numIndents -= previousIndentation
-
-
-        # Now check the indentation.
-        expected = @config['indentation'].value
-        if not ignoreIndent and numIndents != expected
-            context = "Expected #{expected} " +
-                      "got #{numIndents}"
-            @createLexError('indentation', {context})
-        else
-            null
-
-    lintClass : (token) ->
-        # TODO: you can do some crazy shit in CoffeeScript, like
-        # class func().ClassName. Don't allow that.
-
-        # Don't try to lint the names of anonymous classes.
-        return null if token.newLine? or @peek()[0] in ['INDENT', 'EXTENDS']
-
-        # It's common to assign a class to a global namespace, e.g.
-        # exports.MyClassName, so loop through the next tokens until
-        # we find the real identifier.
-        className = null
-        offset = 1
-        until className
-            if @peek(offset + 1)?[0] == '.'
-                offset += 2
-            else if @peek(offset)?[0] == '@'
-                offset += 1
-            else
-                className = @peek(offset)[1]
-
-        # Now check for the error.
-        if not regexes.camelCase.test(className)
-            attrs = {context: "class name: #{className}"}
-            @createLexError('camel_case_classes', attrs)
-        else
-            null
-
-    lintArrowSpacing : (token) ->
-        # Throw error unless the following happens.
-        #
-        # We will take a look at the previous token to see
-        # 1. That the token is properly spaced
-        # 2. Wasn't generated by the CoffeeScript compiler
-        # 3. That it is just indentation
-        # 4. If the function declaration has no parameters
-        # e.g. x(-> 3)
-        #      x( -> 3)
-        #
-        # or a statement is wrapped in parentheses
-        # e.g. (-> true)()
-        #
-        # we will accept either having a space or not having a space there.
-
-        pp = @peek(-1)
-        unless (token.spaced? or token.newLine? or @atEof()) and
-               # Throw error unless the previous token...
-               ((pp.spaced? or pp[0] is 'TERMINATOR') or #1
-                pp.generated? or #2
-                pp[0] is "INDENT" or #3
-                (pp[1] is "(" and not pp.generated?)) #4
-            @createLexError('arrow_spacing')
-        else
-            null
-
-    createLexError : (rule, attrs = {}) ->
-        attrs.lineNumber = @lineNumber + 1
-        attrs.level = @config[rule].level
-        attrs.line = @lines[@lineNumber]
-        createError(rule, attrs)
-
-    # Return the token n places away from the current token.
-    peek : (n = 1) ->
-        @tokens[@i + n] || null
-
-    # Return true if the current token is inside of an array.
-    inArray : () ->
-        return @arrayTokens.length > 0
-
-    # Are there any more meaningful tokens following the current one?
-    atEof: ->
-        for token in @tokens.slice(@i + 1)
-            unless token.generated or token[0] in ['OUTDENT', 'TERMINATOR']
-                return false
-        true
-
-    # Return true if the current token is part of a property access
-    # that is split across lines, for example:
-    #   $('body')
-    #       .addClass('foo')
-    #       .removeClass('bar')
-    isChainedCall : () ->
-        # Get the index of the second most recent new line.
-        lines = (i for token, i in @tokens[..@i] when token.newLine?)
-
-        lastNewLineIndex = if lines then lines[lines.length - 2] else null
-
-        # Bail out if there is no such token.
-        return false if not lastNewLineIndex?
-
-        # Otherwise, figure out if that token or the next is an attribute
-        # look-up.
-        tokens = [@tokens[lastNewLineIndex], @tokens[lastNewLineIndex + 1]]
-
-        return !!(t for t in tokens when t and t[0] == '.').length
-
-
-# A class that performs static analysis of the abstract
-# syntax tree.
-class ASTLinter
-
-    constructor : (source, config) ->
-        @source = source
-        @config = config
-        @errors = []
-
-    lint : () ->
-        try
-            @node = CoffeeScript.nodes(@source)
-        catch coffeeError
-            @errors.push @_parseCoffeeScriptError(coffeeError)
-            return @errors
-        @lintNode(@node)
-        @errors
-
-    # returns the "complexity" value of the current node.
-    getComplexity : (node) ->
-        name = node.constructor.name
-        complexity = if name in ['If', 'While', 'For', 'Try']
-            1
-        else if name == 'Op' and node.operator in ['&&', '||']
-            1
-        else if name == 'Switch'
-            node.cases.length
-        else
-            0
-        return complexity
-
-    # Lint the AST node and return it's cyclomatic complexity.
-    lintNode : (node, line) ->
-
-        # Get the complexity of the current node.
-        name = node.constructor.name
-        complexity = @getComplexity(node)
-
-        # Add the complexity of all child's nodes to this one.
-        node.eachChild (childNode) =>
-            nodeLine = childNode.locationData.first_line
-            complexity += @lintNode(childNode, nodeLine) if childNode
-
-        # If the current node is a function, and it's over our limit, add an
-        # error to the list.
-        rule = @config.cyclomatic_complexity
-
-        if name == 'Code' and complexity >= rule.value
-            attrs = {
-                context: complexity + 1
-                level: rule.level
-                lineNumber: line + 1
-                lineNumberEnd: node.locationData.last_line + 1
-            }
-            error = createError 'cyclomatic_complexity', attrs
-            @errors.push error if error
-
-        # Return the complexity for the benefit of parent nodes.
-        return complexity
-
-    _parseCoffeeScriptError : (coffeeError) ->
-        rule = RULES['coffeescript_error']
-
-        message = coffeeError.toString()
-
-        # Parse the line number
-        lineNumber = -1
-        if coffeeError.location?
-            lineNumber = coffeeError.location.first_line + 1
-        else
-            match = /line (\d+)/.exec message
-            lineNumber = parseInt match[1], 10 if match?.length > 1
-        attrs = {
-            message: message
-            level: rule.level
-            lineNumber: lineNumber
-        }
-        return  createError 'coffeescript_error', attrs
-
-
+            j++
+
+LineLinter = require './line_linter.coffee'
+LexicalLinter = require './lexical_linter.coffee'
+ASTLinter = require './ast_linter.coffee'
 
 # Merge default and user configuration.
@@ -1031,4 +66,6 @@
     for rule, ruleConfig of RULES
         config[rule] = defaults(userConfig[rule], ruleConfig)
+
+
     return config
 
@@ -1050,4 +87,69 @@
     newSource
 
+_rules = {}
+coffeelint.registerRule = (RuleConstructor, ruleName = undefined) ->
+    p = new RuleConstructor
+
+    name = p?.rule?.name or "(unknown)"
+    e = (msg) -> throw new Error "Invalid rule: #{name} #{msg}"
+    unless p.rule?
+        e "Rules must provide rule attribute with a default configuration."
+
+    e "Rule defaults require a name" unless p.rule.name?
+
+    if ruleName? and ruleName isnt p.rule.name
+        e "Mismatched rule name: #{ruleName}"
+
+    e "Rule defaults require a message" unless p.rule.message?
+    e "Rule defaults require a description" unless p.rule.description?
+    unless p.rule.level in [ 'ignore', 'warn', 'error' ]
+        e "Default level must be 'ignore', 'warn', or 'error'"
+
+    if typeof p.lintToken is 'function'
+        e "'tokens' is required for 'lintToken'" unless p.tokens
+    else if typeof p.lintLine  isnt 'function' and
+            typeof p.lintAST isnt 'function'
+        e "Rules must implement lintToken, lintLine, or lintAST"
+
+    # Capture the default options for the new rule.
+    RULES[p.rule.name] = p.rule
+    _rules[p.rule.name] = RuleConstructor
+
+# These all need to be explicitly listed so they get picked up by browserify.
+coffeelint.registerRule require './rules/arrow_spacing.coffee'
+coffeelint.registerRule require './rules/no_tabs.coffee'
+coffeelint.registerRule require './rules/no_trailing_whitespace.coffee'
+coffeelint.registerRule require './rules/max_line_length.coffee'
+coffeelint.registerRule require './rules/line_endings.coffee'
+coffeelint.registerRule require './rules/no_trailing_semicolons.coffee'
+coffeelint.registerRule require './rules/indentation.coffee'
+coffeelint.registerRule require './rules/camel_case_classes.coffee'
+coffeelint.registerRule require './rules/colon_assignment_spacing.coffee'
+coffeelint.registerRule require './rules/no_implicit_braces.coffee'
+coffeelint.registerRule require './rules/no_plusplus.coffee'
+coffeelint.registerRule require './rules/no_throwing_strings.coffee'
+coffeelint.registerRule require './rules/no_backticks.coffee'
+coffeelint.registerRule require './rules/no_implicit_parens.coffee'
+coffeelint.registerRule require './rules/no_empty_param_list.coffee'
+coffeelint.registerRule require './rules/no_stand_alone_at.coffee'
+coffeelint.registerRule require './rules/space_operators.coffee'
+coffeelint.registerRule require './rules/duplicate_key.coffee'
+coffeelint.registerRule require './rules/empty_constructor_needs_parens.coffee'
+coffeelint.registerRule require './rules/cyclomatic_complexity.coffee'
+coffeelint.registerRule require './rules/newlines_after_classes.coffee'
+coffeelint.registerRule require './rules/no_unnecessary_fat_arrows.coffee'
+coffeelint.registerRule require './rules/missing_fat_arrows.coffee'
+coffeelint.registerRule(
+    require './rules/non_empty_constructor_needs_parens.coffee'
+)
+
+hasSyntaxError = (source) ->
+    try
+        # If there are syntax errors this will abort the lexical and line
+        # linters.
+        CoffeeScript.tokens(source)
+        return false
+    return true
+
 # Check the source against the given configuration and return an array
 # of any errors found. An error is an object with the following
@@ -1070,5 +172,5 @@
     disabled_initially = []
     for l in source.split('\n')
-        s = regexes.configStatement.exec(l)
+        s = LineLinter.configStatement.exec(l)
         if s?.length > 2 and 'enable' in s
             for r in s[1..]
@@ -1079,27 +181,30 @@
 
     # Do AST linting first so all compile errors are caught.
-    astErrors = new ASTLinter(source, config).lint()
-
-    # Do lexical linting.
-    lexicalLinter = new LexicalLinter(source, config)
-    lexErrors = lexicalLinter.lint()
-
-    # Do line linting.
-    tokensByLine = lexicalLinter.tokensByLine
-    lineLinter = new LineLinter(source, config, tokensByLine)
-    lineErrors = lineLinter.lint()
+    astErrors = new ASTLinter(source, config, _rules, CoffeeScript).lint()
+    errors = [].concat(astErrors)
+
+    # only do further checks if the syntax is okay, otherwise they just fail
+    # with syntax error exceptions
+    unless hasSyntaxError(source)
+        # Do lexical linting.
+        lexicalLinter = new LexicalLinter(source, config, _rules, CoffeeScript)
+        lexErrors = lexicalLinter.lint()
+        errors = errors.concat(lexErrors)
+
+        # Do line linting.
+        tokensByLine = lexicalLinter.tokensByLine
+        lineLinter = new LineLinter(source, config, _rules, tokensByLine,
+            literate)
+        lineErrors = lineLinter.lint()
+        errors = errors.concat(lineErrors)
+        block_config = lineLinter.block_config
+    else
+        # default this so it knows what to do
+        block_config =
+            enable : {}
+            disable : {}
 
     # Sort by line number and return.
-    errors = lexErrors.concat(lineErrors, astErrors)
     errors.sort((a, b) -> a.lineNumber - b.lineNumber)
-
-    # Helper to remove rules from disabled list
-    difference = (a, b) ->
-        j = 0
-        while j < a.length
-            if a[j] in b
-                a.splice(j, 1)
-            else
-                j++
 
     # Disable/enable rules for inline blocks
@@ -1126,7 +231,3 @@
                 errors.push e unless e.rule in disabled
 
-    block_config =
-      'enable': {}
-      'disable': {}
-
     errors
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/commandline.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/commandline.coffee	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/commandline.coffee	(revision 516)
@@ -12,5 +12,6 @@
 optimist = require("optimist")
 thisdir = path.dirname(fs.realpathSync(__filename))
-coffeelint = require(path.join(thisdir, "..", "lib", "coffeelint"))
+coffeelint = require(path.join(thisdir, "coffeelint"))
+configfinder = require(path.join(thisdir, "configfinder"))
 CoffeeScript = require 'coffee-script'
 
@@ -160,4 +161,7 @@
         for path, errors of @errorReport.paths
             for e in errors
+                # Having the context is useful for the cyclomatic_complexity
+                # rule and critical for the undefined_variables rule.
+                e.message += " #{e.context}." if e.context
                 f = [
                     path
@@ -181,5 +185,5 @@
                     @print """
                     <issue line="#{e.lineNumber}"
-                            lineEnd=#{e.lineNumberEnd ? e.lineNumberEnd}
+                            lineEnd="#{e.lineNumberEnd ? e.lineNumber}"
                             reason="[#{@escape(e.level)}] #{@escape(e.message)}"
                             evidence="#{@escape(e.context)}"/>
@@ -209,12 +213,45 @@
         msg
 
+class CheckstyleReporter extends JSLintReporter
+
+    publish : () ->
+        @print "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+        @print "<checkstyle version=\"4.3\">"
+
+        for path, errors of @errorReport.paths
+            if errors.length
+                @print "<file name=\"#{path}\">"
+
+                for e in errors
+                    level = e.level
+                    level = 'warning' if level is 'warn'
+
+                    # context is optional, this avoids generating the string
+                    # "context: undefined"
+                    context = e.context ? ""
+                    @print """
+                    <error line="#{e.lineNumber}"
+                        severity="#{@escape(level)}"
+                        message="#{@escape(e.message+'; context: '+context)}"
+                        source="coffeelint"/>
+                    """
+                @print "</file>"
+
+        @print "</checkstyle>"
+
 # Return an error report from linting the given paths.
-lintFiles = (paths, config) ->
+lintFiles = (files, config) ->
     errorReport = new ErrorReport()
-    for path in paths
-        source = read(path)
-        literate = CoffeeScript.helpers.isLiterate path
-
-        errorReport.paths[path] = coffeelint.lint(source, config, literate)
+    for file in files
+        source = read(file)
+        literate = CoffeeScript.helpers.isLiterate file
+
+        fileConfig = if config then config else getFallbackConfig(file)
+
+        for ruleName, data of fileConfig
+            if data.module?
+                loadRules(data.module, ruleName)
+
+        errorReport.paths[file] = coffeelint.lint(source, fileConfig, literate)
     return errorReport
 
@@ -222,6 +259,41 @@
 lintSource = (source, config, literate = false) ->
     errorReport = new ErrorReport()
+    config or= getFallbackConfig()
+
+    for ruleName, data of config
+        if data.module?
+            loadRules(data.module, ruleName)
+
     errorReport.paths["stdin"] = coffeelint.lint(source, config, literate)
     return errorReport
+
+# Get fallback configuration. With the -F flag found configs in standard places
+# will be used for each file being linted. Standard places are package.json or
+# coffeelint.json in a project's root folder or the user's home folder.
+getFallbackConfig = (filename = null) ->
+    unless options.argv.noconfig
+        configfinder.getConfig(filename)
+
+# moduleName is a NodeJS module, or a path to a module NodeJS can load.
+loadRules = (moduleName, ruleName = undefined) ->
+    try
+        try
+            ruleModule = require moduleName
+        catch e
+            # Maybe the user used a relative path from the command line. This
+            # doesn't make much sense from a config file, but seems natural
+            # with the --rules option.
+            ruleModule = require path.resolve(process.cwd(), moduleName)
+
+        # Most rules can export as a single constructor function
+        if typeof ruleModule is 'function'
+            coffeelint.registerRule ruleModule, ruleName
+        else
+            # Or it can export an array of rules to load.
+            for rule in ruleModule
+                coffeelint.registerRule rule
+    catch e
+        console.error "Error loading #{moduleName}"
+        throw e
 
 # Publish the error report and exit with the appropriate status.
@@ -231,4 +303,6 @@
     else if options.argv.csv
         new CSVReporter(errorReport)
+    else if options.argv.checkstyle
+        new CheckstyleReporter(errorReport)
     else
         colorize = not options.argv.nocolor
@@ -248,4 +322,5 @@
             .alias("q", "quiet")
             .describe("f", "Specify a custom configuration file.")
+            .describe("rules", "Specify a custom rule or directory of rules.")
             .describe("makeconfig", "Prints a default config file")
             .describe("noconfig",
@@ -253,7 +328,8 @@
             .describe("h", "Print help information.")
             .describe("v", "Print current version number.")
-            .describe("r", "Recursively lint .coffee files in subdirectories.")
+            .describe("r", "(not used, but left for backward compatibility)")
             .describe("csv", "Use the csv reporter.")
             .describe("jslint", "Use the JSLint XML reporter.")
+            .describe("checkstyle", "Use the checkstyle XML reporter.")
             .describe("nocolor", "Don't colorize the output")
             .describe("s", "Lint the source from stdin")
@@ -263,4 +339,5 @@
             .boolean("csv")
             .boolean("jslint")
+            .boolean("checkstyle")
             .boolean("nocolor")
             .boolean("noconfig")
@@ -286,13 +363,13 @@
 else
     # Load configuration.
-    config = {}
+    config = null
     unless options.argv.noconfig
-        # path.existsSync was moved to fs.existsSync node 0.6 -> 0.8
-        existsFn = fs.existsSync ? path.existsSync
         if options.argv.f
             config = JSON.parse read options.argv.f
         else if (process.env.COFFEELINT_CONFIG and
-        existsFn process.env.COFFEELINT_CONFIG)
+        fs.existsSync(process.env.COFFEELINT_CONFIG))
             config = JSON.parse(read(process.env.COFFEELINT_CONFIG))
+
+    loadRules(options.argv.rules) if options.argv.rules
 
     if options.argv.s
@@ -308,5 +385,5 @@
         # Find scripts to lint.
         paths = options.argv._
-        scripts = if options.argv.r then findCoffeeScripts(paths) else paths
+        scripts = findCoffeeScripts(paths)
 
         # Lint the code.
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/configfinder.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/configfinder.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/configfinder.coffee	(revision 516)
@@ -0,0 +1,54 @@
+###
+Helpers for finding CoffeeLint config in standard locations, similar to how
+JSHint does.
+###
+
+fs = require 'fs'
+path = require 'path'
+
+# Cache for findFile
+findFileResults = {}
+
+# Searches for a file with a specified name starting with 'dir' and going all
+# the way up either until it finds the file or hits the root.
+findFile = (name, dir) ->
+    dir = dir or process.cwd()
+    filename = path.normalize(path.join(dir, name))
+    return findFileResults[filename]  if findFileResults[filename]
+    parent = path.resolve(dir, "../")
+    if fs.existsSync(filename)
+        findFileResults[filename] = filename
+    else if dir is parent
+        findFileResults[filename] = null
+    else
+        findFile name, parent
+
+# Possibly find CoffeeLint configuration within a package.json file.
+loadNpmConfig = (dir) ->
+    fp = findFile("package.json", dir)
+    loadJSON(fp).coffeelintConfig  if fp
+
+# Parse a JSON file gracefully.
+loadJSON = (filename) ->
+    try
+        JSON.parse(fs.readFileSync(filename).toString())
+    catch e
+        console.error "Could not load JSON file '%s': %s", filename, e
+        null
+
+# Tries to find a configuration file in either project directory (if file is
+# given), as either the package.json's 'coffeelintConfig' property, or a project
+# specific 'coffeelint.json' or a global 'coffeelint.json' in the home
+# directory.
+exports.getConfig = (filename = null) ->
+    if filename
+        dir = path.dirname(path.resolve(filename))
+        npmConfig = loadNpmConfig(dir)
+        return npmConfig  if npmConfig
+        projConfig = findFile("coffeelint.json", dir)
+        return loadJSON(projConfig)  if projConfig
+    envs = process.env.HOME or process.env.HOMEPATH or process.env.USERPROFILE
+    home = path.normalize(path.join(envs, "coffeelint.json"))
+    if fs.existsSync(home)
+        console.log 'loaded', home
+        return loadJSON(home)
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/lexical_linter.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/lexical_linter.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/lexical_linter.coffee	(revision 516)
@@ -0,0 +1,73 @@
+
+class TokenApi
+    constructor: (CoffeeScript, source, @config, @tokensByLine) ->
+        @tokens = CoffeeScript.tokens(source)
+        @lines = source.split('\n')
+        @tokensByLine = {}  # A map of tokens by line.
+
+    i: 0              # The index of the current token we're linting.
+
+    # Return the token n places away from the current token.
+    peek : (n = 1) ->
+        @tokens[@i + n] || null
+
+
+BaseLinter = require './base_linter.coffee'
+
+#
+# A class that performs checks on the output of CoffeeScript's lexer.
+#
+module.exports = class LexicalLinter extends BaseLinter
+
+    constructor : (source, config, rules, CoffeeScript) ->
+        super source, config, rules
+
+        @tokenApi = new TokenApi CoffeeScript, source, @config, @tokensByLine
+        # This needs to be available on the LexicalLinter so it can be passed
+        # to the LineLinter when this finishes running.
+        @tokensByLine = @tokenApi.tokensByLine
+
+    acceptRule: (rule) ->
+        return typeof rule.lintToken is 'function'
+
+    # Return a list of errors encountered in the given source.
+    lint : () ->
+        errors = []
+
+        for token, i in @tokenApi.tokens
+            @tokenApi.i = i
+            errors.push(error) for error in @lintToken(token)
+        errors
+
+
+    # Return an error if the given token fails a lint check, false otherwise.
+    lintToken : (token) ->
+        [type, value, lineNumber] = token
+
+        if typeof lineNumber == "object"
+            if type == 'OUTDENT' or type == 'INDENT'
+                lineNumber = lineNumber.last_line
+            else
+                lineNumber = lineNumber.first_line
+        @tokensByLine[lineNumber] ?= []
+        @tokensByLine[lineNumber].push(token)
+        # CoffeeScript loses line numbers of interpolations and multi-line
+        # regexes, so fake it by using the last line number we know.
+        @lineNumber = lineNumber or @lineNumber or 0
+
+        @tokenApi.lineNumber = @lineNumber
+
+        # Multiple rules might run against the same token to build context.
+        # Every every rule should run even if something has already produced an
+        # error for the same token.
+        errors = []
+        for rule in @rules when token[0] in rule.tokens
+            v = @normalizeResult rule, rule.lintToken(token, @tokenApi)
+            errors.push v if v?
+        errors
+
+    createError : (ruleName, attrs = {}) ->
+        attrs.lineNumber = @lineNumber + 1
+        attrs.line = @tokenApi.lines[@lineNumber]
+        super ruleName, attrs
+
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/line_linter.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/line_linter.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/line_linter.coffee	(revision 516)
@@ -0,0 +1,136 @@
+
+class LineApi
+    constructor: (source, @config, @tokensByLine, @literate) ->
+        @line = null
+        @lines = source.split('\n')
+        @lineCount = @lines.length
+
+        # maintains some contextual information
+        #   inClass: bool; in class or not
+        #   lastUnemptyLineInClass: null or lineNumber, if the last not-empty
+        #                     line was in a class it holds its number
+        #   classIndents: the number of indents within a class
+        @context = {
+            class: {
+                inClass : false
+                lastUnemptyLineInClass : null
+                classIndents : null
+            }
+        }
+
+    lineNumber: 0
+
+    isLiterate: -> @literate
+
+    # maintain the contextual information for class-related stuff
+    maintainClassContext : (line) ->
+        if @context.class.inClass
+            if @lineHasToken 'INDENT'
+                @context.class.classIndents++
+            else if @lineHasToken 'OUTDENT'
+                @context.class.classIndents--
+                if @context.class.classIndents is 0
+                    @context.class.inClass = false
+                    @context.class.classIndents = null
+
+            if @context.class.inClass and not line.match( /^\s*$/ )
+                @context.class.lastUnemptyLineInClass = @lineNumber
+        else
+            unless line.match(/\\s*/)
+                @context.class.lastUnemptyLineInClass = null
+
+            if @lineHasToken 'CLASS'
+                @context.class.inClass = true
+                @context.class.lastUnemptyLineInClass = @lineNumber
+                @context.class.classIndents = 0
+
+        null
+
+    isLastLine : () ->
+        return @lineNumber == @lineCount - 1
+
+    # Return true if the given line actually has tokens.
+    # Optional parameter to check for a specific token type and line number.
+    lineHasToken : (tokenType = null, lineNumber = null) ->
+        lineNumber = lineNumber ? @lineNumber
+        unless tokenType?
+            return @tokensByLine[lineNumber]?
+        else
+            tokens = @tokensByLine[lineNumber]
+            return null unless tokens?
+            for token in tokens
+                return true if token[0] == tokenType
+            return false
+
+    # Return tokens for the given line number.
+    getLineTokens : () ->
+        @tokensByLine[@lineNumber] || []
+
+
+BaseLinter = require './base_linter.coffee'
+
+# Some repeatedly used regular expressions.
+configStatement = /coffeelint:\s*(disable|enable)(?:=([\w\s,]*))?/
+
+#
+# A class that performs regex checks on each line of the source.
+#
+module.exports = class LineLinter extends BaseLinter
+
+    # This is exposed here so coffeelint.coffee can reuse it
+    @configStatement: configStatement
+
+    constructor : (source, config, rules, tokensByLine, literate = false) ->
+        super source, config, rules
+
+        @lineApi = new LineApi source, config, tokensByLine, literate
+
+        # Store suppressions in the form of { line #: type }
+        @block_config =
+            enable : {}
+            disable : {}
+
+    acceptRule: (rule) ->
+        return typeof rule.lintLine is 'function'
+
+    lint : () ->
+        errors = []
+        for line, lineNumber in @lineApi.lines
+            @lineApi.lineNumber = @lineNumber = lineNumber
+
+            @lineApi.maintainClassContext line
+            @collectInlineConfig line
+
+            errors.push(error) for error in @lintLine(line)
+        errors
+
+    # Return an error if the line contained failed a rule, null otherwise.
+    lintLine : (line) ->
+
+        # Multiple rules might run against the same line to build context.
+        # Every every rule should run even if something has already produced an
+        # error for the same token.
+        errors = []
+        for rule in @rules
+            v = @normalizeResult rule, rule.lintLine(line, @lineApi)
+            errors.push v if v?
+        errors
+
+    collectInlineConfig : (line) ->
+        # Check for block config statements enable and disable
+        result = configStatement.exec(line)
+        if result?
+            cmd = result[1]
+            rules = []
+            if result[2]?
+                for r in result[2].split(',')
+                    rules.push r.replace(/^\s+|\s+$/g, "")
+            @block_config[cmd][@lineNumber] = rules
+        return null
+
+
+    createError: (rule, attrs = {}) ->
+        attrs.lineNumber = @lineNumber + 1 # Lines are indexed by zero.
+        attrs.level = @config[rule]?.level
+        super rule, attrs
+
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules.coffee	(revision 516)
@@ -0,0 +1,12 @@
+
+# CoffeeLint error levels.
+ERROR   = 'error'
+WARN    = 'warn'
+IGNORE  = 'ignore'
+
+# CoffeeLint's default rule configuration.
+module.exports =
+
+    coffeescript_error :
+        level : ERROR
+        message : '' # The default coffeescript error is fine.
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/arrow_spacing.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/arrow_spacing.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/arrow_spacing.coffee	(revision 516)
@@ -0,0 +1,61 @@
+
+module.exports = class ArrowSpacing
+
+    rule:
+        name: 'arrow_spacing'
+        level : 'ignore'
+        message : 'Function arrow (->) must be spaced properly'
+        description: """
+            <p>This rule checks to see that there is spacing before and after
+            the arrow operator that declares a function. This rule is disabled
+            by default.</p> <p>Note that if arrow_spacing is enabled, and you
+            pass an empty function as a parameter, arrow_spacing will accept
+            either a space or no space in-between the arrow operator and the
+            parenthesis</p>
+            <pre><code># Both of this will not trigger an error,
+            # even with arrow_spacing enabled.
+            x(-> 3)
+            x( -> 3)
+
+            # However, this will trigger an error
+            x((a,b)-> 3)
+            </code>
+            </pre>
+             """
+
+    tokens: [ '->' ]
+
+    lintToken : (token, tokenApi) ->
+        # Throw error unless the following happens.
+        #
+        # We will take a look at the previous token to see
+        # 1. That the token is properly spaced
+        # 2. Wasn't generated by the CoffeeScript compiler
+        # 3. That it is just indentation
+        # 4. If the function declaration has no parameters
+        # e.g. x(-> 3)
+        #      x( -> 3)
+        #
+        # or a statement is wrapped in parentheses
+        # e.g. (-> true)()
+        #
+        # we will accept either having a space or not having a space there.
+
+        pp = tokenApi.peek(-1)
+        unless (token.spaced? or token.newLine? or @atEof(tokenApi)) and
+               # Throw error unless the previous token...
+               ((pp.spaced? or pp[0] is 'TERMINATOR') or #1
+                pp.generated? or #2
+                pp[0] is "INDENT" or #3
+                (pp[1] is "(" and not pp.generated?)) #4
+            true
+        else
+            null
+
+    # Are there any more meaningful tokens following the current one?
+    atEof: (tokenApi) ->
+        {tokens, i } = tokenApi
+        for token in tokens.slice(i + 1)
+            unless token.generated or token[0] in ['OUTDENT', 'TERMINATOR']
+                return false
+        true
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/camel_case_classes.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/camel_case_classes.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/camel_case_classes.coffee	(revision 516)
@@ -0,0 +1,52 @@
+
+regexes =
+    camelCase : /^[A-Z][a-zA-Z\d]*$/
+
+module.exports = class CamelCaseClasses
+
+    rule:
+        name: 'camel_case_classes'
+        level : 'error'
+        message : 'Class names should be camel cased'
+        description: """
+            This rule mandates that all class names are CamelCased. Camel
+            casing class names is a generally accepted way of distinguishing
+            constructor functions - which require the 'new' prefix to behave
+            properly - from plain old functions.
+            <pre>
+            <code># Good!
+            class BoaConstrictor
+
+            # Bad!
+            class boaConstrictor
+            </code>
+            </pre>
+            This rule is enabled by default.
+            """
+
+    tokens: [ 'CLASS' ]
+
+    lintToken: (token, tokenApi) ->
+        # TODO: you can do some crazy shit in CoffeeScript, like
+        # class func().ClassName. Don't allow that.
+
+        # Don't try to lint the names of anonymous classes.
+        if token.newLine? or tokenApi.peek()[0] in ['INDENT', 'EXTENDS']
+            return null
+
+        # It's common to assign a class to a global namespace, e.g.
+        # exports.MyClassName, so loop through the next tokens until
+        # we find the real identifier.
+        className = null
+        offset = 1
+        until className
+            if tokenApi.peek(offset + 1)?[0] == '.'
+                offset += 2
+            else if tokenApi.peek(offset)?[0] == '@'
+                offset += 1
+            else
+                className = tokenApi.peek(offset)[1]
+
+        # Now check for the error.
+        if not regexes.camelCase.test(className)
+            return {context: "class name: #{className}"}
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/colon_assignment_spacing.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/colon_assignment_spacing.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/colon_assignment_spacing.coffee	(revision 516)
@@ -0,0 +1,65 @@
+module.exports = class ColonAssignmentSpacing
+
+    rule :
+        name : 'colon_assignment_spacing'
+        level : 'ignore'
+        message :'Colon assignment without proper spacing'
+        spacing :
+            left : 0
+            right : 0
+        description : """
+            <p>This rule checks to see that there is spacing before and
+            after the colon in a colon assignment (i.e., classes, objects).
+            The spacing amount is specified by
+            spacing.left and spacing.right, respectively.
+            A zero value means no spacing required.
+            </p>
+            <pre><code>
+            #
+            # If spacing.left and spacing.right is 1
+            #
+
+            # Good
+            object = {spacing : true}
+            class Dog
+              canBark : true
+
+            # Bad
+            object = {spacing: true}
+            class Cat
+              canBark: false
+            </code></pre>
+            """
+
+    tokens : [':']
+
+    lintToken : (token, tokenApi) ->
+        spacingAllowances = tokenApi.config[@rule.name].spacing
+        previousToken = tokenApi.peek -1
+        nextToken = tokenApi.peek 1
+
+        getSpaceFromToken = (direction) ->
+            switch direction
+                when 'left'
+                    token[2].first_column - previousToken[2].last_column - 1
+                when 'right'
+                    nextToken[2].first_column - token[2].first_column - 1
+
+        checkSpacing = (direction) ->
+            spacing = getSpaceFromToken direction
+            # when spacing is negative, the neighboring token is a newline
+            isSpaced = if spacing < 0 then true else spacing is parseInt spacingAllowances[direction]
+            [isSpaced, spacing]
+
+        [isLeftSpaced, leftSpacing] = checkSpacing 'left'
+        [isRightSpaced, rightSpacing] = checkSpacing 'right'
+
+        if isLeftSpaced and isRightSpaced
+            null
+        else
+            context :
+                """
+                Incorrect spacing around column #{token[2].first_column}.
+                Expected left: #{spacingAllowances.left}, right: #{spacingAllowances.right}.
+                Got left: #{leftSpacing}, right: #{rightSpacing}.
+                """
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/cyclomatic_complexity.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/cyclomatic_complexity.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/cyclomatic_complexity.coffee	(revision 516)
@@ -0,0 +1,52 @@
+module.exports = class NoTabs
+
+    rule:
+        name: 'cyclomatic_complexity'
+        value : 10
+        level : 'ignore'
+        message : 'The cyclomatic complexity is too damn high'
+        description : 'Examine the complexity of your application.'
+
+    # returns the "complexity" value of the current node.
+    getComplexity : (node) ->
+        name = node.constructor.name
+        complexity = if name in ['If', 'While', 'For', 'Try']
+            1
+        else if name == 'Op' and node.operator in ['&&', '||']
+            1
+        else if name == 'Switch'
+            node.cases.length
+        else
+            0
+        return complexity
+
+    lintAST : (node, @astApi) ->
+        @lintNode node
+        undefined
+
+    # Lint the AST node and return its cyclomatic complexity.
+    lintNode : (node, line) ->
+
+        # Get the complexity of the current node.
+        name = node.constructor.name
+        complexity = @getComplexity(node)
+
+        # Add the complexity of all child's nodes to this one.
+        node.eachChild (childNode) =>
+            nodeLine = childNode.locationData.first_line
+            complexity += @lintNode(childNode, nodeLine) if childNode
+
+        rule = @astApi.config[@rule.name]
+
+        # If the current node is a function, and it's over our limit, add an
+        # error to the list.
+        if name == 'Code' and complexity >= rule.value
+            error = @astApi.createError {
+                context: complexity + 1
+                lineNumber: line + 1
+                lineNumberEnd: node.locationData.last_line + 1
+            }
+            @errors.push error if error
+
+        # Return the complexity for the benefit of parent nodes.
+        return complexity
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/duplicate_key.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/duplicate_key.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/duplicate_key.coffee	(revision 516)
@@ -0,0 +1,60 @@
+
+module.exports = class DuplicateKey
+
+    rule:
+        # I don't know of any legitimate reason to define duplicate keys in an
+        # object. It seems to always be a mistake, it's also a syntax error in
+        # strict mode.
+        # See http://jslinterrors.com/duplicate-key-a/
+        name: 'duplicate_key'
+        level: 'error'
+        message: 'Duplicate key defined in object or class'
+        description:
+            "Prevents defining duplicate keys in object literals and classes"
+
+    tokens: [ 'IDENTIFIER', "{","}" ]
+
+    constructor: ->
+        @braceScopes = []   # A stack tracking keys defined in nexted scopes.
+
+    lintToken : ([type], tokenApi) ->
+
+        if type in [ "{","}" ]
+            @lintBrace arguments...
+            return undefined
+
+        if type is "IDENTIFIER"
+            @lintIdentifier arguments...
+
+    lintIdentifier : (token, tokenApi) ->
+        key = token[1]
+
+        # Class names might not be in a scope
+        return null if not @currentScope?
+        nextToken = tokenApi.peek(1)
+
+        # Exit if this identifier isn't being assigned. A and B
+        # are identifiers, but only A should be examined:
+        # A = B
+        return null if nextToken[1] isnt ':'
+        previousToken = tokenApi.peek(-1)
+
+        # Assigning "@something" and "something" are not the same thing
+        key = "@#{key}" if previousToken[0] == '@'
+
+        # Added a prefix to not interfere with things like "constructor".
+        key = "identifier-#{key}"
+        if @currentScope[key]
+            return true
+        else
+            @currentScope[key] = token
+            null
+
+    lintBrace : (token) ->
+        if token[0] == '{'
+            @braceScopes.push @currentScope if @currentScope?
+            @currentScope = {}
+        else
+            @currentScope = @braceScopes.pop()
+
+        return null
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/empty_constructor_needs_parens.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/empty_constructor_needs_parens.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/empty_constructor_needs_parens.coffee	(revision 516)
@@ -0,0 +1,35 @@
+
+module.exports = class EmptyConstructorNeedsParens
+
+    rule:
+        name: 'empty_constructor_needs_parens'
+        level: 'ignore'
+        message: 'Invoking a constructor without parens and without arguments'
+        description:
+            "Requires constructors with no parameters to include the parens"
+
+    tokens: [ 'UNARY' ]
+
+    # Return an error if the given indentation token is not correct.
+    lintToken: (token, tokenApi) ->
+        if token[1] is 'new'
+            # Find the last chained identifier, e.g. Bar in new foo.bar.Bar().
+            identifierIndex = 1
+            loop
+                expectedIdentifier = tokenApi.peek(identifierIndex)
+                expectedCallStart  = tokenApi.peek(identifierIndex + 1)
+                if expectedIdentifier?[0] is 'IDENTIFIER'
+                    if expectedCallStart?[0] is '.'
+                        identifierIndex += 2
+                        continue
+                break
+
+            # The callStart is generated if your parameters are all on the same
+            # line with implicit parens, and if your parameters start on the
+            # next line, but is missing if there are no params and no parens.
+            if expectedIdentifier?[0] is 'IDENTIFIER' and expectedCallStart?
+                return @handleExpectedCallStart expectedCallStart
+
+    handleExpectedCallStart: (expectedCallStart) ->
+        if expectedCallStart[0] isnt 'CALL_START'
+            return true
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/indentation.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/indentation.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/indentation.coffee	(revision 516)
@@ -0,0 +1,129 @@
+
+module.exports = class Indentation
+
+    rule:
+        name: 'indentation'
+        value : 2
+        level : 'error'
+        message : 'Line contains inconsistent indentation'
+        description: """
+            This rule imposes a standard number of spaces to be used for
+            indentation. Since whitespace is significant in CoffeeScript, it's
+            critical that a project chooses a standard indentation format and
+            stays consistent. Other roads lead to darkness. <pre> <code>#
+            Enabling this option will prevent this ugly
+            # but otherwise valid CoffeeScript.
+            twoSpaces = () ->
+              fourSpaces = () ->
+                  eightSpaces = () ->
+                        'this is valid CoffeeScript'
+
+            </code>
+            </pre>
+            Two space indentation is enabled by default.
+            """
+
+
+    tokens: [ 'INDENT', "[", "]" ]
+
+    constructor: ->
+        @arrayTokens = []   # A stack tracking the array token pairs.
+
+    # Return an error if the given indentation token is not correct.
+    lintToken: (token, tokenApi) ->
+        [type, numIndents, lineNumber] = token
+
+        if type in [ "[", "]" ]
+            @lintArray(token)
+            return undefined
+
+        return null if token.generated?
+
+        # HACK: CoffeeScript's lexer insert indentation in string
+        # interpolations that start with spaces e.g. "#{ 123 }"
+        # so ignore such cases. Are there other times an indentation
+        # could possibly follow a '+'?
+        previous = tokenApi.peek(-2)
+        isInterpIndent = previous and previous[0] == '+'
+
+        # Ignore the indentation inside of an array, so that
+        # we can allow things like:
+        #   x = ["foo",
+        #             "bar"]
+        previous = tokenApi.peek(-1)
+        isArrayIndent = @inArray() and previous?.newLine
+
+        # Ignore indents used to for formatting on multi-line expressions, so
+        # we can allow things like:
+        #   a = b =
+        #     c = d
+        previousSymbol = tokenApi.peek(-1)?[0]
+        isMultiline = previousSymbol in ['=', ',']
+
+        # Summarize the indentation conditions we'd like to ignore
+        ignoreIndent = isInterpIndent or isArrayIndent or isMultiline
+
+        # Compensate for indentation in function invocations that span multiple
+        # lines, which can be ignored.
+        if @isChainedCall tokenApi
+            { lines, lineNumber } = tokenApi
+            currentLine = lines[lineNumber]
+            prevNum = 1
+
+            # keep going back until we are not at a comment or a blank line
+            prevNum += 1 while (/^\s*(#|$)/.test(lines[lineNumber - prevNum]))
+            previousLine = lines[lineNumber - prevNum]
+
+            previousIndentation = previousLine.match(/^(\s*)/)[1].length
+            # I don't know why, but when inside a function, you make a chained
+            # call and define an inline callback as a parameter, the body of
+            # that callback gets the indentation reported higher than it really
+            # is. See issue #88
+            # NOTE: Adding this line moved the cyclomatic complexity over the
+            # limit, I'm not sure why
+            numIndents = currentLine.match(/^(\s*)/)[1].length
+            numIndents -= previousIndentation
+
+
+        # Now check the indentation.
+        expected = tokenApi.config[@rule.name].value
+        if not ignoreIndent and numIndents != expected
+            return {
+                context: "Expected #{expected} got #{numIndents}"
+            }
+    # Return true if the current token is inside of an array.
+    inArray : () ->
+        return @arrayTokens.length > 0
+
+    # Lint the given array token.
+    lintArray : (token) ->
+        # Track the array token pairs
+        if token[0] == '['
+            @arrayTokens.push(token)
+        else if token[0] == ']'
+            @arrayTokens.pop()
+        # Return null, since we're not really linting
+        # anything here.
+        null
+
+    # Return true if the current token is part of a property access
+    # that is split across lines, for example:
+    #   $('body')
+    #       .addClass('foo')
+    #       .removeClass('bar')
+    isChainedCall: (tokenApi) ->
+        { tokens, i } = tokenApi
+        # Get the index of the second most recent new line.
+        lines = (i for token, i in tokens[..i] when token.newLine?)
+
+        lastNewLineIndex = if lines then lines[lines.length - 2] else null
+
+        # Bail out if there is no such token.
+        return false if not lastNewLineIndex?
+
+        # Otherwise, figure out if that token or the next is an attribute
+        # look-up.
+        tokens = [tokens[lastNewLineIndex], tokens[lastNewLineIndex + 1]]
+
+        return !!(t for t in tokens when t and t[0] == '.').length
+
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/line_endings.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/line_endings.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/line_endings.coffee	(revision 516)
@@ -0,0 +1,30 @@
+
+
+module.exports = class LineEndings
+
+    rule:
+        name: 'line_endings'
+        level : 'ignore'
+        value : 'unix' # or 'windows'
+        message : 'Line contains incorrect line endings'
+        description: """
+            This rule ensures your project uses only <tt>windows</tt> or
+            <tt>unix</tt> line endings. This rule is disabled by default.
+            """
+
+    lintLine: (line, lineApi) ->
+        ending = lineApi.config[@rule.name]?.value
+
+        return null if not ending or lineApi.isLastLine() or not line
+
+        lastChar = line[line.length - 1]
+        valid = if ending == 'windows'
+            lastChar == '\r'
+        else if ending == 'unix'
+            lastChar != '\r'
+        else
+            throw new Error("unknown line ending type: #{ending}")
+        if not valid
+            return {context:"Expected #{ending}"}
+        else
+            return null
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/max_line_length.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/max_line_length.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/max_line_length.coffee	(revision 516)
@@ -0,0 +1,46 @@
+
+regexes =
+    literateComment: ///
+        ^
+        \#\s # This is prefixed on MarkDown lines.
+    ///
+    longUrlComment : ///
+      ^\s*\# # indentation, up to comment
+      \s*
+      http[^\s]+$ # Link that takes up the rest of the line without spaces.
+    ///
+
+module.exports = class MaxLineLength
+
+    rule:
+        name: 'max_line_length'
+        value: 80
+        level : 'error'
+        limitComments: true
+        message : 'Line exceeds maximum allowed length'
+        description: """
+            This rule imposes a maximum line length on your code. <a
+            href="http://www.python.org/dev/peps/pep-0008/">Python's style
+            guide</a> does a good job explaining why you might want to limit the
+            length of your lines, though this is a matter of taste.
+
+            Lines can be no longer than eighty characters by default.
+            """
+
+    lintLine: (line, lineApi) ->
+        max = lineApi.config[@rule.name]?.value
+        limitComments = lineApi.config[@rule.name]?.limitComments
+
+        lineLength = line.length
+        if lineApi.isLiterate() and regexes.literateComment.test(line)
+            lineLength -= 2
+
+        if max and max < lineLength and not regexes.longUrlComment.test(line)
+
+            unless limitComments
+                if lineApi.getLineTokens().length is 0
+                    return
+
+            return {
+                context: "Length is #{lineLength}, max is #{max}"
+            }
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/missing_fat_arrows.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/missing_fat_arrows.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/missing_fat_arrows.coffee	(revision 516)
@@ -0,0 +1,63 @@
+isCode = (node) -> node?.constructor.name is 'Code'
+isClass = (node) -> node.constructor.name is 'Class'
+isValue = (node) -> node.constructor.name is 'Value'
+isObject = (node) -> node.constructor.name is 'Obj'
+isThis = (node) -> isValue(node) and node.base.value is 'this'
+isFatArrowCode = (node) -> isCode(node) and node.bound
+
+any = (arr, test) -> arr.reduce ((res, elt) -> res or test elt), false
+
+needsFatArrow = (node) ->
+    isCode(node) and (
+        any(node.params, (param) -> param.contains(isThis)?) or
+        node.body.contains(isThis)?
+      )
+
+methodsOfClass = (classNode) ->
+    bodyNodes = classNode.body.expressions
+    returnNode = bodyNodes[bodyNodes.length - 1]
+    if returnNode? and isValue(returnNode) and isObject(returnNode.base)
+        returnNode.base.properties
+            .map((assignNode) -> assignNode.value)
+            .filter(isCode)
+    else []
+
+module.exports = class MissingFatArrows
+
+    rule:
+        name: 'missing_fat_arrows'
+        level: 'ignore'
+        message: 'Used `this` in a function without a fat arrow'
+        description: """
+            Warns when you use `this` inside a function that wasn't defined
+            with a fat arrow. This rule does not apply to methods defined in a
+            class, since they have `this` bound to the class instance (or the
+            class itself, for class methods).
+
+            It is impossible to statically determine whether a function using
+            `this` will be bound with the correct `this` value due to language
+            features like `Function.prototype.call` and
+            `Function.prototype.bind`, so this rule may produce false positives.
+            """
+
+    lintAST: (node, astApi) ->
+        @lintNode node, astApi
+        undefined
+
+    lintNode: (node, astApi, methods = []) ->
+        if (not isFatArrowCode node) and
+                # Ignore any nodes we know to be methods
+                (node not in methods) and
+                (needsFatArrow node)
+            error = astApi.createError
+                lineNumber: node.locationData.first_line + 1
+            @errors.push error
+
+        node.eachChild (child) => @lintNode child, astApi,
+            switch
+                when isClass node then methodsOfClass node
+                # Once we've hit a function, we know we can't be in the top
+                # level of a method anymore, so we can safely reset the methods
+                # to empty to save work.
+                when isCode node then []
+                else methods
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/newlines_after_classes.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/newlines_after_classes.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/newlines_after_classes.coffee	(revision 516)
@@ -0,0 +1,26 @@
+
+module.exports = class NewlinesAfterClasses
+
+    rule:
+        name: 'newlines_after_classes'
+        value : 3
+        level : 'ignore'
+        message : 'Wrong count of newlines between a class and other code'
+        description: "Checks the number of newlines between classes and other
+        code"
+
+    lintLine: (line, lineApi) ->
+        ending = lineApi.config[@rule.name].value
+
+        return null if not ending or lineApi.isLastLine()
+
+        { lineNumber, context } = lineApi
+        if not context.class.inClass and
+                context.class.lastUnemptyLineInClass? and
+                (lineNumber - context.class.lastUnemptyLineInClass) isnt
+                ending
+            got = lineNumber - context.class.lastUnemptyLineInClass
+            return  { context: "Expected #{ending} got #{got}" }
+
+        null
+
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_backticks.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_backticks.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_backticks.coffee	(revision 516)
@@ -0,0 +1,20 @@
+
+module.exports = class NoBackticks
+
+    rule:
+        name: 'no_backticks'
+        level : 'error'
+        message : 'Backticks are forbidden'
+        description: """
+            Backticks allow snippets of JavaScript to be embedded in
+            CoffeeScript. While some folks consider backticks useful in a few
+            niche circumstances, they should be avoided because so none of
+            JavaScript's "bad parts", like <tt>with</tt> and <tt>eval</tt>,
+            sneak into CoffeeScript.
+            This rule is enabled by default.
+            """
+
+    tokens: [ "JS" ]
+
+    lintToken : (token, tokenApi) ->
+        true
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_empty_param_list.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_empty_param_list.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_empty_param_list.coffee	(revision 516)
@@ -0,0 +1,27 @@
+
+
+module.exports = class NoEmptyParamList
+
+    rule:
+        name: 'no_empty_param_list'
+        level : 'ignore'
+        message : 'Empty parameter list is forbidden'
+        description: """
+            This rule prohibits empty parameter lists in function definitions.
+            <pre>
+            <code># The empty parameter list in here is unnecessary:
+            myFunction = () -&gt;
+
+            # We might favor this instead:
+            myFunction = -&gt;
+            </code>
+            </pre>
+            Empty parameter lists are permitted by default.
+            """
+
+    tokens: [ "PARAM_START" ]
+
+    lintToken : (token, tokenApi) ->
+        nextType = tokenApi.peek()[0]
+        return nextType is 'PARAM_END'
+
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_implicit_braces.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_implicit_braces.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_implicit_braces.coffee	(revision 516)
@@ -0,0 +1,52 @@
+
+module.exports = class NoImplicitBraces
+
+    rule:
+        name: 'no_implicit_braces'
+        level : 'ignore'
+        message : 'Implicit braces are forbidden'
+        strict: true
+        description: """
+            This rule prohibits implicit braces when declaring object literals.
+            Implicit braces can make code more difficult to understand,
+            especially when used in combination with optional parenthesis.
+            <pre>
+            <code># Do you find this code ambiguous? Is it a
+            # function call with three arguments or four?
+            myFunction a, b, 1:2, 3:4
+
+            # While the same code written in a more
+            # explicit manner has no ambiguity.
+            myFunction(a, b, {1:2, 3:4})
+            </code>
+            </pre>
+            Implicit braces are permitted by default, since their use is
+            idiomatic CoffeeScript.
+            """
+
+    tokens: [ "{" ]
+
+    lintToken: (token, tokenApi) ->
+        if token.generated
+
+            # If strict mode is turned off it allows implicit braces when the
+            # object is declared over multiple lines.
+            unless tokenApi.config[@rule.name].strict
+                [ previousToken ] = tokenApi.peek(-1)
+                if  previousToken is 'INDENT'
+                    return
+
+            @isPartOfClass(tokenApi)
+
+
+    isPartOfClass: (tokenApi) ->
+            # Peek back to the last line break. If there is a class
+            # definition, ignore the generated brace.
+            i = -1
+            loop
+                t = tokenApi.peek(i)
+                if not t? or t[0] == 'TERMINATOR'
+                    return true
+                if t[0] == 'CLASS'
+                    return null
+                i -= 1
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_implicit_parens.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_implicit_parens.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_implicit_parens.coffee	(revision 516)
@@ -0,0 +1,27 @@
+
+module.exports = class NoImplicitParens
+
+    rule:
+        name: 'no_implicit_parens'
+        level : 'ignore'
+        message : 'Implicit parens are forbidden'
+        description: """
+            This rule prohibits implicit parens on function calls.
+            <pre>
+            <code># Some folks don't like this style of coding.
+            myFunction a, b, c
+
+            # And would rather it always be written like this:
+            myFunction(a, b, c)
+            </code>
+            </pre>
+            Implicit parens are permitted by default, since their use is
+            idiomatic CoffeeScript.
+            """
+
+
+    tokens: [ "CALL_START" ]
+
+    lintToken : (token, tokenApi) ->
+        return token.generated
+
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_plusplus.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_plusplus.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_plusplus.coffee	(revision 516)
@@ -0,0 +1,19 @@
+
+module.exports = class NoPlusPlus
+
+    rule:
+        name: 'no_plusplus'
+        level : 'ignore'
+        message : 'The increment and decrement operators are forbidden'
+        description: """
+            This rule forbids the increment and decrement arithmetic operators.
+            Some people believe the <tt>++</tt> and <tt>--</tt> to be cryptic
+            and the cause of bugs due to misunderstandings of their precedence
+            rules.
+            This rule is disabled by default.
+            """
+
+    tokens: [ "++", "--" ]
+
+    lintToken : (token, tokenApi) ->
+        return {context : "found '#{token[0]}'"}
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_stand_alone_at.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_stand_alone_at.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_stand_alone_at.coffee	(revision 516)
@@ -0,0 +1,38 @@
+
+module.exports = class NoStandAloneAt
+
+    rule:
+        name: 'no_stand_alone_at'
+        level : 'ignore'
+        message : '@ must not be used stand alone'
+        description: """
+            This rule checks that no stand alone @ are in use, they are
+            discouraged. Further information in CoffeScript issue <a
+            href="https://github.com/jashkenas/coffee-script/issues/1601">
+            #1601</a>
+            """
+
+
+    tokens: [ "@" ]
+
+    lintToken : (token, tokenApi) ->
+        nextToken = tokenApi.peek()
+        spaced = token.spaced
+        isIdentifier = nextToken[0] == 'IDENTIFIER'
+        isIndexStart = nextToken[0] == 'INDEX_START'
+        isDot = nextToken[0] == '.'
+
+        # https://github.com/jashkenas/coffee-script/issues/1601
+        # @::foo is valid, but @:: behaves inconsistently and is planned for
+        # removal. Technically @:: is a stand alone ::, but I think it makes
+        # sense to group it into no_stand_alone_at
+        if nextToken[0] == '::'
+            protoProperty = tokenApi.peek(2)
+            isValidProtoProperty = protoProperty[0] == 'IDENTIFIER'
+
+        if spaced or (not isIdentifier and not isIndexStart and
+        not isDot and not isValidProtoProperty)
+            return true
+
+
+
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_tabs.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_tabs.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_tabs.coffee	(revision 516)
@@ -0,0 +1,22 @@
+
+indentationRegex = /\S/
+module.exports = class NoTabs
+    rule:
+        name: 'no_tabs'
+        level : 'error'
+        message : 'Line contains tab indentation'
+        description: """
+            This rule forbids tabs in indentation. Enough said. It is enabled by
+            default.
+            """
+
+    lintLine: (line, lineApi) ->
+        # Only check lines that have compiled tokens. This helps
+        # us ignore tabs in the middle of multi line strings, heredocs, etc.
+        # since they are all reduced to a single token whose line number
+        # is the start of the expression.
+        indentation = line.split(indentationRegex)[0]
+        if lineApi.lineHasToken() and '\t' in indentation
+            true
+        else
+            null
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_throwing_strings.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_throwing_strings.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_throwing_strings.coffee	(revision 516)
@@ -0,0 +1,36 @@
+
+module.exports = class NoThrowingStrings
+
+    rule:
+        name: 'no_throwing_strings'
+        level : 'error'
+        message : 'Throwing strings is forbidden'
+        description: """
+            This rule forbids throwing string literals or interpolations. While
+            JavaScript (and CoffeeScript by extension) allow any expression to
+            be thrown, it is best to only throw <a
+            href="https://developer.mozilla.org
+            /en/JavaScript/Reference/Global_Objects/Error"> Error</a> objects,
+            because they contain valuable debugging information like the stack
+            trace. Because of JavaScript's dynamic nature, CoffeeLint cannot
+            ensure you are always throwing instances of <tt>Error</tt>. It will
+            only catch the simple but real case of throwing literal strings.
+            <pre>
+            <code># CoffeeLint will catch this:
+            throw "i made a boo boo"
+
+            # ... but not this:
+            throw getSomeString()
+            </code>
+            </pre>
+            This rule is enabled by default.
+            """
+
+    tokens: [ "THROW" ]
+
+    lintToken : (token, tokenApi) ->
+        [n1, n2] = [tokenApi.peek(), tokenApi.peek(2)]
+        # Catch literals and string interpolations, which are wrapped in
+        # parens.
+        nextIsString = n1[0] == 'STRING' or (n1[0] == '(' and n2[0] == 'STRING')
+        return nextIsString
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_trailing_semicolons.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_trailing_semicolons.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_trailing_semicolons.coffee	(revision 516)
@@ -0,0 +1,42 @@
+
+regexes =
+    trailingSemicolon : /;\r?$/
+
+module.exports = class NoTrailingSemicolons
+
+    rule:
+        name: 'no_trailing_semicolons'
+        level : 'error'
+        message : 'Line contains a trailing semicolon'
+        description: """
+            This rule prohibits trailing semicolons, since they are needless
+            cruft in CoffeeScript.
+            <pre>
+            <code># This semicolon is meaningful.
+            x = '1234'; console.log(x)
+
+            # This semicolon is redundant.
+            alert('end of line');
+            </code>
+            </pre>
+            Trailing semicolons are forbidden by default.
+            """
+
+
+    lintLine: (line, lineApi) ->
+
+        # The TERMINATOR token is extended through to the next token. As a
+        # result a line with a comment DOES have a token: the TERMINATOR from
+        # the last line of code.
+        lineTokens = lineApi.getLineTokens()
+        if lineTokens.length is 1 and lineTokens[0][0] is 'TERMINATOR'
+            return
+
+        hasSemicolon = regexes.trailingSemicolon.test(line)
+        [first..., last] = lineApi.getLineTokens()
+        hasNewLine = last and last.newLine?
+        # Don't throw errors when the contents of  multiline strings,
+        # regexes and the like end in ";"
+        if hasSemicolon and not hasNewLine and lineApi.lineHasToken() and
+                last[0] isnt 'STRING'
+            return true
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_trailing_whitespace.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_trailing_whitespace.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_trailing_whitespace.coffee	(revision 516)
@@ -0,0 +1,44 @@
+
+regexes =
+    trailingWhitespace : /[^\s]+[\t ]+\r?$/
+    onlySpaces: /^[\t ]+\r?$/
+    lineHasComment : /^\s*[^\#]*\#/
+
+module.exports = class NoTrailingWhitespace
+
+    rule:
+        name: 'no_trailing_whitespace'
+        level : 'error'
+        message : 'Line ends with trailing whitespace'
+        allowed_in_comments : false
+        allowed_in_empty_lines: true
+        description: """
+            This rule forbids trailing whitespace in your code, since it is
+            needless cruft. It is enabled by default.
+            """
+
+    lintLine: (line, lineApi) ->
+        unless lineApi.config['no_trailing_whitespace']?.allowed_in_empty_lines
+            if regexes.onlySpaces.test(line)
+                return true
+
+        if regexes.trailingWhitespace.test(line)
+            # By default only the regex above is needed.
+            unless lineApi.config['no_trailing_whitespace']?.allowed_in_comments
+                return true
+
+            line = line
+            tokens = lineApi.tokensByLine[lineApi.lineNumber]
+
+            # If we're in a block comment there won't be any tokens on this
+            # line. Some previous line holds the token spanning multiple lines.
+            if !tokens
+                return null
+
+            # To avoid confusion when a string might contain a "#", every string
+            # on this line will be removed. before checking for a comment
+            for str in (token[1] for token in tokens when token[0] == 'STRING')
+                line = line.replace(str, 'STRING')
+
+            if !regexes.lineHasComment.test(line)
+                return true
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_unnecessary_fat_arrows.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_unnecessary_fat_arrows.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/no_unnecessary_fat_arrows.coffee	(revision 516)
@@ -0,0 +1,36 @@
+isCode = (node) -> node.constructor.name is 'Code'
+isFatArrowCode = (node) -> isCode(node) and node.bound
+isThis = (node) ->
+    node.constructor.name is 'Value' and node.base.value is 'this'
+
+any = (arr, test) -> arr.reduce ((res, elt) -> res or test elt), false
+
+needsFatArrow = (node) ->
+    isCode(node) and (
+        any(node.params, (param) -> param.contains(isThis)?) or
+        node.body.contains(isThis)? or
+        node.body.contains((child) ->
+            isFatArrowCode(child) and needsFatArrow(child))?
+    )
+
+module.exports = class NoUnnecessaryFatArrows
+
+    rule:
+        name: 'no_unnecessary_fat_arrows'
+        level: 'warn'
+        message: 'Unnecessary fat arrow'
+        description: """
+            Disallows defining functions with fat arrows when `this`
+            is not used within the function.
+            """
+
+    lintAST: (node, astApi) ->
+        @lintNode node, astApi
+        undefined
+
+    lintNode: (node, astApi) ->
+        if (isFatArrowCode node) and (not needsFatArrow node)
+            error = astApi.createError
+                lineNumber: node.locationData.first_line + 1
+            @errors.push error
+        node.eachChild (child) => @lintNode child, astApi
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/non_empty_constructor_needs_parens.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/non_empty_constructor_needs_parens.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/non_empty_constructor_needs_parens.coffee	(revision 516)
@@ -0,0 +1,15 @@
+
+ParentClass = require './empty_constructor_needs_parens.coffee'
+
+module.exports = class NonEmptyConstructorNeedsParens extends ParentClass
+
+    rule:
+        name: 'non_empty_constructor_needs_parens'
+        level: 'ignore'
+        message: 'Invoking a constructor without parens and with arguments'
+        description:
+            "Requires constructors with parameters to include the parens"
+
+    handleExpectedCallStart: (expectedCallStart) ->
+        if expectedCallStart[0] is 'CALL_START' and expectedCallStart.generated
+            return true
Index: /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/space_operators.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/space_operators.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/node_modules/coffeelint/src/rules/space_operators.coffee	(revision 516)
@@ -0,0 +1,93 @@
+
+module.exports = class SpaceOperators
+
+    rule:
+        name: 'space_operators'
+        level : 'ignore'
+        message : 'Operators must be spaced properly'
+        description: "This rule enforces that operators have space around them."
+
+    tokens: [ "+", "-", "=", "MATH", "COMPARE", "LOGIC", "COMPOUND_ASSIGN",
+        "(", ")", "CALL_START", "CALL_END" ]
+
+    constructor: ->
+        @callTokens = []    # A stack tracking the call token pairs.
+        @parenTokens = []   # A stack tracking the parens token pairs.
+
+    lintToken : ([type], tokenApi) ->
+
+        # These just keep track of state
+        if type in [ "CALL_START", "CALL_END" ]
+            @lintCall arguments...
+            return undefined
+        if type in [ "(", ")" ]
+            @lintParens arguments...
+            return undefined
+
+
+        # These may return errors
+        if type in [ "+", "-" ]
+            @lintPlus arguments...
+        else
+            @lintMath arguments...
+
+    lintPlus: (token, tokenApi) ->
+        # We can't check this inside of interpolations right now, because the
+        # plusses used for the string type co-ercion are marked not spaced.
+        if @isInInterpolation() or @isInExtendedRegex()
+            return null
+
+        p = tokenApi.peek(-1)
+        unaries = ['TERMINATOR', '(', '=', '-', '+', ',', 'CALL_START',
+                    'INDEX_START', '..', '...', 'COMPARE', 'IF',
+                    'THROW', 'LOGIC', 'POST_IF', ':', '[', 'INDENT',
+                    'COMPOUND_ASSIGN', 'RETURN', 'MATH', 'BY', 'LEADING_WHEN']
+        isUnary = if not p then false else p[0] in unaries
+        if (isUnary and token.spaced) or
+                    (not isUnary and not token.spaced and not token.newLine)
+            return {context: token[1]}
+        else
+            null
+
+    lintMath: (token, tokenApi) ->
+        if not token.spaced and not token.newLine
+            return {context: token[1]}
+        else
+            null
+
+    isInExtendedRegex : () ->
+        for t in @callTokens
+            return true if t.isRegex
+        return false
+
+    lintCall : (token, tokenApi) ->
+        if token[0] == 'CALL_START'
+            p = tokenApi.peek(-1)
+            # Track regex calls, to know (approximately) if we're in an
+            # extended regex.
+            token.isRegex = p and p[0] == 'IDENTIFIER' and p[1] == 'RegExp'
+            @callTokens.push(token)
+        else
+            @callTokens.pop()
+        return null
+
+    isInInterpolation : () ->
+        for t in @parenTokens
+            return true if t.isInterpolation
+        return false
+
+    lintParens : (token, tokenApi) ->
+        if token[0] == '('
+            p1 = tokenApi.peek(-1)
+            n1 = tokenApi.peek(1)
+            n2 = tokenApi.peek(2)
+            # String interpolations start with '' + so start the type co-ercion,
+            # so track if we're inside of one. This is most definitely not
+            # 100% true but what else can we do?
+            i = n1 and n2 and n1[0] == 'STRING' and n2[0] == '+'
+            token.isInterpolation = i
+            @parenTokens.push(token)
+        else
+            @parenTokens.pop()
+        # We're not linting, just tracking interpolations.
+        null
Index: /Dev/trunk/node_modules/grunt-coffeelint/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/package.json	(revision 516)
@@ -2,5 +2,5 @@
   "name": "grunt-coffeelint",
   "description": "Lint your Coffee",
-  "version": "0.0.7",
+  "version": "0.0.8",
   "homepage": "https://github.com/vojtajina/grunt-coffeelint",
   "author": {
@@ -40,5 +40,5 @@
   },
   "scripts": {
-    "test": "grunt test"
+    "test": "grunt default"
   },
   "peerDependencies": {
@@ -46,5 +46,5 @@
   },
   "dependencies": {
-    "coffeelint": "~0.5"
+    "coffeelint": "~1.0"
   },
   "devDependencies": {
@@ -56,11 +56,11 @@
     "gruntplugin"
   ],
-  "readme": "[![build status](https://secure.travis-ci.org/vojtajina/grunt-coffeelint.png)](http://travis-ci.org/vojtajina/grunt-coffeelint)\n# grunt-coffeelint\n\n**Lint your CoffeeScript by [CoffeeLint].**\n\n## Installation\n\nInstall npm package, next to your project's `Gruntfile.js` file:\n\n    npm install grunt-coffeelint\n\nAdd this line to your project's `Gruntfile.js`:\n\n    grunt.loadNpmTasks('grunt-coffeelint');\n\n\n## Configuration\n\n`coffeelint` is a multitask, so you can use it similary to `lint`, `watch` etc...\n\n````javascript\ngrunt.initConfig({\n    ...\n    coffeelint: {\n      app: ['app/*.coffee', 'scripts/*.coffee']\n      }\n    },\n    ...\n});\n````\n\n### Options per target\n\n````javascript\ngrunt.initConfig({\n    ...\n    coffeelint: {\n      app: ['app/*.coffee', 'scripts/*.coffee'],\n      tests: {\n        files: {\n          src: ['tests/*.coffee']\n        },\n        options: {\n          'no_trailing_whitespace': {\n            'level': 'error'\n          }\n        }\n      }\n    },\n    ...\n});\n````\n\n### Global - default options\n\n````javascript\ngrunt.initConfig({\n    ...\n    coffeelint: {\n      options: {\n        'no_trailing_whitespace': {\n          'level': 'error'\n        }\n      }\n    },\n    ...\n});\n````\n\nFor available options see [example configuration] or [coffeelint homepage].\n\n\n[CoffeeLint]: http://www.coffeelint.org/\n[coffeelint homepage]: http://www.coffeelint.org/\n[example configuration]: https://raw.github.com/clutchski/coffeelint/master/examples/coffeelint.json\n",
+  "readme": "[![build status](https://secure.travis-ci.org/vojtajina/grunt-coffeelint.png)](http://travis-ci.org/vojtajina/grunt-coffeelint)\n# grunt-coffeelint\n\n**Lint your CoffeeScript by [CoffeeLint].**\n\n## Installation\n\nInstall npm package, next to your project's `Gruntfile.js` file:\n\n    npm install grunt-coffeelint\n\nAdd this line to your project's `Gruntfile.js`:\n\n    grunt.loadNpmTasks('grunt-coffeelint');\n\n## Options\n\nA few additional options are supported:\n\n### force\nType: `Boolean`\nDefault value: `false`\n\nSet `force` to `true` to report CoffeeLint errors but not fail the task.\n\n## Configuration\n\n`coffeelint` is a multitask, so you can use it similary to `lint`, `watch` etc...\n\n````javascript\ngrunt.initConfig({\n    ...\n    coffeelint: {\n      app: ['app/*.coffee', 'scripts/*.coffee']\n      }\n    },\n    ...\n});\n````\n\n### Options per target\n\n````javascript\ngrunt.initConfig({\n    ...\n    coffeelint: {\n      app: ['app/*.coffee', 'scripts/*.coffee'],\n      tests: {\n        files: {\n          src: ['tests/*.coffee']\n        },\n        options: {\n          'no_trailing_whitespace': {\n            'level': 'error'\n          }\n        }\n      }\n    },\n    ...\n});\n````\n\n### Global - default options\n\n````javascript\ngrunt.initConfig({\n    ...\n    coffeelint: {\n      options: {\n        'no_trailing_whitespace': {\n          'level': 'error'\n        }\n      }\n    },\n    ...\n});\n````\n\nFor available options see [coffeelint homepage].\n\n[CoffeeLint]: http://www.coffeelint.org/\n[coffeelint homepage]: http://www.coffeelint.org/\n",
   "readmeFilename": "README.md",
-  "_id": "grunt-coffeelint@0.0.7",
+  "_id": "grunt-coffeelint@0.0.8",
   "dist": {
-    "shasum": "b782bf05aeb462dce2e566116849d369a1f19f4f"
+    "shasum": "149d6c5e8dd78b88a513b94daa274d5e6736fa52"
   },
-  "_from": "grunt-coffeelint@0.0.7",
-  "_resolved": "https://registry.npmjs.org/grunt-coffeelint/-/grunt-coffeelint-0.0.7.tgz"
+  "_from": "grunt-coffeelint@0.0.8",
+  "_resolved": "https://registry.npmjs.org/grunt-coffeelint/-/grunt-coffeelint-0.0.8.tgz"
 }
Index: /Dev/trunk/node_modules/grunt-coffeelint/tasks/coffeelint.js
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/tasks/coffeelint.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-coffeelint/tasks/coffeelint.js	(revision 516)
@@ -4,13 +4,23 @@
   grunt.registerMultiTask('coffeelint', 'Validate files with CoffeeLint', function() {
 
+    var errorCount = 0;
+    var warnCount = 0;
     var files = this.filesSrc;
     var options = this.options();
-    var errorCount = 0;
-    var warnCount = 0;
+
+    if (options.configFile != undefined) {
+      var config = grunt.file.readJSON(options.configFile);
+      options.configFile = undefined;
+      for (var key in options) {
+          config[key] = options[key];
+      }
+      options = config;
+    }
 
     files.forEach(function(file) {
       grunt.verbose.writeln('Linting ' + file + '...');
 
-      var errors = coffeelint.lint(grunt.file.read(file), options);
+      var literate = !!file.match(/\.(litcoffee|coffee\.md)$/i);
+      var errors = coffeelint.lint(grunt.file.read(file), options, literate);
 
       if (!errors.length) {
@@ -40,11 +50,10 @@
     });
 
-    if (errorCount) {
+    if (errorCount && !options.force) {
       return false;
     }
 
-    if (!warnCount) {
-      grunt.log.ok(files.length + ' file' + (files.length === 1 ? '' : 's') +
-          ' lint free.');
+    if (!warnCount && !errorCount) {
+      grunt.log.ok(files.length + ' file' + (files.length === 1 ? '' : 's') + ' lint free.');
     }
   });
Index: /Dev/trunk/node_modules/grunt-coffeelint/tasks/coffeelint.js.orig
===================================================================
--- /Dev/trunk/node_modules/grunt-coffeelint/tasks/coffeelint.js.orig	(revision 516)
+++ /Dev/trunk/node_modules/grunt-coffeelint/tasks/coffeelint.js.orig	(revision 516)
@@ -0,0 +1,77 @@
+module.exports = function(grunt) {
+  var coffeelint = require('coffeelint');
+
+  grunt.registerMultiTask('coffeelint', 'Validate files with CoffeeLint', function() {
+
+<<<<<<< HEAD
+=======
+    var files = this.filesSrc;
+    var options = this.options({
+      force: false,
+      growl: false
+    });
+>>>>>>> Added support for Growl notification
+    var errorCount = 0;
+    var warnCount = 0;
+    var files = this.filesSrc;
+    var options = this.options();
+
+    if (options.configFile != undefined) {
+      var config = grunt.file.readJSON(options.configFile);
+      options.configFile = undefined;
+      for (var key in options) {
+          config[key] = options[key];
+      }
+      options = config;
+    }
+
+    var growl;
+    if (options.growl) {
+      growl = require('growl');
+    }
+
+    files.forEach(function(file) {
+      grunt.verbose.writeln('Linting ' + file + '...');
+
+      var literate = !!file.match(/\.(litcoffee|coffee\.md)$/i);
+      var errors = coffeelint.lint(grunt.file.read(file), options, literate);
+
+      if (!errors.length) {
+        return grunt.verbose.ok();
+      }
+
+      errors.forEach(function(error) {
+        var status, message;
+
+        if (error.level === 'error') {
+          errorCount += 1;
+          status = "[error]".red;
+        } else if (error.level === 'warn') {
+          warnCount += 1;
+          status = "[warn]".yellow;
+        } else {
+          return;
+        }
+
+        message = file + ':' + error.lineNumber + ' ' + error.message +
+            ' (' + error.rule + ')';
+
+        grunt.log.writeln(status + ' ' + message);
+        grunt.event.emit('coffeelint:' + error.level, error.level, message);
+        grunt.event.emit('coffeelint:any', error.level, message);
+
+        if (options.growl) {
+          growl(message, {title: "Coffeelint "+error.level, sticky: true});
+        }
+      });
+    });
+
+    if (errorCount && !options.force) {
+      return false;
+    }
+
+    if (!warnCount && !errorCount) {
+      grunt.log.ok(files.length + ' file' + (files.length === 1 ? '' : 's') + ' lint free.');
+    }
+  });
+};
Index: /Dev/trunk/node_modules/grunt-contrib-clean/node_modules/rimraf/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-clean/node_modules/rimraf/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-clean/node_modules/rimraf/package.json	(revision 516)
@@ -1,5 +1,5 @@
 {
   "name": "rimraf",
-  "version": "2.2.4",
+  "version": "2.2.6",
   "main": "rimraf.js",
   "description": "A deep deletion module for node (like `rm -rf`)",
@@ -12,7 +12,4 @@
     "type": "MIT",
     "url": "https://github.com/isaacs/rimraf/raw/master/LICENSE"
-  },
-  "optionalDependencies": {
-    "graceful-fs": "~2"
   },
   "repository": {
@@ -55,12 +52,9 @@
   },
   "homepage": "https://github.com/isaacs/rimraf",
-  "dependencies": {
-    "graceful-fs": "~2"
+  "_id": "rimraf@2.2.6",
+  "dist": {
+    "shasum": "c28d4de4cafcd392b82d02729509c65e3502240c"
   },
-  "_id": "rimraf@2.2.4",
-  "dist": {
-    "shasum": "853b5c60b25a2978dfb1f8d03ef55b667ae68352"
-  },
-  "_from": "rimraf@2.2.4",
-  "_resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.4.tgz"
+  "_from": "rimraf@2.2.6",
+  "_resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz"
 }
Index: /Dev/trunk/node_modules/grunt-contrib-clean/node_modules/rimraf/rimraf.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-clean/node_modules/rimraf/rimraf.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-clean/node_modules/rimraf/rimraf.js	(revision 516)
@@ -3,12 +3,5 @@
 
 var path = require("path")
-  , fs
-
-try {
-  // optional dependency
-  fs = require("graceful-fs")
-} catch (er) {
-  fs = require("fs")
-}
+var fs = require("fs")
 
 // for EMFILE handling
@@ -118,5 +111,5 @@
   // raise the original error.
   fs.rmdir(p, function (er) {
-    if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST"))
+    if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM"))
       rmkids(p, cb)
     else if (er && er.code === "ENOTDIR")
@@ -173,5 +166,5 @@
     if (er.code === "ENOTDIR")
       throw originalEr
-    if (er.code === "ENOTEMPTY" || er.code === "EEXIST")
+    if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")
       rmkidsSync(p)
   }
Index: /Dev/trunk/node_modules/grunt-contrib-clean/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-clean/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-clean/package.json	(revision 516)
@@ -35,5 +35,6 @@
     "grunt-contrib-nodeunit": "~0.1.2",
     "grunt-contrib-internal": "~0.4.4",
-    "grunt": "~0.4.0"
+    "grunt": "~0.4.0",
+    "rimraf": "^2.2.6"
   },
   "peerDependencies": {
Index: /Dev/trunk/node_modules/grunt-contrib-coffee/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-coffee/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-coffee/package.json	(revision 516)
@@ -44,6 +44,4 @@
     "gruntplugin"
   ],
-  "readme": "# grunt-contrib-coffee [![Build Status](https://secure.travis-ci.org/gruntjs/grunt-contrib-coffee.png?branch=master)](http://travis-ci.org/gruntjs/grunt-contrib-coffee)\n\n> Compile CoffeeScript files to JavaScript.\n\n\n\n## Getting Started\nThis plugin requires Grunt `~0.4.0`\n\nIf 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:\n\n```shell\nnpm install grunt-contrib-coffee --save-dev\n```\n\nOnce the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:\n\n```js\ngrunt.loadNpmTasks('grunt-contrib-coffee');\n```\n\n*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-coffee/tree/grunt-0.3-stable).*\n\n\n## Coffee task\n_Run this task with the `grunt coffee` command._\n\nTask targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide.\n### Options\n\n#### separator\nType: `String`\nDefault: linefeed\n\nConcatenated files will be joined on this string.\n\n#### bare\nType: `boolean`\n\nCompile the JavaScript without the top-level function safety wrapper.\n\n#### join\nType: `boolean`\nDefault: `false`\n\nWhen compiling multiple .coffee files into a single .js file, concatenate first.\n\n#### sourceMap\nType: `boolean`\nDefault: `false`\n\nCompile JavaScript and create a .map file linking it to the CoffeeScript source. When compiling multiple .coffee files to a single .js file, concatenation occurs as though the 'join' option is enabled. The concatenated CoffeeScript is written into the output directory, and becomes the target for source mapping.\n### Usage Examples\n\n```js\ncoffee: {\n  compile: {\n    files: {\n      'path/to/result.js': 'path/to/source.coffee', // 1:1 compile\n      'path/to/another.js': ['path/to/sources/*.coffee', 'path/to/more/*.coffee'] // compile and concat into single file\n    }\n  },\n\n  compileBare: {\n    options: {\n      bare: true\n    },\n    files: {\n      'path/to/result.js': 'path/to/source.coffee', // 1:1 compile\n      'path/to/another.js': ['path/to/sources/*.coffee', 'path/to/more/*.coffee'] // compile and concat into single file\n    }\n  },\n\n  compileJoined: {\n    options: {\n      join: true\n    },\n    files: {\n      'path/to/result.js': 'path/to/source.coffee', // 1:1 compile, identical output to join = false\n      'path/to/another.js': ['path/to/sources/*.coffee', 'path/to/more/*.coffee'] // concat then compile into single file\n    }\n  },\n\n  compileWithMaps: {\n    options: {\n      sourceMap: true\n    },\n    files: {\n      'path/to/result.js': 'path/to/source.coffee', // 1:1 compile\n      'path/to/another.js': ['path/to/sources/*.coffee', 'path/to/more/*.coffee'] // concat then compile into single file\n    }\n  },\n\n  glob_to_multiple: {\n    expand: true,\n    flatten: true,\n    cwd: 'path/to',\n    src: ['*.coffee'],\n    dest: 'path/to/dest/',\n    ext: '.js'\n  }\n}\n```\n\nFor more examples on how to use the `expand` API to manipulate the default dynamic path construction in the `glob_to_multiple` examples, see \"Building the files object dynamically\" in the grunt wiki entry [Configuring Tasks](http://gruntjs.com/configuring-tasks).\n\n## Release History\n\n * 2013-04-19âââv0.7.0âââPlace Sourcemaps at bottom of file Change extension for Sourcemaps from .maps to .js.map\n * 2013-04-18âââv0.6.7âââImproved error reporting\n * 2013-04-08âââv0.6.6âââFix regression with single-file compilation.\n * 2013-04-05âââv0.6.5âââImproved error reporting\n * 2013-03-22âââv0.6.4âââSourcemap support\n * 2013-03-19âââv0.6.3âââIncrease error logging verbosity.\n * 2013-03-18âââv0.6.2âââBump to CoffeeScript 1.6.2\n * 2013-03-18âââv0.6.1âââSupport `join` option\n * 2013-03-06âââv0.6.0âââBump to CoffeeScript 1.6 Support literate CoffeeScript extension coffee.md\n * 2013-02-25âââv0.5.0âââBump to CoffeeScript 1.5 Support literate CoffeeScript (.litcoffee)\n * 2013-02-15âââv0.4.0âââFirst official release for Grunt 0.4.0.\n * 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. Bump coffeescript dependency to 1.4.\n * 2013-01-09âââv0.4.0rc5âââUpdating to work with grunt v0.4.0rc5. Switching to this.filesSrc api.\n * 2012-12-15âââv0.4.0aâââConversion to grunt v0.4 conventions. Remove experimental destination wildcards.\n * 2012-10-12âââv0.3.2âââRename grunt-contrib-lib dep to grunt-lib-contrib.\n * 2012-09-25âââv0.3.1âââDon't fail when there are no files.\n * 2012-09-24âââv0.3.0âââGlobal options depreciated.\n * 2012-09-10âââv0.2.0âââRefactored from grunt-contrib into individual repo.\n\n---\n\nTask submitted by [Eric Woroshow](http://ericw.ca/)\n\n*This file was generated on Fri Apr 19 2013 09:49:08.*\n",
-  "readmeFilename": "README.md",
   "contributors": [
     {
@@ -84,5 +82,11 @@
     }
   ],
+  "readme": "# grunt-contrib-coffee [![Build Status](https://secure.travis-ci.org/gruntjs/grunt-contrib-coffee.png?branch=master)](http://travis-ci.org/gruntjs/grunt-contrib-coffee)\n\n> Compile CoffeeScript files to JavaScript.\n\n\n\n## Getting Started\nThis plugin requires Grunt `~0.4.0`\n\nIf 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:\n\n```shell\nnpm install grunt-contrib-coffee --save-dev\n```\n\nOnce the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:\n\n```js\ngrunt.loadNpmTasks('grunt-contrib-coffee');\n```\n\n*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-coffee/tree/grunt-0.3-stable).*\n\n\n## Coffee task\n_Run this task with the `grunt coffee` command._\n\nTask targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide.\n### Options\n\n#### separator\nType: `String`\nDefault: linefeed\n\nConcatenated files will be joined on this string.\n\n#### bare\nType: `boolean`\n\nCompile the JavaScript without the top-level function safety wrapper.\n\n#### join\nType: `boolean`\nDefault: `false`\n\nWhen compiling multiple .coffee files into a single .js file, concatenate first.\n\n#### sourceMap\nType: `boolean`\nDefault: `false`\n\nCompile JavaScript and create a .map file linking it to the CoffeeScript source. When compiling multiple .coffee files to a single .js file, concatenation occurs as though the 'join' option is enabled. The concatenated CoffeeScript is written into the output directory, and becomes the target for source mapping.\n### Usage Examples\n\n```js\ncoffee: {\n  compile: {\n    files: {\n      'path/to/result.js': 'path/to/source.coffee', // 1:1 compile\n      'path/to/another.js': ['path/to/sources/*.coffee', 'path/to/more/*.coffee'] // compile and concat into single file\n    }\n  },\n\n  compileBare: {\n    options: {\n      bare: true\n    },\n    files: {\n      'path/to/result.js': 'path/to/source.coffee', // 1:1 compile\n      'path/to/another.js': ['path/to/sources/*.coffee', 'path/to/more/*.coffee'] // compile and concat into single file\n    }\n  },\n\n  compileJoined: {\n    options: {\n      join: true\n    },\n    files: {\n      'path/to/result.js': 'path/to/source.coffee', // 1:1 compile, identical output to join = false\n      'path/to/another.js': ['path/to/sources/*.coffee', 'path/to/more/*.coffee'] // concat then compile into single file\n    }\n  },\n\n  compileWithMaps: {\n    options: {\n      sourceMap: true\n    },\n    files: {\n      'path/to/result.js': 'path/to/source.coffee', // 1:1 compile\n      'path/to/another.js': ['path/to/sources/*.coffee', 'path/to/more/*.coffee'] // concat then compile into single file\n    }\n  },\n\n  glob_to_multiple: {\n    expand: true,\n    flatten: true,\n    cwd: 'path/to',\n    src: ['*.coffee'],\n    dest: 'path/to/dest/',\n    ext: '.js'\n  }\n}\n```\n\nFor more examples on how to use the `expand` API to manipulate the default dynamic path construction in the `glob_to_multiple` examples, see \"Building the files object dynamically\" in the grunt wiki entry [Configuring Tasks](http://gruntjs.com/configuring-tasks).\n\n## Release History\n\n * 2013-04-19âââv0.7.0âââPlace Sourcemaps at bottom of file Change extension for Sourcemaps from .maps to .js.map\n * 2013-04-18âââv0.6.7âââImproved error reporting\n * 2013-04-08âââv0.6.6âââFix regression with single-file compilation.\n * 2013-04-05âââv0.6.5âââImproved error reporting\n * 2013-03-22âââv0.6.4âââSourcemap support\n * 2013-03-19âââv0.6.3âââIncrease error logging verbosity.\n * 2013-03-18âââv0.6.2âââBump to CoffeeScript 1.6.2\n * 2013-03-18âââv0.6.1âââSupport `join` option\n * 2013-03-06âââv0.6.0âââBump to CoffeeScript 1.6 Support literate CoffeeScript extension coffee.md\n * 2013-02-25âââv0.5.0âââBump to CoffeeScript 1.5 Support literate CoffeeScript (.litcoffee)\n * 2013-02-15âââv0.4.0âââFirst official release for Grunt 0.4.0.\n * 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. Bump coffeescript dependency to 1.4.\n * 2013-01-09âââv0.4.0rc5âââUpdating to work with grunt v0.4.0rc5. Switching to this.filesSrc api.\n * 2012-12-15âââv0.4.0aâââConversion to grunt v0.4 conventions. Remove experimental destination wildcards.\n * 2012-10-12âââv0.3.2âââRename grunt-contrib-lib dep to grunt-lib-contrib.\n * 2012-09-25âââv0.3.1âââDon't fail when there are no files.\n * 2012-09-24âââv0.3.0âââGlobal options depreciated.\n * 2012-09-10âââv0.2.0âââRefactored from grunt-contrib into individual repo.\n\n---\n\nTask submitted by [Eric Woroshow](http://ericw.ca/)\n\n*This file was generated on Fri Apr 19 2013 09:49:08.*\n",
+  "readmeFilename": "README.md",
   "_id": "grunt-contrib-coffee@0.7.0",
-  "_from": "grunt-contrib-coffee@~0.7.0"
+  "dist": {
+    "shasum": "9eac2d9460fa3c8962c38cb83cfe658a2fc1c8c9"
+  },
+  "_from": "grunt-contrib-coffee@0.7.0",
+  "_resolved": "https://registry.npmjs.org/grunt-contrib-coffee/-/grunt-contrib-coffee-0.7.0.tgz"
 }
Index: /Dev/trunk/node_modules/grunt-contrib-copy/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-copy/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-copy/package.json	(revision 516)
@@ -41,6 +41,4 @@
     "gruntplugin"
   ],
-  "readme": "# grunt-contrib-copy [![Build Status](https://secure.travis-ci.org/gruntjs/grunt-contrib-copy.png?branch=master)](http://travis-ci.org/gruntjs/grunt-contrib-copy)\n\n> Copy files and folders.\n\n\n\n## Getting Started\nThis plugin requires Grunt `~0.4.0`\n\nIf 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:\n\n```shell\nnpm install grunt-contrib-copy --save-dev\n```\n\nOnce the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:\n\n```js\ngrunt.loadNpmTasks('grunt-contrib-copy');\n```\n\n*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-copy/tree/grunt-0.3-stable).*\n\n\n\n## Copy task\n_Run this task with the `grunt copy` command._\n\nTask targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide.\n### Options\n\n#### processContent\nType: `Function(content, srcpath)`\n\nThis option is passed to `grunt.file.copy` as an advanced way to control the file contents that are copied.\n\n#### processContentExclude\nType: `String`\n\nThis option is passed to `grunt.file.copy` as an advanced way to control which file contents are processed.\n\n### Usage Examples\n\n```js\ncopy: {\n  main: {\n    files: [\n      {src: ['path/*'], dest: 'dest/', filter: 'isFile'}, // includes files in path\n      {src: ['path/**'], dest: 'dest/'}, // includes files in path and its subdirs\n      {expand: true, cwd: 'path/', src: ['**'], dest: 'dest/'}, // makes all src relative to cwd\n      {expand: true, flatten: true, src: ['path/**'], dest: 'dest/', filter: 'isFile'} // flattens results to a single level\n    ]\n  }\n}\n```\n\n\n## Release History\n\n * 2013-02-14âââv0.4.0âââFirst official release for Grunt 0.4.0.\n * 2013-01-22âââv0.4.0rc7âââUpdating grunt/gruntplugin dependencies to rc7. Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions.\n * 2013-01-13âââv0.4.0rc5âââUpdating to work with grunt v0.4.0rc5. Conversion to grunt v0.4 conventions. Replace basePath with cwd. Empty directory support.\n * 2012-10-17âââv0.3.2âââPass copyOptions on single file copy.\n * 2012-10-11âââv0.3.1âââRename grunt-contrib-lib dep to grunt-lib-contrib.\n * 2012-09-23âââv0.3.0âââGeneral cleanup and consolidation. Global options depreciated.\n * 2012-09-17âââv0.2.4âââNo valid source check.\n * 2012-09-16âââv0.2.3âââPath.sep fallback for node <= 0.7.9.\n * 2012-09-16âââv0.2.2âââSingle file copy support. Test refactoring.\n * 2012-09-06âââv0.2.0âââRefactored from grunt-contrib into individual repo.\n\n---\n\nTask submitted by [Chris Talkington](http://christalkington.com/)\n\n*This file was generated on Fri Feb 22 2013 09:26:58.*\n",
-  "readmeFilename": "README.md",
   "contributors": [
     {
@@ -65,5 +63,11 @@
     }
   ],
+  "readme": "# grunt-contrib-copy [![Build Status](https://secure.travis-ci.org/gruntjs/grunt-contrib-copy.png?branch=master)](http://travis-ci.org/gruntjs/grunt-contrib-copy)\n\n> Copy files and folders.\n\n\n\n## Getting Started\nThis plugin requires Grunt `~0.4.0`\n\nIf 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:\n\n```shell\nnpm install grunt-contrib-copy --save-dev\n```\n\nOnce the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:\n\n```js\ngrunt.loadNpmTasks('grunt-contrib-copy');\n```\n\n*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-copy/tree/grunt-0.3-stable).*\n\n\n\n## Copy task\n_Run this task with the `grunt copy` command._\n\nTask targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide.\n### Options\n\n#### processContent\nType: `Function(content, srcpath)`\n\nThis option is passed to `grunt.file.copy` as an advanced way to control the file contents that are copied.\n\n#### processContentExclude\nType: `String`\n\nThis option is passed to `grunt.file.copy` as an advanced way to control which file contents are processed.\n\n### Usage Examples\n\n```js\ncopy: {\n  main: {\n    files: [\n      {src: ['path/*'], dest: 'dest/', filter: 'isFile'}, // includes files in path\n      {src: ['path/**'], dest: 'dest/'}, // includes files in path and its subdirs\n      {expand: true, cwd: 'path/', src: ['**'], dest: 'dest/'}, // makes all src relative to cwd\n      {expand: true, flatten: true, src: ['path/**'], dest: 'dest/', filter: 'isFile'} // flattens results to a single level\n    ]\n  }\n}\n```\n\n\n## Release History\n\n * 2013-02-14âââv0.4.0âââFirst official release for Grunt 0.4.0.\n * 2013-01-22âââv0.4.0rc7âââUpdating grunt/gruntplugin dependencies to rc7. Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions.\n * 2013-01-13âââv0.4.0rc5âââUpdating to work with grunt v0.4.0rc5. Conversion to grunt v0.4 conventions. Replace basePath with cwd. Empty directory support.\n * 2012-10-17âââv0.3.2âââPass copyOptions on single file copy.\n * 2012-10-11âââv0.3.1âââRename grunt-contrib-lib dep to grunt-lib-contrib.\n * 2012-09-23âââv0.3.0âââGeneral cleanup and consolidation. Global options depreciated.\n * 2012-09-17âââv0.2.4âââNo valid source check.\n * 2012-09-16âââv0.2.3âââPath.sep fallback for node <= 0.7.9.\n * 2012-09-16âââv0.2.2âââSingle file copy support. Test refactoring.\n * 2012-09-06âââv0.2.0âââRefactored from grunt-contrib into individual repo.\n\n---\n\nTask submitted by [Chris Talkington](http://christalkington.com/)\n\n*This file was generated on Fri Feb 22 2013 09:26:58.*\n",
+  "readmeFilename": "README.md",
   "_id": "grunt-contrib-copy@0.4.1",
-  "_from": "grunt-contrib-copy@~0.4.1"
+  "dist": {
+    "shasum": "16b97c94a6f0853ff18fa34e6a1364233f28e8e6"
+  },
+  "_from": "grunt-contrib-copy@0.4.1",
+  "_resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-0.4.1.tgz"
 }
Index: /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/glob.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/glob.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/glob.js	(revision 516)
@@ -77,4 +77,5 @@
 }
 
+this._processingEmitQueue = false
 
 glob.Glob = Glob
@@ -99,6 +100,10 @@
   options = options || {}
 
+  this._endEmitted = false
   this.EOF = {}
   this._emitQueue = []
+
+  this.paused = false
+  this._processingEmitQueue = false
 
   this.maxDepth = options.maxDepth || 1000
@@ -217,17 +222,5 @@
   if (this.mark) {
     // at *some* point we statted all of these
-    all = all.map(function (m) {
-      var sc = this.cache[m]
-      if (!sc)
-        return m
-      var isDir = (Array.isArray(sc) || sc === 2)
-      if (isDir && m.slice(-1) !== "/") {
-        return m + "/"
-      }
-      if (!isDir && m.slice(-1) === "/") {
-        return m.replace(/\/+$/, "")
-      }
-      return m
-    }, this)
+    all = all.map(this._mark, this)
   }
 
@@ -246,4 +239,25 @@
 function alphasort (a, b) {
   return a > b ? 1 : a < b ? -1 : 0
+}
+
+Glob.prototype._mark = function (p) {
+  var c = this.cache[p]
+  var m = p
+  if (c) {
+    var isDir = c === 2 || Array.isArray(c)
+    var slash = p.slice(-1) === '/'
+
+    if (isDir && !slash)
+      m += '/'
+    else if (!isDir && slash)
+      m = m.slice(0, -1)
+
+    if (m !== p) {
+      this.statCache[m] = this.statCache[p]
+      this.cache[m] = this.cache[p]
+    }
+  }
+
+  return m
 }
 
@@ -272,32 +286,66 @@
 
 Glob.prototype.emitMatch = function (m) {
-  if (!this.stat || this.statCache[m] || m === this.EOF) {
-    this._emitQueue.push(m)
-    this._processEmitQueue()
-  } else {
-    this._stat(m, function(exists, isDir) {
-      if (exists) {
-        this._emitQueue.push(m)
-        this._processEmitQueue()
-      }
-    })
-  }
+  this.log('emitMatch', m)
+  this._emitQueue.push(m)
+  this._processEmitQueue()
 }
 
 Glob.prototype._processEmitQueue = function (m) {
+  this.log("pEQ paused=%j processing=%j m=%j", this.paused,
+           this._processingEmitQueue, m)
+  var done = false
   while (!this._processingEmitQueue &&
          !this.paused) {
     this._processingEmitQueue = true
     var m = this._emitQueue.shift()
+    this.log(">processEmitQueue", m === this.EOF ? ":EOF:" : m)
     if (!m) {
+      this.log(">processEmitQueue, falsey m")
       this._processingEmitQueue = false
       break
     }
 
-    this.log('emit!', m === this.EOF ? "end" : "match")
-
-    this.emit(m === this.EOF ? "end" : "match", m)
-    this._processingEmitQueue = false
-  }
+    if (m === this.EOF || !(this.mark && !this.stat)) {
+      this.log("peq: unmarked, or eof")
+      next.call(this, 0, false)
+    } else if (this.statCache[m]) {
+      var sc = this.statCache[m]
+      var exists
+      if (sc)
+        exists = sc.isDirectory() ? 2 : 1
+      this.log("peq: stat cached")
+      next.call(this, exists, exists === 2)
+    } else {
+      this.log("peq: _stat, then next")
+      this._stat(m, next)
+    }
+
+    function next(exists, isDir) {
+      this.log("next", m, exists, isDir)
+      var ev = m === this.EOF ? "end" : "match"
+
+      // "end" can only happen once.
+      assert(!this._endEmitted)
+      if (ev === "end")
+        this._endEmitted = true
+
+      if (exists) {
+        // Doesn't mean it necessarily doesn't exist, it's possible
+        // we just didn't check because we don't care that much, or
+        // this is EOF anyway.
+        if (isDir && !m.match(/\/$/)) {
+          m = m + "/"
+        } else if (!isDir && m.match(/\/$/)) {
+          m = m.replace(/\/+$/, "")
+        }
+      }
+      this.log("emit", ev, m)
+      this.emit(ev, m)
+      this._processingEmitQueue = false
+      if (done && m !== this.EOF && !this.paused)
+        this._processEmitQueue()
+    }
+  }
+  done = true
 }
 
Index: /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/package.json	(revision 516)
@@ -7,5 +7,5 @@
   "name": "glob",
   "description": "a little globber",
-  "version": "3.2.7",
+  "version": "3.2.9",
   "repository": {
     "type": "git",
@@ -26,5 +26,6 @@
   },
   "scripts": {
-    "test": "tap test/*.js"
+    "test": "tap test/*.js",
+    "test-regen": "TEST_REGEN=1 node test/00-setup.js"
   },
   "license": "BSD",
@@ -35,9 +36,5 @@
   },
   "homepage": "https://github.com/isaacs/node-glob",
-  "_id": "glob@3.2.7",
-  "dist": {
-    "shasum": "cd490a505ff7f2aef7a29ce0e4ce83d995ddbfc6"
-  },
-  "_from": "glob@>= 3.1.4",
-  "_resolved": "https://registry.npmjs.org/glob/-/glob-3.2.7.tgz"
+  "_id": "glob@3.2.9",
+  "_from": "glob@>= 3.1.4"
 }
Index: /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-results.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-results.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-results.json	(revision 516)
@@ -299,4 +299,5 @@
     "./test/nocase-nomagic.js",
     "./test/pause-resume.js",
+    "./test/readme-issue.js",
     "./test/root-nomount.js",
     "./test/root.js",
Index: /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/mark.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/mark.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/mark.js	(revision 516)
@@ -2,4 +2,40 @@
 var glob = require('../')
 process.chdir(__dirname)
+
+// expose timing issues
+var lag = 5
+glob.Glob.prototype._stat = function(o) { return function(f, cb) {
+  var args = arguments
+  setTimeout(function() {
+    o.call(this, f, cb)
+  }.bind(this), lag += 5)
+}}(glob.Glob.prototype._stat)
+
+
+test("mark, with **", function (t) {
+  glob("a/*b*/**", {mark: true}, function (er, results) {
+    if (er)
+      throw er
+    var expect =
+      [ 'a/abcdef/',
+        'a/abcdef/g/',
+        'a/abcdef/g/h',
+        'a/abcfed/',
+        'a/abcfed/g/',
+        'a/abcfed/g/h',
+        'a/b/',
+        'a/b/c/',
+        'a/b/c/d',
+        'a/bc/',
+        'a/bc/e/',
+        'a/bc/e/f',
+        'a/cb/',
+        'a/cb/e/',
+        'a/cb/e/f' ]
+
+    t.same(results, expect)
+    t.end()
+  })
+})
 
 test("mark, no / on pattern", function (t) {
@@ -19,4 +55,6 @@
     t.same(results, expect)
     t.end()
+  }).on('match', function(m) {
+    t.similar(m, /\/$/)
   })
 })
@@ -37,4 +75,6 @@
     t.same(results, expect)
     t.end()
+  }).on('match', function(m) {
+    t.similar(m, /[^\/]$/)
   })
 })
@@ -54,4 +94,6 @@
     t.same(results, expect)
     t.end()
+  }).on('match', function(m) {
+    t.similar(m, /\/$/)
   })
 })
@@ -71,4 +113,6 @@
     t.same(results, expect)
     t.end()
+  }).on('match', function(m) {
+    t.similar(m, /\/$/)
   })
 })
Index: /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/readme-issue.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/readme-issue.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/readme-issue.js	(revision 516)
@@ -0,0 +1,36 @@
+var test = require("tap").test
+var glob = require("../")
+
+var mkdirp = require("mkdirp")
+var fs = require("fs")
+var rimraf = require("rimraf")
+var dir = __dirname + "/package"
+
+test("setup", function (t) {
+  mkdirp.sync(dir)
+  fs.writeFileSync(dir + "/package.json", "{}", "ascii")
+  fs.writeFileSync(dir + "/README", "x", "ascii")
+  t.pass("setup done")
+  t.end()
+})
+
+test("glob", function (t) {
+  var opt = {
+    cwd: dir,
+    nocase: true,
+    mark: true
+  }
+
+  glob("README?(.*)", opt, function (er, files) {
+    if (er)
+      throw er
+    t.same(files, ["README"])
+    t.end()
+  })
+})
+
+test("cleanup", function (t) {
+  rimraf.sync(dir)
+  t.pass("clean")
+  t.end()
+})
Index: /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/package.json	(revision 516)
@@ -50,8 +50,4 @@
   "readmeFilename": "README.md",
   "_id": "cli@0.4.5",
-  "dist": {
-    "shasum": "e4be7ec0a35b5ce30039b58f9382fc4f4b881810"
-  },
-  "_from": "cli@0.4.x",
-  "_resolved": "https://registry.npmjs.org/cli/-/cli-0.4.5.tgz"
+  "_from": "cli@0.4.x"
 }
Index: /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/.npmignore
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/.npmignore	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/.npmignore	(revision 516)
@@ -0,0 +1,1 @@
+node_modules
Index: /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/README.md	(revision 516)
@@ -20,4 +20,5 @@
 minimatch("bar.foo", "*.foo") // true!
 minimatch("bar.foo", "*.bar") // false!
+minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy!
 ```
 
@@ -36,42 +37,4 @@
 * `man 3 fnmatch`
 * `man 5 gitignore`
-
-### Comparisons to other fnmatch/glob implementations
-
-While strict compliance with the existing standards is a worthwhile
-goal, some discrepancies exist between minimatch and other
-implementations, and are intentional.
-
-If the pattern starts with a `!` character, then it is negated.  Set the
-`nonegate` flag to suppress this behavior, and treat leading `!`
-characters normally.  This is perhaps relevant if you wish to start the
-pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
-characters at the start of a pattern will negate the pattern multiple
-times.
-
-If a pattern starts with `#`, then it is treated as a comment, and
-will not match anything.  Use `\#` to match a literal `#` at the
-start of a line, or set the `nocomment` flag to suppress this behavior.
-
-The double-star character `**` is supported by default, unless the
-`noglobstar` flag is set.  This is supported in the manner of bsdglob
-and bash 4.1, where `**` only has special significance if it is the only
-thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
-`a/**b` will not.  **Note that this is different from the way that `**` is
-handled by ruby's `Dir` class.**
-
-If an escaped pattern has no matches, and the `nonull` flag is set,
-then minimatch.match returns the pattern as-provided, rather than
-interpreting the character escapes.  For example,
-`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
-`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
-that it does not resolve escaped pattern characters.
-
-If brace expansion is not disabled, then it is performed before any
-other interpretation of the glob pattern.  Thus, a pattern like
-`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
-**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
-checked for validity.  Since those two are valid, matching proceeds.
-
 
 ## Minimatch Class
@@ -217,2 +180,39 @@
 Returns from negate expressions the same as if they were not negated.
 (Ie, true on a hit, false on a miss.)
+
+
+## Comparisons to other fnmatch/glob implementations
+
+While strict compliance with the existing standards is a worthwhile
+goal, some discrepancies exist between minimatch and other
+implementations, and are intentional.
+
+If the pattern starts with a `!` character, then it is negated.  Set the
+`nonegate` flag to suppress this behavior, and treat leading `!`
+characters normally.  This is perhaps relevant if you wish to start the
+pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
+characters at the start of a pattern will negate the pattern multiple
+times.
+
+If a pattern starts with `#`, then it is treated as a comment, and
+will not match anything.  Use `\#` to match a literal `#` at the
+start of a line, or set the `nocomment` flag to suppress this behavior.
+
+The double-star character `**` is supported by default, unless the
+`noglobstar` flag is set.  This is supported in the manner of bsdglob
+and bash 4.1, where `**` only has special significance if it is the only
+thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
+`a/**b` will not.
+
+If an escaped pattern has no matches, and the `nonull` flag is set,
+then minimatch.match returns the pattern as-provided, rather than
+interpreting the character escapes.  For example,
+`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
+`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
+that it does not resolve escaped pattern characters.
+
+If brace expansion is not disabled, then it is performed before any
+other interpretation of the glob pattern.  Thus, a pattern like
+`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
+**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
+checked for validity.  Since those two are valid, matching proceeds.
Index: /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/minimatch.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/minimatch.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/minimatch.js	(revision 516)
@@ -69,15 +69,4 @@
 var slashSplit = /\/+/
 
-minimatch.monkeyPatch = monkeyPatch
-function monkeyPatch () {
-  var desc = Object.getOwnPropertyDescriptor(String.prototype, "match")
-  var orig = desc.value
-  desc.value = function (p) {
-    if (p instanceof Minimatch) return p.match(this)
-    return orig.call(this, p)
-  }
-  Object.defineProperty(String.prototype, desc)
-}
-
 minimatch.filter = filter
 function filter (pattern, options) {
@@ -179,4 +168,6 @@
 }
 
+Minimatch.prototype.debug = function() {}
+
 Minimatch.prototype.make = make
 function make () {
@@ -203,5 +194,7 @@
   var set = this.globSet = this.braceExpand()
 
-  if (options.debug) console.error(this.pattern, set)
+  if (options.debug) this.debug = console.error
+
+  this.debug(this.pattern, set)
 
   // step 3: now we have a set, so turn each one into a series of path-portion
@@ -214,5 +207,5 @@
   })
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   // glob --> regexps
@@ -221,5 +214,5 @@
   }, this)
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   // filter out everything that didn't compile properly.
@@ -228,5 +221,5 @@
   })
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   this.set = set
@@ -303,9 +296,9 @@
   // and then prepend it to everything we find.
   if (pattern.charAt(0) !== "{") {
-    // console.error(pattern)
+    this.debug(pattern)
     var prefix = null
     for (var i = 0, l = pattern.length; i < l; i ++) {
       var c = pattern.charAt(i)
-      // console.error(i, c)
+      this.debug(i, c)
       if (c === "\\") {
         escaping = !escaping
@@ -318,9 +311,9 @@
     // actually no sets, all { were escaped.
     if (prefix === null) {
-      // console.error("no sets")
+      this.debug("no sets")
       return [pattern]
     }
 
-    var tail = braceExpand(pattern.substr(i), options)
+   var tail = braceExpand.call(this, pattern.substr(i), options)
     return tail.map(function (t) {
       return prefix + t
@@ -337,6 +330,6 @@
   var numset = pattern.match(/^\{(-?[0-9]+)\.\.(-?[0-9]+)\}/)
   if (numset) {
-    // console.error("numset", numset[1], numset[2])
-    var suf = braceExpand(pattern.substr(numset[0].length), options)
+    this.debug("numset", numset[1], numset[2])
+    var suf = braceExpand.call(this, pattern.substr(numset[0].length), options)
       , start = +numset[1]
       , end = +numset[2]
@@ -370,8 +363,8 @@
   }
 
-  // console.error("Entering for")
+  this.debug("Entering for")
   FOR: for (i = 1, l = pattern.length; i < l; i ++) {
     var c = pattern.charAt(i)
-    // console.error("", i, c)
+    this.debug("", i, c)
 
     if (escaping) {
@@ -421,20 +414,20 @@
   // and need to escape the leading brace
   if (depth !== 0) {
-    // console.error("didn't close", pattern)
-    return braceExpand("\\" + pattern, options)
+    this.debug("didn't close", pattern)
+    return braceExpand.call(this, "\\" + pattern, options)
   }
 
   // x{y,z} -> ["xy", "xz"]
-  // console.error("set", set)
-  // console.error("suffix", pattern.substr(i))
-  var suf = braceExpand(pattern.substr(i), options)
+  this.debug("set", set)
+  this.debug("suffix", pattern.substr(i))
+  var suf = braceExpand.call(this, pattern.substr(i), options)
   // ["b", "c{d,e}","{f,g}h"] ->
   //   [["b"], ["cd", "ce"], ["fh", "gh"]]
   var addBraces = set.length === 1
-  // console.error("set pre-expanded", set)
+  this.debug("set pre-expanded", set)
   set = set.map(function (p) {
-    return braceExpand(p, options)
-  })
-  // console.error("set expanded", set)
+    return braceExpand.call(this, p, options)
+  }, this)
+  this.debug("set expanded", set)
 
 
@@ -497,4 +490,5 @@
       : options.dot ? "(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))"
       : "(?!\\.)"
+    , self = this
 
   function clearStateChar () {
@@ -515,4 +509,5 @@
           break
       }
+      self.debug('clearStateChar %j %j', stateChar, re)
       stateChar = false
     }
@@ -523,7 +518,5 @@
       ; i ++ ) {
 
-    if (options.debug) {
-      console.error("%s\t%s %s %j", pattern, i, re, c)
-    }
+    this.debug("%s\t%s %s %j", pattern, i, re, c)
 
     // skip over any that are escaped.
@@ -552,11 +545,10 @@
       case "@":
       case "!":
-        if (options.debug) {
-          console.error("%s\t%s %s %j <-- stateChar", pattern, i, re, c)
-        }
+        this.debug("%s\t%s %s %j <-- stateChar", pattern, i, re, c)
 
         // all of those are literals inside a class, except that
         // the glob [!a] means [^a] in regexp
         if (inClass) {
+          this.debug('  in class')
           if (c === "!" && i === classStart + 1) c = "^"
           re += c
@@ -567,4 +559,5 @@
         // that there was something like ** or +? in there.
         // Handle the stateChar, then proceed with this one.
+        self.debug('call clearStateChar %j', stateChar)
         clearStateChar()
         stateChar = c
@@ -592,4 +585,5 @@
         // negation is (?:(?!js)[^/]*)
         re += stateChar === "!" ? "(?:(?!" : "(?:"
+        this.debug('plType %j %j', stateChar, re)
         stateChar = false
         continue
@@ -601,4 +595,5 @@
         }
 
+        clearStateChar()
         hasMagic = true
         re += ")"
@@ -624,4 +619,5 @@
         }
 
+        clearStateChar()
         re += "|"
         continue
@@ -716,5 +712,5 @@
     })
 
-    // console.error("tail=%j\n   %s", tail, tail)
+    this.debug("tail=%j\n   %s", tail, tail)
     var t = pl.type === "*" ? star
           : pl.type === "?" ? qmark
@@ -830,5 +826,5 @@
 Minimatch.prototype.match = match
 function match (f, partial) {
-  // console.error("match", f, this.pattern)
+  this.debug("match", f, this.pattern)
   // short-circuit in the case of busted things.
   // comments, etc.
@@ -848,7 +844,5 @@
   // treat the test path as a set of pathparts.
   f = f.split(slashSplit)
-  if (options.debug) {
-    console.error(this.pattern, "split", f)
-  }
+  this.debug(this.pattern, "split", f)
 
   // just ONE of the pattern sets in this.set needs to match
@@ -858,9 +852,14 @@
 
   var set = this.set
-  // console.error(this.pattern, "set", set)
+  this.debug(this.pattern, "set", set)
+
+  var splitFile = path.basename(f.join("/")).split("/")
 
   for (var i = 0, l = set.length; i < l; i ++) {
-    var pattern = set[i]
-    var hit = this.matchOne(f, pattern, partial)
+    var pattern = set[i], file = f
+    if (options.matchBase && pattern.length === 1) {
+      file = splitFile
+    }
+    var hit = this.matchOne(file, pattern, partial)
     if (hit) {
       if (options.flipNegate) return true
@@ -883,18 +882,10 @@
   var options = this.options
 
-  if (options.debug) {
-    console.error("matchOne",
-                  { "this": this
-                  , file: file
-                  , pattern: pattern })
-  }
-
-  if (options.matchBase && pattern.length === 1) {
-    file = path.basename(file.join("/")).split("/")
-  }
-
-  if (options.debug) {
-    console.error("matchOne", file.length, pattern.length)
-  }
+  this.debug("matchOne",
+              { "this": this
+              , file: file
+              , pattern: pattern })
+
+  this.debug("matchOne", file.length, pattern.length)
 
   for ( var fi = 0
@@ -905,13 +896,9 @@
       ; fi ++, pi ++ ) {
 
-    if (options.debug) {
-      console.error("matchOne loop")
-    }
+    this.debug("matchOne loop")
     var p = pattern[pi]
       , f = file[fi]
 
-    if (options.debug) {
-      console.error(pattern, p, f)
-    }
+    this.debug(pattern, p, f)
 
     // should be impossible.
@@ -920,6 +907,5 @@
 
     if (p === GLOBSTAR) {
-      if (options.debug)
-        console.error('GLOBSTAR', [pattern, p, f])
+      this.debug('GLOBSTAR', [pattern, p, f])
 
       // "**"
@@ -948,6 +934,5 @@
         , pr = pi + 1
       if (pr === pl) {
-        if (options.debug)
-          console.error('** at the end')
+        this.debug('** at the end')
         // a ** at the end will just swallow the rest.
         // We have found a match.
@@ -967,13 +952,10 @@
         var swallowee = file[fr]
 
-        if (options.debug) {
-          console.error('\nglobstar while',
-                        file, fr, pattern, pr, swallowee)
-        }
+        this.debug('\nglobstar while',
+                    file, fr, pattern, pr, swallowee)
 
         // XXX remove this slice.  Just pass the start index.
         if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
-          if (options.debug)
-            console.error('globstar found match!', fr, fl, swallowee)
+          this.debug('globstar found match!', fr, fl, swallowee)
           // found a match.
           return true
@@ -983,12 +965,10 @@
           if (swallowee === "." || swallowee === ".." ||
               (!options.dot && swallowee.charAt(0) === ".")) {
-            if (options.debug)
-              console.error("dot detected!", file, fr, pattern, pr)
+            this.debug("dot detected!", file, fr, pattern, pr)
             break WHILE
           }
 
           // ** swallows a segment, and continue.
-          if (options.debug)
-            console.error('globstar swallow a segment, and continue')
+          this.debug('globstar swallow a segment, and continue')
           fr ++
         }
@@ -999,5 +979,5 @@
       if (partial) {
         // ran out of file
-        // console.error("\n>>> no match, partial?", file, fr, pattern, pr)
+        this.debug("\n>>> no match, partial?", file, fr, pattern, pr)
         if (fr === fl) return true
       }
@@ -1015,12 +995,8 @@
         hit = f === p
       }
-      if (options.debug) {
-        console.error("string match", p, f, hit)
-      }
+      this.debug("string match", p, f, hit)
     } else {
       hit = f.match(p)
-      if (options.debug) {
-        console.error("pattern match", p, f, hit)
-      }
+      this.debug("pattern match", p, f, hit)
     }
 
Index: /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/package.json	(revision 516)
@@ -30,8 +30,4 @@
   "homepage": "https://github.com/isaacs/node-lru-cache",
   "_id": "lru-cache@2.5.0",
-  "dist": {
-    "shasum": "be07d09e5b05f10b83d0cf01d4891a7729288c69"
-  },
-  "_from": "lru-cache@2",
-  "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
+  "_from": "lru-cache@2"
 }
Index: /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/package.json	(revision 516)
@@ -7,5 +7,5 @@
   "name": "minimatch",
   "description": "a glob matcher in javascript",
-  "version": "0.2.12",
+  "version": "0.2.14",
   "repository": {
     "type": "git",
@@ -14,5 +14,5 @@
   "main": "minimatch.js",
   "scripts": {
-    "test": "tap test"
+    "test": "tap test/*.js"
   },
   "engines": {
@@ -30,5 +30,5 @@
     "url": "http://github.com/isaacs/minimatch/raw/master/LICENSE"
   },
-  "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n### Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated.  Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally.  This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything.  Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set.  This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.  **Note that this is different from the way that `**` is\nhandled by ruby's `Dir` class.**\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes.  For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`.  This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern.  Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity.  Since those two are valid, matching proceeds.\n\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n  Each row in the\n  array corresponds to a brace-expanded pattern.  Each item in the row\n  corresponds to a single path-part.  For example, the pattern\n  `{a,b/c}/d` would expand to a set of patterns like:\n\n        [ [ a, d ]\n        , [ b, c, d ] ]\n\n    If a portion of the pattern doesn't have any \"magic\" in it\n    (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n    will be left as a string rather than converted to a regular\n    expression.\n\n* `regexp` Created by the `makeRe` method.  A single regular expression\n  expressing the entire pattern.  This is useful in cases where you wish\n  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n  Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n  false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n  filename, and match it against a single row in the `regExpSet`.  This\n  method is mainly for internal use, but is exposed so that it can be\n  used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items.  So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export.  Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`.  Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob.  If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself.  When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes.  For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n",
+  "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\nminimatch(\"bar.foo\", \"*.+(bar|foo)\", { debug: true }) // true, and noisy!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n  Each row in the\n  array corresponds to a brace-expanded pattern.  Each item in the row\n  corresponds to a single path-part.  For example, the pattern\n  `{a,b/c}/d` would expand to a set of patterns like:\n\n        [ [ a, d ]\n        , [ b, c, d ] ]\n\n    If a portion of the pattern doesn't have any \"magic\" in it\n    (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n    will be left as a string rather than converted to a regular\n    expression.\n\n* `regexp` Created by the `makeRe` method.  A single regular expression\n  expressing the entire pattern.  This is useful in cases where you wish\n  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n  Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n  false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n  filename, and match it against a single row in the `regExpSet`.  This\n  method is mainly for internal use, but is exposed so that it can be\n  used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items.  So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export.  Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`.  Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob.  If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself.  When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes.  For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated.  Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally.  This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything.  Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set.  This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes.  For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`.  This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern.  Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity.  Since those two are valid, matching proceeds.\n",
   "readmeFilename": "README.md",
   "bugs": {
@@ -36,5 +36,5 @@
   },
   "homepage": "https://github.com/isaacs/minimatch",
-  "_id": "minimatch@0.2.12",
-  "_from": "minimatch@0.x.x"
+  "_id": "minimatch@0.2.14",
+  "_from": "minimatch@~0.2.12"
 }
Index: /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/extglob-ending-with-state-char.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/extglob-ending-with-state-char.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/extglob-ending-with-state-char.js	(revision 516)
@@ -0,0 +1,8 @@
+var test = require('tap').test
+var minimatch = require('../')
+
+test('extglob ending with statechar', function(t) {
+  t.notOk(minimatch('ax', 'a?(b*)'))
+  t.ok(minimatch('ax', '?(a*|b)'))
+  t.end()
+})
Index: /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-jshint/node_modules/jshint/package.json	(revision 516)
@@ -67,8 +67,4 @@
   "readmeFilename": "README.md",
   "_id": "jshint@2.1.11",
-  "dist": {
-    "shasum": "489758eda8a6b0059179f2314afa39d34a5bc333"
-  },
-  "_from": "jshint@~2.1.10",
-  "_resolved": "https://registry.npmjs.org/jshint/-/jshint-2.1.11.tgz"
+  "_from": "jshint@~2.1.10"
 }
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/grunt-lib-contrib/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/grunt-lib-contrib/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/grunt-lib-contrib/package.json	(revision 516)
@@ -36,4 +36,6 @@
     "zlib-browserify": "0.0.1"
   },
+  "readme": "# 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)\n\n> Common functionality shared across grunt-contrib tasks.\n\nThe purpose of grunt-lib-contrib is to explore solutions to common problems task writers encounter, and to ease the upgrade path for contrib tasks.\n\n**These APIs should be considered highly unstable. Depend on them at your own risk!**\n\n_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._\n\n### Helper Functions\n\n#### getNamespaceDeclaration(ns)\n\nThis helper is used to build JS namespace declarations.\n\n#### optsToArgs(options)\n\nConvert an object to an array of CLI arguments, which can be used with `child_process.spawn()`.\n\n```js\n// Example\n{\n  fooBar: 'a',        // ['--foo-bar', 'a']\n  fooBar: 1,          // ['--foo-bar', '1']\n  fooBar: true,       // ['--foo-bar']\n  fooBar: false,      //\n  fooBar: ['a', 'b']  // ['--foo-bar', 'a', '--foo-bar', 'b']\n}\n```\n\n#### stripPath(pth, strip)\n\nStrip a path from a path. normalize both paths for best results.\n\n#### minMaxInfo(min, max, report)\n\nHelper for logging compressed, uncompressed and gzipped sizes of strings.\n\n#### report\nChoices: `false`, `'min'`, `'gzip'`\nDefault: `false`\n\nEither do not report anything, report only minification result, or report minification and gzip results.\n\n**Important** Including `'gzip'` results can make this task 5-10x slower depending on the size of the file.\n\n\n```js\nvar max = grunt.file.read('max.js');\nvar min = minify(max);\nminMaxInfo(min, max, 'gzip');\n```\n\nWould print:\n\n```\nOriginal: 495 bytes.\nMinified: 396 bytes.\nGzipped: 36 bytes.\n```\n\n--\n\n*Lib submitted by [Tyler Kellen](https://goingslowly.com/).*",
+  "readmeFilename": "README.md",
   "contributors": [
     {
@@ -54,6 +56,4 @@
     }
   ],
-  "readme": "# 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)\n\n> Common functionality shared across grunt-contrib tasks.\n\nThe purpose of grunt-lib-contrib is to explore solutions to common problems task writers encounter, and to ease the upgrade path for contrib tasks.\n\n**These APIs should be considered highly unstable. Depend on them at your own risk!**\n\n_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._\n\n### Helper Functions\n\n#### getNamespaceDeclaration(ns)\n\nThis helper is used to build JS namespace declarations.\n\n#### optsToArgs(options)\n\nConvert an object to an array of CLI arguments, which can be used with `child_process.spawn()`.\n\n```js\n// Example\n{\n  fooBar: 'a',        // ['--foo-bar', 'a']\n  fooBar: 1,          // ['--foo-bar', '1']\n  fooBar: true,       // ['--foo-bar']\n  fooBar: false,      //\n  fooBar: ['a', 'b']  // ['--foo-bar', 'a', '--foo-bar', 'b']\n}\n```\n\n#### stripPath(pth, strip)\n\nStrip a path from a path. normalize both paths for best results.\n\n#### minMaxInfo(min, max, report)\n\nHelper for logging compressed, uncompressed and gzipped sizes of strings.\n\n#### report\nChoices: `false`, `'min'`, `'gzip'`\nDefault: `false`\n\nEither do not report anything, report only minification result, or report minification and gzip results.\n\n**Important** Including `'gzip'` results can make this task 5-10x slower depending on the size of the file.\n\n\n```js\nvar max = grunt.file.read('max.js');\nvar min = minify(max);\nminMaxInfo(min, max, 'gzip');\n```\n\nWould print:\n\n```\nOriginal: 495 bytes.\nMinified: 396 bytes.\nGzipped: 36 bytes.\n```\n\n--\n\n*Lib submitted by [Tyler Kellen](https://goingslowly.com/).*",
-  "readmeFilename": "README.md",
   "_id": "grunt-lib-contrib@0.6.1",
   "_from": "grunt-lib-contrib@~0.6.1"
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/mime/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/mime/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/mime/package.json	(revision 516)
@@ -33,4 +33,5 @@
   "homepage": "https://github.com/broofa/node-mime",
   "_id": "mime@1.2.11",
-  "_from": "mime@1.2.x"
+  "_from": "mime@1.2.x",
+  "scripts": {}
 }
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/mkdirp/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/mkdirp/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/mkdirp/package.json	(revision 516)
@@ -31,8 +31,4 @@
   "homepage": "https://github.com/substack/node-mkdirp",
   "_id": "mkdirp@0.3.5",
-  "dist": {
-    "shasum": "7d4fee48c751e68eddf5903038ad25370cd80618"
-  },
-  "_from": "mkdirp@~0.3.4",
-  "_resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz"
+  "_from": "mkdirp@~0.3.4"
 }
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/.npmignore
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/.npmignore	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/.npmignore	(revision 516)
@@ -1,1 +1,2 @@
+tests
 node_modules
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/.travis.yml
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/.travis.yml	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/.travis.yml	(revision 516)
@@ -0,0 +1,12 @@
+language: node_js
+node_js:
+  - 0.8
+  - 0.10
+
+env:
+  - OPTIONALS=Y
+  - OPTIONALS=N
+
+install:
+  - if [[ "$OPTIONALS" == "Y" ]]; then npm install; fi
+  - if [[ "$OPTIONALS" == "N" ]]; then npm install --no-optional; fi
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/README.md	(revision 516)
@@ -24,5 +24,5 @@
 ```
 
-You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers.
+You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types (in this case `application/json`) and use the proper `content-type` in the PUT request (if the headers donât already provide one).
 
 ```javascript
@@ -30,5 +30,5 @@
 ```
 
-Request can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers.
+Request can also `pipe` to itself. When doing so, `content-type` and `content-length` are preserved in the PUT headers.
 
 ```javascript
@@ -36,5 +36,5 @@
 ```
 
-Now let's get fancy.
+Now letâs get fancy.
 
 ```javascript
@@ -50,5 +50,5 @@
 ```
 
-You can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do:
+You can also `pipe()` from `http.ServerRequest` instances, as well as to `http.ServerResponse` instances. The HTTP method, headers, and entity-body data will be sent. Which means that, if you don't really care about security, you can do:
 
 ```javascript
@@ -62,5 +62,5 @@
 ```
 
-And since pipe() returns the destination stream in node 0.5.x you can do one line proxying :)
+And since `pipe()` returns the destination stream in â¥ Node 0.5.x you can do one line proxying. :)
 
 ```javascript
@@ -79,11 +79,24 @@
 })
 ```
+
 You can still use intermediate proxies, the requests will still follow HTTP forwards, etc.
 
+## UNIX Socket 
+
+`request` supports the `unix://` protocol for all requests. The path is assumed to be absolute to the root of the host file system. 
+
+HTTP paths are extracted from the supplied URL by testing each level of the full URL against net.connect for a socket response.
+
+Thus the following request will GET `/httppath` from the HTTP server listening on `/tmp/unix.socket`
+
+```javascript
+request.get('unix://tmp/unix.socket/httppath')
+```
+
 ## Forms
 
 `request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API.
 
-Url encoded forms are simple
+URL-encoded forms are simple.
 
 ```javascript
@@ -93,5 +106,5 @@
 ```
 
-For `multipart/form-data` we use the [form-data](https://github.com/felixge/node-form-data) library by [@felixge](https://github.com/felixge). You don't need to worry about piping the form object or setting the headers, `request` will handle that for you.
+For `multipart/form-data` we use the [form-data](https://github.com/felixge/node-form-data) library by [@felixge](https://github.com/felixge). You donât need to worry about piping the form object or setting the headers, `request` will handle that for you.
 
 ```javascript
@@ -120,7 +133,7 @@
 If passed as an option, `auth` should be a hash containing values `user` || `username`, `password` || `pass`, and `sendImmediately` (optional).  The method form takes parameters `auth(username, password, sendImmediately)`.
 
-`sendImmediately` defaults to true, which will cause a basic authentication header to be sent.  If `sendImmediately` is `false`, then `request` will retry with a proper authentication header after receiving a 401 response from the server (which must contain a `WWW-Authenticate` header indicating the required authentication method).
-
-Digest authentication is supported, but it only works with `sendImmediately` set to `false` (otherwise `request` will send basic authentication on the initial request, which will probably cause the request to fail).
+`sendImmediately` defaults to `true`, which causes a basic authentication header to be sent.  If `sendImmediately` is `false`, then `request` will retry with a proper authentication header after receiving a `401` response from the server (which must contain a `WWW-Authenticate` header indicating the required authentication method).
+
+Digest authentication is supported, but it only works with `sendImmediately` set to `false`; otherwise `request` will send basic authentication on the initial request, which will probably cause the request to fail.
 
 ## OAuth Signing
@@ -158,5 +171,5 @@
         , token_secret: perm_token.oauth_token_secret
         }
-      , url = 'https://api.twitter.com/1/users/show.json?'
+      , url = 'https://api.twitter.com/1.1/users/show.json?'
       , params =
         { screen_name: perm_token.screen_name
@@ -172,37 +185,67 @@
 ```
 
-
+### Custom HTTP Headers
+
+HTTP Headers, such as `User-Agent`, can be set in the `options` object.
+In the example below, we call the github API to find out the number
+of stars and forks for the request repository. This requires a
+custom `User-Agent` header as well as https.
+
+```javascript
+var request = require('request');
+
+var options = {
+	url: 'https://api.github.com/repos/mikeal/request',
+	headers: {
+		'User-Agent': 'request'
+	}
+};
+
+function callback(error, response, body) {
+	if (!error && response.statusCode == 200) {
+		var info = JSON.parse(body);
+		console.log(info.stargazers_count + " Stars");
+		console.log(info.forks_count + " Forks");
+	}
+}
+
+request(options, callback);
+```
 
 ### request(options, callback)
 
-The first argument can be either a url or an options object. The only required option is uri, all others are optional.
-
-* `uri` || `url` - fully qualified uri or a parsed url object from url.parse()
-* `qs` - object containing querystring values to be appended to the uri
-* `method` - http method, defaults to GET
-* `headers` - http headers, defaults to {}
-* `body` - entity body for PATCH, POST and PUT requests. Must be buffer or string.
-* `form` - when passed an object this will set `body` but to a querystring representation of value and adds `Content-type: application/x-www-form-urlencoded; charset=utf-8` header. When passed no option a FormData instance is returned that will be piped to request.
+The first argument can be either a `url` or an `options` object. The only required option is `uri`; all others are optional.
+
+* `uri` || `url` - fully qualified uri or a parsed url object from `url.parse()`
+* `qs` - object containing querystring values to be appended to the `uri`
+* `method` - http method (default: `"GET"`)
+* `headers` - http headers (default: `{}`)
+* `body` - entity body for PATCH, POST and PUT requests. Must be a `Buffer` or `String`.
+* `form` - when passed an object, this sets `body` to a querystring representation of value, and adds `Content-type: application/x-www-form-urlencoded; charset=utf-8` header. When passed no options, a `FormData` instance is returned (and is piped to request).
 * `auth` - A hash containing values `user` || `username`, `password` || `pass`, and `sendImmediately` (optional).  See documentation above.
-* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header.  Additionally, parses the response body as json.
+* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header.  Additionally, parses the response body as JSON.
 * `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below.
-* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true.
-* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects. defaults to false.
-* `maxRedirects` - the maximum number of redirects to follow, defaults to 10.
-* `encoding` - Encoding to be used on `setEncoding` of response data. If set to `null`, the body is returned as a Buffer.
-* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets.
+* `followRedirect` - follow HTTP 3xx responses as redirects (default: `true`)
+* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects (default: `false`)
+* `maxRedirects` - the maximum number of redirects to follow (default: `10`)
+* `encoding` - Encoding to be used on `setEncoding` of response data. If `null`, the `body` is returned as a `Buffer`.
+* `pool` - A hash object containing the agents for these requests. If omitted, the request will use the global pool (which is set to node's default `maxSockets`)
 * `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool.
 * `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request
-* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri.
-* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above.
+* `proxy` - An HTTP proxy to be used. Supports proxy Auth with Basic Auth, identical to support for the `url` parameter (by embedding the auth info in the `uri`)
+* `oauth` - Options for OAuth HMAC-SHA1 signing. See documentation above.
 * `hawk` - Options for [Hawk signing](https://github.com/hueniverse/hawk). The `credentials` key must contain the necessary signing info, [see hawk docs for details](https://github.com/hueniverse/hawk#usage-example).
-* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option.
-* `jar` - Set to `true` if you want cookies to be remembered for future use, or define your custom cookie jar (see examples section)
-* `aws` - object containing aws signing information, should have the properties `key` and `secret` as well as `bucket` unless you're specifying your bucket as part of the path, or you are making a request that doesn't use a bucket (i.e. GET Services)
+* `strictSSL` - If `true`, requires SSL certificates be valid. **Note:** to use your own certificate authority, you need to specify an agent that was created with that CA as an option.
+* `jar` - If `true`, remember cookies for future use (or define your custom cookie jar; see examples section)
+* `aws` - `object` containing AWS signing information. Should have the properties `key`, `secret`. Also requires the property `bucket`, unless youâre specifying your `bucket` as part of the path, or the request doesnât use a bucket (i.e. GET Services)
 * `httpSignature` - Options for the [HTTP Signature Scheme](https://github.com/joyent/node-http-signature/blob/master/http_signing.md) using [Joyent's library](https://github.com/joyent/node-http-signature). The `keyId` and `key` properties must be specified. See the docs for other options.
 * `localAddress` - Local interface to bind for network connections.
 
 
-The callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second is an http.ClientResponse object. The third is the response body String or Buffer.
+The callback argument gets 3 arguments: 
+
+1. An `error` when applicable (usually from [`http.ClientRequest`](http://nodejs.org/api/http.html#http_class_http_clientrequest) object)
+2. An [`http.IncomingMessage`](http://nodejs.org/api/http.html#http_http_incomingmessage) object
+3. The third is the `response` body (`String` or `Buffer`, or JSON object if the `json` option is supplied)
 
 ## Convenience methods
@@ -216,5 +259,5 @@
 ### request.put
 
-Same as request() but defaults to `method: "PUT"`.
+Same as `request()`, but defaults to `method: "PUT"`.
 
 ```javascript
@@ -224,5 +267,5 @@
 ### request.patch
 
-Same as request() but defaults to `method: "PATCH"`.
+Same as `request()`, but defaults to `method: "PATCH"`.
 
 ```javascript
@@ -232,5 +275,5 @@
 ### request.post
 
-Same as request() but defaults to `method: "POST"`.
+Same as `request()`, but defaults to `method: "POST"`.
 
 ```javascript
@@ -248,5 +291,5 @@
 ### request.del
 
-Same as request() but defaults to `method: "DELETE"`.
+Same as `request()`, but defaults to `method: "DELETE"`.
 
 ```javascript
@@ -256,5 +299,5 @@
 ### request.get
 
-Alias to normal request method for uniformity.
+Same as `request()` (for uniformity).
 
 ```javascript
@@ -303,5 +346,6 @@
   )
 ```
-Cookies are disabled by default (else, they would be used in subsequent requests). To enable cookies set jar to true (either in defaults or in the options sent).
+
+Cookies are disabled by default (else, they would be used in subsequent requests). To enable cookies, set `jar` to `true` (either in `defaults` or `options`).
 
 ```javascript
@@ -312,5 +356,5 @@
 ```
 
-If you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option:
+To use a custom cookie jar (instead `request`âs global cookie jar), set `jar` to an instance of `request.jar()` (either in `defaults` or `options`)
 
 ```javascript
@@ -321,4 +365,5 @@
 })
 ```
+
 OR
 
@@ -326,5 +371,5 @@
 var j = request.jar()
 var cookie = request.cookie('your_cookie_here')
-j.add(cookie)
+j.setCookie(cookie, uri);
 request({url: 'http://www.google.com', jar: j}, function () {
   request('http://images.google.com')
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/dns-request.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/dns-request.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/dns-request.js	(revision 516)
@@ -0,0 +1,7 @@
+var request = require('request')
+  , dns = require('dns')
+  ;
+
+function wrap (fn) {
+  var
+}
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/index.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/index.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/index.js	(revision 516)
@@ -13,8 +13,5 @@
 //    limitations under the License.
 
-var Cookie = require('cookie-jar')
-  , CookieJar = Cookie.Jar
-  , cookieJar = new CookieJar
-
+var cookies = require('./lib/cookies')
   , copy = require('./lib/copy')
   , Request = require('./request')
@@ -93,8 +90,16 @@
 }
 
+function requester(params) {
+  if(typeof params.options._requester === 'function') {
+    return params.options._requester
+  } else {
+    return request
+  }
+}
+
 request.forever = function (agentOptions, optionsArg) {
   var options = {}
   if (optionsArg) {
-    for (option in optionsArg) {
+    for (var option in optionsArg) {
       options[option] = optionsArg[option]
     }
@@ -109,15 +114,15 @@
   var params = initParams(uri, options, callback)
   params.options.method = 'POST'
-  return request(params.uri || null, params.options, params.callback)
+  return requester(params)(params.uri || null, params.options, params.callback)
 }
 request.put = function (uri, options, callback) {
   var params = initParams(uri, options, callback)
   params.options.method = 'PUT'
-  return request(params.uri || null, params.options, params.callback)
+  return requester(params)(params.uri || null, params.options, params.callback)
 }
 request.patch = function (uri, options, callback) {
   var params = initParams(uri, options, callback)
   params.options.method = 'PATCH'
-  return request(params.uri || null, params.options, params.callback)
+  return requester(params)(params.uri || null, params.options, params.callback)
 }
 request.head = function (uri, options, callback) {
@@ -130,20 +135,16 @@
     throw new Error("HTTP HEAD requests MUST NOT include a request body.")
   }
-  return request(params.uri || null, params.options, params.callback)
+
+  return requester(params)(params.uri || null, params.options, params.callback)
 }
 request.del = function (uri, options, callback) {
   var params = initParams(uri, options, callback)
   params.options.method = 'DELETE'
-  if(typeof params.options._requester === 'function') {
-    request = params.options._requester
-  }
-  return request(params.uri || null, params.options, params.callback)
+  return requester(params)(params.uri || null, params.options, params.callback)
 }
 request.jar = function () {
-  return new CookieJar
+  return cookies.jar();
 }
 request.cookie = function (str) {
-  if (str && str.uri) str = str.uri
-  if (typeof str !== 'string') throw new Error("The cookie function only accepts STRING as param")
-  return new Cookie(str)
+  return cookies.parse(str);
 }
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/lib/cookies.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/lib/cookies.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/lib/cookies.js	(revision 516)
@@ -0,0 +1,36 @@
+var optional = require('./optional')
+  , tough = optional('tough-cookie')
+  , Cookie = tough && tough.Cookie
+  , CookieJar = tough && tough.CookieJar
+  ;
+
+exports.parse = function(str) {
+  if (str && str.uri) str = str.uri
+  if (typeof str !== 'string') throw new Error("The cookie function only accepts STRING as param")
+  if (!Cookie) {
+    return null;
+  }
+  return Cookie.parse(str)
+};
+
+// Adapt the sometimes-Async api of tough.CookieJar to our requirements
+function RequestJar() {
+  this._jar = new CookieJar();
+}
+RequestJar.prototype.setCookie = function(cookieOrStr, uri, options) {
+  return this._jar.setCookieSync(cookieOrStr, uri, options || {});
+};
+RequestJar.prototype.getCookieString = function(uri) {
+  return this._jar.getCookieStringSync(uri);
+};
+
+exports.jar = function() {
+  if (!CookieJar) {
+    // tough-cookie not loaded, return a stub object:
+    return {
+      setCookie: function(){},
+      getCookieString: function(){}
+    };
+  }
+  return new RequestJar();
+};
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/lib/debug.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/lib/debug.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/lib/debug.js	(revision 516)
@@ -1,2 +1,4 @@
+var util = require('util')
+
 module.exports =
 function debug () {
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/lib/optional.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/lib/optional.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/lib/optional.js	(revision 516)
@@ -0,0 +1,5 @@
+module.exports = function(module) {
+  try {
+    return require(module);
+  } catch (e) {}
+};
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/aws-sign2/LICENSE
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/aws-sign2/LICENSE	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/aws-sign2/LICENSE	(revision 516)
@@ -0,0 +1,55 @@
+Apache License
+
+Version 2.0, January 2004
+
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
+
+"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
+
+You must give any other recipients of the Work or Derivative Works a copy of this License; and
+
+You must cause any modified files to carry prominent notices stating that You changed the files; and
+
+You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
+
+If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/aws-sign2/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/aws-sign2/README.md	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/aws-sign2/README.md	(revision 516)
@@ -0,0 +1,4 @@
+aws-sign
+========
+
+AWS signing. Originally pulled from LearnBoost/knox, maintained as vendor in request, now a standalone module.
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/aws-sign2/index.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/aws-sign2/index.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/aws-sign2/index.js	(revision 516)
@@ -0,0 +1,202 @@
+
+/*!
+ * knox - auth
+ * Copyright(c) 2010 LearnBoost <dev@learnboost.com>
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var crypto = require('crypto')
+  , parse = require('url').parse
+  ;
+
+/**
+ * Valid keys.
+ */
+
+var keys = 
+  [ 'acl'
+  , 'location'
+  , 'logging'
+  , 'notification'
+  , 'partNumber'
+  , 'policy'
+  , 'requestPayment'
+  , 'torrent'
+  , 'uploadId'
+  , 'uploads'
+  , 'versionId'
+  , 'versioning'
+  , 'versions'
+  , 'website'
+  ]
+
+/**
+ * Return an "Authorization" header value with the given `options`
+ * in the form of "AWS <key>:<signature>"
+ *
+ * @param {Object} options
+ * @return {String}
+ * @api private
+ */
+
+function authorization (options) {
+  return 'AWS ' + options.key + ':' + sign(options)
+}
+
+module.exports = authorization
+module.exports.authorization = authorization
+
+/**
+ * Simple HMAC-SHA1 Wrapper
+ *
+ * @param {Object} options
+ * @return {String}
+ * @api private
+ */ 
+
+function hmacSha1 (options) {
+  return crypto.createHmac('sha1', options.secret).update(options.message).digest('base64')
+}
+
+module.exports.hmacSha1 = hmacSha1
+
+/**
+ * Create a base64 sha1 HMAC for `options`. 
+ * 
+ * @param {Object} options
+ * @return {String}
+ * @api private
+ */
+
+function sign (options) {
+  options.message = stringToSign(options)
+  return hmacSha1(options)
+}
+module.exports.sign = sign
+
+/**
+ * Create a base64 sha1 HMAC for `options`. 
+ *
+ * Specifically to be used with S3 presigned URLs
+ * 
+ * @param {Object} options
+ * @return {String}
+ * @api private
+ */
+
+function signQuery (options) {
+  options.message = queryStringToSign(options)
+  return hmacSha1(options)
+}
+module.exports.signQuery= signQuery
+
+/**
+ * Return a string for sign() with the given `options`.
+ *
+ * Spec:
+ * 
+ *    <verb>\n
+ *    <md5>\n
+ *    <content-type>\n
+ *    <date>\n
+ *    [headers\n]
+ *    <resource>
+ *
+ * @param {Object} options
+ * @return {String}
+ * @api private
+ */
+
+function stringToSign (options) {
+  var headers = options.amazonHeaders || ''
+  if (headers) headers += '\n'
+  var r = 
+    [ options.verb
+    , options.md5
+    , options.contentType
+    , options.date ? options.date.toUTCString() : ''
+    , headers + options.resource
+    ]
+  return r.join('\n')
+}
+module.exports.queryStringToSign = stringToSign
+
+/**
+ * Return a string for sign() with the given `options`, but is meant exclusively
+ * for S3 presigned URLs
+ *
+ * Spec:
+ * 
+ *    <date>\n
+ *    <resource>
+ *
+ * @param {Object} options
+ * @return {String}
+ * @api private
+ */
+
+function queryStringToSign (options){
+  return 'GET\n\n\n' + options.date + '\n' + options.resource
+}
+module.exports.queryStringToSign = queryStringToSign
+
+/**
+ * Perform the following:
+ *
+ *  - ignore non-amazon headers
+ *  - lowercase fields
+ *  - sort lexicographically
+ *  - trim whitespace between ":"
+ *  - join with newline
+ *
+ * @param {Object} headers
+ * @return {String}
+ * @api private
+ */
+
+function canonicalizeHeaders (headers) {
+  var buf = []
+    , fields = Object.keys(headers)
+    ;
+  for (var i = 0, len = fields.length; i < len; ++i) {
+    var field = fields[i]
+      , val = headers[field]
+      , field = field.toLowerCase()
+      ;
+    if (0 !== field.indexOf('x-amz')) continue
+    buf.push(field + ':' + val)
+  }
+  return buf.sort().join('\n')
+}
+module.exports.canonicalizeHeaders = canonicalizeHeaders
+
+/**
+ * Perform the following:
+ *
+ *  - ignore non sub-resources
+ *  - sort lexicographically
+ *
+ * @param {String} resource
+ * @return {String}
+ * @api private
+ */
+
+function canonicalizeResource (resource) {
+  var url = parse(resource, true)
+    , path = url.pathname
+    , buf = []
+    ;
+
+  Object.keys(url.query).forEach(function(key){
+    if (!~keys.indexOf(key)) return
+    var val = '' == url.query[key] ? '' : '=' + encodeURIComponent(url.query[key])
+    buf.push(key + val)
+  })
+
+  return path + (buf.length ? '?' + buf.sort().join('&') : '')
+}
+module.exports.canonicalizeResource = canonicalizeResource
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/aws-sign2/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/aws-sign2/package.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/aws-sign2/package.json	(revision 516)
@@ -0,0 +1,32 @@
+{
+  "author": {
+    "name": "Mikeal Rogers",
+    "email": "mikeal.rogers@gmail.com",
+    "url": "http://www.futurealoof.com"
+  },
+  "name": "aws-sign2",
+  "description": "AWS signing. Originally pulled from LearnBoost/knox, maintained as vendor in request, now a standalone module.",
+  "version": "0.5.0",
+  "repository": {
+    "url": "https://github.com/mikeal/aws-sign"
+  },
+  "main": "index.js",
+  "dependencies": {},
+  "devDependencies": {},
+  "optionalDependencies": {},
+  "engines": {
+    "node": "*"
+  },
+  "readme": "aws-sign\n========\n\nAWS signing. Originally pulled from LearnBoost/knox, maintained as vendor in request, now a standalone module.\n",
+  "readmeFilename": "README.md",
+  "bugs": {
+    "url": "https://github.com/mikeal/aws-sign/issues"
+  },
+  "homepage": "https://github.com/mikeal/aws-sign",
+  "_id": "aws-sign2@0.5.0",
+  "dist": {
+    "shasum": "3b6ebf26e70e41a25c3d62480cf58ef764ec26b6"
+  },
+  "_from": "aws-sign2@~0.5.0",
+  "_resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz"
+}
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/forever-agent/index.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/forever-agent/index.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/forever-agent/index.js	(revision 516)
@@ -25,5 +25,5 @@
       
       // if an error happens while we don't use the socket anyway, meh, throw the socket away
-      function onIdleError() {
+      var onIdleError = function() {
         socket.destroy()
       }
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/forever-agent/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/forever-agent/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/forever-agent/package.json	(revision 516)
@@ -7,5 +7,5 @@
   "name": "forever-agent",
   "description": "HTTP Agent that keeps socket connections alive between keep-alive requests. Formerly part of mikeal/request, now a standalone module.",
-  "version": "0.5.0",
+  "version": "0.5.2",
   "repository": {
     "url": "https://github.com/mikeal/forever-agent"
@@ -24,5 +24,6 @@
   },
   "homepage": "https://github.com/mikeal/forever-agent",
-  "_id": "forever-agent@0.5.0",
-  "_from": "forever-agent@~0.5.0"
+  "_id": "forever-agent@0.5.2",
+  "_from": "forever-agent@~0.5.0",
+  "scripts": {}
 }
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/form-data/node_modules/async/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/form-data/node_modules/async/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/form-data/node_modules/async/README.md	(revision 516)
@@ -105,13 +105,22 @@
 
 * [each](#each)
+* [eachSeries](#eachSeries)
+* [eachLimit](#eachLimit)
 * [map](#map)
+* [mapSeries](#mapSeries)
+* [mapLimit](#mapLimit)
 * [filter](#filter)
+* [filterSeries](#filterSeries)
 * [reject](#reject)
+* [rejectSeries](#rejectSeries)
 * [reduce](#reduce)
+* [reduceRight](#reduceRight)
 * [detect](#detect)
+* [detectSeries](#detectSeries)
 * [sortBy](#sortBy)
 * [some](#some)
 * [every](#every)
 * [concat](#concat)
+* [concatSeries](#concatSeries)
 
 ### Control Flow
@@ -119,4 +128,5 @@
 * [series](#series)
 * [parallel](#parallel)
+* [parallelLimit](#parallellimittasks-limit-callback)
 * [whilst](#whilst)
 * [doWhilst](#doWhilst)
@@ -127,4 +137,5 @@
 * [compose](#compose)
 * [applyEach](#applyEach)
+* [applyEachSeries](#applyEachSeries)
 * [queue](#queue)
 * [cargo](#cargo)
@@ -296,5 +307,5 @@
 
 ```js
-async.map(['file1','file2','file3'], 1, fs.stat, function(err, results){
+async.mapLimit(['file1','file2','file3'], 1, fs.stat, function(err, results){
     // results is now an array of stats for each file
 });
@@ -1063,5 +1074,5 @@
 ```js
 async.auto({
-  readData: async.apply(fs.readFile, 'data.txt', 'utf-8');
+  readData: async.apply(fs.readFile, 'data.txt', 'utf-8')
 }, callback);
 ```
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js	(revision 516)
@@ -92,5 +92,8 @@
         async.nextTick = process.nextTick;
         if (typeof setImmediate !== 'undefined') {
-            async.setImmediate = setImmediate;
+            async.setImmediate = function (fn) {
+              // not a direct alias for IE10 compatibility
+              setImmediate(fn);
+            };
         }
         else {
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/form-data/node_modules/async/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/form-data/node_modules/async/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/form-data/node_modules/async/package.json	(revision 516)
@@ -6,5 +6,5 @@
     "name": "Caolan McMahon"
   },
-  "version": "0.2.9",
+  "version": "0.2.10",
   "repository": {
     "type": "git",
@@ -36,8 +36,8 @@
     "test": "nodeunit test/test-async.js"
   },
-  "readme": "# Async.js\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [node.js](http://nodejs.org), it can also be used directly in the\nbrowser. Also supports [component](https://github.com/component/component).\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (map, reduce, filter, eachâŠ) as well as some common patterns\nfor asynchronous control flow (parallel, series, waterfallâŠ). All these\nfunctions assume you follow the node.js convention of providing a single\ncallback as the last argument of your async function.\n\n\n## Quick Examples\n\n```javascript\nasync.map(['file1','file2','file3'], fs.stat, function(err, results){\n    // results is now an array of stats for each file\n});\n\nasync.filter(['file1','file2','file3'], fs.exists, function(results){\n    // results now equals an array of the existing files\n});\n\nasync.parallel([\n    function(){ ... },\n    function(){ ... }\n], callback);\n\nasync.series([\n    function(){ ... },\n    function(){ ... }\n]);\n```\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n## Common Pitfalls\n\n### Binding a context to an iterator\n\nThis section is really about bind, not about async. If you are wondering how to\nmake async execute your iterators in a given context, or are confused as to why\na method of another library isn't working as an iterator, study this example:\n\n```js\n// Here is a simple object with an (unnecessarily roundabout) squaring method\nvar AsyncSquaringLibrary = {\n  squareExponent: 2,\n  square: function(number, callback){ \n    var result = Math.pow(number, this.squareExponent);\n    setTimeout(function(){\n      callback(null, result);\n    }, 200);\n  }\n};\n\nasync.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){\n  // result is [NaN, NaN, NaN]\n  // This fails because the `this.squareExponent` expression in the square\n  // function is not evaluated in the context of AsyncSquaringLibrary, and is\n  // therefore undefined.\n});\n\nasync.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){\n  // result is [1, 4, 9]\n  // With the help of bind we can attach a context to the iterator before\n  // passing it to async. Now the square function will be executed in its \n  // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent`\n  // will be as expected.\n});\n```\n\n## Download\n\nThe source is available for download from\n[GitHub](http://github.com/caolan/async).\nAlternatively, you can install using Node Package Manager (npm):\n\n    npm install async\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed\n\n## In the Browser\n\nSo far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:\n\n```html\n<script type=\"text/javascript\" src=\"async.js\"></script>\n<script type=\"text/javascript\">\n\n    async.map(data, asyncProcess, function(err, results){\n        alert(results);\n    });\n\n</script>\n```\n\n## Documentation\n\n### Collections\n\n* [each](#each)\n* [map](#map)\n* [filter](#filter)\n* [reject](#reject)\n* [reduce](#reduce)\n* [detect](#detect)\n* [sortBy](#sortBy)\n* [some](#some)\n* [every](#every)\n* [concat](#concat)\n\n### Control Flow\n\n* [series](#series)\n* [parallel](#parallel)\n* [whilst](#whilst)\n* [doWhilst](#doWhilst)\n* [until](#until)\n* [doUntil](#doUntil)\n* [forever](#forever)\n* [waterfall](#waterfall)\n* [compose](#compose)\n* [applyEach](#applyEach)\n* [queue](#queue)\n* [cargo](#cargo)\n* [auto](#auto)\n* [iterator](#iterator)\n* [apply](#apply)\n* [nextTick](#nextTick)\n* [times](#times)\n* [timesSeries](#timesSeries)\n\n### Utils\n\n* [memoize](#memoize)\n* [unmemoize](#unmemoize)\n* [log](#log)\n* [dir](#dir)\n* [noConflict](#noConflict)\n\n\n## Collections\n\n<a name=\"forEach\" />\n<a name=\"each\" />\n### each(arr, iterator, callback)\n\nApplies an iterator function to each item in an array, in parallel.\nThe iterator is called with an item from the list and a callback for when it\nhas finished. If the iterator passes an error to this callback, the main\ncallback for the each function is immediately called with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback(err) which must be called once it has \n  completed. If no error has occured, the callback should be run without \n  arguments or with an explicit null argument.\n* callback(err) - A callback which is called after all the iterator functions\n  have finished, or an error has occurred.\n\n__Example__\n\n```js\n// assuming openFiles is an array of file names and saveFile is a function\n// to save the modified contents of that file:\n\nasync.each(openFiles, saveFile, function(err){\n    // if any of the saves produced an error, err would equal that error\n});\n```\n\n---------------------------------------\n\n<a name=\"forEachSeries\" />\n<a name=\"eachSeries\" />\n### eachSeries(arr, iterator, callback)\n\nThe same as each only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. This means the iterator functions will complete in order.\n\n\n---------------------------------------\n\n<a name=\"forEachLimit\" />\n<a name=\"eachLimit\" />\n### eachLimit(arr, limit, iterator, callback)\n\nThe same as each only no more than \"limit\" iterators will be simultaneously \nrunning at any time.\n\nNote that the items are not processed in batches, so there is no guarantee that\n the first \"limit\" iterator functions will complete before any others are \nstarted.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - The maximum number of iterators to run at any time.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback(err) which must be called once it has \n  completed. If no error has occured, the callback should be run without \n  arguments or with an explicit null argument.\n* callback(err) - A callback which is called after all the iterator functions\n  have finished, or an error has occurred.\n\n__Example__\n\n```js\n// Assume documents is an array of JSON objects and requestApi is a\n// function that interacts with a rate-limited REST api.\n\nasync.eachLimit(documents, 20, requestApi, function(err){\n    // if any of the saves produced an error, err would equal that error\n});\n```\n\n---------------------------------------\n\n<a name=\"map\" />\n### map(arr, iterator, callback)\n\nProduces a new array of values by mapping each value in the given array through\nthe iterator function. The iterator is called with an item from the array and a\ncallback for when it has finished processing. The callback takes 2 arguments, \nan error and the transformed item from the array. If the iterator passes an\nerror to this callback, the main callback for the map function is immediately\ncalled with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order, however\nthe results array will be in the same order as the original array.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback(err, transformed) which must be called once \n  it has completed with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array of the\n  transformed items from the original array.\n\n__Example__\n\n```js\nasync.map(['file1','file2','file3'], fs.stat, function(err, results){\n    // results is now an array of stats for each file\n});\n```\n\n---------------------------------------\n\n<a name=\"mapSeries\" />\n### mapSeries(arr, iterator, callback)\n\nThe same as map only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n---------------------------------------\n\n<a name=\"mapLimit\" />\n### mapLimit(arr, limit, iterator, callback)\n\nThe same as map only no more than \"limit\" iterators will be simultaneously \nrunning at any time.\n\nNote that the items are not processed in batches, so there is no guarantee that\n the first \"limit\" iterator functions will complete before any others are \nstarted.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - The maximum number of iterators to run at any time.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback(err, transformed) which must be called once \n  it has completed with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array of the\n  transformed items from the original array.\n\n__Example__\n\n```js\nasync.map(['file1','file2','file3'], 1, fs.stat, function(err, results){\n    // results is now an array of stats for each file\n});\n```\n\n---------------------------------------\n\n<a name=\"filter\" />\n### filter(arr, iterator, callback)\n\n__Alias:__ select\n\nReturns a new array of all the values which pass an async truth test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback(truthValue) which must be called with a \n  boolean argument once it has completed.\n* callback(results) - A callback which is called after all the iterator\n  functions have finished.\n\n__Example__\n\n```js\nasync.filter(['file1','file2','file3'], fs.exists, function(results){\n    // results now equals an array of the existing files\n});\n```\n\n---------------------------------------\n\n<a name=\"filterSeries\" />\n### filterSeries(arr, iterator, callback)\n\n__alias:__ selectSeries\n\nThe same as filter only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n---------------------------------------\n\n<a name=\"reject\" />\n### reject(arr, iterator, callback)\n\nThe opposite of filter. Removes values that pass an async truth test.\n\n---------------------------------------\n\n<a name=\"rejectSeries\" />\n### rejectSeries(arr, iterator, callback)\n\nThe same as reject, only the iterator is applied to each item in the array\nin series.\n\n\n---------------------------------------\n\n<a name=\"reduce\" />\n### reduce(arr, memo, iterator, callback)\n\n__aliases:__ inject, foldl\n\nReduces a list of values into a single value using an async iterator to return\neach successive step. Memo is the initial state of the reduction. This\nfunction only operates in series. For performance reasons, it may make sense to\nsplit a call to this function into a parallel map, then use the normal\nArray.prototype.reduce on the results. This function is for situations where\neach step in the reduction needs to be async, if you can get the data before\nreducing it then it's probably a good idea to do so.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* memo - The initial state of the reduction.\n* iterator(memo, item, callback) - A function applied to each item in the\n  array to produce the next step in the reduction. The iterator is passed a\n  callback(err, reduction) which accepts an optional error as its first \n  argument, and the state of the reduction as the second. If an error is \n  passed to the callback, the reduction is stopped and the main callback is \n  immediately called with the error.\n* callback(err, result) - A callback which is called after all the iterator\n  functions have finished. Result is the reduced value.\n\n__Example__\n\n```js\nasync.reduce([1,2,3], 0, function(memo, item, callback){\n    // pointless async:\n    process.nextTick(function(){\n        callback(null, memo + item)\n    });\n}, function(err, result){\n    // result is now equal to the last value of memo, which is 6\n});\n```\n\n---------------------------------------\n\n<a name=\"reduceRight\" />\n### reduceRight(arr, memo, iterator, callback)\n\n__Alias:__ foldr\n\nSame as reduce, only operates on the items in the array in reverse order.\n\n\n---------------------------------------\n\n<a name=\"detect\" />\n### detect(arr, iterator, callback)\n\nReturns the first value in a list that passes an async truth test. The\niterator is applied in parallel, meaning the first iterator to return true will\nfire the detect callback with that result. That means the result might not be\nthe first item in the original array (in terms of order) that passes the test.\n\nIf order within the original array is important then look at detectSeries.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback(truthValue) which must be called with a \n  boolean argument once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n  true, or after all the iterator functions have finished. Result will be\n  the first item in the array that passes the truth test (iterator) or the\n  value undefined if none passed.\n\n__Example__\n\n```js\nasync.detect(['file1','file2','file3'], fs.exists, function(result){\n    // result now equals the first file in the list that exists\n});\n```\n\n---------------------------------------\n\n<a name=\"detectSeries\" />\n### detectSeries(arr, iterator, callback)\n\nThe same as detect, only the iterator is applied to each item in the array\nin series. This means the result is always the first in the original array (in\nterms of array order) that passes the truth test.\n\n\n---------------------------------------\n\n<a name=\"sortBy\" />\n### sortBy(arr, iterator, callback)\n\nSorts a list by the results of running each value through an async iterator.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback(err, sortValue) which must be called once it\n  has completed with an error (which can be null) and a value to use as the sort\n  criteria.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is the items from\n  the original array sorted by the values returned by the iterator calls.\n\n__Example__\n\n```js\nasync.sortBy(['file1','file2','file3'], function(file, callback){\n    fs.stat(file, function(err, stats){\n        callback(err, stats.mtime);\n    });\n}, function(err, results){\n    // results is now the original array of files sorted by\n    // modified date\n});\n```\n\n---------------------------------------\n\n<a name=\"some\" />\n### some(arr, iterator, callback)\n\n__Alias:__ any\n\nReturns true if at least one element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists. Once any iterator\ncall returns true, the main callback is immediately called.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback(truthValue) which must be called with a \n  boolean argument once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n  true, or after all the iterator functions have finished. Result will be\n  either true or false depending on the values of the async tests.\n\n__Example__\n\n```js\nasync.some(['file1','file2','file3'], fs.exists, function(result){\n    // if result is true then at least one of the files exists\n});\n```\n\n---------------------------------------\n\n<a name=\"every\" />\n### every(arr, iterator, callback)\n\n__Alias:__ all\n\nReturns true if every element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback(truthValue) which must be called with a \n  boolean argument once it has completed.\n* callback(result) - A callback which is called after all the iterator\n  functions have finished. Result will be either true or false depending on\n  the values of the async tests.\n\n__Example__\n\n```js\nasync.every(['file1','file2','file3'], fs.exists, function(result){\n    // if result is true then every file exists\n});\n```\n\n---------------------------------------\n\n<a name=\"concat\" />\n### concat(arr, iterator, callback)\n\nApplies an iterator to each item in a list, concatenating the results. Returns the\nconcatenated list. The iterators are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of the arguments passed to the iterator function.\n\n__Arguments__\n\n* arr - An array to iterate over\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback(err, results) which must be called once it \n  has completed with an error (which can be null) and an array of results.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array containing\n  the concatenated results of the iterator function.\n\n__Example__\n\n```js\nasync.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n    // files is now a list of filenames that exist in the 3 directories\n});\n```\n\n---------------------------------------\n\n<a name=\"concatSeries\" />\n### concatSeries(arr, iterator, callback)\n\nSame as async.concat, but executes in series instead of parallel.\n\n\n## Control Flow\n\n<a name=\"series\" />\n### series(tasks, [callback])\n\nRun an array of functions in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run and the callback for the series is\nimmediately called with the value of the error. Once the tasks have completed,\nthe results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.series.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed\n  a callback(err, result) it must call on completion with an error (which can\n  be null) and an optional result value.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets a results array (or object) containing all \n  the result arguments passed to the task callbacks.\n\n__Example__\n\n```js\nasync.series([\n    function(callback){\n        // do some stuff ...\n        callback(null, 'one');\n    },\n    function(callback){\n        // do some more stuff ...\n        callback(null, 'two');\n    }\n],\n// optional callback\nfunction(err, results){\n    // results is now equal to ['one', 'two']\n});\n\n\n// an example using an object instead of an array\nasync.series({\n    one: function(callback){\n        setTimeout(function(){\n            callback(null, 1);\n        }, 200);\n    },\n    two: function(callback){\n        setTimeout(function(){\n            callback(null, 2);\n        }, 100);\n    }\n},\nfunction(err, results) {\n    // results is now equal to: {one: 1, two: 2}\n});\n```\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallel(tasks, [callback])\n\nRun an array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main callback is immediately called with the value of the error.\nOnce the tasks have completed, the results are passed to the final callback as an\narray.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.parallel.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed \n  a callback(err, result) it must call on completion with an error (which can\n  be null) and an optional result value.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets a results array (or object) containing all \n  the result arguments passed to the task callbacks.\n\n__Example__\n\n```js\nasync.parallel([\n    function(callback){\n        setTimeout(function(){\n            callback(null, 'one');\n        }, 200);\n    },\n    function(callback){\n        setTimeout(function(){\n            callback(null, 'two');\n        }, 100);\n    }\n],\n// optional callback\nfunction(err, results){\n    // the results array will equal ['one','two'] even though\n    // the second function had a shorter timeout.\n});\n\n\n// an example using an object instead of an array\nasync.parallel({\n    one: function(callback){\n        setTimeout(function(){\n            callback(null, 1);\n        }, 200);\n    },\n    two: function(callback){\n        setTimeout(function(){\n            callback(null, 2);\n        }, 100);\n    }\n},\nfunction(err, results) {\n    // results is now equals to: {one: 1, two: 2}\n});\n```\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallelLimit(tasks, limit, [callback])\n\nThe same as parallel only the tasks are executed in parallel with a maximum of \"limit\" \ntasks executing at any time.\n\nNote that the tasks are not executed in batches, so there is no guarantee that \nthe first \"limit\" tasks will complete before any others are started.\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed \n  a callback(err, result) it must call on completion with an error (which can\n  be null) and an optional result value.\n* limit - The maximum number of tasks to run at any time.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets a results array (or object) containing all \n  the result arguments passed to the task callbacks.\n\n---------------------------------------\n\n<a name=\"whilst\" />\n### whilst(test, fn, callback)\n\nRepeatedly call fn, while test returns true. Calls the callback when stopped,\nor an error occurs.\n\n__Arguments__\n\n* test() - synchronous truth test to perform before each execution of fn.\n* fn(callback) - A function to call each time the test passes. The function is\n  passed a callback(err) which must be called once it has completed with an \n  optional error argument.\n* callback(err) - A callback which is called after the test fails and repeated\n  execution of fn has stopped.\n\n__Example__\n\n```js\nvar count = 0;\n\nasync.whilst(\n    function () { return count < 5; },\n    function (callback) {\n        count++;\n        setTimeout(callback, 1000);\n    },\n    function (err) {\n        // 5 seconds have passed\n    }\n);\n```\n\n---------------------------------------\n\n<a name=\"doWhilst\" />\n### doWhilst(fn, test, callback)\n\nThe post check version of whilst. To reflect the difference in the order of operations `test` and `fn` arguments are switched. `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.\n\n---------------------------------------\n\n<a name=\"until\" />\n### until(test, fn, callback)\n\nRepeatedly call fn, until test returns true. Calls the callback when stopped,\nor an error occurs.\n\nThe inverse of async.whilst.\n\n---------------------------------------\n\n<a name=\"doUntil\" />\n### doUntil(fn, test, callback)\n\nLike doWhilst except the test is inverted. Note the argument ordering differs from `until`.\n\n---------------------------------------\n\n<a name=\"forever\" />\n### forever(fn, callback)\n\nCalls the asynchronous function 'fn' repeatedly, in series, indefinitely.\nIf an error is passed to fn's callback then 'callback' is called with the\nerror, otherwise it will never be called.\n\n---------------------------------------\n\n<a name=\"waterfall\" />\n### waterfall(tasks, [callback])\n\nRuns an array of functions in series, each passing their results to the next in\nthe array. However, if any of the functions pass an error to the callback, the\nnext function is not executed and the main callback is immediately called with\nthe error.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a \n  callback(err, result1, result2, ...) it must call on completion. The first\n  argument is an error (which can be null) and any further arguments will be \n  passed as arguments in order to the next task.\n* callback(err, [results]) - An optional callback to run once all the functions\n  have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n```js\nasync.waterfall([\n    function(callback){\n        callback(null, 'one', 'two');\n    },\n    function(arg1, arg2, callback){\n        callback(null, 'three');\n    },\n    function(arg1, callback){\n        // arg1 now equals 'three'\n        callback(null, 'done');\n    }\n], function (err, result) {\n   // result now equals 'done'    \n});\n```\n\n---------------------------------------\n<a name=\"compose\" />\n### compose(fn1, fn2...)\n\nCreates a function which is a composition of the passed asynchronous\nfunctions. Each function consumes the return value of the function that\nfollows. Composing functions f(), g() and h() would produce the result of\nf(g(h())), only this version uses callbacks to obtain the return values.\n\nEach function is executed with the `this` binding of the composed function.\n\n__Arguments__\n\n* functions... - the asynchronous functions to compose\n\n\n__Example__\n\n```js\nfunction add1(n, callback) {\n    setTimeout(function () {\n        callback(null, n + 1);\n    }, 10);\n}\n\nfunction mul3(n, callback) {\n    setTimeout(function () {\n        callback(null, n * 3);\n    }, 10);\n}\n\nvar add1mul3 = async.compose(mul3, add1);\n\nadd1mul3(4, function (err, result) {\n   // result now equals 15\n});\n```\n\n---------------------------------------\n<a name=\"applyEach\" />\n### applyEach(fns, args..., callback)\n\nApplies the provided arguments to each function in the array, calling the\ncallback after all functions have completed. If you only provide the first\nargument then it will return a function which lets you pass in the\narguments as if it were a single function call.\n\n__Arguments__\n\n* fns - the asynchronous functions to all call with the same arguments\n* args... - any number of separate arguments to pass to the function\n* callback - the final argument should be the callback, called when all\n  functions have completed processing\n\n\n__Example__\n\n```js\nasync.applyEach([enableSearch, updateSchema], 'bucket', callback);\n\n// partial application example:\nasync.each(\n    buckets,\n    async.applyEach([enableSearch, updateSchema]),\n    callback\n);\n```\n\n---------------------------------------\n\n<a name=\"applyEachSeries\" />\n### applyEachSeries(arr, iterator, callback)\n\nThe same as applyEach only the functions are applied in series.\n\n---------------------------------------\n\n<a name=\"queue\" />\n### queue(worker, concurrency)\n\nCreates a queue object with the specified concurrency. Tasks added to the\nqueue will be processed in parallel (up to the concurrency limit). If all\nworkers are in progress, the task is queued until one is available. Once\na worker has completed a task, the task's callback is called.\n\n__Arguments__\n\n* worker(task, callback) - An asynchronous function for processing a queued\n  task, which must call its callback(err) argument when finished, with an \n  optional error as an argument.\n* concurrency - An integer for determining how many worker functions should be\n  run in parallel.\n\n__Queue objects__\n\nThe queue object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* concurrency - an integer for determining how many worker functions should be\n  run in parallel. This property can be changed after a queue is created to\n  alter the concurrency on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n  once the worker has finished processing the task.\n  instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* unshift(task, [callback]) - add a new task to the front of the queue.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n```js\n// create a queue object with concurrency 2\n\nvar q = async.queue(function (task, callback) {\n    console.log('hello ' + task.name);\n    callback();\n}, 2);\n\n\n// assign a callback\nq.drain = function() {\n    console.log('all items have been processed');\n}\n\n// add some items to the queue\n\nq.push({name: 'foo'}, function (err) {\n    console.log('finished processing foo');\n});\nq.push({name: 'bar'}, function (err) {\n    console.log('finished processing bar');\n});\n\n// add some items to the queue (batch-wise)\n\nq.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n    console.log('finished processing bar');\n});\n\n// add some items to the front of the queue\n\nq.unshift({name: 'bar'}, function (err) {\n    console.log('finished processing bar');\n});\n```\n\n---------------------------------------\n\n<a name=\"cargo\" />\n### cargo(worker, [payload])\n\nCreates a cargo object with the specified payload. Tasks added to the\ncargo will be processed altogether (up to the payload limit). If the\nworker is in progress, the task is queued until it is available. Once\nthe worker has completed some tasks, each callback of those tasks is called.\n\n__Arguments__\n\n* worker(tasks, callback) - An asynchronous function for processing an array of\n  queued tasks, which must call its callback(err) argument when finished, with \n  an optional error as an argument.\n* payload - An optional integer for determining how many tasks should be\n  processed per round; if omitted, the default is unlimited.\n\n__Cargo objects__\n\nThe cargo object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* payload - an integer for determining how many tasks should be\n  process per round. This property can be changed after a cargo is created to\n  alter the payload on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n  once the worker has finished processing the task.\n  instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n```js\n// create a cargo object with payload 2\n\nvar cargo = async.cargo(function (tasks, callback) {\n    for(var i=0; i<tasks.length; i++){\n      console.log('hello ' + tasks[i].name);\n    }\n    callback();\n}, 2);\n\n\n// add some items\n\ncargo.push({name: 'foo'}, function (err) {\n    console.log('finished processing foo');\n});\ncargo.push({name: 'bar'}, function (err) {\n    console.log('finished processing bar');\n});\ncargo.push({name: 'baz'}, function (err) {\n    console.log('finished processing baz');\n});\n```\n\n---------------------------------------\n\n<a name=\"auto\" />\n### auto(tasks, [callback])\n\nDetermines the best order for running functions based on their requirements.\nEach function can optionally depend on other functions being completed first,\nand each function is run as soon as its requirements are satisfied. If any of\nthe functions pass an error to their callback, that function will not complete\n(so any other functions depending on it will not run) and the main callback\nwill be called immediately with the error. Functions also receive an object\ncontaining the results of functions which have completed so far.\n\nNote, all functions are called with a results object as a second argument, \nso it is unsafe to pass functions in the tasks object which cannot handle the\nextra argument. For example, this snippet of code:\n\n```js\nasync.auto({\n  readData: async.apply(fs.readFile, 'data.txt', 'utf-8');\n}, callback);\n```\n\nwill have the effect of calling readFile with the results object as the last\nargument, which will fail:\n\n```js\nfs.readFile('data.txt', 'utf-8', cb, {});\n```\n\nInstead, wrap the call to readFile in a function which does not forward the \nresults object:\n\n```js\nasync.auto({\n  readData: function(cb, results){\n    fs.readFile('data.txt', 'utf-8', cb);\n  }\n}, callback);\n```\n\n__Arguments__\n\n* tasks - An object literal containing named functions or an array of\n  requirements, with the function itself the last item in the array. The key\n  used for each function or array is used when specifying requirements. The \n  function receives two arguments: (1) a callback(err, result) which must be \n  called when finished, passing an error (which can be null) and the result of \n  the function's execution, and (2) a results object, containing the results of\n  the previously executed functions.\n* callback(err, results) - An optional callback which is called when all the\n  tasks have been completed. The callback will receive an error as an argument\n  if any tasks pass an error to their callback. Results will always be passed\n\tbut if an error occurred, no other tasks will be performed, and the results\n\tobject will only contain partial results.\n  \n\n__Example__\n\n```js\nasync.auto({\n    get_data: function(callback){\n        // async code to get some data\n    },\n    make_folder: function(callback){\n        // async code to create a directory to store a file in\n        // this is run at the same time as getting the data\n    },\n    write_file: ['get_data', 'make_folder', function(callback){\n        // once there is some data and the directory exists,\n        // write the data to a file in the directory\n        callback(null, filename);\n    }],\n    email_link: ['write_file', function(callback, results){\n        // once the file is written let's email a link to it...\n        // results.write_file contains the filename returned by write_file.\n    }]\n});\n```\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n```js\nasync.parallel([\n    function(callback){\n        // async code to get some data\n    },\n    function(callback){\n        // async code to create a directory to store a file in\n        // this is run at the same time as getting the data\n    }\n],\nfunction(err, results){\n    async.series([\n        function(callback){\n            // once there is some data and the directory exists,\n            // write the data to a file in the directory\n        },\n        function(callback){\n            // once the file is written let's email a link to it...\n        }\n    ]);\n});\n```\n\nFor a complicated series of async tasks using the auto function makes adding\nnew tasks much easier and makes the code more readable.\n\n\n---------------------------------------\n\n<a name=\"iterator\" />\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the array,\nreturning a continuation to call the next one after that. It's also possible to\n'peek' the next iterator by doing iterator.next().\n\nThis function is used internally by the async module but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* tasks - An array of functions to run.\n\n__Example__\n\n```js\nvar iterator = async.iterator([\n    function(){ sys.p('one'); },\n    function(){ sys.p('two'); },\n    function(){ sys.p('three'); }\n]);\n\nnode> var iterator2 = iterator();\n'one'\nnode> var iterator3 = iterator2();\n'two'\nnode> iterator3();\n'three'\nnode> var nextfn = iterator2.next();\nnode> nextfn();\n'three'\n```\n\n---------------------------------------\n\n<a name=\"apply\" />\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied, a useful\nshorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to automatically apply when the\n  continuation is called.\n\n__Example__\n\n```js\n// using apply\n\nasync.parallel([\n    async.apply(fs.writeFile, 'testfile1', 'test1'),\n    async.apply(fs.writeFile, 'testfile2', 'test2'),\n]);\n\n\n// the same process without using apply\n\nasync.parallel([\n    function(callback){\n        fs.writeFile('testfile1', 'test1', callback);\n    },\n    function(callback){\n        fs.writeFile('testfile2', 'test2', callback);\n    }\n]);\n```\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n```js\nnode> var fn = async.apply(sys.puts, 'one');\nnode> fn('two', 'three');\none\ntwo\nthree\n```\n\n---------------------------------------\n\n<a name=\"nextTick\" />\n### nextTick(callback)\n\nCalls the callback on a later loop around the event loop. In node.js this just\ncalls process.nextTick, in the browser it falls back to setImmediate(callback)\nif available, otherwise setTimeout(callback, 0), which means other higher priority\nevents may precede the execution of the callback.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* callback - The function to call on a later loop around the event loop.\n\n__Example__\n\n```js\nvar call_order = [];\nasync.nextTick(function(){\n    call_order.push('two');\n    // call_order now equals ['one','two']\n});\ncall_order.push('one')\n```\n\n<a name=\"times\" />\n### times(n, callback)\n\nCalls the callback n times and accumulates results in the same manner\nyou would use with async.map.\n\n__Arguments__\n\n* n - The number of times to run the function.\n* callback - The function to call n times.\n\n__Example__\n\n```js\n// Pretend this is some complicated async factory\nvar createUser = function(id, callback) {\n  callback(null, {\n    id: 'user' + id\n  })\n}\n// generate 5 users\nasync.times(5, function(n, next){\n    createUser(n, function(err, user) {\n      next(err, user)\n    })\n}, function(err, users) {\n  // we should now have 5 users\n});\n```\n\n<a name=\"timesSeries\" />\n### timesSeries(n, callback)\n\nThe same as times only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n## Utils\n\n<a name=\"memoize\" />\n### memoize(fn, [hasher])\n\nCaches the results of an async function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\nThe cache of results is exposed as the `memo` property of the function returned\nby `memoize`.\n\n__Arguments__\n\n* fn - the function you to proxy and cache results from.\n* hasher - an optional function for generating a custom hash for storing\n  results, it has all the arguments applied to it apart from the callback, and\n  must be synchronous.\n\n__Example__\n\n```js\nvar slow_fn = function (name, callback) {\n    // do something\n    callback(null, result);\n};\nvar fn = async.memoize(slow_fn);\n\n// fn can now be used as if it were slow_fn\nfn('some name', function () {\n    // callback\n});\n```\n\n<a name=\"unmemoize\" />\n### unmemoize(fn)\n\nUndoes a memoized function, reverting it to the original, unmemoized\nform. Comes handy in tests.\n\n__Arguments__\n\n* fn - the memoized function\n\n<a name=\"log\" />\n### log(function, arguments)\n\nLogs the result of an async function to the console. Only works in node.js or\nin browsers that support console.log and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.log is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n```js\nvar hello = function(name, callback){\n    setTimeout(function(){\n        callback(null, 'hello ' + name);\n    }, 1000);\n};\n```\n```js\nnode> async.log(hello, 'world');\n'hello world'\n```\n\n---------------------------------------\n\n<a name=\"dir\" />\n### dir(function, arguments)\n\nLogs the result of an async function to the console using console.dir to\ndisplay the properties of the resulting object. Only works in node.js or\nin browsers that support console.dir and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.dir is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n```js\nvar hello = function(name, callback){\n    setTimeout(function(){\n        callback(null, {hello: name});\n    }, 1000);\n};\n```\n```js\nnode> async.dir(hello, 'world');\n{hello: 'world'}\n```\n\n---------------------------------------\n\n<a name=\"noConflict\" />\n### noConflict()\n\nChanges the value of async back to its original value, returning a reference to the\nasync object.\n",
+  "readme": "# Async.js\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [node.js](http://nodejs.org), it can also be used directly in the\nbrowser. Also supports [component](https://github.com/component/component).\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (map, reduce, filter, eachâŠ) as well as some common patterns\nfor asynchronous control flow (parallel, series, waterfallâŠ). All these\nfunctions assume you follow the node.js convention of providing a single\ncallback as the last argument of your async function.\n\n\n## Quick Examples\n\n```javascript\nasync.map(['file1','file2','file3'], fs.stat, function(err, results){\n    // results is now an array of stats for each file\n});\n\nasync.filter(['file1','file2','file3'], fs.exists, function(results){\n    // results now equals an array of the existing files\n});\n\nasync.parallel([\n    function(){ ... },\n    function(){ ... }\n], callback);\n\nasync.series([\n    function(){ ... },\n    function(){ ... }\n]);\n```\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n## Common Pitfalls\n\n### Binding a context to an iterator\n\nThis section is really about bind, not about async. If you are wondering how to\nmake async execute your iterators in a given context, or are confused as to why\na method of another library isn't working as an iterator, study this example:\n\n```js\n// Here is a simple object with an (unnecessarily roundabout) squaring method\nvar AsyncSquaringLibrary = {\n  squareExponent: 2,\n  square: function(number, callback){ \n    var result = Math.pow(number, this.squareExponent);\n    setTimeout(function(){\n      callback(null, result);\n    }, 200);\n  }\n};\n\nasync.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){\n  // result is [NaN, NaN, NaN]\n  // This fails because the `this.squareExponent` expression in the square\n  // function is not evaluated in the context of AsyncSquaringLibrary, and is\n  // therefore undefined.\n});\n\nasync.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){\n  // result is [1, 4, 9]\n  // With the help of bind we can attach a context to the iterator before\n  // passing it to async. Now the square function will be executed in its \n  // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent`\n  // will be as expected.\n});\n```\n\n## Download\n\nThe source is available for download from\n[GitHub](http://github.com/caolan/async).\nAlternatively, you can install using Node Package Manager (npm):\n\n    npm install async\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed\n\n## In the Browser\n\nSo far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:\n\n```html\n<script type=\"text/javascript\" src=\"async.js\"></script>\n<script type=\"text/javascript\">\n\n    async.map(data, asyncProcess, function(err, results){\n        alert(results);\n    });\n\n</script>\n```\n\n## Documentation\n\n### Collections\n\n* [each](#each)\n* [eachSeries](#eachSeries)\n* [eachLimit](#eachLimit)\n* [map](#map)\n* [mapSeries](#mapSeries)\n* [mapLimit](#mapLimit)\n* [filter](#filter)\n* [filterSeries](#filterSeries)\n* [reject](#reject)\n* [rejectSeries](#rejectSeries)\n* [reduce](#reduce)\n* [reduceRight](#reduceRight)\n* [detect](#detect)\n* [detectSeries](#detectSeries)\n* [sortBy](#sortBy)\n* [some](#some)\n* [every](#every)\n* [concat](#concat)\n* [concatSeries](#concatSeries)\n\n### Control Flow\n\n* [series](#series)\n* [parallel](#parallel)\n* [parallelLimit](#parallellimittasks-limit-callback)\n* [whilst](#whilst)\n* [doWhilst](#doWhilst)\n* [until](#until)\n* [doUntil](#doUntil)\n* [forever](#forever)\n* [waterfall](#waterfall)\n* [compose](#compose)\n* [applyEach](#applyEach)\n* [applyEachSeries](#applyEachSeries)\n* [queue](#queue)\n* [cargo](#cargo)\n* [auto](#auto)\n* [iterator](#iterator)\n* [apply](#apply)\n* [nextTick](#nextTick)\n* [times](#times)\n* [timesSeries](#timesSeries)\n\n### Utils\n\n* [memoize](#memoize)\n* [unmemoize](#unmemoize)\n* [log](#log)\n* [dir](#dir)\n* [noConflict](#noConflict)\n\n\n## Collections\n\n<a name=\"forEach\" />\n<a name=\"each\" />\n### each(arr, iterator, callback)\n\nApplies an iterator function to each item in an array, in parallel.\nThe iterator is called with an item from the list and a callback for when it\nhas finished. If the iterator passes an error to this callback, the main\ncallback for the each function is immediately called with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback(err) which must be called once it has \n  completed. If no error has occured, the callback should be run without \n  arguments or with an explicit null argument.\n* callback(err) - A callback which is called after all the iterator functions\n  have finished, or an error has occurred.\n\n__Example__\n\n```js\n// assuming openFiles is an array of file names and saveFile is a function\n// to save the modified contents of that file:\n\nasync.each(openFiles, saveFile, function(err){\n    // if any of the saves produced an error, err would equal that error\n});\n```\n\n---------------------------------------\n\n<a name=\"forEachSeries\" />\n<a name=\"eachSeries\" />\n### eachSeries(arr, iterator, callback)\n\nThe same as each only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. This means the iterator functions will complete in order.\n\n\n---------------------------------------\n\n<a name=\"forEachLimit\" />\n<a name=\"eachLimit\" />\n### eachLimit(arr, limit, iterator, callback)\n\nThe same as each only no more than \"limit\" iterators will be simultaneously \nrunning at any time.\n\nNote that the items are not processed in batches, so there is no guarantee that\n the first \"limit\" iterator functions will complete before any others are \nstarted.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - The maximum number of iterators to run at any time.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback(err) which must be called once it has \n  completed. If no error has occured, the callback should be run without \n  arguments or with an explicit null argument.\n* callback(err) - A callback which is called after all the iterator functions\n  have finished, or an error has occurred.\n\n__Example__\n\n```js\n// Assume documents is an array of JSON objects and requestApi is a\n// function that interacts with a rate-limited REST api.\n\nasync.eachLimit(documents, 20, requestApi, function(err){\n    // if any of the saves produced an error, err would equal that error\n});\n```\n\n---------------------------------------\n\n<a name=\"map\" />\n### map(arr, iterator, callback)\n\nProduces a new array of values by mapping each value in the given array through\nthe iterator function. The iterator is called with an item from the array and a\ncallback for when it has finished processing. The callback takes 2 arguments, \nan error and the transformed item from the array. If the iterator passes an\nerror to this callback, the main callback for the map function is immediately\ncalled with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order, however\nthe results array will be in the same order as the original array.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback(err, transformed) which must be called once \n  it has completed with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array of the\n  transformed items from the original array.\n\n__Example__\n\n```js\nasync.map(['file1','file2','file3'], fs.stat, function(err, results){\n    // results is now an array of stats for each file\n});\n```\n\n---------------------------------------\n\n<a name=\"mapSeries\" />\n### mapSeries(arr, iterator, callback)\n\nThe same as map only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n---------------------------------------\n\n<a name=\"mapLimit\" />\n### mapLimit(arr, limit, iterator, callback)\n\nThe same as map only no more than \"limit\" iterators will be simultaneously \nrunning at any time.\n\nNote that the items are not processed in batches, so there is no guarantee that\n the first \"limit\" iterator functions will complete before any others are \nstarted.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - The maximum number of iterators to run at any time.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback(err, transformed) which must be called once \n  it has completed with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array of the\n  transformed items from the original array.\n\n__Example__\n\n```js\nasync.mapLimit(['file1','file2','file3'], 1, fs.stat, function(err, results){\n    // results is now an array of stats for each file\n});\n```\n\n---------------------------------------\n\n<a name=\"filter\" />\n### filter(arr, iterator, callback)\n\n__Alias:__ select\n\nReturns a new array of all the values which pass an async truth test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback(truthValue) which must be called with a \n  boolean argument once it has completed.\n* callback(results) - A callback which is called after all the iterator\n  functions have finished.\n\n__Example__\n\n```js\nasync.filter(['file1','file2','file3'], fs.exists, function(results){\n    // results now equals an array of the existing files\n});\n```\n\n---------------------------------------\n\n<a name=\"filterSeries\" />\n### filterSeries(arr, iterator, callback)\n\n__alias:__ selectSeries\n\nThe same as filter only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n---------------------------------------\n\n<a name=\"reject\" />\n### reject(arr, iterator, callback)\n\nThe opposite of filter. Removes values that pass an async truth test.\n\n---------------------------------------\n\n<a name=\"rejectSeries\" />\n### rejectSeries(arr, iterator, callback)\n\nThe same as reject, only the iterator is applied to each item in the array\nin series.\n\n\n---------------------------------------\n\n<a name=\"reduce\" />\n### reduce(arr, memo, iterator, callback)\n\n__aliases:__ inject, foldl\n\nReduces a list of values into a single value using an async iterator to return\neach successive step. Memo is the initial state of the reduction. This\nfunction only operates in series. For performance reasons, it may make sense to\nsplit a call to this function into a parallel map, then use the normal\nArray.prototype.reduce on the results. This function is for situations where\neach step in the reduction needs to be async, if you can get the data before\nreducing it then it's probably a good idea to do so.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* memo - The initial state of the reduction.\n* iterator(memo, item, callback) - A function applied to each item in the\n  array to produce the next step in the reduction. The iterator is passed a\n  callback(err, reduction) which accepts an optional error as its first \n  argument, and the state of the reduction as the second. If an error is \n  passed to the callback, the reduction is stopped and the main callback is \n  immediately called with the error.\n* callback(err, result) - A callback which is called after all the iterator\n  functions have finished. Result is the reduced value.\n\n__Example__\n\n```js\nasync.reduce([1,2,3], 0, function(memo, item, callback){\n    // pointless async:\n    process.nextTick(function(){\n        callback(null, memo + item)\n    });\n}, function(err, result){\n    // result is now equal to the last value of memo, which is 6\n});\n```\n\n---------------------------------------\n\n<a name=\"reduceRight\" />\n### reduceRight(arr, memo, iterator, callback)\n\n__Alias:__ foldr\n\nSame as reduce, only operates on the items in the array in reverse order.\n\n\n---------------------------------------\n\n<a name=\"detect\" />\n### detect(arr, iterator, callback)\n\nReturns the first value in a list that passes an async truth test. The\niterator is applied in parallel, meaning the first iterator to return true will\nfire the detect callback with that result. That means the result might not be\nthe first item in the original array (in terms of order) that passes the test.\n\nIf order within the original array is important then look at detectSeries.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback(truthValue) which must be called with a \n  boolean argument once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n  true, or after all the iterator functions have finished. Result will be\n  the first item in the array that passes the truth test (iterator) or the\n  value undefined if none passed.\n\n__Example__\n\n```js\nasync.detect(['file1','file2','file3'], fs.exists, function(result){\n    // result now equals the first file in the list that exists\n});\n```\n\n---------------------------------------\n\n<a name=\"detectSeries\" />\n### detectSeries(arr, iterator, callback)\n\nThe same as detect, only the iterator is applied to each item in the array\nin series. This means the result is always the first in the original array (in\nterms of array order) that passes the truth test.\n\n\n---------------------------------------\n\n<a name=\"sortBy\" />\n### sortBy(arr, iterator, callback)\n\nSorts a list by the results of running each value through an async iterator.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback(err, sortValue) which must be called once it\n  has completed with an error (which can be null) and a value to use as the sort\n  criteria.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is the items from\n  the original array sorted by the values returned by the iterator calls.\n\n__Example__\n\n```js\nasync.sortBy(['file1','file2','file3'], function(file, callback){\n    fs.stat(file, function(err, stats){\n        callback(err, stats.mtime);\n    });\n}, function(err, results){\n    // results is now the original array of files sorted by\n    // modified date\n});\n```\n\n---------------------------------------\n\n<a name=\"some\" />\n### some(arr, iterator, callback)\n\n__Alias:__ any\n\nReturns true if at least one element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists. Once any iterator\ncall returns true, the main callback is immediately called.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback(truthValue) which must be called with a \n  boolean argument once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n  true, or after all the iterator functions have finished. Result will be\n  either true or false depending on the values of the async tests.\n\n__Example__\n\n```js\nasync.some(['file1','file2','file3'], fs.exists, function(result){\n    // if result is true then at least one of the files exists\n});\n```\n\n---------------------------------------\n\n<a name=\"every\" />\n### every(arr, iterator, callback)\n\n__Alias:__ all\n\nReturns true if every element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like fs.exists.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n  The iterator is passed a callback(truthValue) which must be called with a \n  boolean argument once it has completed.\n* callback(result) - A callback which is called after all the iterator\n  functions have finished. Result will be either true or false depending on\n  the values of the async tests.\n\n__Example__\n\n```js\nasync.every(['file1','file2','file3'], fs.exists, function(result){\n    // if result is true then every file exists\n});\n```\n\n---------------------------------------\n\n<a name=\"concat\" />\n### concat(arr, iterator, callback)\n\nApplies an iterator to each item in a list, concatenating the results. Returns the\nconcatenated list. The iterators are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of the arguments passed to the iterator function.\n\n__Arguments__\n\n* arr - An array to iterate over\n* iterator(item, callback) - A function to apply to each item in the array.\n  The iterator is passed a callback(err, results) which must be called once it \n  has completed with an error (which can be null) and an array of results.\n* callback(err, results) - A callback which is called after all the iterator\n  functions have finished, or an error has occurred. Results is an array containing\n  the concatenated results of the iterator function.\n\n__Example__\n\n```js\nasync.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n    // files is now a list of filenames that exist in the 3 directories\n});\n```\n\n---------------------------------------\n\n<a name=\"concatSeries\" />\n### concatSeries(arr, iterator, callback)\n\nSame as async.concat, but executes in series instead of parallel.\n\n\n## Control Flow\n\n<a name=\"series\" />\n### series(tasks, [callback])\n\nRun an array of functions in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run and the callback for the series is\nimmediately called with the value of the error. Once the tasks have completed,\nthe results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.series.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed\n  a callback(err, result) it must call on completion with an error (which can\n  be null) and an optional result value.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets a results array (or object) containing all \n  the result arguments passed to the task callbacks.\n\n__Example__\n\n```js\nasync.series([\n    function(callback){\n        // do some stuff ...\n        callback(null, 'one');\n    },\n    function(callback){\n        // do some more stuff ...\n        callback(null, 'two');\n    }\n],\n// optional callback\nfunction(err, results){\n    // results is now equal to ['one', 'two']\n});\n\n\n// an example using an object instead of an array\nasync.series({\n    one: function(callback){\n        setTimeout(function(){\n            callback(null, 1);\n        }, 200);\n    },\n    two: function(callback){\n        setTimeout(function(){\n            callback(null, 2);\n        }, 100);\n    }\n},\nfunction(err, results) {\n    // results is now equal to: {one: 1, two: 2}\n});\n```\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallel(tasks, [callback])\n\nRun an array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main callback is immediately called with the value of the error.\nOnce the tasks have completed, the results are passed to the final callback as an\narray.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.parallel.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed \n  a callback(err, result) it must call on completion with an error (which can\n  be null) and an optional result value.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets a results array (or object) containing all \n  the result arguments passed to the task callbacks.\n\n__Example__\n\n```js\nasync.parallel([\n    function(callback){\n        setTimeout(function(){\n            callback(null, 'one');\n        }, 200);\n    },\n    function(callback){\n        setTimeout(function(){\n            callback(null, 'two');\n        }, 100);\n    }\n],\n// optional callback\nfunction(err, results){\n    // the results array will equal ['one','two'] even though\n    // the second function had a shorter timeout.\n});\n\n\n// an example using an object instead of an array\nasync.parallel({\n    one: function(callback){\n        setTimeout(function(){\n            callback(null, 1);\n        }, 200);\n    },\n    two: function(callback){\n        setTimeout(function(){\n            callback(null, 2);\n        }, 100);\n    }\n},\nfunction(err, results) {\n    // results is now equals to: {one: 1, two: 2}\n});\n```\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallelLimit(tasks, limit, [callback])\n\nThe same as parallel only the tasks are executed in parallel with a maximum of \"limit\" \ntasks executing at any time.\n\nNote that the tasks are not executed in batches, so there is no guarantee that \nthe first \"limit\" tasks will complete before any others are started.\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed \n  a callback(err, result) it must call on completion with an error (which can\n  be null) and an optional result value.\n* limit - The maximum number of tasks to run at any time.\n* callback(err, results) - An optional callback to run once all the functions\n  have completed. This function gets a results array (or object) containing all \n  the result arguments passed to the task callbacks.\n\n---------------------------------------\n\n<a name=\"whilst\" />\n### whilst(test, fn, callback)\n\nRepeatedly call fn, while test returns true. Calls the callback when stopped,\nor an error occurs.\n\n__Arguments__\n\n* test() - synchronous truth test to perform before each execution of fn.\n* fn(callback) - A function to call each time the test passes. The function is\n  passed a callback(err) which must be called once it has completed with an \n  optional error argument.\n* callback(err) - A callback which is called after the test fails and repeated\n  execution of fn has stopped.\n\n__Example__\n\n```js\nvar count = 0;\n\nasync.whilst(\n    function () { return count < 5; },\n    function (callback) {\n        count++;\n        setTimeout(callback, 1000);\n    },\n    function (err) {\n        // 5 seconds have passed\n    }\n);\n```\n\n---------------------------------------\n\n<a name=\"doWhilst\" />\n### doWhilst(fn, test, callback)\n\nThe post check version of whilst. To reflect the difference in the order of operations `test` and `fn` arguments are switched. `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.\n\n---------------------------------------\n\n<a name=\"until\" />\n### until(test, fn, callback)\n\nRepeatedly call fn, until test returns true. Calls the callback when stopped,\nor an error occurs.\n\nThe inverse of async.whilst.\n\n---------------------------------------\n\n<a name=\"doUntil\" />\n### doUntil(fn, test, callback)\n\nLike doWhilst except the test is inverted. Note the argument ordering differs from `until`.\n\n---------------------------------------\n\n<a name=\"forever\" />\n### forever(fn, callback)\n\nCalls the asynchronous function 'fn' repeatedly, in series, indefinitely.\nIf an error is passed to fn's callback then 'callback' is called with the\nerror, otherwise it will never be called.\n\n---------------------------------------\n\n<a name=\"waterfall\" />\n### waterfall(tasks, [callback])\n\nRuns an array of functions in series, each passing their results to the next in\nthe array. However, if any of the functions pass an error to the callback, the\nnext function is not executed and the main callback is immediately called with\nthe error.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a \n  callback(err, result1, result2, ...) it must call on completion. The first\n  argument is an error (which can be null) and any further arguments will be \n  passed as arguments in order to the next task.\n* callback(err, [results]) - An optional callback to run once all the functions\n  have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n```js\nasync.waterfall([\n    function(callback){\n        callback(null, 'one', 'two');\n    },\n    function(arg1, arg2, callback){\n        callback(null, 'three');\n    },\n    function(arg1, callback){\n        // arg1 now equals 'three'\n        callback(null, 'done');\n    }\n], function (err, result) {\n   // result now equals 'done'    \n});\n```\n\n---------------------------------------\n<a name=\"compose\" />\n### compose(fn1, fn2...)\n\nCreates a function which is a composition of the passed asynchronous\nfunctions. Each function consumes the return value of the function that\nfollows. Composing functions f(), g() and h() would produce the result of\nf(g(h())), only this version uses callbacks to obtain the return values.\n\nEach function is executed with the `this` binding of the composed function.\n\n__Arguments__\n\n* functions... - the asynchronous functions to compose\n\n\n__Example__\n\n```js\nfunction add1(n, callback) {\n    setTimeout(function () {\n        callback(null, n + 1);\n    }, 10);\n}\n\nfunction mul3(n, callback) {\n    setTimeout(function () {\n        callback(null, n * 3);\n    }, 10);\n}\n\nvar add1mul3 = async.compose(mul3, add1);\n\nadd1mul3(4, function (err, result) {\n   // result now equals 15\n});\n```\n\n---------------------------------------\n<a name=\"applyEach\" />\n### applyEach(fns, args..., callback)\n\nApplies the provided arguments to each function in the array, calling the\ncallback after all functions have completed. If you only provide the first\nargument then it will return a function which lets you pass in the\narguments as if it were a single function call.\n\n__Arguments__\n\n* fns - the asynchronous functions to all call with the same arguments\n* args... - any number of separate arguments to pass to the function\n* callback - the final argument should be the callback, called when all\n  functions have completed processing\n\n\n__Example__\n\n```js\nasync.applyEach([enableSearch, updateSchema], 'bucket', callback);\n\n// partial application example:\nasync.each(\n    buckets,\n    async.applyEach([enableSearch, updateSchema]),\n    callback\n);\n```\n\n---------------------------------------\n\n<a name=\"applyEachSeries\" />\n### applyEachSeries(arr, iterator, callback)\n\nThe same as applyEach only the functions are applied in series.\n\n---------------------------------------\n\n<a name=\"queue\" />\n### queue(worker, concurrency)\n\nCreates a queue object with the specified concurrency. Tasks added to the\nqueue will be processed in parallel (up to the concurrency limit). If all\nworkers are in progress, the task is queued until one is available. Once\na worker has completed a task, the task's callback is called.\n\n__Arguments__\n\n* worker(task, callback) - An asynchronous function for processing a queued\n  task, which must call its callback(err) argument when finished, with an \n  optional error as an argument.\n* concurrency - An integer for determining how many worker functions should be\n  run in parallel.\n\n__Queue objects__\n\nThe queue object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* concurrency - an integer for determining how many worker functions should be\n  run in parallel. This property can be changed after a queue is created to\n  alter the concurrency on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n  once the worker has finished processing the task.\n  instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* unshift(task, [callback]) - add a new task to the front of the queue.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n```js\n// create a queue object with concurrency 2\n\nvar q = async.queue(function (task, callback) {\n    console.log('hello ' + task.name);\n    callback();\n}, 2);\n\n\n// assign a callback\nq.drain = function() {\n    console.log('all items have been processed');\n}\n\n// add some items to the queue\n\nq.push({name: 'foo'}, function (err) {\n    console.log('finished processing foo');\n});\nq.push({name: 'bar'}, function (err) {\n    console.log('finished processing bar');\n});\n\n// add some items to the queue (batch-wise)\n\nq.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n    console.log('finished processing bar');\n});\n\n// add some items to the front of the queue\n\nq.unshift({name: 'bar'}, function (err) {\n    console.log('finished processing bar');\n});\n```\n\n---------------------------------------\n\n<a name=\"cargo\" />\n### cargo(worker, [payload])\n\nCreates a cargo object with the specified payload. Tasks added to the\ncargo will be processed altogether (up to the payload limit). If the\nworker is in progress, the task is queued until it is available. Once\nthe worker has completed some tasks, each callback of those tasks is called.\n\n__Arguments__\n\n* worker(tasks, callback) - An asynchronous function for processing an array of\n  queued tasks, which must call its callback(err) argument when finished, with \n  an optional error as an argument.\n* payload - An optional integer for determining how many tasks should be\n  processed per round; if omitted, the default is unlimited.\n\n__Cargo objects__\n\nThe cargo object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* payload - an integer for determining how many tasks should be\n  process per round. This property can be changed after a cargo is created to\n  alter the payload on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n  once the worker has finished processing the task.\n  instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n```js\n// create a cargo object with payload 2\n\nvar cargo = async.cargo(function (tasks, callback) {\n    for(var i=0; i<tasks.length; i++){\n      console.log('hello ' + tasks[i].name);\n    }\n    callback();\n}, 2);\n\n\n// add some items\n\ncargo.push({name: 'foo'}, function (err) {\n    console.log('finished processing foo');\n});\ncargo.push({name: 'bar'}, function (err) {\n    console.log('finished processing bar');\n});\ncargo.push({name: 'baz'}, function (err) {\n    console.log('finished processing baz');\n});\n```\n\n---------------------------------------\n\n<a name=\"auto\" />\n### auto(tasks, [callback])\n\nDetermines the best order for running functions based on their requirements.\nEach function can optionally depend on other functions being completed first,\nand each function is run as soon as its requirements are satisfied. If any of\nthe functions pass an error to their callback, that function will not complete\n(so any other functions depending on it will not run) and the main callback\nwill be called immediately with the error. Functions also receive an object\ncontaining the results of functions which have completed so far.\n\nNote, all functions are called with a results object as a second argument, \nso it is unsafe to pass functions in the tasks object which cannot handle the\nextra argument. For example, this snippet of code:\n\n```js\nasync.auto({\n  readData: async.apply(fs.readFile, 'data.txt', 'utf-8')\n}, callback);\n```\n\nwill have the effect of calling readFile with the results object as the last\nargument, which will fail:\n\n```js\nfs.readFile('data.txt', 'utf-8', cb, {});\n```\n\nInstead, wrap the call to readFile in a function which does not forward the \nresults object:\n\n```js\nasync.auto({\n  readData: function(cb, results){\n    fs.readFile('data.txt', 'utf-8', cb);\n  }\n}, callback);\n```\n\n__Arguments__\n\n* tasks - An object literal containing named functions or an array of\n  requirements, with the function itself the last item in the array. The key\n  used for each function or array is used when specifying requirements. The \n  function receives two arguments: (1) a callback(err, result) which must be \n  called when finished, passing an error (which can be null) and the result of \n  the function's execution, and (2) a results object, containing the results of\n  the previously executed functions.\n* callback(err, results) - An optional callback which is called when all the\n  tasks have been completed. The callback will receive an error as an argument\n  if any tasks pass an error to their callback. Results will always be passed\n\tbut if an error occurred, no other tasks will be performed, and the results\n\tobject will only contain partial results.\n  \n\n__Example__\n\n```js\nasync.auto({\n    get_data: function(callback){\n        // async code to get some data\n    },\n    make_folder: function(callback){\n        // async code to create a directory to store a file in\n        // this is run at the same time as getting the data\n    },\n    write_file: ['get_data', 'make_folder', function(callback){\n        // once there is some data and the directory exists,\n        // write the data to a file in the directory\n        callback(null, filename);\n    }],\n    email_link: ['write_file', function(callback, results){\n        // once the file is written let's email a link to it...\n        // results.write_file contains the filename returned by write_file.\n    }]\n});\n```\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n```js\nasync.parallel([\n    function(callback){\n        // async code to get some data\n    },\n    function(callback){\n        // async code to create a directory to store a file in\n        // this is run at the same time as getting the data\n    }\n],\nfunction(err, results){\n    async.series([\n        function(callback){\n            // once there is some data and the directory exists,\n            // write the data to a file in the directory\n        },\n        function(callback){\n            // once the file is written let's email a link to it...\n        }\n    ]);\n});\n```\n\nFor a complicated series of async tasks using the auto function makes adding\nnew tasks much easier and makes the code more readable.\n\n\n---------------------------------------\n\n<a name=\"iterator\" />\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the array,\nreturning a continuation to call the next one after that. It's also possible to\n'peek' the next iterator by doing iterator.next().\n\nThis function is used internally by the async module but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* tasks - An array of functions to run.\n\n__Example__\n\n```js\nvar iterator = async.iterator([\n    function(){ sys.p('one'); },\n    function(){ sys.p('two'); },\n    function(){ sys.p('three'); }\n]);\n\nnode> var iterator2 = iterator();\n'one'\nnode> var iterator3 = iterator2();\n'two'\nnode> iterator3();\n'three'\nnode> var nextfn = iterator2.next();\nnode> nextfn();\n'three'\n```\n\n---------------------------------------\n\n<a name=\"apply\" />\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied, a useful\nshorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to automatically apply when the\n  continuation is called.\n\n__Example__\n\n```js\n// using apply\n\nasync.parallel([\n    async.apply(fs.writeFile, 'testfile1', 'test1'),\n    async.apply(fs.writeFile, 'testfile2', 'test2'),\n]);\n\n\n// the same process without using apply\n\nasync.parallel([\n    function(callback){\n        fs.writeFile('testfile1', 'test1', callback);\n    },\n    function(callback){\n        fs.writeFile('testfile2', 'test2', callback);\n    }\n]);\n```\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n```js\nnode> var fn = async.apply(sys.puts, 'one');\nnode> fn('two', 'three');\none\ntwo\nthree\n```\n\n---------------------------------------\n\n<a name=\"nextTick\" />\n### nextTick(callback)\n\nCalls the callback on a later loop around the event loop. In node.js this just\ncalls process.nextTick, in the browser it falls back to setImmediate(callback)\nif available, otherwise setTimeout(callback, 0), which means other higher priority\nevents may precede the execution of the callback.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* callback - The function to call on a later loop around the event loop.\n\n__Example__\n\n```js\nvar call_order = [];\nasync.nextTick(function(){\n    call_order.push('two');\n    // call_order now equals ['one','two']\n});\ncall_order.push('one')\n```\n\n<a name=\"times\" />\n### times(n, callback)\n\nCalls the callback n times and accumulates results in the same manner\nyou would use with async.map.\n\n__Arguments__\n\n* n - The number of times to run the function.\n* callback - The function to call n times.\n\n__Example__\n\n```js\n// Pretend this is some complicated async factory\nvar createUser = function(id, callback) {\n  callback(null, {\n    id: 'user' + id\n  })\n}\n// generate 5 users\nasync.times(5, function(n, next){\n    createUser(n, function(err, user) {\n      next(err, user)\n    })\n}, function(err, users) {\n  // we should now have 5 users\n});\n```\n\n<a name=\"timesSeries\" />\n### timesSeries(n, callback)\n\nThe same as times only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n## Utils\n\n<a name=\"memoize\" />\n### memoize(fn, [hasher])\n\nCaches the results of an async function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\nThe cache of results is exposed as the `memo` property of the function returned\nby `memoize`.\n\n__Arguments__\n\n* fn - the function you to proxy and cache results from.\n* hasher - an optional function for generating a custom hash for storing\n  results, it has all the arguments applied to it apart from the callback, and\n  must be synchronous.\n\n__Example__\n\n```js\nvar slow_fn = function (name, callback) {\n    // do something\n    callback(null, result);\n};\nvar fn = async.memoize(slow_fn);\n\n// fn can now be used as if it were slow_fn\nfn('some name', function () {\n    // callback\n});\n```\n\n<a name=\"unmemoize\" />\n### unmemoize(fn)\n\nUndoes a memoized function, reverting it to the original, unmemoized\nform. Comes handy in tests.\n\n__Arguments__\n\n* fn - the memoized function\n\n<a name=\"log\" />\n### log(function, arguments)\n\nLogs the result of an async function to the console. Only works in node.js or\nin browsers that support console.log and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.log is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n```js\nvar hello = function(name, callback){\n    setTimeout(function(){\n        callback(null, 'hello ' + name);\n    }, 1000);\n};\n```\n```js\nnode> async.log(hello, 'world');\n'hello world'\n```\n\n---------------------------------------\n\n<a name=\"dir\" />\n### dir(function, arguments)\n\nLogs the result of an async function to the console using console.dir to\ndisplay the properties of the resulting object. Only works in node.js or\nin browsers that support console.dir and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.dir is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n```js\nvar hello = function(name, callback){\n    setTimeout(function(){\n        callback(null, {hello: name});\n    }, 1000);\n};\n```\n```js\nnode> async.dir(hello, 'world');\n{hello: 'world'}\n```\n\n---------------------------------------\n\n<a name=\"noConflict\" />\n### noConflict()\n\nChanges the value of async back to its original value, returning a reference to the\nasync object.\n",
   "readmeFilename": "README.md",
   "homepage": "https://github.com/caolan/async",
-  "_id": "async@0.2.9",
+  "_id": "async@0.2.10",
   "_from": "async@~0.2.9"
 }
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json	(revision 516)
@@ -28,4 +28,5 @@
   },
   "_id": "delayed-stream@0.0.5",
-  "_from": "delayed-stream@0.0.5"
+  "_from": "delayed-stream@0.0.5",
+  "scripts": {}
 }
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json	(revision 516)
@@ -29,4 +29,5 @@
   },
   "_id": "combined-stream@0.0.4",
-  "_from": "combined-stream@~0.0.4"
+  "_from": "combined-stream@~0.0.4",
+  "scripts": {}
 }
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/form-data/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/form-data/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/form-data/package.json	(revision 516)
@@ -43,8 +43,4 @@
   "homepage": "https://github.com/felixge/node-form-data",
   "_id": "form-data@0.1.2",
-  "dist": {
-    "shasum": "19a6c063cb6fd24a82ba888616a6105495eda491"
-  },
-  "_from": "form-data@~0.1.0",
-  "_resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.2.tgz"
+  "_from": "form-data@~0.1.0"
 }
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/hawk/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/hawk/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/hawk/package.json	(revision 516)
@@ -50,8 +50,4 @@
   "homepage": "https://github.com/hueniverse/hawk",
   "_id": "hawk@1.0.0",
-  "dist": {
-    "shasum": "e938be8d133181ca7b5e05ac7fc6fa5df66be372"
-  },
-  "_from": "hawk@~1.0.0",
-  "_resolved": "https://registry.npmjs.org/hawk/-/hawk-1.0.0.tgz"
+  "_from": "hawk@~1.0.0"
 }
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/http-signature/node_modules/asn1/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/http-signature/node_modules/asn1/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/http-signature/node_modules/asn1/package.json	(revision 516)
@@ -31,5 +31,5 @@
   "scripts": {
     "pretest": "which gjslint; if [[ \"$?\" = 0 ]] ; then  gjslint --nojsdoc -r lib -r tst; else echo \"Missing gjslint. Skipping lint\"; fi",
-    "test": "./node_modules/.bin/tap ./tst"
+    "test": "tap ./tst"
   },
   "readme": "node-asn1 is a library for encoding and decoding ASN.1 datatypes in pure JS.\nCurrently BER encoding is supported; at some point I'll likely have to do DER.\n\n## Usage\n\nMostly, if you're *actually* needing to read and write ASN.1, you probably don't\nneed this readme to explain what and why.  If you have no idea what ASN.1 is,\nsee this: ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc\n\nThe source is pretty much self-explanatory, and has read/write methods for the\ncommon types out there.\n\n### Decoding\n\nThe following reads an ASN.1 sequence with a boolean.\n\n    var Ber = require('asn1').Ber;\n\n    var reader = new Ber.Reader(new Buffer([0x30, 0x03, 0x01, 0x01, 0xff]));\n\n    reader.readSequence();\n    console.log('Sequence len: ' + reader.length);\n    if (reader.peek() === Ber.Boolean)\n      console.log(reader.readBoolean());\n\n### Encoding\n\nThe following generates the same payload as above.\n\n    var Ber = require('asn1').Ber;\n\n    var writer = new Ber.Writer();\n\n    writer.startSequence();\n    writer.writeBoolean(true);\n    writer.endSequence();\n\n    console.log(writer.buffer);\n\n## Installation\n\n    npm install asn1\n\n## License\n\nMIT.\n\n## Bugs\n\nSee <https://github.com/mcavage/node-asn1/issues>.\n",
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json	(revision 516)
@@ -17,8 +17,5 @@
   "readmeFilename": "README.md",
   "_id": "assert-plus@0.1.2",
-  "dist": {
-    "shasum": "45a89f54ea7c2d3462aba816e3387f5723659c1e"
-  },
   "_from": "assert-plus@0.1.2",
-  "_resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.2.tgz"
+  "scripts": {}
 }
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/http-signature/node_modules/ctype/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/http-signature/node_modules/ctype/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/http-signature/node_modules/ctype/package.json	(revision 516)
@@ -15,4 +15,5 @@
   "readmeFilename": "README",
   "_id": "ctype@0.5.2",
-  "_from": "ctype@0.5.2"
+  "_from": "ctype@0.5.2",
+  "scripts": {}
 }
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/http-signature/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/http-signature/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/http-signature/package.json	(revision 516)
@@ -15,5 +15,5 @@
   "main": "lib/index.js",
   "scripts": {
-    "test": "./node_modules/.bin/tap tst/*.js"
+    "test": "tap tst/*.js"
   },
   "dependencies": {
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/json-stringify-safe/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/json-stringify-safe/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/json-stringify-safe/package.json	(revision 516)
@@ -30,8 +30,4 @@
   "homepage": "https://github.com/isaacs/json-stringify-safe",
   "_id": "json-stringify-safe@5.0.0",
-  "dist": {
-    "shasum": "80bbe7752a7e12735356aeb2dded57a790bc3ec1"
-  },
-  "_from": "json-stringify-safe@~5.0.0",
-  "_resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz"
+  "_from": "json-stringify-safe@~5.0.0"
 }
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/node-uuid/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/node-uuid/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/node-uuid/package.json	(revision 516)
@@ -32,4 +32,5 @@
   "homepage": "https://github.com/broofa/node-uuid",
   "_id": "node-uuid@1.4.1",
-  "_from": "node-uuid@~1.4.0"
+  "_from": "node-uuid@~1.4.0",
+  "scripts": {}
 }
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/qs/index.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/qs/index.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/qs/index.js	(revision 516)
@@ -38,5 +38,9 @@
 var objectKeys = Object.keys || function(obj) {
   var ret = [];
-  for (var key in obj) ret.push(key);
+  for (var key in obj) {
+    if (obj.hasOwnProperty(key)) {
+      ret.push(key);
+    }
+  }
   return ret;
 };
@@ -64,14 +68,4 @@
 
 /**
- * Create a nullary object if possible
- */
-
-function createObject() {
-  return Object.create
-    ? Object.create(null)
-    : {};
-}
-
-/**
  * Cache non-integer test regexp.
  */
@@ -80,6 +74,6 @@
 
 function promote(parent, key) {
-  if (parent[key].length == 0) return parent[key] = createObject();
-  var t = createObject();
+  if (parent[key].length == 0) return parent[key] = {}
+  var t = {};
   for (var i in parent[key]) {
     if (hasOwnProperty.call(parent[key], i)) {
@@ -93,4 +87,8 @@
 function parse(parts, parent, key, val) {
   var part = parts.shift();
+  
+  // illegal
+  if (Object.getOwnPropertyDescriptor(Object.prototype, key)) return;
+  
   // end
   if (!part) {
@@ -141,5 +139,5 @@
   } else {
     if (!isint.test(key) && isArray(parent.base)) {
-      var t = createObject();
+      var t = {};
       for (var k in parent.base) t[k] = parent.base[k];
       parent.base = t;
@@ -174,24 +172,4 @@
   }
 
-  return obj;
-}
-
-/**
- * Restore Object.prototype.
- * see pull-request #58
- */
-
-function restoreProto(obj) {
-  if (!Object.create) return obj;
-  if (isArray(obj)) return obj;
-  if (obj && 'object' != typeof obj) return obj;
-
-  for (var key in obj) {
-    if (hasOwnProperty.call(obj, key)) {
-      obj[key] = restoreProto(obj[key]);
-    }
-  }
-
-  obj.__proto__ = Object.prototype;
   return obj;
 }
@@ -228,7 +206,7 @@
 
     return merge(ret, decode(key), decode(val));
-  }, { base: createObject() }).base;
-
-  return restoreProto(compact(ret));
+  }, { base: {} }).base;
+
+  return compact(ret);
 }
 
@@ -342,4 +320,5 @@
 function set(obj, key, val) {
   var v = obj[key];
+  if (Object.getOwnPropertyDescriptor(Object.prototype, key)) return;
   if (undefined === v) {
     obj[key] = val;
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/qs/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/qs/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/qs/package.json	(revision 516)
@@ -2,5 +2,5 @@
   "name": "qs",
   "description": "querystring parser",
-  "version": "0.6.5",
+  "version": "0.6.6",
   "keywords": [
     "query string",
@@ -34,5 +34,5 @@
   },
   "homepage": "https://github.com/visionmedia/node-querystring",
-  "_id": "qs@0.6.5",
+  "_id": "qs@0.6.6",
   "_from": "qs@~0.6.0"
 }
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/.jshintrc
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/.jshintrc	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/.jshintrc	(revision 516)
@@ -0,0 +1,70 @@
+{
+    "passfail"      : false,
+    "maxerr"        : 100,
+
+    "browser"       : false,
+    "node"          : true,
+    "rhino"         : false,
+    "couch"         : false,
+    "wsh"           : false,
+
+    "jquery"        : false,
+    "prototypejs"   : false,
+    "mootools"      : false,
+    "dojo"          : false,
+
+    "debug"         : false,
+    "devel"         : false,
+
+    "esnext"        : true,
+    "strict"        : true,
+    "globalstrict"  : true,
+
+    "asi"           : false,
+    "laxbreak"      : false,
+    "bitwise"       : true,
+    "boss"          : false,
+    "curly"         : true,
+    "eqeqeq"        : false,
+    "eqnull"        : true,
+    "evil"          : false,
+    "expr"          : false,
+    "forin"         : false,
+    "immed"         : true,
+    "lastsemic"     : true,
+    "latedef"       : false,
+    "loopfunc"      : false,
+    "noarg"         : true,
+    "regexp"        : false,
+    "regexdash"     : false,
+    "scripturl"     : false,
+    "shadow"        : false,
+    "supernew"      : false,
+    "undef"         : true,
+    "unused"         : true,
+
+    "newcap"        : true,
+    "noempty"       : true,
+    "nonew"         : true,
+    "nomen"         : false,
+    "onevar"        : false,
+    "onecase"       : true,
+    "plusplus"      : false,
+    "proto"         : false,
+    "sub"           : true,
+    "trailing"      : true,
+    "white"         : false,
+
+    "predef": [
+      "describe",
+      "it",
+      "before",
+      "beforeEach",
+      "after",
+      "afterEach",
+      "expect",
+      "setTimeout",
+      "clearTimeout"
+    ],
+    "maxlen": 0
+}
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/.npmignore
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/.npmignore	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/.npmignore	(revision 516)
@@ -0,0 +1,3 @@
+node_modules/
+.*.sw[nmop]
+npm-debug.log
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/.travis.yml
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/.travis.yml	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/.travis.yml	(revision 516)
@@ -0,0 +1,8 @@
+language: node_js
+node_js:
+- "0.10"
+- "0.11"
+matrix:
+  fast_finish: true
+  allow_failures:
+    - node_js: 0.11
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/LICENSE
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/LICENSE	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/LICENSE	(revision 516)
@@ -0,0 +1,78 @@
+Copyright GoInstant, Inc. and other contributors. All rights reserved.
+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.
+
+The following exceptions apply:
+
+===
+
+`pubSufTest()` of generate-pubsuffix.js is in the public domain.
+
+  // Any copyright is dedicated to the Public Domain.
+  // http://creativecommons.org/publicdomain/zero/1.0/
+
+===
+
+`public-suffix.txt` was obtained from
+<https://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1>
+via <http://publicsuffix.org>.
+
+That file contains the usual Mozilla triple-license, for which this project uses it
+under the terms of the MPL 1.1:
+
+    // ***** BEGIN LICENSE BLOCK *****
+    // Version: MPL 1.1/GPL 2.0/LGPL 2.1
+    // 
+    // The contents of this file are subject to the Mozilla Public License Version 
+    // 1.1 (the "License"); you may not use this file except in compliance with 
+    // the License. You may obtain a copy of the License at 
+    // http://www.mozilla.org/MPL/
+    // 
+    // Software distributed under the License is distributed on an "AS IS" basis,
+    // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+    // for the specific language governing rights and limitations under the
+    // License.
+    // 
+    // The Original Code is the Public Suffix List.
+    // 
+    // The Initial Developer of the Original Code is
+    // Jo Hermans <jo.hermans@gmail.com>.
+    // Portions created by the Initial Developer are Copyright (C) 2007
+    // the Initial Developer. All Rights Reserved.
+    // 
+    // Contributor(s):
+    //   Ruben Arakelyan <ruben@rubenarakelyan.com>
+    //   Gervase Markham <gerv@gerv.net>
+    //   Pamela Greene <pamg.bugs@gmail.com>
+    //   David Triendl <david@triendl.name>
+    //   Jothan Frakes <jothan@gmail.com>
+    //   The kind representatives of many TLD registries
+    // 
+    // Alternatively, the contents of this file may be used under the terms of
+    // either the GNU General Public License Version 2 or later (the "GPL"), or
+    // the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+    // in which case the provisions of the GPL or the LGPL are applicable instead
+    // of those above. If you wish to allow use of your version of this file only
+    // under the terms of either the GPL or the LGPL, and not to allow others to
+    // use your version of this file under the terms of the MPL, indicate your
+    // decision by deleting the provisions above and replace them with the notice
+    // and other provisions required by the GPL or the LGPL. If you do not delete
+    // the provisions above, a recipient may use your version of this file under
+    // the terms of any one of the MPL, the GPL or the LGPL.
+    // 
+    // ***** END LICENSE BLOCK *****
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/README.md	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/README.md	(revision 516)
@@ -0,0 +1,412 @@
+[RFC6265](http://tools.ietf.org/html/rfc6265) Cookies and CookieJar for Node.js
+
+![Tough Cookie](http://www.goinstant.com.s3.amazonaws.com/tough-cookie.jpg)
+
+[![Build Status](https://travis-ci.org/goinstant/node-cookie.png?branch=master)](https://travis-ci.org/goinstant/node-cookie)
+
+[![NPM Stats](https://nodei.co/npm/tough-cookie.png?downloads=true&stars=true)](https://npmjs.org/package/tough-cookie)
+![NPM Downloads](https://nodei.co/npm-dl/tough-cookie.png?months=9)
+
+# Synopsis
+
+``` javascript
+var tough = require('tough-cookie'); // note: not 'cookie', 'cookies' or 'node-cookie'
+var Cookie = tough.Cookie;
+var cookie = Cookie.parse(header);
+cookie.value = 'somethingdifferent';
+header = cookie.toString();
+
+var cookiejar = new tough.CookieJar();
+cookiejar.setCookie(cookie, 'http://currentdomain.example.com/path', cb);
+// ...
+cookiejar.getCookies('http://example.com/otherpath',function(err,cookies) {
+  res.headers['cookie'] = cookies.join('; ');
+});
+```
+
+# Installation
+
+It's _so_ easy!
+
+`npm install tough-cookie`
+
+Requires `punycode`, which should get installed automatically for you.  Note that node.js v0.6.2+ bundles punycode by default.
+
+Why the name?  NPM modules `cookie`, `cookies` and `cookiejar` were already taken.
+
+# API
+
+tough
+=====
+
+Functions on the module you get from `require('tough-cookie')`.  All can be used as pure functions and don't need to be "bound".
+
+parseDate(string[,strict])
+-----------------
+
+Parse a cookie date string into a `Date`.  Parses according to RFC6265 Section 5.1.1, not `Date.parse()`.  If strict is set to true then leading/trailing non-seperator characters around the time part will cause the parsing to fail (e.g. "Thu, 01 Jan 1970 00:00:010 GMT" has an extra trailing zero but Chrome, an assumedly RFC-compliant browser, treats this as valid).
+
+formatDate(date)
+----------------
+
+Format a Date into a RFC1123 string (the RFC6265-recommended format).
+
+canonicalDomain(str)
+--------------------
+
+Transforms a domain-name into a canonical domain-name.  The canonical domain-name is a trimmed, lowercased, stripped-of-leading-dot and optionally punycode-encoded domain-name (Section 5.1.2 of RFC6265).  For the most part, this function is idempotent (can be run again on its output without ill effects).
+
+domainMatch(str,domStr[,canonicalize=true])
+-------------------------------------------
+
+Answers "does this real domain match the domain in a cookie?".  The `str` is the "current" domain-name and the `domStr` is the "cookie" domain-name.  Matches according to RFC6265 Section 5.1.3, but it helps to think of it as a "suffix match".
+
+The `canonicalize` parameter will run the other two paramters through `canonicalDomain` or not.
+
+defaultPath(path)
+-----------------
+
+Given a current request/response path, gives the Path apropriate for storing in a cookie.  This is basically the "directory" of a "file" in the path, but is specified by Section 5.1.4 of the RFC.
+
+The `path` parameter MUST be _only_ the pathname part of a URI (i.e. excludes the hostname, query, fragment, etc.).  This is the `.pathname` property of node's `uri.parse()` output.
+
+pathMatch(reqPath,cookiePath)
+-----------------------------
+
+Answers "does the request-path path-match a given cookie-path?" as per RFC6265 Section 5.1.4.  Returns a boolean.
+
+This is essentially a prefix-match where `cookiePath` is a prefix of `reqPath`.
+
+parse(header[,strict=false])
+----------------------------
+
+alias for `Cookie.parse(header[,strict])`
+
+fromJSON(string)
+----------------
+
+alias for `Cookie.fromJSON(string)`
+
+getPublicSuffix(hostname)
+-------------------------
+
+Returns the public suffix of this hostname.  The public suffix is the shortest domain-name upon which a cookie can be set.  Returns `null` if the hostname cannot have cookies set for it.
+
+For example: `www.example.com` and `www.subdomain.example.com` both have public suffix `example.com`.
+
+For further information, see http://publicsuffix.org/.  This module derives its list from that site.
+
+cookieCompare(a,b)
+------------------
+
+For use with `.sort()`, sorts a list of cookies into the recommended order given in the RFC (Section 5.4 step 2).  Longest `.path`s go first, then sorted oldest to youngest.
+
+``` javascript
+var cookies = [ /* unsorted array of Cookie objects */ ];
+cookies = cookies.sort(cookieCompare);
+```
+
+permuteDomain(domain)
+---------------------
+
+Generates a list of all possible domains that `domainMatch()` the parameter.  May be handy for implementing cookie stores.
+
+
+permutePath(path)
+-----------------
+
+Generates a list of all possible paths that `pathMatch()` the parameter.  May be handy for implementing cookie stores.
+
+Cookie
+======
+
+Cookie.parse(header[,strict=false])
+-----------------------------------
+
+Parses a single Cookie or Set-Cookie HTTP header into a `Cookie` object.  Returns `undefined` if the string can't be parsed.  If in strict mode, returns `undefined` if the cookie doesn't follow the guidelines in section 4 of RFC6265.  Generally speaking, strict mode can be used to validate your own generated Set-Cookie headers, but acting as a client you want to be lenient and leave strict mode off.
+
+Here's how to process the Set-Cookie header(s) on a node HTTP/HTTPS response:
+
+``` javascript
+if (res.headers['set-cookie'] instanceof Array)
+  cookies = res.headers['set-cookie'].map(function (c) { return (Cookie.parse(c)); });
+else
+  cookies = [Cookie.parse(res.headers['set-cookie'])];
+```
+
+Cookie.fromJSON(string)
+-----------------------
+
+Convert a JSON string to a `Cookie` object.  Does a `JSON.parse()` and converts the `.created`, `.lastAccessed` and `.expires` properties into `Date` objects.
+
+Properties
+==========
+
+  * _key_ - string - the name or key of the cookie (default "")
+  * _value_ - string - the value of the cookie (default "")
+  * _expires_ - `Date` - if set, the `Expires=` attribute of the cookie (defaults to the string `"Infinity"`). See `setExpires()`
+  * _maxAge_ - seconds - if set, the `Max-Age=` attribute _in seconds_ of the cookie.  May also be set to strings `"Infinity"` and `"-Infinity"` for non-expiry and immediate-expiry, respectively.  See `setMaxAge()`
+  * _domain_ - string - the `Domain=` attribute of the cookie
+  * _path_ - string - the `Path=` of the cookie
+  * _secure_ - boolean - the `Secure` cookie flag
+  * _httpOnly_ - boolean - the `HttpOnly` cookie flag
+  * _extensions_ - `Array` - any unrecognized cookie attributes as strings (even if equal-signs inside)
+
+After a cookie has been passed through `CookieJar.setCookie()` it will have the following additional attributes:
+
+  * _hostOnly_ - boolean - is this a host-only cookie (i.e. no Domain field was set, but was instead implied)
+  * _pathIsDefault_ - boolean - if true, there was no Path field on the cookie and `defaultPath()` was used to derive one.
+  * _created_ - `Date` - when this cookie was added to the jar
+  * _lastAccessed_ - `Date` - last time the cookie got accessed. Will affect cookie cleaning once implemented.  Using `cookiejar.getCookies(...)` will update this attribute.
+
+Construction([{options}])
+------------
+
+Receives an options object that can contain any Cookie properties, uses the default for unspecified properties.
+
+.toString()
+-----------
+
+encode to a Set-Cookie header value.  The Expires cookie field is set using `formatDate()`, but is omitted entirely if `.expires` is `Infinity`.
+
+.cookieString()
+---------------
+
+encode to a Cookie header value (i.e. the `.key` and `.value` properties joined with '=').
+
+.setExpires(String)
+-------------------
+
+sets the expiry based on a date-string passed through `parseDate()`.  If parseDate returns `null` (i.e. can't parse this date string), `.expires` is set to `"Infinity"` (a string) is set.
+
+.setMaxAge(number)
+-------------------
+
+sets the maxAge in seconds.  Coerces `-Infinity` to `"-Infinity"` and `Infinity` to `"Infinity"` so it JSON serializes correctly.
+
+.expiryTime([now=Date.now()])
+-----------------------------
+
+.expiryDate([now=Date.now()])
+-----------------------------
+
+expiryTime() Computes the absolute unix-epoch milliseconds that this cookie expires. expiryDate() works similarly, except it returns a `Date` object.  Note that in both cases the `now` parameter should be milliseconds.
+
+Max-Age takes precedence over Expires (as per the RFC). The `.created` attribute -- or, by default, the `now` paramter -- is used to offset the `.maxAge` attribute.
+
+If Expires (`.expires`) is set, that's returned.
+
+Otherwise, `expiryTime()` returns `Infinity` and `expiryDate()` returns a `Date` object for "Tue, 19 Jan 2038 03:14:07 GMT" (latest date that can be expressed by a 32-bit `time_t`; the common limit for most user-agents).
+
+.TTL([now=Date.now()])
+---------
+
+compute the TTL relative to `now` (milliseconds).  The same precedence rules as for `expiryTime`/`expiryDate` apply.
+
+The "number" `Infinity` is returned for cookies without an explicit expiry and `0` is returned if the cookie is expired.  Otherwise a time-to-live in milliseconds is returned.
+
+.canonicalizedDoman()
+---------------------
+
+.cdomain()
+----------
+
+return the canonicalized `.domain` field.  This is lower-cased and punycode (RFC3490) encoded if the domain has any non-ASCII characters.
+
+.validate()
+-----------
+
+Status: *IN PROGRESS*. Works for a few things, but is by no means comprehensive.
+
+validates cookie attributes for semantic correctness.  Useful for "lint" checking any Set-Cookie headers you generate.  For now, it returns a boolean, but eventually could return a reason string -- you can future-proof with this construct:
+
+``` javascript
+if (cookie.validate() === true) {
+  // it's tasty
+} else {
+  // yuck!
+}
+```
+
+CookieJar
+=========
+
+Construction([store = new MemoryCookieStore()][, rejectPublicSuffixes])
+------------
+
+Simply use `new CookieJar()`.  If you'd like to use a custom store, pass that to the constructor otherwise a `MemoryCookieStore` will be created and used.
+
+
+Attributes
+----------
+
+  * _rejectPublicSuffixes_ - boolean - reject cookies with domains like "com" and "co.uk" (default: `true`)
+
+Since eventually this module would like to support database/remote/etc. CookieJars, continuation passing style is used for CookieJar methods.
+
+.setCookie(cookieOrString, currentUrl, [{options},] cb(err,cookie))
+-------------------------------------------------------------------
+
+Attempt to set the cookie in the cookie jar.  If the operation fails, an error will be given to the callback `cb`, otherwise the cookie is passed through.  The cookie will have updated `.created`, `.lastAccessed` and `.hostOnly` properties.
+
+The `options` object can be omitted and can have the following properties:
+
+  * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API.  Affects HttpOnly cookies.
+  * _secure_ - boolean - autodetect from url - indicates if this is a "Secure" API.  If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`.
+  * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies
+  * _strict_ - boolean - default `false` - perform extra checks
+  * _ignoreError_ - boolean - default `false` - silently ignore things like parse errors and invalid domains.  CookieStore errors aren't ignored by this option.
+
+As per the RFC, the `.hostOnly` property is set if there was no "Domain=" parameter in the cookie string (or `.domain` was null on the Cookie object).  The `.domain` property is set to the fully-qualified hostname of `currentUrl` in this case.  Matching this cookie requires an exact hostname match (not a `domainMatch` as per usual).
+
+.setCookieSync(cookieOrString, currentUrl, [{options}])
+-------------------------------------------------------
+
+Synchronous version of `setCookie`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).
+
+.storeCookie(cookie, [{options},] cb(err,cookie))
+-------------------------------------------------
+
+__REMOVED__ removed in lieu of the CookieStore API below
+
+.getCookies(currentUrl, [{options},] cb(err,cookies))
+-----------------------------------------------------
+
+Retrieve the list of cookies that can be sent in a Cookie header for the current url.
+
+If an error is encountered, that's passed as `err` to the callback, otherwise an `Array` of `Cookie` objects is passed.  The array is sorted with `cookieCompare()` unless the `{sort:false}` option is given.
+
+The `options` object can be omitted and can have the following properties:
+
+  * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API.  Affects HttpOnly cookies.
+  * _secure_ - boolean - autodetect from url - indicates if this is a "Secure" API.  If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`.
+  * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies
+  * _expire_ - boolean - default `true` - perform expiry-time checking of cookies and asynchronously remove expired cookies from the store.  Using `false` will return expired cookies and **not** remove them from the store (which is useful for replaying Set-Cookie headers, potentially).
+  * _allPaths_ - boolean - default `false` - if `true`, do not scope cookies by path. The default uses RFC-compliant path scoping. **Note**: may not be supported by the CookieStore `fetchCookies` function (the default MemoryCookieStore supports it).
+
+The `.lastAccessed` property of the returned cookies will have been updated.
+
+.getCookiesSync(currentUrl, [{options}])
+----------------------------------------
+
+Synchronous version of `getCookies`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).
+
+.getCookieString(...)
+---------------------
+
+Accepts the same options as `.getCookies()` but passes a string suitable for a Cookie header rather than an array to the callback.  Simply maps the `Cookie` array via `.cookieString()`.
+
+.getCookieStringSync(...)
+-------------------------
+
+Synchronous version of `getCookieString`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).
+
+.getSetCookieStrings(...)
+-------------------------
+
+Returns an array of strings suitable for **Set-Cookie** headers. Accepts the same options as `.getCookies()`.  Simply maps the cookie array via `.toString()`.
+
+.getSetCookieStringsSync(...)
+-----------------------------
+
+Synchronous version of `getSetCookieStrings`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).
+
+Store
+=====
+
+Base class for CookieJar stores.
+
+# CookieStore API
+
+The storage model for each `CookieJar` instance can be replaced with a custom implementation.  The default is `MemoryCookieStore` which can be found in the `lib/memstore.js` file.  The API uses continuation-passing-style to allow for asynchronous stores.
+
+Stores should inherit from the base `Store` class, which is available as `require('tough-cookie').Store`.  Stores are asynchronous by default, but if `store.synchronous` is set, then the `*Sync` methods on the CookieJar can be used.
+
+All `domain` parameters will have been normalized before calling.
+
+The Cookie store must have all of the following methods.
+
+store.findCookie(domain, path, key, cb(err,cookie))
+---------------------------------------------------
+
+Retrieve a cookie with the given domain, path and key (a.k.a. name).  The RFC maintains that exactly one of these cookies should exist in a store.  If the store is using versioning, this means that the latest/newest such cookie should be returned.
+
+Callback takes an error and the resulting `Cookie` object.  If no cookie is found then `null` MUST be passed instead (i.e. not an error).
+
+store.findCookies(domain, path, cb(err,cookies))
+------------------------------------------------
+
+Locates cookies matching the given domain and path.  This is most often called in the context of `cookiejar.getCookies()` above.
+
+If no cookies are found, the callback MUST be passed an empty array.
+
+The resulting list will be checked for applicability to the current request according to the RFC (domain-match, path-match, http-only-flag, secure-flag, expiry, etc.), so it's OK to use an optimistic search algorithm when implementing this method.  However, the search algorithm used SHOULD try to find cookies that `domainMatch()` the domain and `pathMatch()` the path in order to limit the amount of checking that needs to be done.
+
+As of version 0.9.12, the `allPaths` option to `cookiejar.getCookies()` above will cause the path here to be `null`.  If the path is `null`, path-matching MUST NOT be performed (i.e. domain-matching only).
+
+store.putCookie(cookie, cb(err))
+--------------------------------
+
+Adds a new cookie to the store.  The implementation SHOULD replace any existing cookie with the same `.domain`, `.path`, and `.key` properties -- depending on the nature of the implementation, it's possible that between the call to `fetchCookie` and `putCookie` that a duplicate `putCookie` can occur.
+
+The `cookie` object MUST NOT be modified; the caller will have already updated the `.creation` and `.lastAccessed` properties.
+
+Pass an error if the cookie cannot be stored.
+
+store.updateCookie(oldCookie, newCookie, cb(err))
+-------------------------------------------------
+
+Update an existing cookie.  The implementation MUST update the `.value` for a cookie with the same `domain`, `.path` and `.key`.  The implementation SHOULD check that the old value in the store is equivalent to `oldCookie` - how the conflict is resolved is up to the store.
+
+The `.lastAccessed` property will always be different between the two objects and `.created` will always be the same.  Stores MAY ignore or defer the `.lastAccessed` change at the cost of affecting how cookies are sorted (or selected for deletion).
+
+Stores may wish to optimize changing the `.value` of the cookie in the store versus storing a new cookie.  If the implementation doesn't define this method a stub that calls `putCookie(newCookie,cb)` will be added to the store object.
+
+The `newCookie` and `oldCookie` objects MUST NOT be modified.
+
+Pass an error if the newCookie cannot be stored.
+
+store.removeCookie(domain, path, key, cb(err))
+----------------------------------------------
+
+Remove a cookie from the store (see notes on `findCookie` about the uniqueness constraint).
+
+The implementation MUST NOT pass an error if the cookie doesn't exist; only pass an error due to the failure to remove an existing cookie.
+
+store.removeCookies(domain, path, cb(err))
+------------------------------------------
+
+Removes matching cookies from the store.  The `path` paramter is optional, and if missing means all paths in a domain should be removed.
+
+Pass an error ONLY if removing any existing cookies failed.
+
+# TODO
+
+  * _full_ RFC5890/RFC5891 canonicalization for domains in `cdomain()`
+    * the optional `punycode` requirement implements RFC3492, but RFC6265 requires RFC5891
+  * better tests for `validate()`?
+
+# Copyright and License
+
+(tl;dr: MIT with some MPL/1.1)
+
+Copyright 2012- GoInstant, Inc. and other contributors. All rights reserved.
+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.
+
+Portions may be licensed under different licenses (in particular public-suffix.txt is MPL/1.1); please read the LICENSE file for full details.
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js	(revision 516)
@@ -0,0 +1,239 @@
+/*
+ * Copyright GoInstant, Inc. and other contributors. All rights reserved.
+ * 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.
+ */
+'use strict';
+var fs = require('fs');
+var assert = require('assert');
+var punycode = require('punycode');
+
+fs.readFile('./public-suffix.txt', 'utf8', function(err,string) {
+  if (err) {
+    throw err;
+  }
+  var lines = string.split("\n");
+  process.nextTick(function() {
+    processList(lines);
+  });
+});
+
+var index = {};
+
+var COMMENT = new RegExp('//.+');
+function processList(lines) {
+  while (lines.length) {
+    var line = lines.shift();
+    line = line.replace(COMMENT,'').trim();
+    if (!line) {
+      continue;
+    }
+    addToIndex(index,line);
+  }
+
+  pubSufTest();
+
+  var w = fs.createWriteStream('./lib/pubsuffix.js',{
+    flags: 'w',
+    encoding: 'utf8',
+    mode: parseInt('644',8)
+  });
+  w.on('end', process.exit);
+  w.write("/****************************************************\n");
+  w.write(" * AUTOMATICALLY GENERATED by generate-pubsuffix.js *\n");
+  w.write(" *                  DO NOT EDIT!                    *\n");
+  w.write(" ****************************************************/\n\n");
+
+  w.write("module.exports.getPublicSuffix = ");
+  w.write(getPublicSuffix.toString());
+  w.write(";\n\n");
+
+  w.write("// The following generated structure is used under the MPL version 1.1\n");
+  w.write("// See public-suffix.txt for more information\n\n");
+  w.write("var index = module.exports.index = Object.freeze(\n");
+  w.write(JSON.stringify(index));
+  w.write(");\n\n");
+  w.write("// END of automatically generated file\n");
+
+  w.end();
+}
+
+function addToIndex(index,line) {
+  var prefix = '';
+  if (line.replace(/^(!|\*\.)/)) {
+    prefix = RegExp.$1;
+    line = line.slice(prefix.length);
+  }
+  line = prefix + punycode.toASCII(line);
+
+  if (line.substr(0,1) == '!') {
+    index[line.substr(1)] = false;
+  } else {
+    index[line] = true;
+  }
+}
+
+// include the licence in the function since it gets written to pubsuffix.js
+function getPublicSuffix(domain) {
+  /*
+   * Copyright GoInstant, Inc. and other contributors. All rights reserved.
+   * Permission is hereby granted, free of charge, to any person obtaining a copy
+   * of this software and associated documentation files (the "Software"), to
+   * deal in the Software without restriction, including without limitation the
+   * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+   * sell copies of the Software, and to permit persons to whom the Software is
+   * furnished to do so, subject to the following conditions:
+   *
+   * The above copyright notice and this permission notice shall be included in
+   * all copies or substantial portions of the Software.
+   *
+   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+   * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+   * IN THE SOFTWARE.
+   */
+  if (!domain) {
+    return null;
+  }
+  if (domain.match(/^\./)) {
+    return null;
+  }
+
+  domain = domain.toLowerCase();
+  var parts = domain.split('.').reverse();
+
+  var suffix = '';
+  var suffixLen = 0;
+  for (var i=0; i<parts.length; i++) {
+    var part = parts[i];
+    var starstr = '*'+suffix;
+    var partstr = part+suffix;
+
+    if (index[starstr]) { // star rule matches
+      suffixLen = i+1;
+      if (index[partstr] === false) { // exception rule matches (NB: false, not undefined)
+        suffixLen--;
+      }
+    } else if (index[partstr]) { // exact match, not exception
+      suffixLen = i+1;
+    }
+
+    suffix = '.'+part+suffix;
+  }
+
+  if (index['*'+suffix]) { // *.domain exists (e.g. *.kyoto.jp for domain='kyoto.jp');
+    return null;
+  }
+
+  if (suffixLen && parts.length > suffixLen) {
+    return parts.slice(0,suffixLen+1).reverse().join('.');
+  }
+
+  return null;
+}
+
+function checkPublicSuffix(give,get) {
+  var got = getPublicSuffix(give);
+  assert.equal(got, get, give+' should be '+(get==null?'NULL':get)+' but got '+got);
+}
+
+// pubSufTest() was converted to JavaScript from http://publicsuffix.org/list/test.txt
+function pubSufTest() {
+  // For this function-scope and this function-scope ONLY:
+  // Any copyright is dedicated to the Public Domain.
+  // http://creativecommons.org/publicdomain/zero/1.0/
+
+  // NULL input.
+  checkPublicSuffix(null, null);
+  // Mixed case.
+  checkPublicSuffix('COM', null);
+  checkPublicSuffix('example.COM', 'example.com');
+  checkPublicSuffix('WwW.example.COM', 'example.com');
+  // Leading dot.
+  checkPublicSuffix('.com', null);
+  checkPublicSuffix('.example', null);
+  checkPublicSuffix('.example.com', null);
+  checkPublicSuffix('.example.example', null);
+  // Unlisted TLD.
+  checkPublicSuffix('example', null);
+  checkPublicSuffix('example.example', null);
+  checkPublicSuffix('b.example.example', null);
+  checkPublicSuffix('a.b.example.example', null);
+  // Listed, but non-Internet, TLD.
+  checkPublicSuffix('local', null);
+  checkPublicSuffix('example.local', null);
+  checkPublicSuffix('b.example.local', null);
+  checkPublicSuffix('a.b.example.local', null);
+  // TLD with only 1 rule.
+  checkPublicSuffix('biz', null);
+  checkPublicSuffix('domain.biz', 'domain.biz');
+  checkPublicSuffix('b.domain.biz', 'domain.biz');
+  checkPublicSuffix('a.b.domain.biz', 'domain.biz');
+  // TLD with some 2-level rules.
+  checkPublicSuffix('com', null);
+  checkPublicSuffix('example.com', 'example.com');
+  checkPublicSuffix('b.example.com', 'example.com');
+  checkPublicSuffix('a.b.example.com', 'example.com');
+  checkPublicSuffix('uk.com', null);
+  checkPublicSuffix('example.uk.com', 'example.uk.com');
+  checkPublicSuffix('b.example.uk.com', 'example.uk.com');
+  checkPublicSuffix('a.b.example.uk.com', 'example.uk.com');
+  checkPublicSuffix('test.ac', 'test.ac');
+  // TLD with only 1 (wildcard) rule.
+  checkPublicSuffix('cy', null);
+  checkPublicSuffix('c.cy', null);
+  checkPublicSuffix('b.c.cy', 'b.c.cy');
+  checkPublicSuffix('a.b.c.cy', 'b.c.cy');
+  // More complex TLD.
+  checkPublicSuffix('jp', null);
+  checkPublicSuffix('test.jp', 'test.jp');
+  checkPublicSuffix('www.test.jp', 'test.jp');
+  checkPublicSuffix('ac.jp', null);
+  checkPublicSuffix('test.ac.jp', 'test.ac.jp');
+  checkPublicSuffix('www.test.ac.jp', 'test.ac.jp');
+  checkPublicSuffix('kyoto.jp', null);
+  checkPublicSuffix('c.kyoto.jp', null);
+  checkPublicSuffix('b.c.kyoto.jp', 'b.c.kyoto.jp');
+  checkPublicSuffix('a.b.c.kyoto.jp', 'b.c.kyoto.jp');
+  checkPublicSuffix('pref.kyoto.jp', 'pref.kyoto.jp');  // Exception rule.
+  checkPublicSuffix('www.pref.kyoto.jp', 'pref.kyoto.jp');  // Exception rule.
+  checkPublicSuffix('city.kyoto.jp', 'city.kyoto.jp');  // Exception rule.
+  checkPublicSuffix('www.city.kyoto.jp', 'city.kyoto.jp');  // Exception rule.
+  // TLD with a wildcard rule and exceptions.
+  checkPublicSuffix('om', null);
+  checkPublicSuffix('test.om', null);
+  checkPublicSuffix('b.test.om', 'b.test.om');
+  checkPublicSuffix('a.b.test.om', 'b.test.om');
+  checkPublicSuffix('songfest.om', 'songfest.om');
+  checkPublicSuffix('www.songfest.om', 'songfest.om');
+  // US K12.
+  checkPublicSuffix('us', null);
+  checkPublicSuffix('test.us', 'test.us');
+  checkPublicSuffix('www.test.us', 'test.us');
+  checkPublicSuffix('ak.us', null);
+  checkPublicSuffix('test.ak.us', 'test.ak.us');
+  checkPublicSuffix('www.test.ak.us', 'test.ak.us');
+  checkPublicSuffix('k12.ak.us', null);
+  checkPublicSuffix('test.k12.ak.us', 'test.k12.ak.us');
+  checkPublicSuffix('www.test.k12.ak.us', 'test.k12.ak.us');
+
+
+}
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/cookie.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/cookie.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/cookie.js	(revision 516)
@@ -0,0 +1,1107 @@
+/*
+ * Copyright GoInstant, Inc. and other contributors. All rights reserved.
+ * 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.
+ */
+
+'use strict';
+var net = require('net');
+var urlParse = require('url').parse;
+var pubsuffix = require('./pubsuffix');
+var Store = require('./store').Store;
+
+var punycode;
+try {
+  punycode = require('punycode');
+} catch(e) {
+  console.warn("cookie: can't load punycode; won't use punycode for domain normalization");
+}
+
+var DATE_DELIM = /[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]/;
+
+// From RFC2616 S2.2:
+var TOKEN = /[\x21\x23-\x26\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7A\x7C\x7E]/;
+
+// From RFC6265 S4.1.1
+// note that it excludes \x3B ";"
+var COOKIE_OCTET  = /[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]/;
+var COOKIE_OCTETS = new RegExp('^'+COOKIE_OCTET.source+'$');
+
+// The name/key cannot be empty but the value can (S5.2):
+var COOKIE_PAIR_STRICT = new RegExp('^('+TOKEN.source+'+)=("?)('+COOKIE_OCTET.source+'*)\\2$');
+var COOKIE_PAIR = /^([^=\s]+)\s*=\s*("?)\s*(.*)\s*\2\s*$/;
+
+// RFC6265 S4.1.1 defines extension-av as 'any CHAR except CTLs or ";"'
+// Note ';' is \x3B
+var NON_CTL_SEMICOLON = /[\x20-\x3A\x3C-\x7E]+/;
+var EXTENSION_AV = NON_CTL_SEMICOLON;
+var PATH_VALUE = NON_CTL_SEMICOLON;
+
+// Used for checking whether or not there is a trailing semi-colon
+var TRAILING_SEMICOLON = /;+$/;
+
+/* RFC6265 S5.1.1.5:
+ * [fail if] the day-of-month-value is less than 1 or greater than 31
+ */
+var DAY_OF_MONTH = /^(0?[1-9]|[12][0-9]|3[01])$/;
+
+/* RFC6265 S5.1.1.5:
+ * [fail if]
+ * *  the hour-value is greater than 23,
+ * *  the minute-value is greater than 59, or
+ * *  the second-value is greater than 59.
+ */
+var TIME = /(0?[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])/;
+var STRICT_TIME = /^(0?[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/;
+
+var MONTH = /^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)$/i;
+var MONTH_TO_NUM = {
+  jan:0, feb:1, mar:2, apr:3, may:4, jun:5,
+  jul:6, aug:7, sep:8, oct:9, nov:10, dec:11
+};
+var NUM_TO_MONTH = [
+  'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'
+];
+var NUM_TO_DAY = [
+  'Sun','Mon','Tue','Wed','Thu','Fri','Sat'
+];
+
+var YEAR = /^([1-9][0-9]{1,3})$/; // 2 to 4 digits
+
+var MAX_TIME = 2147483647000; // 31-bit max
+var MIN_TIME = 0; // 31-bit min
+
+
+// RFC6265 S5.1.1 date parser:
+function parseDate(str,strict) {
+  if (!str) {
+    return;
+  }
+  var found_time, found_dom, found_month, found_year;
+
+  /* RFC6265 S5.1.1:
+   * 2. Process each date-token sequentially in the order the date-tokens
+   * appear in the cookie-date
+   */
+  var tokens = str.split(DATE_DELIM);
+  if (!tokens) {
+    return;
+  }
+
+  var date = new Date();
+  date.setMilliseconds(0);
+
+  for (var i=0; i<tokens.length; i++) {
+    var token = tokens[i].trim();
+    if (!token.length) {
+      continue;
+    }
+
+    var result;
+
+    /* 2.1. If the found-time flag is not set and the token matches the time
+     * production, set the found-time flag and set the hour- value,
+     * minute-value, and second-value to the numbers denoted by the digits in
+     * the date-token, respectively.  Skip the remaining sub-steps and continue
+     * to the next date-token.
+     */
+    if (!found_time) {
+      result = (strict ? STRICT_TIME : TIME).exec(token);
+      if (result) {
+        found_time = true;
+        date.setUTCHours(result[1]);
+        date.setUTCMinutes(result[2]);
+        date.setUTCSeconds(result[3]);
+        continue;
+      }
+    }
+
+    /* 2.2. If the found-day-of-month flag is not set and the date-token matches
+     * the day-of-month production, set the found-day-of- month flag and set
+     * the day-of-month-value to the number denoted by the date-token.  Skip
+     * the remaining sub-steps and continue to the next date-token.
+     */
+    if (!found_dom) {
+      result = DAY_OF_MONTH.exec(token);
+      if (result) {
+        found_dom = true;
+        date.setUTCDate(result[1]);
+        continue;
+      }
+    }
+
+    /* 2.3. If the found-month flag is not set and the date-token matches the
+     * month production, set the found-month flag and set the month-value to
+     * the month denoted by the date-token.  Skip the remaining sub-steps and
+     * continue to the next date-token.
+     */
+    if (!found_month) {
+      result = MONTH.exec(token);
+      if (result) {
+        found_month = true;
+        date.setUTCMonth(MONTH_TO_NUM[result[1].toLowerCase()]);
+        continue;
+      }
+    }
+
+    /* 2.4. If the found-year flag is not set and the date-token matches the year
+     * production, set the found-year flag and set the year-value to the number
+     * denoted by the date-token.  Skip the remaining sub-steps and continue to
+     * the next date-token.
+     */
+    if (!found_year) {
+      result = YEAR.exec(token);
+      if (result) {
+        var year = result[0];
+        /* From S5.1.1:
+         * 3.  If the year-value is greater than or equal to 70 and less
+         * than or equal to 99, increment the year-value by 1900.
+         * 4.  If the year-value is greater than or equal to 0 and less
+         * than or equal to 69, increment the year-value by 2000.
+         */
+        if (70 <= year && year <= 99) {
+          year += 1900;
+        } else if (0 <= year && year <= 69) {
+          year += 2000;
+        }
+
+        if (year < 1601) {
+          return; // 5. ... the year-value is less than 1601
+        }
+
+        found_year = true;
+        date.setUTCFullYear(year);
+        continue;
+      }
+    }
+  }
+
+  if (!(found_time && found_dom && found_month && found_year)) {
+    return; // 5. ... at least one of the found-day-of-month, found-month, found-
+            // year, or found-time flags is not set,
+  }
+
+  return date;
+}
+
+function formatDate(date) {
+  var d = date.getUTCDate(); d = d >= 10 ? d : '0'+d;
+  var h = date.getUTCHours(); h = h >= 10 ? h : '0'+h;
+  var m = date.getUTCMinutes(); m = m >= 10 ? m : '0'+m;
+  var s = date.getUTCSeconds(); s = s >= 10 ? s : '0'+s;
+  return NUM_TO_DAY[date.getUTCDay()] + ', ' +
+    d+' '+ NUM_TO_MONTH[date.getUTCMonth()] +' '+ date.getUTCFullYear() +' '+
+    h+':'+m+':'+s+' GMT';
+}
+
+// S5.1.2 Canonicalized Host Names
+function canonicalDomain(str) {
+  if (str == null) {
+    return null;
+  }
+  str = str.trim().replace(/^\./,''); // S4.1.2.3 & S5.2.3: ignore leading .
+
+  // convert to IDN if any non-ASCII characters
+  if (punycode && /[^\u0001-\u007f]/.test(str)) {
+    str = punycode.toASCII(str);
+  }
+
+  return str.toLowerCase();
+}
+
+// S5.1.3 Domain Matching
+function domainMatch(str, domStr, canonicalize) {
+  if (str == null || domStr == null) {
+    return null;
+  }
+  if (canonicalize !== false) {
+    str = canonicalDomain(str);
+    domStr = canonicalDomain(domStr);
+  }
+
+  /*
+   * "The domain string and the string are identical. (Note that both the
+   * domain string and the string will have been canonicalized to lower case at
+   * this point)"
+   */
+  if (str == domStr) {
+    return true;
+  }
+
+  /* "All of the following [three] conditions hold:" (order adjusted from the RFC) */
+
+  /* "* The string is a host name (i.e., not an IP address)." */
+  if (net.isIP(str)) {
+    return false;
+  }
+
+  /* "* The domain string is a suffix of the string" */
+  var idx = str.indexOf(domStr);
+  if (idx <= 0) {
+    return false; // it's a non-match (-1) or prefix (0)
+  }
+
+  // e.g "a.b.c".indexOf("b.c") === 2
+  // 5 === 3+2
+  if (str.length !== domStr.length + idx) { // it's not a suffix
+    return false;
+  }
+
+  /* "* The last character of the string that is not included in the domain
+  * string is a %x2E (".") character." */
+  if (str.substr(idx-1,1) !== '.') {
+    return false;
+  }
+
+  return true;
+}
+
+
+// RFC6265 S5.1.4 Paths and Path-Match
+
+/*
+ * "The user agent MUST use an algorithm equivalent to the following algorithm
+ * to compute the default-path of a cookie:"
+ *
+ * Assumption: the path (and not query part or absolute uri) is passed in.
+ */
+function defaultPath(path) {
+  // "2. If the uri-path is empty or if the first character of the uri-path is not
+  // a %x2F ("/") character, output %x2F ("/") and skip the remaining steps.
+  if (!path || path.substr(0,1) !== "/") {
+    return "/";
+  }
+
+  // "3. If the uri-path contains no more than one %x2F ("/") character, output
+  // %x2F ("/") and skip the remaining step."
+  if (path === "/") {
+    return path;
+  }
+
+  var rightSlash = path.lastIndexOf("/");
+  if (rightSlash === 0) {
+    return "/";
+  }
+
+  // "4. Output the characters of the uri-path from the first character up to,
+  // but not including, the right-most %x2F ("/")."
+  return path.slice(0, rightSlash);
+}
+
+/*
+ * "A request-path path-matches a given cookie-path if at least one of the
+ * following conditions holds:"
+ */
+function pathMatch(reqPath,cookiePath) {
+  // "o  The cookie-path and the request-path are identical."
+  if (cookiePath === reqPath) {
+    return true;
+  }
+
+  var idx = reqPath.indexOf(cookiePath);
+  if (idx === 0) {
+    // "o  The cookie-path is a prefix of the request-path, and the last
+    // character of the cookie-path is %x2F ("/")."
+    if (cookiePath.substr(-1) === "/") {
+      return true;
+    }
+
+    // " o  The cookie-path is a prefix of the request-path, and the first
+    // character of the request-path that is not included in the cookie- path
+    // is a %x2F ("/") character."
+    if (reqPath.substr(cookiePath.length,1) === "/") {
+      return true;
+    }
+  }
+
+  return false;
+}
+
+function parse(str, strict) {
+  str = str.trim();
+
+  // S4.1.1 Trailing semi-colons are not part of the specification.
+  // If we are not in strict mode we remove the trailing semi-colons.
+  var semiColonCheck = TRAILING_SEMICOLON.exec(str);
+  if (semiColonCheck) {
+    if (strict) {
+      return;
+    }
+    str = str.slice(0, semiColonCheck.index);
+  }
+
+  // We use a regex to parse the "name-value-pair" part of S5.2
+  var firstSemi = str.indexOf(';'); // S5.2 step 1
+  var pairRx = strict ? COOKIE_PAIR_STRICT : COOKIE_PAIR;
+  var result = pairRx.exec(firstSemi === -1 ? str : str.substr(0,firstSemi));
+
+  // Rx satisfies the "the name string is empty" and "lacks a %x3D ("=")"
+  // constraints as well as trimming any whitespace.
+  if (!result) {
+    return;
+  }
+
+  var c = new Cookie();
+  c.key = result[1]; // the regexp should trim() already
+  c.value = result[3]; // [2] is quotes or empty-string
+
+  if (firstSemi === -1) {
+    return c;
+  }
+
+  // S5.2.3 "unparsed-attributes consist of the remainder of the set-cookie-string
+  // (including the %x3B (";") in question)." plus later on in the same section
+  // "discard the first ";" and trim".
+  var unparsed = str.slice(firstSemi).replace(/^\s*;\s*/,'').trim();
+
+  // "If the unparsed-attributes string is empty, skip the rest of these
+  // steps."
+  if (unparsed.length === 0) {
+    return c;
+  }
+
+  /*
+   * S5.2 says that when looping over the items "[p]rocess the attribute-name
+   * and attribute-value according to the requirements in the following
+   * subsections" for every item.  Plus, for many of the individual attributes
+   * in S5.3 it says to use the "attribute-value of the last attribute in the
+   * cookie-attribute-list".  Therefore, in this implementation, we overwrite
+   * the previous value.
+   */
+  var cookie_avs = unparsed.split(/\s*;\s*/);
+  while (cookie_avs.length) {
+    var av = cookie_avs.shift();
+
+    if (strict && !EXTENSION_AV.test(av)) {
+      return;
+    }
+
+    var av_sep = av.indexOf('=');
+    var av_key, av_value;
+    if (av_sep === -1) {
+      av_key = av;
+      av_value = null;
+    } else {
+      av_key = av.substr(0,av_sep);
+      av_value = av.substr(av_sep+1);
+    }
+
+    av_key = av_key.trim().toLowerCase();
+    if (av_value) {
+      av_value = av_value.trim();
+    }
+
+    switch(av_key) {
+    case 'expires': // S5.2.1
+      if (!av_value) {if(strict){return;}else{break;} }
+      var exp = parseDate(av_value,strict);
+      // "If the attribute-value failed to parse as a cookie date, ignore the
+      // cookie-av."
+      if (exp == null) { if(strict){return;}else{break;} }
+      c.expires = exp;
+      // over and underflow not realistically a concern: V8's getTime() seems to
+      // store something larger than a 32-bit time_t (even with 32-bit node)
+      break;
+
+    case 'max-age': // S5.2.2
+      if (!av_value) { if(strict){return;}else{break;} }
+      // "If the first character of the attribute-value is not a DIGIT or a "-"
+      // character ...[or]... If the remainder of attribute-value contains a
+      // non-DIGIT character, ignore the cookie-av."
+      if (!/^-?[0-9]+$/.test(av_value)) { if(strict){return;}else{break;} }
+      var delta = parseInt(av_value,10);
+      if (strict && delta <= 0) {
+        return; // S4.1.1
+      }
+      // "If delta-seconds is less than or equal to zero (0), let expiry-time
+      // be the earliest representable date and time."
+      c.setMaxAge(delta);
+      break;
+
+    case 'domain': // S5.2.3
+      // "If the attribute-value is empty, the behavior is undefined.  However,
+      // the user agent SHOULD ignore the cookie-av entirely."
+      if (!av_value) { if(strict){return;}else{break;} }
+      // S5.2.3 "Let cookie-domain be the attribute-value without the leading %x2E
+      // (".") character."
+      var domain = av_value.trim().replace(/^\./,'');
+      if (!domain) { if(strict){return;}else{break;} } // see "is empty" above
+      // "Convert the cookie-domain to lower case."
+      c.domain = domain.toLowerCase();
+      break;
+
+    case 'path': // S5.2.4
+      /*
+       * "If the attribute-value is empty or if the first character of the
+       * attribute-value is not %x2F ("/"):
+       *   Let cookie-path be the default-path.
+       * Otherwise:
+       *   Let cookie-path be the attribute-value."
+       *
+       * We'll represent the default-path as null since it depends on the
+       * context of the parsing.
+       */
+      if (!av_value || av_value.substr(0,1) != "/") {
+        if(strict){return;}else{break;}
+      }
+      c.path = av_value;
+      break;
+
+    case 'secure': // S5.2.5
+      /*
+       * "If the attribute-name case-insensitively matches the string "Secure",
+       * the user agent MUST append an attribute to the cookie-attribute-list
+       * with an attribute-name of Secure and an empty attribute-value."
+       */
+      if (av_value != null) { if(strict){return;} }
+      c.secure = true;
+      break;
+
+    case 'httponly': // S5.2.6 -- effectively the same as 'secure'
+      if (av_value != null) { if(strict){return;} }
+      c.httpOnly = true;
+      break;
+
+    default:
+      c.extensions = c.extensions || [];
+      c.extensions.push(av);
+      break;
+    }
+  }
+
+  // ensure a default date for sorting:
+  c.creation = new Date();
+  return c;
+}
+
+function fromJSON(str) {
+  if (!str) {
+    return null;
+  }
+
+  var obj;
+  try {
+    obj = JSON.parse(str);
+  } catch (e) {
+    return null;
+  }
+
+  var c = new Cookie();
+  for (var i=0; i<numCookieProperties; i++) {
+    var prop = cookieProperties[i];
+    if (obj[prop] == null) {
+      continue;
+    }
+    if (prop === 'expires' ||
+        prop === 'creation' ||
+        prop === 'lastAccessed')
+    {
+      c[prop] = obj[prop] == "Infinity" ? "Infinity" : new Date(obj[prop]);
+    } else {
+      c[prop] = obj[prop];
+    }
+  }
+
+
+  // ensure a default date for sorting:
+  c.creation = c.creation || new Date();
+
+  return c;
+}
+
+/* Section 5.4 part 2:
+ * "*  Cookies with longer paths are listed before cookies with
+ *     shorter paths.
+ *
+ *  *  Among cookies that have equal-length path fields, cookies with
+ *     earlier creation-times are listed before cookies with later
+ *     creation-times."
+ */
+
+function cookieCompare(a,b) {
+  // descending for length: b CMP a
+  var deltaLen = (b.path ? b.path.length : 0) - (a.path ? a.path.length : 0);
+  if (deltaLen !== 0) {
+    return deltaLen;
+  }
+  // ascending for time: a CMP b
+  return (a.creation ? a.creation.getTime() : MAX_TIME) -
+         (b.creation ? b.creation.getTime() : MAX_TIME);
+}
+
+// Gives the permutation of all possible domainMatch()es of a given domain. The
+// array is in shortest-to-longest order.  Handy for indexing.
+function permuteDomain(domain) {
+  var pubSuf = pubsuffix.getPublicSuffix(domain);
+  if (!pubSuf) {
+    return null;
+  }
+  if (pubSuf == domain) {
+    return [domain];
+  }
+
+  var prefix = domain.slice(0,-(pubSuf.length+1)); // ".example.com"
+  var parts = prefix.split('.').reverse();
+  var cur = pubSuf;
+  var permutations = [cur];
+  while (parts.length) {
+    cur = parts.shift()+'.'+cur;
+    permutations.push(cur);
+  }
+  return permutations;
+}
+
+// Gives the permutation of all possible pathMatch()es of a given path. The
+// array is in longest-to-shortest order.  Handy for indexing.
+function permutePath(path) {
+  if (path === '/') {
+    return ['/'];
+  }
+  if (path.lastIndexOf('/') === path.length-1) {
+    path = path.substr(0,path.length-1);
+  }
+  var permutations = [path];
+  while (path.length > 1) {
+    var lindex = path.lastIndexOf('/');
+    if (lindex === 0) {
+      break;
+    }
+    path = path.substr(0,lindex);
+    permutations.push(path);
+  }
+  permutations.push('/');
+  return permutations;
+}
+
+
+function Cookie (opts) {
+  if (typeof opts !== "object") {
+    return;
+  }
+  Object.keys(opts).forEach(function (key) {
+    if (Cookie.prototype.hasOwnProperty(key)) {
+      this[key] = opts[key] || Cookie.prototype[key];
+    }
+  }.bind(this));
+}
+
+Cookie.parse = parse;
+Cookie.fromJSON = fromJSON;
+
+Cookie.prototype.key = "";
+Cookie.prototype.value = "";
+
+// the order in which the RFC has them:
+Cookie.prototype.expires = "Infinity"; // coerces to literal Infinity
+Cookie.prototype.maxAge = null; // takes precedence over expires for TTL
+Cookie.prototype.domain = null;
+Cookie.prototype.path = null;
+Cookie.prototype.secure = false;
+Cookie.prototype.httpOnly = false;
+Cookie.prototype.extensions = null;
+
+// set by the CookieJar:
+Cookie.prototype.hostOnly = null; // boolean when set
+Cookie.prototype.pathIsDefault = null; // boolean when set
+Cookie.prototype.creation = null; // Date when set; defaulted by Cookie.parse
+Cookie.prototype.lastAccessed = null; // Date when set
+
+var cookieProperties = Object.freeze(Object.keys(Cookie.prototype).map(function(p) {
+  if (p instanceof Function) {
+    return;
+  }
+  return p;
+}));
+var numCookieProperties = cookieProperties.length;
+
+Cookie.prototype.inspect = function inspect() {
+  var now = Date.now();
+  return 'Cookie="'+this.toString() +
+    '; hostOnly='+(this.hostOnly != null ? this.hostOnly : '?') +
+    '; aAge='+(this.lastAccessed ? (now-this.lastAccessed.getTime())+'ms' : '?') +
+    '; cAge='+(this.creation ? (now-this.creation.getTime())+'ms' : '?') +
+    '"';
+};
+
+Cookie.prototype.validate = function validate() {
+  if (!COOKIE_OCTETS.test(this.value)) {
+    return false;
+  }
+  if (this.expires != Infinity && !(this.expires instanceof Date) && !parseDate(this.expires,true)) {
+    return false;
+  }
+  if (this.maxAge != null && this.maxAge <= 0) {
+    return false; // "Max-Age=" non-zero-digit *DIGIT
+  }
+  if (this.path != null && !PATH_VALUE.test(this.path)) {
+    return false;
+  }
+
+  var cdomain = this.cdomain();
+  if (cdomain) {
+    if (cdomain.match(/\.$/)) {
+      return false; // S4.1.2.3 suggests that this is bad. domainMatch() tests confirm this
+    }
+    var suffix = pubsuffix.getPublicSuffix(cdomain);
+    if (suffix == null) { // it's a public suffix
+      return false;
+    }
+  }
+  return true;
+};
+
+Cookie.prototype.setExpires = function setExpires(exp) {
+  if (exp instanceof Date) {
+    this.expires = exp;
+  } else {
+    this.expires = parseDate(exp) || "Infinity";
+  }
+};
+
+Cookie.prototype.setMaxAge = function setMaxAge(age) {
+  if (age === Infinity || age === -Infinity) {
+    this.maxAge = age.toString(); // so JSON.stringify() works
+  } else {
+    this.maxAge = age;
+  }
+};
+
+// gives Cookie header format
+Cookie.prototype.cookieString = function cookieString() {
+  var val = this.value;
+  if (val == null) {
+    val = '';
+  }
+  return this.key+'='+val;
+};
+
+// gives Set-Cookie header format
+Cookie.prototype.toString = function toString() {
+  var str = this.cookieString();
+
+  if (this.expires != Infinity) {
+    if (this.expires instanceof Date) {
+      str += '; Expires='+formatDate(this.expires);
+    } else {
+      str += '; Expires='+this.expires;
+    }
+  }
+
+  if (this.maxAge != null && this.maxAge != Infinity) {
+    str += '; Max-Age='+this.maxAge;
+  }
+
+  if (this.domain && !this.hostOnly) {
+    str += '; Domain='+this.domain;
+  }
+  if (this.path) {
+    str += '; Path='+this.path;
+  }
+
+  if (this.secure) {
+    str += '; Secure';
+  }
+  if (this.httpOnly) {
+    str += '; HttpOnly';
+  }
+  if (this.extensions) {
+    this.extensions.forEach(function(ext) {
+      str += '; '+ext;
+    });
+  }
+
+  return str;
+};
+
+// TTL() partially replaces the "expiry-time" parts of S5.3 step 3 (setCookie()
+// elsewhere)
+// S5.3 says to give the "latest representable date" for which we use Infinity
+// For "expired" we use 0
+Cookie.prototype.TTL = function TTL(now) {
+  /* RFC6265 S4.1.2.2 If a cookie has both the Max-Age and the Expires
+   * attribute, the Max-Age attribute has precedence and controls the
+   * expiration date of the cookie.
+   * (Concurs with S5.3 step 3)
+   */
+  if (this.maxAge != null) {
+    return this.maxAge<=0 ? 0 : this.maxAge*1000;
+  }
+
+  var expires = this.expires;
+  if (expires != Infinity) {
+    if (!(expires instanceof Date)) {
+      expires = parseDate(expires) || Infinity;
+    }
+
+    if (expires == Infinity) {
+      return Infinity;
+    }
+
+    return expires.getTime() - (now || Date.now());
+  }
+
+  return Infinity;
+};
+
+// expiryTime() replaces the "expiry-time" parts of S5.3 step 3 (setCookie()
+// elsewhere)
+Cookie.prototype.expiryTime = function expiryTime(now) {
+  if (this.maxAge != null) {
+    var relativeTo = this.creation || now || new Date();
+    var age = (this.maxAge <= 0) ? -Infinity : this.maxAge*1000;
+    return relativeTo.getTime() + age;
+  }
+
+  if (this.expires == Infinity) {
+    return Infinity;
+  }
+  return this.expires.getTime();
+};
+
+// expiryDate() replaces the "expiry-time" parts of S5.3 step 3 (setCookie()
+// elsewhere), except it returns a Date
+Cookie.prototype.expiryDate = function expiryDate(now) {
+  var millisec = this.expiryTime(now);
+  if (millisec == Infinity) {
+    return new Date(MAX_TIME);
+  } else if (millisec == -Infinity) {
+    return new Date(MIN_TIME);
+  } else {
+    return new Date(millisec);
+  }
+};
+
+// This replaces the "persistent-flag" parts of S5.3 step 3
+Cookie.prototype.isPersistent = function isPersistent() {
+  return (this.maxAge != null || this.expires != Infinity);
+};
+
+// Mostly S5.1.2 and S5.2.3:
+Cookie.prototype.cdomain =
+Cookie.prototype.canonicalizedDomain = function canonicalizedDomain() {
+  if (this.domain == null) {
+    return null;
+  }
+  return canonicalDomain(this.domain);
+};
+
+
+var memstore;
+function CookieJar(store, rejectPublicSuffixes) {
+  if (rejectPublicSuffixes != null) {
+    this.rejectPublicSuffixes = rejectPublicSuffixes;
+  }
+
+  if (!store) {
+    memstore = memstore || require('./memstore');
+    store = new memstore.MemoryCookieStore();
+  }
+  this.store = store;
+}
+CookieJar.prototype.store = null;
+CookieJar.prototype.rejectPublicSuffixes = true;
+var CAN_BE_SYNC = [];
+
+CAN_BE_SYNC.push('setCookie');
+CookieJar.prototype.setCookie = function(cookie, url, options, cb) {
+  var err;
+  var context = (url instanceof Object) ? url : urlParse(url);
+  if (options instanceof Function) {
+    cb = options;
+    options = {};
+  }
+
+  var host = canonicalDomain(context.hostname);
+
+  // S5.3 step 1
+  if (!(cookie instanceof Cookie)) {
+    cookie = Cookie.parse(cookie, options.strict === true);
+  }
+  if (!cookie) {
+    err = new Error("Cookie failed to parse");
+    return cb(options.ignoreError ? null : err);
+  }
+
+  // S5.3 step 2
+  var now = options.now || new Date(); // will assign later to save effort in the face of errors
+
+  // S5.3 step 3: NOOP; persistent-flag and expiry-time is handled by getCookie()
+
+  // S5.3 step 4: NOOP; domain is null by default
+
+  // S5.3 step 5: public suffixes
+  if (this.rejectPublicSuffixes && cookie.domain) {
+    var suffix = pubsuffix.getPublicSuffix(cookie.cdomain());
+    if (suffix == null) { // e.g. "com"
+      err = new Error("Cookie has domain set to a public suffix");
+      return cb(options.ignoreError ? null : err);
+    }
+  }
+
+  // S5.3 step 6:
+  if (cookie.domain) {
+    if (!domainMatch(host, cookie.cdomain(), false)) {
+      err = new Error("Cookie not in this host's domain. Cookie:"+cookie.cdomain()+" Request:"+host);
+      return cb(options.ignoreError ? null : err);
+    }
+
+    if (cookie.hostOnly == null) { // don't reset if already set
+      cookie.hostOnly = false;
+    }
+
+  } else {
+    cookie.hostOnly = true;
+    cookie.domain = host;
+  }
+
+  // S5.3 step 7: "Otherwise, set the cookie's path to the default-path of the
+  // request-uri"
+  if (!cookie.path) {
+    cookie.path = defaultPath(context.pathname);
+    cookie.pathIsDefault = true;
+  } else {
+    if (cookie.path.length > 1 && cookie.path.substr(-1) == '/') {
+      cookie.path = cookie.path.slice(0,-1);
+    }
+  }
+
+  // S5.3 step 8: NOOP; secure attribute
+  // S5.3 step 9: NOOP; httpOnly attribute
+
+  // S5.3 step 10
+  if (options.http === false && cookie.httpOnly) {
+    err = new Error("Cookie is HttpOnly and this isn't an HTTP API");
+    return cb(options.ignoreError ? null : err);
+  }
+
+  var store = this.store;
+
+  if (!store.updateCookie) {
+    store.updateCookie = function(oldCookie, newCookie, cb) {
+      this.putCookie(newCookie, cb);
+    };
+  }
+
+  function withCookie(err, oldCookie) {
+    if (err) {
+      return cb(err);
+    }
+
+    var next = function(err) {
+      if (err) {
+        return cb(err);
+      } else {
+        cb(null, cookie);
+      }
+    };
+
+    if (oldCookie) {
+      // S5.3 step 11 - "If the cookie store contains a cookie with the same name,
+      // domain, and path as the newly created cookie:"
+      if (options.http === false && oldCookie.httpOnly) { // step 11.2
+        err = new Error("old Cookie is HttpOnly and this isn't an HTTP API");
+        return cb(options.ignoreError ? null : err);
+      }
+      cookie.creation = oldCookie.creation; // step 11.3
+      cookie.lastAccessed = now;
+      // Step 11.4 (delete cookie) is implied by just setting the new one:
+      store.updateCookie(oldCookie, cookie, next); // step 12
+
+    } else {
+      cookie.creation = cookie.lastAccessed = now;
+      store.putCookie(cookie, next); // step 12
+    }
+  }
+
+  store.findCookie(cookie.domain, cookie.path, cookie.key, withCookie);
+};
+
+// RFC6365 S5.4
+CAN_BE_SYNC.push('getCookies');
+CookieJar.prototype.getCookies = function(url, options, cb) {
+  var context = (url instanceof Object) ? url : urlParse(url);
+  if (options instanceof Function) {
+    cb = options;
+    options = {};
+  }
+
+  var host = canonicalDomain(context.hostname);
+  var path = context.pathname || '/';
+
+  var secure = options.secure;
+  if (secure == null && context.protocol &&
+      (context.protocol == 'https:' || context.protocol == 'wss:'))
+  {
+    secure = true;
+  }
+
+  var http = options.http;
+  if (http == null) {
+    http = true;
+  }
+
+  var now = options.now || Date.now();
+  var expireCheck = options.expire !== false;
+  var allPaths = !!options.allPaths;
+  var store = this.store;
+
+  function matchingCookie(c) {
+    // "Either:
+    //   The cookie's host-only-flag is true and the canonicalized
+    //   request-host is identical to the cookie's domain.
+    // Or:
+    //   The cookie's host-only-flag is false and the canonicalized
+    //   request-host domain-matches the cookie's domain."
+    if (c.hostOnly) {
+      if (c.domain != host) {
+        return false;
+      }
+    } else {
+      if (!domainMatch(host, c.domain, false)) {
+        return false;
+      }
+    }
+
+    // "The request-uri's path path-matches the cookie's path."
+    if (!allPaths && !pathMatch(path, c.path)) {
+      return false;
+    }
+
+    // "If the cookie's secure-only-flag is true, then the request-uri's
+    // scheme must denote a "secure" protocol"
+    if (c.secure && !secure) {
+      return false;
+    }
+
+    // "If the cookie's http-only-flag is true, then exclude the cookie if the
+    // cookie-string is being generated for a "non-HTTP" API"
+    if (c.httpOnly && !http) {
+      return false;
+    }
+
+    // deferred from S5.3
+    // non-RFC: allow retention of expired cookies by choice
+    if (expireCheck && c.expiryTime() <= now) {
+      store.removeCookie(c.domain, c.path, c.key, function(){}); // result ignored
+      return false;
+    }
+
+    return true;
+  }
+
+  store.findCookies(host, allPaths ? null : path, function(err,cookies) {
+    if (err) {
+      return cb(err);
+    }
+
+    cookies = cookies.filter(matchingCookie);
+
+    // sorting of S5.4 part 2
+    if (options.sort !== false) {
+      cookies = cookies.sort(cookieCompare);
+    }
+
+    // S5.4 part 3
+    var now = new Date();
+    cookies.forEach(function(c) {
+      c.lastAccessed = now;
+    });
+    // TODO persist lastAccessed
+
+    cb(null,cookies);
+  });
+};
+
+CAN_BE_SYNC.push('getCookieString');
+CookieJar.prototype.getCookieString = function(/*..., cb*/) {
+  var args = Array.prototype.slice.call(arguments,0);
+  var cb = args.pop();
+  var next = function(err,cookies) {
+    if (err) {
+      cb(err);
+    } else {
+      cb(null, cookies.map(function(c){
+        return c.cookieString();
+      }).join('; '));
+    }
+  };
+  args.push(next);
+  this.getCookies.apply(this,args);
+};
+
+CAN_BE_SYNC.push('getSetCookieStrings');
+CookieJar.prototype.getSetCookieStrings = function(/*..., cb*/) {
+  var args = Array.prototype.slice.call(arguments,0);
+  var cb = args.pop();
+  var next = function(err,cookies) {
+    if (err) {
+      cb(err);
+    } else {
+      cb(null, cookies.map(function(c){
+        return c.toString();
+      }));
+    }
+  };
+  args.push(next);
+  this.getCookies.apply(this,args);
+};
+
+// Use a closure to provide a true imperative API for synchronous stores.
+function syncWrap(method) {
+  return function() {
+    if (!this.store.synchronous) {
+      throw new Error('CookieJar store is not synchronous; use async API instead.');
+    }
+
+    var args = Array.prototype.slice.call(arguments);
+    var syncErr, syncResult;
+    args.push(function syncCb(err, result) {
+      syncErr = err;
+      syncResult = result;
+    });
+    this[method].apply(this, args);
+
+    if (syncErr) {
+      throw syncErr;
+    }
+    return syncResult;
+  };
+}
+
+// wrap all declared CAN_BE_SYNC methods in the sync wrapper
+CAN_BE_SYNC.forEach(function(method) {
+  CookieJar.prototype[method+'Sync'] = syncWrap(method);
+});
+
+module.exports = {
+  CookieJar: CookieJar,
+  Cookie: Cookie,
+  Store: Store,
+  parseDate: parseDate,
+  formatDate: formatDate,
+  parse: parse,
+  fromJSON: fromJSON,
+  domainMatch: domainMatch,
+  defaultPath: defaultPath,
+  pathMatch: pathMatch,
+  getPublicSuffix: pubsuffix.getPublicSuffix,
+  cookieCompare: cookieCompare,
+  permuteDomain: permuteDomain,
+  permutePath: permutePath,
+  canonicalDomain: canonicalDomain,
+};
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/memstore.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/memstore.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/memstore.js	(revision 516)
@@ -0,0 +1,123 @@
+'use strict';
+var tough = require('./cookie');
+var Store = require('./store').Store;
+var permuteDomain = tough.permuteDomain;
+var permutePath = tough.permutePath;
+var util = require('util');
+
+function MemoryCookieStore() {
+  Store.call(this);
+  this.idx = {};
+}
+util.inherits(MemoryCookieStore, Store);
+exports.MemoryCookieStore = MemoryCookieStore;
+MemoryCookieStore.prototype.idx = null;
+MemoryCookieStore.prototype.synchronous = true;
+
+// force a default depth:
+MemoryCookieStore.prototype.inspect = function() {
+  return "{ idx: "+util.inspect(this.idx, false, 2)+' }';
+};
+
+MemoryCookieStore.prototype.findCookie = function(domain, path, key, cb) {
+  if (!this.idx[domain]) {
+    return cb(null,undefined);
+  }
+  if (!this.idx[domain][path]) {
+    return cb(null,undefined);
+  }
+  return cb(null,this.idx[domain][path][key]||null);
+};
+
+MemoryCookieStore.prototype.findCookies = function(domain, path, cb) {
+  var results = [];
+  if (!domain) {
+    return cb(null,[]);
+  }
+
+  var pathMatcher;
+  if (!path) {
+    // null or '/' means "all paths"
+    pathMatcher = function matchAll(domainIndex) {
+      for (var curPath in domainIndex) {
+        var pathIndex = domainIndex[curPath];
+        for (var key in pathIndex) {
+          results.push(pathIndex[key]);
+        }
+      }
+    };
+
+  } else if (path === '/') {
+    pathMatcher = function matchSlash(domainIndex) {
+      var pathIndex = domainIndex['/'];
+      if (!pathIndex) {
+        return;
+      }
+      for (var key in pathIndex) {
+        results.push(pathIndex[key]);
+      }
+    };
+
+  } else {
+    var paths = permutePath(path) || [path];
+    pathMatcher = function matchRFC(domainIndex) {
+      paths.forEach(function(curPath) {
+        var pathIndex = domainIndex[curPath];
+        if (!pathIndex) {
+          return;
+        }
+        for (var key in pathIndex) {
+          results.push(pathIndex[key]);
+        }
+      });
+    };
+  }
+
+  var domains = permuteDomain(domain) || [domain];
+  var idx = this.idx;
+  domains.forEach(function(curDomain) {
+    var domainIndex = idx[curDomain];
+    if (!domainIndex) {
+      return;
+    }
+    pathMatcher(domainIndex);
+  });
+
+  cb(null,results);
+};
+
+MemoryCookieStore.prototype.putCookie = function(cookie, cb) {
+  if (!this.idx[cookie.domain]) {
+    this.idx[cookie.domain] = {};
+  }
+  if (!this.idx[cookie.domain][cookie.path]) {
+    this.idx[cookie.domain][cookie.path] = {};
+  }
+  this.idx[cookie.domain][cookie.path][cookie.key] = cookie;
+  cb(null);
+};
+
+MemoryCookieStore.prototype.updateCookie = function updateCookie(oldCookie, newCookie, cb) {
+  // updateCookie() may avoid updating cookies that are identical.  For example,
+  // lastAccessed may not be important to some stores and an equality
+  // comparison could exclude that field.
+  this.putCookie(newCookie,cb);
+};
+
+MemoryCookieStore.prototype.removeCookie = function removeCookie(domain, path, key, cb) {
+  if (this.idx[domain] && this.idx[domain][path] && this.idx[domain][path][key]) {
+    delete this.idx[domain][path][key];
+  }
+  cb(null);
+};
+
+MemoryCookieStore.prototype.removeCookies = function removeCookies(domain, path, cb) {
+  if (this.idx[domain]) {
+    if (path) {
+      delete this.idx[domain][path];
+    } else {
+      delete this.idx[domain];
+    }
+  }
+  return cb(null);
+};
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js	(revision 516)
@@ -0,0 +1,69 @@
+/****************************************************
+ * AUTOMATICALLY GENERATED by generate-pubsuffix.js *
+ *                  DO NOT EDIT!                    *
+ ****************************************************/
+
+module.exports.getPublicSuffix = function getPublicSuffix(domain) {
+  /*
+   * Copyright GoInstant, Inc. and other contributors. All rights reserved.
+   * Permission is hereby granted, free of charge, to any person obtaining a copy
+   * of this software and associated documentation files (the "Software"), to
+   * deal in the Software without restriction, including without limitation the
+   * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+   * sell copies of the Software, and to permit persons to whom the Software is
+   * furnished to do so, subject to the following conditions:
+   *
+   * The above copyright notice and this permission notice shall be included in
+   * all copies or substantial portions of the Software.
+   *
+   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+   * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+   * IN THE SOFTWARE.
+   */
+  if (!domain) return null;
+  if (domain.match(/^\./)) return null;
+
+  domain = domain.toLowerCase();
+  var parts = domain.split('.').reverse();
+
+  var suffix = '';
+  var suffixLen = 0;
+  for (var i=0; i<parts.length; i++) {
+    var part = parts[i];
+    var starstr = '*'+suffix;
+    var partstr = part+suffix;
+
+    if (index[starstr]) { // star rule matches
+      suffixLen = i+1;
+      if (index[partstr] === false) { // exception rule matches (NB: false, not undefined)
+        suffixLen--;
+      }
+    } else if (index[partstr]) { // exact match, not exception
+      suffixLen = i+1;
+    }
+
+    suffix = '.'+part+suffix;
+  }
+
+  if (index['*'+suffix]) { // *.domain exists (e.g. *.kyoto.jp for domain='kyoto.jp');
+    return null;
+  }
+
+  if (suffixLen && parts.length > suffixLen) {
+    return parts.slice(0,suffixLen+1).reverse().join('.');
+  }
+
+  return null;
+};
+
+// The following generated structure is used under the MPL version 1.1
+// See public-suffix.txt for more information
+
+var index = module.exports.index = Object.freeze(
+{"ac":true,"com.ac":true,"edu.ac":true,"gov.ac":true,"net.ac":true,"mil.ac":true,"org.ac":true,"ad":true,"nom.ad":true,"ae":true,"co.ae":true,"net.ae":true,"org.ae":true,"sch.ae":true,"ac.ae":true,"gov.ae":true,"mil.ae":true,"aero":true,"accident-investigation.aero":true,"accident-prevention.aero":true,"aerobatic.aero":true,"aeroclub.aero":true,"aerodrome.aero":true,"agents.aero":true,"aircraft.aero":true,"airline.aero":true,"airport.aero":true,"air-surveillance.aero":true,"airtraffic.aero":true,"air-traffic-control.aero":true,"ambulance.aero":true,"amusement.aero":true,"association.aero":true,"author.aero":true,"ballooning.aero":true,"broker.aero":true,"caa.aero":true,"cargo.aero":true,"catering.aero":true,"certification.aero":true,"championship.aero":true,"charter.aero":true,"civilaviation.aero":true,"club.aero":true,"conference.aero":true,"consultant.aero":true,"consulting.aero":true,"control.aero":true,"council.aero":true,"crew.aero":true,"design.aero":true,"dgca.aero":true,"educator.aero":true,"emergency.aero":true,"engine.aero":true,"engineer.aero":true,"entertainment.aero":true,"equipment.aero":true,"exchange.aero":true,"express.aero":true,"federation.aero":true,"flight.aero":true,"freight.aero":true,"fuel.aero":true,"gliding.aero":true,"government.aero":true,"groundhandling.aero":true,"group.aero":true,"hanggliding.aero":true,"homebuilt.aero":true,"insurance.aero":true,"journal.aero":true,"journalist.aero":true,"leasing.aero":true,"logistics.aero":true,"magazine.aero":true,"maintenance.aero":true,"marketplace.aero":true,"media.aero":true,"microlight.aero":true,"modelling.aero":true,"navigation.aero":true,"parachuting.aero":true,"paragliding.aero":true,"passenger-association.aero":true,"pilot.aero":true,"press.aero":true,"production.aero":true,"recreation.aero":true,"repbody.aero":true,"res.aero":true,"research.aero":true,"rotorcraft.aero":true,"safety.aero":true,"scientist.aero":true,"services.aero":true,"show.aero":true,"skydiving.aero":true,"software.aero":true,"student.aero":true,"taxi.aero":true,"trader.aero":true,"trading.aero":true,"trainer.aero":true,"union.aero":true,"workinggroup.aero":true,"works.aero":true,"af":true,"gov.af":true,"com.af":true,"org.af":true,"net.af":true,"edu.af":true,"ag":true,"com.ag":true,"org.ag":true,"net.ag":true,"co.ag":true,"nom.ag":true,"ai":true,"off.ai":true,"com.ai":true,"net.ai":true,"org.ai":true,"al":true,"com.al":true,"edu.al":true,"gov.al":true,"mil.al":true,"net.al":true,"org.al":true,"am":true,"an":true,"com.an":true,"net.an":true,"org.an":true,"edu.an":true,"ao":true,"ed.ao":true,"gv.ao":true,"og.ao":true,"co.ao":true,"pb.ao":true,"it.ao":true,"aq":true,"*.ar":true,"congresodelalengua3.ar":false,"educ.ar":false,"gobiernoelectronico.ar":false,"mecon.ar":false,"nacion.ar":false,"nic.ar":false,"promocion.ar":false,"retina.ar":false,"uba.ar":false,"e164.arpa":true,"in-addr.arpa":true,"ip6.arpa":true,"iris.arpa":true,"uri.arpa":true,"urn.arpa":true,"as":true,"gov.as":true,"asia":true,"at":true,"ac.at":true,"co.at":true,"gv.at":true,"or.at":true,"com.au":true,"net.au":true,"org.au":true,"edu.au":true,"gov.au":true,"csiro.au":true,"asn.au":true,"id.au":true,"info.au":true,"conf.au":true,"oz.au":true,"act.au":true,"nsw.au":true,"nt.au":true,"qld.au":true,"sa.au":true,"tas.au":true,"vic.au":true,"wa.au":true,"act.edu.au":true,"nsw.edu.au":true,"nt.edu.au":true,"qld.edu.au":true,"sa.edu.au":true,"tas.edu.au":true,"vic.edu.au":true,"wa.edu.au":true,"act.gov.au":true,"nt.gov.au":true,"qld.gov.au":true,"sa.gov.au":true,"tas.gov.au":true,"vic.gov.au":true,"wa.gov.au":true,"aw":true,"com.aw":true,"ax":true,"az":true,"com.az":true,"net.az":true,"int.az":true,"gov.az":true,"org.az":true,"edu.az":true,"info.az":true,"pp.az":true,"mil.az":true,"name.az":true,"pro.az":true,"biz.az":true,"ba":true,"org.ba":true,"net.ba":true,"edu.ba":true,"gov.ba":true,"mil.ba":true,"unsa.ba":true,"unbi.ba":true,"co.ba":true,"com.ba":true,"rs.ba":true,"bb":true,"biz.bb":true,"com.bb":true,"edu.bb":true,"gov.bb":true,"info.bb":true,"net.bb":true,"org.bb":true,"store.bb":true,"*.bd":true,"be":true,"ac.be":true,"bf":true,"gov.bf":true,"bg":true,"a.bg":true,"b.bg":true,"c.bg":true,"d.bg":true,"e.bg":true,"f.bg":true,"g.bg":true,"h.bg":true,"i.bg":true,"j.bg":true,"k.bg":true,"l.bg":true,"m.bg":true,"n.bg":true,"o.bg":true,"p.bg":true,"q.bg":true,"r.bg":true,"s.bg":true,"t.bg":true,"u.bg":true,"v.bg":true,"w.bg":true,"x.bg":true,"y.bg":true,"z.bg":true,"0.bg":true,"1.bg":true,"2.bg":true,"3.bg":true,"4.bg":true,"5.bg":true,"6.bg":true,"7.bg":true,"8.bg":true,"9.bg":true,"bh":true,"com.bh":true,"edu.bh":true,"net.bh":true,"org.bh":true,"gov.bh":true,"bi":true,"co.bi":true,"com.bi":true,"edu.bi":true,"or.bi":true,"org.bi":true,"biz":true,"bj":true,"asso.bj":true,"barreau.bj":true,"gouv.bj":true,"bm":true,"com.bm":true,"edu.bm":true,"gov.bm":true,"net.bm":true,"org.bm":true,"*.bn":true,"bo":true,"com.bo":true,"edu.bo":true,"gov.bo":true,"gob.bo":true,"int.bo":true,"org.bo":true,"net.bo":true,"mil.bo":true,"tv.bo":true,"br":true,"adm.br":true,"adv.br":true,"agr.br":true,"am.br":true,"arq.br":true,"art.br":true,"ato.br":true,"b.br":true,"bio.br":true,"blog.br":true,"bmd.br":true,"can.br":true,"cim.br":true,"cng.br":true,"cnt.br":true,"com.br":true,"coop.br":true,"ecn.br":true,"edu.br":true,"emp.br":true,"eng.br":true,"esp.br":true,"etc.br":true,"eti.br":true,"far.br":true,"flog.br":true,"fm.br":true,"fnd.br":true,"fot.br":true,"fst.br":true,"g12.br":true,"ggf.br":true,"gov.br":true,"imb.br":true,"ind.br":true,"inf.br":true,"jor.br":true,"jus.br":true,"lel.br":true,"mat.br":true,"med.br":true,"mil.br":true,"mus.br":true,"net.br":true,"nom.br":true,"not.br":true,"ntr.br":true,"odo.br":true,"org.br":true,"ppg.br":true,"pro.br":true,"psc.br":true,"psi.br":true,"qsl.br":true,"radio.br":true,"rec.br":true,"slg.br":true,"srv.br":true,"taxi.br":true,"teo.br":true,"tmp.br":true,"trd.br":true,"tur.br":true,"tv.br":true,"vet.br":true,"vlog.br":true,"wiki.br":true,"zlg.br":true,"bs":true,"com.bs":true,"net.bs":true,"org.bs":true,"edu.bs":true,"gov.bs":true,"bt":true,"com.bt":true,"edu.bt":true,"gov.bt":true,"net.bt":true,"org.bt":true,"bw":true,"co.bw":true,"org.bw":true,"by":true,"gov.by":true,"mil.by":true,"com.by":true,"of.by":true,"bz":true,"com.bz":true,"net.bz":true,"org.bz":true,"edu.bz":true,"gov.bz":true,"ca":true,"ab.ca":true,"bc.ca":true,"mb.ca":true,"nb.ca":true,"nf.ca":true,"nl.ca":true,"ns.ca":true,"nt.ca":true,"nu.ca":true,"on.ca":true,"pe.ca":true,"qc.ca":true,"sk.ca":true,"yk.ca":true,"gc.ca":true,"cat":true,"cc":true,"cd":true,"gov.cd":true,"cf":true,"cg":true,"ch":true,"ci":true,"org.ci":true,"or.ci":true,"com.ci":true,"co.ci":true,"edu.ci":true,"ed.ci":true,"ac.ci":true,"net.ci":true,"go.ci":true,"asso.ci":true,"xn--aroport-bya.ci":true,"int.ci":true,"presse.ci":true,"md.ci":true,"gouv.ci":true,"*.ck":true,"www.ck":false,"cl":true,"gov.cl":true,"gob.cl":true,"co.cl":true,"mil.cl":true,"cm":true,"gov.cm":true,"cn":true,"ac.cn":true,"com.cn":true,"edu.cn":true,"gov.cn":true,"net.cn":true,"org.cn":true,"mil.cn":true,"xn--55qx5d.cn":true,"xn--io0a7i.cn":true,"xn--od0alg.cn":true,"ah.cn":true,"bj.cn":true,"cq.cn":true,"fj.cn":true,"gd.cn":true,"gs.cn":true,"gz.cn":true,"gx.cn":true,"ha.cn":true,"hb.cn":true,"he.cn":true,"hi.cn":true,"hl.cn":true,"hn.cn":true,"jl.cn":true,"js.cn":true,"jx.cn":true,"ln.cn":true,"nm.cn":true,"nx.cn":true,"qh.cn":true,"sc.cn":true,"sd.cn":true,"sh.cn":true,"sn.cn":true,"sx.cn":true,"tj.cn":true,"xj.cn":true,"xz.cn":true,"yn.cn":true,"zj.cn":true,"hk.cn":true,"mo.cn":true,"tw.cn":true,"co":true,"arts.co":true,"com.co":true,"edu.co":true,"firm.co":true,"gov.co":true,"info.co":true,"int.co":true,"mil.co":true,"net.co":true,"nom.co":true,"org.co":true,"rec.co":true,"web.co":true,"com":true,"coop":true,"cr":true,"ac.cr":true,"co.cr":true,"ed.cr":true,"fi.cr":true,"go.cr":true,"or.cr":true,"sa.cr":true,"cu":true,"com.cu":true,"edu.cu":true,"org.cu":true,"net.cu":true,"gov.cu":true,"inf.cu":true,"cv":true,"cx":true,"gov.cx":true,"*.cy":true,"cz":true,"de":true,"dj":true,"dk":true,"dm":true,"com.dm":true,"net.dm":true,"org.dm":true,"edu.dm":true,"gov.dm":true,"do":true,"art.do":true,"com.do":true,"edu.do":true,"gob.do":true,"gov.do":true,"mil.do":true,"net.do":true,"org.do":true,"sld.do":true,"web.do":true,"dz":true,"com.dz":true,"org.dz":true,"net.dz":true,"gov.dz":true,"edu.dz":true,"asso.dz":true,"pol.dz":true,"art.dz":true,"ec":true,"com.ec":true,"info.ec":true,"net.ec":true,"fin.ec":true,"k12.ec":true,"med.ec":true,"pro.ec":true,"org.ec":true,"edu.ec":true,"gov.ec":true,"gob.ec":true,"mil.ec":true,"edu":true,"ee":true,"edu.ee":true,"gov.ee":true,"riik.ee":true,"lib.ee":true,"med.ee":true,"com.ee":true,"pri.ee":true,"aip.ee":true,"org.ee":true,"fie.ee":true,"eg":true,"com.eg":true,"edu.eg":true,"eun.eg":true,"gov.eg":true,"mil.eg":true,"name.eg":true,"net.eg":true,"org.eg":true,"sci.eg":true,"*.er":true,"es":true,"com.es":true,"nom.es":true,"org.es":true,"gob.es":true,"edu.es":true,"*.et":true,"eu":true,"fi":true,"aland.fi":true,"*.fj":true,"*.fk":true,"fm":true,"fo":true,"fr":true,"com.fr":true,"asso.fr":true,"nom.fr":true,"prd.fr":true,"presse.fr":true,"tm.fr":true,"aeroport.fr":true,"assedic.fr":true,"avocat.fr":true,"avoues.fr":true,"cci.fr":true,"chambagri.fr":true,"chirurgiens-dentistes.fr":true,"experts-comptables.fr":true,"geometre-expert.fr":true,"gouv.fr":true,"greta.fr":true,"huissier-justice.fr":true,"medecin.fr":true,"notaires.fr":true,"pharmacien.fr":true,"port.fr":true,"veterinaire.fr":true,"ga":true,"gd":true,"ge":true,"com.ge":true,"edu.ge":true,"gov.ge":true,"org.ge":true,"mil.ge":true,"net.ge":true,"pvt.ge":true,"gf":true,"gg":true,"co.gg":true,"org.gg":true,"net.gg":true,"sch.gg":true,"gov.gg":true,"gh":true,"com.gh":true,"edu.gh":true,"gov.gh":true,"org.gh":true,"mil.gh":true,"gi":true,"com.gi":true,"ltd.gi":true,"gov.gi":true,"mod.gi":true,"edu.gi":true,"org.gi":true,"gl":true,"gm":true,"ac.gn":true,"com.gn":true,"edu.gn":true,"gov.gn":true,"org.gn":true,"net.gn":true,"gov":true,"gp":true,"com.gp":true,"net.gp":true,"mobi.gp":true,"edu.gp":true,"org.gp":true,"asso.gp":true,"gq":true,"gr":true,"com.gr":true,"edu.gr":true,"net.gr":true,"org.gr":true,"gov.gr":true,"gs":true,"*.gt":true,"www.gt":false,"*.gu":true,"gw":true,"gy":true,"co.gy":true,"com.gy":true,"net.gy":true,"hk":true,"com.hk":true,"edu.hk":true,"gov.hk":true,"idv.hk":true,"net.hk":true,"org.hk":true,"xn--55qx5d.hk":true,"xn--wcvs22d.hk":true,"xn--lcvr32d.hk":true,"xn--mxtq1m.hk":true,"xn--gmqw5a.hk":true,"xn--ciqpn.hk":true,"xn--gmq050i.hk":true,"xn--zf0avx.hk":true,"xn--io0a7i.hk":true,"xn--mk0axi.hk":true,"xn--od0alg.hk":true,"xn--od0aq3b.hk":true,"xn--tn0ag.hk":true,"xn--uc0atv.hk":true,"xn--uc0ay4a.hk":true,"hm":true,"hn":true,"com.hn":true,"edu.hn":true,"org.hn":true,"net.hn":true,"mil.hn":true,"gob.hn":true,"hr":true,"iz.hr":true,"from.hr":true,"name.hr":true,"com.hr":true,"ht":true,"com.ht":true,"shop.ht":true,"firm.ht":true,"info.ht":true,"adult.ht":true,"net.ht":true,"pro.ht":true,"org.ht":true,"med.ht":true,"art.ht":true,"coop.ht":true,"pol.ht":true,"asso.ht":true,"edu.ht":true,"rel.ht":true,"gouv.ht":true,"perso.ht":true,"hu":true,"co.hu":true,"info.hu":true,"org.hu":true,"priv.hu":true,"sport.hu":true,"tm.hu":true,"2000.hu":true,"agrar.hu":true,"bolt.hu":true,"casino.hu":true,"city.hu":true,"erotica.hu":true,"erotika.hu":true,"film.hu":true,"forum.hu":true,"games.hu":true,"hotel.hu":true,"ingatlan.hu":true,"jogasz.hu":true,"konyvelo.hu":true,"lakas.hu":true,"media.hu":true,"news.hu":true,"reklam.hu":true,"sex.hu":true,"shop.hu":true,"suli.hu":true,"szex.hu":true,"tozsde.hu":true,"utazas.hu":true,"video.hu":true,"id":true,"ac.id":true,"co.id":true,"go.id":true,"mil.id":true,"net.id":true,"or.id":true,"sch.id":true,"web.id":true,"ie":true,"gov.ie":true,"*.il":true,"im":true,"co.im":true,"ltd.co.im":true,"plc.co.im":true,"net.im":true,"gov.im":true,"org.im":true,"nic.im":true,"ac.im":true,"in":true,"co.in":true,"firm.in":true,"net.in":true,"org.in":true,"gen.in":true,"ind.in":true,"nic.in":true,"ac.in":true,"edu.in":true,"res.in":true,"gov.in":true,"mil.in":true,"info":true,"int":true,"eu.int":true,"io":true,"com.io":true,"iq":true,"gov.iq":true,"edu.iq":true,"mil.iq":true,"com.iq":true,"org.iq":true,"net.iq":true,"ir":true,"ac.ir":true,"co.ir":true,"gov.ir":true,"id.ir":true,"net.ir":true,"org.ir":true,"sch.ir":true,"xn--mgba3a4f16a.ir":true,"xn--mgba3a4fra.ir":true,"is":true,"net.is":true,"com.is":true,"edu.is":true,"gov.is":true,"org.is":true,"int.is":true,"it":true,"gov.it":true,"edu.it":true,"agrigento.it":true,"ag.it":true,"alessandria.it":true,"al.it":true,"ancona.it":true,"an.it":true,"aosta.it":true,"aoste.it":true,"ao.it":true,"arezzo.it":true,"ar.it":true,"ascoli-piceno.it":true,"ascolipiceno.it":true,"ap.it":true,"asti.it":true,"at.it":true,"avellino.it":true,"av.it":true,"bari.it":true,"ba.it":true,"andria-barletta-trani.it":true,"andriabarlettatrani.it":true,"trani-barletta-andria.it":true,"tranibarlettaandria.it":true,"barletta-trani-andria.it":true,"barlettatraniandria.it":true,"andria-trani-barletta.it":true,"andriatranibarletta.it":true,"trani-andria-barletta.it":true,"traniandriabarletta.it":true,"bt.it":true,"belluno.it":true,"bl.it":true,"benevento.it":true,"bn.it":true,"bergamo.it":true,"bg.it":true,"biella.it":true,"bi.it":true,"bologna.it":true,"bo.it":true,"bolzano.it":true,"bozen.it":true,"balsan.it":true,"alto-adige.it":true,"altoadige.it":true,"suedtirol.it":true,"bz.it":true,"brescia.it":true,"bs.it":true,"brindisi.it":true,"br.it":true,"cagliari.it":true,"ca.it":true,"caltanissetta.it":true,"cl.it":true,"campobasso.it":true,"cb.it":true,"carboniaiglesias.it":true,"carbonia-iglesias.it":true,"iglesias-carbonia.it":true,"iglesiascarbonia.it":true,"ci.it":true,"caserta.it":true,"ce.it":true,"catania.it":true,"ct.it":true,"catanzaro.it":true,"cz.it":true,"chieti.it":true,"ch.it":true,"como.it":true,"co.it":true,"cosenza.it":true,"cs.it":true,"cremona.it":true,"cr.it":true,"crotone.it":true,"kr.it":true,"cuneo.it":true,"cn.it":true,"dell-ogliastra.it":true,"dellogliastra.it":true,"ogliastra.it":true,"og.it":true,"enna.it":true,"en.it":true,"ferrara.it":true,"fe.it":true,"fermo.it":true,"fm.it":true,"firenze.it":true,"florence.it":true,"fi.it":true,"foggia.it":true,"fg.it":true,"forli-cesena.it":true,"forlicesena.it":true,"cesena-forli.it":true,"cesenaforli.it":true,"fc.it":true,"frosinone.it":true,"fr.it":true,"genova.it":true,"genoa.it":true,"ge.it":true,"gorizia.it":true,"go.it":true,"grosseto.it":true,"gr.it":true,"imperia.it":true,"im.it":true,"isernia.it":true,"is.it":true,"laquila.it":true,"aquila.it":true,"aq.it":true,"la-spezia.it":true,"laspezia.it":true,"sp.it":true,"latina.it":true,"lt.it":true,"lecce.it":true,"le.it":true,"lecco.it":true,"lc.it":true,"livorno.it":true,"li.it":true,"lodi.it":true,"lo.it":true,"lucca.it":true,"lu.it":true,"macerata.it":true,"mc.it":true,"mantova.it":true,"mn.it":true,"massa-carrara.it":true,"massacarrara.it":true,"carrara-massa.it":true,"carraramassa.it":true,"ms.it":true,"matera.it":true,"mt.it":true,"medio-campidano.it":true,"mediocampidano.it":true,"campidano-medio.it":true,"campidanomedio.it":true,"vs.it":true,"messina.it":true,"me.it":true,"milano.it":true,"milan.it":true,"mi.it":true,"modena.it":true,"mo.it":true,"monza.it":true,"monza-brianza.it":true,"monzabrianza.it":true,"monzaebrianza.it":true,"monzaedellabrianza.it":true,"monza-e-della-brianza.it":true,"mb.it":true,"napoli.it":true,"naples.it":true,"na.it":true,"novara.it":true,"no.it":true,"nuoro.it":true,"nu.it":true,"oristano.it":true,"or.it":true,"padova.it":true,"padua.it":true,"pd.it":true,"palermo.it":true,"pa.it":true,"parma.it":true,"pr.it":true,"pavia.it":true,"pv.it":true,"perugia.it":true,"pg.it":true,"pescara.it":true,"pe.it":true,"pesaro-urbino.it":true,"pesarourbino.it":true,"urbino-pesaro.it":true,"urbinopesaro.it":true,"pu.it":true,"piacenza.it":true,"pc.it":true,"pisa.it":true,"pi.it":true,"pistoia.it":true,"pt.it":true,"pordenone.it":true,"pn.it":true,"potenza.it":true,"pz.it":true,"prato.it":true,"po.it":true,"ragusa.it":true,"rg.it":true,"ravenna.it":true,"ra.it":true,"reggio-calabria.it":true,"reggiocalabria.it":true,"rc.it":true,"reggio-emilia.it":true,"reggioemilia.it":true,"re.it":true,"rieti.it":true,"ri.it":true,"rimini.it":true,"rn.it":true,"roma.it":true,"rome.it":true,"rm.it":true,"rovigo.it":true,"ro.it":true,"salerno.it":true,"sa.it":true,"sassari.it":true,"ss.it":true,"savona.it":true,"sv.it":true,"siena.it":true,"si.it":true,"siracusa.it":true,"sr.it":true,"sondrio.it":true,"so.it":true,"taranto.it":true,"ta.it":true,"tempio-olbia.it":true,"tempioolbia.it":true,"olbia-tempio.it":true,"olbiatempio.it":true,"ot.it":true,"teramo.it":true,"te.it":true,"terni.it":true,"tr.it":true,"torino.it":true,"turin.it":true,"to.it":true,"trapani.it":true,"tp.it":true,"trento.it":true,"trentino.it":true,"tn.it":true,"treviso.it":true,"tv.it":true,"trieste.it":true,"ts.it":true,"udine.it":true,"ud.it":true,"varese.it":true,"va.it":true,"venezia.it":true,"venice.it":true,"ve.it":true,"verbania.it":true,"vb.it":true,"vercelli.it":true,"vc.it":true,"verona.it":true,"vr.it":true,"vibo-valentia.it":true,"vibovalentia.it":true,"vv.it":true,"vicenza.it":true,"vi.it":true,"viterbo.it":true,"vt.it":true,"je":true,"co.je":true,"org.je":true,"net.je":true,"sch.je":true,"gov.je":true,"*.jm":true,"jo":true,"com.jo":true,"org.jo":true,"net.jo":true,"edu.jo":true,"sch.jo":true,"gov.jo":true,"mil.jo":true,"name.jo":true,"jobs":true,"jp":true,"ac.jp":true,"ad.jp":true,"co.jp":true,"ed.jp":true,"go.jp":true,"gr.jp":true,"lg.jp":true,"ne.jp":true,"or.jp":true,"*.aichi.jp":true,"*.akita.jp":true,"*.aomori.jp":true,"*.chiba.jp":true,"*.ehime.jp":true,"*.fukui.jp":true,"*.fukuoka.jp":true,"*.fukushima.jp":true,"*.gifu.jp":true,"*.gunma.jp":true,"*.hiroshima.jp":true,"*.hokkaido.jp":true,"*.hyogo.jp":true,"*.ibaraki.jp":true,"*.ishikawa.jp":true,"*.iwate.jp":true,"*.kagawa.jp":true,"*.kagoshima.jp":true,"*.kanagawa.jp":true,"*.kawasaki.jp":true,"*.kitakyushu.jp":true,"*.kobe.jp":true,"*.kochi.jp":true,"*.kumamoto.jp":true,"*.kyoto.jp":true,"*.mie.jp":true,"*.miyagi.jp":true,"*.miyazaki.jp":true,"*.nagano.jp":true,"*.nagasaki.jp":true,"*.nagoya.jp":true,"*.nara.jp":true,"*.niigata.jp":true,"*.oita.jp":true,"*.okayama.jp":true,"*.okinawa.jp":true,"*.osaka.jp":true,"*.saga.jp":true,"*.saitama.jp":true,"*.sapporo.jp":true,"*.sendai.jp":true,"*.shiga.jp":true,"*.shimane.jp":true,"*.shizuoka.jp":true,"*.tochigi.jp":true,"*.tokushima.jp":true,"*.tokyo.jp":true,"*.tottori.jp":true,"*.toyama.jp":true,"*.wakayama.jp":true,"*.yamagata.jp":true,"*.yamaguchi.jp":true,"*.yamanashi.jp":true,"*.yokohama.jp":true,"metro.tokyo.jp":false,"pref.aichi.jp":false,"pref.akita.jp":false,"pref.aomori.jp":false,"pref.chiba.jp":false,"pref.ehime.jp":false,"pref.fukui.jp":false,"pref.fukuoka.jp":false,"pref.fukushima.jp":false,"pref.gifu.jp":false,"pref.gunma.jp":false,"pref.hiroshima.jp":false,"pref.hokkaido.jp":false,"pref.hyogo.jp":false,"pref.ibaraki.jp":false,"pref.ishikawa.jp":false,"pref.iwate.jp":false,"pref.kagawa.jp":false,"pref.kagoshima.jp":false,"pref.kanagawa.jp":false,"pref.kochi.jp":false,"pref.kumamoto.jp":false,"pref.kyoto.jp":false,"pref.mie.jp":false,"pref.miyagi.jp":false,"pref.miyazaki.jp":false,"pref.nagano.jp":false,"pref.nagasaki.jp":false,"pref.nara.jp":false,"pref.niigata.jp":false,"pref.oita.jp":false,"pref.okayama.jp":false,"pref.okinawa.jp":false,"pref.osaka.jp":false,"pref.saga.jp":false,"pref.saitama.jp":false,"pref.shiga.jp":false,"pref.shimane.jp":false,"pref.shizuoka.jp":false,"pref.tochigi.jp":false,"pref.tokushima.jp":false,"pref.tottori.jp":false,"pref.toyama.jp":false,"pref.wakayama.jp":false,"pref.yamagata.jp":false,"pref.yamaguchi.jp":false,"pref.yamanashi.jp":false,"city.chiba.jp":false,"city.fukuoka.jp":false,"city.hiroshima.jp":false,"city.kawasaki.jp":false,"city.kitakyushu.jp":false,"city.kobe.jp":false,"city.kyoto.jp":false,"city.nagoya.jp":false,"city.niigata.jp":false,"city.okayama.jp":false,"city.osaka.jp":false,"city.saitama.jp":false,"city.sapporo.jp":false,"city.sendai.jp":false,"city.shizuoka.jp":false,"city.yokohama.jp":false,"*.ke":true,"kg":true,"org.kg":true,"net.kg":true,"com.kg":true,"edu.kg":true,"gov.kg":true,"mil.kg":true,"*.kh":true,"ki":true,"edu.ki":true,"biz.ki":true,"net.ki":true,"org.ki":true,"gov.ki":true,"info.ki":true,"com.ki":true,"km":true,"org.km":true,"nom.km":true,"gov.km":true,"prd.km":true,"tm.km":true,"edu.km":true,"mil.km":true,"ass.km":true,"com.km":true,"coop.km":true,"asso.km":true,"presse.km":true,"medecin.km":true,"notaires.km":true,"pharmaciens.km":true,"veterinaire.km":true,"gouv.km":true,"kn":true,"net.kn":true,"org.kn":true,"edu.kn":true,"gov.kn":true,"com.kp":true,"edu.kp":true,"gov.kp":true,"org.kp":true,"rep.kp":true,"tra.kp":true,"kr":true,"ac.kr":true,"co.kr":true,"es.kr":true,"go.kr":true,"hs.kr":true,"kg.kr":true,"mil.kr":true,"ms.kr":true,"ne.kr":true,"or.kr":true,"pe.kr":true,"re.kr":true,"sc.kr":true,"busan.kr":true,"chungbuk.kr":true,"chungnam.kr":true,"daegu.kr":true,"daejeon.kr":true,"gangwon.kr":true,"gwangju.kr":true,"gyeongbuk.kr":true,"gyeonggi.kr":true,"gyeongnam.kr":true,"incheon.kr":true,"jeju.kr":true,"jeonbuk.kr":true,"jeonnam.kr":true,"seoul.kr":true,"ulsan.kr":true,"*.kw":true,"ky":true,"edu.ky":true,"gov.ky":true,"com.ky":true,"org.ky":true,"net.ky":true,"kz":true,"org.kz":true,"edu.kz":true,"net.kz":true,"gov.kz":true,"mil.kz":true,"com.kz":true,"la":true,"int.la":true,"net.la":true,"info.la":true,"edu.la":true,"gov.la":true,"per.la":true,"com.la":true,"org.la":true,"com.lb":true,"edu.lb":true,"gov.lb":true,"net.lb":true,"org.lb":true,"lc":true,"com.lc":true,"net.lc":true,"co.lc":true,"org.lc":true,"edu.lc":true,"gov.lc":true,"li":true,"lk":true,"gov.lk":true,"sch.lk":true,"net.lk":true,"int.lk":true,"com.lk":true,"org.lk":true,"edu.lk":true,"ngo.lk":true,"soc.lk":true,"web.lk":true,"ltd.lk":true,"assn.lk":true,"grp.lk":true,"hotel.lk":true,"com.lr":true,"edu.lr":true,"gov.lr":true,"org.lr":true,"net.lr":true,"ls":true,"co.ls":true,"org.ls":true,"lt":true,"gov.lt":true,"lu":true,"lv":true,"com.lv":true,"edu.lv":true,"gov.lv":true,"org.lv":true,"mil.lv":true,"id.lv":true,"net.lv":true,"asn.lv":true,"conf.lv":true,"ly":true,"com.ly":true,"net.ly":true,"gov.ly":true,"plc.ly":true,"edu.ly":true,"sch.ly":true,"med.ly":true,"org.ly":true,"id.ly":true,"ma":true,"co.ma":true,"net.ma":true,"gov.ma":true,"org.ma":true,"ac.ma":true,"press.ma":true,"mc":true,"tm.mc":true,"asso.mc":true,"md":true,"me":true,"co.me":true,"net.me":true,"org.me":true,"edu.me":true,"ac.me":true,"gov.me":true,"its.me":true,"priv.me":true,"mg":true,"org.mg":true,"nom.mg":true,"gov.mg":true,"prd.mg":true,"tm.mg":true,"edu.mg":true,"mil.mg":true,"com.mg":true,"mh":true,"mil":true,"mk":true,"com.mk":true,"org.mk":true,"net.mk":true,"edu.mk":true,"gov.mk":true,"inf.mk":true,"name.mk":true,"ml":true,"com.ml":true,"edu.ml":true,"gouv.ml":true,"gov.ml":true,"net.ml":true,"org.ml":true,"presse.ml":true,"*.mm":true,"mn":true,"gov.mn":true,"edu.mn":true,"org.mn":true,"mo":true,"com.mo":true,"net.mo":true,"org.mo":true,"edu.mo":true,"gov.mo":true,"mobi":true,"mp":true,"mq":true,"mr":true,"gov.mr":true,"ms":true,"*.mt":true,"mu":true,"com.mu":true,"net.mu":true,"org.mu":true,"gov.mu":true,"ac.mu":true,"co.mu":true,"or.mu":true,"museum":true,"academy.museum":true,"agriculture.museum":true,"air.museum":true,"airguard.museum":true,"alabama.museum":true,"alaska.museum":true,"amber.museum":true,"ambulance.museum":true,"american.museum":true,"americana.museum":true,"americanantiques.museum":true,"americanart.museum":true,"amsterdam.museum":true,"and.museum":true,"annefrank.museum":true,"anthro.museum":true,"anthropology.museum":true,"antiques.museum":true,"aquarium.museum":true,"arboretum.museum":true,"archaeological.museum":true,"archaeology.museum":true,"architecture.museum":true,"art.museum":true,"artanddesign.museum":true,"artcenter.museum":true,"artdeco.museum":true,"arteducation.museum":true,"artgallery.museum":true,"arts.museum":true,"artsandcrafts.museum":true,"asmatart.museum":true,"assassination.museum":true,"assisi.museum":true,"association.museum":true,"astronomy.museum":true,"atlanta.museum":true,"austin.museum":true,"australia.museum":true,"automotive.museum":true,"aviation.museum":true,"axis.museum":true,"badajoz.museum":true,"baghdad.museum":true,"bahn.museum":true,"bale.museum":true,"baltimore.museum":true,"barcelona.museum":true,"baseball.museum":true,"basel.museum":true,"baths.museum":true,"bauern.museum":true,"beauxarts.museum":true,"beeldengeluid.museum":true,"bellevue.museum":true,"bergbau.museum":true,"berkeley.museum":true,"berlin.museum":true,"bern.museum":true,"bible.museum":true,"bilbao.museum":true,"bill.museum":true,"birdart.museum":true,"birthplace.museum":true,"bonn.museum":true,"boston.museum":true,"botanical.museum":true,"botanicalgarden.museum":true,"botanicgarden.museum":true,"botany.museum":true,"brandywinevalley.museum":true,"brasil.museum":true,"bristol.museum":true,"british.museum":true,"britishcolumbia.museum":true,"broadcast.museum":true,"brunel.museum":true,"brussel.museum":true,"brussels.museum":true,"bruxelles.museum":true,"building.museum":true,"burghof.museum":true,"bus.museum":true,"bushey.museum":true,"cadaques.museum":true,"california.museum":true,"cambridge.museum":true,"can.museum":true,"canada.museum":true,"capebreton.museum":true,"carrier.museum":true,"cartoonart.museum":true,"casadelamoneda.museum":true,"castle.museum":true,"castres.museum":true,"celtic.museum":true,"center.museum":true,"chattanooga.museum":true,"cheltenham.museum":true,"chesapeakebay.museum":true,"chicago.museum":true,"children.museum":true,"childrens.museum":true,"childrensgarden.museum":true,"chiropractic.museum":true,"chocolate.museum":true,"christiansburg.museum":true,"cincinnati.museum":true,"cinema.museum":true,"circus.museum":true,"civilisation.museum":true,"civilization.museum":true,"civilwar.museum":true,"clinton.museum":true,"clock.museum":true,"coal.museum":true,"coastaldefence.museum":true,"cody.museum":true,"coldwar.museum":true,"collection.museum":true,"colonialwilliamsburg.museum":true,"coloradoplateau.museum":true,"columbia.museum":true,"columbus.museum":true,"communication.museum":true,"communications.museum":true,"community.museum":true,"computer.museum":true,"computerhistory.museum":true,"xn--comunicaes-v6a2o.museum":true,"contemporary.museum":true,"contemporaryart.museum":true,"convent.museum":true,"copenhagen.museum":true,"corporation.museum":true,"xn--correios-e-telecomunicaes-ghc29a.museum":true,"corvette.museum":true,"costume.museum":true,"countryestate.museum":true,"county.museum":true,"crafts.museum":true,"cranbrook.museum":true,"creation.museum":true,"cultural.museum":true,"culturalcenter.museum":true,"culture.museum":true,"cyber.museum":true,"cymru.museum":true,"dali.museum":true,"dallas.museum":true,"database.museum":true,"ddr.museum":true,"decorativearts.museum":true,"delaware.museum":true,"delmenhorst.museum":true,"denmark.museum":true,"depot.museum":true,"design.museum":true,"detroit.museum":true,"dinosaur.museum":true,"discovery.museum":true,"dolls.museum":true,"donostia.museum":true,"durham.museum":true,"eastafrica.museum":true,"eastcoast.museum":true,"education.museum":true,"educational.museum":true,"egyptian.museum":true,"eisenbahn.museum":true,"elburg.museum":true,"elvendrell.museum":true,"embroidery.museum":true,"encyclopedic.museum":true,"england.museum":true,"entomology.museum":true,"environment.museum":true,"environmentalconservation.museum":true,"epilepsy.museum":true,"essex.museum":true,"estate.museum":true,"ethnology.museum":true,"exeter.museum":true,"exhibition.museum":true,"family.museum":true,"farm.museum":true,"farmequipment.museum":true,"farmers.museum":true,"farmstead.museum":true,"field.museum":true,"figueres.museum":true,"filatelia.museum":true,"film.museum":true,"fineart.museum":true,"finearts.museum":true,"finland.museum":true,"flanders.museum":true,"florida.museum":true,"force.museum":true,"fortmissoula.museum":true,"fortworth.museum":true,"foundation.museum":true,"francaise.museum":true,"frankfurt.museum":true,"franziskaner.museum":true,"freemasonry.museum":true,"freiburg.museum":true,"fribourg.museum":true,"frog.museum":true,"fundacio.museum":true,"furniture.museum":true,"gallery.museum":true,"garden.museum":true,"gateway.museum":true,"geelvinck.museum":true,"gemological.museum":true,"geology.museum":true,"georgia.museum":true,"giessen.museum":true,"glas.museum":true,"glass.museum":true,"gorge.museum":true,"grandrapids.museum":true,"graz.museum":true,"guernsey.museum":true,"halloffame.museum":true,"hamburg.museum":true,"handson.museum":true,"harvestcelebration.museum":true,"hawaii.museum":true,"health.museum":true,"heimatunduhren.museum":true,"hellas.museum":true,"helsinki.museum":true,"hembygdsforbund.museum":true,"heritage.museum":true,"histoire.museum":true,"historical.museum":true,"historicalsociety.museum":true,"historichouses.museum":true,"historisch.museum":true,"historisches.museum":true,"history.museum":true,"historyofscience.museum":true,"horology.museum":true,"house.museum":true,"humanities.museum":true,"illustration.museum":true,"imageandsound.museum":true,"indian.museum":true,"indiana.museum":true,"indianapolis.museum":true,"indianmarket.museum":true,"intelligence.museum":true,"interactive.museum":true,"iraq.museum":true,"iron.museum":true,"isleofman.museum":true,"jamison.museum":true,"jefferson.museum":true,"jerusalem.museum":true,"jewelry.museum":true,"jewish.museum":true,"jewishart.museum":true,"jfk.museum":true,"journalism.museum":true,"judaica.museum":true,"judygarland.museum":true,"juedisches.museum":true,"juif.museum":true,"karate.museum":true,"karikatur.museum":true,"kids.museum":true,"koebenhavn.museum":true,"koeln.museum":true,"kunst.museum":true,"kunstsammlung.museum":true,"kunstunddesign.museum":true,"labor.museum":true,"labour.museum":true,"lajolla.museum":true,"lancashire.museum":true,"landes.museum":true,"lans.museum":true,"xn--lns-qla.museum":true,"larsson.museum":true,"lewismiller.museum":true,"lincoln.museum":true,"linz.museum":true,"living.museum":true,"livinghistory.museum":true,"localhistory.museum":true,"london.museum":true,"losangeles.museum":true,"louvre.museum":true,"loyalist.museum":true,"lucerne.museum":true,"luxembourg.museum":true,"luzern.museum":true,"mad.museum":true,"madrid.museum":true,"mallorca.museum":true,"manchester.museum":true,"mansion.museum":true,"mansions.museum":true,"manx.museum":true,"marburg.museum":true,"maritime.museum":true,"maritimo.museum":true,"maryland.museum":true,"marylhurst.museum":true,"media.museum":true,"medical.museum":true,"medizinhistorisches.museum":true,"meeres.museum":true,"memorial.museum":true,"mesaverde.museum":true,"michigan.museum":true,"midatlantic.museum":true,"military.museum":true,"mill.museum":true,"miners.museum":true,"mining.museum":true,"minnesota.museum":true,"missile.museum":true,"missoula.museum":true,"modern.museum":true,"moma.museum":true,"money.museum":true,"monmouth.museum":true,"monticello.museum":true,"montreal.museum":true,"moscow.museum":true,"motorcycle.museum":true,"muenchen.museum":true,"muenster.museum":true,"mulhouse.museum":true,"muncie.museum":true,"museet.museum":true,"museumcenter.museum":true,"museumvereniging.museum":true,"music.museum":true,"national.museum":true,"nationalfirearms.museum":true,"nationalheritage.museum":true,"nativeamerican.museum":true,"naturalhistory.museum":true,"naturalhistorymuseum.museum":true,"naturalsciences.museum":true,"nature.museum":true,"naturhistorisches.museum":true,"natuurwetenschappen.museum":true,"naumburg.museum":true,"naval.museum":true,"nebraska.museum":true,"neues.museum":true,"newhampshire.museum":true,"newjersey.museum":true,"newmexico.museum":true,"newport.museum":true,"newspaper.museum":true,"newyork.museum":true,"niepce.museum":true,"norfolk.museum":true,"north.museum":true,"nrw.museum":true,"nuernberg.museum":true,"nuremberg.museum":true,"nyc.museum":true,"nyny.museum":true,"oceanographic.museum":true,"oceanographique.museum":true,"omaha.museum":true,"online.museum":true,"ontario.museum":true,"openair.museum":true,"oregon.museum":true,"oregontrail.museum":true,"otago.museum":true,"oxford.museum":true,"pacific.museum":true,"paderborn.museum":true,"palace.museum":true,"paleo.museum":true,"palmsprings.museum":true,"panama.museum":true,"paris.museum":true,"pasadena.museum":true,"pharmacy.museum":true,"philadelphia.museum":true,"philadelphiaarea.museum":true,"philately.museum":true,"phoenix.museum":true,"photography.museum":true,"pilots.museum":true,"pittsburgh.museum":true,"planetarium.museum":true,"plantation.museum":true,"plants.museum":true,"plaza.museum":true,"portal.museum":true,"portland.museum":true,"portlligat.museum":true,"posts-and-telecommunications.museum":true,"preservation.museum":true,"presidio.museum":true,"press.museum":true,"project.museum":true,"public.museum":true,"pubol.museum":true,"quebec.museum":true,"railroad.museum":true,"railway.museum":true,"research.museum":true,"resistance.museum":true,"riodejaneiro.museum":true,"rochester.museum":true,"rockart.museum":true,"roma.museum":true,"russia.museum":true,"saintlouis.museum":true,"salem.museum":true,"salvadordali.museum":true,"salzburg.museum":true,"sandiego.museum":true,"sanfrancisco.museum":true,"santabarbara.museum":true,"santacruz.museum":true,"santafe.museum":true,"saskatchewan.museum":true,"satx.museum":true,"savannahga.museum":true,"schlesisches.museum":true,"schoenbrunn.museum":true,"schokoladen.museum":true,"school.museum":true,"schweiz.museum":true,"science.museum":true,"scienceandhistory.museum":true,"scienceandindustry.museum":true,"sciencecenter.museum":true,"sciencecenters.museum":true,"science-fiction.museum":true,"sciencehistory.museum":true,"sciences.museum":true,"sciencesnaturelles.museum":true,"scotland.museum":true,"seaport.museum":true,"settlement.museum":true,"settlers.museum":true,"shell.museum":true,"sherbrooke.museum":true,"sibenik.museum":true,"silk.museum":true,"ski.museum":true,"skole.museum":true,"society.museum":true,"sologne.museum":true,"soundandvision.museum":true,"southcarolina.museum":true,"southwest.museum":true,"space.museum":true,"spy.museum":true,"square.museum":true,"stadt.museum":true,"stalbans.museum":true,"starnberg.museum":true,"state.museum":true,"stateofdelaware.museum":true,"station.museum":true,"steam.museum":true,"steiermark.museum":true,"stjohn.museum":true,"stockholm.museum":true,"stpetersburg.museum":true,"stuttgart.museum":true,"suisse.museum":true,"surgeonshall.museum":true,"surrey.museum":true,"svizzera.museum":true,"sweden.museum":true,"sydney.museum":true,"tank.museum":true,"tcm.museum":true,"technology.museum":true,"telekommunikation.museum":true,"television.museum":true,"texas.museum":true,"textile.museum":true,"theater.museum":true,"time.museum":true,"timekeeping.museum":true,"topology.museum":true,"torino.museum":true,"touch.museum":true,"town.museum":true,"transport.museum":true,"tree.museum":true,"trolley.museum":true,"trust.museum":true,"trustee.museum":true,"uhren.museum":true,"ulm.museum":true,"undersea.museum":true,"university.museum":true,"usa.museum":true,"usantiques.museum":true,"usarts.museum":true,"uscountryestate.museum":true,"usculture.museum":true,"usdecorativearts.museum":true,"usgarden.museum":true,"ushistory.museum":true,"ushuaia.museum":true,"uslivinghistory.museum":true,"utah.museum":true,"uvic.museum":true,"valley.museum":true,"vantaa.museum":true,"versailles.museum":true,"viking.museum":true,"village.museum":true,"virginia.museum":true,"virtual.museum":true,"virtuel.museum":true,"vlaanderen.museum":true,"volkenkunde.museum":true,"wales.museum":true,"wallonie.museum":true,"war.museum":true,"washingtondc.museum":true,"watchandclock.museum":true,"watch-and-clock.museum":true,"western.museum":true,"westfalen.museum":true,"whaling.museum":true,"wildlife.museum":true,"williamsburg.museum":true,"windmill.museum":true,"workshop.museum":true,"york.museum":true,"yorkshire.museum":true,"yosemite.museum":true,"youth.museum":true,"zoological.museum":true,"zoology.museum":true,"xn--9dbhblg6di.museum":true,"xn--h1aegh.museum":true,"mv":true,"aero.mv":true,"biz.mv":true,"com.mv":true,"coop.mv":true,"edu.mv":true,"gov.mv":true,"info.mv":true,"int.mv":true,"mil.mv":true,"museum.mv":true,"name.mv":true,"net.mv":true,"org.mv":true,"pro.mv":true,"mw":true,"ac.mw":true,"biz.mw":true,"co.mw":true,"com.mw":true,"coop.mw":true,"edu.mw":true,"gov.mw":true,"int.mw":true,"museum.mw":true,"net.mw":true,"org.mw":true,"mx":true,"com.mx":true,"org.mx":true,"gob.mx":true,"edu.mx":true,"net.mx":true,"my":true,"com.my":true,"net.my":true,"org.my":true,"gov.my":true,"edu.my":true,"mil.my":true,"name.my":true,"*.mz":true,"na":true,"info.na":true,"pro.na":true,"name.na":true,"school.na":true,"or.na":true,"dr.na":true,"us.na":true,"mx.na":true,"ca.na":true,"in.na":true,"cc.na":true,"tv.na":true,"ws.na":true,"mobi.na":true,"co.na":true,"com.na":true,"org.na":true,"name":true,"nc":true,"asso.nc":true,"ne":true,"net":true,"nf":true,"com.nf":true,"net.nf":true,"per.nf":true,"rec.nf":true,"web.nf":true,"arts.nf":true,"firm.nf":true,"info.nf":true,"other.nf":true,"store.nf":true,"ac.ng":true,"com.ng":true,"edu.ng":true,"gov.ng":true,"net.ng":true,"org.ng":true,"*.ni":true,"nl":true,"bv.nl":true,"no":true,"fhs.no":true,"vgs.no":true,"fylkesbibl.no":true,"folkebibl.no":true,"museum.no":true,"idrett.no":true,"priv.no":true,"mil.no":true,"stat.no":true,"dep.no":true,"kommune.no":true,"herad.no":true,"aa.no":true,"ah.no":true,"bu.no":true,"fm.no":true,"hl.no":true,"hm.no":true,"jan-mayen.no":true,"mr.no":true,"nl.no":true,"nt.no":true,"of.no":true,"ol.no":true,"oslo.no":true,"rl.no":true,"sf.no":true,"st.no":true,"svalbard.no":true,"tm.no":true,"tr.no":true,"va.no":true,"vf.no":true,"gs.aa.no":true,"gs.ah.no":true,"gs.bu.no":true,"gs.fm.no":true,"gs.hl.no":true,"gs.hm.no":true,"gs.jan-mayen.no":true,"gs.mr.no":true,"gs.nl.no":true,"gs.nt.no":true,"gs.of.no":true,"gs.ol.no":true,"gs.oslo.no":true,"gs.rl.no":true,"gs.sf.no":true,"gs.st.no":true,"gs.svalbard.no":true,"gs.tm.no":true,"gs.tr.no":true,"gs.va.no":true,"gs.vf.no":true,"akrehamn.no":true,"xn--krehamn-dxa.no":true,"algard.no":true,"xn--lgrd-poac.no":true,"arna.no":true,"brumunddal.no":true,"bryne.no":true,"bronnoysund.no":true,"xn--brnnysund-m8ac.no":true,"drobak.no":true,"xn--drbak-wua.no":true,"egersund.no":true,"fetsund.no":true,"floro.no":true,"xn--flor-jra.no":true,"fredrikstad.no":true,"hokksund.no":true,"honefoss.no":true,"xn--hnefoss-q1a.no":true,"jessheim.no":true,"jorpeland.no":true,"xn--jrpeland-54a.no":true,"kirkenes.no":true,"kopervik.no":true,"krokstadelva.no":true,"langevag.no":true,"xn--langevg-jxa.no":true,"leirvik.no":true,"mjondalen.no":true,"xn--mjndalen-64a.no":true,"mo-i-rana.no":true,"mosjoen.no":true,"xn--mosjen-eya.no":true,"nesoddtangen.no":true,"orkanger.no":true,"osoyro.no":true,"xn--osyro-wua.no":true,"raholt.no":true,"xn--rholt-mra.no":true,"sandnessjoen.no":true,"xn--sandnessjen-ogb.no":true,"skedsmokorset.no":true,"slattum.no":true,"spjelkavik.no":true,"stathelle.no":true,"stavern.no":true,"stjordalshalsen.no":true,"xn--stjrdalshalsen-sqb.no":true,"tananger.no":true,"tranby.no":true,"vossevangen.no":true,"afjord.no":true,"xn--fjord-lra.no":true,"agdenes.no":true,"al.no":true,"xn--l-1fa.no":true,"alesund.no":true,"xn--lesund-hua.no":true,"alstahaug.no":true,"alta.no":true,"xn--lt-liac.no":true,"alaheadju.no":true,"xn--laheadju-7ya.no":true,"alvdal.no":true,"amli.no":true,"xn--mli-tla.no":true,"amot.no":true,"xn--mot-tla.no":true,"andebu.no":true,"andoy.no":true,"xn--andy-ira.no":true,"andasuolo.no":true,"ardal.no":true,"xn--rdal-poa.no":true,"aremark.no":true,"arendal.no":true,"xn--s-1fa.no":true,"aseral.no":true,"xn--seral-lra.no":true,"asker.no":true,"askim.no":true,"askvoll.no":true,"askoy.no":true,"xn--asky-ira.no":true,"asnes.no":true,"xn--snes-poa.no":true,"audnedaln.no":true,"aukra.no":true,"aure.no":true,"aurland.no":true,"aurskog-holand.no":true,"xn--aurskog-hland-jnb.no":true,"austevoll.no":true,"austrheim.no":true,"averoy.no":true,"xn--avery-yua.no":true,"balestrand.no":true,"ballangen.no":true,"balat.no":true,"xn--blt-elab.no":true,"balsfjord.no":true,"bahccavuotna.no":true,"xn--bhccavuotna-k7a.no":true,"bamble.no":true,"bardu.no":true,"beardu.no":true,"beiarn.no":true,"bajddar.no":true,"xn--bjddar-pta.no":true,"baidar.no":true,"xn--bidr-5nac.no":true,"berg.no":true,"bergen.no":true,"berlevag.no":true,"xn--berlevg-jxa.no":true,"bearalvahki.no":true,"xn--bearalvhki-y4a.no":true,"bindal.no":true,"birkenes.no":true,"bjarkoy.no":true,"xn--bjarky-fya.no":true,"bjerkreim.no":true,"bjugn.no":true,"bodo.no":true,"xn--bod-2na.no":true,"badaddja.no":true,"xn--bdddj-mrabd.no":true,"budejju.no":true,"bokn.no":true,"bremanger.no":true,"bronnoy.no":true,"xn--brnny-wuac.no":true,"bygland.no":true,"bykle.no":true,"barum.no":true,"xn--brum-voa.no":true,"bo.telemark.no":true,"xn--b-5ga.telemark.no":true,"bo.nordland.no":true,"xn--b-5ga.nordland.no":true,"bievat.no":true,"xn--bievt-0qa.no":true,"bomlo.no":true,"xn--bmlo-gra.no":true,"batsfjord.no":true,"xn--btsfjord-9za.no":true,"bahcavuotna.no":true,"xn--bhcavuotna-s4a.no":true,"dovre.no":true,"drammen.no":true,"drangedal.no":true,"dyroy.no":true,"xn--dyry-ira.no":true,"donna.no":true,"xn--dnna-gra.no":true,"eid.no":true,"eidfjord.no":true,"eidsberg.no":true,"eidskog.no":true,"eidsvoll.no":true,"eigersund.no":true,"elverum.no":true,"enebakk.no":true,"engerdal.no":true,"etne.no":true,"etnedal.no":true,"evenes.no":true,"evenassi.no":true,"xn--eveni-0qa01ga.no":true,"evje-og-hornnes.no":true,"farsund.no":true,"fauske.no":true,"fuossko.no":true,"fuoisku.no":true,"fedje.no":true,"fet.no":true,"finnoy.no":true,"xn--finny-yua.no":true,"fitjar.no":true,"fjaler.no":true,"fjell.no":true,"flakstad.no":true,"flatanger.no":true,"flekkefjord.no":true,"flesberg.no":true,"flora.no":true,"fla.no":true,"xn--fl-zia.no":true,"folldal.no":true,"forsand.no":true,"fosnes.no":true,"frei.no":true,"frogn.no":true,"froland.no":true,"frosta.no":true,"frana.no":true,"xn--frna-woa.no":true,"froya.no":true,"xn--frya-hra.no":true,"fusa.no":true,"fyresdal.no":true,"forde.no":true,"xn--frde-gra.no":true,"gamvik.no":true,"gangaviika.no":true,"xn--ggaviika-8ya47h.no":true,"gaular.no":true,"gausdal.no":true,"gildeskal.no":true,"xn--gildeskl-g0a.no":true,"giske.no":true,"gjemnes.no":true,"gjerdrum.no":true,"gjerstad.no":true,"gjesdal.no":true,"gjovik.no":true,"xn--gjvik-wua.no":true,"gloppen.no":true,"gol.no":true,"gran.no":true,"grane.no":true,"granvin.no":true,"gratangen.no":true,"grimstad.no":true,"grong.no":true,"kraanghke.no":true,"xn--kranghke-b0a.no":true,"grue.no":true,"gulen.no":true,"hadsel.no":true,"halden.no":true,"halsa.no":true,"hamar.no":true,"hamaroy.no":true,"habmer.no":true,"xn--hbmer-xqa.no":true,"hapmir.no":true,"xn--hpmir-xqa.no":true,"hammerfest.no":true,"hammarfeasta.no":true,"xn--hmmrfeasta-s4ac.no":true,"haram.no":true,"hareid.no":true,"harstad.no":true,"hasvik.no":true,"aknoluokta.no":true,"xn--koluokta-7ya57h.no":true,"hattfjelldal.no":true,"aarborte.no":true,"haugesund.no":true,"hemne.no":true,"hemnes.no":true,"hemsedal.no":true,"heroy.more-og-romsdal.no":true,"xn--hery-ira.xn--mre-og-romsdal-qqb.no":true,"heroy.nordland.no":true,"xn--hery-ira.nordland.no":true,"hitra.no":true,"hjartdal.no":true,"hjelmeland.no":true,"hobol.no":true,"xn--hobl-ira.no":true,"hof.no":true,"hol.no":true,"hole.no":true,"holmestrand.no":true,"holtalen.no":true,"xn--holtlen-hxa.no":true,"hornindal.no":true,"horten.no":true,"hurdal.no":true,"hurum.no":true,"hvaler.no":true,"hyllestad.no":true,"hagebostad.no":true,"xn--hgebostad-g3a.no":true,"hoyanger.no":true,"xn--hyanger-q1a.no":true,"hoylandet.no":true,"xn--hylandet-54a.no":true,"ha.no":true,"xn--h-2fa.no":true,"ibestad.no":true,"inderoy.no":true,"xn--indery-fya.no":true,"iveland.no":true,"jevnaker.no":true,"jondal.no":true,"jolster.no":true,"xn--jlster-bya.no":true,"karasjok.no":true,"karasjohka.no":true,"xn--krjohka-hwab49j.no":true,"karlsoy.no":true,"galsa.no":true,"xn--gls-elac.no":true,"karmoy.no":true,"xn--karmy-yua.no":true,"kautokeino.no":true,"guovdageaidnu.no":true,"klepp.no":true,"klabu.no":true,"xn--klbu-woa.no":true,"kongsberg.no":true,"kongsvinger.no":true,"kragero.no":true,"xn--krager-gya.no":true,"kristiansand.no":true,"kristiansund.no":true,"krodsherad.no":true,"xn--krdsherad-m8a.no":true,"kvalsund.no":true,"rahkkeravju.no":true,"xn--rhkkervju-01af.no":true,"kvam.no":true,"kvinesdal.no":true,"kvinnherad.no":true,"kviteseid.no":true,"kvitsoy.no":true,"xn--kvitsy-fya.no":true,"kvafjord.no":true,"xn--kvfjord-nxa.no":true,"giehtavuoatna.no":true,"kvanangen.no":true,"xn--kvnangen-k0a.no":true,"navuotna.no":true,"xn--nvuotna-hwa.no":true,"kafjord.no":true,"xn--kfjord-iua.no":true,"gaivuotna.no":true,"xn--givuotna-8ya.no":true,"larvik.no":true,"lavangen.no":true,"lavagis.no":true,"loabat.no":true,"xn--loabt-0qa.no":true,"lebesby.no":true,"davvesiida.no":true,"leikanger.no":true,"leirfjord.no":true,"leka.no":true,"leksvik.no":true,"lenvik.no":true,"leangaviika.no":true,"xn--leagaviika-52b.no":true,"lesja.no":true,"levanger.no":true,"lier.no":true,"lierne.no":true,"lillehammer.no":true,"lillesand.no":true,"lindesnes.no":true,"lindas.no":true,"xn--linds-pra.no":true,"lom.no":true,"loppa.no":true,"lahppi.no":true,"xn--lhppi-xqa.no":true,"lund.no":true,"lunner.no":true,"luroy.no":true,"xn--lury-ira.no":true,"luster.no":true,"lyngdal.no":true,"lyngen.no":true,"ivgu.no":true,"lardal.no":true,"lerdal.no":true,"xn--lrdal-sra.no":true,"lodingen.no":true,"xn--ldingen-q1a.no":true,"lorenskog.no":true,"xn--lrenskog-54a.no":true,"loten.no":true,"xn--lten-gra.no":true,"malvik.no":true,"masoy.no":true,"xn--msy-ula0h.no":true,"muosat.no":true,"xn--muost-0qa.no":true,"mandal.no":true,"marker.no":true,"marnardal.no":true,"masfjorden.no":true,"meland.no":true,"meldal.no":true,"melhus.no":true,"meloy.no":true,"xn--mely-ira.no":true,"meraker.no":true,"xn--merker-kua.no":true,"moareke.no":true,"xn--moreke-jua.no":true,"midsund.no":true,"midtre-gauldal.no":true,"modalen.no":true,"modum.no":true,"molde.no":true,"moskenes.no":true,"moss.no":true,"mosvik.no":true,"malselv.no":true,"xn--mlselv-iua.no":true,"malatvuopmi.no":true,"xn--mlatvuopmi-s4a.no":true,"namdalseid.no":true,"aejrie.no":true,"namsos.no":true,"namsskogan.no":true,"naamesjevuemie.no":true,"xn--nmesjevuemie-tcba.no":true,"laakesvuemie.no":true,"nannestad.no":true,"narvik.no":true,"narviika.no":true,"naustdal.no":true,"nedre-eiker.no":true,"nes.akershus.no":true,"nes.buskerud.no":true,"nesna.no":true,"nesodden.no":true,"nesseby.no":true,"unjarga.no":true,"xn--unjrga-rta.no":true,"nesset.no":true,"nissedal.no":true,"nittedal.no":true,"nord-aurdal.no":true,"nord-fron.no":true,"nord-odal.no":true,"norddal.no":true,"nordkapp.no":true,"davvenjarga.no":true,"xn--davvenjrga-y4a.no":true,"nordre-land.no":true,"nordreisa.no":true,"raisa.no":true,"xn--risa-5na.no":true,"nore-og-uvdal.no":true,"notodden.no":true,"naroy.no":true,"xn--nry-yla5g.no":true,"notteroy.no":true,"xn--nttery-byae.no":true,"odda.no":true,"oksnes.no":true,"xn--ksnes-uua.no":true,"oppdal.no":true,"oppegard.no":true,"xn--oppegrd-ixa.no":true,"orkdal.no":true,"orland.no":true,"xn--rland-uua.no":true,"orskog.no":true,"xn--rskog-uua.no":true,"orsta.no":true,"xn--rsta-fra.no":true,"os.hedmark.no":true,"os.hordaland.no":true,"osen.no":true,"osteroy.no":true,"xn--ostery-fya.no":true,"ostre-toten.no":true,"xn--stre-toten-zcb.no":true,"overhalla.no":true,"ovre-eiker.no":true,"xn--vre-eiker-k8a.no":true,"oyer.no":true,"xn--yer-zna.no":true,"oygarden.no":true,"xn--ygarden-p1a.no":true,"oystre-slidre.no":true,"xn--ystre-slidre-ujb.no":true,"porsanger.no":true,"porsangu.no":true,"xn--porsgu-sta26f.no":true,"porsgrunn.no":true,"radoy.no":true,"xn--rady-ira.no":true,"rakkestad.no":true,"rana.no":true,"ruovat.no":true,"randaberg.no":true,"rauma.no":true,"rendalen.no":true,"rennebu.no":true,"rennesoy.no":true,"xn--rennesy-v1a.no":true,"rindal.no":true,"ringebu.no":true,"ringerike.no":true,"ringsaker.no":true,"rissa.no":true,"risor.no":true,"xn--risr-ira.no":true,"roan.no":true,"rollag.no":true,"rygge.no":true,"ralingen.no":true,"xn--rlingen-mxa.no":true,"rodoy.no":true,"xn--rdy-0nab.no":true,"romskog.no":true,"xn--rmskog-bya.no":true,"roros.no":true,"xn--rros-gra.no":true,"rost.no":true,"xn--rst-0na.no":true,"royken.no":true,"xn--ryken-vua.no":true,"royrvik.no":true,"xn--ryrvik-bya.no":true,"rade.no":true,"xn--rde-ula.no":true,"salangen.no":true,"siellak.no":true,"saltdal.no":true,"salat.no":true,"xn--slt-elab.no":true,"xn--slat-5na.no":true,"samnanger.no":true,"sande.more-og-romsdal.no":true,"sande.xn--mre-og-romsdal-qqb.no":true,"sande.vestfold.no":true,"sandefjord.no":true,"sandnes.no":true,"sandoy.no":true,"xn--sandy-yua.no":true,"sarpsborg.no":true,"sauda.no":true,"sauherad.no":true,"sel.no":true,"selbu.no":true,"selje.no":true,"seljord.no":true,"sigdal.no":true,"siljan.no":true,"sirdal.no":true,"skaun.no":true,"skedsmo.no":true,"ski.no":true,"skien.no":true,"skiptvet.no":true,"skjervoy.no":true,"xn--skjervy-v1a.no":true,"skierva.no":true,"xn--skierv-uta.no":true,"skjak.no":true,"xn--skjk-soa.no":true,"skodje.no":true,"skanland.no":true,"xn--sknland-fxa.no":true,"skanit.no":true,"xn--sknit-yqa.no":true,"smola.no":true,"xn--smla-hra.no":true,"snillfjord.no":true,"snasa.no":true,"xn--snsa-roa.no":true,"snoasa.no":true,"snaase.no":true,"xn--snase-nra.no":true,"sogndal.no":true,"sokndal.no":true,"sola.no":true,"solund.no":true,"songdalen.no":true,"sortland.no":true,"spydeberg.no":true,"stange.no":true,"stavanger.no":true,"steigen.no":true,"steinkjer.no":true,"stjordal.no":true,"xn--stjrdal-s1a.no":true,"stokke.no":true,"stor-elvdal.no":true,"stord.no":true,"stordal.no":true,"storfjord.no":true,"omasvuotna.no":true,"strand.no":true,"stranda.no":true,"stryn.no":true,"sula.no":true,"suldal.no":true,"sund.no":true,"sunndal.no":true,"surnadal.no":true,"sveio.no":true,"svelvik.no":true,"sykkylven.no":true,"sogne.no":true,"xn--sgne-gra.no":true,"somna.no":true,"xn--smna-gra.no":true,"sondre-land.no":true,"xn--sndre-land-0cb.no":true,"sor-aurdal.no":true,"xn--sr-aurdal-l8a.no":true,"sor-fron.no":true,"xn--sr-fron-q1a.no":true,"sor-odal.no":true,"xn--sr-odal-q1a.no":true,"sor-varanger.no":true,"xn--sr-varanger-ggb.no":true,"matta-varjjat.no":true,"xn--mtta-vrjjat-k7af.no":true,"sorfold.no":true,"xn--srfold-bya.no":true,"sorreisa.no":true,"xn--srreisa-q1a.no":true,"sorum.no":true,"xn--srum-gra.no":true,"tana.no":true,"deatnu.no":true,"time.no":true,"tingvoll.no":true,"tinn.no":true,"tjeldsund.no":true,"dielddanuorri.no":true,"tjome.no":true,"xn--tjme-hra.no":true,"tokke.no":true,"tolga.no":true,"torsken.no":true,"tranoy.no":true,"xn--trany-yua.no":true,"tromso.no":true,"xn--troms-zua.no":true,"tromsa.no":true,"romsa.no":true,"trondheim.no":true,"troandin.no":true,"trysil.no":true,"trana.no":true,"xn--trna-woa.no":true,"trogstad.no":true,"xn--trgstad-r1a.no":true,"tvedestrand.no":true,"tydal.no":true,"tynset.no":true,"tysfjord.no":true,"divtasvuodna.no":true,"divttasvuotna.no":true,"tysnes.no":true,"tysvar.no":true,"xn--tysvr-vra.no":true,"tonsberg.no":true,"xn--tnsberg-q1a.no":true,"ullensaker.no":true,"ullensvang.no":true,"ulvik.no":true,"utsira.no":true,"vadso.no":true,"xn--vads-jra.no":true,"cahcesuolo.no":true,"xn--hcesuolo-7ya35b.no":true,"vaksdal.no":true,"valle.no":true,"vang.no":true,"vanylven.no":true,"vardo.no":true,"xn--vard-jra.no":true,"varggat.no":true,"xn--vrggt-xqad.no":true,"vefsn.no":true,"vaapste.no":true,"vega.no":true,"vegarshei.no":true,"xn--vegrshei-c0a.no":true,"vennesla.no":true,"verdal.no":true,"verran.no":true,"vestby.no":true,"vestnes.no":true,"vestre-slidre.no":true,"vestre-toten.no":true,"vestvagoy.no":true,"xn--vestvgy-ixa6o.no":true,"vevelstad.no":true,"vik.no":true,"vikna.no":true,"vindafjord.no":true,"volda.no":true,"voss.no":true,"varoy.no":true,"xn--vry-yla5g.no":true,"vagan.no":true,"xn--vgan-qoa.no":true,"voagat.no":true,"vagsoy.no":true,"xn--vgsy-qoa0j.no":true,"vaga.no":true,"xn--vg-yiab.no":true,"valer.ostfold.no":true,"xn--vler-qoa.xn--stfold-9xa.no":true,"valer.hedmark.no":true,"xn--vler-qoa.hedmark.no":true,"*.np":true,"nr":true,"biz.nr":true,"info.nr":true,"gov.nr":true,"edu.nr":true,"org.nr":true,"net.nr":true,"com.nr":true,"nu":true,"*.nz":true,"*.om":true,"mediaphone.om":false,"nawrastelecom.om":false,"nawras.om":false,"omanmobile.om":false,"omanpost.om":false,"omantel.om":false,"rakpetroleum.om":false,"siemens.om":false,"songfest.om":false,"statecouncil.om":false,"org":true,"pa":true,"ac.pa":true,"gob.pa":true,"com.pa":true,"org.pa":true,"sld.pa":true,"edu.pa":true,"net.pa":true,"ing.pa":true,"abo.pa":true,"med.pa":true,"nom.pa":true,"pe":true,"edu.pe":true,"gob.pe":true,"nom.pe":true,"mil.pe":true,"org.pe":true,"com.pe":true,"net.pe":true,"pf":true,"com.pf":true,"org.pf":true,"edu.pf":true,"*.pg":true,"ph":true,"com.ph":true,"net.ph":true,"org.ph":true,"gov.ph":true,"edu.ph":true,"ngo.ph":true,"mil.ph":true,"i.ph":true,"pk":true,"com.pk":true,"net.pk":true,"edu.pk":true,"org.pk":true,"fam.pk":true,"biz.pk":true,"web.pk":true,"gov.pk":true,"gob.pk":true,"gok.pk":true,"gon.pk":true,"gop.pk":true,"gos.pk":true,"info.pk":true,"pl":true,"aid.pl":true,"agro.pl":true,"atm.pl":true,"auto.pl":true,"biz.pl":true,"com.pl":true,"edu.pl":true,"gmina.pl":true,"gsm.pl":true,"info.pl":true,"mail.pl":true,"miasta.pl":true,"media.pl":true,"mil.pl":true,"net.pl":true,"nieruchomosci.pl":true,"nom.pl":true,"org.pl":true,"pc.pl":true,"powiat.pl":true,"priv.pl":true,"realestate.pl":true,"rel.pl":true,"sex.pl":true,"shop.pl":true,"sklep.pl":true,"sos.pl":true,"szkola.pl":true,"targi.pl":true,"tm.pl":true,"tourism.pl":true,"travel.pl":true,"turystyka.pl":true,"6bone.pl":true,"art.pl":true,"mbone.pl":true,"gov.pl":true,"uw.gov.pl":true,"um.gov.pl":true,"ug.gov.pl":true,"upow.gov.pl":true,"starostwo.gov.pl":true,"so.gov.pl":true,"sr.gov.pl":true,"po.gov.pl":true,"pa.gov.pl":true,"ngo.pl":true,"irc.pl":true,"usenet.pl":true,"augustow.pl":true,"babia-gora.pl":true,"bedzin.pl":true,"beskidy.pl":true,"bialowieza.pl":true,"bialystok.pl":true,"bielawa.pl":true,"bieszczady.pl":true,"boleslawiec.pl":true,"bydgoszcz.pl":true,"bytom.pl":true,"cieszyn.pl":true,"czeladz.pl":true,"czest.pl":true,"dlugoleka.pl":true,"elblag.pl":true,"elk.pl":true,"glogow.pl":true,"gniezno.pl":true,"gorlice.pl":true,"grajewo.pl":true,"ilawa.pl":true,"jaworzno.pl":true,"jelenia-gora.pl":true,"jgora.pl":true,"kalisz.pl":true,"kazimierz-dolny.pl":true,"karpacz.pl":true,"kartuzy.pl":true,"kaszuby.pl":true,"katowice.pl":true,"kepno.pl":true,"ketrzyn.pl":true,"klodzko.pl":true,"kobierzyce.pl":true,"kolobrzeg.pl":true,"konin.pl":true,"konskowola.pl":true,"kutno.pl":true,"lapy.pl":true,"lebork.pl":true,"legnica.pl":true,"lezajsk.pl":true,"limanowa.pl":true,"lomza.pl":true,"lowicz.pl":true,"lubin.pl":true,"lukow.pl":true,"malbork.pl":true,"malopolska.pl":true,"mazowsze.pl":true,"mazury.pl":true,"mielec.pl":true,"mielno.pl":true,"mragowo.pl":true,"naklo.pl":true,"nowaruda.pl":true,"nysa.pl":true,"olawa.pl":true,"olecko.pl":true,"olkusz.pl":true,"olsztyn.pl":true,"opoczno.pl":true,"opole.pl":true,"ostroda.pl":true,"ostroleka.pl":true,"ostrowiec.pl":true,"ostrowwlkp.pl":true,"pila.pl":true,"pisz.pl":true,"podhale.pl":true,"podlasie.pl":true,"polkowice.pl":true,"pomorze.pl":true,"pomorskie.pl":true,"prochowice.pl":true,"pruszkow.pl":true,"przeworsk.pl":true,"pulawy.pl":true,"radom.pl":true,"rawa-maz.pl":true,"rybnik.pl":true,"rzeszow.pl":true,"sanok.pl":true,"sejny.pl":true,"siedlce.pl":true,"slask.pl":true,"slupsk.pl":true,"sosnowiec.pl":true,"stalowa-wola.pl":true,"skoczow.pl":true,"starachowice.pl":true,"stargard.pl":true,"suwalki.pl":true,"swidnica.pl":true,"swiebodzin.pl":true,"swinoujscie.pl":true,"szczecin.pl":true,"szczytno.pl":true,"tarnobrzeg.pl":true,"tgory.pl":true,"turek.pl":true,"tychy.pl":true,"ustka.pl":true,"walbrzych.pl":true,"warmia.pl":true,"warszawa.pl":true,"waw.pl":true,"wegrow.pl":true,"wielun.pl":true,"wlocl.pl":true,"wloclawek.pl":true,"wodzislaw.pl":true,"wolomin.pl":true,"wroclaw.pl":true,"zachpomor.pl":true,"zagan.pl":true,"zarow.pl":true,"zgora.pl":true,"zgorzelec.pl":true,"gda.pl":true,"gdansk.pl":true,"gdynia.pl":true,"med.pl":true,"sopot.pl":true,"gliwice.pl":true,"krakow.pl":true,"poznan.pl":true,"wroc.pl":true,"zakopane.pl":true,"pm":true,"pn":true,"gov.pn":true,"co.pn":true,"org.pn":true,"edu.pn":true,"net.pn":true,"pr":true,"com.pr":true,"net.pr":true,"org.pr":true,"gov.pr":true,"edu.pr":true,"isla.pr":true,"pro.pr":true,"biz.pr":true,"info.pr":true,"name.pr":true,"est.pr":true,"prof.pr":true,"ac.pr":true,"pro":true,"aca.pro":true,"bar.pro":true,"cpa.pro":true,"jur.pro":true,"law.pro":true,"med.pro":true,"eng.pro":true,"ps":true,"edu.ps":true,"gov.ps":true,"sec.ps":true,"plo.ps":true,"com.ps":true,"org.ps":true,"net.ps":true,"pt":true,"net.pt":true,"gov.pt":true,"org.pt":true,"edu.pt":true,"int.pt":true,"publ.pt":true,"com.pt":true,"nome.pt":true,"pw":true,"co.pw":true,"ne.pw":true,"or.pw":true,"ed.pw":true,"go.pw":true,"belau.pw":true,"*.py":true,"qa":true,"com.qa":true,"edu.qa":true,"gov.qa":true,"mil.qa":true,"name.qa":true,"net.qa":true,"org.qa":true,"sch.qa":true,"re":true,"com.re":true,"asso.re":true,"nom.re":true,"ro":true,"com.ro":true,"org.ro":true,"tm.ro":true,"nt.ro":true,"nom.ro":true,"info.ro":true,"rec.ro":true,"arts.ro":true,"firm.ro":true,"store.ro":true,"www.ro":true,"rs":true,"co.rs":true,"org.rs":true,"edu.rs":true,"ac.rs":true,"gov.rs":true,"in.rs":true,"ru":true,"ac.ru":true,"com.ru":true,"edu.ru":true,"int.ru":true,"net.ru":true,"org.ru":true,"pp.ru":true,"adygeya.ru":true,"altai.ru":true,"amur.ru":true,"arkhangelsk.ru":true,"astrakhan.ru":true,"bashkiria.ru":true,"belgorod.ru":true,"bir.ru":true,"bryansk.ru":true,"buryatia.ru":true,"cbg.ru":true,"chel.ru":true,"chelyabinsk.ru":true,"chita.ru":true,"chukotka.ru":true,"chuvashia.ru":true,"dagestan.ru":true,"dudinka.ru":true,"e-burg.ru":true,"grozny.ru":true,"irkutsk.ru":true,"ivanovo.ru":true,"izhevsk.ru":true,"jar.ru":true,"joshkar-ola.ru":true,"kalmykia.ru":true,"kaluga.ru":true,"kamchatka.ru":true,"karelia.ru":true,"kazan.ru":true,"kchr.ru":true,"kemerovo.ru":true,"khabarovsk.ru":true,"khakassia.ru":true,"khv.ru":true,"kirov.ru":true,"koenig.ru":true,"komi.ru":true,"kostroma.ru":true,"krasnoyarsk.ru":true,"kuban.ru":true,"kurgan.ru":true,"kursk.ru":true,"lipetsk.ru":true,"magadan.ru":true,"mari.ru":true,"mari-el.ru":true,"marine.ru":true,"mordovia.ru":true,"mosreg.ru":true,"msk.ru":true,"murmansk.ru":true,"nalchik.ru":true,"nnov.ru":true,"nov.ru":true,"novosibirsk.ru":true,"nsk.ru":true,"omsk.ru":true,"orenburg.ru":true,"oryol.ru":true,"palana.ru":true,"penza.ru":true,"perm.ru":true,"pskov.ru":true,"ptz.ru":true,"rnd.ru":true,"ryazan.ru":true,"sakhalin.ru":true,"samara.ru":true,"saratov.ru":true,"simbirsk.ru":true,"smolensk.ru":true,"spb.ru":true,"stavropol.ru":true,"stv.ru":true,"surgut.ru":true,"tambov.ru":true,"tatarstan.ru":true,"tom.ru":true,"tomsk.ru":true,"tsaritsyn.ru":true,"tsk.ru":true,"tula.ru":true,"tuva.ru":true,"tver.ru":true,"tyumen.ru":true,"udm.ru":true,"udmurtia.ru":true,"ulan-ude.ru":true,"vladikavkaz.ru":true,"vladimir.ru":true,"vladivostok.ru":true,"volgograd.ru":true,"vologda.ru":true,"voronezh.ru":true,"vrn.ru":true,"vyatka.ru":true,"yakutia.ru":true,"yamal.ru":true,"yaroslavl.ru":true,"yekaterinburg.ru":true,"yuzhno-sakhalinsk.ru":true,"amursk.ru":true,"baikal.ru":true,"cmw.ru":true,"fareast.ru":true,"jamal.ru":true,"kms.ru":true,"k-uralsk.ru":true,"kustanai.ru":true,"kuzbass.ru":true,"magnitka.ru":true,"mytis.ru":true,"nakhodka.ru":true,"nkz.ru":true,"norilsk.ru":true,"oskol.ru":true,"pyatigorsk.ru":true,"rubtsovsk.ru":true,"snz.ru":true,"syzran.ru":true,"vdonsk.ru":true,"zgrad.ru":true,"gov.ru":true,"mil.ru":true,"test.ru":true,"rw":true,"gov.rw":true,"net.rw":true,"edu.rw":true,"ac.rw":true,"com.rw":true,"co.rw":true,"int.rw":true,"mil.rw":true,"gouv.rw":true,"sa":true,"com.sa":true,"net.sa":true,"org.sa":true,"gov.sa":true,"med.sa":true,"pub.sa":true,"edu.sa":true,"sch.sa":true,"sb":true,"com.sb":true,"edu.sb":true,"gov.sb":true,"net.sb":true,"org.sb":true,"sc":true,"com.sc":true,"gov.sc":true,"net.sc":true,"org.sc":true,"edu.sc":true,"sd":true,"com.sd":true,"net.sd":true,"org.sd":true,"edu.sd":true,"med.sd":true,"gov.sd":true,"info.sd":true,"se":true,"a.se":true,"ac.se":true,"b.se":true,"bd.se":true,"brand.se":true,"c.se":true,"d.se":true,"e.se":true,"f.se":true,"fh.se":true,"fhsk.se":true,"fhv.se":true,"g.se":true,"h.se":true,"i.se":true,"k.se":true,"komforb.se":true,"kommunalforbund.se":true,"komvux.se":true,"l.se":true,"lanbib.se":true,"m.se":true,"n.se":true,"naturbruksgymn.se":true,"o.se":true,"org.se":true,"p.se":true,"parti.se":true,"pp.se":true,"press.se":true,"r.se":true,"s.se":true,"sshn.se":true,"t.se":true,"tm.se":true,"u.se":true,"w.se":true,"x.se":true,"y.se":true,"z.se":true,"sg":true,"com.sg":true,"net.sg":true,"org.sg":true,"gov.sg":true,"edu.sg":true,"per.sg":true,"sh":true,"si":true,"sk":true,"sl":true,"com.sl":true,"net.sl":true,"edu.sl":true,"gov.sl":true,"org.sl":true,"sm":true,"sn":true,"art.sn":true,"com.sn":true,"edu.sn":true,"gouv.sn":true,"org.sn":true,"perso.sn":true,"univ.sn":true,"so":true,"com.so":true,"net.so":true,"org.so":true,"sr":true,"st":true,"co.st":true,"com.st":true,"consulado.st":true,"edu.st":true,"embaixada.st":true,"gov.st":true,"mil.st":true,"net.st":true,"org.st":true,"principe.st":true,"saotome.st":true,"store.st":true,"su":true,"*.sv":true,"sy":true,"edu.sy":true,"gov.sy":true,"net.sy":true,"mil.sy":true,"com.sy":true,"org.sy":true,"sz":true,"co.sz":true,"ac.sz":true,"org.sz":true,"tc":true,"td":true,"tel":true,"tf":true,"tg":true,"th":true,"ac.th":true,"co.th":true,"go.th":true,"in.th":true,"mi.th":true,"net.th":true,"or.th":true,"tj":true,"ac.tj":true,"biz.tj":true,"co.tj":true,"com.tj":true,"edu.tj":true,"go.tj":true,"gov.tj":true,"int.tj":true,"mil.tj":true,"name.tj":true,"net.tj":true,"nic.tj":true,"org.tj":true,"test.tj":true,"web.tj":true,"tk":true,"tl":true,"gov.tl":true,"tm":true,"tn":true,"com.tn":true,"ens.tn":true,"fin.tn":true,"gov.tn":true,"ind.tn":true,"intl.tn":true,"nat.tn":true,"net.tn":true,"org.tn":true,"info.tn":true,"perso.tn":true,"tourism.tn":true,"edunet.tn":true,"rnrt.tn":true,"rns.tn":true,"rnu.tn":true,"mincom.tn":true,"agrinet.tn":true,"defense.tn":true,"turen.tn":true,"to":true,"com.to":true,"gov.to":true,"net.to":true,"org.to":true,"edu.to":true,"mil.to":true,"*.tr":true,"nic.tr":false,"gov.nc.tr":true,"travel":true,"tt":true,"co.tt":true,"com.tt":true,"org.tt":true,"net.tt":true,"biz.tt":true,"info.tt":true,"pro.tt":true,"int.tt":true,"coop.tt":true,"jobs.tt":true,"mobi.tt":true,"travel.tt":true,"museum.tt":true,"aero.tt":true,"name.tt":true,"gov.tt":true,"edu.tt":true,"tv":true,"tw":true,"edu.tw":true,"gov.tw":true,"mil.tw":true,"com.tw":true,"net.tw":true,"org.tw":true,"idv.tw":true,"game.tw":true,"ebiz.tw":true,"club.tw":true,"xn--zf0ao64a.tw":true,"xn--uc0atv.tw":true,"xn--czrw28b.tw":true,"ac.tz":true,"co.tz":true,"go.tz":true,"mil.tz":true,"ne.tz":true,"or.tz":true,"sc.tz":true,"ua":true,"com.ua":true,"edu.ua":true,"gov.ua":true,"in.ua":true,"net.ua":true,"org.ua":true,"cherkassy.ua":true,"chernigov.ua":true,"chernovtsy.ua":true,"ck.ua":true,"cn.ua":true,"crimea.ua":true,"cv.ua":true,"dn.ua":true,"dnepropetrovsk.ua":true,"donetsk.ua":true,"dp.ua":true,"if.ua":true,"ivano-frankivsk.ua":true,"kh.ua":true,"kharkov.ua":true,"kherson.ua":true,"khmelnitskiy.ua":true,"kiev.ua":true,"kirovograd.ua":true,"km.ua":true,"kr.ua":true,"ks.ua":true,"kv.ua":true,"lg.ua":true,"lugansk.ua":true,"lutsk.ua":true,"lviv.ua":true,"mk.ua":true,"nikolaev.ua":true,"od.ua":true,"odessa.ua":true,"pl.ua":true,"poltava.ua":true,"rovno.ua":true,"rv.ua":true,"sebastopol.ua":true,"sumy.ua":true,"te.ua":true,"ternopil.ua":true,"uzhgorod.ua":true,"vinnica.ua":true,"vn.ua":true,"zaporizhzhe.ua":true,"zp.ua":true,"zhitomir.ua":true,"zt.ua":true,"co.ua":true,"pp.ua":true,"ug":true,"co.ug":true,"ac.ug":true,"sc.ug":true,"go.ug":true,"ne.ug":true,"or.ug":true,"*.uk":true,"*.sch.uk":true,"bl.uk":false,"british-library.uk":false,"icnet.uk":false,"jet.uk":false,"mod.uk":false,"nel.uk":false,"nhs.uk":false,"nic.uk":false,"nls.uk":false,"national-library-scotland.uk":false,"parliament.uk":false,"police.uk":false,"us":true,"dni.us":true,"fed.us":true,"isa.us":true,"kids.us":true,"nsn.us":true,"ak.us":true,"al.us":true,"ar.us":true,"as.us":true,"az.us":true,"ca.us":true,"co.us":true,"ct.us":true,"dc.us":true,"de.us":true,"fl.us":true,"ga.us":true,"gu.us":true,"hi.us":true,"ia.us":true,"id.us":true,"il.us":true,"in.us":true,"ks.us":true,"ky.us":true,"la.us":true,"ma.us":true,"md.us":true,"me.us":true,"mi.us":true,"mn.us":true,"mo.us":true,"ms.us":true,"mt.us":true,"nc.us":true,"nd.us":true,"ne.us":true,"nh.us":true,"nj.us":true,"nm.us":true,"nv.us":true,"ny.us":true,"oh.us":true,"ok.us":true,"or.us":true,"pa.us":true,"pr.us":true,"ri.us":true,"sc.us":true,"sd.us":true,"tn.us":true,"tx.us":true,"ut.us":true,"vi.us":true,"vt.us":true,"va.us":true,"wa.us":true,"wi.us":true,"wv.us":true,"wy.us":true,"k12.ak.us":true,"k12.al.us":true,"k12.ar.us":true,"k12.as.us":true,"k12.az.us":true,"k12.ca.us":true,"k12.co.us":true,"k12.ct.us":true,"k12.dc.us":true,"k12.de.us":true,"k12.fl.us":true,"k12.ga.us":true,"k12.gu.us":true,"k12.ia.us":true,"k12.id.us":true,"k12.il.us":true,"k12.in.us":true,"k12.ks.us":true,"k12.ky.us":true,"k12.la.us":true,"k12.ma.us":true,"k12.md.us":true,"k12.me.us":true,"k12.mi.us":true,"k12.mn.us":true,"k12.mo.us":true,"k12.ms.us":true,"k12.mt.us":true,"k12.nc.us":true,"k12.nd.us":true,"k12.ne.us":true,"k12.nh.us":true,"k12.nj.us":true,"k12.nm.us":true,"k12.nv.us":true,"k12.ny.us":true,"k12.oh.us":true,"k12.ok.us":true,"k12.or.us":true,"k12.pa.us":true,"k12.pr.us":true,"k12.ri.us":true,"k12.sc.us":true,"k12.sd.us":true,"k12.tn.us":true,"k12.tx.us":true,"k12.ut.us":true,"k12.vi.us":true,"k12.vt.us":true,"k12.va.us":true,"k12.wa.us":true,"k12.wi.us":true,"k12.wv.us":true,"k12.wy.us":true,"cc.ak.us":true,"cc.al.us":true,"cc.ar.us":true,"cc.as.us":true,"cc.az.us":true,"cc.ca.us":true,"cc.co.us":true,"cc.ct.us":true,"cc.dc.us":true,"cc.de.us":true,"cc.fl.us":true,"cc.ga.us":true,"cc.gu.us":true,"cc.hi.us":true,"cc.ia.us":true,"cc.id.us":true,"cc.il.us":true,"cc.in.us":true,"cc.ks.us":true,"cc.ky.us":true,"cc.la.us":true,"cc.ma.us":true,"cc.md.us":true,"cc.me.us":true,"cc.mi.us":true,"cc.mn.us":true,"cc.mo.us":true,"cc.ms.us":true,"cc.mt.us":true,"cc.nc.us":true,"cc.nd.us":true,"cc.ne.us":true,"cc.nh.us":true,"cc.nj.us":true,"cc.nm.us":true,"cc.nv.us":true,"cc.ny.us":true,"cc.oh.us":true,"cc.ok.us":true,"cc.or.us":true,"cc.pa.us":true,"cc.pr.us":true,"cc.ri.us":true,"cc.sc.us":true,"cc.sd.us":true,"cc.tn.us":true,"cc.tx.us":true,"cc.ut.us":true,"cc.vi.us":true,"cc.vt.us":true,"cc.va.us":true,"cc.wa.us":true,"cc.wi.us":true,"cc.wv.us":true,"cc.wy.us":true,"lib.ak.us":true,"lib.al.us":true,"lib.ar.us":true,"lib.as.us":true,"lib.az.us":true,"lib.ca.us":true,"lib.co.us":true,"lib.ct.us":true,"lib.dc.us":true,"lib.de.us":true,"lib.fl.us":true,"lib.ga.us":true,"lib.gu.us":true,"lib.hi.us":true,"lib.ia.us":true,"lib.id.us":true,"lib.il.us":true,"lib.in.us":true,"lib.ks.us":true,"lib.ky.us":true,"lib.la.us":true,"lib.ma.us":true,"lib.md.us":true,"lib.me.us":true,"lib.mi.us":true,"lib.mn.us":true,"lib.mo.us":true,"lib.ms.us":true,"lib.mt.us":true,"lib.nc.us":true,"lib.nd.us":true,"lib.ne.us":true,"lib.nh.us":true,"lib.nj.us":true,"lib.nm.us":true,"lib.nv.us":true,"lib.ny.us":true,"lib.oh.us":true,"lib.ok.us":true,"lib.or.us":true,"lib.pa.us":true,"lib.pr.us":true,"lib.ri.us":true,"lib.sc.us":true,"lib.sd.us":true,"lib.tn.us":true,"lib.tx.us":true,"lib.ut.us":true,"lib.vi.us":true,"lib.vt.us":true,"lib.va.us":true,"lib.wa.us":true,"lib.wi.us":true,"lib.wv.us":true,"lib.wy.us":true,"pvt.k12.ma.us":true,"chtr.k12.ma.us":true,"paroch.k12.ma.us":true,"*.uy":true,"uz":true,"com.uz":true,"co.uz":true,"va":true,"vc":true,"com.vc":true,"net.vc":true,"org.vc":true,"gov.vc":true,"mil.vc":true,"edu.vc":true,"*.ve":true,"vg":true,"vi":true,"co.vi":true,"com.vi":true,"k12.vi":true,"net.vi":true,"org.vi":true,"vn":true,"com.vn":true,"net.vn":true,"org.vn":true,"edu.vn":true,"gov.vn":true,"int.vn":true,"ac.vn":true,"biz.vn":true,"info.vn":true,"name.vn":true,"pro.vn":true,"health.vn":true,"vu":true,"wf":true,"ws":true,"com.ws":true,"net.ws":true,"org.ws":true,"gov.ws":true,"edu.ws":true,"yt":true,"xn--mgbaam7a8h":true,"xn--54b7fta0cc":true,"xn--fiqs8s":true,"xn--fiqz9s":true,"xn--lgbbat1ad8j":true,"xn--wgbh1c":true,"xn--node":true,"xn--j6w193g":true,"xn--h2brj9c":true,"xn--mgbbh1a71e":true,"xn--fpcrj9c3d":true,"xn--gecrj9c":true,"xn--s9brj9c":true,"xn--45brj9c":true,"xn--xkc2dl3a5ee0h":true,"xn--mgba3a4f16a":true,"xn--mgba3a4fra":true,"xn--mgbayh7gpa":true,"xn--3e0b707e":true,"xn--fzc2c9e2c":true,"xn--xkc2al3hye2a":true,"xn--mgbc0a9azcg":true,"xn--mgb9awbf":true,"xn--ygbi2ammx":true,"xn--90a3ac":true,"xn--p1ai":true,"xn--wgbl6a":true,"xn--mgberp4a5d4ar":true,"xn--mgberp4a5d4a87g":true,"xn--mgbqly7c0a67fbc":true,"xn--mgbqly7cvafr":true,"xn--ogbpf8fl":true,"xn--mgbtf8fl":true,"xn--yfro4i67o":true,"xn--clchc0ea0b2g2a9gcd":true,"xn--o3cw4h":true,"xn--pgbs0dh":true,"xn--kpry57d":true,"xn--kprw13d":true,"xn--nnx388a":true,"xn--j1amh":true,"xn--mgb2ddes":true,"xxx":true,"*.ye":true,"*.za":true,"*.zm":true,"*.zw":true,"biz.at":true,"info.at":true,"priv.at":true,"co.ca":true,"ar.com":true,"br.com":true,"cn.com":true,"de.com":true,"eu.com":true,"gb.com":true,"gr.com":true,"hu.com":true,"jpn.com":true,"kr.com":true,"no.com":true,"qc.com":true,"ru.com":true,"sa.com":true,"se.com":true,"uk.com":true,"us.com":true,"uy.com":true,"za.com":true,"gb.net":true,"jp.net":true,"se.net":true,"uk.net":true,"ae.org":true,"us.org":true,"com.de":true,"operaunite.com":true,"appspot.com":true,"iki.fi":true,"c.la":true,"za.net":true,"za.org":true,"co.nl":true,"co.no":true,"co.pl":true,"dyndns-at-home.com":true,"dyndns-at-work.com":true,"dyndns-blog.com":true,"dyndns-free.com":true,"dyndns-home.com":true,"dyndns-ip.com":true,"dyndns-mail.com":true,"dyndns-office.com":true,"dyndns-pics.com":true,"dyndns-remote.com":true,"dyndns-server.com":true,"dyndns-web.com":true,"dyndns-wiki.com":true,"dyndns-work.com":true,"dyndns.biz":true,"dyndns.info":true,"dyndns.org":true,"dyndns.tv":true,"at-band-camp.net":true,"ath.cx":true,"barrel-of-knowledge.info":true,"barrell-of-knowledge.info":true,"better-than.tv":true,"blogdns.com":true,"blogdns.net":true,"blogdns.org":true,"blogsite.org":true,"boldlygoingnowhere.org":true,"broke-it.net":true,"buyshouses.net":true,"cechire.com":true,"dnsalias.com":true,"dnsalias.net":true,"dnsalias.org":true,"dnsdojo.com":true,"dnsdojo.net":true,"dnsdojo.org":true,"does-it.net":true,"doesntexist.com":true,"doesntexist.org":true,"dontexist.com":true,"dontexist.net":true,"dontexist.org":true,"doomdns.com":true,"doomdns.org":true,"dvrdns.org":true,"dyn-o-saur.com":true,"dynalias.com":true,"dynalias.net":true,"dynalias.org":true,"dynathome.net":true,"dyndns.ws":true,"endofinternet.net":true,"endofinternet.org":true,"endoftheinternet.org":true,"est-a-la-maison.com":true,"est-a-la-masion.com":true,"est-le-patron.com":true,"est-mon-blogueur.com":true,"for-better.biz":true,"for-more.biz":true,"for-our.info":true,"for-some.biz":true,"for-the.biz":true,"forgot.her.name":true,"forgot.his.name":true,"from-ak.com":true,"from-al.com":true,"from-ar.com":true,"from-az.net":true,"from-ca.com":true,"from-co.net":true,"from-ct.com":true,"from-dc.com":true,"from-de.com":true,"from-fl.com":true,"from-ga.com":true,"from-hi.com":true,"from-ia.com":true,"from-id.com":true,"from-il.com":true,"from-in.com":true,"from-ks.com":true,"from-ky.com":true,"from-la.net":true,"from-ma.com":true,"from-md.com":true,"from-me.org":true,"from-mi.com":true,"from-mn.com":true,"from-mo.com":true,"from-ms.com":true,"from-mt.com":true,"from-nc.com":true,"from-nd.com":true,"from-ne.com":true,"from-nh.com":true,"from-nj.com":true,"from-nm.com":true,"from-nv.com":true,"from-ny.net":true,"from-oh.com":true,"from-ok.com":true,"from-or.com":true,"from-pa.com":true,"from-pr.com":true,"from-ri.com":true,"from-sc.com":true,"from-sd.com":true,"from-tn.com":true,"from-tx.com":true,"from-ut.com":true,"from-va.com":true,"from-vt.com":true,"from-wa.com":true,"from-wi.com":true,"from-wv.com":true,"from-wy.com":true,"ftpaccess.cc":true,"fuettertdasnetz.de":true,"game-host.org":true,"game-server.cc":true,"getmyip.com":true,"gets-it.net":true,"go.dyndns.org":true,"gotdns.com":true,"gotdns.org":true,"groks-the.info":true,"groks-this.info":true,"ham-radio-op.net":true,"here-for-more.info":true,"hobby-site.com":true,"hobby-site.org":true,"home.dyndns.org":true,"homedns.org":true,"homeftp.net":true,"homeftp.org":true,"homeip.net":true,"homelinux.com":true,"homelinux.net":true,"homelinux.org":true,"homeunix.com":true,"homeunix.net":true,"homeunix.org":true,"iamallama.com":true,"in-the-band.net":true,"is-a-anarchist.com":true,"is-a-blogger.com":true,"is-a-bookkeeper.com":true,"is-a-bruinsfan.org":true,"is-a-bulls-fan.com":true,"is-a-candidate.org":true,"is-a-caterer.com":true,"is-a-celticsfan.org":true,"is-a-chef.com":true,"is-a-chef.net":true,"is-a-chef.org":true,"is-a-conservative.com":true,"is-a-cpa.com":true,"is-a-cubicle-slave.com":true,"is-a-democrat.com":true,"is-a-designer.com":true,"is-a-doctor.com":true,"is-a-financialadvisor.com":true,"is-a-geek.com":true,"is-a-geek.net":true,"is-a-geek.org":true,"is-a-green.com":true,"is-a-guru.com":true,"is-a-hard-worker.com":true,"is-a-hunter.com":true,"is-a-knight.org":true,"is-a-landscaper.com":true,"is-a-lawyer.com":true,"is-a-liberal.com":true,"is-a-libertarian.com":true,"is-a-linux-user.org":true,"is-a-llama.com":true,"is-a-musician.com":true,"is-a-nascarfan.com":true,"is-a-nurse.com":true,"is-a-painter.com":true,"is-a-patsfan.org":true,"is-a-personaltrainer.com":true,"is-a-photographer.com":true,"is-a-player.com":true,"is-a-republican.com":true,"is-a-rockstar.com":true,"is-a-socialist.com":true,"is-a-soxfan.org":true,"is-a-student.com":true,"is-a-teacher.com":true,"is-a-techie.com":true,"is-a-therapist.com":true,"is-an-accountant.com":true,"is-an-actor.com":true,"is-an-actress.com":true,"is-an-anarchist.com":true,"is-an-artist.com":true,"is-an-engineer.com":true,"is-an-entertainer.com":true,"is-by.us":true,"is-certified.com":true,"is-found.org":true,"is-gone.com":true,"is-into-anime.com":true,"is-into-cars.com":true,"is-into-cartoons.com":true,"is-into-games.com":true,"is-leet.com":true,"is-lost.org":true,"is-not-certified.com":true,"is-saved.org":true,"is-slick.com":true,"is-uberleet.com":true,"is-very-bad.org":true,"is-very-evil.org":true,"is-very-good.org":true,"is-very-nice.org":true,"is-very-sweet.org":true,"is-with-theband.com":true,"isa-geek.com":true,"isa-geek.net":true,"isa-geek.org":true,"isa-hockeynut.com":true,"issmarterthanyou.com":true,"isteingeek.de":true,"istmein.de":true,"kicks-ass.net":true,"kicks-ass.org":true,"knowsitall.info":true,"land-4-sale.us":true,"lebtimnetz.de":true,"leitungsen.de":true,"likes-pie.com":true,"likescandy.com":true,"merseine.nu":true,"mine.nu":true,"misconfused.org":true,"mypets.ws":true,"myphotos.cc":true,"neat-url.com":true,"office-on-the.net":true,"on-the-web.tv":true,"podzone.net":true,"podzone.org":true,"readmyblog.org":true,"saves-the-whales.com":true,"scrapper-site.net":true,"scrapping.cc":true,"selfip.biz":true,"selfip.com":true,"selfip.info":true,"selfip.net":true,"selfip.org":true,"sells-for-less.com":true,"sells-for-u.com":true,"sells-it.net":true,"sellsyourhome.org":true,"servebbs.com":true,"servebbs.net":true,"servebbs.org":true,"serveftp.net":true,"serveftp.org":true,"servegame.org":true,"shacknet.nu":true,"simple-url.com":true,"space-to-rent.com":true,"stuff-4-sale.org":true,"stuff-4-sale.us":true,"teaches-yoga.com":true,"thruhere.net":true,"traeumtgerade.de":true,"webhop.biz":true,"webhop.info":true,"webhop.net":true,"webhop.org":true,"worse-than.tv":true,"writesthisblog.com":true});
+
+// END of automatically generated file
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/store.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/store.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/store.js	(revision 516)
@@ -0,0 +1,37 @@
+'use strict';
+/*jshint unused:false */
+
+function Store() {
+}
+exports.Store = Store;
+
+// Stores may be synchronous, but are still required to use a
+// Continuation-Passing Style API.  The CookieJar itself will expose a "*Sync"
+// API that converts from synchronous-callbacks to imperative style.
+Store.prototype.synchronous = false;
+
+Store.prototype.findCookie = function(domain, path, key, cb) {
+  throw new Error('findCookie is not implemented');
+};
+
+Store.prototype.findCookies = function(domain, path, cb) {
+  throw new Error('findCookies is not implemented');
+};
+
+Store.prototype.putCookie = function(cookie, cb) {
+  throw new Error('putCookie is not implemented');
+};
+
+Store.prototype.updateCookie = function(oldCookie, newCookie, cb) {
+  // recommended default implementation:
+  // return this.putCookie(newCookie, cb);
+  throw new Error('updateCookie is not implemented');
+};
+
+Store.prototype.removeCookie = function(domain, path, key, cb) {
+  throw new Error('removeCookie is not implemented');
+};
+
+Store.prototype.removeCookies = function removeCookies(domain, path, cb) {
+  throw new Error('removeCookies is not implemented');
+};
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-GPL.txt
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-GPL.txt	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-GPL.txt	(revision 516)
@@ -0,0 +1,278 @@
+        GNU GENERAL PUBLIC LICENSE
+           Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+          Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+        GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+          NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-MIT.txt
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-MIT.txt	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-MIT.txt	(revision 516)
@@ -0,0 +1,20 @@
+Copyright Mathias Bynens <http://mathiasbynens.be/>
+
+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.
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/README.md	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/README.md	(revision 516)
@@ -0,0 +1,162 @@
+# Punycode.js [![Build status](https://travis-ci.org/bestiejs/punycode.js.png?branch=master)](https://travis-ci.org/bestiejs/punycode.js) [![Dependency status](https://gemnasium.com/bestiejs/punycode.js.png)](https://gemnasium.com/bestiejs/punycode.js)
+
+A robust Punycode converter that fully complies to [RFC 3492](http://tools.ietf.org/html/rfc3492) and [RFC 5891](http://tools.ietf.org/html/rfc5891), and works on nearly all JavaScript platforms.
+
+This JavaScript library is the result of comparing, optimizing and documenting different open-source implementations of the Punycode algorithm:
+
+* [The C example code from RFC 3492](http://tools.ietf.org/html/rfc3492#appendix-C)
+* [`punycode.c` by _Markus W. Scherer_ (IBM)](http://opensource.apple.com/source/ICU/ICU-400.42/icuSources/common/punycode.c)
+* [`punycode.c` by _Ben Noordhuis_](https://github.com/bnoordhuis/punycode/blob/master/punycode.c)
+* [JavaScript implementation by _some_](http://stackoverflow.com/questions/183485/can-anyone-recommend-a-good-free-javascript-for-punycode-to-unicode-conversion/301287#301287)
+* [`punycode.js` by _Ben Noordhuis_](https://github.com/joyent/node/blob/426298c8c1c0d5b5224ac3658c41e7c2a3fe9377/lib/punycode.js) (note: [not fully compliant](https://github.com/joyent/node/issues/2072))
+
+This project is [bundled](https://github.com/joyent/node/blob/master/lib/punycode.js) with [Node.js v0.6.2+](https://github.com/joyent/node/compare/975f1930b1...61e796decc).
+
+## Installation
+
+Via [npm](http://npmjs.org/) (only required for Node.js releases older than v0.6.2):
+
+```bash
+npm install punycode
+```
+
+Via [Bower](http://bower.io/):
+
+```bash
+bower install punycode
+```
+
+Via [Component](https://github.com/component/component):
+
+```bash
+component install bestiejs/punycode.js
+```
+
+In a browser:
+
+```html
+<script src="punycode.js"></script>
+```
+
+In [Narwhal](http://narwhaljs.org/), [Node.js](http://nodejs.org/), and [RingoJS](http://ringojs.org/):
+
+```js
+var punycode = require('punycode');
+```
+
+In [Rhino](http://www.mozilla.org/rhino/):
+
+```js
+load('punycode.js');
+```
+
+Using an AMD loader like [RequireJS](http://requirejs.org/):
+
+```js
+require(
+  {
+    'paths': {
+      'punycode': 'path/to/punycode'
+    }
+  },
+  ['punycode'],
+  function(punycode) {
+    console.log(punycode);
+  }
+);
+```
+
+## API
+
+### `punycode.decode(string)`
+
+Converts a Punycode string of ASCII symbols to a string of Unicode symbols.
+
+```js
+// decode domain name parts
+punycode.decode('maana-pta'); // 'maÃ±ana'
+punycode.decode('--dqo34k'); // 'â-â'
+```
+
+### `punycode.encode(string)`
+
+Converts a string of Unicode symbols to a Punycode string of ASCII symbols.
+
+```js
+// encode domain name parts
+punycode.encode('maÃ±ana'); // 'maana-pta'
+punycode.encode('â-â'); // '--dqo34k'
+```
+
+### `punycode.toUnicode(domain)`
+
+Converts a Punycode string representing a domain name to Unicode. Only the Punycoded parts of the domain name will be converted, i.e. it doesnât matter if you call it on a string that has already been converted to Unicode.
+
+```js
+// decode domain names
+punycode.toUnicode('xn--maana-pta.com'); // 'maÃ±ana.com'
+punycode.toUnicode('xn----dqo34k.com'); // 'â-â.com'
+```
+
+### `punycode.toASCII(domain)`
+
+Converts a Unicode string representing a domain name to Punycode. Only the non-ASCII parts of the domain name will be converted, i.e. it doesnât matter if you call it with a domain that's already in ASCII.
+
+```js
+// encode domain names
+punycode.toASCII('maÃ±ana.com'); // 'xn--maana-pta.com'
+punycode.toASCII('â-â.com'); // 'xn----dqo34k.com'
+```
+
+### `punycode.ucs2`
+
+#### `punycode.ucs2.decode(string)`
+
+Creates an array containing the numeric code point values of each Unicode symbol in the string. While [JavaScript uses UCS-2 internally](http://mathiasbynens.be/notes/javascript-encoding), this function will convert a pair of surrogate halves (each of which UCS-2 exposes as separate characters) into a single code point, matching UTF-16.
+
+```js
+punycode.ucs2.decode('abc'); // [0x61, 0x62, 0x63]
+// surrogate pair for U+1D306 TETRAGRAM FOR CENTRE:
+punycode.ucs2.decode('\uD834\uDF06'); // [0x1D306]
+```
+
+#### `punycode.ucs2.encode(codePoints)`
+
+Creates a string based on an array of numeric code point values.
+
+```js
+punycode.ucs2.encode([0x61, 0x62, 0x63]); // 'abc'
+punycode.ucs2.encode([0x1D306]); // '\uD834\uDF06'
+```
+
+### `punycode.version`
+
+A string representing the current Punycode.js version number.
+
+[Full API documentation is available.](https://github.com/bestiejs/punycode.js/tree/master/docs#readme)
+
+## Unit tests & code coverage
+
+After cloning this repository, run `npm install --dev` to install the dependencies needed for Punycode.js development and testing. You may want to install Istanbul _globally_ using `npm install istanbul -g`.
+
+Once thatâs done, you can run the unit tests in Node using `npm test` or `node tests/tests.js`. To run the tests in Rhino, Ringo, Narwhal, PhantomJS, and web browsers as well, use `grunt test`.
+
+To generate [the code coverage report](http://rawgithub.com/bestiejs/punycode.js/master/coverage/punycode.js/punycode.js.html), use `grunt cover`.
+
+Feel free to fork if you see possible improvements!
+
+## Author
+
+| [![twitter/mathias](http://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](http://twitter.com/mathias "Follow @mathias on Twitter") |
+|---|
+| [Mathias Bynens](http://mathiasbynens.be/) |
+
+## Contributors
+
+| [![twitter/jdalton](http://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](http://twitter.com/jdalton "Follow @jdalton on Twitter") |
+|---|
+| [John-David Dalton](http://allyoucanleet.com/) |
+
+## License
+
+Punycode.js is dual licensed under the [MIT](http://mths.be/mit) and [GPL](http://mths.be/gpl) licenses.
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/package.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/package.json	(revision 516)
@@ -0,0 +1,74 @@
+{
+  "name": "punycode",
+  "version": "1.2.4",
+  "description": "A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.",
+  "homepage": "http://mths.be/punycode",
+  "main": "punycode.js",
+  "keywords": [
+    "punycode",
+    "unicode",
+    "idn",
+    "idna",
+    "dns",
+    "url",
+    "domain"
+  ],
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "http://mths.be/mit"
+    },
+    {
+      "type": "GPL",
+      "url": "http://mths.be/gpl"
+    }
+  ],
+  "author": {
+    "name": "Mathias Bynens",
+    "email": "mathias@qiwi.be",
+    "url": "http://mathiasbynens.be/"
+  },
+  "contributors": [
+    {
+      "name": "Mathias Bynens",
+      "email": "mathias@qiwi.be",
+      "url": "http://mathiasbynens.be/"
+    },
+    {
+      "name": "John-David Dalton",
+      "email": "john.david.dalton@gmail.com",
+      "url": "http://allyoucanleet.com/"
+    }
+  ],
+  "bugs": {
+    "url": "https://github.com/bestiejs/punycode.js/issues"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/bestiejs/punycode.js.git"
+  },
+  "engines": [
+    "node",
+    "rhino"
+  ],
+  "directories": {
+    "doc": "docs",
+    "test": "tests"
+  },
+  "scripts": {
+    "test": "node tests/tests.js"
+  },
+  "devDependencies": {
+    "grunt": "~0.4.1",
+    "grunt-contrib-uglify": "~0.2.2",
+    "grunt-shell": "~0.6.4",
+    "istanbul": "~0.2.4",
+    "qunit-clib": "~1.3.0",
+    "qunitjs": "~1.11.0",
+    "requirejs": "~2.1.6"
+  },
+  "readme": "# Punycode.js [![Build status](https://travis-ci.org/bestiejs/punycode.js.png?branch=master)](https://travis-ci.org/bestiejs/punycode.js) [![Dependency status](https://gemnasium.com/bestiejs/punycode.js.png)](https://gemnasium.com/bestiejs/punycode.js)\n\nA robust Punycode converter that fully complies to [RFC 3492](http://tools.ietf.org/html/rfc3492) and [RFC 5891](http://tools.ietf.org/html/rfc5891), and works on nearly all JavaScript platforms.\n\nThis JavaScript library is the result of comparing, optimizing and documenting different open-source implementations of the Punycode algorithm:\n\n* [The C example code from RFC 3492](http://tools.ietf.org/html/rfc3492#appendix-C)\n* [`punycode.c` by _Markus W. Scherer_ (IBM)](http://opensource.apple.com/source/ICU/ICU-400.42/icuSources/common/punycode.c)\n* [`punycode.c` by _Ben Noordhuis_](https://github.com/bnoordhuis/punycode/blob/master/punycode.c)\n* [JavaScript implementation by _some_](http://stackoverflow.com/questions/183485/can-anyone-recommend-a-good-free-javascript-for-punycode-to-unicode-conversion/301287#301287)\n* [`punycode.js` by _Ben Noordhuis_](https://github.com/joyent/node/blob/426298c8c1c0d5b5224ac3658c41e7c2a3fe9377/lib/punycode.js) (note: [not fully compliant](https://github.com/joyent/node/issues/2072))\n\nThis project is [bundled](https://github.com/joyent/node/blob/master/lib/punycode.js) with [Node.js v0.6.2+](https://github.com/joyent/node/compare/975f1930b1...61e796decc).\n\n## Installation\n\nVia [npm](http://npmjs.org/) (only required for Node.js releases older than v0.6.2):\n\n```bash\nnpm install punycode\n```\n\nVia [Bower](http://bower.io/):\n\n```bash\nbower install punycode\n```\n\nVia [Component](https://github.com/component/component):\n\n```bash\ncomponent install bestiejs/punycode.js\n```\n\nIn a browser:\n\n```html\n<script src=\"punycode.js\"></script>\n```\n\nIn [Narwhal](http://narwhaljs.org/), [Node.js](http://nodejs.org/), and [RingoJS](http://ringojs.org/):\n\n```js\nvar punycode = require('punycode');\n```\n\nIn [Rhino](http://www.mozilla.org/rhino/):\n\n```js\nload('punycode.js');\n```\n\nUsing an AMD loader like [RequireJS](http://requirejs.org/):\n\n```js\nrequire(\n  {\n    'paths': {\n      'punycode': 'path/to/punycode'\n    }\n  },\n  ['punycode'],\n  function(punycode) {\n    console.log(punycode);\n  }\n);\n```\n\n## API\n\n### `punycode.decode(string)`\n\nConverts a Punycode string of ASCII symbols to a string of Unicode symbols.\n\n```js\n// decode domain name parts\npunycode.decode('maana-pta'); // 'maÃ±ana'\npunycode.decode('--dqo34k'); // 'â-â'\n```\n\n### `punycode.encode(string)`\n\nConverts a string of Unicode symbols to a Punycode string of ASCII symbols.\n\n```js\n// encode domain name parts\npunycode.encode('maÃ±ana'); // 'maana-pta'\npunycode.encode('â-â'); // '--dqo34k'\n```\n\n### `punycode.toUnicode(domain)`\n\nConverts a Punycode string representing a domain name to Unicode. Only the Punycoded parts of the domain name will be converted, i.e. it doesnât matter if you call it on a string that has already been converted to Unicode.\n\n```js\n// decode domain names\npunycode.toUnicode('xn--maana-pta.com'); // 'maÃ±ana.com'\npunycode.toUnicode('xn----dqo34k.com'); // 'â-â.com'\n```\n\n### `punycode.toASCII(domain)`\n\nConverts a Unicode string representing a domain name to Punycode. Only the non-ASCII parts of the domain name will be converted, i.e. it doesnât matter if you call it with a domain that's already in ASCII.\n\n```js\n// encode domain names\npunycode.toASCII('maÃ±ana.com'); // 'xn--maana-pta.com'\npunycode.toASCII('â-â.com'); // 'xn----dqo34k.com'\n```\n\n### `punycode.ucs2`\n\n#### `punycode.ucs2.decode(string)`\n\nCreates an array containing the numeric code point values of each Unicode symbol in the string. While [JavaScript uses UCS-2 internally](http://mathiasbynens.be/notes/javascript-encoding), this function will convert a pair of surrogate halves (each of which UCS-2 exposes as separate characters) into a single code point, matching UTF-16.\n\n```js\npunycode.ucs2.decode('abc'); // [0x61, 0x62, 0x63]\n// surrogate pair for U+1D306 TETRAGRAM FOR CENTRE:\npunycode.ucs2.decode('\\uD834\\uDF06'); // [0x1D306]\n```\n\n#### `punycode.ucs2.encode(codePoints)`\n\nCreates a string based on an array of numeric code point values.\n\n```js\npunycode.ucs2.encode([0x61, 0x62, 0x63]); // 'abc'\npunycode.ucs2.encode([0x1D306]); // '\\uD834\\uDF06'\n```\n\n### `punycode.version`\n\nA string representing the current Punycode.js version number.\n\n[Full API documentation is available.](https://github.com/bestiejs/punycode.js/tree/master/docs#readme)\n\n## Unit tests & code coverage\n\nAfter cloning this repository, run `npm install --dev` to install the dependencies needed for Punycode.js development and testing. You may want to install Istanbul _globally_ using `npm install istanbul -g`.\n\nOnce thatâs done, you can run the unit tests in Node using `npm test` or `node tests/tests.js`. To run the tests in Rhino, Ringo, Narwhal, PhantomJS, and web browsers as well, use `grunt test`.\n\nTo generate [the code coverage report](http://rawgithub.com/bestiejs/punycode.js/master/coverage/punycode.js/punycode.js.html), use `grunt cover`.\n\nFeel free to fork if you see possible improvements!\n\n## Author\n\n| [![twitter/mathias](http://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](http://twitter.com/mathias \"Follow @mathias on Twitter\") |\n|---|\n| [Mathias Bynens](http://mathiasbynens.be/) |\n\n## Contributors\n\n| [![twitter/jdalton](http://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](http://twitter.com/jdalton \"Follow @jdalton on Twitter\") |\n|---|\n| [John-David Dalton](http://allyoucanleet.com/) |\n\n## License\n\nPunycode.js is dual licensed under the [MIT](http://mths.be/mit) and [GPL](http://mths.be/gpl) licenses.\n",
+  "readmeFilename": "README.md",
+  "_id": "punycode@1.2.4",
+  "_from": "punycode@>=0.2.0"
+}
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.js	(revision 516)
@@ -0,0 +1,507 @@
+/*! http://mths.be/punycode v1.2.4 by @mathias */
+;(function(root) {
+
+	/** Detect free variables */
+	var freeExports = typeof exports == 'object' && exports;
+	var freeModule = typeof module == 'object' && module &&
+		module.exports == freeExports && module;
+	var freeGlobal = typeof global == 'object' && global;
+	if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
+		root = freeGlobal;
+	}
+
+	/**
+	 * The `punycode` object.
+	 * @name punycode
+	 * @type Object
+	 */
+	var punycode,
+
+	/** Highest positive signed 32-bit float value */
+	maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
+
+	/** Bootstring parameters */
+	base = 36,
+	tMin = 1,
+	tMax = 26,
+	skew = 38,
+	damp = 700,
+	initialBias = 72,
+	initialN = 128, // 0x80
+	delimiter = '-', // '\x2D'
+
+	/** Regular expressions */
+	regexPunycode = /^xn--/,
+	regexNonASCII = /[^ -~]/, // unprintable ASCII chars + non-ASCII chars
+	regexSeparators = /\x2E|\u3002|\uFF0E|\uFF61/g, // RFC 3490 separators
+
+	/** Error messages */
+	errors = {
+		'overflow': 'Overflow: input needs wider integers to process',
+		'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
+		'invalid-input': 'Invalid input'
+	},
+
+	/** Convenience shortcuts */
+	baseMinusTMin = base - tMin,
+	floor = Math.floor,
+	stringFromCharCode = String.fromCharCode,
+
+	/** Temporary variable */
+	key;
+
+	/*--------------------------------------------------------------------------*/
+
+	/**
+	 * A generic error utility function.
+	 * @private
+	 * @param {String} type The error type.
+	 * @returns {Error} Throws a `RangeError` with the applicable error message.
+	 */
+	function error(type) {
+		throw RangeError(errors[type]);
+	}
+
+	/**
+	 * A generic `Array#map` utility function.
+	 * @private
+	 * @param {Array} array The array to iterate over.
+	 * @param {Function} callback The function that gets called for every array
+	 * item.
+	 * @returns {Array} A new array of values returned by the callback function.
+	 */
+	function map(array, fn) {
+		var length = array.length;
+		while (length--) {
+			array[length] = fn(array[length]);
+		}
+		return array;
+	}
+
+	/**
+	 * A simple `Array#map`-like wrapper to work with domain name strings.
+	 * @private
+	 * @param {String} domain The domain name.
+	 * @param {Function} callback The function that gets called for every
+	 * character.
+	 * @returns {Array} A new string of characters returned by the callback
+	 * function.
+	 */
+	function mapDomain(string, fn) {
+		return map(string.split(regexSeparators), fn).join('.');
+	}
+
+	/**
+	 * Creates an array containing the numeric code points of each Unicode
+	 * character in the string. While JavaScript uses UCS-2 internally,
+	 * this function will convert a pair of surrogate halves (each of which
+	 * UCS-2 exposes as separate characters) into a single code point,
+	 * matching UTF-16.
+	 * @see `punycode.ucs2.encode`
+	 * @see <http://mathiasbynens.be/notes/javascript-encoding>
+	 * @memberOf punycode.ucs2
+	 * @name decode
+	 * @param {String} string The Unicode input string (UCS-2).
+	 * @returns {Array} The new array of code points.
+	 */
+	function ucs2decode(string) {
+		var output = [],
+		    counter = 0,
+		    length = string.length,
+		    value,
+		    extra;
+		while (counter < length) {
+			value = string.charCodeAt(counter++);
+			if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
+				// high surrogate, and there is a next character
+				extra = string.charCodeAt(counter++);
+				if ((extra & 0xFC00) == 0xDC00) { // low surrogate
+					output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
+				} else {
+					// unmatched surrogate; only append this code unit, in case the next
+					// code unit is the high surrogate of a surrogate pair
+					output.push(value);
+					counter--;
+				}
+			} else {
+				output.push(value);
+			}
+		}
+		return output;
+	}
+
+	/**
+	 * Creates a string based on an array of numeric code points.
+	 * @see `punycode.ucs2.decode`
+	 * @memberOf punycode.ucs2
+	 * @name encode
+	 * @param {Array} codePoints The array of numeric code points.
+	 * @returns {String} The new Unicode string (UCS-2).
+	 */
+	function ucs2encode(array) {
+		return map(array, function(value) {
+			var output = '';
+			if (value > 0xFFFF) {
+				value -= 0x10000;
+				output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
+				value = 0xDC00 | value & 0x3FF;
+			}
+			output += stringFromCharCode(value);
+			return output;
+		}).join('');
+	}
+
+	/**
+	 * Converts a basic code point into a digit/integer.
+	 * @see `digitToBasic()`
+	 * @private
+	 * @param {Number} codePoint The basic numeric code point value.
+	 * @returns {Number} The numeric value of a basic code point (for use in
+	 * representing integers) in the range `0` to `base - 1`, or `base` if
+	 * the code point does not represent a value.
+	 */
+	function basicToDigit(codePoint) {
+		if (codePoint - 48 < 10) {
+			return codePoint - 22;
+		}
+		if (codePoint - 65 < 26) {
+			return codePoint - 65;
+		}
+		if (codePoint - 97 < 26) {
+			return codePoint - 97;
+		}
+		return base;
+	}
+
+	/**
+	 * Converts a digit/integer into a basic code point.
+	 * @see `basicToDigit()`
+	 * @private
+	 * @param {Number} digit The numeric value of a basic code point.
+	 * @returns {Number} The basic code point whose value (when used for
+	 * representing integers) is `digit`, which needs to be in the range
+	 * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
+	 * used; else, the lowercase form is used. The behavior is undefined
+	 * if `flag` is non-zero and `digit` has no uppercase form.
+	 */
+	function digitToBasic(digit, flag) {
+		//  0..25 map to ASCII a..z or A..Z
+		// 26..35 map to ASCII 0..9
+		return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
+	}
+
+	/**
+	 * Bias adaptation function as per section 3.4 of RFC 3492.
+	 * http://tools.ietf.org/html/rfc3492#section-3.4
+	 * @private
+	 */
+	function adapt(delta, numPoints, firstTime) {
+		var k = 0;
+		delta = firstTime ? floor(delta / damp) : delta >> 1;
+		delta += floor(delta / numPoints);
+		for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
+			delta = floor(delta / baseMinusTMin);
+		}
+		return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
+	}
+
+	/**
+	 * Converts a Punycode string of ASCII-only symbols to a string of Unicode
+	 * symbols.
+	 * @memberOf punycode
+	 * @param {String} input The Punycode string of ASCII-only symbols.
+	 * @returns {String} The resulting string of Unicode symbols.
+	 */
+	function decode(input) {
+		// Don't use UCS-2
+		var output = [],
+		    inputLength = input.length,
+		    out,
+		    i = 0,
+		    n = initialN,
+		    bias = initialBias,
+		    basic,
+		    j,
+		    index,
+		    oldi,
+		    w,
+		    k,
+		    digit,
+		    t,
+		    /** Cached calculation results */
+		    baseMinusT;
+
+		// Handle the basic code points: let `basic` be the number of input code
+		// points before the last delimiter, or `0` if there is none, then copy
+		// the first basic code points to the output.
+
+		basic = input.lastIndexOf(delimiter);
+		if (basic < 0) {
+			basic = 0;
+		}
+
+		for (j = 0; j < basic; ++j) {
+			// if it's not a basic code point
+			if (input.charCodeAt(j) >= 0x80) {
+				error('not-basic');
+			}
+			output.push(input.charCodeAt(j));
+		}
+
+		// Main decoding loop: start just after the last delimiter if any basic code
+		// points were copied; start at the beginning otherwise.
+
+		for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {
+
+			// `index` is the index of the next character to be consumed.
+			// Decode a generalized variable-length integer into `delta`,
+			// which gets added to `i`. The overflow checking is easier
+			// if we increase `i` as we go, then subtract off its starting
+			// value at the end to obtain `delta`.
+			for (oldi = i, w = 1, k = base; /* no condition */; k += base) {
+
+				if (index >= inputLength) {
+					error('invalid-input');
+				}
+
+				digit = basicToDigit(input.charCodeAt(index++));
+
+				if (digit >= base || digit > floor((maxInt - i) / w)) {
+					error('overflow');
+				}
+
+				i += digit * w;
+				t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
+
+				if (digit < t) {
+					break;
+				}
+
+				baseMinusT = base - t;
+				if (w > floor(maxInt / baseMinusT)) {
+					error('overflow');
+				}
+
+				w *= baseMinusT;
+
+			}
+
+			out = output.length + 1;
+			bias = adapt(i - oldi, out, oldi == 0);
+
+			// `i` was supposed to wrap around from `out` to `0`,
+			// incrementing `n` each time, so we'll fix that now:
+			if (floor(i / out) > maxInt - n) {
+				error('overflow');
+			}
+
+			n += floor(i / out);
+			i %= out;
+
+			// Insert `n` at position `i` of the output
+			output.splice(i++, 0, n);
+
+		}
+
+		return ucs2encode(output);
+	}
+
+	/**
+	 * Converts a string of Unicode symbols to a Punycode string of ASCII-only
+	 * symbols.
+	 * @memberOf punycode
+	 * @param {String} input The string of Unicode symbols.
+	 * @returns {String} The resulting Punycode string of ASCII-only symbols.
+	 */
+	function encode(input) {
+		var n,
+		    delta,
+		    handledCPCount,
+		    basicLength,
+		    bias,
+		    j,
+		    m,
+		    q,
+		    k,
+		    t,
+		    currentValue,
+		    output = [],
+		    /** `inputLength` will hold the number of code points in `input`. */
+		    inputLength,
+		    /** Cached calculation results */
+		    handledCPCountPlusOne,
+		    baseMinusT,
+		    qMinusT;
+
+		// Convert the input in UCS-2 to Unicode
+		input = ucs2decode(input);
+
+		// Cache the length
+		inputLength = input.length;
+
+		// Initialize the state
+		n = initialN;
+		delta = 0;
+		bias = initialBias;
+
+		// Handle the basic code points
+		for (j = 0; j < inputLength; ++j) {
+			currentValue = input[j];
+			if (currentValue < 0x80) {
+				output.push(stringFromCharCode(currentValue));
+			}
+		}
+
+		handledCPCount = basicLength = output.length;
+
+		// `handledCPCount` is the number of code points that have been handled;
+		// `basicLength` is the number of basic code points.
+
+		// Finish the basic string - if it is not empty - with a delimiter
+		if (basicLength) {
+			output.push(delimiter);
+		}
+
+		// Main encoding loop:
+		while (handledCPCount < inputLength) {
+
+			// All non-basic code points < n have been handled already. Find the next
+			// larger one:
+			for (m = maxInt, j = 0; j < inputLength; ++j) {
+				currentValue = input[j];
+				if (currentValue >= n && currentValue < m) {
+					m = currentValue;
+				}
+			}
+
+			// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
+			// but guard against overflow
+			handledCPCountPlusOne = handledCPCount + 1;
+			if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
+				error('overflow');
+			}
+
+			delta += (m - n) * handledCPCountPlusOne;
+			n = m;
+
+			for (j = 0; j < inputLength; ++j) {
+				currentValue = input[j];
+
+				if (currentValue < n && ++delta > maxInt) {
+					error('overflow');
+				}
+
+				if (currentValue == n) {
+					// Represent delta as a generalized variable-length integer
+					for (q = delta, k = base; /* no condition */; k += base) {
+						t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
+						if (q < t) {
+							break;
+						}
+						qMinusT = q - t;
+						baseMinusT = base - t;
+						output.push(
+							stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
+						);
+						q = floor(qMinusT / baseMinusT);
+					}
+
+					output.push(stringFromCharCode(digitToBasic(q, 0)));
+					bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
+					delta = 0;
+					++handledCPCount;
+				}
+			}
+
+			++delta;
+			++n;
+
+		}
+		return output.join('');
+	}
+
+	/**
+	 * Converts a Punycode string representing a domain name to Unicode. Only the
+	 * Punycoded parts of the domain name will be converted, i.e. it doesn't
+	 * matter if you call it on a string that has already been converted to
+	 * Unicode.
+	 * @memberOf punycode
+	 * @param {String} domain The Punycode domain name to convert to Unicode.
+	 * @returns {String} The Unicode representation of the given Punycode
+	 * string.
+	 */
+	function toUnicode(domain) {
+		return mapDomain(domain, function(string) {
+			return regexPunycode.test(string)
+				? decode(string.slice(4).toLowerCase())
+				: string;
+		});
+	}
+
+	/**
+	 * Converts a Unicode string representing a domain name to Punycode. Only the
+	 * non-ASCII parts of the domain name will be converted, i.e. it doesn't
+	 * matter if you call it with a domain that's already in ASCII.
+	 * @memberOf punycode
+	 * @param {String} domain The domain name to convert, as a Unicode string.
+	 * @returns {String} The Punycode representation of the given domain name.
+	 */
+	function toASCII(domain) {
+		return mapDomain(domain, function(string) {
+			return regexNonASCII.test(string)
+				? 'xn--' + encode(string)
+				: string;
+		});
+	}
+
+	/*--------------------------------------------------------------------------*/
+
+	/** Define the public API */
+	punycode = {
+		/**
+		 * A string representing the current Punycode.js version number.
+		 * @memberOf punycode
+		 * @type String
+		 */
+		'version': '1.2.4',
+		/**
+		 * An object of methods to convert from JavaScript's internal character
+		 * representation (UCS-2) to Unicode code points, and back.
+		 * @see <http://mathiasbynens.be/notes/javascript-encoding>
+		 * @memberOf punycode
+		 * @type Object
+		 */
+		'ucs2': {
+			'decode': ucs2decode,
+			'encode': ucs2encode
+		},
+		'decode': decode,
+		'encode': encode,
+		'toASCII': toASCII,
+		'toUnicode': toUnicode
+	};
+
+	/** Expose `punycode` */
+	// Some AMD build optimizers, like r.js, check for specific condition patterns
+	// like the following:
+	if (
+		typeof define == 'function' &&
+		typeof define.amd == 'object' &&
+		define.amd
+	) {
+		define('punycode', function() {
+			return punycode;
+		});
+	} else if (freeExports && !freeExports.nodeType) {
+		if (freeModule) { // in Node.js or RingoJS v0.8.0+
+			freeModule.exports = punycode;
+		} else { // in Narwhal or RingoJS v0.7.0-
+			for (key in punycode) {
+				punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
+			}
+		}
+	} else { // in Rhino or a web browser
+		root.punycode = punycode;
+	}
+
+}(this));
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.min.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.min.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.min.js	(revision 516)
@@ -0,0 +1,2 @@
+/*! http://mths.be/punycode v1.2.4 by @mathias */
+!function(a){function b(a){throw RangeError(E[a])}function c(a,b){for(var c=a.length;c--;)a[c]=b(a[c]);return a}function d(a,b){return c(a.split(D),b).join(".")}function e(a){for(var b,c,d=[],e=0,f=a.length;f>e;)b=a.charCodeAt(e++),b>=55296&&56319>=b&&f>e?(c=a.charCodeAt(e++),56320==(64512&c)?d.push(((1023&b)<<10)+(1023&c)+65536):(d.push(b),e--)):d.push(b);return d}function f(a){return c(a,function(a){var b="";return a>65535&&(a-=65536,b+=H(a>>>10&1023|55296),a=56320|1023&a),b+=H(a)}).join("")}function g(a){return 10>a-48?a-22:26>a-65?a-65:26>a-97?a-97:t}function h(a,b){return a+22+75*(26>a)-((0!=b)<<5)}function i(a,b,c){var d=0;for(a=c?G(a/x):a>>1,a+=G(a/b);a>F*v>>1;d+=t)a=G(a/F);return G(d+(F+1)*a/(a+w))}function j(a){var c,d,e,h,j,k,l,m,n,o,p=[],q=a.length,r=0,w=z,x=y;for(d=a.lastIndexOf(A),0>d&&(d=0),e=0;d>e;++e)a.charCodeAt(e)>=128&&b("not-basic"),p.push(a.charCodeAt(e));for(h=d>0?d+1:0;q>h;){for(j=r,k=1,l=t;h>=q&&b("invalid-input"),m=g(a.charCodeAt(h++)),(m>=t||m>G((s-r)/k))&&b("overflow"),r+=m*k,n=x>=l?u:l>=x+v?v:l-x,!(n>m);l+=t)o=t-n,k>G(s/o)&&b("overflow"),k*=o;c=p.length+1,x=i(r-j,c,0==j),G(r/c)>s-w&&b("overflow"),w+=G(r/c),r%=c,p.splice(r++,0,w)}return f(p)}function k(a){var c,d,f,g,j,k,l,m,n,o,p,q,r,w,x,B=[];for(a=e(a),q=a.length,c=z,d=0,j=y,k=0;q>k;++k)p=a[k],128>p&&B.push(H(p));for(f=g=B.length,g&&B.push(A);q>f;){for(l=s,k=0;q>k;++k)p=a[k],p>=c&&l>p&&(l=p);for(r=f+1,l-c>G((s-d)/r)&&b("overflow"),d+=(l-c)*r,c=l,k=0;q>k;++k)if(p=a[k],c>p&&++d>s&&b("overflow"),p==c){for(m=d,n=t;o=j>=n?u:n>=j+v?v:n-j,!(o>m);n+=t)x=m-o,w=t-o,B.push(H(h(o+x%w,0))),m=G(x/w);B.push(H(h(m,0))),j=i(d,r,f==g),d=0,++f}++d,++c}return B.join("")}function l(a){return d(a,function(a){return B.test(a)?j(a.slice(4).toLowerCase()):a})}function m(a){return d(a,function(a){return C.test(a)?"xn--"+k(a):a})}var n="object"==typeof exports&&exports,o="object"==typeof module&&module&&module.exports==n&&module,p="object"==typeof global&&global;(p.global===p||p.window===p)&&(a=p);var q,r,s=2147483647,t=36,u=1,v=26,w=38,x=700,y=72,z=128,A="-",B=/^xn--/,C=/[^ -~]/,D=/\x2E|\u3002|\uFF0E|\uFF61/g,E={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},F=t-u,G=Math.floor,H=String.fromCharCode;if(q={version:"1.2.4",ucs2:{decode:e,encode:f},decode:j,encode:k,toASCII:m,toUnicode:l},"function"==typeof define&&"object"==typeof define.amd&&define.amd)define("punycode",function(){return q});else if(n&&!n.nodeType)if(o)o.exports=q;else for(r in q)q.hasOwnProperty(r)&&(n[r]=q[r]);else a.punycode=q}(this);
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/package.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/package.json	(revision 516)
@@ -0,0 +1,49 @@
+{
+  "author": {
+    "name": "GoInstant Inc., a salesforce.com company"
+  },
+  "license": "MIT",
+  "name": "tough-cookie",
+  "description": "RFC6265 Cookies and Cookie Jar for node.js",
+  "keywords": [
+    "HTTP",
+    "cookie",
+    "cookies",
+    "set-cookie",
+    "cookiejar",
+    "jar",
+    "RFC6265",
+    "RFC2965"
+  ],
+  "version": "0.12.1",
+  "homepage": "https://github.com/goinstant/tough-cookie",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/goinstant/tough-cookie.git"
+  },
+  "bugs": {
+    "url": "https://github.com/goinstant/tough-cookie/issues"
+  },
+  "main": "./lib/cookie",
+  "scripts": {
+    "test": "vows test.js"
+  },
+  "engines": {
+    "node": ">=0.4.12"
+  },
+  "dependencies": {
+    "punycode": ">=0.2.0"
+  },
+  "devDependencies": {
+    "vows": "0.7.0",
+    "async": ">=0.1.12"
+  },
+  "readme": "[RFC6265](http://tools.ietf.org/html/rfc6265) Cookies and CookieJar for Node.js\n\n![Tough Cookie](http://www.goinstant.com.s3.amazonaws.com/tough-cookie.jpg)\n\n[![Build Status](https://travis-ci.org/goinstant/node-cookie.png?branch=master)](https://travis-ci.org/goinstant/node-cookie)\n\n[![NPM Stats](https://nodei.co/npm/tough-cookie.png?downloads=true&stars=true)](https://npmjs.org/package/tough-cookie)\n![NPM Downloads](https://nodei.co/npm-dl/tough-cookie.png?months=9)\n\n# Synopsis\n\n``` javascript\nvar tough = require('tough-cookie'); // note: not 'cookie', 'cookies' or 'node-cookie'\nvar Cookie = tough.Cookie;\nvar cookie = Cookie.parse(header);\ncookie.value = 'somethingdifferent';\nheader = cookie.toString();\n\nvar cookiejar = new tough.CookieJar();\ncookiejar.setCookie(cookie, 'http://currentdomain.example.com/path', cb);\n// ...\ncookiejar.getCookies('http://example.com/otherpath',function(err,cookies) {\n  res.headers['cookie'] = cookies.join('; ');\n});\n```\n\n# Installation\n\nIt's _so_ easy!\n\n`npm install tough-cookie`\n\nRequires `punycode`, which should get installed automatically for you.  Note that node.js v0.6.2+ bundles punycode by default.\n\nWhy the name?  NPM modules `cookie`, `cookies` and `cookiejar` were already taken.\n\n# API\n\ntough\n=====\n\nFunctions on the module you get from `require('tough-cookie')`.  All can be used as pure functions and don't need to be \"bound\".\n\nparseDate(string[,strict])\n-----------------\n\nParse a cookie date string into a `Date`.  Parses according to RFC6265 Section 5.1.1, not `Date.parse()`.  If strict is set to true then leading/trailing non-seperator characters around the time part will cause the parsing to fail (e.g. \"Thu, 01 Jan 1970 00:00:010 GMT\" has an extra trailing zero but Chrome, an assumedly RFC-compliant browser, treats this as valid).\n\nformatDate(date)\n----------------\n\nFormat a Date into a RFC1123 string (the RFC6265-recommended format).\n\ncanonicalDomain(str)\n--------------------\n\nTransforms a domain-name into a canonical domain-name.  The canonical domain-name is a trimmed, lowercased, stripped-of-leading-dot and optionally punycode-encoded domain-name (Section 5.1.2 of RFC6265).  For the most part, this function is idempotent (can be run again on its output without ill effects).\n\ndomainMatch(str,domStr[,canonicalize=true])\n-------------------------------------------\n\nAnswers \"does this real domain match the domain in a cookie?\".  The `str` is the \"current\" domain-name and the `domStr` is the \"cookie\" domain-name.  Matches according to RFC6265 Section 5.1.3, but it helps to think of it as a \"suffix match\".\n\nThe `canonicalize` parameter will run the other two paramters through `canonicalDomain` or not.\n\ndefaultPath(path)\n-----------------\n\nGiven a current request/response path, gives the Path apropriate for storing in a cookie.  This is basically the \"directory\" of a \"file\" in the path, but is specified by Section 5.1.4 of the RFC.\n\nThe `path` parameter MUST be _only_ the pathname part of a URI (i.e. excludes the hostname, query, fragment, etc.).  This is the `.pathname` property of node's `uri.parse()` output.\n\npathMatch(reqPath,cookiePath)\n-----------------------------\n\nAnswers \"does the request-path path-match a given cookie-path?\" as per RFC6265 Section 5.1.4.  Returns a boolean.\n\nThis is essentially a prefix-match where `cookiePath` is a prefix of `reqPath`.\n\nparse(header[,strict=false])\n----------------------------\n\nalias for `Cookie.parse(header[,strict])`\n\nfromJSON(string)\n----------------\n\nalias for `Cookie.fromJSON(string)`\n\ngetPublicSuffix(hostname)\n-------------------------\n\nReturns the public suffix of this hostname.  The public suffix is the shortest domain-name upon which a cookie can be set.  Returns `null` if the hostname cannot have cookies set for it.\n\nFor example: `www.example.com` and `www.subdomain.example.com` both have public suffix `example.com`.\n\nFor further information, see http://publicsuffix.org/.  This module derives its list from that site.\n\ncookieCompare(a,b)\n------------------\n\nFor use with `.sort()`, sorts a list of cookies into the recommended order given in the RFC (Section 5.4 step 2).  Longest `.path`s go first, then sorted oldest to youngest.\n\n``` javascript\nvar cookies = [ /* unsorted array of Cookie objects */ ];\ncookies = cookies.sort(cookieCompare);\n```\n\npermuteDomain(domain)\n---------------------\n\nGenerates a list of all possible domains that `domainMatch()` the parameter.  May be handy for implementing cookie stores.\n\n\npermutePath(path)\n-----------------\n\nGenerates a list of all possible paths that `pathMatch()` the parameter.  May be handy for implementing cookie stores.\n\nCookie\n======\n\nCookie.parse(header[,strict=false])\n-----------------------------------\n\nParses a single Cookie or Set-Cookie HTTP header into a `Cookie` object.  Returns `undefined` if the string can't be parsed.  If in strict mode, returns `undefined` if the cookie doesn't follow the guidelines in section 4 of RFC6265.  Generally speaking, strict mode can be used to validate your own generated Set-Cookie headers, but acting as a client you want to be lenient and leave strict mode off.\n\nHere's how to process the Set-Cookie header(s) on a node HTTP/HTTPS response:\n\n``` javascript\nif (res.headers['set-cookie'] instanceof Array)\n  cookies = res.headers['set-cookie'].map(function (c) { return (Cookie.parse(c)); });\nelse\n  cookies = [Cookie.parse(res.headers['set-cookie'])];\n```\n\nCookie.fromJSON(string)\n-----------------------\n\nConvert a JSON string to a `Cookie` object.  Does a `JSON.parse()` and converts the `.created`, `.lastAccessed` and `.expires` properties into `Date` objects.\n\nProperties\n==========\n\n  * _key_ - string - the name or key of the cookie (default \"\")\n  * _value_ - string - the value of the cookie (default \"\")\n  * _expires_ - `Date` - if set, the `Expires=` attribute of the cookie (defaults to the string `\"Infinity\"`). See `setExpires()`\n  * _maxAge_ - seconds - if set, the `Max-Age=` attribute _in seconds_ of the cookie.  May also be set to strings `\"Infinity\"` and `\"-Infinity\"` for non-expiry and immediate-expiry, respectively.  See `setMaxAge()`\n  * _domain_ - string - the `Domain=` attribute of the cookie\n  * _path_ - string - the `Path=` of the cookie\n  * _secure_ - boolean - the `Secure` cookie flag\n  * _httpOnly_ - boolean - the `HttpOnly` cookie flag\n  * _extensions_ - `Array` - any unrecognized cookie attributes as strings (even if equal-signs inside)\n\nAfter a cookie has been passed through `CookieJar.setCookie()` it will have the following additional attributes:\n\n  * _hostOnly_ - boolean - is this a host-only cookie (i.e. no Domain field was set, but was instead implied)\n  * _pathIsDefault_ - boolean - if true, there was no Path field on the cookie and `defaultPath()` was used to derive one.\n  * _created_ - `Date` - when this cookie was added to the jar\n  * _lastAccessed_ - `Date` - last time the cookie got accessed. Will affect cookie cleaning once implemented.  Using `cookiejar.getCookies(...)` will update this attribute.\n\nConstruction([{options}])\n------------\n\nReceives an options object that can contain any Cookie properties, uses the default for unspecified properties.\n\n.toString()\n-----------\n\nencode to a Set-Cookie header value.  The Expires cookie field is set using `formatDate()`, but is omitted entirely if `.expires` is `Infinity`.\n\n.cookieString()\n---------------\n\nencode to a Cookie header value (i.e. the `.key` and `.value` properties joined with '=').\n\n.setExpires(String)\n-------------------\n\nsets the expiry based on a date-string passed through `parseDate()`.  If parseDate returns `null` (i.e. can't parse this date string), `.expires` is set to `\"Infinity\"` (a string) is set.\n\n.setMaxAge(number)\n-------------------\n\nsets the maxAge in seconds.  Coerces `-Infinity` to `\"-Infinity\"` and `Infinity` to `\"Infinity\"` so it JSON serializes correctly.\n\n.expiryTime([now=Date.now()])\n-----------------------------\n\n.expiryDate([now=Date.now()])\n-----------------------------\n\nexpiryTime() Computes the absolute unix-epoch milliseconds that this cookie expires. expiryDate() works similarly, except it returns a `Date` object.  Note that in both cases the `now` parameter should be milliseconds.\n\nMax-Age takes precedence over Expires (as per the RFC). The `.created` attribute -- or, by default, the `now` paramter -- is used to offset the `.maxAge` attribute.\n\nIf Expires (`.expires`) is set, that's returned.\n\nOtherwise, `expiryTime()` returns `Infinity` and `expiryDate()` returns a `Date` object for \"Tue, 19 Jan 2038 03:14:07 GMT\" (latest date that can be expressed by a 32-bit `time_t`; the common limit for most user-agents).\n\n.TTL([now=Date.now()])\n---------\n\ncompute the TTL relative to `now` (milliseconds).  The same precedence rules as for `expiryTime`/`expiryDate` apply.\n\nThe \"number\" `Infinity` is returned for cookies without an explicit expiry and `0` is returned if the cookie is expired.  Otherwise a time-to-live in milliseconds is returned.\n\n.canonicalizedDoman()\n---------------------\n\n.cdomain()\n----------\n\nreturn the canonicalized `.domain` field.  This is lower-cased and punycode (RFC3490) encoded if the domain has any non-ASCII characters.\n\n.validate()\n-----------\n\nStatus: *IN PROGRESS*. Works for a few things, but is by no means comprehensive.\n\nvalidates cookie attributes for semantic correctness.  Useful for \"lint\" checking any Set-Cookie headers you generate.  For now, it returns a boolean, but eventually could return a reason string -- you can future-proof with this construct:\n\n``` javascript\nif (cookie.validate() === true) {\n  // it's tasty\n} else {\n  // yuck!\n}\n```\n\nCookieJar\n=========\n\nConstruction([store = new MemoryCookieStore()][, rejectPublicSuffixes])\n------------\n\nSimply use `new CookieJar()`.  If you'd like to use a custom store, pass that to the constructor otherwise a `MemoryCookieStore` will be created and used.\n\n\nAttributes\n----------\n\n  * _rejectPublicSuffixes_ - boolean - reject cookies with domains like \"com\" and \"co.uk\" (default: `true`)\n\nSince eventually this module would like to support database/remote/etc. CookieJars, continuation passing style is used for CookieJar methods.\n\n.setCookie(cookieOrString, currentUrl, [{options},] cb(err,cookie))\n-------------------------------------------------------------------\n\nAttempt to set the cookie in the cookie jar.  If the operation fails, an error will be given to the callback `cb`, otherwise the cookie is passed through.  The cookie will have updated `.created`, `.lastAccessed` and `.hostOnly` properties.\n\nThe `options` object can be omitted and can have the following properties:\n\n  * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API.  Affects HttpOnly cookies.\n  * _secure_ - boolean - autodetect from url - indicates if this is a \"Secure\" API.  If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`.\n  * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies\n  * _strict_ - boolean - default `false` - perform extra checks\n  * _ignoreError_ - boolean - default `false` - silently ignore things like parse errors and invalid domains.  CookieStore errors aren't ignored by this option.\n\nAs per the RFC, the `.hostOnly` property is set if there was no \"Domain=\" parameter in the cookie string (or `.domain` was null on the Cookie object).  The `.domain` property is set to the fully-qualified hostname of `currentUrl` in this case.  Matching this cookie requires an exact hostname match (not a `domainMatch` as per usual).\n\n.setCookieSync(cookieOrString, currentUrl, [{options}])\n-------------------------------------------------------\n\nSynchronous version of `setCookie`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).\n\n.storeCookie(cookie, [{options},] cb(err,cookie))\n-------------------------------------------------\n\n__REMOVED__ removed in lieu of the CookieStore API below\n\n.getCookies(currentUrl, [{options},] cb(err,cookies))\n-----------------------------------------------------\n\nRetrieve the list of cookies that can be sent in a Cookie header for the current url.\n\nIf an error is encountered, that's passed as `err` to the callback, otherwise an `Array` of `Cookie` objects is passed.  The array is sorted with `cookieCompare()` unless the `{sort:false}` option is given.\n\nThe `options` object can be omitted and can have the following properties:\n\n  * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API.  Affects HttpOnly cookies.\n  * _secure_ - boolean - autodetect from url - indicates if this is a \"Secure\" API.  If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`.\n  * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies\n  * _expire_ - boolean - default `true` - perform expiry-time checking of cookies and asynchronously remove expired cookies from the store.  Using `false` will return expired cookies and **not** remove them from the store (which is useful for replaying Set-Cookie headers, potentially).\n  * _allPaths_ - boolean - default `false` - if `true`, do not scope cookies by path. The default uses RFC-compliant path scoping. **Note**: may not be supported by the CookieStore `fetchCookies` function (the default MemoryCookieStore supports it).\n\nThe `.lastAccessed` property of the returned cookies will have been updated.\n\n.getCookiesSync(currentUrl, [{options}])\n----------------------------------------\n\nSynchronous version of `getCookies`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).\n\n.getCookieString(...)\n---------------------\n\nAccepts the same options as `.getCookies()` but passes a string suitable for a Cookie header rather than an array to the callback.  Simply maps the `Cookie` array via `.cookieString()`.\n\n.getCookieStringSync(...)\n-------------------------\n\nSynchronous version of `getCookieString`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).\n\n.getSetCookieStrings(...)\n-------------------------\n\nReturns an array of strings suitable for **Set-Cookie** headers. Accepts the same options as `.getCookies()`.  Simply maps the cookie array via `.toString()`.\n\n.getSetCookieStringsSync(...)\n-----------------------------\n\nSynchronous version of `getSetCookieStrings`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).\n\nStore\n=====\n\nBase class for CookieJar stores.\n\n# CookieStore API\n\nThe storage model for each `CookieJar` instance can be replaced with a custom implementation.  The default is `MemoryCookieStore` which can be found in the `lib/memstore.js` file.  The API uses continuation-passing-style to allow for asynchronous stores.\n\nStores should inherit from the base `Store` class, which is available as `require('tough-cookie').Store`.  Stores are asynchronous by default, but if `store.synchronous` is set, then the `*Sync` methods on the CookieJar can be used.\n\nAll `domain` parameters will have been normalized before calling.\n\nThe Cookie store must have all of the following methods.\n\nstore.findCookie(domain, path, key, cb(err,cookie))\n---------------------------------------------------\n\nRetrieve a cookie with the given domain, path and key (a.k.a. name).  The RFC maintains that exactly one of these cookies should exist in a store.  If the store is using versioning, this means that the latest/newest such cookie should be returned.\n\nCallback takes an error and the resulting `Cookie` object.  If no cookie is found then `null` MUST be passed instead (i.e. not an error).\n\nstore.findCookies(domain, path, cb(err,cookies))\n------------------------------------------------\n\nLocates cookies matching the given domain and path.  This is most often called in the context of `cookiejar.getCookies()` above.\n\nIf no cookies are found, the callback MUST be passed an empty array.\n\nThe resulting list will be checked for applicability to the current request according to the RFC (domain-match, path-match, http-only-flag, secure-flag, expiry, etc.), so it's OK to use an optimistic search algorithm when implementing this method.  However, the search algorithm used SHOULD try to find cookies that `domainMatch()` the domain and `pathMatch()` the path in order to limit the amount of checking that needs to be done.\n\nAs of version 0.9.12, the `allPaths` option to `cookiejar.getCookies()` above will cause the path here to be `null`.  If the path is `null`, path-matching MUST NOT be performed (i.e. domain-matching only).\n\nstore.putCookie(cookie, cb(err))\n--------------------------------\n\nAdds a new cookie to the store.  The implementation SHOULD replace any existing cookie with the same `.domain`, `.path`, and `.key` properties -- depending on the nature of the implementation, it's possible that between the call to `fetchCookie` and `putCookie` that a duplicate `putCookie` can occur.\n\nThe `cookie` object MUST NOT be modified; the caller will have already updated the `.creation` and `.lastAccessed` properties.\n\nPass an error if the cookie cannot be stored.\n\nstore.updateCookie(oldCookie, newCookie, cb(err))\n-------------------------------------------------\n\nUpdate an existing cookie.  The implementation MUST update the `.value` for a cookie with the same `domain`, `.path` and `.key`.  The implementation SHOULD check that the old value in the store is equivalent to `oldCookie` - how the conflict is resolved is up to the store.\n\nThe `.lastAccessed` property will always be different between the two objects and `.created` will always be the same.  Stores MAY ignore or defer the `.lastAccessed` change at the cost of affecting how cookies are sorted (or selected for deletion).\n\nStores may wish to optimize changing the `.value` of the cookie in the store versus storing a new cookie.  If the implementation doesn't define this method a stub that calls `putCookie(newCookie,cb)` will be added to the store object.\n\nThe `newCookie` and `oldCookie` objects MUST NOT be modified.\n\nPass an error if the newCookie cannot be stored.\n\nstore.removeCookie(domain, path, key, cb(err))\n----------------------------------------------\n\nRemove a cookie from the store (see notes on `findCookie` about the uniqueness constraint).\n\nThe implementation MUST NOT pass an error if the cookie doesn't exist; only pass an error due to the failure to remove an existing cookie.\n\nstore.removeCookies(domain, path, cb(err))\n------------------------------------------\n\nRemoves matching cookies from the store.  The `path` paramter is optional, and if missing means all paths in a domain should be removed.\n\nPass an error ONLY if removing any existing cookies failed.\n\n# TODO\n\n  * _full_ RFC5890/RFC5891 canonicalization for domains in `cdomain()`\n    * the optional `punycode` requirement implements RFC3492, but RFC6265 requires RFC5891\n  * better tests for `validate()`?\n\n# Copyright and License\n\n(tl;dr: MIT with some MPL/1.1)\n\nCopyright 2012- GoInstant, Inc. and other contributors. All rights reserved.\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\nPortions may be licensed under different licenses (in particular public-suffix.txt is MPL/1.1); please read the LICENSE file for full details.\n",
+  "readmeFilename": "README.md",
+  "_id": "tough-cookie@0.12.1",
+  "dist": {
+    "shasum": "05894100cd3db9d3b1c634f362fc02ac229b5ecf"
+  },
+  "_from": "tough-cookie@>=0.12.0",
+  "_resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz"
+}
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/public-suffix.txt
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/public-suffix.txt	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/public-suffix.txt	(revision 516)
@@ -0,0 +1,5236 @@
+// ***** BEGIN LICENSE BLOCK *****
+// Version: MPL 1.1/GPL 2.0/LGPL 2.1
+// 
+// The contents of this file are subject to the Mozilla Public License Version 
+// 1.1 (the "License"); you may not use this file except in compliance with 
+// the License. You may obtain a copy of the License at 
+// http://www.mozilla.org/MPL/
+// 
+// Software distributed under the License is distributed on an "AS IS" basis,
+// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+// for the specific language governing rights and limitations under the
+// License.
+// 
+// The Original Code is the Public Suffix List.
+// 
+// The Initial Developer of the Original Code is
+// Jo Hermans <jo.hermans@gmail.com>.
+// Portions created by the Initial Developer are Copyright (C) 2007
+// the Initial Developer. All Rights Reserved.
+// 
+// Contributor(s):
+//   Ruben Arakelyan <ruben@rubenarakelyan.com>
+//   Gervase Markham <gerv@gerv.net>
+//   Pamela Greene <pamg.bugs@gmail.com>
+//   David Triendl <david@triendl.name>
+//   Jothan Frakes <jothan@gmail.com>
+//   The kind representatives of many TLD registries
+// 
+// Alternatively, the contents of this file may be used under the terms of
+// either the GNU General Public License Version 2 or later (the "GPL"), or
+// the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+// in which case the provisions of the GPL or the LGPL are applicable instead
+// of those above. If you wish to allow use of your version of this file only
+// under the terms of either the GPL or the LGPL, and not to allow others to
+// use your version of this file under the terms of the MPL, indicate your
+// decision by deleting the provisions above and replace them with the notice
+// and other provisions required by the GPL or the LGPL. If you do not delete
+// the provisions above, a recipient may use your version of this file under
+// the terms of any one of the MPL, the GPL or the LGPL.
+// 
+// ***** END LICENSE BLOCK *****
+
+// ===BEGIN ICANN DOMAINS===
+
+// ac : http://en.wikipedia.org/wiki/.ac
+ac
+com.ac
+edu.ac
+gov.ac
+net.ac
+mil.ac
+org.ac
+
+// ad : http://en.wikipedia.org/wiki/.ad
+ad
+nom.ad
+
+// ae : http://en.wikipedia.org/wiki/.ae
+// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php
+ae
+co.ae
+net.ae
+org.ae
+sch.ae
+ac.ae
+gov.ae
+mil.ae
+
+// aero : see http://www.information.aero/index.php?id=66
+aero
+accident-investigation.aero
+accident-prevention.aero
+aerobatic.aero
+aeroclub.aero
+aerodrome.aero
+agents.aero
+aircraft.aero
+airline.aero
+airport.aero
+air-surveillance.aero
+airtraffic.aero
+air-traffic-control.aero
+ambulance.aero
+amusement.aero
+association.aero
+author.aero
+ballooning.aero
+broker.aero
+caa.aero
+cargo.aero
+catering.aero
+certification.aero
+championship.aero
+charter.aero
+civilaviation.aero
+club.aero
+conference.aero
+consultant.aero
+consulting.aero
+control.aero
+council.aero
+crew.aero
+design.aero
+dgca.aero
+educator.aero
+emergency.aero
+engine.aero
+engineer.aero
+entertainment.aero
+equipment.aero
+exchange.aero
+express.aero
+federation.aero
+flight.aero
+freight.aero
+fuel.aero
+gliding.aero
+government.aero
+groundhandling.aero
+group.aero
+hanggliding.aero
+homebuilt.aero
+insurance.aero
+journal.aero
+journalist.aero
+leasing.aero
+logistics.aero
+magazine.aero
+maintenance.aero
+marketplace.aero
+media.aero
+microlight.aero
+modelling.aero
+navigation.aero
+parachuting.aero
+paragliding.aero
+passenger-association.aero
+pilot.aero
+press.aero
+production.aero
+recreation.aero
+repbody.aero
+res.aero
+research.aero
+rotorcraft.aero
+safety.aero
+scientist.aero
+services.aero
+show.aero
+skydiving.aero
+software.aero
+student.aero
+taxi.aero
+trader.aero
+trading.aero
+trainer.aero
+union.aero
+workinggroup.aero
+works.aero
+
+// af : http://www.nic.af/help.jsp
+af
+gov.af
+com.af
+org.af
+net.af
+edu.af
+
+// ag : http://www.nic.ag/prices.htm
+ag
+com.ag
+org.ag
+net.ag
+co.ag
+nom.ag
+
+// ai : http://nic.com.ai/
+ai
+off.ai
+com.ai
+net.ai
+org.ai
+
+// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31
+al
+com.al
+edu.al
+gov.al
+mil.al
+net.al
+org.al
+
+// am : http://en.wikipedia.org/wiki/.am
+am
+
+// an : http://www.una.an/an_domreg/default.asp
+an
+com.an
+net.an
+org.an
+edu.an
+
+// ao : http://en.wikipedia.org/wiki/.ao
+// http://www.dns.ao/REGISTR.DOC
+ao
+ed.ao
+gv.ao
+og.ao
+co.ao
+pb.ao
+it.ao
+
+// aq : http://en.wikipedia.org/wiki/.aq
+aq
+
+// ar : http://en.wikipedia.org/wiki/.ar
+*.ar
+!congresodelalengua3.ar
+!educ.ar
+!gobiernoelectronico.ar
+!mecon.ar
+!nacion.ar
+!nic.ar
+!promocion.ar
+!retina.ar
+!uba.ar
+
+// arpa : http://en.wikipedia.org/wiki/.arpa
+// Confirmed by registry <iana-questions@icann.org> 2008-06-18
+e164.arpa
+in-addr.arpa
+ip6.arpa
+iris.arpa
+uri.arpa
+urn.arpa
+
+// as : http://en.wikipedia.org/wiki/.as
+as
+gov.as
+
+// asia : http://en.wikipedia.org/wiki/.asia
+asia
+
+// at : http://en.wikipedia.org/wiki/.at
+// Confirmed by registry <it@nic.at> 2008-06-17
+at
+ac.at
+co.at
+gv.at
+or.at
+
+// au : http://en.wikipedia.org/wiki/.au
+// http://www.auda.org.au/
+// 2LDs
+com.au
+net.au
+org.au
+edu.au
+gov.au
+csiro.au
+asn.au
+id.au
+// Historic 2LDs (closed to new registration, but sites still exist)
+info.au
+conf.au
+oz.au
+// CGDNs - http://www.cgdn.org.au/
+act.au
+nsw.au
+nt.au
+qld.au
+sa.au
+tas.au
+vic.au
+wa.au
+// 3LDs
+act.edu.au
+nsw.edu.au
+nt.edu.au
+qld.edu.au
+sa.edu.au
+tas.edu.au
+vic.edu.au
+wa.edu.au
+act.gov.au
+// Removed at request of Shae.Donelan@services.nsw.gov.au, 2010-03-04
+// nsw.gov.au
+nt.gov.au
+qld.gov.au
+sa.gov.au
+tas.gov.au
+vic.gov.au
+wa.gov.au
+
+// aw : http://en.wikipedia.org/wiki/.aw
+aw
+com.aw
+
+// ax : http://en.wikipedia.org/wiki/.ax
+ax
+
+// az : http://en.wikipedia.org/wiki/.az
+az
+com.az
+net.az
+int.az
+gov.az
+org.az
+edu.az
+info.az
+pp.az
+mil.az
+name.az
+pro.az
+biz.az
+
+// ba : http://en.wikipedia.org/wiki/.ba
+ba
+org.ba
+net.ba
+edu.ba
+gov.ba
+mil.ba
+unsa.ba
+unbi.ba
+co.ba
+com.ba
+rs.ba
+
+// bb : http://en.wikipedia.org/wiki/.bb
+bb
+biz.bb
+com.bb
+edu.bb
+gov.bb
+info.bb
+net.bb
+org.bb
+store.bb
+
+// bd : http://en.wikipedia.org/wiki/.bd
+*.bd
+
+// be : http://en.wikipedia.org/wiki/.be
+// Confirmed by registry <tech@dns.be> 2008-06-08
+be
+ac.be
+
+// bf : http://en.wikipedia.org/wiki/.bf
+bf
+gov.bf
+
+// bg : http://en.wikipedia.org/wiki/.bg
+// https://www.register.bg/user/static/rules/en/index.html
+bg
+a.bg
+b.bg
+c.bg
+d.bg
+e.bg
+f.bg
+g.bg
+h.bg
+i.bg
+j.bg
+k.bg
+l.bg
+m.bg
+n.bg
+o.bg
+p.bg
+q.bg
+r.bg
+s.bg
+t.bg
+u.bg
+v.bg
+w.bg
+x.bg
+y.bg
+z.bg
+0.bg
+1.bg
+2.bg
+3.bg
+4.bg
+5.bg
+6.bg
+7.bg
+8.bg
+9.bg	 	 	
+
+// bh : http://en.wikipedia.org/wiki/.bh
+bh
+com.bh
+edu.bh
+net.bh
+org.bh
+gov.bh
+
+// bi : http://en.wikipedia.org/wiki/.bi
+// http://whois.nic.bi/
+bi
+co.bi
+com.bi
+edu.bi
+or.bi
+org.bi
+
+// biz : http://en.wikipedia.org/wiki/.biz
+biz
+
+// bj : http://en.wikipedia.org/wiki/.bj
+bj
+asso.bj
+barreau.bj
+gouv.bj
+
+// bm : http://www.bermudanic.bm/dnr-text.txt
+bm
+com.bm
+edu.bm
+gov.bm
+net.bm
+org.bm
+
+// bn : http://en.wikipedia.org/wiki/.bn
+*.bn
+
+// bo : http://www.nic.bo/
+bo
+com.bo
+edu.bo
+gov.bo
+gob.bo
+int.bo
+org.bo
+net.bo
+mil.bo
+tv.bo
+
+// br : http://registro.br/dominio/dpn.html
+// Updated by registry <fneves@registro.br> 2011-03-01
+br
+adm.br
+adv.br
+agr.br
+am.br
+arq.br
+art.br
+ato.br
+b.br
+bio.br
+blog.br
+bmd.br
+can.br
+cim.br
+cng.br
+cnt.br
+com.br
+coop.br
+ecn.br
+edu.br
+emp.br
+eng.br
+esp.br
+etc.br
+eti.br
+far.br
+flog.br
+fm.br
+fnd.br
+fot.br
+fst.br
+g12.br
+ggf.br
+gov.br
+imb.br
+ind.br
+inf.br
+jor.br
+jus.br
+lel.br
+mat.br
+med.br
+mil.br
+mus.br
+net.br
+nom.br
+not.br
+ntr.br
+odo.br
+org.br
+ppg.br
+pro.br
+psc.br
+psi.br
+qsl.br
+radio.br
+rec.br
+slg.br
+srv.br
+taxi.br
+teo.br
+tmp.br
+trd.br
+tur.br
+tv.br
+vet.br
+vlog.br
+wiki.br
+zlg.br
+
+// bs : http://www.nic.bs/rules.html
+bs
+com.bs
+net.bs
+org.bs
+edu.bs
+gov.bs
+
+// bt : http://en.wikipedia.org/wiki/.bt
+bt
+com.bt
+edu.bt
+gov.bt
+net.bt
+org.bt
+
+// bv : No registrations at this time.
+// Submitted by registry <jarle@uninett.no> 2006-06-16
+
+// bw : http://en.wikipedia.org/wiki/.bw
+// http://www.gobin.info/domainname/bw.doc
+// list of other 2nd level tlds ?
+bw
+co.bw
+org.bw
+
+// by : http://en.wikipedia.org/wiki/.by
+// http://tld.by/rules_2006_en.html
+// list of other 2nd level tlds ?
+by
+gov.by
+mil.by
+// Official information does not indicate that com.by is a reserved
+// second-level domain, but it's being used as one (see www.google.com.by and
+// www.yahoo.com.by, for example), so we list it here for safety's sake.
+com.by
+
+// http://hoster.by/
+of.by
+
+// bz : http://en.wikipedia.org/wiki/.bz
+// http://www.belizenic.bz/
+bz
+com.bz
+net.bz
+org.bz
+edu.bz
+gov.bz
+
+// ca : http://en.wikipedia.org/wiki/.ca
+ca
+// ca geographical names
+ab.ca
+bc.ca
+mb.ca
+nb.ca
+nf.ca
+nl.ca
+ns.ca
+nt.ca
+nu.ca
+on.ca
+pe.ca
+qc.ca
+sk.ca
+yk.ca
+// gc.ca: http://en.wikipedia.org/wiki/.gc.ca
+// see also: http://registry.gc.ca/en/SubdomainFAQ
+gc.ca
+
+// cat : http://en.wikipedia.org/wiki/.cat
+cat
+
+// cc : http://en.wikipedia.org/wiki/.cc
+cc
+
+// cd : http://en.wikipedia.org/wiki/.cd
+// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1
+cd
+gov.cd
+
+// cf : http://en.wikipedia.org/wiki/.cf
+cf
+
+// cg : http://en.wikipedia.org/wiki/.cg
+cg
+
+// ch : http://en.wikipedia.org/wiki/.ch
+ch
+
+// ci : http://en.wikipedia.org/wiki/.ci
+// http://www.nic.ci/index.php?page=charte
+ci
+org.ci
+or.ci
+com.ci
+co.ci
+edu.ci
+ed.ci
+ac.ci
+net.ci
+go.ci
+asso.ci
+aÃ©roport.ci
+int.ci
+presse.ci
+md.ci
+gouv.ci
+
+// ck : http://en.wikipedia.org/wiki/.ck
+*.ck
+!www.ck
+
+// cl : http://en.wikipedia.org/wiki/.cl
+cl
+gov.cl
+gob.cl
+co.cl
+mil.cl
+
+// cm : http://en.wikipedia.org/wiki/.cm
+cm
+gov.cm
+
+// cn : http://en.wikipedia.org/wiki/.cn
+// Submitted by registry <tanyaling@cnnic.cn> 2008-06-11
+cn
+ac.cn
+com.cn
+edu.cn
+gov.cn
+net.cn
+org.cn
+mil.cn
+å
+¬åž.cn
+çœç».cn
+ç¶²çµ¡.cn
+// cn geographic names
+ah.cn
+bj.cn
+cq.cn
+fj.cn
+gd.cn
+gs.cn
+gz.cn
+gx.cn
+ha.cn
+hb.cn
+he.cn
+hi.cn
+hl.cn
+hn.cn
+jl.cn
+js.cn
+jx.cn
+ln.cn
+nm.cn
+nx.cn
+qh.cn
+sc.cn
+sd.cn
+sh.cn
+sn.cn
+sx.cn
+tj.cn
+xj.cn
+xz.cn
+yn.cn
+zj.cn
+hk.cn
+mo.cn
+tw.cn
+
+// co : http://en.wikipedia.org/wiki/.co
+// Submitted by registry <tecnico@uniandes.edu.co> 2008-06-11
+co
+arts.co
+com.co
+edu.co
+firm.co
+gov.co
+info.co
+int.co
+mil.co
+net.co
+nom.co
+org.co
+rec.co
+web.co
+
+// com : http://en.wikipedia.org/wiki/.com
+com
+
+// coop : http://en.wikipedia.org/wiki/.coop
+coop
+
+// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do
+cr
+ac.cr
+co.cr
+ed.cr
+fi.cr
+go.cr
+or.cr
+sa.cr
+
+// cu : http://en.wikipedia.org/wiki/.cu
+cu
+com.cu
+edu.cu
+org.cu
+net.cu
+gov.cu
+inf.cu
+
+// cv : http://en.wikipedia.org/wiki/.cv
+cv
+
+// cx : http://en.wikipedia.org/wiki/.cx
+// list of other 2nd level tlds ?
+cx
+gov.cx
+
+// cy : http://en.wikipedia.org/wiki/.cy
+*.cy
+
+// cz : http://en.wikipedia.org/wiki/.cz
+cz
+
+// de : http://en.wikipedia.org/wiki/.de
+// Confirmed by registry <ops@denic.de> (with technical
+// reservations) 2008-07-01
+de
+
+// dj : http://en.wikipedia.org/wiki/.dj
+dj
+
+// dk : http://en.wikipedia.org/wiki/.dk
+// Confirmed by registry <robert@dk-hostmaster.dk> 2008-06-17
+dk
+
+// dm : http://en.wikipedia.org/wiki/.dm
+dm
+com.dm
+net.dm
+org.dm
+edu.dm
+gov.dm
+
+// do : http://en.wikipedia.org/wiki/.do
+do
+art.do
+com.do
+edu.do
+gob.do
+gov.do
+mil.do
+net.do
+org.do
+sld.do
+web.do
+
+// dz : http://en.wikipedia.org/wiki/.dz
+dz
+com.dz
+org.dz
+net.dz
+gov.dz
+edu.dz
+asso.dz
+pol.dz
+art.dz
+
+// ec : http://www.nic.ec/reg/paso1.asp
+// Submitted by registry <vabboud@nic.ec> 2008-07-04
+ec
+com.ec
+info.ec
+net.ec
+fin.ec
+k12.ec
+med.ec
+pro.ec
+org.ec
+edu.ec
+gov.ec
+gob.ec
+mil.ec
+
+// edu : http://en.wikipedia.org/wiki/.edu
+edu
+
+// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B
+ee
+edu.ee
+gov.ee
+riik.ee
+lib.ee
+med.ee
+com.ee
+pri.ee
+aip.ee
+org.ee
+fie.ee
+
+// eg : http://en.wikipedia.org/wiki/.eg
+eg  
+com.eg
+edu.eg
+eun.eg
+gov.eg
+mil.eg
+name.eg
+net.eg
+org.eg
+sci.eg
+
+// er : http://en.wikipedia.org/wiki/.er
+*.er
+
+// es : https://www.nic.es/site_ingles/ingles/dominios/index.html
+es
+com.es
+nom.es
+org.es
+gob.es
+edu.es
+
+// et : http://en.wikipedia.org/wiki/.et
+*.et
+
+// eu : http://en.wikipedia.org/wiki/.eu
+eu
+
+// fi : http://en.wikipedia.org/wiki/.fi
+fi
+// aland.fi : http://en.wikipedia.org/wiki/.ax
+// This domain is being phased out in favor of .ax. As there are still many
+// domains under aland.fi, we still keep it on the list until aland.fi is
+// completely removed.
+// TODO: Check for updates (expected to be phased out around Q1/2009)
+aland.fi
+
+// fj : http://en.wikipedia.org/wiki/.fj
+*.fj
+
+// fk : http://en.wikipedia.org/wiki/.fk
+*.fk
+
+// fm : http://en.wikipedia.org/wiki/.fm
+fm
+
+// fo : http://en.wikipedia.org/wiki/.fo
+fo
+
+// fr : http://www.afnic.fr/
+// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs
+fr
+com.fr
+asso.fr
+nom.fr
+prd.fr
+presse.fr
+tm.fr
+// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels
+aeroport.fr
+assedic.fr
+avocat.fr
+avoues.fr
+cci.fr
+chambagri.fr
+chirurgiens-dentistes.fr
+experts-comptables.fr
+geometre-expert.fr
+gouv.fr
+greta.fr
+huissier-justice.fr
+medecin.fr
+notaires.fr
+pharmacien.fr
+port.fr
+veterinaire.fr
+
+// ga : http://en.wikipedia.org/wiki/.ga
+ga
+
+// gb : This registry is effectively dormant
+// Submitted by registry <Damien.Shaw@ja.net> 2008-06-12
+
+// gd : http://en.wikipedia.org/wiki/.gd
+gd
+
+// ge : http://www.nic.net.ge/policy_en.pdf
+ge
+com.ge
+edu.ge
+gov.ge
+org.ge
+mil.ge
+net.ge
+pvt.ge
+
+// gf : http://en.wikipedia.org/wiki/.gf
+gf
+
+// gg : http://www.channelisles.net/applic/avextn.shtml
+gg
+co.gg
+org.gg
+net.gg
+sch.gg
+gov.gg
+
+// gh : http://en.wikipedia.org/wiki/.gh
+// see also: http://www.nic.gh/reg_now.php
+// Although domains directly at second level are not possible at the moment,
+// they have been possible for some time and may come back.
+gh
+com.gh
+edu.gh
+gov.gh
+org.gh
+mil.gh
+
+// gi : http://www.nic.gi/rules.html
+gi
+com.gi
+ltd.gi
+gov.gi
+mod.gi
+edu.gi
+org.gi
+
+// gl : http://en.wikipedia.org/wiki/.gl
+// http://nic.gl
+gl
+
+// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm
+gm
+
+// gn : http://psg.com/dns/gn/gn.txt
+// Submitted by registry <randy@psg.com> 2008-06-17
+ac.gn
+com.gn
+edu.gn
+gov.gn
+org.gn
+net.gn
+
+// gov : http://en.wikipedia.org/wiki/.gov
+gov
+
+// gp : http://www.nic.gp/index.php?lang=en
+gp
+com.gp
+net.gp
+mobi.gp
+edu.gp
+org.gp
+asso.gp
+
+// gq : http://en.wikipedia.org/wiki/.gq
+gq
+
+// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html
+// Submitted by registry <segred@ics.forth.gr> 2008-06-09
+gr
+com.gr
+edu.gr
+net.gr
+org.gr
+gov.gr
+
+// gs : http://en.wikipedia.org/wiki/.gs
+gs
+
+// gt : http://www.gt/politicas.html
+*.gt
+!www.gt
+
+// gu : http://gadao.gov.gu/registration.txt
+*.gu
+
+// gw : http://en.wikipedia.org/wiki/.gw
+gw
+
+// gy : http://en.wikipedia.org/wiki/.gy
+// http://registry.gy/
+gy
+co.gy
+com.gy
+net.gy
+
+// hk : https://www.hkdnr.hk
+// Submitted by registry <hk.tech@hkirc.hk> 2008-06-11
+hk
+com.hk
+edu.hk
+gov.hk
+idv.hk
+net.hk
+org.hk
+å
+¬åž.hk
+æè².hk
+æè².hk
+æ¿åº.hk
+åäºº.hk
+äžªäºº.hk
+ç®äºº.hk
+ç¶²ç».hk
+çœç».hk
+ç»ç¹.hk
+ç¶²çµ¡.hk
+çœçµ¡.hk
+ç»ç».hk
+çµç¹.hk
+çµç».hk 
+
+// hm : http://en.wikipedia.org/wiki/.hm
+hm
+
+// hn : http://www.nic.hn/politicas/ps02,,05.html
+hn
+com.hn
+edu.hn
+org.hn
+net.hn
+mil.hn
+gob.hn
+
+// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf
+hr
+iz.hr
+from.hr
+name.hr
+com.hr
+
+// ht : http://www.nic.ht/info/charte.cfm
+ht
+com.ht
+shop.ht
+firm.ht
+info.ht
+adult.ht
+net.ht
+pro.ht
+org.ht
+med.ht
+art.ht
+coop.ht
+pol.ht
+asso.ht
+edu.ht
+rel.ht
+gouv.ht
+perso.ht
+
+// hu : http://www.domain.hu/domain/English/sld.html
+// Confirmed by registry <pasztor@iszt.hu> 2008-06-12
+hu
+co.hu
+info.hu
+org.hu
+priv.hu
+sport.hu
+tm.hu
+2000.hu
+agrar.hu
+bolt.hu
+casino.hu
+city.hu
+erotica.hu
+erotika.hu
+film.hu
+forum.hu
+games.hu
+hotel.hu
+ingatlan.hu
+jogasz.hu
+konyvelo.hu
+lakas.hu
+media.hu
+news.hu
+reklam.hu
+sex.hu
+shop.hu
+suli.hu
+szex.hu
+tozsde.hu
+utazas.hu
+video.hu
+
+// id : http://en.wikipedia.org/wiki/.id
+// see also: https://register.pandi.or.id/
+id
+ac.id
+co.id
+go.id
+mil.id
+net.id
+or.id
+sch.id
+web.id
+
+// ie : http://en.wikipedia.org/wiki/.ie
+ie
+gov.ie
+
+// il : http://en.wikipedia.org/wiki/.il
+*.il
+
+// im : https://www.nic.im/pdfs/imfaqs.pdf
+im
+co.im
+ltd.co.im
+plc.co.im
+net.im
+gov.im
+org.im
+nic.im
+ac.im
+
+// in : http://en.wikipedia.org/wiki/.in
+// see also: http://www.inregistry.in/policies/
+// Please note, that nic.in is not an offical eTLD, but used by most
+// government institutions.
+in
+co.in
+firm.in
+net.in
+org.in
+gen.in
+ind.in
+nic.in
+ac.in
+edu.in
+res.in
+gov.in
+mil.in
+
+// info : http://en.wikipedia.org/wiki/.info
+info
+
+// int : http://en.wikipedia.org/wiki/.int
+// Confirmed by registry <iana-questions@icann.org> 2008-06-18
+int
+eu.int
+
+// io : http://www.nic.io/rules.html
+// list of other 2nd level tlds ?
+io
+com.io
+
+// iq : http://www.cmc.iq/english/iq/iqregister1.htm
+iq
+gov.iq
+edu.iq
+mil.iq
+com.iq
+org.iq
+net.iq
+
+// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules
+// Also see http://www.nic.ir/Internationalized_Domain_Names
+// Two <iran>.ir entries added at request of <tech-team@nic.ir>, 2010-04-16
+ir
+ac.ir
+co.ir
+gov.ir
+id.ir
+net.ir
+org.ir
+sch.ir
+// xn--mgba3a4f16a.ir (<iran>.ir, Persian YEH)
+Ø§ÛØ±Ø§Ù.ir
+// xn--mgba3a4fra.ir (<iran>.ir, Arabic YEH)
+Ø§ÙØ±Ø§Ù.ir
+
+// is : http://www.isnic.is/domain/rules.php
+// Confirmed by registry <marius@isgate.is> 2008-12-06
+is
+net.is
+com.is
+edu.is
+gov.is
+org.is
+int.is
+
+// it : http://en.wikipedia.org/wiki/.it
+it
+gov.it
+edu.it
+// list of reserved geo-names : 
+// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf
+// (There is also a list of reserved geo-names corresponding to Italian 
+// municipalities : http://www.nic.it/documenti/appendice-c.pdf , but it is
+// not included here.)
+agrigento.it
+ag.it
+alessandria.it
+al.it
+ancona.it
+an.it
+aosta.it
+aoste.it
+ao.it
+arezzo.it
+ar.it
+ascoli-piceno.it
+ascolipiceno.it
+ap.it
+asti.it
+at.it
+avellino.it
+av.it
+bari.it
+ba.it
+andria-barletta-trani.it
+andriabarlettatrani.it
+trani-barletta-andria.it
+tranibarlettaandria.it
+barletta-trani-andria.it
+barlettatraniandria.it
+andria-trani-barletta.it
+andriatranibarletta.it
+trani-andria-barletta.it
+traniandriabarletta.it
+bt.it
+belluno.it
+bl.it
+benevento.it
+bn.it
+bergamo.it
+bg.it
+biella.it
+bi.it
+bologna.it
+bo.it
+bolzano.it
+bozen.it
+balsan.it
+alto-adige.it
+altoadige.it
+suedtirol.it
+bz.it
+brescia.it
+bs.it
+brindisi.it
+br.it
+cagliari.it
+ca.it
+caltanissetta.it
+cl.it
+campobasso.it
+cb.it
+carboniaiglesias.it
+carbonia-iglesias.it
+iglesias-carbonia.it
+iglesiascarbonia.it
+ci.it
+caserta.it
+ce.it
+catania.it
+ct.it
+catanzaro.it
+cz.it
+chieti.it
+ch.it
+como.it
+co.it
+cosenza.it
+cs.it
+cremona.it
+cr.it
+crotone.it
+kr.it
+cuneo.it
+cn.it
+dell-ogliastra.it
+dellogliastra.it
+ogliastra.it
+og.it
+enna.it
+en.it
+ferrara.it
+fe.it
+fermo.it
+fm.it
+firenze.it
+florence.it
+fi.it
+foggia.it
+fg.it
+forli-cesena.it
+forlicesena.it
+cesena-forli.it
+cesenaforli.it
+fc.it
+frosinone.it
+fr.it
+genova.it
+genoa.it
+ge.it
+gorizia.it
+go.it
+grosseto.it
+gr.it
+imperia.it
+im.it
+isernia.it
+is.it
+laquila.it
+aquila.it
+aq.it
+la-spezia.it
+laspezia.it
+sp.it
+latina.it
+lt.it
+lecce.it
+le.it
+lecco.it
+lc.it
+livorno.it
+li.it
+lodi.it
+lo.it
+lucca.it
+lu.it
+macerata.it
+mc.it
+mantova.it
+mn.it
+massa-carrara.it
+massacarrara.it
+carrara-massa.it
+carraramassa.it
+ms.it
+matera.it
+mt.it
+medio-campidano.it
+mediocampidano.it
+campidano-medio.it
+campidanomedio.it
+vs.it
+messina.it
+me.it
+milano.it
+milan.it
+mi.it
+modena.it
+mo.it
+monza.it
+monza-brianza.it
+monzabrianza.it
+monzaebrianza.it
+monzaedellabrianza.it
+monza-e-della-brianza.it
+mb.it
+napoli.it
+naples.it
+na.it
+novara.it
+no.it
+nuoro.it
+nu.it
+oristano.it
+or.it
+padova.it
+padua.it
+pd.it
+palermo.it
+pa.it
+parma.it
+pr.it
+pavia.it
+pv.it
+perugia.it
+pg.it
+pescara.it
+pe.it
+pesaro-urbino.it
+pesarourbino.it
+urbino-pesaro.it
+urbinopesaro.it
+pu.it
+piacenza.it
+pc.it
+pisa.it
+pi.it
+pistoia.it
+pt.it
+pordenone.it
+pn.it
+potenza.it
+pz.it
+prato.it
+po.it
+ragusa.it
+rg.it
+ravenna.it
+ra.it
+reggio-calabria.it
+reggiocalabria.it
+rc.it
+reggio-emilia.it
+reggioemilia.it
+re.it
+rieti.it
+ri.it
+rimini.it
+rn.it
+roma.it
+rome.it
+rm.it
+rovigo.it
+ro.it
+salerno.it
+sa.it
+sassari.it
+ss.it
+savona.it
+sv.it
+siena.it
+si.it
+siracusa.it
+sr.it
+sondrio.it
+so.it
+taranto.it
+ta.it
+tempio-olbia.it
+tempioolbia.it
+olbia-tempio.it
+olbiatempio.it
+ot.it
+teramo.it
+te.it
+terni.it
+tr.it
+torino.it
+turin.it
+to.it
+trapani.it
+tp.it
+trento.it
+trentino.it
+tn.it
+treviso.it
+tv.it
+trieste.it
+ts.it
+udine.it
+ud.it
+varese.it
+va.it
+venezia.it
+venice.it
+ve.it
+verbania.it
+vb.it
+vercelli.it
+vc.it
+verona.it
+vr.it
+vibo-valentia.it
+vibovalentia.it
+vv.it
+vicenza.it
+vi.it
+viterbo.it
+vt.it
+
+// je : http://www.channelisles.net/applic/avextn.shtml
+je
+co.je
+org.je
+net.je
+sch.je
+gov.je
+
+// jm : http://www.com.jm/register.html
+*.jm
+
+// jo : http://www.dns.jo/Registration_policy.aspx
+jo
+com.jo
+org.jo
+net.jo
+edu.jo
+sch.jo
+gov.jo
+mil.jo
+name.jo
+
+// jobs : http://en.wikipedia.org/wiki/.jobs
+jobs
+
+// jp : http://en.wikipedia.org/wiki/.jp
+// http://jprs.co.jp/en/jpdomain.html
+// Submitted by registry <yone@jprs.co.jp> 2008-06-11
+// Updated by registry <yone@jprs.co.jp> 2008-12-04
+jp
+// jp organizational type names 
+ac.jp
+ad.jp
+co.jp
+ed.jp
+go.jp
+gr.jp
+lg.jp
+ne.jp
+or.jp
+// jp geographic type names
+// http://jprs.jp/doc/rule/saisoku-1.html
+*.aichi.jp
+*.akita.jp
+*.aomori.jp
+*.chiba.jp
+*.ehime.jp
+*.fukui.jp
+*.fukuoka.jp
+*.fukushima.jp
+*.gifu.jp
+*.gunma.jp
+*.hiroshima.jp
+*.hokkaido.jp
+*.hyogo.jp
+*.ibaraki.jp
+*.ishikawa.jp
+*.iwate.jp
+*.kagawa.jp
+*.kagoshima.jp
+*.kanagawa.jp
+*.kawasaki.jp
+*.kitakyushu.jp
+*.kobe.jp
+*.kochi.jp
+*.kumamoto.jp
+*.kyoto.jp
+*.mie.jp
+*.miyagi.jp
+*.miyazaki.jp
+*.nagano.jp
+*.nagasaki.jp
+*.nagoya.jp
+*.nara.jp
+*.niigata.jp
+*.oita.jp
+*.okayama.jp
+*.okinawa.jp
+*.osaka.jp
+*.saga.jp
+*.saitama.jp
+*.sapporo.jp
+*.sendai.jp
+*.shiga.jp
+*.shimane.jp
+*.shizuoka.jp
+*.tochigi.jp
+*.tokushima.jp
+*.tokyo.jp
+*.tottori.jp
+*.toyama.jp
+*.wakayama.jp
+*.yamagata.jp
+*.yamaguchi.jp
+*.yamanashi.jp
+*.yokohama.jp
+!metro.tokyo.jp
+!pref.aichi.jp
+!pref.akita.jp
+!pref.aomori.jp
+!pref.chiba.jp
+!pref.ehime.jp
+!pref.fukui.jp
+!pref.fukuoka.jp
+!pref.fukushima.jp
+!pref.gifu.jp
+!pref.gunma.jp
+!pref.hiroshima.jp
+!pref.hokkaido.jp
+!pref.hyogo.jp
+!pref.ibaraki.jp
+!pref.ishikawa.jp
+!pref.iwate.jp
+!pref.kagawa.jp
+!pref.kagoshima.jp
+!pref.kanagawa.jp
+!pref.kochi.jp
+!pref.kumamoto.jp
+!pref.kyoto.jp
+!pref.mie.jp
+!pref.miyagi.jp
+!pref.miyazaki.jp
+!pref.nagano.jp
+!pref.nagasaki.jp
+!pref.nara.jp
+!pref.niigata.jp
+!pref.oita.jp
+!pref.okayama.jp
+!pref.okinawa.jp
+!pref.osaka.jp
+!pref.saga.jp
+!pref.saitama.jp
+!pref.shiga.jp
+!pref.shimane.jp
+!pref.shizuoka.jp
+!pref.tochigi.jp
+!pref.tokushima.jp
+!pref.tottori.jp
+!pref.toyama.jp
+!pref.wakayama.jp
+!pref.yamagata.jp
+!pref.yamaguchi.jp
+!pref.yamanashi.jp
+!city.chiba.jp
+!city.fukuoka.jp
+!city.hiroshima.jp
+!city.kawasaki.jp
+!city.kitakyushu.jp
+!city.kobe.jp
+!city.kyoto.jp
+!city.nagoya.jp
+!city.niigata.jp
+!city.okayama.jp
+!city.osaka.jp
+!city.saitama.jp
+!city.sapporo.jp
+!city.sendai.jp
+!city.shizuoka.jp
+!city.yokohama.jp
+
+// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145
+*.ke
+
+// kg : http://www.domain.kg/dmn_n.html
+kg
+org.kg
+net.kg
+com.kg
+edu.kg
+gov.kg
+mil.kg
+
+// kh : http://www.mptc.gov.kh/dns_registration.htm
+*.kh
+
+// ki : http://www.ki/dns/index.html
+ki
+edu.ki
+biz.ki
+net.ki
+org.ki
+gov.ki
+info.ki
+com.ki
+
+// km : http://en.wikipedia.org/wiki/.km
+// http://www.domaine.km/documents/charte.doc
+km
+org.km
+nom.km
+gov.km
+prd.km
+tm.km
+edu.km
+mil.km
+ass.km
+com.km
+// These are only mentioned as proposed suggestions at domaine.km, but
+// http://en.wikipedia.org/wiki/.km says they're available for registration:
+coop.km
+asso.km
+presse.km
+medecin.km
+notaires.km
+pharmaciens.km
+veterinaire.km
+gouv.km
+
+// kn : http://en.wikipedia.org/wiki/.kn
+// http://www.dot.kn/domainRules.html
+kn
+net.kn
+org.kn
+edu.kn
+gov.kn
+
+// kp : http://www.kcce.kp/en_index.php
+com.kp
+edu.kp
+gov.kp
+org.kp
+rep.kp
+tra.kp
+
+// kr : http://en.wikipedia.org/wiki/.kr
+// see also: http://domain.nida.or.kr/eng/registration.jsp
+kr
+ac.kr
+co.kr
+es.kr
+go.kr
+hs.kr
+kg.kr
+mil.kr
+ms.kr
+ne.kr
+or.kr
+pe.kr
+re.kr
+sc.kr
+// kr geographical names
+busan.kr
+chungbuk.kr
+chungnam.kr
+daegu.kr
+daejeon.kr
+gangwon.kr
+gwangju.kr
+gyeongbuk.kr
+gyeonggi.kr
+gyeongnam.kr
+incheon.kr
+jeju.kr
+jeonbuk.kr
+jeonnam.kr
+seoul.kr
+ulsan.kr
+
+// kw : http://en.wikipedia.org/wiki/.kw
+*.kw
+
+// ky : http://www.icta.ky/da_ky_reg_dom.php
+// Confirmed by registry <kysupport@perimeterusa.com> 2008-06-17
+ky
+edu.ky
+gov.ky
+com.ky
+org.ky
+net.ky
+
+// kz : http://en.wikipedia.org/wiki/.kz
+// see also: http://www.nic.kz/rules/index.jsp
+kz
+org.kz
+edu.kz
+net.kz
+gov.kz
+mil.kz
+com.kz
+
+// la : http://en.wikipedia.org/wiki/.la
+// Submitted by registry <gavin.brown@nic.la> 2008-06-10
+la
+int.la
+net.la
+info.la
+edu.la
+gov.la
+per.la
+com.la
+org.la
+
+// lb : http://en.wikipedia.org/wiki/.lb
+// Submitted by registry <randy@psg.com> 2008-06-17
+com.lb
+edu.lb
+gov.lb
+net.lb
+org.lb
+
+// lc : http://en.wikipedia.org/wiki/.lc
+// see also: http://www.nic.lc/rules.htm
+lc
+com.lc
+net.lc
+co.lc
+org.lc
+edu.lc
+gov.lc
+
+// li : http://en.wikipedia.org/wiki/.li
+li
+
+// lk : http://www.nic.lk/seclevpr.html
+lk
+gov.lk
+sch.lk
+net.lk
+int.lk
+com.lk
+org.lk
+edu.lk
+ngo.lk
+soc.lk
+web.lk
+ltd.lk
+assn.lk
+grp.lk
+hotel.lk
+
+// lr : http://psg.com/dns/lr/lr.txt
+// Submitted by registry <randy@psg.com> 2008-06-17
+com.lr
+edu.lr
+gov.lr
+org.lr
+net.lr
+
+// ls : http://en.wikipedia.org/wiki/.ls
+ls
+co.ls
+org.ls
+
+// lt : http://en.wikipedia.org/wiki/.lt
+lt
+// gov.lt : http://www.gov.lt/index_en.php
+gov.lt
+
+// lu : http://www.dns.lu/en/
+lu
+
+// lv : http://www.nic.lv/DNS/En/generic.php
+lv
+com.lv
+edu.lv
+gov.lv
+org.lv
+mil.lv
+id.lv
+net.lv
+asn.lv
+conf.lv
+
+// ly : http://www.nic.ly/regulations.php
+ly
+com.ly
+net.ly
+gov.ly
+plc.ly
+edu.ly
+sch.ly
+med.ly
+org.ly
+id.ly
+
+// ma : http://en.wikipedia.org/wiki/.ma
+// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf
+ma
+co.ma
+net.ma
+gov.ma
+org.ma
+ac.ma
+press.ma
+
+// mc : http://www.nic.mc/
+mc
+tm.mc
+asso.mc
+
+// md : http://en.wikipedia.org/wiki/.md
+md
+
+// me : http://en.wikipedia.org/wiki/.me
+me
+co.me
+net.me
+org.me
+edu.me
+ac.me
+gov.me
+its.me
+priv.me
+
+// mg : http://www.nic.mg/tarif.htm
+mg
+org.mg
+nom.mg
+gov.mg
+prd.mg
+tm.mg
+edu.mg
+mil.mg
+com.mg
+
+// mh : http://en.wikipedia.org/wiki/.mh
+mh
+
+// mil : http://en.wikipedia.org/wiki/.mil
+mil
+
+// mk : http://en.wikipedia.org/wiki/.mk
+// see also: http://dns.marnet.net.mk/postapka.php
+mk
+com.mk
+org.mk
+net.mk
+edu.mk
+gov.mk
+inf.mk
+name.mk
+
+// ml : http://www.gobin.info/domainname/ml-template.doc
+// see also: http://en.wikipedia.org/wiki/.ml
+ml
+com.ml
+edu.ml
+gouv.ml
+gov.ml
+net.ml
+org.ml
+presse.ml
+
+// mm : http://en.wikipedia.org/wiki/.mm
+*.mm
+
+// mn : http://en.wikipedia.org/wiki/.mn
+mn
+gov.mn
+edu.mn
+org.mn
+
+// mo : http://www.monic.net.mo/
+mo
+com.mo
+net.mo
+org.mo
+edu.mo
+gov.mo
+
+// mobi : http://en.wikipedia.org/wiki/.mobi
+mobi
+
+// mp : http://www.dot.mp/
+// Confirmed by registry <dcamacho@saipan.com> 2008-06-17
+mp
+
+// mq : http://en.wikipedia.org/wiki/.mq
+mq
+
+// mr : http://en.wikipedia.org/wiki/.mr
+mr
+gov.mr
+
+// ms : http://en.wikipedia.org/wiki/.ms
+ms
+
+// mt : https://www.nic.org.mt/dotmt/
+*.mt
+
+// mu : http://en.wikipedia.org/wiki/.mu
+mu
+com.mu
+net.mu
+org.mu
+gov.mu
+ac.mu
+co.mu
+or.mu
+
+// museum : http://about.museum/naming/
+// http://index.museum/
+museum
+academy.museum
+agriculture.museum
+air.museum
+airguard.museum
+alabama.museum
+alaska.museum
+amber.museum
+ambulance.museum
+american.museum
+americana.museum
+americanantiques.museum
+americanart.museum
+amsterdam.museum
+and.museum
+annefrank.museum
+anthro.museum
+anthropology.museum
+antiques.museum
+aquarium.museum
+arboretum.museum
+archaeological.museum
+archaeology.museum
+architecture.museum
+art.museum
+artanddesign.museum
+artcenter.museum
+artdeco.museum
+arteducation.museum
+artgallery.museum
+arts.museum
+artsandcrafts.museum
+asmatart.museum
+assassination.museum
+assisi.museum
+association.museum
+astronomy.museum
+atlanta.museum
+austin.museum
+australia.museum
+automotive.museum
+aviation.museum
+axis.museum
+badajoz.museum
+baghdad.museum
+bahn.museum
+bale.museum
+baltimore.museum
+barcelona.museum
+baseball.museum
+basel.museum
+baths.museum
+bauern.museum
+beauxarts.museum
+beeldengeluid.museum
+bellevue.museum
+bergbau.museum
+berkeley.museum
+berlin.museum
+bern.museum
+bible.museum
+bilbao.museum
+bill.museum
+birdart.museum
+birthplace.museum
+bonn.museum
+boston.museum
+botanical.museum
+botanicalgarden.museum
+botanicgarden.museum
+botany.museum
+brandywinevalley.museum
+brasil.museum
+bristol.museum
+british.museum
+britishcolumbia.museum
+broadcast.museum
+brunel.museum
+brussel.museum
+brussels.museum
+bruxelles.museum
+building.museum
+burghof.museum
+bus.museum
+bushey.museum
+cadaques.museum
+california.museum
+cambridge.museum
+can.museum
+canada.museum
+capebreton.museum
+carrier.museum
+cartoonart.museum
+casadelamoneda.museum
+castle.museum
+castres.museum
+celtic.museum
+center.museum
+chattanooga.museum
+cheltenham.museum
+chesapeakebay.museum
+chicago.museum
+children.museum
+childrens.museum
+childrensgarden.museum
+chiropractic.museum
+chocolate.museum
+christiansburg.museum
+cincinnati.museum
+cinema.museum
+circus.museum
+civilisation.museum
+civilization.museum
+civilwar.museum
+clinton.museum
+clock.museum
+coal.museum
+coastaldefence.museum
+cody.museum
+coldwar.museum
+collection.museum
+colonialwilliamsburg.museum
+coloradoplateau.museum
+columbia.museum
+columbus.museum
+communication.museum
+communications.museum
+community.museum
+computer.museum
+computerhistory.museum
+comunicaÃ§Ãµes.museum
+contemporary.museum
+contemporaryart.museum
+convent.museum
+copenhagen.museum
+corporation.museum
+correios-e-telecomunicaÃ§Ãµes.museum
+corvette.museum
+costume.museum
+countryestate.museum
+county.museum
+crafts.museum
+cranbrook.museum
+creation.museum
+cultural.museum
+culturalcenter.museum
+culture.museum
+cyber.museum
+cymru.museum
+dali.museum
+dallas.museum
+database.museum
+ddr.museum
+decorativearts.museum
+delaware.museum
+delmenhorst.museum
+denmark.museum
+depot.museum
+design.museum
+detroit.museum
+dinosaur.museum
+discovery.museum
+dolls.museum
+donostia.museum
+durham.museum
+eastafrica.museum
+eastcoast.museum
+education.museum
+educational.museum
+egyptian.museum
+eisenbahn.museum
+elburg.museum
+elvendrell.museum
+embroidery.museum
+encyclopedic.museum
+england.museum
+entomology.museum
+environment.museum
+environmentalconservation.museum
+epilepsy.museum
+essex.museum
+estate.museum
+ethnology.museum
+exeter.museum
+exhibition.museum
+family.museum
+farm.museum
+farmequipment.museum
+farmers.museum
+farmstead.museum
+field.museum
+figueres.museum
+filatelia.museum
+film.museum
+fineart.museum
+finearts.museum
+finland.museum
+flanders.museum
+florida.museum
+force.museum
+fortmissoula.museum
+fortworth.museum
+foundation.museum
+francaise.museum
+frankfurt.museum
+franziskaner.museum
+freemasonry.museum
+freiburg.museum
+fribourg.museum
+frog.museum
+fundacio.museum
+furniture.museum
+gallery.museum
+garden.museum
+gateway.museum
+geelvinck.museum
+gemological.museum
+geology.museum
+georgia.museum
+giessen.museum
+glas.museum
+glass.museum
+gorge.museum
+grandrapids.museum
+graz.museum
+guernsey.museum
+halloffame.museum
+hamburg.museum
+handson.museum
+harvestcelebration.museum
+hawaii.museum
+health.museum
+heimatunduhren.museum
+hellas.museum
+helsinki.museum
+hembygdsforbund.museum
+heritage.museum
+histoire.museum
+historical.museum
+historicalsociety.museum
+historichouses.museum
+historisch.museum
+historisches.museum
+history.museum
+historyofscience.museum
+horology.museum
+house.museum
+humanities.museum
+illustration.museum
+imageandsound.museum
+indian.museum
+indiana.museum
+indianapolis.museum
+indianmarket.museum
+intelligence.museum
+interactive.museum
+iraq.museum
+iron.museum
+isleofman.museum
+jamison.museum
+jefferson.museum
+jerusalem.museum
+jewelry.museum
+jewish.museum
+jewishart.museum
+jfk.museum
+journalism.museum
+judaica.museum
+judygarland.museum
+juedisches.museum
+juif.museum
+karate.museum
+karikatur.museum
+kids.museum
+koebenhavn.museum
+koeln.museum
+kunst.museum
+kunstsammlung.museum
+kunstunddesign.museum
+labor.museum
+labour.museum
+lajolla.museum
+lancashire.museum
+landes.museum
+lans.museum
+lÃ€ns.museum
+larsson.museum
+lewismiller.museum
+lincoln.museum
+linz.museum
+living.museum
+livinghistory.museum
+localhistory.museum
+london.museum
+losangeles.museum
+louvre.museum
+loyalist.museum
+lucerne.museum
+luxembourg.museum
+luzern.museum
+mad.museum
+madrid.museum
+mallorca.museum
+manchester.museum
+mansion.museum
+mansions.museum
+manx.museum
+marburg.museum
+maritime.museum
+maritimo.museum
+maryland.museum
+marylhurst.museum
+media.museum
+medical.museum
+medizinhistorisches.museum
+meeres.museum
+memorial.museum
+mesaverde.museum
+michigan.museum
+midatlantic.museum
+military.museum
+mill.museum
+miners.museum
+mining.museum
+minnesota.museum
+missile.museum
+missoula.museum
+modern.museum
+moma.museum
+money.museum
+monmouth.museum
+monticello.museum
+montreal.museum
+moscow.museum
+motorcycle.museum
+muenchen.museum
+muenster.museum
+mulhouse.museum
+muncie.museum
+museet.museum
+museumcenter.museum
+museumvereniging.museum
+music.museum
+national.museum
+nationalfirearms.museum
+nationalheritage.museum
+nativeamerican.museum
+naturalhistory.museum
+naturalhistorymuseum.museum
+naturalsciences.museum
+nature.museum
+naturhistorisches.museum
+natuurwetenschappen.museum
+naumburg.museum
+naval.museum
+nebraska.museum
+neues.museum
+newhampshire.museum
+newjersey.museum
+newmexico.museum
+newport.museum
+newspaper.museum
+newyork.museum
+niepce.museum
+norfolk.museum
+north.museum
+nrw.museum
+nuernberg.museum
+nuremberg.museum
+nyc.museum
+nyny.museum
+oceanographic.museum
+oceanographique.museum
+omaha.museum
+online.museum
+ontario.museum
+openair.museum
+oregon.museum
+oregontrail.museum
+otago.museum
+oxford.museum
+pacific.museum
+paderborn.museum
+palace.museum
+paleo.museum
+palmsprings.museum
+panama.museum
+paris.museum
+pasadena.museum
+pharmacy.museum
+philadelphia.museum
+philadelphiaarea.museum
+philately.museum
+phoenix.museum
+photography.museum
+pilots.museum
+pittsburgh.museum
+planetarium.museum
+plantation.museum
+plants.museum
+plaza.museum
+portal.museum
+portland.museum
+portlligat.museum
+posts-and-telecommunications.museum
+preservation.museum
+presidio.museum
+press.museum
+project.museum
+public.museum
+pubol.museum
+quebec.museum
+railroad.museum
+railway.museum
+research.museum
+resistance.museum
+riodejaneiro.museum
+rochester.museum
+rockart.museum
+roma.museum
+russia.museum
+saintlouis.museum
+salem.museum
+salvadordali.museum
+salzburg.museum
+sandiego.museum
+sanfrancisco.museum
+santabarbara.museum
+santacruz.museum
+santafe.museum
+saskatchewan.museum
+satx.museum
+savannahga.museum
+schlesisches.museum
+schoenbrunn.museum
+schokoladen.museum
+school.museum
+schweiz.museum
+science.museum
+scienceandhistory.museum
+scienceandindustry.museum
+sciencecenter.museum
+sciencecenters.museum
+science-fiction.museum
+sciencehistory.museum
+sciences.museum
+sciencesnaturelles.museum
+scotland.museum
+seaport.museum
+settlement.museum
+settlers.museum
+shell.museum
+sherbrooke.museum
+sibenik.museum
+silk.museum
+ski.museum
+skole.museum
+society.museum
+sologne.museum
+soundandvision.museum
+southcarolina.museum
+southwest.museum
+space.museum
+spy.museum
+square.museum
+stadt.museum
+stalbans.museum
+starnberg.museum
+state.museum
+stateofdelaware.museum
+station.museum
+steam.museum
+steiermark.museum
+stjohn.museum
+stockholm.museum
+stpetersburg.museum
+stuttgart.museum
+suisse.museum
+surgeonshall.museum
+surrey.museum
+svizzera.museum
+sweden.museum
+sydney.museum
+tank.museum
+tcm.museum
+technology.museum
+telekommunikation.museum
+television.museum
+texas.museum
+textile.museum
+theater.museum
+time.museum
+timekeeping.museum
+topology.museum
+torino.museum
+touch.museum
+town.museum
+transport.museum
+tree.museum
+trolley.museum
+trust.museum
+trustee.museum
+uhren.museum
+ulm.museum
+undersea.museum
+university.museum
+usa.museum
+usantiques.museum
+usarts.museum
+uscountryestate.museum
+usculture.museum
+usdecorativearts.museum
+usgarden.museum
+ushistory.museum
+ushuaia.museum
+uslivinghistory.museum
+utah.museum
+uvic.museum
+valley.museum
+vantaa.museum
+versailles.museum
+viking.museum
+village.museum
+virginia.museum
+virtual.museum
+virtuel.museum
+vlaanderen.museum
+volkenkunde.museum
+wales.museum
+wallonie.museum
+war.museum
+washingtondc.museum
+watchandclock.museum
+watch-and-clock.museum
+western.museum
+westfalen.museum
+whaling.museum
+wildlife.museum
+williamsburg.museum
+windmill.museum
+workshop.museum
+york.museum
+yorkshire.museum
+yosemite.museum
+youth.museum
+zoological.museum
+zoology.museum
+××š××©×××.museum
+ÐžÐºÐŸÐŒ.museum
+
+// mv : http://en.wikipedia.org/wiki/.mv
+// "mv" included because, contra Wikipedia, google.mv exists.
+mv
+aero.mv
+biz.mv
+com.mv
+coop.mv
+edu.mv
+gov.mv
+info.mv
+int.mv
+mil.mv
+museum.mv
+name.mv
+net.mv
+org.mv
+pro.mv
+
+// mw : http://www.registrar.mw/
+mw
+ac.mw
+biz.mw
+co.mw
+com.mw
+coop.mw
+edu.mw
+gov.mw
+int.mw
+museum.mw
+net.mw
+org.mw
+
+// mx : http://www.nic.mx/
+// Submitted by registry <farias@nic.mx> 2008-06-19
+mx
+com.mx
+org.mx
+gob.mx
+edu.mx
+net.mx
+
+// my : http://www.mynic.net.my/
+my
+com.my
+net.my
+org.my
+gov.my
+edu.my
+mil.my
+name.my
+
+// mz : http://www.gobin.info/domainname/mz-template.doc
+*.mz
+
+// na : http://www.na-nic.com.na/
+// http://www.info.na/domain/
+na
+info.na
+pro.na
+name.na
+school.na
+or.na
+dr.na
+us.na
+mx.na
+ca.na
+in.na
+cc.na
+tv.na
+ws.na
+mobi.na
+co.na
+com.na
+org.na
+
+// name : has 2nd-level tlds, but there's no list of them
+name
+
+// nc : http://www.cctld.nc/
+nc
+asso.nc
+
+// ne : http://en.wikipedia.org/wiki/.ne
+ne
+
+// net : http://en.wikipedia.org/wiki/.net
+net
+
+// nf : http://en.wikipedia.org/wiki/.nf
+nf
+com.nf
+net.nf
+per.nf
+rec.nf
+web.nf
+arts.nf
+firm.nf
+info.nf
+other.nf
+store.nf
+
+// ng : http://psg.com/dns/ng/
+// Submitted by registry <randy@psg.com> 2008-06-17
+ac.ng
+com.ng
+edu.ng
+gov.ng
+net.ng
+org.ng
+
+// ni : http://www.nic.ni/dominios.htm
+*.ni
+
+// nl : http://www.domain-registry.nl/ace.php/c,728,122,,,,Home.html
+// Confirmed by registry <Antoin.Verschuren@sidn.nl> (with technical
+// reservations) 2008-06-08
+nl
+
+// BV.nl will be a registry for dutch BV's (besloten vennootschap)
+bv.nl
+
+// no : http://www.norid.no/regelverk/index.en.html
+// The Norwegian registry has declined to notify us of updates. The web pages
+// referenced below are the official source of the data. There is also an
+// announce mailing list: 
+// https://postlister.uninett.no/sympa/info/norid-diskusjon
+no
+// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html
+fhs.no
+vgs.no
+fylkesbibl.no
+folkebibl.no
+museum.no
+idrett.no
+priv.no
+// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html
+mil.no
+stat.no
+dep.no
+kommune.no
+herad.no
+// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html
+// counties
+aa.no
+ah.no
+bu.no
+fm.no
+hl.no
+hm.no
+jan-mayen.no
+mr.no
+nl.no
+nt.no
+of.no
+ol.no
+oslo.no
+rl.no
+sf.no
+st.no
+svalbard.no
+tm.no
+tr.no
+va.no
+vf.no
+// primary and lower secondary schools per county
+gs.aa.no
+gs.ah.no
+gs.bu.no
+gs.fm.no
+gs.hl.no
+gs.hm.no
+gs.jan-mayen.no
+gs.mr.no
+gs.nl.no
+gs.nt.no
+gs.of.no
+gs.ol.no
+gs.oslo.no
+gs.rl.no
+gs.sf.no
+gs.st.no
+gs.svalbard.no
+gs.tm.no
+gs.tr.no
+gs.va.no
+gs.vf.no
+// cities
+akrehamn.no
+Ã¥krehamn.no
+algard.no
+Ã¥lgÃ¥rd.no
+arna.no
+brumunddal.no
+bryne.no
+bronnoysund.no
+brÃžnnÃžysund.no
+drobak.no
+drÃžbak.no
+egersund.no
+fetsund.no
+floro.no
+florÃž.no
+fredrikstad.no
+hokksund.no
+honefoss.no
+hÃžnefoss.no
+jessheim.no
+jorpeland.no
+jÃžrpeland.no
+kirkenes.no
+kopervik.no
+krokstadelva.no
+langevag.no
+langevÃ¥g.no
+leirvik.no
+mjondalen.no
+mjÃžndalen.no
+mo-i-rana.no
+mosjoen.no
+mosjÃžen.no
+nesoddtangen.no
+orkanger.no
+osoyro.no
+osÃžyro.no
+raholt.no
+rÃ¥holt.no
+sandnessjoen.no
+sandnessjÃžen.no
+skedsmokorset.no
+slattum.no
+spjelkavik.no
+stathelle.no
+stavern.no
+stjordalshalsen.no
+stjÃžrdalshalsen.no
+tananger.no
+tranby.no
+vossevangen.no
+// communities
+afjord.no
+Ã¥fjord.no
+agdenes.no
+al.no
+Ã¥l.no
+alesund.no
+Ã¥lesund.no
+alstahaug.no
+alta.no
+Ã¡ltÃ¡.no
+alaheadju.no
+Ã¡laheadju.no
+alvdal.no
+amli.no
+Ã¥mli.no
+amot.no
+Ã¥mot.no
+andebu.no
+andoy.no
+andÃžy.no
+andasuolo.no
+ardal.no
+Ã¥rdal.no
+aremark.no
+arendal.no
+Ã¥s.no
+aseral.no
+Ã¥seral.no
+asker.no
+askim.no
+askvoll.no
+askoy.no
+askÃžy.no
+asnes.no
+Ã¥snes.no
+audnedaln.no
+aukra.no
+aure.no
+aurland.no
+aurskog-holand.no
+aurskog-hÃžland.no
+austevoll.no
+austrheim.no
+averoy.no
+averÃžy.no
+balestrand.no
+ballangen.no
+balat.no
+bÃ¡lÃ¡t.no
+balsfjord.no
+bahccavuotna.no
+bÃ¡hccavuotna.no
+bamble.no
+bardu.no
+beardu.no
+beiarn.no
+bajddar.no
+bÃ¡jddar.no
+baidar.no
+bÃ¡idÃ¡r.no
+berg.no
+bergen.no
+berlevag.no
+berlevÃ¥g.no
+bearalvahki.no
+bearalvÃ¡hki.no
+bindal.no
+birkenes.no
+bjarkoy.no
+bjarkÃžy.no
+bjerkreim.no
+bjugn.no
+bodo.no
+bodÃž.no
+badaddja.no
+bÃ¥dÃ¥ddjÃ¥.no
+budejju.no
+bokn.no
+bremanger.no
+bronnoy.no
+brÃžnnÃžy.no
+bygland.no
+bykle.no
+barum.no
+bÃŠrum.no
+bo.telemark.no
+bÃž.telemark.no
+bo.nordland.no
+bÃž.nordland.no
+bievat.no
+bievÃ¡t.no
+bomlo.no
+bÃžmlo.no
+batsfjord.no
+bÃ¥tsfjord.no
+bahcavuotna.no
+bÃ¡hcavuotna.no
+dovre.no
+drammen.no
+drangedal.no
+dyroy.no
+dyrÃžy.no
+donna.no
+dÃžnna.no
+eid.no
+eidfjord.no
+eidsberg.no
+eidskog.no
+eidsvoll.no
+eigersund.no
+elverum.no
+enebakk.no
+engerdal.no
+etne.no
+etnedal.no
+evenes.no
+evenassi.no
+evenÃ¡Å¡Å¡i.no
+evje-og-hornnes.no
+farsund.no
+fauske.no
+fuossko.no
+fuoisku.no
+fedje.no
+fet.no
+finnoy.no
+finnÃžy.no
+fitjar.no
+fjaler.no
+fjell.no
+flakstad.no
+flatanger.no
+flekkefjord.no
+flesberg.no
+flora.no
+fla.no
+flÃ¥.no
+folldal.no
+forsand.no
+fosnes.no
+frei.no
+frogn.no
+froland.no
+frosta.no
+frana.no
+frÃŠna.no
+froya.no
+frÃžya.no
+fusa.no
+fyresdal.no
+forde.no
+fÃžrde.no
+gamvik.no
+gangaviika.no
+gÃ¡Ågaviika.no
+gaular.no
+gausdal.no
+gildeskal.no
+gildeskÃ¥l.no
+giske.no
+gjemnes.no
+gjerdrum.no
+gjerstad.no
+gjesdal.no
+gjovik.no
+gjÃžvik.no
+gloppen.no
+gol.no
+gran.no
+grane.no
+granvin.no
+gratangen.no
+grimstad.no
+grong.no
+kraanghke.no
+krÃ¥anghke.no
+grue.no
+gulen.no
+hadsel.no
+halden.no
+halsa.no
+hamar.no
+hamaroy.no
+habmer.no
+hÃ¡bmer.no
+hapmir.no
+hÃ¡pmir.no
+hammerfest.no
+hammarfeasta.no
+hÃ¡mmÃ¡rfeasta.no
+haram.no
+hareid.no
+harstad.no
+hasvik.no
+aknoluokta.no
+Ã¡kÅoluokta.no
+hattfjelldal.no
+aarborte.no
+haugesund.no
+hemne.no
+hemnes.no
+hemsedal.no
+heroy.more-og-romsdal.no
+herÃžy.mÃžre-og-romsdal.no
+heroy.nordland.no
+herÃžy.nordland.no
+hitra.no
+hjartdal.no
+hjelmeland.no
+hobol.no
+hobÃžl.no
+hof.no
+hol.no
+hole.no
+holmestrand.no
+holtalen.no
+holtÃ¥len.no
+hornindal.no
+horten.no
+hurdal.no
+hurum.no
+hvaler.no
+hyllestad.no
+hagebostad.no
+hÃŠgebostad.no
+hoyanger.no
+hÃžyanger.no
+hoylandet.no
+hÃžylandet.no
+ha.no
+hÃ¥.no
+ibestad.no
+inderoy.no
+inderÃžy.no
+iveland.no
+jevnaker.no
+jondal.no
+jolster.no
+jÃžlster.no
+karasjok.no
+karasjohka.no
+kÃ¡rÃ¡Å¡johka.no
+karlsoy.no
+galsa.no
+gÃ¡lsÃ¡.no
+karmoy.no
+karmÃžy.no
+kautokeino.no
+guovdageaidnu.no
+klepp.no
+klabu.no
+klÃŠbu.no
+kongsberg.no
+kongsvinger.no
+kragero.no
+kragerÃž.no
+kristiansand.no
+kristiansund.no
+krodsherad.no
+krÃždsherad.no
+kvalsund.no
+rahkkeravju.no
+rÃ¡hkkerÃ¡vju.no
+kvam.no
+kvinesdal.no
+kvinnherad.no
+kviteseid.no
+kvitsoy.no
+kvitsÃžy.no
+kvafjord.no
+kvÃŠfjord.no
+giehtavuoatna.no
+kvanangen.no
+kvÃŠnangen.no
+navuotna.no
+nÃ¡vuotna.no
+kafjord.no
+kÃ¥fjord.no
+gaivuotna.no
+gÃ¡ivuotna.no
+larvik.no
+lavangen.no
+lavagis.no
+loabat.no
+loabÃ¡t.no
+lebesby.no
+davvesiida.no
+leikanger.no
+leirfjord.no
+leka.no
+leksvik.no
+lenvik.no
+leangaviika.no
+leaÅgaviika.no
+lesja.no
+levanger.no
+lier.no
+lierne.no
+lillehammer.no
+lillesand.no
+lindesnes.no
+lindas.no
+lindÃ¥s.no
+lom.no
+loppa.no
+lahppi.no
+lÃ¡hppi.no
+lund.no
+lunner.no
+luroy.no
+lurÃžy.no
+luster.no
+lyngdal.no
+lyngen.no
+ivgu.no
+lardal.no
+lerdal.no
+lÃŠrdal.no
+lodingen.no
+lÃždingen.no
+lorenskog.no
+lÃžrenskog.no
+loten.no
+lÃžten.no
+malvik.no
+masoy.no
+mÃ¥sÃžy.no
+muosat.no
+muosÃ¡t.no
+mandal.no
+marker.no
+marnardal.no
+masfjorden.no
+meland.no
+meldal.no
+melhus.no
+meloy.no
+melÃžy.no
+meraker.no
+merÃ¥ker.no
+moareke.no
+moÃ¥reke.no
+midsund.no
+midtre-gauldal.no
+modalen.no
+modum.no
+molde.no
+moskenes.no
+moss.no
+mosvik.no
+malselv.no
+mÃ¥lselv.no
+malatvuopmi.no
+mÃ¡latvuopmi.no
+namdalseid.no
+aejrie.no
+namsos.no
+namsskogan.no
+naamesjevuemie.no
+nÃ¥Ã¥mesjevuemie.no
+laakesvuemie.no
+nannestad.no
+narvik.no
+narviika.no
+naustdal.no
+nedre-eiker.no
+nes.akershus.no
+nes.buskerud.no
+nesna.no
+nesodden.no
+nesseby.no
+unjarga.no
+unjÃ¡rga.no
+nesset.no
+nissedal.no
+nittedal.no
+nord-aurdal.no
+nord-fron.no
+nord-odal.no
+norddal.no
+nordkapp.no
+davvenjarga.no
+davvenjÃ¡rga.no
+nordre-land.no
+nordreisa.no
+raisa.no
+rÃ¡isa.no
+nore-og-uvdal.no
+notodden.no
+naroy.no
+nÃŠrÃžy.no
+notteroy.no
+nÃžtterÃžy.no
+odda.no
+oksnes.no
+Ãžksnes.no
+oppdal.no
+oppegard.no
+oppegÃ¥rd.no
+orkdal.no
+orland.no
+Ãžrland.no
+orskog.no
+Ãžrskog.no
+orsta.no
+Ãžrsta.no
+os.hedmark.no
+os.hordaland.no
+osen.no
+osteroy.no
+osterÃžy.no
+ostre-toten.no
+Ãžstre-toten.no
+overhalla.no
+ovre-eiker.no
+Ãžvre-eiker.no
+oyer.no
+Ãžyer.no
+oygarden.no
+Ãžygarden.no
+oystre-slidre.no
+Ãžystre-slidre.no
+porsanger.no
+porsangu.no
+porsÃ¡Ågu.no
+porsgrunn.no
+radoy.no
+radÃžy.no
+rakkestad.no
+rana.no
+ruovat.no
+randaberg.no
+rauma.no
+rendalen.no
+rennebu.no
+rennesoy.no
+rennesÃžy.no
+rindal.no
+ringebu.no
+ringerike.no
+ringsaker.no
+rissa.no
+risor.no
+risÃžr.no
+roan.no
+rollag.no
+rygge.no
+ralingen.no
+rÃŠlingen.no
+rodoy.no
+rÃždÃžy.no
+romskog.no
+rÃžmskog.no
+roros.no
+rÃžros.no
+rost.no
+rÃžst.no
+royken.no
+rÃžyken.no
+royrvik.no
+rÃžyrvik.no
+rade.no
+rÃ¥de.no
+salangen.no
+siellak.no
+saltdal.no
+salat.no
+sÃ¡lÃ¡t.no
+sÃ¡lat.no
+samnanger.no
+sande.more-og-romsdal.no
+sande.mÃžre-og-romsdal.no
+sande.vestfold.no
+sandefjord.no
+sandnes.no
+sandoy.no
+sandÃžy.no
+sarpsborg.no
+sauda.no
+sauherad.no
+sel.no
+selbu.no
+selje.no
+seljord.no
+sigdal.no
+siljan.no
+sirdal.no
+skaun.no
+skedsmo.no
+ski.no
+skien.no
+skiptvet.no
+skjervoy.no
+skjervÃžy.no
+skierva.no
+skiervÃ¡.no
+skjak.no
+skjÃ¥k.no
+skodje.no
+skanland.no
+skÃ¥nland.no
+skanit.no
+skÃ¡nit.no
+smola.no
+smÃžla.no
+snillfjord.no
+snasa.no
+snÃ¥sa.no
+snoasa.no
+snaase.no
+snÃ¥ase.no
+sogndal.no
+sokndal.no
+sola.no
+solund.no
+songdalen.no
+sortland.no
+spydeberg.no
+stange.no
+stavanger.no
+steigen.no
+steinkjer.no
+stjordal.no
+stjÃžrdal.no
+stokke.no
+stor-elvdal.no
+stord.no
+stordal.no
+storfjord.no
+omasvuotna.no
+strand.no
+stranda.no
+stryn.no
+sula.no
+suldal.no
+sund.no
+sunndal.no
+surnadal.no
+sveio.no
+svelvik.no
+sykkylven.no
+sogne.no
+sÃžgne.no
+somna.no
+sÃžmna.no
+sondre-land.no
+sÃžndre-land.no
+sor-aurdal.no
+sÃžr-aurdal.no
+sor-fron.no
+sÃžr-fron.no
+sor-odal.no
+sÃžr-odal.no
+sor-varanger.no
+sÃžr-varanger.no
+matta-varjjat.no
+mÃ¡tta-vÃ¡rjjat.no
+sorfold.no
+sÃžrfold.no
+sorreisa.no
+sÃžrreisa.no
+sorum.no
+sÃžrum.no
+tana.no
+deatnu.no
+time.no
+tingvoll.no
+tinn.no
+tjeldsund.no
+dielddanuorri.no
+tjome.no
+tjÃžme.no
+tokke.no
+tolga.no
+torsken.no
+tranoy.no
+tranÃžy.no
+tromso.no
+tromsÃž.no
+tromsa.no
+romsa.no
+trondheim.no
+troandin.no
+trysil.no
+trana.no
+trÃŠna.no
+trogstad.no
+trÃžgstad.no
+tvedestrand.no
+tydal.no
+tynset.no
+tysfjord.no
+divtasvuodna.no
+divttasvuotna.no
+tysnes.no
+tysvar.no
+tysvÃŠr.no
+tonsberg.no
+tÃžnsberg.no
+ullensaker.no
+ullensvang.no
+ulvik.no
+utsira.no
+vadso.no
+vadsÃž.no
+cahcesuolo.no
+ÄÃ¡hcesuolo.no
+vaksdal.no
+valle.no
+vang.no
+vanylven.no
+vardo.no
+vardÃž.no
+varggat.no
+vÃ¡rggÃ¡t.no
+vefsn.no
+vaapste.no
+vega.no
+vegarshei.no
+vegÃ¥rshei.no
+vennesla.no
+verdal.no
+verran.no
+vestby.no
+vestnes.no
+vestre-slidre.no
+vestre-toten.no
+vestvagoy.no
+vestvÃ¥gÃžy.no
+vevelstad.no
+vik.no
+vikna.no
+vindafjord.no
+volda.no
+voss.no
+varoy.no
+vÃŠrÃžy.no
+vagan.no
+vÃ¥gan.no
+voagat.no
+vagsoy.no
+vÃ¥gsÃžy.no
+vaga.no
+vÃ¥gÃ¥.no
+valer.ostfold.no
+vÃ¥ler.Ãžstfold.no
+valer.hedmark.no
+vÃ¥ler.hedmark.no
+
+// np : http://www.mos.com.np/register.html
+*.np
+
+// nr : http://cenpac.net.nr/dns/index.html
+// Confirmed by registry <technician@cenpac.net.nr> 2008-06-17
+nr
+biz.nr
+info.nr
+gov.nr
+edu.nr
+org.nr
+net.nr
+com.nr
+
+// nu : http://en.wikipedia.org/wiki/.nu
+nu
+
+// nz : http://en.wikipedia.org/wiki/.nz
+*.nz
+
+// om : http://en.wikipedia.org/wiki/.om
+*.om
+!mediaphone.om
+!nawrastelecom.om
+!nawras.om
+!omanmobile.om
+!omanpost.om
+!omantel.om
+!rakpetroleum.om
+!siemens.om
+!songfest.om
+!statecouncil.om
+
+// org : http://en.wikipedia.org/wiki/.org
+org
+
+// pa : http://www.nic.pa/
+// Some additional second level "domains" resolve directly as hostnames, such as
+// pannet.pa, so we add a rule for "pa".
+pa
+ac.pa
+gob.pa
+com.pa
+org.pa
+sld.pa
+edu.pa
+net.pa
+ing.pa
+abo.pa
+med.pa
+nom.pa
+
+// pe : https://www.nic.pe/InformeFinalComision.pdf
+pe
+edu.pe
+gob.pe
+nom.pe
+mil.pe
+org.pe
+com.pe
+net.pe
+
+// pf : http://www.gobin.info/domainname/formulaire-pf.pdf
+pf
+com.pf
+org.pf
+edu.pf
+
+// pg : http://en.wikipedia.org/wiki/.pg
+*.pg
+
+// ph : http://www.domains.ph/FAQ2.asp
+// Submitted by registry <jed@email.com.ph> 2008-06-13
+ph
+com.ph
+net.ph
+org.ph
+gov.ph
+edu.ph
+ngo.ph
+mil.ph
+i.ph
+
+// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK
+pk
+com.pk
+net.pk
+edu.pk
+org.pk
+fam.pk
+biz.pk
+web.pk
+gov.pk
+gob.pk
+gok.pk
+gon.pk
+gop.pk
+gos.pk
+info.pk
+
+// pl : http://www.dns.pl/english/
+pl
+// NASK functional domains (nask.pl / dns.pl) : http://www.dns.pl/english/dns-funk.html
+aid.pl
+agro.pl
+atm.pl
+auto.pl
+biz.pl
+com.pl
+edu.pl
+gmina.pl
+gsm.pl
+info.pl
+mail.pl
+miasta.pl
+media.pl
+mil.pl
+net.pl
+nieruchomosci.pl
+nom.pl
+org.pl
+pc.pl
+powiat.pl
+priv.pl
+realestate.pl
+rel.pl
+sex.pl
+shop.pl
+sklep.pl
+sos.pl
+szkola.pl
+targi.pl
+tm.pl
+tourism.pl
+travel.pl
+turystyka.pl
+// ICM functional domains (icm.edu.pl)
+6bone.pl
+art.pl
+mbone.pl
+// Government domains (administred by ippt.gov.pl)
+gov.pl
+uw.gov.pl
+um.gov.pl
+ug.gov.pl
+upow.gov.pl
+starostwo.gov.pl
+so.gov.pl
+sr.gov.pl
+po.gov.pl
+pa.gov.pl
+// other functional domains
+ngo.pl
+irc.pl
+usenet.pl
+// NASK geographical domains : http://www.dns.pl/english/dns-regiony.html
+augustow.pl
+babia-gora.pl
+bedzin.pl
+beskidy.pl
+bialowieza.pl
+bialystok.pl
+bielawa.pl
+bieszczady.pl
+boleslawiec.pl
+bydgoszcz.pl
+bytom.pl
+cieszyn.pl
+czeladz.pl
+czest.pl
+dlugoleka.pl
+elblag.pl
+elk.pl
+glogow.pl
+gniezno.pl
+gorlice.pl
+grajewo.pl
+ilawa.pl
+jaworzno.pl
+jelenia-gora.pl
+jgora.pl
+kalisz.pl
+kazimierz-dolny.pl
+karpacz.pl
+kartuzy.pl
+kaszuby.pl
+katowice.pl
+kepno.pl
+ketrzyn.pl
+klodzko.pl
+kobierzyce.pl
+kolobrzeg.pl
+konin.pl
+konskowola.pl
+kutno.pl
+lapy.pl
+lebork.pl
+legnica.pl
+lezajsk.pl
+limanowa.pl
+lomza.pl
+lowicz.pl
+lubin.pl
+lukow.pl
+malbork.pl
+malopolska.pl
+mazowsze.pl
+mazury.pl
+mielec.pl
+mielno.pl
+mragowo.pl
+naklo.pl
+nowaruda.pl
+nysa.pl
+olawa.pl
+olecko.pl
+olkusz.pl
+olsztyn.pl
+opoczno.pl
+opole.pl
+ostroda.pl
+ostroleka.pl
+ostrowiec.pl
+ostrowwlkp.pl
+pila.pl
+pisz.pl
+podhale.pl
+podlasie.pl
+polkowice.pl
+pomorze.pl
+pomorskie.pl
+prochowice.pl
+pruszkow.pl
+przeworsk.pl
+pulawy.pl
+radom.pl
+rawa-maz.pl
+rybnik.pl
+rzeszow.pl
+sanok.pl
+sejny.pl
+siedlce.pl
+slask.pl
+slupsk.pl
+sosnowiec.pl
+stalowa-wola.pl
+skoczow.pl
+starachowice.pl
+stargard.pl
+suwalki.pl
+swidnica.pl
+swiebodzin.pl
+swinoujscie.pl
+szczecin.pl
+szczytno.pl
+tarnobrzeg.pl
+tgory.pl
+turek.pl
+tychy.pl
+ustka.pl
+walbrzych.pl
+warmia.pl
+warszawa.pl
+waw.pl
+wegrow.pl
+wielun.pl
+wlocl.pl
+wloclawek.pl
+wodzislaw.pl
+wolomin.pl
+wroclaw.pl
+zachpomor.pl
+zagan.pl
+zarow.pl
+zgora.pl
+zgorzelec.pl
+// TASK geographical domains (www.task.gda.pl/uslugi/dns)
+gda.pl
+gdansk.pl
+gdynia.pl
+med.pl
+sopot.pl
+// other geographical domains
+gliwice.pl
+krakow.pl
+poznan.pl
+wroc.pl
+zakopane.pl
+
+// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf
+pm
+
+// pn : http://www.government.pn/PnRegistry/policies.htm
+pn
+gov.pn
+co.pn
+org.pn
+edu.pn
+net.pn
+
+// pr : http://www.nic.pr/index.asp?f=1
+pr
+com.pr
+net.pr
+org.pr
+gov.pr
+edu.pr
+isla.pr
+pro.pr
+biz.pr
+info.pr
+name.pr
+// these aren't mentioned on nic.pr, but on http://en.wikipedia.org/wiki/.pr
+est.pr
+prof.pr
+ac.pr
+
+// pro : http://www.nic.pro/support_faq.htm
+pro
+aca.pro
+bar.pro
+cpa.pro
+jur.pro
+law.pro
+med.pro
+eng.pro
+
+// ps : http://en.wikipedia.org/wiki/.ps
+// http://www.nic.ps/registration/policy.html#reg
+ps
+edu.ps
+gov.ps
+sec.ps
+plo.ps
+com.ps
+org.ps
+net.ps
+
+// pt : http://online.dns.pt/dns/start_dns
+pt
+net.pt
+gov.pt
+org.pt
+edu.pt
+int.pt
+publ.pt
+com.pt
+nome.pt
+
+// pw : http://en.wikipedia.org/wiki/.pw
+pw
+co.pw
+ne.pw
+or.pw
+ed.pw
+go.pw
+belau.pw
+
+// py : http://www.nic.py/faq_a.html#faq_b
+*.py
+
+// qa : http://domains.qa/en/
+qa
+com.qa
+edu.qa
+gov.qa
+mil.qa
+name.qa
+net.qa
+org.qa
+sch.qa
+
+// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs
+re
+com.re
+asso.re
+nom.re
+
+// ro : http://www.rotld.ro/
+ro
+com.ro
+org.ro
+tm.ro
+nt.ro
+nom.ro
+info.ro
+rec.ro
+arts.ro
+firm.ro
+store.ro
+www.ro
+
+// rs : http://en.wikipedia.org/wiki/.rs
+rs
+co.rs
+org.rs
+edu.rs
+ac.rs
+gov.rs
+in.rs
+
+// ru : http://www.cctld.ru/ru/docs/aktiv_8.php
+// Industry domains
+ru
+ac.ru
+com.ru
+edu.ru
+int.ru
+net.ru
+org.ru
+pp.ru
+// Geographical domains
+adygeya.ru
+altai.ru
+amur.ru
+arkhangelsk.ru
+astrakhan.ru
+bashkiria.ru
+belgorod.ru
+bir.ru
+bryansk.ru
+buryatia.ru
+cbg.ru
+chel.ru
+chelyabinsk.ru
+chita.ru
+chukotka.ru
+chuvashia.ru
+dagestan.ru
+dudinka.ru
+e-burg.ru
+grozny.ru
+irkutsk.ru
+ivanovo.ru
+izhevsk.ru
+jar.ru
+joshkar-ola.ru
+kalmykia.ru
+kaluga.ru
+kamchatka.ru
+karelia.ru
+kazan.ru
+kchr.ru
+kemerovo.ru
+khabarovsk.ru
+khakassia.ru
+khv.ru
+kirov.ru
+koenig.ru
+komi.ru
+kostroma.ru
+krasnoyarsk.ru
+kuban.ru
+kurgan.ru
+kursk.ru
+lipetsk.ru
+magadan.ru
+mari.ru
+mari-el.ru
+marine.ru
+mordovia.ru
+mosreg.ru
+msk.ru
+murmansk.ru
+nalchik.ru
+nnov.ru
+nov.ru
+novosibirsk.ru
+nsk.ru
+omsk.ru
+orenburg.ru
+oryol.ru
+palana.ru
+penza.ru
+perm.ru
+pskov.ru
+ptz.ru
+rnd.ru
+ryazan.ru
+sakhalin.ru
+samara.ru
+saratov.ru
+simbirsk.ru
+smolensk.ru
+spb.ru
+stavropol.ru
+stv.ru
+surgut.ru
+tambov.ru
+tatarstan.ru
+tom.ru
+tomsk.ru
+tsaritsyn.ru
+tsk.ru
+tula.ru
+tuva.ru
+tver.ru
+tyumen.ru
+udm.ru
+udmurtia.ru
+ulan-ude.ru
+vladikavkaz.ru
+vladimir.ru
+vladivostok.ru
+volgograd.ru
+vologda.ru
+voronezh.ru
+vrn.ru
+vyatka.ru
+yakutia.ru
+yamal.ru
+yaroslavl.ru
+yekaterinburg.ru
+yuzhno-sakhalinsk.ru
+// More geographical domains
+amursk.ru
+baikal.ru
+cmw.ru
+fareast.ru
+jamal.ru
+kms.ru
+k-uralsk.ru
+kustanai.ru
+kuzbass.ru
+magnitka.ru
+mytis.ru
+nakhodka.ru
+nkz.ru
+norilsk.ru
+oskol.ru
+pyatigorsk.ru
+rubtsovsk.ru
+snz.ru
+syzran.ru
+vdonsk.ru
+zgrad.ru
+// State domains
+gov.ru
+mil.ru
+// Technical domains
+test.ru
+
+// rw : http://www.nic.rw/cgi-bin/policy.pl
+rw
+gov.rw
+net.rw
+edu.rw
+ac.rw
+com.rw
+co.rw
+int.rw
+mil.rw
+gouv.rw
+
+// sa : http://www.nic.net.sa/
+sa
+com.sa
+net.sa
+org.sa
+gov.sa
+med.sa
+pub.sa
+edu.sa
+sch.sa
+
+// sb : http://www.sbnic.net.sb/
+// Submitted by registry <lee.humphries@telekom.com.sb> 2008-06-08
+sb
+com.sb
+edu.sb
+gov.sb
+net.sb
+org.sb
+
+// sc : http://www.nic.sc/
+sc
+com.sc
+gov.sc
+net.sc
+org.sc
+edu.sc
+
+// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm
+// Submitted by registry <admin@isoc.sd> 2008-06-17
+sd
+com.sd
+net.sd
+org.sd
+edu.sd
+med.sd
+gov.sd
+info.sd
+
+// se : http://en.wikipedia.org/wiki/.se
+// Submitted by registry <Patrik.Wallstrom@iis.se> 2008-06-24
+se
+a.se
+ac.se
+b.se
+bd.se
+brand.se
+c.se
+d.se
+e.se
+f.se
+fh.se
+fhsk.se
+fhv.se
+g.se
+h.se
+i.se
+k.se
+komforb.se
+kommunalforbund.se
+komvux.se
+l.se
+lanbib.se
+m.se
+n.se
+naturbruksgymn.se
+o.se
+org.se
+p.se
+parti.se
+pp.se
+press.se
+r.se
+s.se
+sshn.se
+t.se
+tm.se
+u.se
+w.se
+x.se
+y.se
+z.se
+
+// sg : http://www.nic.net.sg/sub_policies_agreement/2ld.html
+sg
+com.sg
+net.sg
+org.sg
+gov.sg
+edu.sg
+per.sg
+
+// sh : http://www.nic.sh/rules.html
+// list of 2nd level domains ?
+sh
+
+// si : http://en.wikipedia.org/wiki/.si
+si
+
+// sj : No registrations at this time.
+// Submitted by registry <jarle@uninett.no> 2008-06-16
+
+// sk : http://en.wikipedia.org/wiki/.sk
+// list of 2nd level domains ?
+sk
+
+// sl : http://www.nic.sl
+// Submitted by registry <adam@neoip.com> 2008-06-12
+sl
+com.sl
+net.sl
+edu.sl
+gov.sl
+org.sl
+
+// sm : http://en.wikipedia.org/wiki/.sm
+sm
+
+// sn : http://en.wikipedia.org/wiki/.sn
+sn
+art.sn
+com.sn
+edu.sn
+gouv.sn
+org.sn
+perso.sn
+univ.sn
+
+// so : http://www.soregistry.com/
+so
+com.so
+net.so
+org.so
+
+// sr : http://en.wikipedia.org/wiki/.sr
+sr
+
+// st : http://www.nic.st/html/policyrules/
+st
+co.st
+com.st
+consulado.st
+edu.st
+embaixada.st
+gov.st
+mil.st
+net.st
+org.st
+principe.st
+saotome.st
+store.st
+
+// su : http://en.wikipedia.org/wiki/.su
+su
+
+// sv : http://www.svnet.org.sv/svpolicy.html
+*.sv
+
+// sy : http://en.wikipedia.org/wiki/.sy
+// see also: http://www.gobin.info/domainname/sy.doc
+sy
+edu.sy
+gov.sy
+net.sy
+mil.sy
+com.sy
+org.sy
+
+// sz : http://en.wikipedia.org/wiki/.sz
+// http://www.sispa.org.sz/
+sz
+co.sz
+ac.sz
+org.sz
+
+// tc : http://en.wikipedia.org/wiki/.tc
+tc
+
+// td : http://en.wikipedia.org/wiki/.td
+td
+
+// tel: http://en.wikipedia.org/wiki/.tel
+// http://www.telnic.org/
+tel
+
+// tf : http://en.wikipedia.org/wiki/.tf
+tf
+
+// tg : http://en.wikipedia.org/wiki/.tg
+// http://www.nic.tg/nictg/index.php implies no reserved 2nd-level domains,
+// although this contradicts wikipedia.
+tg
+
+// th : http://en.wikipedia.org/wiki/.th
+// Submitted by registry <krit@thains.co.th> 2008-06-17
+th
+ac.th
+co.th
+go.th
+in.th
+mi.th
+net.th
+or.th
+
+// tj : http://www.nic.tj/policy.htm
+tj
+ac.tj
+biz.tj
+co.tj
+com.tj
+edu.tj
+go.tj
+gov.tj
+int.tj
+mil.tj
+name.tj
+net.tj
+nic.tj
+org.tj
+test.tj
+web.tj
+
+// tk : http://en.wikipedia.org/wiki/.tk
+tk
+
+// tl : http://en.wikipedia.org/wiki/.tl
+tl
+gov.tl
+
+// tm : http://www.nic.tm/rules.html
+// list of 2nd level tlds ?
+tm
+
+// tn : http://en.wikipedia.org/wiki/.tn
+// http://whois.ati.tn/
+tn
+com.tn
+ens.tn
+fin.tn
+gov.tn
+ind.tn
+intl.tn
+nat.tn
+net.tn
+org.tn
+info.tn
+perso.tn
+tourism.tn
+edunet.tn
+rnrt.tn
+rns.tn
+rnu.tn
+mincom.tn
+agrinet.tn
+defense.tn
+turen.tn
+
+// to : http://en.wikipedia.org/wiki/.to
+// Submitted by registry <egullich@colo.to> 2008-06-17
+to
+com.to
+gov.to
+net.to
+org.to
+edu.to
+mil.to
+
+// tr : http://en.wikipedia.org/wiki/.tr
+*.tr
+!nic.tr
+// Used by government in the TRNC
+// http://en.wikipedia.org/wiki/.nc.tr
+gov.nc.tr
+
+// travel : http://en.wikipedia.org/wiki/.travel
+travel
+
+// tt : http://www.nic.tt/
+tt
+co.tt
+com.tt
+org.tt
+net.tt
+biz.tt
+info.tt
+pro.tt
+int.tt
+coop.tt
+jobs.tt
+mobi.tt
+travel.tt
+museum.tt
+aero.tt
+name.tt
+gov.tt
+edu.tt
+
+// tv : http://en.wikipedia.org/wiki/.tv
+// Not listing any 2LDs as reserved since none seem to exist in practice,
+// Wikipedia notwithstanding.
+tv
+
+// tw : http://en.wikipedia.org/wiki/.tw
+tw
+edu.tw
+gov.tw
+mil.tw
+com.tw
+net.tw
+org.tw
+idv.tw
+game.tw
+ebiz.tw
+club.tw
+ç¶²è·¯.tw
+çµç¹.tw
+åæ¥­.tw
+
+// tz : http://en.wikipedia.org/wiki/.tz
+// Submitted by registry <randy@psg.com> 2008-06-17
+// Updated from http://www.tznic.or.tz/index.php/domains.html 2010-10-25
+ac.tz
+co.tz
+go.tz
+mil.tz
+ne.tz
+or.tz
+sc.tz
+
+// ua : http://www.nic.net.ua/
+ua
+com.ua
+edu.ua
+gov.ua
+in.ua
+net.ua
+org.ua
+// ua geo-names
+cherkassy.ua
+chernigov.ua
+chernovtsy.ua
+ck.ua
+cn.ua
+crimea.ua
+cv.ua
+dn.ua
+dnepropetrovsk.ua
+donetsk.ua
+dp.ua
+if.ua
+ivano-frankivsk.ua
+kh.ua
+kharkov.ua
+kherson.ua
+khmelnitskiy.ua
+kiev.ua
+kirovograd.ua
+km.ua
+kr.ua
+ks.ua
+kv.ua
+lg.ua
+lugansk.ua
+lutsk.ua
+lviv.ua
+mk.ua
+nikolaev.ua
+od.ua
+odessa.ua
+pl.ua
+poltava.ua
+rovno.ua
+rv.ua
+sebastopol.ua
+sumy.ua
+te.ua
+ternopil.ua
+uzhgorod.ua
+vinnica.ua
+vn.ua
+zaporizhzhe.ua
+zp.ua
+zhitomir.ua
+zt.ua
+
+// Private registries in .ua
+co.ua
+pp.ua
+
+// ug : http://www.registry.co.ug/
+ug
+co.ug
+ac.ug
+sc.ug
+go.ug
+ne.ug
+or.ug
+
+// uk : http://en.wikipedia.org/wiki/.uk
+*.uk
+*.sch.uk
+!bl.uk
+!british-library.uk
+!icnet.uk
+!jet.uk
+!mod.uk
+!nel.uk
+!nhs.uk
+!nic.uk
+!nls.uk
+!national-library-scotland.uk
+!parliament.uk
+!police.uk
+
+// us : http://en.wikipedia.org/wiki/.us
+us
+dni.us
+fed.us
+isa.us
+kids.us
+nsn.us
+// us geographic names
+ak.us
+al.us
+ar.us
+as.us
+az.us
+ca.us
+co.us
+ct.us
+dc.us
+de.us
+fl.us
+ga.us
+gu.us
+hi.us
+ia.us
+id.us
+il.us
+in.us
+ks.us
+ky.us
+la.us
+ma.us
+md.us
+me.us
+mi.us
+mn.us
+mo.us
+ms.us
+mt.us
+nc.us
+nd.us
+ne.us
+nh.us
+nj.us
+nm.us
+nv.us
+ny.us
+oh.us
+ok.us
+or.us
+pa.us
+pr.us
+ri.us
+sc.us
+sd.us
+tn.us
+tx.us
+ut.us
+vi.us
+vt.us
+va.us
+wa.us
+wi.us
+wv.us
+wy.us
+// The registrar notes several more specific domains available in each state,
+// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat
+// haphazard; in some states these domains resolve as addresses, while in others
+// only subdomains are available, or even nothing at all. We include the
+// most common ones where it's clear that different sites are different
+// entities.
+k12.ak.us
+k12.al.us
+k12.ar.us
+k12.as.us
+k12.az.us
+k12.ca.us
+k12.co.us
+k12.ct.us
+k12.dc.us
+k12.de.us
+k12.fl.us
+k12.ga.us
+k12.gu.us
+// k12.hi.us  Hawaii has a state-wide DOE login: bug 614565
+k12.ia.us
+k12.id.us
+k12.il.us
+k12.in.us
+k12.ks.us
+k12.ky.us
+k12.la.us
+k12.ma.us
+k12.md.us
+k12.me.us
+k12.mi.us
+k12.mn.us
+k12.mo.us
+k12.ms.us
+k12.mt.us
+k12.nc.us
+k12.nd.us
+k12.ne.us
+k12.nh.us
+k12.nj.us
+k12.nm.us
+k12.nv.us
+k12.ny.us
+k12.oh.us
+k12.ok.us
+k12.or.us
+k12.pa.us
+k12.pr.us
+k12.ri.us
+k12.sc.us
+k12.sd.us
+k12.tn.us
+k12.tx.us
+k12.ut.us
+k12.vi.us
+k12.vt.us
+k12.va.us
+k12.wa.us
+k12.wi.us
+k12.wv.us
+k12.wy.us
+
+cc.ak.us
+cc.al.us
+cc.ar.us
+cc.as.us
+cc.az.us
+cc.ca.us
+cc.co.us
+cc.ct.us
+cc.dc.us
+cc.de.us
+cc.fl.us
+cc.ga.us
+cc.gu.us
+cc.hi.us
+cc.ia.us
+cc.id.us
+cc.il.us
+cc.in.us
+cc.ks.us
+cc.ky.us
+cc.la.us
+cc.ma.us
+cc.md.us
+cc.me.us
+cc.mi.us
+cc.mn.us
+cc.mo.us
+cc.ms.us
+cc.mt.us
+cc.nc.us
+cc.nd.us
+cc.ne.us
+cc.nh.us
+cc.nj.us
+cc.nm.us
+cc.nv.us
+cc.ny.us
+cc.oh.us
+cc.ok.us
+cc.or.us
+cc.pa.us
+cc.pr.us
+cc.ri.us
+cc.sc.us
+cc.sd.us
+cc.tn.us
+cc.tx.us
+cc.ut.us
+cc.vi.us
+cc.vt.us
+cc.va.us
+cc.wa.us
+cc.wi.us
+cc.wv.us
+cc.wy.us
+
+lib.ak.us
+lib.al.us
+lib.ar.us
+lib.as.us
+lib.az.us
+lib.ca.us
+lib.co.us
+lib.ct.us
+lib.dc.us
+lib.de.us
+lib.fl.us
+lib.ga.us
+lib.gu.us
+lib.hi.us
+lib.ia.us
+lib.id.us
+lib.il.us
+lib.in.us
+lib.ks.us
+lib.ky.us
+lib.la.us
+lib.ma.us
+lib.md.us
+lib.me.us
+lib.mi.us
+lib.mn.us
+lib.mo.us
+lib.ms.us
+lib.mt.us
+lib.nc.us
+lib.nd.us
+lib.ne.us
+lib.nh.us
+lib.nj.us
+lib.nm.us
+lib.nv.us
+lib.ny.us
+lib.oh.us
+lib.ok.us
+lib.or.us
+lib.pa.us
+lib.pr.us
+lib.ri.us
+lib.sc.us
+lib.sd.us
+lib.tn.us
+lib.tx.us
+lib.ut.us
+lib.vi.us
+lib.vt.us
+lib.va.us
+lib.wa.us
+lib.wi.us
+lib.wv.us
+lib.wy.us
+
+// k12.ma.us contains school districts in Massachusetts. The 4LDs are 
+//  managed indepedently except for private (PVT), charter (CHTR) and
+//  parochial (PAROCH) schools.  Those are delegated dorectly to the 
+//  5LD operators.   <k12-ma-hostmaster _ at _ rsuc.gweep.net>
+pvt.k12.ma.us
+chtr.k12.ma.us
+paroch.k12.ma.us
+
+// uy : http://www.antel.com.uy/
+*.uy
+
+// uz : http://www.reg.uz/registerr.html
+// are there other 2nd level tlds ?
+uz
+com.uz
+co.uz
+
+// va : http://en.wikipedia.org/wiki/.va
+va
+
+// vc : http://en.wikipedia.org/wiki/.vc
+// Submitted by registry <kshah@ca.afilias.info> 2008-06-13
+vc
+com.vc
+net.vc
+org.vc
+gov.vc
+mil.vc
+edu.vc
+
+// ve : http://registro.nic.ve/nicve/registro/index.html
+*.ve
+
+// vg : http://en.wikipedia.org/wiki/.vg
+vg
+
+// vi : http://www.nic.vi/newdomainform.htm
+// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other
+// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they
+// are available for registration (which they do not seem to be).
+vi
+co.vi
+com.vi
+k12.vi
+net.vi
+org.vi
+
+// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp
+vn
+com.vn
+net.vn
+org.vn
+edu.vn
+gov.vn
+int.vn
+ac.vn
+biz.vn
+info.vn
+name.vn
+pro.vn
+health.vn
+
+// vu : http://en.wikipedia.org/wiki/.vu
+// list of 2nd level tlds ?
+vu
+
+// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf
+wf
+
+// ws : http://en.wikipedia.org/wiki/.ws
+// http://samoanic.ws/index.dhtml
+ws
+com.ws
+net.ws
+org.ws
+gov.ws
+edu.ws
+
+// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf
+yt
+
+// IDN ccTLDs
+// Please sort by ISO 3166 ccTLD, then punicode string
+// when submitting patches and follow this format:
+// <Punicode> ("<english word>" <language>) : <ISO 3166 ccTLD>
+// [optional sponsoring org]
+// <URL>
+
+// xn--mgbaam7a8h ("Emerat" Arabic) : AE
+//http://nic.ae/english/arabicdomain/rules.jsp
+Ø§Ù
+Ø§Ø±Ø§Øª
+
+// xn--54b7fta0cc ("Bangla" Bangla) : BD  
+àŠ¬àŠŸàŠàŠ²àŠŸ
+
+// xn--fiqs8s ("China" Chinese-Han-Simplified <.Zhonggou>) : CN 
+// CNNIC
+// http://cnnic.cn/html/Dir/2005/10/11/3218.htm
+äž­åœ
+
+// xn--fiqz9s ("China" Chinese-Han-Traditional <.Zhonggou>) : CN
+// CNNIC
+// http://cnnic.cn/html/Dir/2005/10/11/3218.htm
+äž­å
+
+// xn--lgbbat1ad8j ("Algeria / Al Jazair" Arabic) : DZ  
+Ø§ÙØ¬Ø²Ø§ØŠØ±
+
+// xn--wgbh1c ("Egypt" Arabic .masr) : EG
+// http://www.dotmasr.eg/
+Ù
+ØµØ±
+
+// xn--node ("ge" Georgian (Mkhedruli)) : GE  
+áá
+
+// xn--j6w193g ("Hong Kong" Chinese-Han) : HK
+// https://www2.hkirc.hk/register/rules.jsp
+éŠæž¯
+
+// xn--h2brj9c ("Bharat" Devanagari) : IN  
+// India
+à€­à€Ÿà€°à€€
+
+// xn--mgbbh1a71e ("Bharat" Arabic) : IN  
+// India
+ØšÚŸØ§Ø±Øª
+
+// xn--fpcrj9c3d ("Bharat" Telugu) : IN  
+// India
+à°­à°Ÿà°°à°€à±
+
+// xn--gecrj9c ("Bharat" Gujarati) : IN  
+// India
+àª­àªŸàª°àª€
+
+// xn--s9brj9c ("Bharat" Gurmukhi) : IN  
+// India
+àš­àšŸàš°àš€
+
+// xn--45brj9c ("Bharat" Bengali) : IN  
+// India
+àŠ­àŠŸàŠ°àŠ€
+
+// xn--xkc2dl3a5ee0h ("India" Tamil) : IN  
+// India
+à®à®šà¯à®€à®¿à®¯à®Ÿ
+
+// xn--mgba3a4f16a ("Iran" Persian) : IR  
+Ø§ÛØ±Ø§Ù
+
+// xn--mgba3a4fra ("Iran" Arabic) : IR  
+Ø§ÙØ±Ø§Ù
+
+//xn--mgbayh7gpa ("al-Ordon" Arabic) JO
+//National Information Technology Center (NITC) 
+//Royal Scientific Society, Al-Jubeiha
+Ø§ÙØ§Ø±Ø¯Ù
+
+// xn--3e0b707e ("Republic of Korea" Hangul) : KR  
+íêµ­
+
+// xn--fzc2c9e2c ("Lanka" Sinhalese-Sinhala) : LK
+// http://nic.lk
+à¶œà¶à¶à·
+
+// xn--xkc2al3hye2a ("Ilangai" Tamil) : LK
+// http://nic.lk
+à®à®²à®à¯à®à¯
+
+// xn--mgbc0a9azcg ("Morocco / al-Maghrib" Arabic) : MA  
+Ø§ÙÙ
+ØºØ±Øš
+
+// xn--mgb9awbf ("Oman" Arabic) : OM  
+Ø¹Ù
+Ø§Ù
+
+// xn--ygbi2ammx ("Falasteen" Arabic) : PS
+// The Palestinian National Internet Naming Authority (PNINA)
+// http://www.pnina.ps
+ÙÙØ³Ø·ÙÙ
+
+// xn--90a3ac ("srb" Cyrillic) : RS  
+ÑÑÐ±
+
+// xn--p1ai ("rf" Russian-Cyrillic) : RU
+// http://www.cctld.ru/en/docs/rulesrf.php
+ÑÑ
+
+// xn--wgbl6a ("Qatar" Arabic) : QA
+// http://www.ict.gov.qa/
+ÙØ·Ø±
+
+// xn--mgberp4a5d4ar ("AlSaudiah" Arabic) : SA
+// http://www.nic.net.sa/
+Ø§ÙØ³Ø¹ÙØ¯ÙØ©
+
+// xn--mgberp4a5d4a87g ("AlSaudiah" Arabic) variant : SA  
+Ø§ÙØ³Ø¹ÙØ¯ÛØ©
+
+// xn--mgbqly7c0a67fbc ("AlSaudiah" Arabic) variant : SA  
+Ø§ÙØ³Ø¹ÙØ¯ÛÛ
+
+// xn--mgbqly7cvafr ("AlSaudiah" Arabic) variant : SA  
+Ø§ÙØ³Ø¹ÙØ¯ÙÙ
+
+// xn--ogbpf8fl ("Syria" Arabic) : SY  
+Ø³ÙØ±ÙØ©
+
+// xn--mgbtf8fl ("Syria" Arabic) variant : SY  
+Ø³ÙØ±ÙØ§
+
+// xn--yfro4i67o Singapore ("Singapore" Chinese-Han) : SG
+æ°å å¡
+
+// xn--clchc0ea0b2g2a9gcd ("Singapore" Tamil) : SG
+à®à®¿à®à¯à®à®ªà¯à®ªà¯à®°à¯
+
+// xn--o3cw4h ("Thai" Thai) : TH
+// http://www.thnic.co.th
+à¹àžàž¢
+
+// xn--pgbs0dh ("Tunis") : TN
+// http://nic.tn
+ØªÙÙØ³
+
+// xn--kpry57d ("Taiwan" Chinese-Han-Traditional) : TW
+// http://www.twnic.net/english/dn/dn_07a.htm
+å°ç£
+
+// xn--kprw13d ("Taiwan" Chinese-Han-Simplified) : TW
+// http://www.twnic.net/english/dn/dn_07a.htm
+å°æ¹Ÿ
+
+// xn--nnx388a ("Taiwan") variant : TW  
+èºç£
+
+// xn--j1amh ("ukr" Cyrillic) : UA  
+ÑÐºÑ
+
+// xn--mgb2ddes ("AlYemen" Arabic) : YE  
+Ø§ÙÙÙ
+Ù
+
+// xxx : http://icmregistry.com
+xxx
+
+// ye : http://www.y.net.ye/services/domain_name.htm
+*.ye
+
+// za : http://www.zadna.org.za/slds.html
+*.za
+
+// zm : http://en.wikipedia.org/wiki/.zm
+*.zm
+
+// zw : http://en.wikipedia.org/wiki/.zw
+*.zw
+
+// ===END ICANN DOMAINS===
+// ===BEGIN PRIVATE DOMAINS===
+
+// info.at : http://www.info.at/
+biz.at
+info.at
+
+// priv.at : http://www.nic.priv.at/
+// Submitted by registry <lendl@nic.at> 2008-06-09
+priv.at
+
+// co.ca : http://registry.co.ca
+co.ca
+
+// CentralNic : http://www.centralnic.com/names/domains
+// Confirmed by registry <gavin.brown@centralnic.com> 2008-06-09
+ar.com
+br.com
+cn.com
+de.com
+eu.com
+gb.com
+gr.com
+hu.com
+jpn.com
+kr.com
+no.com
+qc.com
+ru.com
+sa.com
+se.com
+uk.com
+us.com
+uy.com
+za.com
+gb.net
+jp.net
+se.net
+uk.net
+ae.org
+us.org
+com.de
+
+// Opera Software, A.S.A.
+// Requested by Yngve Pettersen <yngve@opera.com> 2009-11-26
+operaunite.com
+
+// Google, Inc.
+// Requested by Eduardo Vela <evn@google.com> 2010-09-06
+appspot.com
+
+// iki.fi : Submitted by Hannu Aronsson <haa@iki.fi> 2009-11-05
+iki.fi
+
+// c.la : http://www.c.la/
+c.la
+
+// ZaNiC : http://www.za.net/
+// Confirmed by registry <hostmaster@nic.za.net> 2009-10-03
+za.net
+za.org
+
+// CoDNS B.V.
+// Added 2010-05-23.
+co.nl
+co.no
+
+// Mainseek Sp. z o.o. : http://www.co.pl/
+co.pl
+
+// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/
+dyndns-at-home.com
+dyndns-at-work.com
+dyndns-blog.com
+dyndns-free.com
+dyndns-home.com
+dyndns-ip.com
+dyndns-mail.com
+dyndns-office.com
+dyndns-pics.com
+dyndns-remote.com
+dyndns-server.com
+dyndns-web.com
+dyndns-wiki.com
+dyndns-work.com
+dyndns.biz
+dyndns.info
+dyndns.org
+dyndns.tv
+at-band-camp.net
+ath.cx
+barrel-of-knowledge.info
+barrell-of-knowledge.info
+better-than.tv
+blogdns.com
+blogdns.net
+blogdns.org
+blogsite.org
+boldlygoingnowhere.org
+broke-it.net
+buyshouses.net
+cechire.com
+dnsalias.com
+dnsalias.net
+dnsalias.org
+dnsdojo.com
+dnsdojo.net
+dnsdojo.org
+does-it.net
+doesntexist.com
+doesntexist.org
+dontexist.com
+dontexist.net
+dontexist.org
+doomdns.com
+doomdns.org
+dvrdns.org
+dyn-o-saur.com
+dynalias.com
+dynalias.net
+dynalias.org
+dynathome.net
+dyndns.ws
+endofinternet.net
+endofinternet.org
+endoftheinternet.org
+est-a-la-maison.com
+est-a-la-masion.com
+est-le-patron.com
+est-mon-blogueur.com
+for-better.biz
+for-more.biz
+for-our.info
+for-some.biz
+for-the.biz
+forgot.her.name
+forgot.his.name
+from-ak.com
+from-al.com
+from-ar.com
+from-az.net
+from-ca.com
+from-co.net
+from-ct.com
+from-dc.com
+from-de.com
+from-fl.com
+from-ga.com
+from-hi.com
+from-ia.com
+from-id.com
+from-il.com
+from-in.com
+from-ks.com
+from-ky.com
+from-la.net
+from-ma.com
+from-md.com
+from-me.org
+from-mi.com
+from-mn.com
+from-mo.com
+from-ms.com
+from-mt.com
+from-nc.com
+from-nd.com
+from-ne.com
+from-nh.com
+from-nj.com
+from-nm.com
+from-nv.com
+from-ny.net
+from-oh.com
+from-ok.com
+from-or.com
+from-pa.com
+from-pr.com
+from-ri.com
+from-sc.com
+from-sd.com
+from-tn.com
+from-tx.com
+from-ut.com
+from-va.com
+from-vt.com
+from-wa.com
+from-wi.com
+from-wv.com
+from-wy.com
+ftpaccess.cc
+fuettertdasnetz.de
+game-host.org
+game-server.cc
+getmyip.com
+gets-it.net
+go.dyndns.org
+gotdns.com
+gotdns.org
+groks-the.info
+groks-this.info
+ham-radio-op.net
+here-for-more.info
+hobby-site.com
+hobby-site.org
+home.dyndns.org
+homedns.org
+homeftp.net
+homeftp.org
+homeip.net
+homelinux.com
+homelinux.net
+homelinux.org
+homeunix.com
+homeunix.net
+homeunix.org
+iamallama.com
+in-the-band.net
+is-a-anarchist.com
+is-a-blogger.com
+is-a-bookkeeper.com
+is-a-bruinsfan.org
+is-a-bulls-fan.com
+is-a-candidate.org
+is-a-caterer.com
+is-a-celticsfan.org
+is-a-chef.com
+is-a-chef.net
+is-a-chef.org
+is-a-conservative.com
+is-a-cpa.com
+is-a-cubicle-slave.com
+is-a-democrat.com
+is-a-designer.com
+is-a-doctor.com
+is-a-financialadvisor.com
+is-a-geek.com
+is-a-geek.net
+is-a-geek.org
+is-a-green.com
+is-a-guru.com
+is-a-hard-worker.com
+is-a-hunter.com
+is-a-knight.org
+is-a-landscaper.com
+is-a-lawyer.com
+is-a-liberal.com
+is-a-libertarian.com
+is-a-linux-user.org
+is-a-llama.com
+is-a-musician.com
+is-a-nascarfan.com
+is-a-nurse.com
+is-a-painter.com
+is-a-patsfan.org
+is-a-personaltrainer.com
+is-a-photographer.com
+is-a-player.com
+is-a-republican.com
+is-a-rockstar.com
+is-a-socialist.com
+is-a-soxfan.org
+is-a-student.com
+is-a-teacher.com
+is-a-techie.com
+is-a-therapist.com
+is-an-accountant.com
+is-an-actor.com
+is-an-actress.com
+is-an-anarchist.com
+is-an-artist.com
+is-an-engineer.com
+is-an-entertainer.com
+is-by.us
+is-certified.com
+is-found.org
+is-gone.com
+is-into-anime.com
+is-into-cars.com
+is-into-cartoons.com
+is-into-games.com
+is-leet.com
+is-lost.org
+is-not-certified.com
+is-saved.org
+is-slick.com
+is-uberleet.com
+is-very-bad.org
+is-very-evil.org
+is-very-good.org
+is-very-nice.org
+is-very-sweet.org
+is-with-theband.com
+isa-geek.com
+isa-geek.net
+isa-geek.org
+isa-hockeynut.com
+issmarterthanyou.com
+isteingeek.de
+istmein.de
+kicks-ass.net
+kicks-ass.org
+knowsitall.info
+land-4-sale.us
+lebtimnetz.de
+leitungsen.de
+likes-pie.com
+likescandy.com
+merseine.nu
+mine.nu
+misconfused.org
+mypets.ws
+myphotos.cc
+neat-url.com
+office-on-the.net
+on-the-web.tv
+podzone.net
+podzone.org
+readmyblog.org
+saves-the-whales.com
+scrapper-site.net
+scrapping.cc
+selfip.biz
+selfip.com
+selfip.info
+selfip.net
+selfip.org
+sells-for-less.com
+sells-for-u.com
+sells-it.net
+sellsyourhome.org
+servebbs.com
+servebbs.net
+servebbs.org
+serveftp.net
+serveftp.org
+servegame.org
+shacknet.nu
+simple-url.com
+space-to-rent.com
+stuff-4-sale.org
+stuff-4-sale.us
+teaches-yoga.com
+thruhere.net
+traeumtgerade.de
+webhop.biz
+webhop.info
+webhop.net
+webhop.org
+worse-than.tv
+writesthisblog.com
+
+// ===END PRIVATE DOMAINS===
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/test.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/test.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tough-cookie/test.js	(revision 516)
@@ -0,0 +1,1625 @@
+/*
+ * Copyright GoInstant, Inc. and other contributors. All rights reserved.
+ * 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.
+ */
+'use strict';
+var vows = require('vows');
+var assert = require('assert');
+var async = require('async');
+
+// NOTE use require("tough-cookie") in your own code:
+var tough = require('./lib/cookie');
+var Cookie = tough.Cookie;
+var CookieJar = tough.CookieJar;
+
+
+function dateVows(table) {
+  var theVows = { };
+  Object.keys(table).forEach(function(date) {
+    var expect = table[date];
+    theVows[date] = function() {
+      var got = tough.parseDate(date) ? 'valid' : 'invalid';
+      assert.equal(got, expect ? 'valid' : 'invalid');
+    };
+  });
+  return { "date parsing": theVows };
+}
+
+function matchVows(func,table) {
+  var theVows = {};
+  table.forEach(function(item) {
+    var str = item[0];
+    var dom = item[1];
+    var expect = item[2];
+    var label = str+(expect?" matches ":" doesn't match ")+dom;
+    theVows[label] = function() {
+      assert.equal(func(str,dom),expect);
+    };
+  });
+  return theVows;
+}
+
+function defaultPathVows(table) {
+  var theVows = {};
+  table.forEach(function(item) {
+    var str = item[0];
+    var expect = item[1];
+    var label = str+" gives "+expect;
+    theVows[label] = function() {
+      assert.equal(tough.defaultPath(str),expect);
+    };
+  });
+  return theVows;
+}
+
+var atNow = Date.now();
+function at(offset) { return {now: new Date(atNow+offset)}; }
+
+vows.describe('Cookie Jar')
+.addBatch({
+  "all defined": function() {
+    assert.ok(Cookie);
+    assert.ok(CookieJar);
+  },
+})
+.addBatch(
+  dateVows({
+    "Wed, 09 Jun 2021 10:18:14 GMT": true,
+    "Wed, 09 Jun 2021 22:18:14 GMT": true,
+    "Tue, 18 Oct 2011 07:42:42.123 GMT": true,
+    "18 Oct 2011 07:42:42 GMT": true,
+    "8 Oct 2011 7:42:42 GMT": true,
+    "8 Oct 2011 7:2:42 GMT": false,
+    "Oct 18 2011 07:42:42 GMT": true,
+    "Tue Oct 18 2011 07:05:03 GMT+0000 (GMT)": true,
+    "09 Jun 2021 10:18:14 GMT": true,
+    "99 Jix 3038 48:86:72 ZMT": false,
+    '01 Jan 1970 00:00:00 GMT': true,
+    '01 Jan 1600 00:00:00 GMT': false, // before 1601
+    '01 Jan 1601 00:00:00 GMT': true,
+    '10 Feb 81 13:00:00 GMT': true, // implicit year
+    'Thu, 01 Jan 1970 00:00:010 GMT': true, // strange time, non-strict OK
+    'Thu, 17-Apr-2014 02:12:29 GMT': true, // dashes
+    'Thu, 17-Apr-2014 02:12:29 UTC': true, // dashes and UTC
+  })
+)
+.addBatch({
+  "strict date parse of Thu, 01 Jan 1970 00:00:010 GMT": {
+    topic: function() {
+      return tough.parseDate('Thu, 01 Jan 1970 00:00:010 GMT', true) ? true : false;
+    },
+    "invalid": function(date) {
+      assert.equal(date,false);
+    },
+  }
+})
+.addBatch({
+  "formatting": {
+    "a simple cookie": {
+      topic: function() {
+        var c = new Cookie();
+        c.key = 'a';
+        c.value = 'b';
+        return c;
+      },
+      "validates": function(c) {
+        assert.ok(c.validate());
+      },
+      "to string": function(c) {
+        assert.equal(c.toString(), 'a=b');
+      },
+    },
+    "a cookie with spaces in the value": {
+      topic: function() {
+        var c = new Cookie();
+        c.key = 'a';
+        c.value = 'beta gamma';
+        return c;
+      },
+      "doesn't validate": function(c) {
+        assert.ok(!c.validate());
+      },
+      "'garbage in, garbage out'": function(c) {
+        assert.equal(c.toString(), 'a=beta gamma');
+      },
+    },
+    "with an empty value and HttpOnly": {
+      topic: function() {
+        var c = new Cookie();
+        c.key = 'a';
+        c.httpOnly = true;
+        return c;
+      },
+      "to string": function(c) {
+        assert.equal(c.toString(), 'a=; HttpOnly');
+      }
+    },
+    "with an expiry": {
+      topic: function() {
+        var c = new Cookie();
+        c.key = 'a';
+        c.value = 'b';
+        c.setExpires("Oct 18 2011 07:05:03 GMT");
+        return c;
+      },
+      "validates": function(c) {
+        assert.ok(c.validate());
+      },
+      "to string": function(c) {
+        assert.equal(c.toString(), 'a=b; Expires=Tue, 18 Oct 2011 07:05:03 GMT');
+      },
+      "to short string": function(c) {
+        assert.equal(c.cookieString(), 'a=b');
+      },
+    },
+    "with a max-age": {
+      topic: function() {
+        var c = new Cookie();
+        c.key = 'a';
+        c.value = 'b';
+        c.setExpires("Oct 18 2011 07:05:03 GMT");
+        c.maxAge = 12345;
+        return c;
+      },
+      "validates": function(c) {
+        assert.ok(c.validate()); // mabe this one *shouldn't*?
+      },
+      "to string": function(c) {
+        assert.equal(c.toString(), 'a=b; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Max-Age=12345');
+      },
+    },
+    "with a bunch of things": function() {
+      var c = new Cookie();
+      c.key = 'a';
+      c.value = 'b';
+      c.setExpires("Oct 18 2011 07:05:03 GMT");
+      c.maxAge = 12345;
+      c.domain = 'example.com';
+      c.path = '/foo';
+      c.secure = true;
+      c.httpOnly = true;
+      c.extensions = ['MyExtension'];
+      assert.equal(c.toString(), 'a=b; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Max-Age=12345; Domain=example.com; Path=/foo; Secure; HttpOnly; MyExtension');
+    },
+    "a host-only cookie": {
+      topic: function() {
+        var c = new Cookie();
+        c.key = 'a';
+        c.value = 'b';
+        c.hostOnly = true;
+        c.domain = 'shouldnt-stringify.example.com';
+        c.path = '/should-stringify';
+        return c;
+      },
+      "validates": function(c) {
+        assert.ok(c.validate());
+      },
+      "to string": function(c) {
+        assert.equal(c.toString(), 'a=b; Path=/should-stringify');
+      },
+    },
+    "minutes are '10'": {
+      topic: function() {
+        var c = new Cookie();
+        c.key = 'a';
+        c.value = 'b';
+        c.expires = new Date(1284113410000);
+        return c;
+      },
+      "validates": function(c) {
+        assert.ok(c.validate());
+      },
+      "to string": function(c) {
+        var str = c.toString();
+        assert.notEqual(str, 'a=b; Expires=Fri, 010 Sep 2010 010:010:010 GMT');
+        assert.equal(str, 'a=b; Expires=Fri, 10 Sep 2010 10:10:10 GMT');
+      },
+    }
+  }
+})
+.addBatch({
+  "TTL with max-age": function() {
+    var c = new Cookie();
+    c.maxAge = 123;
+    assert.equal(c.TTL(), 123000);
+    assert.equal(c.expiryTime(new Date(9000000)), 9123000);
+  },
+  "TTL with zero max-age": function() {
+    var c = new Cookie();
+    c.key = 'a'; c.value = 'b';
+    c.maxAge = 0; // should be treated as "earliest representable"
+    assert.equal(c.TTL(), 0);
+    assert.equal(c.expiryTime(new Date(9000000)), -Infinity);
+    assert.ok(!c.validate()); // not valid, really: non-zero-digit *DIGIT
+  },
+  "TTL with negative max-age": function() {
+    var c = new Cookie();
+    c.key = 'a'; c.value = 'b';
+    c.maxAge = -1; // should be treated as "earliest representable"
+    assert.equal(c.TTL(), 0);
+    assert.equal(c.expiryTime(new Date(9000000)), -Infinity);
+    assert.ok(!c.validate()); // not valid, really: non-zero-digit *DIGIT
+  },
+  "TTL with max-age and expires": function() {
+    var c = new Cookie();
+    c.maxAge = 123;
+    c.expires = new Date(Date.now()+9000);
+    assert.equal(c.TTL(), 123000);
+    assert.ok(c.isPersistent());
+  },
+  "TTL with expires": function() {
+    var c = new Cookie();
+    var now = Date.now();
+    c.expires = new Date(now+9000);
+    assert.equal(c.TTL(now), 9000);
+    assert.equal(c.expiryTime(), c.expires.getTime());
+  },
+  "TTL with old expires": function() {
+    var c = new Cookie();
+    c.setExpires('17 Oct 2010 00:00:00 GMT');
+    assert.ok(c.TTL() < 0);
+    assert.ok(c.isPersistent());
+  },
+  "default TTL": {
+    topic: function() { return new Cookie(); },
+    "is Infinite-future": function(c) { assert.equal(c.TTL(), Infinity) },
+    "is a 'session' cookie": function(c) { assert.ok(!c.isPersistent()) },
+  },
+}).addBatch({
+  "Parsing": {
+    "simple": {
+      topic: function() {
+        return Cookie.parse('a=bcd',true) || null;
+      },
+      "parsed": function(c) { assert.ok(c) },
+      "key": function(c) { assert.equal(c.key, 'a') },
+      "value": function(c) { assert.equal(c.value, 'bcd') },
+      "no path": function(c) { assert.equal(c.path, null) },
+      "no domain": function(c) { assert.equal(c.domain, null) },
+      "no extensions": function(c) { assert.ok(!c.extensions) },
+    },
+    "with expiry": {
+      topic: function() {
+        return Cookie.parse('a=bcd; Expires=Tue, 18 Oct 2011 07:05:03 GMT',true) || null;
+      },
+      "parsed": function(c) { assert.ok(c) },
+      "key": function(c) { assert.equal(c.key, 'a') },
+      "value": function(c) { assert.equal(c.value, 'bcd') },
+      "has expires": function(c) {
+        assert.ok(c.expires !== Infinity, 'expiry is infinite when it shouldn\'t be');
+        assert.equal(c.expires.getTime(), 1318921503000);
+      },
+    },
+    "with expiry and path": {
+      topic: function() {
+        return Cookie.parse('abc="xyzzy!"; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Path=/aBc',true) || null;
+      },
+      "parsed": function(c) { assert.ok(c) },
+      "key": function(c) { assert.equal(c.key, 'abc') },
+      "value": function(c) { assert.equal(c.value, 'xyzzy!') },
+      "has expires": function(c) {
+        assert.ok(c.expires !== Infinity, 'expiry is infinite when it shouldn\'t be');
+        assert.equal(c.expires.getTime(), 1318921503000);
+      },
+      "has path": function(c) { assert.equal(c.path, '/aBc'); },
+      "no httponly or secure": function(c) {
+        assert.ok(!c.httpOnly);
+        assert.ok(!c.secure);
+      },
+    },
+    "with everything": {
+      topic: function() {
+        return Cookie.parse('abc="xyzzy!"; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Path=/aBc; Domain=example.com; Secure; HTTPOnly; Max-Age=1234; Foo=Bar; Baz', true) || null;
+      },
+      "parsed": function(c) { assert.ok(c) },
+      "key": function(c) { assert.equal(c.key, 'abc') },
+      "value": function(c) { assert.equal(c.value, 'xyzzy!') },
+      "has expires": function(c) {
+        assert.ok(c.expires !== Infinity, 'expiry is infinite when it shouldn\'t be');
+        assert.equal(c.expires.getTime(), 1318921503000);
+      },
+      "has path": function(c) { assert.equal(c.path, '/aBc'); },
+      "has domain": function(c) { assert.equal(c.domain, 'example.com'); },
+      "has httponly": function(c) { assert.equal(c.httpOnly, true); },
+      "has secure": function(c) { assert.equal(c.secure, true); },
+      "has max-age": function(c) { assert.equal(c.maxAge, 1234); },
+      "has extensions": function(c) {
+        assert.ok(c.extensions);
+        assert.equal(c.extensions[0], 'Foo=Bar');
+        assert.equal(c.extensions[1], 'Baz');
+      },
+    },
+    "invalid expires": {
+      "strict": function() { assert.ok(!Cookie.parse("a=b; Expires=xyzzy", true)) },
+      "non-strict": function() {
+        var c = Cookie.parse("a=b; Expires=xyzzy");
+        assert.ok(c);
+        assert.equal(c.expires, Infinity);
+      },
+    },
+    "zero max-age": {
+      "strict": function() { assert.ok(!Cookie.parse("a=b; Max-Age=0", true)) },
+      "non-strict": function() {
+        var c = Cookie.parse("a=b; Max-Age=0");
+        assert.ok(c);
+        assert.equal(c.maxAge, 0);
+      },
+    },
+    "negative max-age": {
+      "strict": function() { assert.ok(!Cookie.parse("a=b; Max-Age=-1", true)) },
+      "non-strict": function() {
+        var c = Cookie.parse("a=b; Max-Age=-1");
+        assert.ok(c);
+        assert.equal(c.maxAge, -1);
+      },
+    },
+    "empty domain": {
+      "strict": function() { assert.ok(!Cookie.parse("a=b; domain=", true)) },
+      "non-strict": function() {
+        var c = Cookie.parse("a=b; domain=");
+        assert.ok(c);
+        assert.equal(c.domain, null);
+      },
+    },
+    "dot domain": {
+      "strict": function() { assert.ok(!Cookie.parse("a=b; domain=.", true)) },
+      "non-strict": function() {
+        var c = Cookie.parse("a=b; domain=.");
+        assert.ok(c);
+        assert.equal(c.domain, null);
+      },
+    },
+    "uppercase domain": {
+      "strict lowercases": function() {
+        var c = Cookie.parse("a=b; domain=EXAMPLE.COM");
+        assert.ok(c);
+        assert.equal(c.domain, 'example.com');
+      },
+      "non-strict lowercases": function() {
+        var c = Cookie.parse("a=b; domain=EXAMPLE.COM");
+        assert.ok(c);
+        assert.equal(c.domain, 'example.com');
+      },
+    },
+    "trailing dot in domain": {
+      topic: function() {
+        return Cookie.parse("a=b; Domain=example.com.", true) || null;
+      },
+      "has the domain": function(c) { assert.equal(c.domain,"example.com.") },
+      "but doesn't validate": function(c) { assert.equal(c.validate(),false) },
+    },
+    "empty path": {
+      "strict": function() { assert.ok(!Cookie.parse("a=b; path=", true)) },
+      "non-strict": function() {
+        var c = Cookie.parse("a=b; path=");
+        assert.ok(c);
+        assert.equal(c.path, null);
+      },
+    },
+    "no-slash path": {
+      "strict": function() { assert.ok(!Cookie.parse("a=b; path=xyzzy", true)) },
+      "non-strict": function() {
+        var c = Cookie.parse("a=b; path=xyzzy");
+        assert.ok(c);
+        assert.equal(c.path, null);
+      },
+    },
+    "trailing semi-colons after path": {
+      topic: function () {
+        return [
+          "a=b; path=/;",
+          "c=d;;;;"
+        ];
+      },
+      "strict": function (t) {
+        assert.ok(!Cookie.parse(t[0], true));
+        assert.ok(!Cookie.parse(t[1], true));
+      },
+      "non-strict": function (t) {
+        var c1 = Cookie.parse(t[0]);
+        var c2 = Cookie.parse(t[1]);
+        assert.ok(c1);
+        assert.ok(c2);
+        assert.equal(c1.path, '/');
+      }
+    },
+    "secure-with-value": {
+      "strict": function() { assert.ok(!Cookie.parse("a=b; Secure=xyzzy", true)) },
+      "non-strict": function() {
+        var c = Cookie.parse("a=b; Secure=xyzzy");
+        assert.ok(c);
+        assert.equal(c.secure, true);
+      },
+    },
+    "httponly-with-value": {
+      "strict": function() { assert.ok(!Cookie.parse("a=b; HttpOnly=xyzzy", true)) },
+      "non-strict": function() {
+        var c = Cookie.parse("a=b; HttpOnly=xyzzy");
+        assert.ok(c);
+        assert.equal(c.httpOnly, true);
+      },
+    },
+    "garbage": {
+      topic: function() {
+        return Cookie.parse("\x08", true) || null;
+      },
+      "doesn't parse": function(c) { assert.equal(c,null) },
+    },
+    "public suffix domain": {
+      topic: function() {
+        return Cookie.parse("a=b; domain=kyoto.jp", true) || null;
+      },
+      "parses fine": function(c) {
+        assert.ok(c);
+        assert.equal(c.domain, 'kyoto.jp');
+      },
+      "but fails validation": function(c) {
+        assert.ok(c);
+        assert.ok(!c.validate());
+      },
+    },
+    "Ironically, Google 'GAPS' cookie has very little whitespace": {
+      topic: function() {
+        return Cookie.parse("GAPS=1:A1aaaaAaAAa1aaAaAaaAAAaaa1a11a:aaaAaAaAa-aaaA1-;Path=/;Expires=Thu, 17-Apr-2014 02:12:29 GMT;Secure;HttpOnly");
+      },
+      "parsed": function(c) { assert.ok(c) },
+      "key": function(c) { assert.equal(c.key, 'GAPS') },
+      "value": function(c) { assert.equal(c.value, '1:A1aaaaAaAAa1aaAaAaaAAAaaa1a11a:aaaAaAaAa-aaaA1-') },
+      "path": function(c) {
+        assert.notEqual(c.path, '/;Expires'); // BUG
+        assert.equal(c.path, '/');
+      },
+      "expires": function(c) {
+        assert.notEqual(c.expires, Infinity);
+        assert.equal(c.expires.getTime(), 1397700749000);
+      },
+      "secure": function(c) { assert.ok(c.secure) },
+      "httponly": function(c) { assert.ok(c.httpOnly) },
+    },
+    "lots of equal signs": {
+      topic: function() {
+        return Cookie.parse("queryPref=b=c&d=e; Path=/f=g; Expires=Thu, 17 Apr 2014 02:12:29 GMT; HttpOnly");
+      },
+      "parsed": function(c) { assert.ok(c) },
+      "key": function(c) { assert.equal(c.key, 'queryPref') },
+      "value": function(c) { assert.equal(c.value, 'b=c&d=e') },
+      "path": function(c) {
+        assert.equal(c.path, '/f=g');
+      },
+      "expires": function(c) {
+        assert.notEqual(c.expires, Infinity);
+        assert.equal(c.expires.getTime(), 1397700749000);
+      },
+      "httponly": function(c) { assert.ok(c.httpOnly) },
+    },
+    "spaces in value": {
+      "strict": {
+        topic: function() {
+          return Cookie.parse('a=one two three',true) || null;
+        },
+        "did not parse": function(c) { assert.isNull(c) },
+      },
+      "non-strict": {
+        topic: function() {
+          return Cookie.parse('a=one two three',false) || null;
+        },
+        "parsed": function(c) { assert.ok(c) },
+        "key": function(c) { assert.equal(c.key, 'a') },
+        "value": function(c) { assert.equal(c.value, 'one two three') },
+        "no path": function(c) { assert.equal(c.path, null) },
+        "no domain": function(c) { assert.equal(c.domain, null) },
+        "no extensions": function(c) { assert.ok(!c.extensions) },
+      },
+    },
+    "quoted spaces in value": {
+      "strict": {
+        topic: function() {
+          return Cookie.parse('a="one two three"',true) || null;
+        },
+        "did not parse": function(c) { assert.isNull(c) },
+      },
+      "non-strict": {
+        topic: function() {
+          return Cookie.parse('a="one two three"',false) || null;
+        },
+        "parsed": function(c) { assert.ok(c) },
+        "key": function(c) { assert.equal(c.key, 'a') },
+        "value": function(c) { assert.equal(c.value, 'one two three') },
+        "no path": function(c) { assert.equal(c.path, null) },
+        "no domain": function(c) { assert.equal(c.domain, null) },
+        "no extensions": function(c) { assert.ok(!c.extensions) },
+      }
+    },
+    "non-ASCII in value": {
+      "strict": {
+        topic: function() {
+          return Cookie.parse('farbe=weiÃ',true) || null;
+        },
+        "did not parse": function(c) { assert.isNull(c) },
+      },
+      "non-strict": {
+        topic: function() {
+          return Cookie.parse('farbe=weiÃ',false) || null;
+        },
+        "parsed": function(c) { assert.ok(c) },
+        "key": function(c) { assert.equal(c.key, 'farbe') },
+        "value": function(c) { assert.equal(c.value, 'weiÃ') },
+        "no path": function(c) { assert.equal(c.path, null) },
+        "no domain": function(c) { assert.equal(c.domain, null) },
+        "no extensions": function(c) { assert.ok(!c.extensions) },
+      },
+    },
+  }
+})
+.addBatch({
+  "domain normalization": {
+    "simple": function() {
+      var c = new Cookie();
+      c.domain = "EXAMPLE.com";
+      assert.equal(c.canonicalizedDomain(), "example.com");
+    },
+    "extra dots": function() {
+      var c = new Cookie();
+      c.domain = ".EXAMPLE.com";
+      assert.equal(c.cdomain(), "example.com");
+    },
+    "weird trailing dot": function() {
+      var c = new Cookie();
+      c.domain = "EXAMPLE.ca.";
+      assert.equal(c.canonicalizedDomain(), "example.ca.");
+    },
+    "weird internal dots": function() {
+      var c = new Cookie();
+      c.domain = "EXAMPLE...ca.";
+      assert.equal(c.canonicalizedDomain(), "example...ca.");
+    },
+    "IDN": function() {
+      var c = new Cookie();
+      c.domain = "ÎŽÎ¿ÎºÎ¹ÎŒÎ®.ÎŽÎ¿ÎºÎ¹ÎŒÎ®"; // "test.test" in greek
+      assert.equal(c.canonicalizedDomain(), "xn--jxalpdlp.xn--jxalpdlp");
+    }
+  }
+})
+.addBatch({
+  "Domain Match":matchVows(tough.domainMatch, [
+    // str,          dom,          expect
+    ["example.com", "example.com", true],
+    ["eXaMpLe.cOm", "ExAmPlE.CoM", true],
+    ["no.ca", "yes.ca", false],
+    ["wwwexample.com", "example.com", false],
+    ["www.example.com", "example.com", true],
+    ["example.com", "www.example.com", false],
+    ["www.subdom.example.com", "example.com", true],
+    ["www.subdom.example.com", "subdom.example.com", true],
+    ["example.com", "example.com.", false], // RFC6265 S4.1.2.3
+    ["192.168.0.1", "168.0.1", false], // S5.1.3 "The string is a host name"
+    [null, "example.com", null],
+    ["example.com", null, null],
+    [null, null, null],
+    [undefined, undefined, null],
+  ])
+})
+.addBatch({
+  "default-path": defaultPathVows([
+    [null,"/"],
+    ["/","/"],
+    ["/file","/"],
+    ["/dir/file","/dir"],
+    ["noslash","/"],
+  ])
+})
+.addBatch({
+  "Path-Match": matchVows(tough.pathMatch, [
+    // request, cookie, match
+    ["/","/",true],
+    ["/dir","/",true],
+    ["/","/dir",false],
+    ["/dir/","/dir/", true],
+    ["/dir/file","/dir/",true],
+    ["/dir/file","/dir",true],
+    ["/directory","/dir",false],
+  ])
+})
+.addBatch({
+  "Cookie Sorting": {
+    topic: function() {
+      var cookies = [];
+      var now = Date.now();
+      cookies.push(Cookie.parse("a=0; Domain=example.com"));
+      cookies.push(Cookie.parse("b=1; Domain=www.example.com"));
+      cookies.push(Cookie.parse("c=2; Domain=example.com; Path=/pathA"));
+      cookies.push(Cookie.parse("d=3; Domain=www.example.com; Path=/pathA"));
+      cookies.push(Cookie.parse("e=4; Domain=example.com; Path=/pathA/pathB"));
+      cookies.push(Cookie.parse("f=5; Domain=www.example.com; Path=/pathA/pathB"));
+
+      // force a stable creation time consistent with the order above since
+      // some may have been created at now + 1ms.
+      var i = cookies.length;
+      cookies.forEach(function(cookie) {
+        cookie.creation = new Date(now - 100*(i--));
+      });
+
+      // weak shuffle:
+      cookies = cookies.sort(function(){return Math.random()-0.5});
+
+      cookies = cookies.sort(tough.cookieCompare);
+      return cookies;
+    },
+    "got": function(cookies) {
+      assert.lengthOf(cookies, 6);
+      var names = cookies.map(function(c) {return c.key});
+      assert.deepEqual(names, ['e','f','c','d','a','b']);
+    },
+  }
+})
+.addBatch({
+  "CookieJar": {
+    "Setting a basic cookie": {
+      topic: function() {
+        var cj = new CookieJar();
+        var c = Cookie.parse("a=b; Domain=example.com; Path=/");
+        assert.strictEqual(c.hostOnly, null);
+        assert.instanceOf(c.creation, Date);
+        assert.strictEqual(c.lastAccessed, null);
+        c.creation = new Date(Date.now()-10000);
+        cj.setCookie(c, 'http://example.com/index.html', this.callback);
+      },
+      "works": function(c) { assert.instanceOf(c,Cookie) }, // C is for Cookie, good enough for me
+      "gets timestamped": function(c) {
+        assert.ok(c.creation);
+        assert.ok(Date.now() - c.creation.getTime() < 5000); // recently stamped
+        assert.ok(c.lastAccessed);
+        assert.equal(c.creation, c.lastAccessed);
+        assert.equal(c.TTL(), Infinity);
+        assert.ok(!c.isPersistent());
+      },
+    },
+    "Setting a no-path cookie": {
+      topic: function() {
+        var cj = new CookieJar();
+        var c = Cookie.parse("a=b; Domain=example.com");
+        assert.strictEqual(c.hostOnly, null);
+        assert.instanceOf(c.creation, Date);
+        assert.strictEqual(c.lastAccessed, null);
+        c.creation = new Date(Date.now()-10000);
+        cj.setCookie(c, 'http://example.com/index.html', this.callback);
+      },
+      "domain": function(c) { assert.equal(c.domain, 'example.com') },
+      "path is /": function(c) { assert.equal(c.path, '/') },
+      "path was derived": function(c) { assert.strictEqual(c.pathIsDefault, true) },
+    },
+    "Setting a cookie already marked as host-only": {
+      topic: function() {
+        var cj = new CookieJar();
+        var c = Cookie.parse("a=b; Domain=example.com");
+        assert.strictEqual(c.hostOnly, null);
+        assert.instanceOf(c.creation, Date);
+        assert.strictEqual(c.lastAccessed, null);
+        c.creation = new Date(Date.now()-10000);
+        c.hostOnly = true;
+        cj.setCookie(c, 'http://example.com/index.html', this.callback);
+      },
+      "domain": function(c) { assert.equal(c.domain, 'example.com') },
+      "still hostOnly": function(c) { assert.strictEqual(c.hostOnly, true) },
+    },
+    "Setting a session cookie": {
+      topic: function() {
+        var cj = new CookieJar();
+        var c = Cookie.parse("a=b");
+        assert.strictEqual(c.path, null);
+        cj.setCookie(c, 'http://www.example.com/dir/index.html', this.callback);
+      },
+      "works": function(c) { assert.instanceOf(c,Cookie) },
+      "gets the domain": function(c) { assert.equal(c.domain, 'www.example.com') },
+      "gets the default path": function(c) { assert.equal(c.path, '/dir') },
+      "is 'hostOnly'": function(c) { assert.ok(c.hostOnly) },
+    },
+    "Setting wrong domain cookie": {
+      topic: function() {
+        var cj = new CookieJar();
+        var c = Cookie.parse("a=b; Domain=fooxample.com; Path=/");
+        cj.setCookie(c, 'http://example.com/index.html', this.callback);
+      },
+      "fails": function(err,c) {
+        assert.ok(err.message.match(/domain/i));
+        assert.ok(!c);
+      },
+    },
+    "Setting sub-domain cookie": {
+      topic: function() {
+        var cj = new CookieJar();
+        var c = Cookie.parse("a=b; Domain=www.example.com; Path=/");
+        cj.setCookie(c, 'http://example.com/index.html', this.callback);
+      },
+      "fails": function(err,c) {
+        assert.ok(err.message.match(/domain/i));
+        assert.ok(!c);
+      },
+    },
+    "Setting super-domain cookie": {
+      topic: function() {
+        var cj = new CookieJar();
+        var c = Cookie.parse("a=b; Domain=example.com; Path=/");
+        cj.setCookie(c, 'http://www.app.example.com/index.html', this.callback);
+      },
+      "success": function(err,c) {
+        assert.ok(!err);
+        assert.equal(c.domain, 'example.com');
+      },
+    },
+    "Setting a sub-path cookie on a super-domain": {
+      topic: function() {
+        var cj = new CookieJar();
+        var c = Cookie.parse("a=b; Domain=example.com; Path=/subpath");
+        assert.strictEqual(c.hostOnly, null);
+        assert.instanceOf(c.creation, Date);
+        assert.strictEqual(c.lastAccessed, null);
+        c.creation = new Date(Date.now()-10000);
+        cj.setCookie(c, 'http://www.example.com/index.html', this.callback);
+      },
+      "domain is super-domain": function(c) { assert.equal(c.domain, 'example.com') },
+      "path is /subpath": function(c) { assert.equal(c.path, '/subpath') },
+      "path was NOT derived": function(c) { assert.strictEqual(c.pathIsDefault, null) },
+    },
+    "Setting HttpOnly cookie over non-HTTP API": {
+      topic: function() {
+        var cj = new CookieJar();
+        var c = Cookie.parse("a=b; Domain=example.com; Path=/; HttpOnly");
+        cj.setCookie(c, 'http://example.com/index.html', {http:false}, this.callback);
+      },
+      "fails": function(err,c) {
+        assert.match(err.message, /HttpOnly/i);
+        assert.ok(!c);
+      },
+    },
+  },
+  "Cookie Jar store eight cookies": {
+    topic: function() {
+      var cj = new CookieJar();
+      var ex = 'http://example.com/index.html';
+      var tasks = [];
+      tasks.push(function(next) {
+        cj.setCookie('a=1; Domain=example.com; Path=/',ex,at(0),next);
+      });
+      tasks.push(function(next) {
+        cj.setCookie('b=2; Domain=example.com; Path=/; HttpOnly',ex,at(1000),next);
+      });
+      tasks.push(function(next) {
+        cj.setCookie('c=3; Domain=example.com; Path=/; Secure',ex,at(2000),next);
+      });
+      tasks.push(function(next) { // path
+        cj.setCookie('d=4; Domain=example.com; Path=/foo',ex,at(3000),next);
+      });
+      tasks.push(function(next) { // host only
+        cj.setCookie('e=5',ex,at(4000),next);
+      });
+      tasks.push(function(next) { // other domain
+        cj.setCookie('f=6; Domain=nodejs.org; Path=/','http://nodejs.org',at(5000),next);
+      });
+      tasks.push(function(next) { // expired
+        cj.setCookie('g=7; Domain=example.com; Path=/; Expires=Tue, 18 Oct 2011 00:00:00 GMT',ex,at(6000),next);
+      });
+      tasks.push(function(next) { // expired via Max-Age
+        cj.setCookie('h=8; Domain=example.com; Path=/; Max-Age=1',ex,next);
+      });
+      var cb = this.callback;
+      async.parallel(tasks, function(err,results){
+        setTimeout(function() {
+          cb(err,cj,results);
+        }, 2000); // so that 'h=8' expires
+      });
+    },
+    "setup ok": function(err,cj,results) {
+      assert.ok(!err);
+      assert.ok(cj);
+      assert.ok(results);
+    },
+    "then retrieving for http://nodejs.org": {
+      topic: function(cj,oldResults) {
+        assert.ok(oldResults);
+        cj.getCookies('http://nodejs.org',this.callback);
+      },
+      "get a nodejs cookie": function(cookies) {
+        assert.lengthOf(cookies, 1);
+        var cookie = cookies[0];
+        assert.equal(cookie.domain, 'nodejs.org');
+      },
+    },
+    "then retrieving for https://example.com": {
+      topic: function(cj,oldResults) {
+        assert.ok(oldResults);
+        cj.getCookies('https://example.com',{secure:true},this.callback);
+      },
+      "get a secure example cookie with others": function(cookies) {
+        var names = cookies.map(function(c) {return c.key});
+        assert.deepEqual(names, ['a','b','c','e']);
+      },
+    },
+    "then retrieving for https://example.com (missing options)": {
+      topic: function(cj,oldResults) {
+        assert.ok(oldResults);
+        cj.getCookies('https://example.com',this.callback);
+      },
+      "get a secure example cookie with others": function(cookies) {
+        var names = cookies.map(function(c) {return c.key});
+        assert.deepEqual(names, ['a','b','c','e']);
+      },
+    },
+    "then retrieving for http://example.com": {
+      topic: function(cj,oldResults) {
+        assert.ok(oldResults);
+        cj.getCookies('http://example.com',this.callback);
+      },
+      "get a bunch of cookies": function(cookies) {
+        var names = cookies.map(function(c) {return c.key});
+        assert.deepEqual(names, ['a','b','e']);
+      },
+    },
+    "then retrieving for http://EXAMPlE.com": {
+      topic: function(cj,oldResults) {
+        assert.ok(oldResults);
+        cj.getCookies('http://EXAMPlE.com',this.callback);
+      },
+      "get a bunch of cookies": function(cookies) {
+        var names = cookies.map(function(c) {return c.key});
+        assert.deepEqual(names, ['a','b','e']);
+      },
+    },
+    "then retrieving for http://example.com, non-HTTP": {
+      topic: function(cj,oldResults) {
+        assert.ok(oldResults);
+        cj.getCookies('http://example.com',{http:false},this.callback);
+      },
+      "get a bunch of cookies": function(cookies) {
+        var names = cookies.map(function(c) {return c.key});
+        assert.deepEqual(names, ['a','e']);
+      },
+    },
+    "then retrieving for http://example.com/foo/bar": {
+      topic: function(cj,oldResults) {
+        assert.ok(oldResults);
+        cj.getCookies('http://example.com/foo/bar',this.callback);
+      },
+      "get a bunch of cookies": function(cookies) {
+        var names = cookies.map(function(c) {return c.key});
+        assert.deepEqual(names, ['d','a','b','e']);
+      },
+    },
+    "then retrieving for http://example.com as a string": {
+      topic: function(cj,oldResults) {
+        assert.ok(oldResults);
+        cj.getCookieString('http://example.com',this.callback);
+      },
+      "get a single string": function(cookieHeader) {
+        assert.equal(cookieHeader, "a=1; b=2; e=5");
+      },
+    },
+    "then retrieving for http://example.com as a set-cookie header": {
+      topic: function(cj,oldResults) {
+        assert.ok(oldResults);
+        cj.getSetCookieStrings('http://example.com',this.callback);
+      },
+      "get a single string": function(cookieHeaders) {
+        assert.lengthOf(cookieHeaders, 3);
+        assert.equal(cookieHeaders[0], "a=1; Domain=example.com; Path=/");
+        assert.equal(cookieHeaders[1], "b=2; Domain=example.com; Path=/; HttpOnly");
+        assert.equal(cookieHeaders[2], "e=5; Path=/");
+      },
+    },
+    "then retrieving for http://www.example.com/": {
+      topic: function(cj,oldResults) {
+        assert.ok(oldResults);
+        cj.getCookies('http://www.example.com/foo/bar',this.callback);
+      },
+      "get a bunch of cookies": function(cookies) {
+        var names = cookies.map(function(c) {return c.key});
+        assert.deepEqual(names, ['d','a','b']); // note lack of 'e'
+      },
+    },
+  },
+  "Repeated names": {
+    topic: function() {
+      var cb = this.callback;
+      var cj = new CookieJar();
+      var ex = 'http://www.example.com/';
+      var sc = cj.setCookie;
+      var tasks = [];
+      var now = Date.now();
+      tasks.push(sc.bind(cj,'aaaa=xxxx',ex,at(0)));
+      tasks.push(sc.bind(cj,'aaaa=1111; Domain=www.example.com',ex,at(1000)));
+      tasks.push(sc.bind(cj,'aaaa=2222; Domain=example.com',ex,at(2000)));
+      tasks.push(sc.bind(cj,'aaaa=3333; Domain=www.example.com; Path=/pathA',ex,at(3000)));
+      async.series(tasks,function(err,results) {
+        results = results.filter(function(e) {return e !== undefined});
+        cb(err,{cj:cj, cookies:results, now:now});
+      });
+    },
+    "all got set": function(err,t) {
+      assert.lengthOf(t.cookies,4);
+    },
+    "then getting 'em back": {
+      topic: function(t) {
+        var cj = t.cj;
+        cj.getCookies('http://www.example.com/pathA',this.callback);
+      },
+      "there's just three": function (err,cookies) {
+        var vals = cookies.map(function(c) {return c.value});
+        // may break with sorting; sorting should put 3333 first due to longest path:
+        assert.deepEqual(vals, ['3333','1111','2222']);
+      }
+    },
+  },
+  "CookieJar setCookie errors": {
+    "public-suffix domain": {
+      topic: function() {
+        var cj = new CookieJar();
+        cj.setCookie('i=9; Domain=kyoto.jp; Path=/','kyoto.jp',this.callback);
+      },
+      "errors": function(err,cookie) {
+        assert.ok(err);
+        assert.ok(!cookie);
+        assert.match(err.message, /public suffix/i);
+      },
+    },
+    "wrong domain": {
+      topic: function() {
+        var cj = new CookieJar();
+        cj.setCookie('j=10; Domain=google.com; Path=/','google.ca',this.callback);
+      },
+      "errors": function(err,cookie) {
+        assert.ok(err);
+        assert.ok(!cookie);
+        assert.match(err.message, /not in this host's domain/i);
+      },
+    },
+    "old cookie is HttpOnly": {
+      topic: function() {
+        var cb = this.callback;
+        var next = function (err,c) {
+          c = null;
+          return cb(err,cj);
+        };
+        var cj = new CookieJar();
+        cj.setCookie('k=11; Domain=example.ca; Path=/; HttpOnly','http://example.ca',{http:true},next);
+      },
+      "initial cookie is set": function(err,cj) {
+        assert.ok(!err);
+        assert.ok(cj);
+      },
+      "but when trying to overwrite": {
+        topic: function(cj) {
+          var cb = this.callback;
+          var next = function(err,c) {
+            c = null;
+            cb(null,err);
+          };
+          cj.setCookie('k=12; Domain=example.ca; Path=/','http://example.ca',{http:false},next);
+        },
+        "it's an error": function(err) {
+          assert.ok(err);
+        },
+        "then, checking the original": {
+          topic: function(ignored,cj) {
+            assert.ok(cj instanceof CookieJar);
+            cj.getCookies('http://example.ca',{http:true},this.callback);
+          },
+          "cookie has original value": function(err,cookies) {
+            assert.equal(err,null);
+            assert.lengthOf(cookies, 1);
+            assert.equal(cookies[0].value,11);
+          },
+        },
+      },
+    },
+  },
+})
+.addBatch({
+  "JSON": {
+    "serialization": {
+      topic: function() {
+        var c = Cookie.parse('alpha=beta; Domain=example.com; Path=/foo; Expires=Tue, 19 Jan 2038 03:14:07 GMT; HttpOnly');
+        return JSON.stringify(c);
+      },
+      "gives a string": function(str) {
+        assert.equal(typeof str, "string");
+      },
+      "date is in ISO format": function(str) {
+        assert.match(str, /"expires":"2038-01-19T03:14:07\.000Z"/, 'expires is in ISO format');
+      },
+    },
+    "deserialization": {
+      topic: function() {
+        var json = '{"key":"alpha","value":"beta","domain":"example.com","path":"/foo","expires":"2038-01-19T03:14:07.000Z","httpOnly":true,"lastAccessed":2000000000123}';
+        return Cookie.fromJSON(json);
+      },
+      "works": function(c) {
+        assert.ok(c);
+      },
+      "key": function(c) { assert.equal(c.key, "alpha") },
+      "value": function(c) { assert.equal(c.value, "beta") },
+      "domain": function(c) { assert.equal(c.domain, "example.com") },
+      "path": function(c) { assert.equal(c.path, "/foo") },
+      "httpOnly": function(c) { assert.strictEqual(c.httpOnly, true) },
+      "secure": function(c) { assert.strictEqual(c.secure, false) },
+      "hostOnly": function(c) { assert.strictEqual(c.hostOnly, null) },
+      "expires is a date object": function(c) {
+        assert.equal(c.expires.getTime(), 2147483647000);
+      },
+      "lastAccessed is a date object": function(c) {
+        assert.equal(c.lastAccessed.getTime(), 2000000000123);
+      },
+      "creation defaulted": function(c) {
+        assert.ok(c.creation.getTime());
+      }
+    },
+    "null deserialization": {
+      topic: function() {
+        return Cookie.fromJSON(null);
+      },
+      "is null": function(cookie) {
+        assert.equal(cookie,null);
+      },
+    },
+  },
+  "expiry deserialization": {
+    "Infinity": {
+      topic: Cookie.fromJSON.bind(null, '{"expires":"Infinity"}'),
+      "is infinite": function(c) {
+        assert.strictEqual(c.expires, "Infinity");
+        assert.equal(c.expires, Infinity);
+      },
+    },
+  },
+  "maxAge serialization": {
+    topic: function() {
+      return function(toSet) {
+        var c = new Cookie();
+        c.key = 'foo'; c.value = 'bar';
+        c.setMaxAge(toSet);
+        return JSON.stringify(c);
+      };
+    },
+    "zero": {
+      topic: function(f) { return f(0) },
+      "looks good": function(str) {
+        assert.match(str, /"maxAge":0/);
+      },
+    },
+    "Infinity": {
+      topic: function(f) { return f(Infinity) },
+      "looks good": function(str) {
+        assert.match(str, /"maxAge":"Infinity"/);
+      },
+    },
+    "-Infinity": {
+      topic: function(f) { return f(-Infinity) },
+      "looks good": function(str) {
+        assert.match(str, /"maxAge":"-Infinity"/);
+      },
+    },
+    "null": {
+      topic: function(f) { return f(null) },
+      "looks good": function(str) {
+        assert.match(str, /"maxAge":null/);
+      },
+    },
+  },
+  "maxAge deserialization": {
+    "number": {
+      topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":123}'),
+      "is the number": function(c) {
+        assert.strictEqual(c.maxAge, 123);
+      },
+    },
+    "null": {
+      topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":null}'),
+      "is null": function(c) {
+        assert.strictEqual(c.maxAge, null);
+      },
+    },
+    "less than zero": {
+      topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":-123}'),
+      "is -123": function(c) {
+        assert.strictEqual(c.maxAge, -123);
+      },
+    },
+    "Infinity": {
+      topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":"Infinity"}'),
+      "is inf-as-string": function(c) {
+        assert.strictEqual(c.maxAge, "Infinity");
+      },
+    },
+    "-Infinity": {
+      topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":"-Infinity"}'),
+      "is inf-as-string": function(c) {
+        assert.strictEqual(c.maxAge, "-Infinity");
+      },
+    },
+  }
+})
+.addBatch({
+  "permuteDomain": {
+    "base case": {
+      topic: tough.permuteDomain.bind(null,'example.com'),
+      "got the domain": function(list) {
+        assert.deepEqual(list, ['example.com']);
+      },
+    },
+    "two levels": {
+      topic: tough.permuteDomain.bind(null,'foo.bar.example.com'),
+      "got three things": function(list) {
+        assert.deepEqual(list, ['example.com','bar.example.com','foo.bar.example.com']);
+      },
+    },
+    "invalid domain": {
+      topic: tough.permuteDomain.bind(null,'foo.bar.example.localduhmain'),
+      "got three things": function(list) {
+        assert.equal(list, null);
+      },
+    },
+  },
+  "permutePath": {
+    "base case": {
+      topic: tough.permutePath.bind(null,'/'),
+      "just slash": function(list) {
+        assert.deepEqual(list,['/']);
+      },
+    },
+    "single case": {
+      topic: tough.permutePath.bind(null,'/foo'),
+      "two things": function(list) {
+        assert.deepEqual(list,['/foo','/']);
+      },
+      "path matching": function(list) {
+        list.forEach(function(e) {
+          assert.ok(tough.pathMatch('/foo',e));
+        });
+      },
+    },
+    "double case": {
+      topic: tough.permutePath.bind(null,'/foo/bar'),
+      "four things": function(list) {
+        assert.deepEqual(list,['/foo/bar','/foo','/']);
+      },
+      "path matching": function(list) {
+        list.forEach(function(e) {
+          assert.ok(tough.pathMatch('/foo/bar',e));
+        });
+      },
+    },
+    "trailing slash": {
+      topic: tough.permutePath.bind(null,'/foo/bar/'),
+      "three things": function(list) {
+        assert.deepEqual(list,['/foo/bar','/foo','/']);
+      },
+      "path matching": function(list) {
+        list.forEach(function(e) {
+          assert.ok(tough.pathMatch('/foo/bar/',e));
+        });
+      },
+    },
+  }
+})
+.addBatch({
+  "Issue 1": {
+    topic: function() {
+      var cj = new CookieJar();
+      cj.setCookie('hello=world; path=/some/path/', 'http://domain/some/path/file', function(err,cookie) {
+        this.callback(err,{cj:cj, cookie:cookie});
+      }.bind(this));
+    },
+    "stored a cookie": function(t) {
+      assert.ok(t.cookie);
+    },
+    "cookie's path was modified to remove unnecessary slash": function(t) {
+      assert.equal(t.cookie.path, '/some/path');
+    },
+    "getting it back": {
+      topic: function(t) {
+        t.cj.getCookies('http://domain/some/path/file', function(err,cookies) {
+          this.callback(err, {cj:t.cj, cookies:cookies||[]});
+        }.bind(this));
+      },
+      "got one cookie": function(t) {
+        assert.lengthOf(t.cookies, 1);
+      },
+      "it's the right one": function(t) {
+        var c = t.cookies[0];
+        assert.equal(c.key, 'hello');
+        assert.equal(c.value, 'world');
+      },
+    }
+  }
+})
+.addBatch({
+  "expiry option": {
+    topic: function() {
+      var cb = this.callback;
+      var cj = new CookieJar();
+      cj.setCookie('near=expiry; Domain=example.com; Path=/; Max-Age=1','http://www.example.com',at(-1), function(err,cookie) {
+
+        cb(err, {cj:cj, cookie:cookie});
+      });
+    },
+    "set the cookie": function(t) {
+      assert.ok(t.cookie, "didn't set?!");
+      assert.equal(t.cookie.key, 'near');
+    },
+    "then, retrieving": {
+      topic: function(t) {
+        var cb = this.callback;
+        setTimeout(function() {
+          t.cj.getCookies('http://www.example.com', {http:true, expire:false}, function(err,cookies) {
+            t.cookies = cookies;
+            cb(err,t);
+          });
+        },2000);
+      },
+      "got the cookie": function(t) {
+        assert.lengthOf(t.cookies, 1);
+        assert.equal(t.cookies[0].key, 'near');
+      },
+    }
+  }
+})
+.addBatch({
+  "trailing semi-colon set into cj": {
+    topic: function () {
+      var cb = this.callback;
+      var cj = new CookieJar();
+      var ex = 'http://www.example.com';
+      var tasks = [];
+      tasks.push(function(next) {
+        cj.setCookie('broken_path=testme; path=/;',ex,at(-1),next);
+      });
+      tasks.push(function(next) {
+        cj.setCookie('b=2; Path=/;;;;',ex,at(-1),next);
+      });
+      async.parallel(tasks, function (err, cookies) {
+        cb(null, {
+          cj: cj,
+          cookies: cookies
+        });
+      });
+    },
+    "check number of cookies": function (t) {
+      assert.lengthOf(t.cookies, 2, "didn't set");
+    },
+    "check *broken_path* was set properly": function (t) {
+      assert.equal(t.cookies[0].key, "broken_path");
+      assert.equal(t.cookies[0].value, "testme");
+      assert.equal(t.cookies[0].path, "/");
+    },
+    "check *b* was set properly": function (t) {
+      assert.equal(t.cookies[1].key, "b");
+      assert.equal(t.cookies[1].value, "2");
+      assert.equal(t.cookies[1].path, "/");
+    },
+    "retrieve the cookie": {
+      topic: function (t) {
+        var cb = this.callback;
+        t.cj.getCookies('http://www.example.com', {}, function (err, cookies) {
+          t.cookies = cookies;
+          cb(err, t);
+        });
+      },
+      "get the cookie": function(t) {
+        assert.lengthOf(t.cookies, 2);
+        assert.equal(t.cookies[0].key, 'broken_path');
+        assert.equal(t.cookies[0].value, 'testme');
+        assert.equal(t.cookies[1].key, "b");
+        assert.equal(t.cookies[1].value, "2");
+        assert.equal(t.cookies[1].path, "/");
+      },
+    },
+  }
+})
+.addBatch({
+  "Constructor":{
+    topic: function () {
+      return new Cookie({
+        key: 'test',
+        value: 'b',
+        maxAge: 60
+      });
+    },
+    'check for key property': function (c) {
+      assert.ok(c);
+      assert.equal(c.key, 'test');
+    },
+    'check for value property': function (c) {
+      assert.equal(c.value, 'b');
+    },
+    'check for maxAge': function (c) {
+      assert.equal(c.maxAge, 60);
+    },
+    'check for default values for unspecified properties': function (c) {
+      assert.equal(c.expires, "Infinity");
+      assert.equal(c.secure, false);
+      assert.equal(c.httpOnly, false);
+    }
+  }
+})
+.addBatch({
+  "allPaths option": {
+    topic: function() {
+      var cj = new CookieJar();
+      var tasks = [];
+      tasks.push(cj.setCookie.bind(cj, 'nopath_dom=qq; Path=/; Domain=example.com', 'http://example.com', {}));
+      tasks.push(cj.setCookie.bind(cj, 'path_dom=qq; Path=/foo; Domain=example.com', 'http://example.com', {}));
+      tasks.push(cj.setCookie.bind(cj, 'nopath_host=qq; Path=/', 'http://www.example.com', {}));
+      tasks.push(cj.setCookie.bind(cj, 'path_host=qq; Path=/foo', 'http://www.example.com', {}));
+      tasks.push(cj.setCookie.bind(cj, 'other=qq; Path=/', 'http://other.example.com/', {}));
+      tasks.push(cj.setCookie.bind(cj, 'other2=qq; Path=/foo', 'http://other.example.com/foo', {}));
+      var cb = this.callback;
+      async.parallel(tasks, function(err,results) {
+        cb(err, {cj:cj, cookies: results});
+      });
+    },
+    "all set": function(t) {
+      assert.equal(t.cookies.length, 6);
+      assert.ok(t.cookies.every(function(c) { return !!c }));
+    },
+    "getting without allPaths": {
+      topic: function(t) {
+        var cb = this.callback;
+        var cj = t.cj;
+        cj.getCookies('http://www.example.com/', {}, function(err,cookies) {
+          cb(err, {cj:cj, cookies:cookies});
+        });
+      },
+      "found just two cookies": function(t) {
+        assert.equal(t.cookies.length, 2);
+      },
+      "all are path=/": function(t) {
+        assert.ok(t.cookies.every(function(c) { return c.path === '/' }));
+      },
+      "no 'other' cookies": function(t) {
+        assert.ok(!t.cookies.some(function(c) { return (/^other/).test(c.name) }));
+      },
+    },
+    "getting without allPaths for /foo": {
+      topic: function(t) {
+        var cb = this.callback;
+        var cj = t.cj;
+        cj.getCookies('http://www.example.com/foo', {}, function(err,cookies) {
+          cb(err, {cj:cj, cookies:cookies});
+        });
+      },
+      "found four cookies": function(t) {
+        assert.equal(t.cookies.length, 4);
+      },
+      "no 'other' cookies": function(t) {
+        assert.ok(!t.cookies.some(function(c) { return (/^other/).test(c.name) }));
+      },
+    },
+    "getting with allPaths:true": {
+      topic: function(t) {
+        var cb = this.callback;
+        var cj = t.cj;
+        cj.getCookies('http://www.example.com/', {allPaths:true}, function(err,cookies) {
+          cb(err, {cj:cj, cookies:cookies});
+        });
+      },
+      "found four cookies": function(t) {
+        assert.equal(t.cookies.length, 4);
+      },
+      "no 'other' cookies": function(t) {
+        assert.ok(!t.cookies.some(function(c) { return (/^other/).test(c.name) }));
+      },
+    },
+  }
+})
+.addBatch({
+  "remove cookies": {
+    topic: function() {
+      var jar = new CookieJar();
+      var cookie = Cookie.parse("a=b; Domain=example.com; Path=/");
+      var cookie2 = Cookie.parse("a=b; Domain=foo.com; Path=/");
+      var cookie3 = Cookie.parse("foo=bar; Domain=foo.com; Path=/");
+      jar.setCookie(cookie, 'http://example.com/index.html', function(){});
+      jar.setCookie(cookie2, 'http://foo.com/index.html', function(){});
+      jar.setCookie(cookie3, 'http://foo.com/index.html', function(){});
+      return jar;
+    },
+    "all from matching domain": function(jar){
+      jar.store.removeCookies('example.com',null, function(err) {
+        assert(err == null);
+
+        jar.store.findCookies('example.com', null, function(err, cookies){
+          assert(err == null);
+          assert(cookies != null);
+          assert(cookies.length === 0, 'cookie was not removed');
+        });
+
+        jar.store.findCookies('foo.com', null, function(err, cookies){
+          assert(err == null);
+          assert(cookies != null);
+          assert(cookies.length === 2, 'cookies should not have been removed');
+        });
+      });
+    },
+    "from cookie store matching domain and key": function(jar){
+      jar.store.removeCookie('foo.com', '/', 'foo', function(err) {
+        assert(err == null);
+
+        jar.store.findCookies('foo.com', null, function(err, cookies){
+          assert(err == null);
+          assert(cookies != null);
+          assert(cookies.length === 1, 'cookie was not removed correctly');
+          assert(cookies[0].key === 'a', 'wrong cookie was removed');
+        });
+      });
+    }
+  }
+})
+.addBatch({
+  "Synchronous CookieJar": {
+    "setCookieSync": {
+      topic: function() {
+        var jar = new CookieJar();
+        var cookie = Cookie.parse("a=b; Domain=example.com; Path=/");
+        cookie = jar.setCookieSync(cookie, 'http://example.com/index.html');
+        return cookie;
+      },
+      "returns a copy of the cookie": function(cookie) {
+        assert.instanceOf(cookie, Cookie);
+      }
+    },
+
+    "setCookieSync strict parse error": {
+      topic: function() {
+        var jar = new CookieJar();
+        var opts = { strict: true };
+        try {
+          jar.setCookieSync("farbe=weiÃ", 'http://example.com/index.html', opts);
+          return false;
+        } catch (e) {
+          return e;
+        }
+      },
+      "throws the error": function(err) {
+        assert.instanceOf(err, Error);
+        assert.equal(err.message, "Cookie failed to parse");
+      }
+    },
+
+    "getCookiesSync": {
+      topic: function() {
+        var jar = new CookieJar();
+        var url = 'http://example.com/index.html';
+        jar.setCookieSync("a=b; Domain=example.com; Path=/", url);
+        jar.setCookieSync("c=d; Domain=example.com; Path=/", url);
+        return jar.getCookiesSync(url);
+      },
+      "returns the cookie array": function(err, cookies) {
+        assert.ok(!err);
+        assert.ok(Array.isArray(cookies));
+        assert.lengthOf(cookies, 2);
+        cookies.forEach(function(cookie) {
+          assert.instanceOf(cookie, Cookie);
+        });
+      }
+    },
+
+    "getCookieStringSync": {
+      topic: function() {
+        var jar = new CookieJar();
+        var url = 'http://example.com/index.html';
+        jar.setCookieSync("a=b; Domain=example.com; Path=/", url);
+        jar.setCookieSync("c=d; Domain=example.com; Path=/", url);
+        return jar.getCookieStringSync(url);
+      },
+      "returns the cookie header string": function(err, str) {
+        assert.ok(!err);
+        assert.typeOf(str, 'string');
+      }
+    },
+
+    "getSetCookieStringsSync": {
+      topic: function() {
+        var jar = new CookieJar();
+        var url = 'http://example.com/index.html';
+        jar.setCookieSync("a=b; Domain=example.com; Path=/", url);
+        jar.setCookieSync("c=d; Domain=example.com; Path=/", url);
+        return jar.getSetCookieStringsSync(url);
+      },
+      "returns the cookie header string": function(err, headers) {
+        assert.ok(!err);
+        assert.ok(Array.isArray(headers));
+        assert.lengthOf(headers, 2);
+        headers.forEach(function(header) {
+          assert.typeOf(header, 'string');
+        });
+      }
+    },
+  }
+})
+.addBatch({
+  "Synchronous API on async CookieJar": {
+    topic: function() {
+      return new tough.Store();
+    },
+    "setCookieSync": {
+      topic: function(store) {
+        var jar = new CookieJar(store);
+        try {
+          jar.setCookieSync("a=b", 'http://example.com/index.html');
+          return false;
+        } catch(e) {
+          return e;
+        }
+      },
+      "fails": function(err) {
+        assert.instanceOf(err, Error);
+        assert.equal(err.message,
+                     'CookieJar store is not synchronous; use async API instead.');
+      }
+    },
+    "getCookiesSync": {
+      topic: function(store) {
+        var jar = new CookieJar(store);
+        try {
+          jar.getCookiesSync('http://example.com/index.html');
+          return false;
+        } catch(e) {
+          return e;
+        }
+      },
+      "fails": function(err) {
+        assert.instanceOf(err, Error);
+        assert.equal(err.message,
+                     'CookieJar store is not synchronous; use async API instead.');
+      }
+    },
+    "getCookieStringSync": {
+      topic: function(store) {
+        var jar = new CookieJar(store);
+        try {
+          jar.getCookieStringSync('http://example.com/index.html');
+          return false;
+        } catch(e) {
+          return e;
+        }
+      },
+      "fails": function(err) {
+        assert.instanceOf(err, Error);
+        assert.equal(err.message,
+                     'CookieJar store is not synchronous; use async API instead.');
+      }
+    },
+    "getSetCookieStringsSync": {
+      topic: function(store) {
+        var jar = new CookieJar(store);
+        try {
+          jar.getSetCookieStringsSync('http://example.com/index.html');
+          return false;
+        } catch(e) {
+          return e;
+        }
+      },
+      "fails": function(err) {
+        assert.instanceOf(err, Error);
+        assert.equal(err.message,
+                     'CookieJar store is not synchronous; use async API instead.');
+      }
+    },
+  }
+})
+.export(module);
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tunnel-agent/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tunnel-agent/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/node_modules/tunnel-agent/package.json	(revision 516)
@@ -25,4 +25,5 @@
   "homepage": "https://github.com/mikeal/tunnel-agent",
   "_id": "tunnel-agent@0.3.0",
-  "_from": "tunnel-agent@~0.3.0"
+  "_from": "tunnel-agent@~0.3.0",
+  "scripts": {}
 }
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/package.json	(revision 516)
@@ -8,5 +8,5 @@
     "utility"
   ],
-  "version": "2.27.0",
+  "version": "2.34.0",
   "author": {
     "name": "Mikeal Rogers",
@@ -20,4 +20,5 @@
     "url": "http://github.com/mikeal/request/issues"
   },
+  "license": "Apache, Version 2.0",
   "engines": [
     "node >= 0.8.0"
@@ -28,25 +29,34 @@
     "json-stringify-safe": "~5.0.0",
     "forever-agent": "~0.5.0",
+    "node-uuid": "~1.4.0",
+    "mime": "~1.2.9",
+    "tough-cookie": ">=0.12.0",
+    "form-data": "~0.1.0",
     "tunnel-agent": "~0.3.0",
     "http-signature": "~0.10.0",
+    "oauth-sign": "~0.3.0",
     "hawk": "~1.0.0",
-    "aws-sign": "~0.3.0",
+    "aws-sign2": "~0.5.0"
+  },
+  "optionalDependencies": {
+    "tough-cookie": ">=0.12.0",
+    "form-data": "~0.1.0",
+    "tunnel-agent": "~0.3.0",
+    "http-signature": "~0.10.0",
     "oauth-sign": "~0.3.0",
-    "cookie-jar": "~0.3.0",
-    "node-uuid": "~1.4.0",
-    "mime": "~1.2.9",
-    "form-data": "~0.1.0"
+    "hawk": "~1.0.0",
+    "aws-sign2": "~0.5.0"
   },
   "scripts": {
     "test": "node tests/run.js"
   },
-  "readme": "# Request -- Simplified HTTP client\n\n[![NPM](https://nodei.co/npm/request.png)](https://nodei.co/npm/request/)\n\n## Super simple to use\n\nRequest is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default.\n\n```javascript\nvar request = require('request');\nrequest('http://www.google.com', function (error, response, body) {\n  if (!error && response.statusCode == 200) {\n    console.log(body) // Print the google web page.\n  }\n})\n```\n\n## Streaming\n\nYou can stream any response to a file stream.\n\n```javascript\nrequest('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))\n```\n\nYou can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers.\n\n```javascript\nfs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json'))\n```\n\nRequest can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers.\n\n```javascript\nrequest.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))\n```\n\nNow let's get fancy.\n\n```javascript\nhttp.createServer(function (req, resp) {\n  if (req.url === '/doodle.png') {\n    if (req.method === 'PUT') {\n      req.pipe(request.put('http://mysite.com/doodle.png'))\n    } else if (req.method === 'GET' || req.method === 'HEAD') {\n      request.get('http://mysite.com/doodle.png').pipe(resp)\n    }\n  }\n})\n```\n\nYou can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do:\n\n```javascript\nhttp.createServer(function (req, resp) {\n  if (req.url === '/doodle.png') {\n    var x = request('http://mysite.com/doodle.png')\n    req.pipe(x)\n    x.pipe(resp)\n  }\n})\n```\n\nAnd since pipe() returns the destination stream in node 0.5.x you can do one line proxying :)\n\n```javascript\nreq.pipe(request('http://mysite.com/doodle.png')).pipe(resp)\n```\n\nAlso, none of this new functionality conflicts with requests previous features, it just expands them.\n\n```javascript\nvar r = request.defaults({'proxy':'http://localproxy.com'})\n\nhttp.createServer(function (req, resp) {\n  if (req.url === '/doodle.png') {\n    r.get('http://google.com/doodle.png').pipe(resp)\n  }\n})\n```\nYou can still use intermediate proxies, the requests will still follow HTTP forwards, etc.\n\n## Forms\n\n`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API.\n\nUrl encoded forms are simple\n\n```javascript\nrequest.post('http://service.com/upload', {form:{key:'value'}})\n// or\nrequest.post('http://service.com/upload').form({key:'value'})\n```\n\nFor `multipart/form-data` we use the [form-data](https://github.com/felixge/node-form-data) library by [@felixge](https://github.com/felixge). You don't need to worry about piping the form object or setting the headers, `request` will handle that for you.\n\n```javascript\nvar r = request.post('http://service.com/upload')\nvar form = r.form()\nform.append('my_field', 'my_value')\nform.append('my_buffer', new Buffer([1, 2, 3]))\nform.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png'))\nform.append('remote_file', request('http://google.com/doodle.png'))\n```\n\n## HTTP Authentication\n\n```javascript\nrequest.get('http://some.server.com/').auth('username', 'password', false);\n// or\nrequest.get('http://some.server.com/', {\n  'auth': {\n    'user': 'username',\n    'pass': 'password',\n    'sendImmediately': false\n  }\n});\n```\n\nIf passed as an option, `auth` should be a hash containing values `user` || `username`, `password` || `pass`, and `sendImmediately` (optional).  The method form takes parameters `auth(username, password, sendImmediately)`.\n\n`sendImmediately` defaults to true, which will cause a basic authentication header to be sent.  If `sendImmediately` is `false`, then `request` will retry with a proper authentication header after receiving a 401 response from the server (which must contain a `WWW-Authenticate` header indicating the required authentication method).\n\nDigest authentication is supported, but it only works with `sendImmediately` set to `false` (otherwise `request` will send basic authentication on the initial request, which will probably cause the request to fail).\n\n## OAuth Signing\n\n```javascript\n// Twitter OAuth\nvar qs = require('querystring')\n  , oauth =\n    { callback: 'http://mysite.com/callback/'\n    , consumer_key: CONSUMER_KEY\n    , consumer_secret: CONSUMER_SECRET\n    }\n  , url = 'https://api.twitter.com/oauth/request_token'\n  ;\nrequest.post({url:url, oauth:oauth}, function (e, r, body) {\n  // Ideally, you would take the body in the response\n  // and construct a URL that a user clicks on (like a sign in button).\n  // The verifier is only available in the response after a user has\n  // verified with twitter that they are authorizing your app.\n  var access_token = qs.parse(body)\n    , oauth =\n      { consumer_key: CONSUMER_KEY\n      , consumer_secret: CONSUMER_SECRET\n      , token: access_token.oauth_token\n      , verifier: access_token.oauth_verifier\n      }\n    , url = 'https://api.twitter.com/oauth/access_token'\n    ;\n  request.post({url:url, oauth:oauth}, function (e, r, body) {\n    var perm_token = qs.parse(body)\n      , oauth =\n        { consumer_key: CONSUMER_KEY\n        , consumer_secret: CONSUMER_SECRET\n        , token: perm_token.oauth_token\n        , token_secret: perm_token.oauth_token_secret\n        }\n      , url = 'https://api.twitter.com/1/users/show.json?'\n      , params =\n        { screen_name: perm_token.screen_name\n        , user_id: perm_token.user_id\n        }\n      ;\n    url += qs.stringify(params)\n    request.get({url:url, oauth:oauth, json:true}, function (e, r, user) {\n      console.log(user)\n    })\n  })\n})\n```\n\n\n\n### request(options, callback)\n\nThe first argument can be either a url or an options object. The only required option is uri, all others are optional.\n\n* `uri` || `url` - fully qualified uri or a parsed url object from url.parse()\n* `qs` - object containing querystring values to be appended to the uri\n* `method` - http method, defaults to GET\n* `headers` - http headers, defaults to {}\n* `body` - entity body for PATCH, POST and PUT requests. Must be buffer or string.\n* `form` - when passed an object this will set `body` but to a querystring representation of value and adds `Content-type: application/x-www-form-urlencoded; charset=utf-8` header. When passed no option a FormData instance is returned that will be piped to request.\n* `auth` - A hash containing values `user` || `username`, `password` || `pass`, and `sendImmediately` (optional).  See documentation above.\n* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header.  Additionally, parses the response body as json.\n* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below.\n* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true.\n* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects. defaults to false.\n* `maxRedirects` - the maximum number of redirects to follow, defaults to 10.\n* `encoding` - Encoding to be used on `setEncoding` of response data. If set to `null`, the body is returned as a Buffer.\n* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets.\n* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool.\n* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request\n* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri.\n* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above.\n* `hawk` - Options for [Hawk signing](https://github.com/hueniverse/hawk). The `credentials` key must contain the necessary signing info, [see hawk docs for details](https://github.com/hueniverse/hawk#usage-example).\n* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option.\n* `jar` - Set to `true` if you want cookies to be remembered for future use, or define your custom cookie jar (see examples section)\n* `aws` - object containing aws signing information, should have the properties `key` and `secret` as well as `bucket` unless you're specifying your bucket as part of the path, or you are making a request that doesn't use a bucket (i.e. GET Services)\n* `httpSignature` - Options for the [HTTP Signature Scheme](https://github.com/joyent/node-http-signature/blob/master/http_signing.md) using [Joyent's library](https://github.com/joyent/node-http-signature). The `keyId` and `key` properties must be specified. See the docs for other options.\n* `localAddress` - Local interface to bind for network connections.\n\n\nThe callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second is an http.ClientResponse object. The third is the response body String or Buffer.\n\n## Convenience methods\n\nThere are also shorthand methods for different HTTP METHODs and some other conveniences.\n\n### request.defaults(options)\n\nThis method returns a wrapper around the normal request API that defaults to whatever options you pass in to it.\n\n### request.put\n\nSame as request() but defaults to `method: \"PUT\"`.\n\n```javascript\nrequest.put(url)\n```\n\n### request.patch\n\nSame as request() but defaults to `method: \"PATCH\"`.\n\n```javascript\nrequest.patch(url)\n```\n\n### request.post\n\nSame as request() but defaults to `method: \"POST\"`.\n\n```javascript\nrequest.post(url)\n```\n\n### request.head\n\nSame as request() but defaults to `method: \"HEAD\"`.\n\n```javascript\nrequest.head(url)\n```\n\n### request.del\n\nSame as request() but defaults to `method: \"DELETE\"`.\n\n```javascript\nrequest.del(url)\n```\n\n### request.get\n\nAlias to normal request method for uniformity.\n\n```javascript\nrequest.get(url)\n```\n### request.cookie\n\nFunction that creates a new cookie.\n\n```javascript\nrequest.cookie('cookie_string_here')\n```\n### request.jar\n\nFunction that creates a new cookie jar.\n\n```javascript\nrequest.jar()\n```\n\n\n## Examples:\n\n```javascript\n  var request = require('request')\n    , rand = Math.floor(Math.random()*100000000).toString()\n    ;\n  request(\n    { method: 'PUT'\n    , uri: 'http://mikeal.iriscouch.com/testjs/' + rand\n    , multipart:\n      [ { 'content-type': 'application/json'\n        ,  body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})\n        }\n      , { body: 'I am an attachment' }\n      ]\n    }\n  , function (error, response, body) {\n      if(response.statusCode == 201){\n        console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand)\n      } else {\n        console.log('error: '+ response.statusCode)\n        console.log(body)\n      }\n    }\n  )\n```\nCookies are disabled by default (else, they would be used in subsequent requests). To enable cookies set jar to true (either in defaults or in the options sent).\n\n```javascript\nvar request = request.defaults({jar: true})\nrequest('http://www.google.com', function () {\n  request('http://images.google.com')\n})\n```\n\nIf you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option:\n\n```javascript\nvar j = request.jar()\nvar request = request.defaults({jar:j})\nrequest('http://www.google.com', function () {\n  request('http://images.google.com')\n})\n```\nOR\n\n```javascript\nvar j = request.jar()\nvar cookie = request.cookie('your_cookie_here')\nj.add(cookie)\nrequest({url: 'http://www.google.com', jar: j}, function () {\n  request('http://images.google.com')\n})\n```\n",
+  "readme": "# Request -- Simplified HTTP client\n\n[![NPM](https://nodei.co/npm/request.png)](https://nodei.co/npm/request/)\n\n## Super simple to use\n\nRequest is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default.\n\n```javascript\nvar request = require('request');\nrequest('http://www.google.com', function (error, response, body) {\n  if (!error && response.statusCode == 200) {\n    console.log(body) // Print the google web page.\n  }\n})\n```\n\n## Streaming\n\nYou can stream any response to a file stream.\n\n```javascript\nrequest('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))\n```\n\nYou can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types (in this case `application/json`) and use the proper `content-type` in the PUT request (if the headers donât already provide one).\n\n```javascript\nfs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json'))\n```\n\nRequest can also `pipe` to itself. When doing so, `content-type` and `content-length` are preserved in the PUT headers.\n\n```javascript\nrequest.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))\n```\n\nNow letâs get fancy.\n\n```javascript\nhttp.createServer(function (req, resp) {\n  if (req.url === '/doodle.png') {\n    if (req.method === 'PUT') {\n      req.pipe(request.put('http://mysite.com/doodle.png'))\n    } else if (req.method === 'GET' || req.method === 'HEAD') {\n      request.get('http://mysite.com/doodle.png').pipe(resp)\n    }\n  }\n})\n```\n\nYou can also `pipe()` from `http.ServerRequest` instances, as well as to `http.ServerResponse` instances. The HTTP method, headers, and entity-body data will be sent. Which means that, if you don't really care about security, you can do:\n\n```javascript\nhttp.createServer(function (req, resp) {\n  if (req.url === '/doodle.png') {\n    var x = request('http://mysite.com/doodle.png')\n    req.pipe(x)\n    x.pipe(resp)\n  }\n})\n```\n\nAnd since `pipe()` returns the destination stream in â¥ Node 0.5.x you can do one line proxying. :)\n\n```javascript\nreq.pipe(request('http://mysite.com/doodle.png')).pipe(resp)\n```\n\nAlso, none of this new functionality conflicts with requests previous features, it just expands them.\n\n```javascript\nvar r = request.defaults({'proxy':'http://localproxy.com'})\n\nhttp.createServer(function (req, resp) {\n  if (req.url === '/doodle.png') {\n    r.get('http://google.com/doodle.png').pipe(resp)\n  }\n})\n```\n\nYou can still use intermediate proxies, the requests will still follow HTTP forwards, etc.\n\n## UNIX Socket \n\n`request` supports the `unix://` protocol for all requests. The path is assumed to be absolute to the root of the host file system. \n\nHTTP paths are extracted from the supplied URL by testing each level of the full URL against net.connect for a socket response.\n\nThus the following request will GET `/httppath` from the HTTP server listening on `/tmp/unix.socket`\n\n```javascript\nrequest.get('unix://tmp/unix.socket/httppath')\n```\n\n## Forms\n\n`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API.\n\nURL-encoded forms are simple.\n\n```javascript\nrequest.post('http://service.com/upload', {form:{key:'value'}})\n// or\nrequest.post('http://service.com/upload').form({key:'value'})\n```\n\nFor `multipart/form-data` we use the [form-data](https://github.com/felixge/node-form-data) library by [@felixge](https://github.com/felixge). You donât need to worry about piping the form object or setting the headers, `request` will handle that for you.\n\n```javascript\nvar r = request.post('http://service.com/upload')\nvar form = r.form()\nform.append('my_field', 'my_value')\nform.append('my_buffer', new Buffer([1, 2, 3]))\nform.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png'))\nform.append('remote_file', request('http://google.com/doodle.png'))\n```\n\n## HTTP Authentication\n\n```javascript\nrequest.get('http://some.server.com/').auth('username', 'password', false);\n// or\nrequest.get('http://some.server.com/', {\n  'auth': {\n    'user': 'username',\n    'pass': 'password',\n    'sendImmediately': false\n  }\n});\n```\n\nIf passed as an option, `auth` should be a hash containing values `user` || `username`, `password` || `pass`, and `sendImmediately` (optional).  The method form takes parameters `auth(username, password, sendImmediately)`.\n\n`sendImmediately` defaults to `true`, which causes a basic authentication header to be sent.  If `sendImmediately` is `false`, then `request` will retry with a proper authentication header after receiving a `401` response from the server (which must contain a `WWW-Authenticate` header indicating the required authentication method).\n\nDigest authentication is supported, but it only works with `sendImmediately` set to `false`; otherwise `request` will send basic authentication on the initial request, which will probably cause the request to fail.\n\n## OAuth Signing\n\n```javascript\n// Twitter OAuth\nvar qs = require('querystring')\n  , oauth =\n    { callback: 'http://mysite.com/callback/'\n    , consumer_key: CONSUMER_KEY\n    , consumer_secret: CONSUMER_SECRET\n    }\n  , url = 'https://api.twitter.com/oauth/request_token'\n  ;\nrequest.post({url:url, oauth:oauth}, function (e, r, body) {\n  // Ideally, you would take the body in the response\n  // and construct a URL that a user clicks on (like a sign in button).\n  // The verifier is only available in the response after a user has\n  // verified with twitter that they are authorizing your app.\n  var access_token = qs.parse(body)\n    , oauth =\n      { consumer_key: CONSUMER_KEY\n      , consumer_secret: CONSUMER_SECRET\n      , token: access_token.oauth_token\n      , verifier: access_token.oauth_verifier\n      }\n    , url = 'https://api.twitter.com/oauth/access_token'\n    ;\n  request.post({url:url, oauth:oauth}, function (e, r, body) {\n    var perm_token = qs.parse(body)\n      , oauth =\n        { consumer_key: CONSUMER_KEY\n        , consumer_secret: CONSUMER_SECRET\n        , token: perm_token.oauth_token\n        , token_secret: perm_token.oauth_token_secret\n        }\n      , url = 'https://api.twitter.com/1.1/users/show.json?'\n      , params =\n        { screen_name: perm_token.screen_name\n        , user_id: perm_token.user_id\n        }\n      ;\n    url += qs.stringify(params)\n    request.get({url:url, oauth:oauth, json:true}, function (e, r, user) {\n      console.log(user)\n    })\n  })\n})\n```\n\n### Custom HTTP Headers\n\nHTTP Headers, such as `User-Agent`, can be set in the `options` object.\nIn the example below, we call the github API to find out the number\nof stars and forks for the request repository. This requires a\ncustom `User-Agent` header as well as https.\n\n```javascript\nvar request = require('request');\n\nvar options = {\n\turl: 'https://api.github.com/repos/mikeal/request',\n\theaders: {\n\t\t'User-Agent': 'request'\n\t}\n};\n\nfunction callback(error, response, body) {\n\tif (!error && response.statusCode == 200) {\n\t\tvar info = JSON.parse(body);\n\t\tconsole.log(info.stargazers_count + \" Stars\");\n\t\tconsole.log(info.forks_count + \" Forks\");\n\t}\n}\n\nrequest(options, callback);\n```\n\n### request(options, callback)\n\nThe first argument can be either a `url` or an `options` object. The only required option is `uri`; all others are optional.\n\n* `uri` || `url` - fully qualified uri or a parsed url object from `url.parse()`\n* `qs` - object containing querystring values to be appended to the `uri`\n* `method` - http method (default: `\"GET\"`)\n* `headers` - http headers (default: `{}`)\n* `body` - entity body for PATCH, POST and PUT requests. Must be a `Buffer` or `String`.\n* `form` - when passed an object, this sets `body` to a querystring representation of value, and adds `Content-type: application/x-www-form-urlencoded; charset=utf-8` header. When passed no options, a `FormData` instance is returned (and is piped to request).\n* `auth` - A hash containing values `user` || `username`, `password` || `pass`, and `sendImmediately` (optional).  See documentation above.\n* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header.  Additionally, parses the response body as JSON.\n* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below.\n* `followRedirect` - follow HTTP 3xx responses as redirects (default: `true`)\n* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects (default: `false`)\n* `maxRedirects` - the maximum number of redirects to follow (default: `10`)\n* `encoding` - Encoding to be used on `setEncoding` of response data. If `null`, the `body` is returned as a `Buffer`.\n* `pool` - A hash object containing the agents for these requests. If omitted, the request will use the global pool (which is set to node's default `maxSockets`)\n* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool.\n* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request\n* `proxy` - An HTTP proxy to be used. Supports proxy Auth with Basic Auth, identical to support for the `url` parameter (by embedding the auth info in the `uri`)\n* `oauth` - Options for OAuth HMAC-SHA1 signing. See documentation above.\n* `hawk` - Options for [Hawk signing](https://github.com/hueniverse/hawk). The `credentials` key must contain the necessary signing info, [see hawk docs for details](https://github.com/hueniverse/hawk#usage-example).\n* `strictSSL` - If `true`, requires SSL certificates be valid. **Note:** to use your own certificate authority, you need to specify an agent that was created with that CA as an option.\n* `jar` - If `true`, remember cookies for future use (or define your custom cookie jar; see examples section)\n* `aws` - `object` containing AWS signing information. Should have the properties `key`, `secret`. Also requires the property `bucket`, unless youâre specifying your `bucket` as part of the path, or the request doesnât use a bucket (i.e. GET Services)\n* `httpSignature` - Options for the [HTTP Signature Scheme](https://github.com/joyent/node-http-signature/blob/master/http_signing.md) using [Joyent's library](https://github.com/joyent/node-http-signature). The `keyId` and `key` properties must be specified. See the docs for other options.\n* `localAddress` - Local interface to bind for network connections.\n\n\nThe callback argument gets 3 arguments: \n\n1. An `error` when applicable (usually from [`http.ClientRequest`](http://nodejs.org/api/http.html#http_class_http_clientrequest) object)\n2. An [`http.IncomingMessage`](http://nodejs.org/api/http.html#http_http_incomingmessage) object\n3. The third is the `response` body (`String` or `Buffer`, or JSON object if the `json` option is supplied)\n\n## Convenience methods\n\nThere are also shorthand methods for different HTTP METHODs and some other conveniences.\n\n### request.defaults(options)\n\nThis method returns a wrapper around the normal request API that defaults to whatever options you pass in to it.\n\n### request.put\n\nSame as `request()`, but defaults to `method: \"PUT\"`.\n\n```javascript\nrequest.put(url)\n```\n\n### request.patch\n\nSame as `request()`, but defaults to `method: \"PATCH\"`.\n\n```javascript\nrequest.patch(url)\n```\n\n### request.post\n\nSame as `request()`, but defaults to `method: \"POST\"`.\n\n```javascript\nrequest.post(url)\n```\n\n### request.head\n\nSame as request() but defaults to `method: \"HEAD\"`.\n\n```javascript\nrequest.head(url)\n```\n\n### request.del\n\nSame as `request()`, but defaults to `method: \"DELETE\"`.\n\n```javascript\nrequest.del(url)\n```\n\n### request.get\n\nSame as `request()` (for uniformity).\n\n```javascript\nrequest.get(url)\n```\n### request.cookie\n\nFunction that creates a new cookie.\n\n```javascript\nrequest.cookie('cookie_string_here')\n```\n### request.jar\n\nFunction that creates a new cookie jar.\n\n```javascript\nrequest.jar()\n```\n\n\n## Examples:\n\n```javascript\n  var request = require('request')\n    , rand = Math.floor(Math.random()*100000000).toString()\n    ;\n  request(\n    { method: 'PUT'\n    , uri: 'http://mikeal.iriscouch.com/testjs/' + rand\n    , multipart:\n      [ { 'content-type': 'application/json'\n        ,  body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})\n        }\n      , { body: 'I am an attachment' }\n      ]\n    }\n  , function (error, response, body) {\n      if(response.statusCode == 201){\n        console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand)\n      } else {\n        console.log('error: '+ response.statusCode)\n        console.log(body)\n      }\n    }\n  )\n```\n\nCookies are disabled by default (else, they would be used in subsequent requests). To enable cookies, set `jar` to `true` (either in `defaults` or `options`).\n\n```javascript\nvar request = request.defaults({jar: true})\nrequest('http://www.google.com', function () {\n  request('http://images.google.com')\n})\n```\n\nTo use a custom cookie jar (instead `request`âs global cookie jar), set `jar` to an instance of `request.jar()` (either in `defaults` or `options`)\n\n```javascript\nvar j = request.jar()\nvar request = request.defaults({jar:j})\nrequest('http://www.google.com', function () {\n  request('http://images.google.com')\n})\n```\n\nOR\n\n```javascript\nvar j = request.jar()\nvar cookie = request.cookie('your_cookie_here')\nj.setCookie(cookie, uri);\nrequest({url: 'http://www.google.com', jar: j}, function () {\n  request('http://images.google.com')\n})\n```\n",
   "readmeFilename": "README.md",
   "homepage": "https://github.com/mikeal/request",
-  "_id": "request@2.27.0",
+  "_id": "request@2.34.0",
   "dist": {
-    "shasum": "b7f67055f69980e50629f486c4f511f73503644e"
+    "shasum": "fd3b7ba1c3598ca8b8a9173ed5bd33546104f8bb"
   },
   "_from": "request@>=2.12.0",
-  "_resolved": "https://registry.npmjs.org/request/-/request-2.27.0.tgz"
+  "_resolved": "https://registry.npmjs.org/request/-/request-2.34.0.tgz"
 }
Index: /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/request.js
===================================================================
--- /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/request.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-contrib-less/node_modules/less/node_modules/request/request.js	(revision 516)
@@ -1,5 +1,6 @@
-var http = require('http')
-  , https = false
-  , tls = false
+var optional = require('./lib/optional')
+  , http = require('http')
+  , https = optional('https')
+  , tls = optional('tls')
   , url = require('url')
   , util = require('util')
@@ -9,23 +10,23 @@
   , crypto = require('crypto')
 
-  , oauth = require('oauth-sign')
-  , hawk = require('hawk')
-  , aws = require('aws-sign')
-  , httpSignature = require('http-signature')
+  , oauth = optional('oauth-sign')
+  , hawk = optional('hawk')
+  , aws = optional('aws-sign2')
+  , httpSignature = optional('http-signature')
   , uuid = require('node-uuid')
   , mime = require('mime')
-  , tunnel = require('tunnel-agent')
+  , tunnel = optional('tunnel-agent')
   , _safeStringify = require('json-stringify-safe')
 
   , ForeverAgent = require('forever-agent')
-  , FormData = require('form-data')
-
-  , Cookie = require('cookie-jar')
-  , CookieJar = Cookie.Jar
-  , cookieJar = new CookieJar
+  , FormData = optional('form-data')
+
+  , cookies = require('./lib/cookies')
+  , globalCookieJar = cookies.jar()
 
   , copy = require('./lib/copy')
   , debug = require('./lib/debug')
   , getSafe = require('./lib/getSafe')
+  , net = require('net')
   ;
 
@@ -38,14 +39,5 @@
 
 var globalPool = {}
-var isUrl = /^https?:/i
-
-try {
-  https = require('https')
-} catch (e) {}
-
-try {
-  tls = require('tls')
-} catch (e) {}
-
+var isUrl = /^https?:|^unix:/
 
 
@@ -66,7 +58,5 @@
 
 function isReadStream (rs) {
-  if (rs.readable && rs.path && rs.mode) {
-    return true
-  }
+  return rs.readable && rs.path && rs.mode;
 }
 
@@ -103,4 +93,6 @@
   }
 
+  this.canTunnel = options.tunnel !== false && tunnel;
+
   this.init(options)
 }
@@ -154,5 +146,5 @@
 
     // do the HTTP CONNECT dance using koichik/node-tunnel
-    if (http.globalAgent && self.uri.protocol === "https:") {
+    if (http.globalAgent && self.uri.protocol === "https:" && self.canTunnel) {
       var tunnelFn = self.proxy.protocol === "http:"
                    ? tunnel.httpsOverHttp : tunnel.httpsOverHttps
@@ -173,5 +165,5 @@
   if (!self.uri.pathname) {self.uri.pathname = '/'}
 
-  if (!self.uri.host) {
+  if (!self.uri.host && !self.protocol=='unix:') {
     // Invalid URI: it may generate lot of bad errors, like "TypeError: Cannot call method 'indexOf' of undefined" in CookieJar
     // Detect and reject it as soon as possible
@@ -180,6 +172,6 @@
     if (Object.keys(options).length === 0) {
       // No option ? This can be the sign of a redirect
-      // As this is a case where the user cannot do anything (he didn't call request directly with this URL)
-      // he should be warned that it can be caused by a redirection (can save some hair)
+      // As this is a case where the user cannot do anything (they didn't call request directly with this URL)
+      // they should be warned that it can be caused by a redirection (can save some hair)
       message += '. This can be caused by a crappy redirection.'
     }
@@ -225,5 +217,4 @@
   self.clientErrorHandler = function (error) {
     if (self._aborted) return
-
     if (self.req && self.req._reusedSocket && error.code === 'ECONNRESET'
         && self.agent.addRequestNoreuse) {
@@ -252,170 +243,265 @@
   }
 
-  if (options.form) {
-    self.form(options.form)
-  }
-
-  if (options.qs) self.qs(options.qs)
-
-  if (self.uri.path) {
-    self.path = self.uri.path
+  self._buildRequest = function(){
+    var self = this;
+    
+    if (options.form) {
+      self.form(options.form)
+    }
+    
+    if (options.qs) self.qs(options.qs)
+    
+    if (self.uri.path) {
+      self.path = self.uri.path
+    } else {
+      self.path = self.uri.pathname + (self.uri.search || "")
+    }
+    
+    if (self.path.length === 0) self.path = '/'
+    
+    
+    // Auth must happen last in case signing is dependent on other headers
+    if (options.oauth) {
+      self.oauth(options.oauth)
+    }
+    
+    if (options.aws) {
+      self.aws(options.aws)
+    }
+    
+    if (options.hawk) {
+      self.hawk(options.hawk)
+    }
+    
+    if (options.httpSignature) {
+      self.httpSignature(options.httpSignature)
+    }
+    
+    if (options.auth) {
+      if (Object.prototype.hasOwnProperty.call(options.auth, 'username')) options.auth.user = options.auth.username
+      if (Object.prototype.hasOwnProperty.call(options.auth, 'password')) options.auth.pass = options.auth.password
+    
+      self.auth(
+        options.auth.user,
+        options.auth.pass,
+        options.auth.sendImmediately
+      )
+    }
+    
+    if (self.uri.auth && !self.hasHeader('authorization')) {
+      var authPieces = self.uri.auth.split(':').map(function(item){ return querystring.unescape(item) })
+      self.auth(authPieces[0], authPieces.slice(1).join(':'), true)
+    }
+    if (self.proxy && self.proxy.auth && !self.hasHeader('proxy-authorization') && !self.tunnel) {
+      self.setHeader('proxy-authorization', "Basic " + toBase64(self.proxy.auth.split(':').map(function(item){ return querystring.unescape(item)}).join(':')))
+    }
+    
+    
+    if (self.proxy && !self.tunnel) self.path = (self.uri.protocol + '//' + self.uri.host + self.path)
+    
+    if (options.json) {
+      self.json(options.json)
+    } else if (options.multipart) {
+      self.boundary = uuid()
+      self.multipart(options.multipart)
+    }
+    
+    if (self.body) {
+      var length = 0
+      if (!Buffer.isBuffer(self.body)) {
+        if (Array.isArray(self.body)) {
+          for (var i = 0; i < self.body.length; i++) {
+            length += self.body[i].length
+          }
+        } else {
+          self.body = new Buffer(self.body)
+          length = self.body.length
+        }
+      } else {
+        length = self.body.length
+      }
+      if (length) {
+        if (!self.hasHeader('content-length')) self.setHeader('content-length', length)
+      } else {
+        throw new Error('Argument error, options.body.')
+      }
+    }
+    
+    var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol
+      , defaultModules = {'http:':http, 'https:':https, 'unix:':http}
+      , httpModules = self.httpModules || {}
+      ;
+    self.httpModule = httpModules[protocol] || defaultModules[protocol]
+    
+    if (!self.httpModule) return this.emit('error', new Error("Invalid protocol"))
+    
+    if (options.ca) self.ca = options.ca
+    
+    if (!self.agent) {
+      if (options.agentOptions) self.agentOptions = options.agentOptions
+    
+      if (options.agentClass) {
+        self.agentClass = options.agentClass
+      } else if (options.forever) {
+        self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL
+      } else {
+        self.agentClass = self.httpModule.Agent
+      }
+    }
+    
+    if (self.pool === false) {
+      self.agent = false
+    } else {
+      self.agent = self.agent || self.getAgent()
+      if (self.maxSockets) {
+        // Don't use our pooling if node has the refactored client
+        self.agent.maxSockets = self.maxSockets
+      }
+      if (self.pool.maxSockets) {
+        // Don't use our pooling if node has the refactored client
+        self.agent.maxSockets = self.pool.maxSockets
+      }
+    }
+    
+    self.on('pipe', function (src) {
+      if (self.ntick && self._started) throw new Error("You cannot pipe to this stream after the outbound request has started.")
+      self.src = src
+      if (isReadStream(src)) {
+        if (!self.hasHeader('content-type')) self.setHeader('content-type', mime.lookup(src.path))
+      } else {
+        if (src.headers) {
+          for (var i in src.headers) {
+            if (!self.hasHeader(i)) {
+              self.setHeader(i, src.headers[i])
+            }
+          }
+        }
+        if (self._json && !self.hasHeader('content-type'))
+          self.setHeader('content-type', 'application/json')
+        if (src.method && !self.explicitMethod) {
+          self.method = src.method
+        }
+      }
+    
+      // self.on('pipe', function () {
+      //   console.error("You have already piped to this stream. Pipeing twice is likely to break the request.")
+      // })
+    })
+    
+    process.nextTick(function () {
+      if (self._aborted) return
+    
+      if (self._form) {
+        self.setHeaders(self._form.getHeaders())
+        try {
+          var length = self._form.getLengthSync()
+          self.setHeader('content-length', length)
+        } catch(e){}
+        self._form.pipe(self)
+      }
+      if (self.body) {
+        if (Array.isArray(self.body)) {
+          self.body.forEach(function (part) {
+            self.write(part)
+          })
+        } else {
+          self.write(self.body)
+        }
+        self.end()
+      } else if (self.requestBodyStream) {
+        console.warn("options.requestBodyStream is deprecated, please pass the request object to stream.pipe.")
+        self.requestBodyStream.pipe(self)
+      } else if (!self.src) {
+        if (self.method !== 'GET' && typeof self.method !== 'undefined') {
+          self.setHeader('content-length', 0)
+        }
+        self.end()
+      }
+      self.ntick = true
+    })
+    
+  } // End _buildRequest
+  
+  self._handleUnixSocketURI = function(self){
+    // Parse URI and extract a socket path (tested as a valid socket using net.connect), and a http style path suffix
+    // Thus http requests can be made to a socket using the uri unix://tmp/my.socket/urlpath
+    // and a request for '/urlpath' will be sent to the unix socket at /tmp/my.socket
+    
+    self.unixsocket = true;
+    
+    var full_path = self.uri.href.replace(self.uri.protocol+'/', '');
+    
+    var lookup = full_path.split('/');
+    var error_connecting = true;
+    
+    var lookup_table = {}; 
+    do { lookup_table[lookup.join('/')]={} } while(lookup.pop())
+    for (r in lookup_table){
+      try_next(r);
+    }
+    
+    function try_next(table_row){
+      var client = net.connect( table_row );
+      client.path = table_row
+      client.on('error', function(){ lookup_table[this.path].error_connecting=true; this.end(); });
+      client.on('connect', function(){ lookup_table[this.path].error_connecting=false; this.end(); });
+      table_row.client = client;
+    }
+    
+    wait_for_socket_response();
+    
+    response_counter = 0;
+
+    function wait_for_socket_response(){
+      var detach;
+      if('undefined' == typeof setImmediate ) detach = process.nextTick
+      else detach = setImmediate;
+      detach(function(){
+        // counter to prevent infinite blocking waiting for an open socket to be found.
+        response_counter++;
+        var trying = false;
+        for (r in lookup_table){
+          //console.log(r, lookup_table[r], lookup_table[r].error_connecting)
+          if('undefined' == typeof lookup_table[r].error_connecting)
+            trying = true;
+        }
+        if(trying && response_counter<1000)
+          wait_for_socket_response()
+        else 
+          set_socket_properties();
+      })
+    }
+    
+    function set_socket_properties(){
+      var host;
+      for (r in lookup_table){
+        if(lookup_table[r].error_connecting === false){
+          host = r
+        }
+      }
+      if(!host){
+        self.emit('error', new Error("Failed to connect to any socket in "+full_path))
+      }
+      var path = full_path.replace(host, '')
+      
+      self.socketPath = host
+      self.uri.pathname = path
+      self.uri.href = path
+      self.uri.path = path
+      self.host = ''
+      self.hostname = ''
+      delete self.host
+      delete self.hostname
+      self._buildRequest();
+    }
+  }
+  
+  // Intercept UNIX protocol requests to change properties to match socket
+  if(/^unix:/.test(self.uri.protocol)){
+    self._handleUnixSocketURI(self);
   } else {
-    self.path = self.uri.pathname + (self.uri.search || "")
-  }
-
-  if (self.path.length === 0) self.path = '/'
-
-
-  // Auth must happen last in case signing is dependent on other headers
-  if (options.oauth) {
-    self.oauth(options.oauth)
-  }
-
-  if (options.aws) {
-    self.aws(options.aws)
-  }
-
-  if (options.hawk) {
-    self.hawk(options.hawk)
-  }
-
-  if (options.httpSignature) {
-    self.httpSignature(options.httpSignature)
-  }
-
-  if (options.auth) {
-    self.auth(
-      (options.auth.user==="") ? options.auth.user : (options.auth.user || options.auth.username ),
-      options.auth.pass || options.auth.password,
-      options.auth.sendImmediately)
-  }
-
-  if (self.uri.auth && !self.hasHeader('authorization')) {
-    var authPieces = self.uri.auth.split(':').map(function(item){ return querystring.unescape(item) })
-    self.auth(authPieces[0], authPieces.slice(1).join(':'), true)
-  }
-  if (self.proxy && self.proxy.auth && !self.hasHeader('proxy-authorization') && !self.tunnel) {
-    self.setHeader('proxy-authorization', "Basic " + toBase64(self.proxy.auth.split(':').map(function(item){ return querystring.unescape(item)}).join(':')))
-  }
-
-
-  if (self.proxy && !self.tunnel) self.path = (self.uri.protocol + '//' + self.uri.host + self.path)
-
-  if (options.json) {
-    self.json(options.json)
-  } else if (options.multipart) {
-    self.boundary = uuid()
-    self.multipart(options.multipart)
-  }
-
-  if (self.body) {
-    var length = 0
-    if (!Buffer.isBuffer(self.body)) {
-      if (Array.isArray(self.body)) {
-        for (var i = 0; i < self.body.length; i++) {
-          length += self.body[i].length
-        }
-      } else {
-        self.body = new Buffer(self.body)
-        length = self.body.length
-      }
-    } else {
-      length = self.body.length
-    }
-    if (length) {
-      if (!self.hasHeader('content-length')) self.setHeader('content-length', length)
-    } else {
-      throw new Error('Argument error, options.body.')
-    }
-  }
-
-  var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol
-    , defaultModules = {'http:':http, 'https:':https}
-    , httpModules = self.httpModules || {}
-    ;
-  self.httpModule = httpModules[protocol] || defaultModules[protocol]
-
-  if (!self.httpModule) return this.emit('error', new Error("Invalid protocol"))
-
-  if (options.ca) self.ca = options.ca
-
-  if (!self.agent) {
-    if (options.agentOptions) self.agentOptions = options.agentOptions
-
-    if (options.agentClass) {
-      self.agentClass = options.agentClass
-    } else if (options.forever) {
-      self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL
-    } else {
-      self.agentClass = self.httpModule.Agent
-    }
-  }
-
-  if (self.pool === false) {
-    self.agent = false
-  } else {
-    self.agent = self.agent || self.getAgent()
-    if (self.maxSockets) {
-      // Don't use our pooling if node has the refactored client
-      self.agent.maxSockets = self.maxSockets
-    }
-    if (self.pool.maxSockets) {
-      // Don't use our pooling if node has the refactored client
-      self.agent.maxSockets = self.pool.maxSockets
-    }
-  }
-
-  self.on('pipe', function (src) {
-    if (self.ntick && self._started) throw new Error("You cannot pipe to this stream after the outbound request has started.")
-    self.src = src
-    if (isReadStream(src)) {
-      if (!self.hasHeader('content-type')) self.setHeader('content-type', mime.lookup(src.path))
-    } else {
-      if (src.headers) {
-        for (var i in src.headers) {
-          if (!self.hasHeader(i)) {
-            self.setHeader(i, src.headers[i])
-          }
-        }
-      }
-      if (self._json && !self.hasHeader('content-type'))
-        self.setHeader('content-type', 'application/json')
-      if (src.method && !self.explicitMethod) {
-        self.method = src.method
-      }
-    }
-
-    // self.on('pipe', function () {
-    //   console.error("You have already piped to this stream. Pipeing twice is likely to break the request.")
-    // })
-  })
-
-  process.nextTick(function () {
-    if (self._aborted) return
-
-    if (self._form) {
-      self.setHeaders(self._form.getHeaders())
-      self._form.pipe(self)
-    }
-    if (self.body) {
-      if (Array.isArray(self.body)) {
-        self.body.forEach(function (part) {
-          self.write(part)
-        })
-      } else {
-        self.write(self.body)
-      }
-      self.end()
-    } else if (self.requestBodyStream) {
-      console.warn("options.requestBodyStream is deprecated, please pass the request object to stream.pipe.")
-      self.requestBodyStream.pipe(self)
-    } else if (!self.src) {
-      if (self.method !== 'GET' && typeof self.method !== 'undefined') {
-        self.setHeader('content-length', 0)
-      }
-      self.end()
-    }
-    self.ntick = true
-  })
+    self._buildRequest();
+  }
+  
 }
 
@@ -430,5 +516,5 @@
     // previously was doing http, now doing https
     // if it's https, then we might need to tunnel now.
-    if (self.proxy) {
+    if (self.proxy && self.canTunnel) {
       self.tunnel = true
       var tunnelFn = self.proxy.protocol === 'http:'
@@ -493,4 +579,6 @@
   }
   if (this.ca) options.ca = this.ca
+  if (this.ciphers) options.ciphers = this.ciphers
+  if (this.secureProtocol) options.secureProtocol = this.secureProtocol
   if (typeof this.rejectUnauthorized !== 'undefined') options.rejectUnauthorized = this.rejectUnauthorized
 
@@ -538,7 +626,7 @@
     }
 
-    if (options.secureOptions) {
+    if (options.secureProtocol) {
       if (poolKey) poolKey += ':'
-      poolKey += options.secureOptions
+      poolKey += options.secureProtocol
     }
   }
@@ -653,12 +741,12 @@
   }
 
+  var targetCookieJar = (self._jar && self._jar.setCookie)?self._jar:globalCookieJar;
   var addCookie = function (cookie) {
-    if (self._jar){
-      if(self._jar.add){
-        self._jar.add(new Cookie(cookie))
-      }
-      else cookieJar.add(new Cookie(cookie))
-    }
-
+    //set the cookie if it's domain in the href's domain.
+    try {
+      targetCookieJar.setCookie(cookie, self.uri.href, {ignoreError: true});
+    } catch (e) {
+      self.emit('error', e);
+    }
   }
 
@@ -691,31 +779,40 @@
   } else if (response.statusCode == 401 && self._hasAuth && !self._sentAuth) {
     var authHeader = response.headers[hasHeader('www-authenticate', response.headers)]
-    var authVerb = authHeader && authHeader.split(' ')[0]
+    var authVerb = authHeader && authHeader.split(' ')[0].toLowerCase()
     debug('reauth', authVerb)
 
     switch (authVerb) {
-      case 'Basic':
+      case 'basic':
         self.auth(self._user, self._pass, true)
         redirectTo = self.uri
         break
 
-      case 'Digest':
-        // TODO: More complete implementation of RFC 2617.  For reference:
+      case 'digest':
+        // TODO: More complete implementation of RFC 2617.
+        //   - check challenge.algorithm
+        //   - support algorithm="MD5-sess"
+        //   - handle challenge.domain
+        //   - support qop="auth-int" only
+        //   - handle Authentication-Info (not necessarily?)
+        //   - check challenge.stale (not necessarily?)
+        //   - increase nc (not necessarily?)
+        // For reference:
         // http://tools.ietf.org/html/rfc2617#section-3
         // https://github.com/bagder/curl/blob/master/lib/http_digest.c
 
-        var matches = authHeader.match(/([a-z0-9_-]+)="([^"]+)"/gi)
         var challenge = {}
-
-        for (var i = 0; i < matches.length; i++) {
-          var eqPos = matches[i].indexOf('=')
-          var key = matches[i].substring(0, eqPos)
-          var quotedValue = matches[i].substring(eqPos + 1)
-          challenge[key] = quotedValue.substring(1, quotedValue.length - 1)
+        var re = /([a-z0-9_-]+)=(?:"([^"]+)"|([a-z0-9_-]+))/gi
+        for (;;) {
+          var match = re.exec(authHeader)
+          if (!match) break
+          challenge[match[1]] = match[2] || match[3];
         }
 
         var ha1 = md5(self._user + ':' + challenge.realm + ':' + self._pass)
         var ha2 = md5(self.method + ':' + self.uri.path)
-        var digestResponse = md5(ha1 + ':' + challenge.nonce + ':1::auth:' + ha2)
+        var qop = /(^|,)\s*auth\s*($|,)/.test(challenge.qop) && 'auth'
+        var nc = qop && '00000001'
+        var cnonce = qop && uuid().replace(/-/g, '')
+        var digestResponse = qop ? md5(ha1 + ':' + challenge.nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + ha2) : md5(ha1 + ':' + challenge.nonce + ':' + ha2)
         var authValues = {
           username: self._user,
@@ -723,13 +820,21 @@
           nonce: challenge.nonce,
           uri: self.uri.path,
-          qop: challenge.qop,
+          qop: qop,
           response: digestResponse,
-          nc: 1,
-          cnonce: ''
+          nc: nc,
+          cnonce: cnonce,
+          algorithm: challenge.algorithm,
+          opaque: challenge.opaque
         }
 
         authHeader = []
         for (var k in authValues) {
-          authHeader.push(k + '="' + authValues[k] + '"')
+          if (!authValues[k]) {
+            //ignore
+          } else if (k === 'qop' || k === 'nc' || k === 'algorithm') {
+            authHeader.push(k + '=' + authValues[k])
+          } else {
+            authHeader.push(k + '="' + authValues[k] + '"')
+          }
         }
         authHeader = 'Digest ' + authHeader.join(', ')
@@ -986,5 +1091,6 @@
     self.setHeader('content-type', 'multipart/related; boundary=' + self.boundary)
   } else {
-    self.setHeader('content-type', self.headers['content-type'].split(';')[0] + '; boundary=' + self.boundary)
+    var headerName = self.hasHeader('content-type');
+    self.setHeader(headerName, self.headers[headerName].split(';')[0] + '; boundary=' + self.boundary)
   }
 
@@ -1020,10 +1126,13 @@
     if (typeof this.body === 'object') {
       this.body = safeStringify(this.body)
-      self.setHeader('content-type', 'application/json')
+      if (!self.hasHeader('content-type'))
+        self.setHeader('content-type', 'application/json')
     }
   } else {
     this.body = safeStringify(val)
-    self.setHeader('content-type', 'application/json')
-  }
+    if (!self.hasHeader('content-type'))
+      self.setHeader('content-type', 'application/json')
+  }
+
   return this
 }
@@ -1161,22 +1270,20 @@
     cookies = false
     this._disableCookies = true
-  } else if (jar && jar.get) {
-    // fetch cookie from the user defined cookie jar
-    cookies = jar.get({ url: this.uri.href })
   } else {
-    // fetch cookie from the global cookie jar
-    cookies = cookieJar.get({ url: this.uri.href })
-  }
-
+    var targetCookieJar = (jar && jar.getCookieString)?jar:globalCookieJar;
+    var urihref = this.uri.href
+    //fetch cookie in the Specified host
+    if (targetCookieJar) {
+      cookies = targetCookieJar.getCookieString(urihref);
+    }
+  }
+
+  //if need cookie and cookie is not empty
   if (cookies && cookies.length) {
-    var cookieString = cookies.map(function (c) {
-      return c.name + "=" + c.value
-    }).join("; ")
-
     if (this.originalCookieHeader) {
       // Don't overwrite existing Cookie header
-      this.setHeader('cookie', this.originalCookieHeader + '; ' + cookieString)
+      this.setHeader('cookie', this.originalCookieHeader + '; ' + cookies)
     } else {
-      this.setHeader('cookie', cookieString)
+      this.setHeader('cookie', cookies)
     }
   }
Index: /Dev/trunk/node_modules/grunt-exec/.travis.yml
===================================================================
--- /Dev/trunk/node_modules/grunt-exec/.travis.yml	(revision 515)
+++ /Dev/trunk/node_modules/grunt-exec/.travis.yml	(revision 516)
@@ -1,3 +1,4 @@
 language: node_js
 node_js:
-  - 0.8
+  - "0.8"
+  - "0.10"
Index: /Dev/trunk/node_modules/grunt-exec/Gruntfile.js
===================================================================
--- /Dev/trunk/node_modules/grunt-exec/Gruntfile.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-exec/Gruntfile.js	(revision 516)
@@ -10,4 +10,5 @@
         cmd: 'ls -l **'
       }
+    , list_all_files: 'ls -la'
     , echo_grunt_version: {
         cmd: function() { return 'echo ' + this.version; }
Index: /Dev/trunk/node_modules/grunt-exec/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-exec/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt-exec/README.md	(revision 516)
@@ -23,26 +23,46 @@
 -----
 
-This plugin is a [multi task][types_of_tasks], meaning that grunt will automatically iterate over all exec targets if a target is not specified.
+This plugin is a [multi task][types_of_tasks], meaning that grunt will 
+automatically iterate over all exec targets if a target is not specified.
 
-If the exit code generated by the specified shell command is greater than 0, grunt-exec will assume an error has occurred and will abort grunt immediately.
+If the exit code generated by the specified shell command is greater than 0, 
+grunt-exec will assume an error has occurred and will abort grunt immediately.
 
-[types_of_tasks]: https://github.com/gruntjs/grunt/blob/master/docs/types_of_tasks.md#multi-tasks
+[types_of_tasks]: http://gruntjs.com/configuring-tasks#task-configuration-and-targets
 
 ### Properties
 
-*   __command__: The shell command to be executed. Must be a string or a function that returns a string. (alias: __cmd__)
-*   __stdout__: If `true`, stdout will be printed. Defaults to `true`.
-*   __stderr__: If `true`, stderr will be printed. Defaults to `true`.
-*   __cwd__: Current working directory of the shell command. Defaults to the directory containing your Gruntfile.
-*   __exitCode__: The expected exit code, task will fail if the actual exit code doesn't match. Defaults to `0`.
-*   __callback__: The callback function passed `child_process.exec`. Defaults to a noop.
+*  __command__ (alias: __cmd__): The shell command to be executed. Must be a 
+  string or a function that returns a string.
+*  __stdout__: If `true`, stdout will be printed. Defaults to `true`.
+*  __stderr__: If `true`, stderr will be printed. Defaults to `true`.
+*  __cwd__: Current working directory of the shell command. Defaults to the 
+  directory containing your Gruntfile.
+*  __exitCode__ (alias: __exitCodes__): The expected exit code(s), task will 
+  fail if the actual exit code doesn't match. Defaults to `0`. Can be an array 
+  for multiple allowed exit codes.
+*  __callback__: The callback function passed `child_process.exec`. Defaults to 
+  a noop.
+
+If the configuration is instead a simple `string`, it will be
+interpreted as a full command itself:
+
+```javascript
+exec: {
+  echo_something: 'echo "This is something"'
+}
+```
 
 ### Command Functions
 
-If you plan on doing advanced stuff with grunt-exec, you'll most likely be using functions for the `command` property of your exec targets. This section details a couple of helpful tips about command functions that could help make your life easier.
+If you plan on doing advanced stuff with grunt-exec, you'll most likely be using 
+functions for the `command` property of your exec targets. This section details 
+a couple of helpful tips about command functions that could help make your life 
+easier.
 
 #### Passing arguments from the command line
 
-Command functions can be called with arbitrary arguments. Let's say we have the following exec target that echoes a formatted name:
+Command functions can be called with arbitrary arguments. Let's say we have the 
+following exec target that echoes a formatted name:
 
 ```javascript
@@ -61,9 +81,11 @@
 ```
 
-In order to get `SIMPSON, HOMER` echoed, you'd run `grunt exec:echo_name:homer:simpson` from the command line.
+In order to get `SIMPSON, HOMER` echoed, you'd run 
+`grunt exec:echo_name:homer:simpson` from the command line.
 
 ### Accessing `grunt` object
 
-All command functions are called in the context of the `grunt` object that they are being ran with. This means you can access the `grunt` object through `this`.
+All command functions are called in the context of the `grunt` object that they 
+are being ran with. This means you can access the `grunt` object through `this`.
 
 ### Example
@@ -82,4 +104,5 @@
       cmd: 'ls -l **'
     },
+    list_all_files: 'ls -la',
     echo_grunt_version: {
       cmd: function() { return 'echo ' + this.version; }
@@ -117,5 +140,6 @@
 ----------
 
-For transparency and insight into the release cycle, releases will be numbered with the follow format:
+For transparency and insight into the release cycle, releases will be numbered 
+with the follow format:
 
 `<major>.<minor>.<patch>`
Index: /Dev/trunk/node_modules/grunt-exec/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-exec/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-exec/package.json	(revision 516)
@@ -2,5 +2,5 @@
   "name": "grunt-exec",
   "description": "Grunt task for executing shell commands.",
-  "version": "0.4.2",
+  "version": "0.4.5",
   "homepage": "https://github.com/jharding/grunt-exec",
   "author": {
@@ -40,11 +40,11 @@
     "shell"
   ],
-  "readme": "[![build status](https://secure.travis-ci.org/jharding/grunt-exec.png?branch=master)](http://travis-ci.org/jharding/grunt-exec)\ngrunt-exec\n==========\n\nGrunt plugin for executing shell commands.\n\nInstallation\n------------\n\nInstall grunt-exec using npm:\n\n```\n$ npm install grunt-exec\n```\n\nThen add this line to your project's *Gruntfile.js*:\n\n```javascript\ngrunt.loadNpmTasks('grunt-exec');\n```\n\nUsage\n-----\n\nThis plugin is a [multi task][types_of_tasks], meaning that grunt will automatically iterate over all exec targets if a target is not specified.\n\nIf the exit code generated by the specified shell command is greater than 0, grunt-exec will assume an error has occurred and will abort grunt immediately.\n\n[types_of_tasks]: https://github.com/gruntjs/grunt/blob/master/docs/types_of_tasks.md#multi-tasks\n\n### Properties\n\n*   __command__: The shell command to be executed. Must be a string or a function that returns a string. (alias: __cmd__)\n*   __stdout__: If `true`, stdout will be printed. Defaults to `true`.\n*   __stderr__: If `true`, stderr will be printed. Defaults to `true`.\n*   __cwd__: Current working directory of the shell command. Defaults to the directory containing your Gruntfile.\n*   __exitCode__: The expected exit code, task will fail if the actual exit code doesn't match. Defaults to `0`.\n*   __callback__: The callback function passed `child_process.exec`. Defaults to a noop.\n\n### Command Functions\n\nIf you plan on doing advanced stuff with grunt-exec, you'll most likely be using functions for the `command` property of your exec targets. This section details a couple of helpful tips about command functions that could help make your life easier.\n\n#### Passing arguments from the command line\n\nCommand functions can be called with arbitrary arguments. Let's say we have the following exec target that echoes a formatted name:\n\n```javascript\nexec: {\n  echo_name: {\n    cmd: function(firstName, lastName) {\n      var formattedName = [\n        lastName.toUpperCase(),\n        firstName.toUpperCase()\n      ].join(', ');\n\n      return 'echo ' + formattedName;\n    }\n  }\n}\n```\n\nIn order to get `SIMPSON, HOMER` echoed, you'd run `grunt exec:echo_name:homer:simpson` from the command line.\n\n### Accessing `grunt` object\n\nAll command functions are called in the context of the `grunt` object that they are being ran with. This means you can access the `grunt` object through `this`.\n\n### Example\n\nThe following examples are available in grunt-exec's Gruntfile.\n\n```javascript\ngrunt.initConfig({\n  exec: {\n    remove_logs: {\n      command: 'rm -f *.log',\n      stdout: false,\n      stderr: false\n    },\n    list_files: {\n      cmd: 'ls -l **'\n    },\n    echo_grunt_version: {\n      cmd: function() { return 'echo ' + this.version; }\n    },\n    echo_name: {\n      cmd: function(firstName, lastName) {\n        var formattedName = [\n          lastName.toUpperCase(),\n          firstName.toUpperCase()\n        ].join(', ');\n\n        return 'echo ' + formattedName;\n      }\n    }\n  }\n});\n```\n\nTesting\n-------\n\n```\n$ cd grunt-exec\n$ npm test\n```\n\nIssues\n------\n\nFound a bug? Create an issue on GitHub.\n\nhttps://github.com/jharding/grunt-exec/issues\n\nVersioning\n----------\n\nFor transparency and insight into the release cycle, releases will be numbered with the follow format:\n\n`<major>.<minor>.<patch>`\n\nAnd constructed with the following guidelines:\n\n* Breaking backwards compatibility bumps the major\n* New additions without breaking backwards compatibility bumps the minor\n* Bug fixes and misc changes bump the patch\n\nFor more information on semantic versioning, please visit http://semver.org/.\n\nLicense\n-------\n\nCopyright (c) 2012 [Jake Harding](http://thejakeharding.com)  \nLicensed under the MIT License.\n",
+  "readme": "[![build status](https://secure.travis-ci.org/jharding/grunt-exec.png?branch=master)](http://travis-ci.org/jharding/grunt-exec)\ngrunt-exec\n==========\n\nGrunt plugin for executing shell commands.\n\nInstallation\n------------\n\nInstall grunt-exec using npm:\n\n```\n$ npm install grunt-exec\n```\n\nThen add this line to your project's *Gruntfile.js*:\n\n```javascript\ngrunt.loadNpmTasks('grunt-exec');\n```\n\nUsage\n-----\n\nThis plugin is a [multi task][types_of_tasks], meaning that grunt will \nautomatically iterate over all exec targets if a target is not specified.\n\nIf the exit code generated by the specified shell command is greater than 0, \ngrunt-exec will assume an error has occurred and will abort grunt immediately.\n\n[types_of_tasks]: http://gruntjs.com/configuring-tasks#task-configuration-and-targets\n\n### Properties\n\n*  __command__ (alias: __cmd__): The shell command to be executed. Must be a \n  string or a function that returns a string.\n*  __stdout__: If `true`, stdout will be printed. Defaults to `true`.\n*  __stderr__: If `true`, stderr will be printed. Defaults to `true`.\n*  __cwd__: Current working directory of the shell command. Defaults to the \n  directory containing your Gruntfile.\n*  __exitCode__ (alias: __exitCodes__): The expected exit code(s), task will \n  fail if the actual exit code doesn't match. Defaults to `0`. Can be an array \n  for multiple allowed exit codes.\n*  __callback__: The callback function passed `child_process.exec`. Defaults to \n  a noop.\n\nIf the configuration is instead a simple `string`, it will be\ninterpreted as a full command itself:\n\n```javascript\nexec: {\n  echo_something: 'echo \"This is something\"'\n}\n```\n\n### Command Functions\n\nIf you plan on doing advanced stuff with grunt-exec, you'll most likely be using \nfunctions for the `command` property of your exec targets. This section details \na couple of helpful tips about command functions that could help make your life \neasier.\n\n#### Passing arguments from the command line\n\nCommand functions can be called with arbitrary arguments. Let's say we have the \nfollowing exec target that echoes a formatted name:\n\n```javascript\nexec: {\n  echo_name: {\n    cmd: function(firstName, lastName) {\n      var formattedName = [\n        lastName.toUpperCase(),\n        firstName.toUpperCase()\n      ].join(', ');\n\n      return 'echo ' + formattedName;\n    }\n  }\n}\n```\n\nIn order to get `SIMPSON, HOMER` echoed, you'd run \n`grunt exec:echo_name:homer:simpson` from the command line.\n\n### Accessing `grunt` object\n\nAll command functions are called in the context of the `grunt` object that they \nare being ran with. This means you can access the `grunt` object through `this`.\n\n### Example\n\nThe following examples are available in grunt-exec's Gruntfile.\n\n```javascript\ngrunt.initConfig({\n  exec: {\n    remove_logs: {\n      command: 'rm -f *.log',\n      stdout: false,\n      stderr: false\n    },\n    list_files: {\n      cmd: 'ls -l **'\n    },\n    list_all_files: 'ls -la',\n    echo_grunt_version: {\n      cmd: function() { return 'echo ' + this.version; }\n    },\n    echo_name: {\n      cmd: function(firstName, lastName) {\n        var formattedName = [\n          lastName.toUpperCase(),\n          firstName.toUpperCase()\n        ].join(', ');\n\n        return 'echo ' + formattedName;\n      }\n    }\n  }\n});\n```\n\nTesting\n-------\n\n```\n$ cd grunt-exec\n$ npm test\n```\n\nIssues\n------\n\nFound a bug? Create an issue on GitHub.\n\nhttps://github.com/jharding/grunt-exec/issues\n\nVersioning\n----------\n\nFor transparency and insight into the release cycle, releases will be numbered \nwith the follow format:\n\n`<major>.<minor>.<patch>`\n\nAnd constructed with the following guidelines:\n\n* Breaking backwards compatibility bumps the major\n* New additions without breaking backwards compatibility bumps the minor\n* Bug fixes and misc changes bump the patch\n\nFor more information on semantic versioning, please visit http://semver.org/.\n\nLicense\n-------\n\nCopyright (c) 2012 [Jake Harding](http://thejakeharding.com)  \nLicensed under the MIT License.\n",
   "readmeFilename": "README.md",
-  "_id": "grunt-exec@0.4.2",
+  "_id": "grunt-exec@0.4.5",
   "dist": {
-    "shasum": "021f0dddaeef00cc4d83dff9d0d8c47a64917dbd"
+    "shasum": "2848b5f9ed0a096b459a637aad35cc89098b7958"
   },
-  "_from": "grunt-exec@0.4.2",
-  "_resolved": "https://registry.npmjs.org/grunt-exec/-/grunt-exec-0.4.2.tgz"
+  "_from": "grunt-exec@0.4.5",
+  "_resolved": "https://registry.npmjs.org/grunt-exec/-/grunt-exec-0.4.5.tgz"
 }
Index: /Dev/trunk/node_modules/grunt-exec/tasks/exec.js
===================================================================
--- /Dev/trunk/node_modules/grunt-exec/tasks/exec.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-exec/tasks/exec.js	(revision 516)
@@ -18,5 +18,5 @@
       , stderr = data.stderr !== undefined ? data.stderr : true
       , callback = _.isFunction(data.callback) ? data.callback : function() {}
-      , exitCode = data.exitCode || 0
+      , exitCodes = data.exitCode || data.exitCodes || 0
       , command
       , childProcess
@@ -24,7 +24,10 @@
       , done = this.async();
 
+    // https://github.com/jharding/grunt-exec/pull/30
+    exitCodes = _.isArray(exitCodes) ? exitCodes : [exitCodes];
+
     // allow for command to be specified in either
-    // 'command' or 'cmd' property
-    command = data.command || data.cmd;
+    // 'command' or 'cmd' property, or as a string.
+    command = data.command || data.cmd || (_.isString(data) && data);
 
     data.cwd && (execOptions.cwd = data.cwd);
@@ -46,5 +49,5 @@
 
     verbose.subhead(command);
-    verbose.writeln(f('Expecting exit code %d', exitCode));
+    verbose.writeln(f('Expecting exit code %s', exitCodes.join(' or ')));
 
     childProcess = cp.exec(command, execOptions, callback);
@@ -54,5 +57,5 @@
 
     childProcess.on('exit', function(code) {
-      if (code !== exitCode) {
+      if (exitCodes.indexOf(code) < 0) {
         log.error(f('Exited with code: %d.', code));
         return done(false);
Index: /Dev/trunk/node_modules/grunt-exec/test/Gruntfile.js
===================================================================
--- /Dev/trunk/node_modules/grunt-exec/test/Gruntfile.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-exec/test/Gruntfile.js	(revision 516)
@@ -21,13 +21,23 @@
         cmd: function(){
           return 'echo "you can use callback, and error, stdout, stderr can be used as arguments"';
-        },
-        callback: function(error, stdout, stderr){
-          var fs = require('fs');
-          var path = require('path');
-          var outputPath = path.resolve(process.cwd(), 'test4');
+        }
+      , callback: function(error, stdout, stderr){
+          var fs = require('fs')
+            , path = require('path')
+            , outputPath = path.resolve(process.cwd(), 'test4');
+
           console.log('outputPath : ' + outputPath);
           fs.writeFileSync(outputPath, stdout, 'utf-8');
         }
       }
+    , test5: {
+        cmd: 'exit 8'
+      , exitCodes: 8
+      }
+    , test6: {
+        cmd: 'exit 9'
+      , exitCodes: [8, 9]
+      }
+    , test7: 'echo "you don\'t even need an object" > test7'
     }
   });
Index: /Dev/trunk/node_modules/grunt-exec/test/test.js
===================================================================
--- /Dev/trunk/node_modules/grunt-exec/test/test.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-exec/test/test.js	(revision 516)
@@ -5,5 +5,13 @@
   , testDir = path.join(process.cwd(), 'test')
   , opts = { gruntfile: path.join(testDir, 'Gruntfile.js') }
-  , tasks = ['exec:test1', 'exec:test2', 'exec:test3:42:love', 'exec:test4'];
+  , tasks = [
+      'exec:test1'
+    , 'exec:test2'
+    , 'exec:test3:42:love'
+    , 'exec:test4'
+    , 'exec:test5'
+    , 'exec:test6'
+    , 'exec:test7'
+    ];
 
 grunt.tasks(tasks, opts, function() {
@@ -21,4 +29,5 @@
         , expected:'you can use callback, and error, stdout, stderr can be used as arguments\n'
         }
+      , { name: 'test7', expected: 'you don\'t even need an object\n' }
       ]
     , outputPath;
Index: /Dev/trunk/node_modules/grunt-git-deploy/.npmignore
===================================================================
--- /Dev/trunk/node_modules/grunt-git-deploy/.npmignore	(revision 516)
+++ /Dev/trunk/node_modules/grunt-git-deploy/.npmignore	(revision 516)
@@ -0,0 +1,4 @@
+node_modules
+npm-debug.log
+tmp
+.c9revisions
Index: /Dev/trunk/node_modules/grunt-git-deploy/Gruntfile.js
===================================================================
--- /Dev/trunk/node_modules/grunt-git-deploy/Gruntfile.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-git-deploy/Gruntfile.js	(revision 516)
@@ -0,0 +1,95 @@
+/*
+ * grunt-git-deploy
+ * https://github.com/iclanzan/grunt-git-deploy
+ *
+ * Copyright (c) 2013 Sorin Iclanzan
+ * Licensed under the MIT license.
+ */
+
+'use strict';
+
+module.exports = function(grunt) {
+
+  grunt.registerMultiTask('init_repo', 'Initialize a git repository in a directory.', function() {
+    var dest = this.files[0].dest;
+
+    if (!grunt.file.exists(dest)) {
+      grunt.file.mkdir(dest);
+    }
+
+    else if (!grunt.file.isDir(dest)) {
+      grunt.fail.warn('A source directory is needed.');
+      return false;
+    }
+
+    var done = this.async();
+
+    grunt.util.spawn({
+      cmd: 'git',
+      args: ['init'],
+      opts: {cwd: dest}
+    }, done);
+  });
+
+  // Project configuration.
+  grunt.initConfig({
+
+    // Before generating any new files, remove any previously-created files.
+    clean: {
+      tests: ['tmp']
+    },
+
+    init_repo: {
+      main: {
+        dest: 'tmp/repo'
+      }
+    },
+
+    copy: {
+      first: {
+        expand: true,
+        cwd: 'test/fixtures/first',
+        src: '**/**',
+        dest: 'tmp/src/'
+      },
+      second: {
+        expand: true,
+        cwd: 'test/fixtures/second',
+        src: '**/**',
+        dest: 'tmp/src/'
+      },
+    },
+
+    // Configuration to be run (and then tested).
+    git_deploy: {
+      default_options: {
+        options: {
+          url: '../repo'
+        },
+        src: 'tmp/src'
+      }
+    },
+
+    // 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-copy');
+  grunt.loadNpmTasks('grunt-contrib-nodeunit');
+
+  // 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', 'init_repo', 'copy:first', 'git_deploy', 'copy:second', 'git_deploy', 'nodeunit']);
+
+  // By default, run all tests.
+  grunt.registerTask('default', ['test']);
+
+};
Index: /Dev/trunk/node_modules/grunt-git-deploy/LICENSE-MIT
===================================================================
--- /Dev/trunk/node_modules/grunt-git-deploy/LICENSE-MIT	(revision 516)
+++ /Dev/trunk/node_modules/grunt-git-deploy/LICENSE-MIT	(revision 516)
@@ -0,0 +1,22 @@
+Copyright (c) 2013 Sorin Iclanzan
+
+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.
Index: /Dev/trunk/node_modules/grunt-git-deploy/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-git-deploy/README.md	(revision 516)
+++ /Dev/trunk/node_modules/grunt-git-deploy/README.md	(revision 516)
@@ -0,0 +1,60 @@
+# grunt-git-deploy
+
+> Deploy files to any branch of any remote git repository.
+
+## Getting Started
+This plugin requires Grunt `~0.4.1`
+
+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-git-deploy --save-dev
+```
+
+Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:
+
+```js
+grunt.loadNpmTasks('grunt-git-deploy');
+```
+
+## The "git_deploy" task
+
+### Overview
+The way this task works is it creates an empty git repository in the `src` directory you specify, creates an orphan branch and commits all files from that directory to it. Then it pushes the branch to the configured remote repository. **Be careful as this destroys the history of the remote branch.**
+
+In your project's Gruntfile, add a section named `git_deploy` to the data object passed into `grunt.initConfig()`.
+
+```js
+grunt.initConfig({
+  git_deploy: {
+    your_target: {
+      options: {
+        url: 'git@github.com:example/repo.git'
+      },
+      src: 'directory/to/deploy'
+    },
+  },
+})
+```
+
+### Options
+
+#### options.url
+Type: `String`
+
+The URL to a remote git repository. This option is required.
+
+#### options.branch
+Type: `String`
+Default value: `'gh-pages'`
+
+The branch to push to.
+
+#### options.message
+Type: `String`
+Default value: `'autocommit'`
+
+Commit message.
+
+## Contributing
+If you can think of a way to unit test this plugin please take a shot at it.
Index: /Dev/trunk/node_modules/grunt-git-deploy/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-git-deploy/package.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-git-deploy/package.json	(revision 516)
@@ -0,0 +1,54 @@
+{
+  "name": "grunt-git-deploy",
+  "description": "Deploy files to any branch of any remote git repository.",
+  "version": "0.1.1",
+  "homepage": "https://github.com/iclanzan/grunt-git-deploy",
+  "author": {
+    "name": "Sorin Iclanzan",
+    "email": "sorin@iclanzan.com",
+    "url": "http://songpane.com/"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/iclanzan/grunt-git-deploy.git"
+  },
+  "bugs": {
+    "url": "https://github.com/iclanzan/grunt-git-deploy/issues"
+  },
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "https://github.com/iclanzan/grunt-git-deploy/blob/master/LICENSE-MIT"
+    }
+  ],
+  "main": "Gruntfile.js",
+  "engines": {
+    "node": ">= 0.8.0"
+  },
+  "scripts": {
+    "test": "grunt test"
+  },
+  "devDependencies": {
+    "grunt-contrib-clean": "~0.4.0",
+    "grunt-contrib-copy": "~0.4.1",
+    "grunt-contrib-nodeunit": "~0.1.2",
+    "grunt": "~0.4.1"
+  },
+  "peerDependencies": {
+    "grunt": "~0.4.1"
+  },
+  "keywords": [
+    "gruntplugin",
+    "git",
+    "deploy",
+    "push"
+  ],
+  "readme": "# grunt-git-deploy\n\n> Deploy files to any branch of any remote git repository.\n\n## Getting Started\nThis plugin requires Grunt `~0.4.1`\n\nIf 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:\n\n```shell\nnpm install grunt-git-deploy --save-dev\n```\n\nOnce the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:\n\n```js\ngrunt.loadNpmTasks('grunt-git-deploy');\n```\n\n## The \"git_deploy\" task\n\n### Overview\nThe way this task works is it creates an empty git repository in the `src` directory you specify, creates an orphan branch and commits all files from that directory to it. Then it pushes the branch to the configured remote repository. **Be careful as this destroys the history of the remote branch.**\n\nIn your project's Gruntfile, add a section named `git_deploy` to the data object passed into `grunt.initConfig()`.\n\n```js\ngrunt.initConfig({\n  git_deploy: {\n    your_target: {\n      options: {\n        url: 'git@github.com:example/repo.git'\n      },\n      src: 'directory/to/deploy'\n    },\n  },\n})\n```\n\n### Options\n\n#### options.url\nType: `String`\n\nThe URL to a remote git repository. This option is required.\n\n#### options.branch\nType: `String`\nDefault value: `'gh-pages'`\n\nThe branch to push to.\n\n#### options.message\nType: `String`\nDefault value: `'autocommit'`\n\nCommit message.\n\n## Contributing\nIf you can think of a way to unit test this plugin please take a shot at it.\n",
+  "readmeFilename": "README.md",
+  "_id": "grunt-git-deploy@0.1.1",
+  "dist": {
+    "shasum": "805634de159e88cec8e34ffc4f8b8ebc1246f654"
+  },
+  "_from": "grunt-git-deploy@",
+  "_resolved": "https://registry.npmjs.org/grunt-git-deploy/-/grunt-git-deploy-0.1.1.tgz"
+}
Index: /Dev/trunk/node_modules/grunt-git-deploy/tasks/git_deploy.js
===================================================================
--- /Dev/trunk/node_modules/grunt-git-deploy/tasks/git_deploy.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-git-deploy/tasks/git_deploy.js	(revision 516)
@@ -0,0 +1,61 @@
+/*
+ * grunt-git-deploy
+ * https://github.com/iclanzan/grunt-git-deploy
+ *
+ * Copyright (c) 2013 Sorin Iclanzan
+ * Licensed under the MIT license.
+ */
+
+'use strict';
+
+var path = require("path");
+
+module.exports = function(grunt) {
+  var file = grunt.file;
+  var spawn = grunt.util.spawn;
+
+  grunt.registerMultiTask('git_deploy', 'Push files to a git remote.', function() {
+    // Merge task options with these defaults.
+    var options = this.options({
+      message: 'autocommit',
+      branch: 'gh-pages'
+    });
+
+    if (!options.url) {
+      grunt.fail.warn('The URL to a remote git repository is required.');
+      return false;
+    }
+
+    var src = this.filesSrc[0];
+
+    if (!file.isDir(src)) {
+      grunt.fail.warn('A source directory is needed.');
+      return false;
+    }
+
+    function git(args) {
+      return function(cb) {
+        grunt.log.writeln('Running ' + args.join(' ').green);
+        spawn({
+          cmd: 'git',
+          args: args,
+          opts: {cwd: src}
+        }, cb);
+      };
+    }
+
+    grunt.file.delete(path.join(src, '.git'));
+
+    var done = this.async();
+
+    grunt.util.async.series([
+      git(['init']),
+      git(['checkout', '--orphan', options.branch]),
+      git(['add', '--all']),
+      git(['commit', '--message="' + options.message + '"']),
+      git(['push', '--prune', '--force', '--quiet', options.url, options.branch])
+    ], done);
+
+  });
+};
+
Index: /Dev/trunk/node_modules/grunt-git-deploy/test/fixtures/first/123
===================================================================
--- /Dev/trunk/node_modules/grunt-git-deploy/test/fixtures/first/123	(revision 516)
+++ /Dev/trunk/node_modules/grunt-git-deploy/test/fixtures/first/123	(revision 516)
@@ -0,0 +1,1 @@
+1 2 3
Index: /Dev/trunk/node_modules/grunt-git-deploy/test/fixtures/first/testing
===================================================================
--- /Dev/trunk/node_modules/grunt-git-deploy/test/fixtures/first/testing	(revision 516)
+++ /Dev/trunk/node_modules/grunt-git-deploy/test/fixtures/first/testing	(revision 516)
@@ -0,0 +1,1 @@
+Testing
Index: /Dev/trunk/node_modules/grunt-git-deploy/test/fixtures/second/123
===================================================================
--- /Dev/trunk/node_modules/grunt-git-deploy/test/fixtures/second/123	(revision 516)
+++ /Dev/trunk/node_modules/grunt-git-deploy/test/fixtures/second/123	(revision 516)
@@ -0,0 +1,1 @@
+1 2 3
Index: /Dev/trunk/node_modules/grunt-git-deploy/test/fixtures/second/new
===================================================================
--- /Dev/trunk/node_modules/grunt-git-deploy/test/fixtures/second/new	(revision 516)
+++ /Dev/trunk/node_modules/grunt-git-deploy/test/fixtures/second/new	(revision 516)
@@ -0,0 +1,1 @@
+Testing
Index: /Dev/trunk/node_modules/grunt-git-deploy/test/fixtures/second/testing
===================================================================
--- /Dev/trunk/node_modules/grunt-git-deploy/test/fixtures/second/testing	(revision 516)
+++ /Dev/trunk/node_modules/grunt-git-deploy/test/fixtures/second/testing	(revision 516)
@@ -0,0 +1,1 @@
+Testing
Index: /Dev/trunk/node_modules/grunt-git-deploy/test/git_deploy_test.js
===================================================================
--- /Dev/trunk/node_modules/grunt-git-deploy/test/git_deploy_test.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-git-deploy/test/git_deploy_test.js	(revision 516)
@@ -0,0 +1,44 @@
+'use strict';
+
+var grunt = require('grunt');
+var path = require('path');
+
+/*
+  ======== A Handy Little Nodeunit Reference ========
+  https://github.com/caolan/nodeunit
+
+  Test methods:
+    test.expect(numAssertions)
+    test.done()
+  Test assertions:
+    test.ok(value, [message])
+    test.equal(actual, expected, [message])
+    test.notEqual(actual, expected, [message])
+    test.deepEqual(actual, expected, [message])
+    test.notDeepEqual(actual, expected, [message])
+    test.strictEqual(actual, expected, [message])
+    test.notStrictEqual(actual, expected, [message])
+    test.throws(block, [error], [message])
+    test.doesNotThrow(block, [error], [message])
+    test.ifError(value)
+*/
+
+exports.git_deploy = {
+  setUp: function(done) {
+    grunt.util.spawn({
+      cmd: 'git',
+      args: ['checkout', 'gh-pages'],
+      opts: {cwd: 'tmp/repo'}
+    }, done);
+  },
+  default_options: function(test) {
+    test.expect(3);
+
+    grunt.file.recurse('test/fixtures/second', function(abs, root, subdir, file) {
+      var relativePath = path.join(subdir || '', file);
+      test.ok(grunt.file.exists(path.join('tmp/repo', relativePath)), 'The file â' + relativePath + 'â should have been copied into the repository.');
+    });
+
+    test.done();
+  }
+};
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/commander/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/commander/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/commander/package.json	(revision 516)
@@ -38,8 +38,4 @@
   "homepage": "https://github.com/visionmedia/commander.js",
   "_id": "commander@1.1.1",
-  "_from": "commander@1.1.1",
-  "dist": {
-    "shasum": "3b3219c6eb9dd58595193f8fad0c4347e62a5df7"
-  },
-  "_resolved": "https://registry.npmjs.org/commander/-/commander-1.1.1.tgz"
+  "_from": "commander@1.1.1"
 }
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/csslint/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/csslint/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/csslint/package.json	(revision 516)
@@ -42,8 +42,8 @@
   "homepage": "https://github.com/stubbornella/csslint",
   "_id": "csslint@0.9.10",
-  "_from": "csslint@0.9.10",
   "dist": {
     "shasum": "532edf42f35158c9aaaa90590d97c3de8c9487d4"
   },
+  "_from": "csslint@0.9.10",
   "_resolved": "https://registry.npmjs.org/csslint/-/csslint-0.9.10.tgz"
 }
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/cli/node_modules/glob/glob.js
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/cli/node_modules/glob/glob.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/cli/node_modules/glob/glob.js	(revision 516)
@@ -77,4 +77,5 @@
 }
 
+this._processingEmitQueue = false
 
 glob.Glob = Glob
@@ -99,6 +100,10 @@
   options = options || {}
 
+  this._endEmitted = false
   this.EOF = {}
   this._emitQueue = []
+
+  this.paused = false
+  this._processingEmitQueue = false
 
   this.maxDepth = options.maxDepth || 1000
@@ -217,17 +222,5 @@
   if (this.mark) {
     // at *some* point we statted all of these
-    all = all.map(function (m) {
-      var sc = this.cache[m]
-      if (!sc)
-        return m
-      var isDir = (Array.isArray(sc) || sc === 2)
-      if (isDir && m.slice(-1) !== "/") {
-        return m + "/"
-      }
-      if (!isDir && m.slice(-1) === "/") {
-        return m.replace(/\/+$/, "")
-      }
-      return m
-    }, this)
+    all = all.map(this._mark, this)
   }
 
@@ -246,4 +239,25 @@
 function alphasort (a, b) {
   return a > b ? 1 : a < b ? -1 : 0
+}
+
+Glob.prototype._mark = function (p) {
+  var c = this.cache[p]
+  var m = p
+  if (c) {
+    var isDir = c === 2 || Array.isArray(c)
+    var slash = p.slice(-1) === '/'
+
+    if (isDir && !slash)
+      m += '/'
+    else if (!isDir && slash)
+      m = m.slice(0, -1)
+
+    if (m !== p) {
+      this.statCache[m] = this.statCache[p]
+      this.cache[m] = this.cache[p]
+    }
+  }
+
+  return m
 }
 
@@ -272,32 +286,66 @@
 
 Glob.prototype.emitMatch = function (m) {
-  if (!this.stat || this.statCache[m] || m === this.EOF) {
-    this._emitQueue.push(m)
-    this._processEmitQueue()
-  } else {
-    this._stat(m, function(exists, isDir) {
-      if (exists) {
-        this._emitQueue.push(m)
-        this._processEmitQueue()
-      }
-    })
-  }
+  this.log('emitMatch', m)
+  this._emitQueue.push(m)
+  this._processEmitQueue()
 }
 
 Glob.prototype._processEmitQueue = function (m) {
+  this.log("pEQ paused=%j processing=%j m=%j", this.paused,
+           this._processingEmitQueue, m)
+  var done = false
   while (!this._processingEmitQueue &&
          !this.paused) {
     this._processingEmitQueue = true
     var m = this._emitQueue.shift()
+    this.log(">processEmitQueue", m === this.EOF ? ":EOF:" : m)
     if (!m) {
+      this.log(">processEmitQueue, falsey m")
       this._processingEmitQueue = false
       break
     }
 
-    this.log('emit!', m === this.EOF ? "end" : "match")
-
-    this.emit(m === this.EOF ? "end" : "match", m)
-    this._processingEmitQueue = false
-  }
+    if (m === this.EOF || !(this.mark && !this.stat)) {
+      this.log("peq: unmarked, or eof")
+      next.call(this, 0, false)
+    } else if (this.statCache[m]) {
+      var sc = this.statCache[m]
+      var exists
+      if (sc)
+        exists = sc.isDirectory() ? 2 : 1
+      this.log("peq: stat cached")
+      next.call(this, exists, exists === 2)
+    } else {
+      this.log("peq: _stat, then next")
+      this._stat(m, next)
+    }
+
+    function next(exists, isDir) {
+      this.log("next", m, exists, isDir)
+      var ev = m === this.EOF ? "end" : "match"
+
+      // "end" can only happen once.
+      assert(!this._endEmitted)
+      if (ev === "end")
+        this._endEmitted = true
+
+      if (exists) {
+        // Doesn't mean it necessarily doesn't exist, it's possible
+        // we just didn't check because we don't care that much, or
+        // this is EOF anyway.
+        if (isDir && !m.match(/\/$/)) {
+          m = m + "/"
+        } else if (!isDir && m.match(/\/$/)) {
+          m = m.replace(/\/+$/, "")
+        }
+      }
+      this.log("emit", ev, m)
+      this.emit(ev, m)
+      this._processingEmitQueue = false
+      if (done && m !== this.EOF && !this.paused)
+        this._processEmitQueue()
+    }
+  }
+  done = true
 }
 
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/cli/node_modules/glob/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/cli/node_modules/glob/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/cli/node_modules/glob/package.json	(revision 516)
@@ -7,5 +7,5 @@
   "name": "glob",
   "description": "a little globber",
-  "version": "3.2.7",
+  "version": "3.2.9",
   "repository": {
     "type": "git",
@@ -26,5 +26,6 @@
   },
   "scripts": {
-    "test": "tap test/*.js"
+    "test": "tap test/*.js",
+    "test-regen": "TEST_REGEN=1 node test/00-setup.js"
   },
   "license": "BSD",
@@ -35,9 +36,5 @@
   },
   "homepage": "https://github.com/isaacs/node-glob",
-  "_id": "glob@3.2.7",
-  "dist": {
-    "shasum": "cd490a505ff7f2aef7a29ce0e4ce83d995ddbfc6"
-  },
-  "_from": "glob@>= 3.1.4",
-  "_resolved": "https://registry.npmjs.org/glob/-/glob-3.2.7.tgz"
+  "_id": "glob@3.2.9",
+  "_from": "glob@>= 3.1.4"
 }
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-results.json
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-results.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-results.json	(revision 516)
@@ -299,4 +299,5 @@
     "./test/nocase-nomagic.js",
     "./test/pause-resume.js",
+    "./test/readme-issue.js",
     "./test/root-nomount.js",
     "./test/root.js",
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/cli/node_modules/glob/test/mark.js
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/cli/node_modules/glob/test/mark.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/cli/node_modules/glob/test/mark.js	(revision 516)
@@ -2,4 +2,40 @@
 var glob = require('../')
 process.chdir(__dirname)
+
+// expose timing issues
+var lag = 5
+glob.Glob.prototype._stat = function(o) { return function(f, cb) {
+  var args = arguments
+  setTimeout(function() {
+    o.call(this, f, cb)
+  }.bind(this), lag += 5)
+}}(glob.Glob.prototype._stat)
+
+
+test("mark, with **", function (t) {
+  glob("a/*b*/**", {mark: true}, function (er, results) {
+    if (er)
+      throw er
+    var expect =
+      [ 'a/abcdef/',
+        'a/abcdef/g/',
+        'a/abcdef/g/h',
+        'a/abcfed/',
+        'a/abcfed/g/',
+        'a/abcfed/g/h',
+        'a/b/',
+        'a/b/c/',
+        'a/b/c/d',
+        'a/bc/',
+        'a/bc/e/',
+        'a/bc/e/f',
+        'a/cb/',
+        'a/cb/e/',
+        'a/cb/e/f' ]
+
+    t.same(results, expect)
+    t.end()
+  })
+})
 
 test("mark, no / on pattern", function (t) {
@@ -19,4 +55,6 @@
     t.same(results, expect)
     t.end()
+  }).on('match', function(m) {
+    t.similar(m, /\/$/)
   })
 })
@@ -37,4 +75,6 @@
     t.same(results, expect)
     t.end()
+  }).on('match', function(m) {
+    t.similar(m, /[^\/]$/)
   })
 })
@@ -54,4 +94,6 @@
     t.same(results, expect)
     t.end()
+  }).on('match', function(m) {
+    t.similar(m, /\/$/)
   })
 })
@@ -71,4 +113,6 @@
     t.same(results, expect)
     t.end()
+  }).on('match', function(m) {
+    t.similar(m, /\/$/)
   })
 })
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/cli/node_modules/glob/test/readme-issue.js
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/cli/node_modules/glob/test/readme-issue.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/cli/node_modules/glob/test/readme-issue.js	(revision 516)
@@ -0,0 +1,36 @@
+var test = require("tap").test
+var glob = require("../")
+
+var mkdirp = require("mkdirp")
+var fs = require("fs")
+var rimraf = require("rimraf")
+var dir = __dirname + "/package"
+
+test("setup", function (t) {
+  mkdirp.sync(dir)
+  fs.writeFileSync(dir + "/package.json", "{}", "ascii")
+  fs.writeFileSync(dir + "/README", "x", "ascii")
+  t.pass("setup done")
+  t.end()
+})
+
+test("glob", function (t) {
+  var opt = {
+    cwd: dir,
+    nocase: true,
+    mark: true
+  }
+
+  glob("README?(.*)", opt, function (er, files) {
+    if (er)
+      throw er
+    t.same(files, ["README"])
+    t.end()
+  })
+})
+
+test("cleanup", function (t) {
+  rimraf.sync(dir)
+  t.pass("clean")
+  t.end()
+})
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/cli/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/cli/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/cli/package.json	(revision 516)
@@ -50,9 +50,5 @@
   "readmeFilename": "README.md",
   "_id": "cli@0.4.5",
-  "dist": {
-    "shasum": "e4be7ec0a35b5ce30039b58f9382fc4f4b881810"
-  },
   "_from": "cli@0.4.x",
-  "_resolved": "https://registry.npmjs.org/cli/-/cli-0.4.5.tgz",
   "scripts": {}
 }
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/.jscs.json
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/.jscs.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/.jscs.json	(revision 516)
@@ -0,0 +1,119 @@
+{
+    "requireCurlyBraces": [
+        "if",
+        "else",
+        "for",
+        "while",
+        "do",
+        "try",
+        "catch"
+    ],
+    "requireSpaceAfterKeywords": [
+        "if",
+        "else",
+        "for",
+        "while",
+        "do",
+        "switch",
+        "return",
+        "try",
+        "catch"
+    ],
+    "requireParenthesesAroundIIFE": true,
+    "requireSpacesInFunctionExpression": {
+        "beforeOpeningCurlyBrace": true
+    },
+    "requireMultipleVarDecl": true,
+    "disallowEmptyBlocks": true,
+    "disallowSpacesInsideObjectBrackets": true,
+    "disallowSpacesInsideParentheses": true,
+    "requireSpacesInsideObjectBrackets": "all",
+    "disallowDanglingUnderscores": true,
+    "disallowSpaceAfterObjectKeys": true,
+    "requireCommaBeforeLineBreak": true,
+    "requireOperatorBeforeLineBreak": [
+        "?",
+        "+",
+        "-",
+        "/",
+        "*",
+        "=",
+        "==",
+        "===",
+        "!=",
+        "!==",
+        ">",
+        ">=",
+        "<",
+        "<="
+    ],
+    "disallowLeftStickedOperators": [
+        "?",
+        "+",
+        "-",
+        "/",
+        "*",
+        "=",
+        "==",
+        "===",
+        "!=",
+        "!==",
+        ">",
+        ">=",
+        "<",
+        "<="
+    ],
+    "requireRightStickedOperators": ["!"],
+    "disallowRightStickedOperators": [
+        "?",
+        "+",
+        "/",
+        "*",
+        ":",
+        "=",
+        "==",
+        "===",
+        "!=",
+        "!==",
+        ">",
+        ">=",
+        "<",
+        "<="
+    ],
+    "requireLeftStickedOperators": [","],
+    "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
+    "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
+    "requireSpaceBeforeBinaryOperators": [
+        "+",
+        "-",
+        "/",
+        "*",
+        "=",
+        "==",
+        "===",
+        "!=",
+        "!=="
+    ],
+    "requireSpaceAfterBinaryOperators": [
+        "+",
+        "-",
+        "/",
+        "*",
+        "=",
+        "==",
+        "===",
+        "!=",
+        "!=="
+    ],
+    "disallowImplicitTypeConversion": ["numeric", "boolean", "binary", "string"],
+    "requireCamelCaseOrUpperCaseIdentifiers": true,
+    "disallowKeywords": ["with"],
+    "disallowMultipleLineStrings": true,
+    "validateLineBreaks": "LF",
+    "validateQuoteMarks": "'",
+    "disallowMixedSpacesAndTabs": true,
+    "disallowTrailingWhitespace": true,
+    "disallowKeywordsOnNewLine": ["else"],
+    "requireLineFeedAtFileEnd": true,
+    "requireDotNotation": true
+}
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/esprima.js
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/esprima.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/esprima.js	(revision 516)
@@ -243,17 +243,17 @@
 
     function isIdentifierStart(ch) {
-        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)
-            (ch >= 65 && ch <= 90) ||         // A..Z
-            (ch >= 97 && ch <= 122) ||        // a..z
-            (ch === 92) ||                    // \ (backslash)
+        return (ch === 0x24) || (ch === 0x5F) ||  // $ (dollar) and _ (underscore)
+            (ch >= 0x41 && ch <= 0x5A) ||         // A..Z
+            (ch >= 0x61 && ch <= 0x7A) ||         // a..z
+            (ch === 0x5C) ||                      // \ (backslash)
             ((ch >= 0x80) && Regex.NonAsciiIdentifierStart.test(String.fromCharCode(ch)));
     }
 
     function isIdentifierPart(ch) {
-        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)
-            (ch >= 65 && ch <= 90) ||         // A..Z
-            (ch >= 97 && ch <= 122) ||        // a..z
-            (ch >= 48 && ch <= 57) ||         // 0..9
-            (ch === 92) ||                    // \ (backslash)
+        return (ch === 0x24) || (ch === 0x5F) ||  // $ (dollar) and _ (underscore)
+            (ch >= 0x41 && ch <= 0x5A) ||         // A..Z
+            (ch >= 0x61 && ch <= 0x7A) ||         // a..z
+            (ch >= 0x30 && ch <= 0x39) ||         // 0..9
+            (ch === 0x5C) ||                      // \ (backslash)
             ((ch >= 0x80) && Regex.NonAsciiIdentifierPart.test(String.fromCharCode(ch)));
     }
@@ -431,5 +431,5 @@
             ch = source.charCodeAt(index);
             if (isLineTerminator(ch)) {
-                if (ch === 13 && source.charCodeAt(index + 1) === 10) {
+                if (ch === 0x0D && source.charCodeAt(index + 1) === 0x0A) {
                     ++index;
                 }
@@ -440,7 +440,7 @@
                     throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
                 }
-            } else if (ch === 42) {
-                // Block comment ends with '*/' (char #42, char #47).
-                if (source.charCodeAt(index + 1) === 47) {
+            } else if (ch === 0x2A) {
+                // Block comment ends with '*/'.
+                if (source.charCodeAt(index + 1) === 0x2F) {
                     ++index;
                     ++index;
@@ -475,5 +475,5 @@
             } else if (isLineTerminator(ch)) {
                 ++index;
-                if (ch === 13 && source.charCodeAt(index) === 10) {
+                if (ch === 0x0D && source.charCodeAt(index) === 0x0A) {
                     ++index;
                 }
@@ -481,12 +481,12 @@
                 lineStart = index;
                 start = true;
-            } else if (ch === 47) { // 47 is '/'
+            } else if (ch === 0x2F) { // U+002F is '/'
                 ch = source.charCodeAt(index + 1);
-                if (ch === 47) {
+                if (ch === 0x2F) {
                     ++index;
                     ++index;
                     skipSingleLineComment();
                     start = true;
-                } else if (ch === 42) {  // 42 is '*'
+                } else if (ch === 0x2A) {  // U+002A is '*'
                     ++index;
                     ++index;
@@ -495,7 +495,7 @@
                     break;
                 }
-            } else if (start && ch === 45) { // 45 is '-'
-                // 62 is '>'
-                if ((source.charCodeAt(index + 1) === 45) && (source.charCodeAt(index + 2) === 62)) {
+            } else if (start && ch === 0x2D) { // U+002D is '-'
+                // U+003E is '>'
+                if ((source.charCodeAt(index + 1) === 0x2D) && (source.charCodeAt(index + 2) === 0x3E)) {
                     // '-->' is a single-line comment
                     index += 3;
@@ -504,5 +504,5 @@
                     break;
                 }
-            } else if (ch === 60) { // 60 is '<'
+            } else if (ch === 0x3C) { // U+003C is '<'
                 if (source.slice(index + 1, index + 4) === '!--') {
                     ++index; // `<`
@@ -541,7 +541,7 @@
         id = String.fromCharCode(ch);
 
-        // '\u' (char #92, char #117) denotes an escaped character.
-        if (ch === 92) {
-            if (source.charCodeAt(index) !== 117) {
+        // '\u' (U+005C, U+0075) denotes an escaped character.
+        if (ch === 0x5C) {
+            if (source.charCodeAt(index) !== 0x75) {
                 throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
             }
@@ -562,8 +562,8 @@
             id += String.fromCharCode(ch);
 
-            // '\u' (char #92, char #117) denotes an escaped character.
-            if (ch === 92) {
+            // '\u' (U+005C, U+0075) denotes an escaped character.
+            if (ch === 0x5C) {
                 id = id.substr(0, id.length - 1);
-                if (source.charCodeAt(index) !== 117) {
+                if (source.charCodeAt(index) !== 0x75) {
                     throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
                 }
@@ -586,6 +586,6 @@
         while (index < length) {
             ch = source.charCodeAt(index);
-            if (ch === 92) {
-                // Blackslash (char #92) marks Unicode escape sequence.
+            if (ch === 0x5C) {
+                // Blackslash (U+005C) marks Unicode escape sequence.
                 index = start;
                 return getEscapedIdentifier();
@@ -606,6 +606,6 @@
         start = index;
 
-        // Backslash (char #92) starts an escaped character.
-        id = (source.charCodeAt(index) === 92) ? getEscapedIdentifier() : getIdentifier();
+        // Backslash (U+005C) starts an escaped character.
+        id = (source.charCodeAt(index) === 0x5C) ? getEscapedIdentifier() : getIdentifier();
 
         // There is no keyword or literal with only one character.
@@ -647,21 +647,21 @@
 
         // Check for most common single-character punctuators.
-        case 46:   // . dot
-        case 40:   // ( open bracket
-        case 41:   // ) close bracket
-        case 59:   // ; semicolon
-        case 44:   // , comma
-        case 123:  // { open curly brace
-        case 125:  // } close curly brace
-        case 91:   // [
-        case 93:   // ]
-        case 58:   // :
-        case 63:   // ?
-        case 126:  // ~
+        case 0x2E:  // . dot
+        case 0x28:  // ( open bracket
+        case 0x29:  // ) close bracket
+        case 0x3B:  // ; semicolon
+        case 0x2C:  // , comma
+        case 0x7B:  // { open curly brace
+        case 0x7D:  // } close curly brace
+        case 0x5B:  // [
+        case 0x5D:  // ]
+        case 0x3A:  // :
+        case 0x3F:  // ?
+        case 0x7E:  // ~
             ++index;
             if (extra.tokenize) {
-                if (code === 40) {
+                if (code === 0x28) {
                     extra.openParenToken = extra.tokens.length;
-                } else if (code === 123) {
+                } else if (code === 0x7B) {
                     extra.openCurlyToken = extra.tokens.length;
                 }
@@ -678,17 +678,17 @@
             code2 = source.charCodeAt(index + 1);
 
-            // '=' (char #61) marks an assignment or comparison operator.
-            if (code2 === 61) {
+            // '=' (U+003D) marks an assignment or comparison operator.
+            if (code2 === 0x3D) {
                 switch (code) {
-                case 37:  // %
-                case 38:  // &
-                case 42:  // *:
-                case 43:  // +
-                case 45:  // -
-                case 47:  // /
-                case 60:  // <
-                case 62:  // >
-                case 94:  // ^
-                case 124: // |
+                case 0x25:  // %
+                case 0x26:  // &
+                case 0x2A:  // *:
+                case 0x2B:  // +
+                case 0x2D:  // -
+                case 0x2F:  // /
+                case 0x3C:  // <
+                case 0x3E:  // >
+                case 0x5E:  // ^
+                case 0x7C:  // |
                     index += 2;
                     return {
@@ -700,10 +700,10 @@
                     };
 
-                case 33: // !
-                case 61: // =
+                case 0x21: // !
+                case 0x3D: // =
                     index += 2;
 
                     // !== and ===
-                    if (source.charCodeAt(index) === 61) {
+                    if (source.charCodeAt(index) === 0x3D) {
                         ++index;
                     }
@@ -1262,10 +1262,10 @@
 
         // Very common: ( and ) and ;
-        if (ch === 40 || ch === 41 || ch === 58) {
+        if (ch === 0x28 || ch === 0x29 || ch === 0x3A) {
             return scanPunctuator();
         }
 
-        // String literal starts with single quote (#39) or double quote (#34).
-        if (ch === 39 || ch === 34) {
+        // String literal starts with single quote (U+0027) or double quote (U+0022).
+        if (ch === 0x27 || ch === 0x22) {
             return scanStringLiteral();
         }
@@ -1275,7 +1275,7 @@
         }
 
-        // Dot (.) char #46 can also start a floating-point number, hence the need
+        // Dot (.) U+002E can also start a floating-point number, hence the need
         // to check the next character.
-        if (ch === 46) {
+        if (ch === 0x2E) {
             if (isDecimalDigit(source.charCodeAt(index + 1))) {
                 return scanNumericLiteral();
@@ -1288,6 +1288,6 @@
         }
 
-        // Slash (/) char #47 can also start a regex.
-        if (extra.tokenize && ch === 47) {
+        // Slash (/) U+002F can also start a regex.
+        if (extra.tokenize && ch === 0x2F) {
             return advanceSlash();
         }
@@ -1935,6 +1935,6 @@
         var line;
 
-        // Catch the very common case first: immediately a semicolon (char #59).
-        if (source.charCodeAt(index) === 59) {
+        // Catch the very common case first: immediately a semicolon (U+003B).
+        if (source.charCodeAt(index) === 0x3B) {
             lex();
             return;
@@ -2893,5 +2893,5 @@
 
         // Optimize the most common form: 'continue;'.
-        if (source.charCodeAt(index) === 59) {
+        if (source.charCodeAt(index) === 0x3B) {
             lex();
 
@@ -2936,6 +2936,6 @@
         expectKeyword('break');
 
-        // Catch the very common case first: immediately a semicolon (char #59).
-        if (source.charCodeAt(index) === 59) {
+        // Catch the very common case first: immediately a semicolon (U+003B).
+        if (source.charCodeAt(index) === 0x3B) {
             lex();
 
@@ -2985,5 +2985,5 @@
 
         // 'return' followed by a space and an identifier is very common.
-        if (source.charCodeAt(index) === 32) {
+        if (source.charCodeAt(index) === 0x20) {
             if (isIdentifierStart(source.charCodeAt(index + 1))) {
                 argument = parseExpression();
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/package.json	(revision 516)
@@ -23,4 +23,7 @@
     "url": "http://github.com/ariya/esprima.git"
   },
+  "bugs": {
+    "url": "http://issues.esprima.org"
+  },
   "licenses": [
     {
@@ -31,9 +34,12 @@
   "devDependencies": {
     "jslint": "~0.1.9",
-    "eslint": "~0.1.0",
+    "eslint": "~0.3.0",
+    "jscs": "~1.2.4",
     "istanbul": "~0.1.27",
     "complexity-report": "~0.6.1",
     "regenerate": "~0.5.4",
-    "unicode-6.3.0": "~0.1.0"
+    "unicode-6.3.0": "~0.1.0",
+    "json-diff": "~0.3.1",
+    "optimist": "~0.6.0"
   },
   "keywords": [
@@ -47,5 +53,9 @@
     "generate-regex": "node tools/generate-identifier-regex.js",
     "test": "npm run-script lint && node test/run.js && npm run-script coverage && npm run-script complexity",
-    "lint": "node tools/check-version.js && node_modules/eslint/bin/eslint.js esprima.js && node_modules/jslint/bin/jslint.js esprima.js",
+    "lint": "npm run-script check-version && npm run-script eslint && npm run-script jscs && npm run-script jslint",
+    "check-version": "node tools/check-version.js",
+    "eslint": "node node_modules/eslint/bin/eslint.js esprima.js",
+    "jscs": "node node_modules/.bin/jscs esprima.js",
+    "jslint": "node node_modules/jslint/bin/jslint.js esprima.js",
     "coverage": "npm run-script analyze-coverage && npm run-script check-coverage",
     "analyze-coverage": "node node_modules/istanbul/lib/cli.js cover test/runner.js",
@@ -59,10 +69,7 @@
   "readme": "**Esprima** ([esprima.org](http://esprima.org), BSD license) is a high performance,\nstandard-compliant [ECMAScript](http://www.ecma-international.org/publications/standards/Ecma-262.htm)\nparser written in ECMAScript (also popularly known as\n[JavaScript](http://en.wikipedia.org/wiki/JavaScript>JavaScript)).\nEsprima is created and maintained by [Ariya Hidayat](http://twitter.com/ariyahidayat),\nwith the help of [many contributors](https://github.com/ariya/esprima/contributors).\n\n### Features\n\n- Full support for ECMAScript 5.1 ([ECMA-262](http://www.ecma-international.org/publications/standards/Ecma-262.htm))\n- Sensible [syntax tree format](http://esprima.org/doc/index.html#ast) compatible with Mozilla\n[Parser AST](https://developer.mozilla.org/en/SpiderMonkey/Parser_API)\n- Optional tracking of syntax node location (index-based and line-column)\n- Heavily tested (> 600 [unit tests](http://esprima.org/test/) with solid statement and branch coverage)\n- Experimental support for ES6/Harmony (module, class, destructuring, ...)\n\nEsprima serves as a **building block** for some JavaScript\nlanguage tools, from [code instrumentation](http://esprima.org/demo/functiontrace.html)\nto [editor autocompletion](http://esprima.org/demo/autocomplete.html).\n\nEsprima runs on many popular web browsers, as well as other ECMAScript platforms such as\n[Rhino](http://www.mozilla.org/rhino) and [Node.js](https://npmjs.org/package/esprima).\n\nFor more information, check the web site [esprima.org](http://esprima.org).\n",
   "readmeFilename": "README.md",
-  "bugs": {
-    "url": "https://github.com/ariya/esprima/issues"
-  },
   "_id": "esprima@1.1.0-dev",
   "dist": {
-    "shasum": "ae2e2124f41c4b23d858b820ebc75fccb1982219"
+    "shasum": "b2624b515cd299ba33f1f2499fbf40b742ead616"
   },
   "_from": "https://github.com/ariya/esprima/tarball/master",
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/test/benchmarks.js
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/test/benchmarks.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/test/benchmarks.js	(revision 516)
@@ -33,16 +33,16 @@
 fullFixture = [
     'Underscore 1.5.2',
-    'Backbone 1.0.0',
+    'Backbone 1.1.0',
     'MooTools 1.4.5',
     'jQuery 1.9.1',
     'YUI 3.12.0',
     'jQuery.Mobile 1.3.2',
-    'Angular 1.0.8'
+    'Angular 1.2.5'
 ];
 
 quickFixture = [
-    'Backbone 1.0.0',
+    'Backbone 1.1.0',
     'jQuery 1.9.1',
-    'Angular 1.0.6'
+    'Angular 1.2.5'
 ];
 
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/test/compare.js
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/test/compare.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/test/compare.js	(revision 516)
@@ -40,5 +40,5 @@
 fixtureList = [
     'Underscore 1.5.2',
-    'Backbone 1.0.0',
+    'Backbone 1.1.0',
     'jQuery 1.9.1'
 ];
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/test/parselibs.js
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/test/parselibs.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/test/parselibs.js	(revision 516)
@@ -30,10 +30,10 @@
 fixture = [
     'Underscore 1.5.2',
-    'Backbone 1.0.0',
+    'Backbone 1.1.0',
     'MooTools 1.4.5',
     'jQuery 1.9.1',
     'YUI 3.12.0',
     'jQuery.Mobile 1.3.2',
-    'Angular 1.0.8'
+    'Angular 1.2.5'
 ];
 
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/test/runner.js
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/test/runner.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/esprima/test/runner.js	(revision 516)
@@ -418,4 +418,5 @@
             vm = require('vm'),
             fs = require('fs'),
+            diff = require('json-diff').diffString,
             total = 0,
             failures = [],
@@ -445,7 +446,17 @@
             console.error(header);
             failures.forEach(function (failure) {
-                console.error(failure.source + ': Expected\n    ' +
-                    failure.expected.split('\n').join('\n    ') +
-                    '\nto match\n    ' + failure.actual);
+                try {
+                    var expectedObject = JSON.parse(failure.expected);
+                    var actualObject = JSON.parse(failure.actual);
+
+                    console.error(failure.source + ': Expected\n    ' +
+                        failure.expected.split('\n').join('\n    ') +
+                        '\nto match\n    ' + failure.actual + '\nDiff:\n' +
+                        diff(expectedObject, actualObject));
+                } catch (ex) {
+                    console.error(failure.source + ': Expected\n    ' +
+                        failure.expected.split('\n').join('\n    ') +
+                        '\nto match\n    ' + failure.actual);
+                }
             });
         } else {
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/.npmignore
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/.npmignore	(revision 516)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/.npmignore	(revision 516)
@@ -0,0 +1,1 @@
+node_modules
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/README.md	(revision 516)
@@ -20,4 +20,5 @@
 minimatch("bar.foo", "*.foo") // true!
 minimatch("bar.foo", "*.bar") // false!
+minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy!
 ```
 
@@ -36,42 +37,4 @@
 * `man 3 fnmatch`
 * `man 5 gitignore`
-
-### Comparisons to other fnmatch/glob implementations
-
-While strict compliance with the existing standards is a worthwhile
-goal, some discrepancies exist between minimatch and other
-implementations, and are intentional.
-
-If the pattern starts with a `!` character, then it is negated.  Set the
-`nonegate` flag to suppress this behavior, and treat leading `!`
-characters normally.  This is perhaps relevant if you wish to start the
-pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
-characters at the start of a pattern will negate the pattern multiple
-times.
-
-If a pattern starts with `#`, then it is treated as a comment, and
-will not match anything.  Use `\#` to match a literal `#` at the
-start of a line, or set the `nocomment` flag to suppress this behavior.
-
-The double-star character `**` is supported by default, unless the
-`noglobstar` flag is set.  This is supported in the manner of bsdglob
-and bash 4.1, where `**` only has special significance if it is the only
-thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
-`a/**b` will not.  **Note that this is different from the way that `**` is
-handled by ruby's `Dir` class.**
-
-If an escaped pattern has no matches, and the `nonull` flag is set,
-then minimatch.match returns the pattern as-provided, rather than
-interpreting the character escapes.  For example,
-`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
-`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
-that it does not resolve escaped pattern characters.
-
-If brace expansion is not disabled, then it is performed before any
-other interpretation of the glob pattern.  Thus, a pattern like
-`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
-**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
-checked for validity.  Since those two are valid, matching proceeds.
-
 
 ## Minimatch Class
@@ -217,2 +180,39 @@
 Returns from negate expressions the same as if they were not negated.
 (Ie, true on a hit, false on a miss.)
+
+
+## Comparisons to other fnmatch/glob implementations
+
+While strict compliance with the existing standards is a worthwhile
+goal, some discrepancies exist between minimatch and other
+implementations, and are intentional.
+
+If the pattern starts with a `!` character, then it is negated.  Set the
+`nonegate` flag to suppress this behavior, and treat leading `!`
+characters normally.  This is perhaps relevant if you wish to start the
+pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
+characters at the start of a pattern will negate the pattern multiple
+times.
+
+If a pattern starts with `#`, then it is treated as a comment, and
+will not match anything.  Use `\#` to match a literal `#` at the
+start of a line, or set the `nocomment` flag to suppress this behavior.
+
+The double-star character `**` is supported by default, unless the
+`noglobstar` flag is set.  This is supported in the manner of bsdglob
+and bash 4.1, where `**` only has special significance if it is the only
+thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
+`a/**b` will not.
+
+If an escaped pattern has no matches, and the `nonull` flag is set,
+then minimatch.match returns the pattern as-provided, rather than
+interpreting the character escapes.  For example,
+`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
+`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
+that it does not resolve escaped pattern characters.
+
+If brace expansion is not disabled, then it is performed before any
+other interpretation of the glob pattern.  Thus, a pattern like
+`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
+**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
+checked for validity.  Since those two are valid, matching proceeds.
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/minimatch.js
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/minimatch.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/minimatch.js	(revision 516)
@@ -69,15 +69,4 @@
 var slashSplit = /\/+/
 
-minimatch.monkeyPatch = monkeyPatch
-function monkeyPatch () {
-  var desc = Object.getOwnPropertyDescriptor(String.prototype, "match")
-  var orig = desc.value
-  desc.value = function (p) {
-    if (p instanceof Minimatch) return p.match(this)
-    return orig.call(this, p)
-  }
-  Object.defineProperty(String.prototype, desc)
-}
-
 minimatch.filter = filter
 function filter (pattern, options) {
@@ -179,4 +168,6 @@
 }
 
+Minimatch.prototype.debug = function() {}
+
 Minimatch.prototype.make = make
 function make () {
@@ -203,5 +194,7 @@
   var set = this.globSet = this.braceExpand()
 
-  if (options.debug) console.error(this.pattern, set)
+  if (options.debug) this.debug = console.error
+
+  this.debug(this.pattern, set)
 
   // step 3: now we have a set, so turn each one into a series of path-portion
@@ -214,5 +207,5 @@
   })
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   // glob --> regexps
@@ -221,5 +214,5 @@
   }, this)
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   // filter out everything that didn't compile properly.
@@ -228,5 +221,5 @@
   })
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   this.set = set
@@ -303,9 +296,9 @@
   // and then prepend it to everything we find.
   if (pattern.charAt(0) !== "{") {
-    // console.error(pattern)
+    this.debug(pattern)
     var prefix = null
     for (var i = 0, l = pattern.length; i < l; i ++) {
       var c = pattern.charAt(i)
-      // console.error(i, c)
+      this.debug(i, c)
       if (c === "\\") {
         escaping = !escaping
@@ -318,9 +311,9 @@
     // actually no sets, all { were escaped.
     if (prefix === null) {
-      // console.error("no sets")
+      this.debug("no sets")
       return [pattern]
     }
 
-    var tail = braceExpand(pattern.substr(i), options)
+   var tail = braceExpand.call(this, pattern.substr(i), options)
     return tail.map(function (t) {
       return prefix + t
@@ -337,6 +330,6 @@
   var numset = pattern.match(/^\{(-?[0-9]+)\.\.(-?[0-9]+)\}/)
   if (numset) {
-    // console.error("numset", numset[1], numset[2])
-    var suf = braceExpand(pattern.substr(numset[0].length), options)
+    this.debug("numset", numset[1], numset[2])
+    var suf = braceExpand.call(this, pattern.substr(numset[0].length), options)
       , start = +numset[1]
       , end = +numset[2]
@@ -370,8 +363,8 @@
   }
 
-  // console.error("Entering for")
+  this.debug("Entering for")
   FOR: for (i = 1, l = pattern.length; i < l; i ++) {
     var c = pattern.charAt(i)
-    // console.error("", i, c)
+    this.debug("", i, c)
 
     if (escaping) {
@@ -421,20 +414,20 @@
   // and need to escape the leading brace
   if (depth !== 0) {
-    // console.error("didn't close", pattern)
-    return braceExpand("\\" + pattern, options)
+    this.debug("didn't close", pattern)
+    return braceExpand.call(this, "\\" + pattern, options)
   }
 
   // x{y,z} -> ["xy", "xz"]
-  // console.error("set", set)
-  // console.error("suffix", pattern.substr(i))
-  var suf = braceExpand(pattern.substr(i), options)
+  this.debug("set", set)
+  this.debug("suffix", pattern.substr(i))
+  var suf = braceExpand.call(this, pattern.substr(i), options)
   // ["b", "c{d,e}","{f,g}h"] ->
   //   [["b"], ["cd", "ce"], ["fh", "gh"]]
   var addBraces = set.length === 1
-  // console.error("set pre-expanded", set)
+  this.debug("set pre-expanded", set)
   set = set.map(function (p) {
-    return braceExpand(p, options)
-  })
-  // console.error("set expanded", set)
+    return braceExpand.call(this, p, options)
+  }, this)
+  this.debug("set expanded", set)
 
 
@@ -497,4 +490,5 @@
       : options.dot ? "(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))"
       : "(?!\\.)"
+    , self = this
 
   function clearStateChar () {
@@ -515,4 +509,5 @@
           break
       }
+      self.debug('clearStateChar %j %j', stateChar, re)
       stateChar = false
     }
@@ -523,7 +518,5 @@
       ; i ++ ) {
 
-    if (options.debug) {
-      console.error("%s\t%s %s %j", pattern, i, re, c)
-    }
+    this.debug("%s\t%s %s %j", pattern, i, re, c)
 
     // skip over any that are escaped.
@@ -552,11 +545,10 @@
       case "@":
       case "!":
-        if (options.debug) {
-          console.error("%s\t%s %s %j <-- stateChar", pattern, i, re, c)
-        }
+        this.debug("%s\t%s %s %j <-- stateChar", pattern, i, re, c)
 
         // all of those are literals inside a class, except that
         // the glob [!a] means [^a] in regexp
         if (inClass) {
+          this.debug('  in class')
           if (c === "!" && i === classStart + 1) c = "^"
           re += c
@@ -567,4 +559,5 @@
         // that there was something like ** or +? in there.
         // Handle the stateChar, then proceed with this one.
+        self.debug('call clearStateChar %j', stateChar)
         clearStateChar()
         stateChar = c
@@ -592,4 +585,5 @@
         // negation is (?:(?!js)[^/]*)
         re += stateChar === "!" ? "(?:(?!" : "(?:"
+        this.debug('plType %j %j', stateChar, re)
         stateChar = false
         continue
@@ -601,4 +595,5 @@
         }
 
+        clearStateChar()
         hasMagic = true
         re += ")"
@@ -624,4 +619,5 @@
         }
 
+        clearStateChar()
         re += "|"
         continue
@@ -716,5 +712,5 @@
     })
 
-    // console.error("tail=%j\n   %s", tail, tail)
+    this.debug("tail=%j\n   %s", tail, tail)
     var t = pl.type === "*" ? star
           : pl.type === "?" ? qmark
@@ -830,5 +826,5 @@
 Minimatch.prototype.match = match
 function match (f, partial) {
-  // console.error("match", f, this.pattern)
+  this.debug("match", f, this.pattern)
   // short-circuit in the case of busted things.
   // comments, etc.
@@ -848,7 +844,5 @@
   // treat the test path as a set of pathparts.
   f = f.split(slashSplit)
-  if (options.debug) {
-    console.error(this.pattern, "split", f)
-  }
+  this.debug(this.pattern, "split", f)
 
   // just ONE of the pattern sets in this.set needs to match
@@ -858,9 +852,14 @@
 
   var set = this.set
-  // console.error(this.pattern, "set", set)
+  this.debug(this.pattern, "set", set)
+
+  var splitFile = path.basename(f.join("/")).split("/")
 
   for (var i = 0, l = set.length; i < l; i ++) {
-    var pattern = set[i]
-    var hit = this.matchOne(f, pattern, partial)
+    var pattern = set[i], file = f
+    if (options.matchBase && pattern.length === 1) {
+      file = splitFile
+    }
+    var hit = this.matchOne(file, pattern, partial)
     if (hit) {
       if (options.flipNegate) return true
@@ -883,18 +882,10 @@
   var options = this.options
 
-  if (options.debug) {
-    console.error("matchOne",
-                  { "this": this
-                  , file: file
-                  , pattern: pattern })
-  }
-
-  if (options.matchBase && pattern.length === 1) {
-    file = path.basename(file.join("/")).split("/")
-  }
-
-  if (options.debug) {
-    console.error("matchOne", file.length, pattern.length)
-  }
+  this.debug("matchOne",
+              { "this": this
+              , file: file
+              , pattern: pattern })
+
+  this.debug("matchOne", file.length, pattern.length)
 
   for ( var fi = 0
@@ -905,13 +896,9 @@
       ; fi ++, pi ++ ) {
 
-    if (options.debug) {
-      console.error("matchOne loop")
-    }
+    this.debug("matchOne loop")
     var p = pattern[pi]
       , f = file[fi]
 
-    if (options.debug) {
-      console.error(pattern, p, f)
-    }
+    this.debug(pattern, p, f)
 
     // should be impossible.
@@ -920,6 +907,5 @@
 
     if (p === GLOBSTAR) {
-      if (options.debug)
-        console.error('GLOBSTAR', [pattern, p, f])
+      this.debug('GLOBSTAR', [pattern, p, f])
 
       // "**"
@@ -948,6 +934,5 @@
         , pr = pi + 1
       if (pr === pl) {
-        if (options.debug)
-          console.error('** at the end')
+        this.debug('** at the end')
         // a ** at the end will just swallow the rest.
         // We have found a match.
@@ -967,13 +952,10 @@
         var swallowee = file[fr]
 
-        if (options.debug) {
-          console.error('\nglobstar while',
-                        file, fr, pattern, pr, swallowee)
-        }
+        this.debug('\nglobstar while',
+                    file, fr, pattern, pr, swallowee)
 
         // XXX remove this slice.  Just pass the start index.
         if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
-          if (options.debug)
-            console.error('globstar found match!', fr, fl, swallowee)
+          this.debug('globstar found match!', fr, fl, swallowee)
           // found a match.
           return true
@@ -983,12 +965,10 @@
           if (swallowee === "." || swallowee === ".." ||
               (!options.dot && swallowee.charAt(0) === ".")) {
-            if (options.debug)
-              console.error("dot detected!", file, fr, pattern, pr)
+            this.debug("dot detected!", file, fr, pattern, pr)
             break WHILE
           }
 
           // ** swallows a segment, and continue.
-          if (options.debug)
-            console.error('globstar swallow a segment, and continue')
+          this.debug('globstar swallow a segment, and continue')
           fr ++
         }
@@ -999,5 +979,5 @@
       if (partial) {
         // ran out of file
-        // console.error("\n>>> no match, partial?", file, fr, pattern, pr)
+        this.debug("\n>>> no match, partial?", file, fr, pattern, pr)
         if (fr === fl) return true
       }
@@ -1015,12 +995,8 @@
         hit = f === p
       }
-      if (options.debug) {
-        console.error("string match", p, f, hit)
-      }
+      this.debug("string match", p, f, hit)
     } else {
       hit = f.match(p)
-      if (options.debug) {
-        console.error("pattern match", p, f, hit)
-      }
+      this.debug("pattern match", p, f, hit)
     }
 
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/package.json	(revision 516)
@@ -30,8 +30,4 @@
   "homepage": "https://github.com/isaacs/node-lru-cache",
   "_id": "lru-cache@2.5.0",
-  "dist": {
-    "shasum": "be07d09e5b05f10b83d0cf01d4891a7729288c69"
-  },
-  "_from": "lru-cache@2",
-  "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
+  "_from": "lru-cache@2"
 }
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/package.json	(revision 516)
@@ -39,8 +39,4 @@
   "homepage": "https://github.com/isaacs/sigmund",
   "_id": "sigmund@1.0.0",
-  "_from": "sigmund@~1.0.0",
-  "dist": {
-    "shasum": "4d1a782fdcf140509fd8ea166574e0665819b881"
-  },
-  "_resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz"
+  "_from": "sigmund@~1.0.0"
 }
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/package.json	(revision 516)
@@ -7,5 +7,5 @@
   "name": "minimatch",
   "description": "a glob matcher in javascript",
-  "version": "0.2.12",
+  "version": "0.2.14",
   "repository": {
     "type": "git",
@@ -14,5 +14,5 @@
   "main": "minimatch.js",
   "scripts": {
-    "test": "tap test"
+    "test": "tap test/*.js"
   },
   "engines": {
@@ -30,5 +30,5 @@
     "url": "http://github.com/isaacs/minimatch/raw/master/LICENSE"
   },
-  "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n### Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated.  Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally.  This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything.  Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set.  This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.  **Note that this is different from the way that `**` is\nhandled by ruby's `Dir` class.**\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes.  For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`.  This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern.  Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity.  Since those two are valid, matching proceeds.\n\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n  Each row in the\n  array corresponds to a brace-expanded pattern.  Each item in the row\n  corresponds to a single path-part.  For example, the pattern\n  `{a,b/c}/d` would expand to a set of patterns like:\n\n        [ [ a, d ]\n        , [ b, c, d ] ]\n\n    If a portion of the pattern doesn't have any \"magic\" in it\n    (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n    will be left as a string rather than converted to a regular\n    expression.\n\n* `regexp` Created by the `makeRe` method.  A single regular expression\n  expressing the entire pattern.  This is useful in cases where you wish\n  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n  Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n  false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n  filename, and match it against a single row in the `regExpSet`.  This\n  method is mainly for internal use, but is exposed so that it can be\n  used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items.  So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export.  Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`.  Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob.  If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself.  When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes.  For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n",
+  "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\nminimatch(\"bar.foo\", \"*.+(bar|foo)\", { debug: true }) // true, and noisy!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n  Each row in the\n  array corresponds to a brace-expanded pattern.  Each item in the row\n  corresponds to a single path-part.  For example, the pattern\n  `{a,b/c}/d` would expand to a set of patterns like:\n\n        [ [ a, d ]\n        , [ b, c, d ] ]\n\n    If a portion of the pattern doesn't have any \"magic\" in it\n    (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n    will be left as a string rather than converted to a regular\n    expression.\n\n* `regexp` Created by the `makeRe` method.  A single regular expression\n  expressing the entire pattern.  This is useful in cases where you wish\n  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n  Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n  false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n  filename, and match it against a single row in the `regExpSet`.  This\n  method is mainly for internal use, but is exposed so that it can be\n  used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items.  So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export.  Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`.  Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob.  If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself.  When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes.  For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated.  Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally.  This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything.  Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set.  This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes.  For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`.  This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern.  Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity.  Since those two are valid, matching proceeds.\n",
   "readmeFilename": "README.md",
   "bugs": {
@@ -36,5 +36,5 @@
   },
   "homepage": "https://github.com/isaacs/minimatch",
-  "_id": "minimatch@0.2.12",
+  "_id": "minimatch@0.2.14",
   "_from": "minimatch@0.x.x"
 }
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/test/extglob-ending-with-state-char.js
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/test/extglob-ending-with-state-char.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/minimatch/test/extglob-ending-with-state-char.js	(revision 516)
@@ -0,0 +1,8 @@
+var test = require('tap').test
+var minimatch = require('../')
+
+test('extglob ending with statechar', function(t) {
+  t.notOk(minimatch('ax', 'a?(b*)'))
+  t.ok(minimatch('ax', '?(a*|b)'))
+  t.end()
+})
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/underscore/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/underscore/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/node_modules/underscore/package.json	(revision 516)
@@ -32,8 +32,4 @@
   },
   "_id": "underscore@1.4.4",
-  "_from": "underscore@~1.4.3",
-  "dist": {
-    "shasum": "3e7ceb21f205bc19964685e1fdd52c8f77773674"
-  },
-  "_resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz"
+  "_from": "underscore@1.4.x"
 }
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/node_modules/jshint/package.json	(revision 516)
@@ -37,8 +37,8 @@
   "readmeFilename": "README.md",
   "_id": "jshint@1.1.0",
-  "_from": "jshint@1.1.0",
   "dist": {
     "shasum": "1db32329c9bb70ca4e80720113d8a1a90d4d3abb"
   },
+  "_from": "jshint@1.1.0",
   "_resolved": "https://registry.npmjs.org/jshint/-/jshint-1.1.0.tgz"
 }
Index: /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-htmlhint/node_modules/htmlhint/package.json	(revision 516)
@@ -23,5 +23,8 @@
     "mocha": "~1.8.2",
     "expect.js": "~0.2.0",
-    "jscover": "~0.2.4"
+    "jscover": "~0.2.4",
+    "commander": "^1.1.1",
+    "csslint": "^0.9.10",
+    "jshint": "^1.1.0"
   },
   "bin": {
Index: /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/colors/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/colors/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/colors/package.json	(revision 516)
@@ -21,4 +21,8 @@
   "homepage": "https://github.com/Marak/colors.js",
   "_id": "colors@0.5.1",
-  "_from": "colors@0.5.x"
+  "dist": {
+    "shasum": "bb0880ff34d4cccbe4a7704aafa04d5bd64a3494"
+  },
+  "_from": "colors@0.5.1",
+  "_resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz"
 }
Index: /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/.npmignore
===================================================================
--- /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/.npmignore	(revision 516)
+++ /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/.npmignore	(revision 516)
@@ -0,0 +1,4 @@
+test/
+Rakefile
+docs/
+raw/
Index: /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/.travis.yml
===================================================================
--- /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/.travis.yml	(revision 516)
+++ /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/.travis.yml	(revision 516)
@@ -0,0 +1,5 @@
+language: node_js
+node_js:
+  - 0.8
+notifications:
+  email: false
Index: /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/CNAME
===================================================================
--- /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/CNAME	(revision 516)
+++ /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/CNAME	(revision 516)
@@ -0,0 +1,1 @@
+underscorejs.org
Index: /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/CONTRIBUTING.md
===================================================================
--- /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/CONTRIBUTING.md	(revision 516)
+++ /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/CONTRIBUTING.md	(revision 516)
@@ -0,0 +1,9 @@
+## How to contribute to Underscore.js
+
+* Before you open a ticket or send a pull request, [search](https://github.com/documentcloud/underscore/issues) for previous discussions about the same feature or issue. Add to the earlier ticket if you find one.
+
+* Before sending a pull request for a feature, be sure to have [tests](http://underscorejs.org/test/).
+
+* Use the same coding style as the rest of the [codebase](https://github.com/documentcloud/underscore/blob/master/underscore.js).
+
+* In your pull request, do not add documentation or re-build the minified `underscore-min.js` file. We'll do those things before cutting a new release.
Index: /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/LICENSE
===================================================================
--- /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/LICENSE	(revision 516)
+++ /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/LICENSE	(revision 516)
@@ -0,0 +1,22 @@
+Copyright (c) 2009-2013 Jeremy Ashkenas, DocumentCloud
+
+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.
Index: /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/README.md	(revision 516)
+++ /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/README.md	(revision 516)
@@ -0,0 +1,19 @@
+                       __
+                      /\ \                                                         __
+     __  __    ___    \_\ \     __   _ __   ____    ___    ___   _ __    __       /\_\    ____
+    /\ \/\ \ /' _ `\  /'_  \  /'__`\/\  __\/ ,__\  / ___\ / __`\/\  __\/'__`\     \/\ \  /',__\
+    \ \ \_\ \/\ \/\ \/\ \ \ \/\  __/\ \ \//\__, `\/\ \__//\ \ \ \ \ \//\  __/  __  \ \ \/\__, `\
+     \ \____/\ \_\ \_\ \___,_\ \____\\ \_\\/\____/\ \____\ \____/\ \_\\ \____\/\_\ _\ \ \/\____/
+      \/___/  \/_/\/_/\/__,_ /\/____/ \/_/ \/___/  \/____/\/___/  \/_/ \/____/\/_//\ \_\ \/___/
+                                                                                  \ \____/
+                                                                                   \/___/
+
+Underscore.js is a utility-belt library for JavaScript that provides
+support for the usual functional suspects (each, map, reduce, filter...)
+without extending any core JavaScript objects.
+
+For Docs, License, Tests, and pre-packed downloads, see:
+http://underscorejs.org
+
+Many thanks to our contributors:
+https://github.com/documentcloud/underscore/contributors
Index: /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/index.html
===================================================================
--- /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/index.html	(revision 516)
+++ /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/index.html	(revision 516)
@@ -0,0 +1,2467 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
+  <meta http-equiv="X-UA-Compatible" content="chrome=1" />
+  <meta name="viewport" content="width=device-width" />
+  <link rel="canonical" href="http://underscorejs.org" />
+  <link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
+  <title>Underscore.js</title>
+  <style>
+    body {
+      font-size: 14px;
+      line-height: 22px;
+      background: #f4f4f4 url(docs/images/background.png);
+      color: #000;
+      font-family: Helvetica Neue, Helvetica, Arial;
+    }
+    .interface {
+      font-family: "Lucida Grande", "Lucida Sans Unicode", Helvetica, Arial, sans-serif !important;
+    }
+    div#sidebar {
+      background: #fff;
+      position: fixed;
+      top: 0; left: 0; bottom: 0;
+      width: 200px;
+      overflow-y: auto;
+      overflow-x: hidden;
+      -webkit-overflow-scrolling: touch;
+      padding: 15px 0 30px 30px;
+      border-right: 1px solid #bbb;
+      box-shadow: 0 0 20px #ccc; -webkit-box-shadow: 0 0 20px #ccc; -moz-box-shadow: 0 0 20px #ccc;
+    }
+    a.toc_title, a.toc_title:visited {
+      display: block;
+      color: black;
+      font-weight: bold;
+      margin-top: 15px;
+    }
+      a.toc_title:hover {
+        text-decoration: underline;
+      }
+      #sidebar .version {
+        font-size: 10px;
+        font-weight: normal;
+      }
+    ul.toc_section {
+      font-size: 11px;
+      line-height: 14px;
+      margin: 5px 0 0 0;
+      padding-left: 0px;
+      list-style-type: none;
+      font-family: Lucida Grande;
+    }
+      .toc_section li {
+        cursor: pointer;
+        margin: 0 0 3px 0;
+      }
+        .toc_section li a {
+          text-decoration: none;
+          color: black;
+        }
+          .toc_section li a:hover {
+            text-decoration: underline;
+          }
+    div.container {
+      width: 550px;
+      margin: 40px 0 50px 260px;
+    }
+    img#logo {
+      width: 396px;
+      height: 69px;
+    }
+    div.warning {
+      margin-top: 15px;
+      font: bold 11px Arial;
+      color: #770000;
+    }
+    p {
+      margin: 20px 0;
+      width: 550px;
+    }
+    a, a:visited {
+      color: #444;
+    }
+    a:active, a:hover {
+      color: #000;
+    }
+    h1, h2, h3, h4, h5, h6 {
+      padding-top: 20px;
+    }
+      h2 {
+        font-size: 20px;
+      }
+    b.header {
+      font-size: 16px;
+      line-height: 30px;
+    }
+    span.alias {
+      font-size: 14px;
+      font-style: italic;
+      margin-left: 20px;
+    }
+    table, tr, td {
+      margin: 0; padding: 0;
+    }
+      td {
+        padding: 2px 12px 2px 0;
+      }
+      table .rule {
+        height: 1px;
+        background: #ccc;
+        margin: 5px 0;
+      }
+    ul {
+      list-style-type: circle;
+      padding: 0 0 0 20px;
+    }
+      li {
+        width: 500px;
+        margin-bottom: 10px;
+      }
+      code, pre, tt {
+        font-family: Monaco, Consolas, "Lucida Console", monospace;
+        font-size: 12px;
+        line-height: 18px;
+        font-style: normal;
+      }
+        tt {
+          padding: 0px 3px;
+          background: #fff;
+          border: 1px solid #ddd;
+          zoom: 1;
+        }
+        code {
+          margin-left: 20px;
+        }
+        pre {
+          font-size: 12px;
+          padding: 2px 0 2px 15px;
+          border-left: 5px solid #bbb;
+          margin: 0px 0 30px;
+        }
+    @media only screen and (-webkit-min-device-pixel-ratio: 1.5) and (max-width: 640px),
+          only screen and (-o-min-device-pixel-ratio: 3/2) and (max-width: 640px),
+          only screen and (min-device-pixel-ratio: 1.5) and (max-width: 640px) {
+      img {
+        max-width: 100%;
+      }
+      div#sidebar {
+        -webkit-overflow-scrolling: initial;
+        position: relative;
+        width: 90%;
+        height: 120px;
+        left: 0;
+        top: -7px;
+        padding: 10px 0 10px 30px;
+        border: 0;
+      }
+      img#logo {
+        width: auto;
+        height: auto;
+      }
+      div.container {
+        margin: 0;
+        width: 100%;
+      }
+      p, div.container ul {
+        max-width: 98%;
+        overflow-x: scroll;
+      }
+      pre {
+        overflow: scroll;
+      }
+    }
+  </style>
+</head>
+<body>
+
+  <div id="sidebar" class="interface">
+
+    <a class="toc_title" href="#">
+      Underscore.js <span class="version">(1.4.4)</span>
+    </a>
+    <ul class="toc_section">
+      <li>&raquo; <a href="http://github.com/documentcloud/underscore">GitHub Repository</a></li>
+      <li>&raquo; <a href="docs/underscore.html">Annotated Source</a></li>
+    </ul>
+
+    <a class="toc_title" href="#">
+      Introduction
+    </a>
+
+    <a class="toc_title" href="#collections">
+      Collections
+    </a>
+    <ul class="toc_section">
+      <li>- <a href="#each">each</a></li>
+      <li>- <a href="#map">map</a></li>
+      <li>- <a href="#reduce">reduce</a></li>
+      <li>- <a href="#reduceRight">reduceRight</a></li>
+      <li>- <a href="#find">find</a></li>
+      <li>- <a href="#filter">filter</a></li>
+      <li>- <a href="#where">where</a></li>
+      <li>- <a href="#findWhere">findWhere</a></li>
+      <li>- <a href="#reject">reject</a></li>
+      <li>- <a href="#every">every</a></li>
+      <li>- <a href="#some">some</a></li>
+      <li>- <a href="#contains">contains</a></li>
+      <li>- <a href="#invoke">invoke</a></li>
+      <li>- <a href="#pluck">pluck</a></li>
+      <li>- <a href="#max">max</a></li>
+      <li>- <a href="#min">min</a></li>
+      <li>- <a href="#sortBy">sortBy</a></li>
+      <li>- <a href="#groupBy">groupBy</a></li>
+      <li>- <a href="#countBy">countBy</a></li>
+      <li>- <a href="#shuffle">shuffle</a></li>
+      <li>- <a href="#toArray">toArray</a></li>
+      <li>- <a href="#size">size</a></li>
+    </ul>
+
+    <a class="toc_title" href="#arrays">
+      Arrays
+    </a>
+    <ul class="toc_section">
+      <li>- <a href="#first">first</a></li>
+      <li>- <a href="#initial">initial</a></li>
+      <li>- <a href="#last">last</a></li>
+      <li>- <a href="#rest">rest</a></li>
+      <li>- <a href="#compact">compact</a></li>
+      <li>- <a href="#flatten">flatten</a></li>
+      <li>- <a href="#without">without</a></li>
+      <li>- <a href="#union">union</a></li>
+      <li>- <a href="#intersection">intersection</a></li>
+      <li>- <a href="#difference">difference</a></li>
+      <li>- <a href="#uniq">uniq</a></li>
+      <li>- <a href="#zip">zip</a></li>
+      <li>- <a href="#object">object</a></li>
+      <li>- <a href="#indexOf">indexOf</a></li>
+      <li>- <a href="#lastIndexOf">lastIndexOf</a></li>
+      <li>- <a href="#sortedIndex">sortedIndex</a></li>
+      <li>- <a href="#range">range</a></li>
+    </ul>
+
+    <a class="toc_title" href="#functions">
+      Functions
+    </a>
+    <ul class="toc_section">
+      <li>- <a href="#bind">bind</a></li>
+      <li>- <a href="#bindAll">bindAll</a></li>
+      <li>- <a href="#partial">partial</a></li>
+      <li>- <a href="#memoize">memoize</a></li>
+      <li>- <a href="#delay">delay</a></li>
+      <li>- <a href="#defer">defer</a></li>
+      <li>- <a href="#throttle">throttle</a></li>
+      <li>- <a href="#debounce">debounce</a></li>
+      <li>- <a href="#once">once</a></li>
+      <li>- <a href="#after">after</a></li>
+      <li>- <a href="#wrap">wrap</a></li>
+      <li>- <a href="#compose">compose</a></li>
+    </ul>
+
+    <a class="toc_title" href="#objects">
+      Objects
+    </a>
+    <ul class="toc_section">
+      <li>- <a href="#keys">keys</a></li>
+      <li>- <a href="#values">values</a></li>
+      <li>- <a href="#pairs">pairs</a></li>
+      <li>- <a href="#invert">invert</a></li>
+      <li>- <a href="#object-functions">functions</a></li>
+      <li>- <a href="#extend">extend</a></li>
+      <li>- <a href="#pick">pick</a></li>
+      <li>- <a href="#omit">omit</a></li>
+      <li>- <a href="#defaults">defaults</a></li>
+      <li>- <a href="#clone">clone</a></li>
+      <li>- <a href="#tap">tap</a></li>
+      <li>- <a href="#has">has</a></li>
+      <li>- <a href="#isEqual">isEqual</a></li>
+      <li>- <a href="#isEmpty">isEmpty</a></li>
+      <li>- <a href="#isElement">isElement</a></li>
+      <li>- <a href="#isArray">isArray</a></li>
+      <li>- <a href="#isObject">isObject</a></li>
+      <li>- <a href="#isArguments">isArguments</a></li>
+      <li>- <a href="#isFunction">isFunction</a></li>
+      <li>- <a href="#isString">isString</a></li>
+      <li>- <a href="#isNumber">isNumber</a></li>
+      <li>- <a href="#isFinite">isFinite</a></li>
+      <li>- <a href="#isBoolean">isBoolean</a></li>
+      <li>- <a href="#isDate">isDate</a></li>
+      <li>- <a href="#isRegExp">isRegExp</a></li>
+      <li>- <a href="#isNaN">isNaN</a></li>
+      <li>- <a href="#isNull">isNull</a></li>
+      <li>- <a href="#isUndefined">isUndefined</a></li>
+    </ul>
+
+    <a class="toc_title" href="#utility">
+      Utility
+    </a>
+    <ul class="toc_section">
+      <li>- <a href="#noConflict">noConflict</a></li>
+      <li>- <a href="#identity">identity</a></li>
+      <li>- <a href="#times">times</a></li>
+      <li>- <a href="#random">random</a></li>
+      <li>- <a href="#mixin">mixin</a></li>
+      <li>- <a href="#uniqueId">uniqueId</a></li>
+      <li>- <a href="#escape">escape</a></li>
+      <li>- <a href="#unescape">unescape</a></li>
+      <li>- <a href="#result">result</a></li>
+      <li>- <a href="#template">template</a></li>
+    </ul>
+
+    <a class="toc_title" href="#chaining">
+      Chaining
+    </a>
+    <ul class="toc_section">
+      <li>- <a href="#chain">chain</a></li>
+      <li>- <a href="#value">value</a></li>
+    </ul>
+
+    <a class="toc_title" href="#links">
+      Links
+    </a>
+
+    <a class="toc_title" href="#changelog">
+      Change Log
+    </a>
+
+  </div>
+
+  <div class="container">
+
+    <p id="introduction">
+      <img id="logo" src="docs/images/underscore.png" alt="Underscore.js" />
+    </p>
+
+    <p>
+      <a href="http://github.com/documentcloud/underscore/">Underscore</a> is a
+      utility-belt library for JavaScript that provides a lot of the
+      functional programming support that you would expect in
+      <a href="http://prototypejs.org/doc/latest/">Prototype.js</a>
+      (or <a href="http://www.ruby-doc.org/core/classes/Enumerable.html">Ruby</a>),
+      but without extending any of the built-in JavaScript objects. It's the
+      tie to go along with <a href="http://docs.jquery.com">jQuery</a>'s tux,
+      and <a href="http://backbonejs.org">Backbone.js</a>'s suspenders.
+    </p>
+
+    <p>
+      Underscore provides 80-odd functions that support both the usual
+      functional suspects: <b>map</b>, <b>select</b>, <b>invoke</b> &mdash;
+      as well as more specialized helpers: function binding, javascript
+      templating, deep equality testing, and so on. It delegates to built-in
+      functions, if present, so modern browsers will use the
+      native implementations of <b>forEach</b>, <b>map</b>, <b>reduce</b>,
+      <b>filter</b>, <b>every</b>, <b>some</b> and <b>indexOf</b>.
+    </p>
+
+    <p>
+      A complete <a href="test/">Test &amp; Benchmark Suite</a>
+      is included for your perusal.
+    </p>
+
+    <p>
+      You may also read through the <a href="docs/underscore.html">annotated source code</a>.
+    </p>
+
+    <p>
+      The project is
+      <a href="http://github.com/documentcloud/underscore/">hosted on GitHub</a>.
+      You can report bugs and discuss features on the
+      <a href="http://github.com/documentcloud/underscore/issues">issues page</a>,
+      on Freenode in the <tt>#documentcloud</tt> channel,
+      or send tweets to <a href="http://twitter.com/documentcloud">@documentcloud</a>.
+    </p>
+
+    <p>
+      <i>Underscore is an open-source component of <a href="http://documentcloud.org/">DocumentCloud</a>.</i>
+    </p>
+
+    <h2>Downloads <i style="padding-left: 12px; font-size:12px;">(Right-click, and use "Save As")</i></h2>
+
+    <table>
+      <tr>
+        <td><a href="underscore.js">Development Version (1.4.4)</a></td>
+        <td><i>40kb, Uncompressed with Plentiful Comments</i></td>
+      </tr>
+      <tr>
+        <td><a href="underscore-min.js">Production Version (1.4.4)</a></td>
+        <td><i>4kb, Minified and Gzipped</i></td>
+      </tr>
+      <tr>
+        <td colspan="2"><div class="rule"></div></td>
+      </tr>
+      <tr>
+        <td><a href="https://raw.github.com/documentcloud/underscore/master/underscore.js">Edge Version</a></td>
+        <td><i>Unreleased, current <tt>master</tt>, use at your own risk</i></td>
+      </tr>
+    </table>
+
+    <div id="documentation">
+
+      <h2 id="collections">Collection Functions (Arrays or Objects)</h2>
+
+      <p id="each">
+        <b class="header">each</b><code>_.each(list, iterator, [context])</code>
+        <span class="alias">Alias: <b>forEach</b></span>
+        <br />
+        Iterates over a <b>list</b> of elements, yielding each in turn to an <b>iterator</b>
+        function. The <b>iterator</b> is bound to the <b>context</b> object, if one is
+        passed. Each invocation of <b>iterator</b> is called with three arguments:
+        <tt>(element, index, list)</tt>. If <b>list</b> is a JavaScript object, <b>iterator</b>'s
+        arguments will be <tt>(value, key, list)</tt>. Delegates to the native
+        <b>forEach</b> function if it exists.
+      </p>
+      <pre>
+_.each([1, 2, 3], alert);
+=&gt; alerts each number in turn...
+_.each({one : 1, two : 2, three : 3}, alert);
+=&gt; alerts each number value in turn...</pre>
+
+      <p id="map">
+        <b class="header">map</b><code>_.map(list, iterator, [context])</code>
+        <span class="alias">Alias: <b>collect</b></span>
+        <br />
+        Produces a new array of values by mapping each value in <b>list</b>
+        through a transformation function (<b>iterator</b>). If the native <b>map</b> method
+        exists, it will be used instead. If <b>list</b> is a JavaScript object,
+        <b>iterator</b>'s arguments will be <tt>(value, key, list)</tt>.
+      </p>
+      <pre>
+_.map([1, 2, 3], function(num){ return num * 3; });
+=&gt; [3, 6, 9]
+_.map({one : 1, two : 2, three : 3}, function(num, key){ return num * 3; });
+=&gt; [3, 6, 9]</pre>
+
+      <p id="reduce">
+        <b class="header">reduce</b><code>_.reduce(list, iterator, memo, [context])</code>
+        <span class="alias">Aliases: <b>inject, foldl</b></span>
+        <br />
+        Also known as <b>inject</b> and <b>foldl</b>, <b>reduce</b> boils down a
+        <b>list</b> of values into a single value. <b>Memo</b> is the initial state
+        of the reduction, and each successive step of it should be returned by
+        <b>iterator</b>. The iterator is passed four arguments: the <tt>memo</tt>,
+        then the <tt>value</tt> and <tt>index</tt> (or key) of the iteration,
+        and finally a reference to the entire <tt>list</tt>.
+      </p>
+      <pre>
+var sum = _.reduce([1, 2, 3], function(memo, num){ return memo + num; }, 0);
+=&gt; 6
+</pre>
+
+      <p id="reduceRight">
+        <b class="header">reduceRight</b><code>_.reduceRight(list, iterator, memo, [context])</code>
+        <span class="alias">Alias: <b>foldr</b></span>
+        <br />
+        The right-associative version of <b>reduce</b>. Delegates to the
+        JavaScript 1.8 version of <b>reduceRight</b>, if it exists. <b>Foldr</b>
+        is not as useful in JavaScript as it would be in a language with lazy
+        evaluation.
+      </p>
+      <pre>
+var list = [[0, 1], [2, 3], [4, 5]];
+var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);
+=&gt; [4, 5, 2, 3, 0, 1]
+</pre>
+
+      <p id="find">
+        <b class="header">find</b><code>_.find(list, iterator, [context])</code>
+        <span class="alias">Alias: <b>detect</b></span>
+        <br />
+        Looks through each value in the <b>list</b>, returning the first one that
+        passes a truth test (<b>iterator</b>). The function returns as
+        soon as it finds an acceptable element, and doesn't traverse the
+        entire list.
+      </p>
+      <pre>
+var even = _.find([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
+=&gt; 2
+</pre>
+
+      <p id="filter">
+        <b class="header">filter</b><code>_.filter(list, iterator, [context])</code>
+        <span class="alias">Alias: <b>select</b></span>
+        <br />
+        Looks through each value in the <b>list</b>, returning an array of all
+        the values that pass a truth test (<b>iterator</b>). Delegates to the
+        native <b>filter</b> method, if it exists.
+      </p>
+      <pre>
+var evens = _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
+=&gt; [2, 4, 6]
+</pre>
+
+      <p id="where">
+        <b class="header">where</b><code>_.where(list, properties)</code>
+        <br />
+        Looks through each value in the <b>list</b>, returning an array of all
+        the values that contain all of the key-value pairs listed in <b>properties</b>.
+      </p>
+      <pre>
+_.where(listOfPlays, {author: "Shakespeare", year: 1611});
+=&gt; [{title: "Cymbeline", author: "Shakespeare", year: 1611},
+    {title: "The Tempest", author: "Shakespeare", year: 1611}]
+</pre>
+
+      <p id="findWhere">
+        <b class="header">findWhere</b><code>_.findWhere(list, properties)</code>
+        <br />
+        Looks through the <b>list</b> and returns the <i>first</i> value that matches
+        all of the key-value pairs listed in <b>properties</b>.
+      </p>
+      <pre>
+_.findWhere(publicServicePulitzers, {newsroom: "The New York Times"});
+=&gt; {year: 1918, newsroom: "The New York Times",
+  reason: "For its public service in publishing in full so many official reports,
+  documents and speeches by European statesmen relating to the progress and
+  conduct of the war."}
+</pre>
+
+      <p id="reject">
+        <b class="header">reject</b><code>_.reject(list, iterator, [context])</code>
+        <br />
+        Returns the values in <b>list</b> without the elements that the truth
+        test (<b>iterator</b>) passes. The opposite of <b>filter</b>.
+      </p>
+      <pre>
+var odds = _.reject([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
+=&gt; [1, 3, 5]
+</pre>
+
+      <p id="every">
+        <b class="header">every</b><code>_.every(list, iterator, [context])</code>
+        <span class="alias">Alias: <b>all</b></span>
+        <br />
+        Returns <i>true</i> if all of the values in the <b>list</b> pass the <b>iterator</b>
+        truth test. Delegates to the native method <b>every</b>, if present.
+      </p>
+      <pre>
+_.every([true, 1, null, 'yes'], _.identity);
+=&gt; false
+</pre>
+
+      <p id="some">
+        <b class="header">some</b><code>_.some(list, [iterator], [context])</code>
+        <span class="alias">Alias: <b>any</b></span>
+        <br />
+        Returns <i>true</i> if any of the values in the <b>list</b> pass the
+        <b>iterator</b> truth test. Short-circuits and stops traversing the list
+        if a true element is found. Delegates to the native method <b>some</b>,
+        if present.
+      </p>
+      <pre>
+_.some([null, 0, 'yes', false]);
+=&gt; true
+</pre>
+
+      <p id="contains">
+        <b class="header">contains</b><code>_.contains(list, value)</code>
+        <span class="alias">Alias: <b>include</b></span>
+        <br />
+        Returns <i>true</i> if the <b>value</b> is present in the <b>list</b>.
+        Uses <b>indexOf</b> internally, if <b>list</b> is an Array.
+      </p>
+      <pre>
+_.contains([1, 2, 3], 3);
+=&gt; true
+</pre>
+
+      <p id="invoke">
+        <b class="header">invoke</b><code>_.invoke(list, methodName, [*arguments])</code>
+        <br />
+        Calls the method named by <b>methodName</b> on each value in the <b>list</b>.
+        Any extra arguments passed to <b>invoke</b> will be forwarded on to the
+        method invocation.
+      </p>
+      <pre>
+_.invoke([[5, 1, 7], [3, 2, 1]], 'sort');
+=&gt; [[1, 5, 7], [1, 2, 3]]
+</pre>
+
+      <p id="pluck">
+        <b class="header">pluck</b><code>_.pluck(list, propertyName)</code>
+        <br />
+        A convenient version of what is perhaps the most common use-case for
+        <b>map</b>: extracting a list of property values.
+      </p>
+      <pre>
+var stooges = [{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}];
+_.pluck(stooges, 'name');
+=&gt; ["moe", "larry", "curly"]
+</pre>
+
+      <p id="max">
+        <b class="header">max</b><code>_.max(list, [iterator], [context])</code>
+        <br />
+        Returns the maximum value in <b>list</b>. If <b>iterator</b> is passed,
+        it will be used on each value to generate the criterion by which the
+        value is ranked.
+      </p>
+      <pre>
+var stooges = [{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}];
+_.max(stooges, function(stooge){ return stooge.age; });
+=&gt; {name : 'curly', age : 60};
+</pre>
+
+      <p id="min">
+        <b class="header">min</b><code>_.min(list, [iterator], [context])</code>
+        <br />
+        Returns the minimum value in <b>list</b>. If <b>iterator</b> is passed,
+        it will be used on each value to generate the criterion by which the
+        value is ranked.
+      </p>
+      <pre>
+var numbers = [10, 5, 100, 2, 1000];
+_.min(numbers);
+=&gt; 2
+</pre>
+
+      <p id="sortBy">
+        <b class="header">sortBy</b><code>_.sortBy(list, iterator, [context])</code>
+        <br />
+        Returns a sorted copy of <b>list</b>, ranked in ascending order by the
+        results of running each value through <b>iterator</b>. Iterator may
+        also be the string name of the property to sort by (eg. <tt>length</tt>).
+      </p>
+      <pre>
+_.sortBy([1, 2, 3, 4, 5, 6], function(num){ return Math.sin(num); });
+=&gt; [5, 4, 6, 3, 1, 2]
+</pre>
+
+      <p id="groupBy">
+        <b class="header">groupBy</b><code>_.groupBy(list, iterator, [context])</code>
+        <br />
+        Splits a collection into sets, grouped by the result of running each
+        value through <b>iterator</b>. If <b>iterator</b> is a string instead of
+        a function, groups by the property named by <b>iterator</b> on each of
+        the values.
+      </p>
+      <pre>
+_.groupBy([1.3, 2.1, 2.4], function(num){ return Math.floor(num); });
+=&gt; {1: [1.3], 2: [2.1, 2.4]}
+
+_.groupBy(['one', 'two', 'three'], 'length');
+=&gt; {3: ["one", "two"], 5: ["three"]}
+</pre>
+
+      <p id="countBy">
+        <b class="header">countBy</b><code>_.countBy(list, iterator, [context])</code>
+        <br />
+        Sorts a list into groups and returns a count for the number of objects
+        in each group.
+        Similar to <tt>groupBy</tt>, but instead of returning a list of values,
+        returns a count for the number of values in that group.
+      </p>
+      <pre>
+_.countBy([1, 2, 3, 4, 5], function(num) {
+  return num % 2 == 0 ? 'even' : 'odd';
+});
+=&gt; {odd: 3, even: 2}
+</pre>
+
+      <p id="shuffle">
+        <b class="header">shuffle</b><code>_.shuffle(list)</code>
+        <br />
+        Returns a shuffled copy of the <b>list</b>, using a version of the
+        <a href="http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle">Fisher-Yates shuffle</a>.
+      </p>
+      <pre>
+_.shuffle([1, 2, 3, 4, 5, 6]);
+=&gt; [4, 1, 6, 3, 5, 2]
+</pre>
+
+      <p id="toArray">
+        <b class="header">toArray</b><code>_.toArray(list)</code>
+        <br />
+        Converts the <b>list</b> (anything that can be iterated over), into a
+        real Array. Useful for transmuting the <b>arguments</b> object.
+      </p>
+      <pre>
+(function(){ return _.toArray(arguments).slice(1); })(1, 2, 3, 4);
+=&gt; [2, 3, 4]
+</pre>
+
+      <p id="size">
+        <b class="header">size</b><code>_.size(list)</code>
+        <br />
+        Return the number of values in the <b>list</b>.
+      </p>
+      <pre>
+_.size({one : 1, two : 2, three : 3});
+=&gt; 3
+</pre>
+
+      <h2 id="arrays">Array Functions</h2>
+
+      <p>
+        <i>
+          Note: All array functions will also work on the <b>arguments</b> object.
+          However, Underscore functions are not designed to work on "sparse" arrays.
+        </i>
+      </p>
+
+      <p id="first">
+        <b class="header">first</b><code>_.first(array, [n])</code>
+        <span class="alias">Alias: <b>head</b>, <b>take</b></span>
+        <br />
+        Returns the first element of an <b>array</b>. Passing <b>n</b> will
+        return the first <b>n</b> elements of the array.
+      </p>
+      <pre>
+_.first([5, 4, 3, 2, 1]);
+=&gt; 5
+</pre>
+
+      <p id="initial">
+        <b class="header">initial</b><code>_.initial(array, [n])</code>
+        <br />
+        Returns everything but the last entry of the array. Especially useful on
+        the arguments object. Pass <b>n</b> to exclude the last <b>n</b> elements
+        from the result.
+      </p>
+      <pre>
+_.initial([5, 4, 3, 2, 1]);
+=&gt; [5, 4, 3, 2]
+</pre>
+
+      <p id="last">
+        <b class="header">last</b><code>_.last(array, [n])</code>
+        <br />
+        Returns the last element of an <b>array</b>. Passing <b>n</b> will return
+        the last <b>n</b> elements of the array.
+      </p>
+      <pre>
+_.last([5, 4, 3, 2, 1]);
+=&gt; 1
+</pre>
+
+      <p id="rest">
+        <b class="header">rest</b><code>_.rest(array, [index])</code>
+        <span class="alias">Alias: <b>tail, drop</b></span>
+        <br />
+        Returns the <b>rest</b> of the elements in an array. Pass an <b>index</b>
+        to return the values of the array from that index onward.
+      </p>
+      <pre>
+_.rest([5, 4, 3, 2, 1]);
+=&gt; [4, 3, 2, 1]
+</pre>
+
+      <p id="compact">
+        <b class="header">compact</b><code>_.compact(array)</code>
+        <br />
+        Returns a copy of the <b>array</b> with all falsy values removed.
+        In JavaScript, <i>false</i>, <i>null</i>, <i>0</i>, <i>""</i>,
+        <i>undefined</i> and <i>NaN</i> are all falsy.
+      </p>
+      <pre>
+_.compact([0, 1, false, 2, '', 3]);
+=&gt; [1, 2, 3]
+</pre>
+
+      <p id="flatten">
+        <b class="header">flatten</b><code>_.flatten(array, [shallow])</code>
+        <br />
+        Flattens a nested <b>array</b> (the nesting can be to any depth). If you
+        pass <b>shallow</b>, the array will only be flattened a single level.
+      </p>
+      <pre>
+_.flatten([1, [2], [3, [[4]]]]);
+=&gt; [1, 2, 3, 4];
+
+_.flatten([1, [2], [3, [[4]]]], true);
+=&gt; [1, 2, 3, [[4]]];
+</pre>
+
+      <p id="without">
+        <b class="header">without</b><code>_.without(array, [*values])</code>
+        <br />
+        Returns a copy of the <b>array</b> with all instances of the <b>values</b>
+        removed.
+      </p>
+      <pre>
+_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
+=&gt; [2, 3, 4]
+</pre>
+
+      <p id="union">
+        <b class="header">union</b><code>_.union(*arrays)</code>
+        <br />
+        Computes the union of the passed-in <b>arrays</b>: the list of unique items,
+        in order, that are present in one or more of the <b>arrays</b>.
+      </p>
+      <pre>
+_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]);
+=&gt; [1, 2, 3, 101, 10]
+</pre>
+
+      <p id="intersection">
+        <b class="header">intersection</b><code>_.intersection(*arrays)</code>
+        <br />
+        Computes the list of values that are the intersection of all the <b>arrays</b>.
+        Each value in the result is present in each of the <b>arrays</b>.
+      </p>
+      <pre>
+_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
+=&gt; [1, 2]
+</pre>
+
+      <p id="difference">
+        <b class="header">difference</b><code>_.difference(array, *others)</code>
+        <br />
+        Similar to <b>without</b>, but returns the values from <b>array</b> that
+        are not present in the <b>other</b> arrays.
+      </p>
+      <pre>
+_.difference([1, 2, 3, 4, 5], [5, 2, 10]);
+=&gt; [1, 3, 4]
+</pre>
+
+      <p id="uniq">
+        <b class="header">uniq</b><code>_.uniq(array, [isSorted], [iterator])</code>
+        <span class="alias">Alias: <b>unique</b></span>
+        <br />
+        Produces a duplicate-free version of the <b>array</b>, using <i>===</i> to test
+        object equality. If you know in advance that the <b>array</b> is sorted,
+        passing <i>true</i> for <b>isSorted</b> will run a much faster algorithm.
+        If you want to compute unique items based on a transformation, pass an
+        <b>iterator</b> function.
+      </p>
+      <pre>
+_.uniq([1, 2, 1, 3, 1, 4]);
+=&gt; [1, 2, 3, 4]
+</pre>
+
+      <p id="zip">
+        <b class="header">zip</b><code>_.zip(*arrays)</code>
+        <br />
+        Merges together the values of each of the <b>arrays</b> with the
+        values at the corresponding position. Useful when you have separate
+        data sources that are coordinated through matching array indexes.
+        If you're working with a matrix of nested arrays, <b>zip.apply</b>
+        can transpose the matrix in a similar fashion.
+      </p>
+      <pre>
+_.zip(['moe', 'larry', 'curly'], [30, 40, 50], [true, false, false]);
+=&gt; [["moe", 30, true], ["larry", 40, false], ["curly", 50, false]]
+</pre>
+
+      <p id="object">
+        <b class="header">object</b><code>_.object(list, [values])</code>
+        <br />
+        Converts arrays into objects. Pass either a single list of
+        <tt>[key, value]</tt> pairs, or a list of keys, and a list of values.
+      </p>
+      <pre>
+_.object(['moe', 'larry', 'curly'], [30, 40, 50]);
+=&gt; {moe: 30, larry: 40, curly: 50}
+
+_.object([['moe', 30], ['larry', 40], ['curly', 50]]);
+=&gt; {moe: 30, larry: 40, curly: 50}
+</pre>
+
+      <p id="indexOf">
+        <b class="header">indexOf</b><code>_.indexOf(array, value, [isSorted])</code>
+        <br />
+        Returns the index at which <b>value</b> can be found in the <b>array</b>,
+        or <i>-1</i> if value is not present in the <b>array</b>. Uses the native
+        <b>indexOf</b> function unless it's missing. If you're working with a
+        large array, and you know that the array is already sorted, pass <tt>true</tt>
+        for <b>isSorted</b> to use a faster binary search ... or, pass a number as
+        the third argument in order to look for the first matching value in the
+        array after the given index.
+      </p>
+      <pre>
+_.indexOf([1, 2, 3], 2);
+=&gt; 1
+</pre>
+
+      <p id="lastIndexOf">
+        <b class="header">lastIndexOf</b><code>_.lastIndexOf(array, value, [fromIndex])</code>
+        <br />
+        Returns the index of the last occurrence of <b>value</b> in the <b>array</b>,
+        or <i>-1</i> if value is not present. Uses the native <b>lastIndexOf</b>
+        function if possible. Pass <b>fromIndex</b> to start your search at a
+        given index.
+      </p>
+      <pre>
+_.lastIndexOf([1, 2, 3, 1, 2, 3], 2);
+=&gt; 4
+</pre>
+
+      <p id="sortedIndex">
+        <b class="header">sortedIndex</b><code>_.sortedIndex(list, value, [iterator], [context])</code>
+        <br />
+        Uses a binary search to determine the index at which the <b>value</b>
+        <i>should</i> be inserted into the <b>list</b> in order to maintain the <b>list</b>'s
+        sorted order. If an <b>iterator</b> is passed, it will be used to compute
+        the sort ranking of each value, including the <b>value</b> you pass.
+      </p>
+      <pre>
+_.sortedIndex([10, 20, 30, 40, 50], 35);
+=&gt; 3
+</pre>
+
+      <p id="range">
+        <b class="header">range</b><code>_.range([start], stop, [step])</code>
+        <br />
+        A function to create flexibly-numbered lists of integers, handy for
+        <tt>each</tt> and <tt>map</tt> loops. <b>start</b>, if omitted, defaults
+        to <i>0</i>; <b>step</b> defaults to <i>1</i>. Returns a list of integers
+        from <b>start</b> to <b>stop</b>, incremented (or decremented) by <b>step</b>,
+        exclusive.
+      </p>
+      <pre>
+_.range(10);
+=&gt; [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+_.range(1, 11);
+=&gt; [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+_.range(0, 30, 5);
+=&gt; [0, 5, 10, 15, 20, 25]
+_.range(0, -10, -1);
+=&gt; [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
+_.range(0);
+=&gt; []
+</pre>
+
+      <h2 id="functions">Function (uh, ahem) Functions</h2>
+
+      <p id="bind">
+        <b class="header">bind</b><code>_.bind(function, object, [*arguments])</code>
+        <br />
+        Bind a <b>function</b> to an <b>object</b>, meaning that whenever
+        the function is called, the value of <i>this</i> will be the <b>object</b>.
+        Optionally, pass <b>arguments</b> to the <b>function</b> to pre-fill them,
+        also known as <b>partial application</b>.
+      </p>
+      <pre>
+var func = function(greeting){ return greeting + ': ' + this.name };
+func = _.bind(func, {name : 'moe'}, 'hi');
+func();
+=&gt; 'hi: moe'
+</pre>
+
+      <p id="bindAll">
+        <b class="header">bindAll</b><code>_.bindAll(object, [*methodNames])</code>
+        <br />
+        Binds a number of methods on the <b>object</b>, specified by
+        <b>methodNames</b>, to be run in the context of that object whenever they
+        are invoked. Very handy for binding functions that are going to be used
+        as event handlers, which would otherwise be invoked with a fairly useless
+        <i>this</i>. If no <b>methodNames</b> are provided, all of the object's
+        function properties will be bound to it.
+      </p>
+      <pre>
+var buttonView = {
+  label   : 'underscore',
+  onClick : function(){ alert('clicked: ' + this.label); },
+  onHover : function(){ console.log('hovering: ' + this.label); }
+};
+_.bindAll(buttonView);
+jQuery('#underscore_button').bind('click', buttonView.onClick);
+=&gt; When the button is clicked, this.label will have the correct value...
+</pre>
+
+      <p id="partial">
+        <b class="header">partial</b><code>_.partial(function, [*arguments])</code>
+        <br />
+        Partially apply a function by filling in any number of its arguments,
+        <i>without</i> changing its dynamic <tt>this</tt> value. A close cousin
+        of <a href="#bind">bind</a>.
+      </p>
+      <pre>
+var add = function(a, b) { return a + b; };
+add5 = _.partial(add, 5);
+add5(10);
+=&gt; 15
+</pre>
+
+      <p id="memoize">
+        <b class="header">memoize</b><code>_.memoize(function, [hashFunction])</code>
+        <br />
+        Memoizes a given <b>function</b> by caching the computed result. Useful
+        for speeding up slow-running computations. If passed an optional
+        <b>hashFunction</b>, it will be used to compute the hash key for storing
+        the result, based on the arguments to the original function. The default
+        <b>hashFunction</b> just uses the first argument to the memoized function
+        as the key.
+      </p>
+      <pre>
+var fibonacci = _.memoize(function(n) {
+  return n &lt; 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
+});
+</pre>
+
+      <p id="delay">
+        <b class="header">delay</b><code>_.delay(function, wait, [*arguments])</code>
+        <br />
+        Much like <b>setTimeout</b>, invokes <b>function</b> after <b>wait</b>
+        milliseconds. If you pass the optional <b>arguments</b>, they will be
+        forwarded on to the <b>function</b> when it is invoked.
+      </p>
+      <pre>
+var log = _.bind(console.log, console);
+_.delay(log, 1000, 'logged later');
+=&gt; 'logged later' // Appears after one second.
+</pre>
+
+      <p id="defer">
+        <b class="header">defer</b><code>_.defer(function, [*arguments])</code>
+        <br />
+        Defers invoking the <b>function</b> until the current call stack has cleared,
+        similar to using <b>setTimeout</b> with a delay of 0. Useful for performing
+        expensive computations or HTML rendering in chunks without blocking the UI thread
+        from updating. If you pass the optional <b>arguments</b>, they will be
+        forwarded on to the <b>function</b> when it is invoked.
+      </p>
+      <pre>
+_.defer(function(){ alert('deferred'); });
+// Returns from the function before the alert runs.
+</pre>
+
+      <p id="throttle">
+        <b class="header">throttle</b><code>_.throttle(function, wait)</code>
+        <br />
+        Creates and returns a new, throttled version of the passed function,
+        that, when invoked repeatedly, will only actually call the original function
+        at most once per every <b>wait</b>
+        milliseconds. Useful for rate-limiting events that occur faster than you
+        can keep up with.
+      </p>
+      <pre>
+var throttled = _.throttle(updatePosition, 100);
+$(window).scroll(throttled);
+</pre>
+
+      <p id="debounce">
+        <b class="header">debounce</b><code>_.debounce(function, wait, [immediate])</code>
+        <br />
+        Creates and returns a new debounced version of the passed function that
+        will postpone its execution until after
+        <b>wait</b> milliseconds have elapsed since the last time it
+        was invoked. Useful for implementing behavior that should only happen
+        <i>after</i> the input has stopped arriving. For example: rendering a
+        preview of a Markdown comment, recalculating a layout after the window
+        has stopped being resized, and so on.
+      </p>
+
+      <p>
+        Pass <tt>true</tt> for the <b>immediate</b> parameter to cause
+        <b>debounce</b> to trigger the function on the leading instead of the
+        trailing edge of the <b>wait</b> interval. Useful in circumstances like
+        preventing accidental double-clicks on a "submit" button from firing a
+        second time.
+      </p>
+
+      <pre>
+var lazyLayout = _.debounce(calculateLayout, 300);
+$(window).resize(lazyLayout);
+</pre>
+
+      <p id="once">
+        <b class="header">once</b><code>_.once(function)</code>
+        <br />
+        Creates a version of the function that can only be called one time.
+        Repeated calls to the modified function will have no effect, returning
+        the value from the original call. Useful for initialization functions,
+        instead of having to set a boolean flag and then check it later.
+      </p>
+      <pre>
+var initialize = _.once(createApplication);
+initialize();
+initialize();
+// Application is only created once.
+</pre>
+
+      <p id="after">
+        <b class="header">after</b><code>_.after(count, function)</code>
+        <br />
+        Creates a version of the function that will only be run after first
+        being called <b>count</b> times. Useful for grouping asynchronous responses,
+        where you want to be sure that all the async calls have finished, before
+        proceeding.
+      </p>
+      <pre>
+var renderNotes = _.after(notes.length, render);
+_.each(notes, function(note) {
+  note.asyncSave({success: renderNotes});
+});
+// renderNotes is run once, after all notes have saved.
+</pre>
+
+      <p id="wrap">
+        <b class="header">wrap</b><code>_.wrap(function, wrapper)</code>
+        <br />
+        Wraps the first <b>function</b> inside of the <b>wrapper</b> function,
+        passing it as the first argument. This allows the <b>wrapper</b> to
+        execute code before and after the <b>function</b> runs, adjust the arguments,
+        and execute it conditionally.
+      </p>
+      <pre>
+var hello = function(name) { return "hello: " + name; };
+hello = _.wrap(hello, function(func) {
+  return "before, " + func("moe") + ", after";
+});
+hello();
+=&gt; 'before, hello: moe, after'
+</pre>
+
+      <p id="compose">
+        <b class="header">compose</b><code>_.compose(*functions)</code>
+        <br />
+        Returns the composition of a list of <b>functions</b>, where each function
+        consumes the return value of the function that follows. In math terms,
+        composing the functions <i>f()</i>, <i>g()</i>, and <i>h()</i> produces
+        <i>f(g(h()))</i>.
+      </p>
+      <pre>
+var greet    = function(name){ return "hi: " + name; };
+var exclaim  = function(statement){ return statement + "!"; };
+var welcome = _.compose(exclaim, greet);
+welcome('moe');
+=&gt; 'hi: moe!'
+</pre>
+
+      <h2 id="objects">Object Functions</h2>
+
+      <p id="keys">
+        <b class="header">keys</b><code>_.keys(object)</code>
+        <br />
+        Retrieve all the names of the <b>object</b>'s properties.
+      </p>
+      <pre>
+_.keys({one : 1, two : 2, three : 3});
+=&gt; ["one", "two", "three"]
+</pre>
+
+      <p id="values">
+        <b class="header">values</b><code>_.values(object)</code>
+        <br />
+        Return all of the values of the <b>object</b>'s properties.
+      </p>
+      <pre>
+_.values({one : 1, two : 2, three : 3});
+=&gt; [1, 2, 3]
+</pre>
+
+      <p id="pairs">
+        <b class="header">pairs</b><code>_.pairs(object)</code>
+        <br />
+        Convert an object into a list of <tt>[key, value]</tt> pairs.
+      </p>
+      <pre>
+_.pairs({one: 1, two: 2, three: 3});
+=&gt; [["one", 1], ["two", 2], ["three", 3]]
+</pre>
+
+      <p id="invert">
+        <b class="header">invert</b><code>_.invert(object)</code>
+        <br />
+        Returns a copy of the <b>object</b> where the keys have become the values
+        and the values the keys. For this to work, all of your object's values
+        should be unique and string serializable.
+      </p>
+      <pre>
+_.invert({Moe: "Moses", Larry: "Louis", Curly: "Jerome"});
+=&gt; {Moses: "Moe", Louis: "Larry", Jerome: "Curly"};
+</pre>
+
+      <p id="object-functions">
+        <b class="header">functions</b><code>_.functions(object)</code>
+        <span class="alias">Alias: <b>methods</b></span>
+        <br />
+        Returns a sorted list of the names of every method in an object &mdash;
+        that is to say, the name of every function property of the object.
+      </p>
+      <pre>
+_.functions(_);
+=&gt; ["all", "any", "bind", "bindAll", "clone", "compact", "compose" ...
+</pre>
+
+      <p id="extend">
+        <b class="header">extend</b><code>_.extend(destination, *sources)</code>
+        <br />
+        Copy all of the properties in the <b>source</b> objects over to the
+        <b>destination</b> object, and return the <b>destination</b> object.
+        It's in-order, so the last source will override properties of the same
+        name in previous arguments.
+      </p>
+      <pre>
+_.extend({name : 'moe'}, {age : 50});
+=&gt; {name : 'moe', age : 50}
+</pre>
+
+      <p id="pick">
+        <b class="header">pick</b><code>_.pick(object, *keys)</code>
+        <br />
+        Return a copy of the <b>object</b>, filtered to only have values for
+        the whitelisted <b>keys</b> (or array of valid keys).
+      </p>
+      <pre>
+_.pick({name : 'moe', age: 50, userid : 'moe1'}, 'name', 'age');
+=&gt; {name : 'moe', age : 50}
+</pre>
+
+      <p id="omit">
+        <b class="header">omit</b><code>_.omit(object, *keys)</code>
+        <br />
+        Return a copy of the <b>object</b>, filtered to omit the blacklisted
+        <b>keys</b> (or array of keys).
+      </p>
+      <pre>
+_.omit({name : 'moe', age : 50, userid : 'moe1'}, 'userid');
+=&gt; {name : 'moe', age : 50}
+</pre>
+
+      <p id="defaults">
+        <b class="header">defaults</b><code>_.defaults(object, *defaults)</code>
+        <br />
+        Fill in null and undefined properties in <b>object</b> with values from the
+        <b>defaults</b> objects, and return the <b>object</b>. As soon as the
+        property is filled, further defaults will have no effect.
+      </p>
+      <pre>
+var iceCream = {flavor : "chocolate"};
+_.defaults(iceCream, {flavor : "vanilla", sprinkles : "lots"});
+=&gt; {flavor : "chocolate", sprinkles : "lots"}
+</pre>
+
+      <p id="clone">
+        <b class="header">clone</b><code>_.clone(object)</code>
+        <br />
+        Create a shallow-copied clone of the <b>object</b>. Any nested objects
+        or arrays will be copied by reference, not duplicated.
+      </p>
+      <pre>
+_.clone({name : 'moe'});
+=&gt; {name : 'moe'};
+</pre>
+
+      <p id="tap">
+        <b class="header">tap</b><code>_.tap(object, interceptor)</code>
+        <br />
+        Invokes <b>interceptor</b> with the <b>object</b>, and then returns <b>object</b>.
+        The primary purpose of this method is to "tap into" a method chain, in order to perform operations on intermediate results within the chain.
+      </p>
+      <pre>
+_.chain([1,2,3,200])
+  .filter(function(num) { return num % 2 == 0; })
+  .tap(alert)
+  .map(function(num) { return num * num })
+  .value();
+=&gt; // [2, 200] (alerted)
+=&gt; [4, 40000]
+</pre>
+
+      <p id="has">
+        <b class="header">has</b><code>_.has(object, key)</code>
+        <br />
+        Does the object contain the given key? Identical to
+        <tt>object.hasOwnProperty(key)</tt>, but uses a safe reference to the
+        <tt>hasOwnProperty</tt> function, in case it's been
+        <a href="http://www.devthought.com/2012/01/18/an-object-is-not-a-hash/">overridden accidentally</a>.
+      </p>
+      <pre>
+_.has({a: 1, b: 2, c: 3}, "b");
+=&gt; true
+</pre>
+
+      <p id="isEqual">
+        <b class="header">isEqual</b><code>_.isEqual(object, other)</code>
+        <br />
+        Performs an optimized deep comparison between the two objects, to determine
+        if they should be considered equal.
+      </p>
+      <pre>
+var moe   = {name : 'moe', luckyNumbers : [13, 27, 34]};
+var clone = {name : 'moe', luckyNumbers : [13, 27, 34]};
+moe == clone;
+=&gt; false
+_.isEqual(moe, clone);
+=&gt; true
+</pre>
+
+      <p id="isEmpty">
+        <b class="header">isEmpty</b><code>_.isEmpty(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> contains no values.
+      </p>
+      <pre>
+_.isEmpty([1, 2, 3]);
+=&gt; false
+_.isEmpty({});
+=&gt; true
+</pre>
+
+      <p id="isElement">
+        <b class="header">isElement</b><code>_.isElement(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is a DOM element.
+      </p>
+      <pre>
+_.isElement(jQuery('body')[0]);
+=&gt; true
+</pre>
+
+      <p id="isArray">
+        <b class="header">isArray</b><code>_.isArray(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is an Array.
+      </p>
+      <pre>
+(function(){ return _.isArray(arguments); })();
+=&gt; false
+_.isArray([1,2,3]);
+=&gt; true
+</pre>
+
+      <p id="isObject">
+        <b class="header">isObject</b><code>_.isObject(value)</code>
+        <br />
+        Returns <i>true</i> if <b>value</b> is an Object. Note that JavaScript
+        arrays and functions are objects, while (normal) strings and numbers are not.
+      </p>
+      <pre>
+_.isObject({});
+=&gt; true
+_.isObject(1);
+=&gt; false
+</pre>
+
+      <p id="isArguments">
+        <b class="header">isArguments</b><code>_.isArguments(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is an Arguments object.
+      </p>
+      <pre>
+(function(){ return _.isArguments(arguments); })(1, 2, 3);
+=&gt; true
+_.isArguments([1,2,3]);
+=&gt; false
+</pre>
+
+      <p id="isFunction">
+        <b class="header">isFunction</b><code>_.isFunction(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is a Function.
+      </p>
+      <pre>
+_.isFunction(alert);
+=&gt; true
+</pre>
+
+      <p id="isString">
+        <b class="header">isString</b><code>_.isString(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is a String.
+      </p>
+      <pre>
+_.isString("moe");
+=&gt; true
+</pre>
+
+      <p id="isNumber">
+        <b class="header">isNumber</b><code>_.isNumber(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is a Number (including <tt>NaN</tt>).
+      </p>
+      <pre>
+_.isNumber(8.4 * 5);
+=&gt; true
+</pre>
+
+      <p id="isFinite">
+        <b class="header">isFinite</b><code>_.isFinite(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is a finite Number.
+      </p>
+      <pre>
+_.isFinite(-101);
+=&gt; true
+
+_.isFinite(-Infinity);
+=&gt; false
+</pre>
+
+      <p id="isBoolean">
+        <b class="header">isBoolean</b><code>_.isBoolean(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is either <i>true</i> or <i>false</i>.
+      </p>
+      <pre>
+_.isBoolean(null);
+=&gt; false
+</pre>
+
+      <p id="isDate">
+        <b class="header">isDate</b><code>_.isDate(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is a Date.
+      </p>
+      <pre>
+_.isDate(new Date());
+=&gt; true
+</pre>
+
+      <p id="isRegExp">
+        <b class="header">isRegExp</b><code>_.isRegExp(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is a RegExp.
+      </p>
+      <pre>
+_.isRegExp(/moe/);
+=&gt; true
+</pre>
+
+      <p id="isNaN">
+        <b class="header">isNaN</b><code>_.isNaN(object)</code>
+        <br />
+        Returns <i>true</i> if <b>object</b> is <i>NaN</i>.<br /> Note: this is not
+        the same as the native <b>isNaN</b> function, which will also return
+        true if the variable is <i>undefined</i>.
+      </p>
+      <pre>
+_.isNaN(NaN);
+=&gt; true
+isNaN(undefined);
+=&gt; true
+_.isNaN(undefined);
+=&gt; false
+</pre>
+
+      <p id="isNull">
+        <b class="header">isNull</b><code>_.isNull(object)</code>
+        <br />
+        Returns <i>true</i> if the value of <b>object</b> is <i>null</i>.
+      </p>
+      <pre>
+_.isNull(null);
+=&gt; true
+_.isNull(undefined);
+=&gt; false
+</pre>
+
+      <p id="isUndefined">
+        <b class="header">isUndefined</b><code>_.isUndefined(value)</code>
+        <br />
+        Returns <i>true</i> if <b>value</b> is <i>undefined</i>.
+      </p>
+      <pre>
+_.isUndefined(window.missingVariable);
+=&gt; true
+</pre>
+
+      <h2 id="utility">Utility Functions</h2>
+
+      <p id="noConflict">
+        <b class="header">noConflict</b><code>_.noConflict()</code>
+        <br />
+        Give control of the "_" variable back to its previous owner. Returns
+        a reference to the <b>Underscore</b> object.
+      </p>
+      <pre>
+var underscore = _.noConflict();</pre>
+
+      <p id="identity">
+        <b class="header">identity</b><code>_.identity(value)</code>
+        <br />
+        Returns the same value that is used as the argument. In math:
+        <tt>f(x) = x</tt><br />
+        This function looks useless, but is used throughout Underscore as
+        a default iterator.
+      </p>
+      <pre>
+var moe = {name : 'moe'};
+moe === _.identity(moe);
+=&gt; true</pre>
+
+      <p id="times">
+        <b class="header">times</b><code>_.times(n, iterator, [context])</code>
+        <br />
+        Invokes the given iterator function <b>n</b> times. Each invocation of
+        <b>iterator</b> is called with an <tt>index</tt> argument.
+        <br />
+        <i>Note: this example uses the <a href="#chaining">chaining syntax</a></i>.
+      </p>
+      <pre>
+_(3).times(function(n){ genie.grantWishNumber(n); });</pre>
+
+      <p id="random">
+        <b class="header">random</b><code>_.random(min, max)</code>
+        <br />
+        Returns a random integer between <b>min</b> and <b>max</b>, inclusive.
+        If you only pass one argument, it will return a number between <tt>0</tt>
+        and that number.
+      </p>
+      <pre>
+_.random(0, 100);
+=&gt; 42</pre>
+
+      <p id="mixin">
+        <b class="header">mixin</b><code>_.mixin(object)</code>
+        <br />
+        Allows you to extend Underscore with your own utility functions. Pass
+        a hash of <tt>{name: function}</tt> definitions to have your functions
+        added to the Underscore object, as well as the OOP wrapper.
+      </p>
+      <pre>
+_.mixin({
+  capitalize : function(string) {
+    return string.charAt(0).toUpperCase() + string.substring(1).toLowerCase();
+  }
+});
+_("fabio").capitalize();
+=&gt; "Fabio"
+</pre>
+
+      <p id="uniqueId">
+        <b class="header">uniqueId</b><code>_.uniqueId([prefix])</code>
+        <br />
+        Generate a globally-unique id for client-side models or DOM elements
+        that need one. If <b>prefix</b> is passed, the id will be appended to it.
+      </p>
+      <pre>
+_.uniqueId('contact_');
+=&gt; 'contact_104'</pre>
+
+      <p id="escape">
+        <b class="header">escape</b><code>_.escape(string)</code>
+        <br />
+        Escapes a string for insertion into HTML, replacing
+        <tt>&amp;</tt>, <tt>&lt;</tt>, <tt>&gt;</tt>, <tt>&quot;</tt>, <tt>&#x27;</tt>, and <tt>&#x2F;</tt> characters.
+      </p>
+      <pre>
+_.escape('Curly, Larry &amp; Moe');
+=&gt; "Curly, Larry &amp;amp; Moe"</pre>
+
+      <p id="unescape">
+        <b class="header">unescape</b><code>_.unescape(string)</code>
+        <br />
+        The opposite of <a href="#escape"><b>escape</b></a>, replaces
+        <tt>&amp;amp;</tt>, <tt>&amp;lt;</tt>, <tt>&amp;gt;</tt>,
+        <tt>&amp;quot;</tt>, <tt>&amp;#x27;</tt>, and <tt>&amp;#x2F;</tt>
+        with their unescaped counterparts.
+      </p>
+      <pre>
+_.unescape('Curly, Larry &amp;amp; Moe');
+=&gt; "Curly, Larry &amp; Moe"</pre>
+
+      <p id="result">
+        <b class="header">result</b><code>_.result(object, property)</code>
+        <br />
+        If the value of the named property is a function then invoke it; otherwise, return it.
+      </p>
+      <pre>
+var object = {cheese: 'crumpets', stuff: function(){ return 'nonsense'; }};
+_.result(object, 'cheese');
+=&gt; "crumpets"
+_.result(object, 'stuff');
+=&gt; "nonsense"</pre>
+
+      <p id="template">
+        <b class="header">template</b><code>_.template(templateString, [data], [settings])</code>
+        <br />
+        Compiles JavaScript templates into functions that can be evaluated
+        for rendering. Useful for rendering complicated bits of HTML from JSON
+        data sources. Template functions can both interpolate variables, using
+        <tt>&lt;%= &hellip; %&gt;</tt>, as well as execute arbitrary JavaScript code, with
+        <tt>&lt;% &hellip; %&gt;</tt>. If you wish to interpolate a value, and have
+        it be HTML-escaped, use <tt>&lt;%- &hellip; %&gt;</tt> When you evaluate a template function, pass in a
+        <b>data</b> object that has properties corresponding to the template's free
+        variables. If you're writing a one-off, you can pass the <b>data</b>
+        object as the second parameter to <b>template</b> in order to render
+        immediately instead of returning a template function.  The <b>settings</b> argument
+        should be a hash containing any <tt>_.templateSettings</tt> that should be overridden.
+      </p>
+
+      <pre>
+var compiled = _.template("hello: &lt;%= name %&gt;");
+compiled({name : 'moe'});
+=&gt; "hello: moe"
+
+var list = "&lt;% _.each(people, function(name) { %&gt; &lt;li&gt;&lt;%= name %&gt;&lt;/li&gt; &lt;% }); %&gt;";
+_.template(list, {people : ['moe', 'curly', 'larry']});
+=&gt; "&lt;li&gt;moe&lt;/li&gt;&lt;li&gt;curly&lt;/li&gt;&lt;li&gt;larry&lt;/li&gt;"
+
+var template = _.template("&lt;b&gt;&lt;%- value %&gt;&lt;/b&gt;");
+template({value : '&lt;script&gt;'});
+=&gt; "&lt;b&gt;&amp;lt;script&amp;gt;&lt;/b&gt;"</pre>
+
+      <p>
+        You can also use <tt>print</tt> from within JavaScript code.  This is
+        sometimes more convenient than using <tt>&lt;%= ... %&gt;</tt>.
+      </p>
+
+      <pre>
+var compiled = _.template("&lt;% print('Hello ' + epithet); %&gt;");
+compiled({epithet: "stooge"});
+=&gt; "Hello stooge."</pre>
+
+      <p>
+        If ERB-style delimiters aren't your cup of tea, you can change Underscore's
+        template settings to use different symbols to set off interpolated code.
+        Define an <b>interpolate</b> regex to match expressions that should be
+        interpolated verbatim, an <b>escape</b> regex to match expressions that should
+        be inserted after being HTML escaped, and an <b>evaluate</b> regex to match
+        expressions that should be evaluated without insertion into the resulting
+        string. You may define or omit any combination of the three.
+        For example, to perform
+        <a href="http://github.com/janl/mustache.js#readme">Mustache.js</a>
+        style templating:
+      </p>
+
+      <pre>
+_.templateSettings = {
+  interpolate : /\{\{(.+?)\}\}/g
+};
+
+var template = _.template("Hello {{ name }}!");
+template({name : "Mustache"});
+=&gt; "Hello Mustache!"</pre>
+
+      <p>
+        By default, <b>template</b> places the values from your data in the local scope
+        via the <tt>with</tt> statement.  However, you can specify a single variable name
+        with the <b>variable</b> setting. This can significantly improve the speed
+        at which a template is able to render.
+      </p>
+
+      <pre>
+_.template("Using 'with': <%= data.answer %>", {answer: 'no'}, {variable: 'data'});
+=&gt; "Using 'with': no"</pre>
+
+      <p>
+        Precompiling your templates can be a big help when debugging errors you can't
+        reproduce.  This is because precompiled templates can provide line numbers and
+        a stack trace, something that is not possible when compiling templates on the client.
+        The <b>source</b> property is available on the compiled template
+        function for easy precompilation.
+      </p>
+
+      <pre>&lt;script&gt;
+  JST.project = <%= _.template(jstText).source %>;
+&lt;/script&gt;</pre>
+
+
+      <h2 id="chaining">Chaining</h2>
+
+      <p>
+        You can use Underscore in either an object-oriented or a functional style,
+        depending on your preference. The following two lines of code are
+        identical ways to double a list of numbers.
+      </p>
+
+    <pre>
+_.map([1, 2, 3], function(n){ return n * 2; });
+_([1, 2, 3]).map(function(n){ return n * 2; });</pre>
+
+      <p>
+        Calling <tt>chain</tt> will cause all future method calls to return
+        wrapped objects. When you've finished the computation, use
+        <tt>value</tt> to retrieve the final value. Here's an example of chaining
+        together a <b>map/flatten/reduce</b>, in order to get the word count of
+        every word in a song.
+      </p>
+
+<pre>
+var lyrics = [
+  {line : 1, words : "I'm a lumberjack and I'm okay"},
+  {line : 2, words : "I sleep all night and I work all day"},
+  {line : 3, words : "He's a lumberjack and he's okay"},
+  {line : 4, words : "He sleeps all night and he works all day"}
+];
+
+_.chain(lyrics)
+  .map(function(line) { return line.words.split(' '); })
+  .flatten()
+  .reduce(function(counts, word) {
+    counts[word] = (counts[word] || 0) + 1;
+    return counts;
+  }, {})
+  .value();
+
+=&gt; {lumberjack : 2, all : 4, night : 2 ... }</pre>
+
+      <p>
+        In addition, the
+        <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/prototype">Array prototype's methods</a>
+        are proxied through the chained Underscore object, so you can slip a
+        <tt>reverse</tt> or a <tt>push</tt> into your chain, and continue to
+        modify the array.
+      </p>
+
+      <p id="chain">
+        <b class="header">chain</b><code>_.chain(obj)</code>
+        <br />
+        Returns a wrapped object. Calling methods on this object will continue
+        to return wrapped objects until <tt>value</tt> is used.
+      </p>
+      <pre>
+var stooges = [{name : 'curly', age : 25}, {name : 'moe', age : 21}, {name : 'larry', age : 23}];
+var youngest = _.chain(stooges)
+  .sortBy(function(stooge){ return stooge.age; })
+  .map(function(stooge){ return stooge.name + ' is ' + stooge.age; })
+  .first()
+  .value();
+=&gt; "moe is 21"
+</pre>
+
+      <p id="value">
+        <b class="header">value</b><code>_(obj).value()</code>
+        <br />
+        Extracts the value of a wrapped object.
+      </p>
+      <pre>
+_([1, 2, 3]).value();
+=&gt; [1, 2, 3]
+</pre>
+
+      <h2 id="links">Links &amp; Suggested Reading</h2>
+
+      <p>
+        The Underscore documentation is also available in
+        <a href="http://learning.github.com/underscore/">Simplified Chinese</a>.
+      </p>
+
+      <p>
+        <a href="http://mirven.github.com/underscore.lua/">Underscore.lua</a>,
+        a Lua port of the functions that are applicable in both languages.
+        Includes OOP-wrapping and chaining.
+        (<a href="http://github.com/mirven/underscore.lua">source</a>)
+      </p>
+
+      <p>
+        <a href="http://underscorem.org">Underscore.m</a>, an Objective-C port
+        of many of the Underscore.js functions, using a syntax that encourages
+        chaining.
+        (<a href="https://github.com/robb/Underscore.m">source</a>)
+      </p>
+
+      <p>
+        <a href="http://kmalakoff.github.com/_.m/">_.m</a>, an alternative
+        Objective-C port that tries to stick a little closer to the original
+        Underscore.js API.
+        (<a href="https://github.com/kmalakoff/_.m">source</a>)
+      </p>
+
+      <p>
+        <a href="http://brianhaveri.github.com/Underscore.php/">Underscore.php</a>,
+        a PHP port of the functions that are applicable in both languages.
+        Includes OOP-wrapping and chaining.
+        (<a href="http://github.com/brianhaveri/Underscore.php">source</a>)
+      </p>
+
+      <p>
+        <a href="http://vti.github.com/underscore-perl/">Underscore-perl</a>,
+        a Perl port of many of the Underscore.js functions,
+        aimed at on Perl hashes and arrays.
+        (<a href="https://github.com/vti/underscore-perl/">source</a>)
+      </p>
+
+      <p>
+        <a href="http://russplaysguitar.github.com/UnderscoreCF/">Underscore.cfc</a>,
+        a Coldfusion port of many of the Underscore.js functions.
+        (<a href="https://github.com/russplaysguitar/underscorecf">source</a>)
+      </p>
+
+      <p>
+        <a href="https://github.com/edtsech/underscore.string">Underscore.string</a>,
+        an Underscore extension that adds functions for string-manipulation:
+        <tt>trim</tt>, <tt>startsWith</tt>, <tt>contains</tt>, <tt>capitalize</tt>,
+        <tt>reverse</tt>, <tt>sprintf</tt>, and more.
+      </p>
+
+      <p>
+        Ruby's <a href="http://ruby-doc.org/core/classes/Enumerable.html">Enumerable</a> module.
+      </p>
+
+      <p>
+        <a href="http://www.prototypejs.org/">Prototype.js</a>, which provides
+        JavaScript with collection functions in the manner closest to Ruby's Enumerable.
+      </p>
+
+      <p>
+        Oliver Steele's
+        <a href="http://osteele.com/sources/javascript/functional/">Functional JavaScript</a>,
+        which includes comprehensive higher-order function support as well as string lambdas.
+      </p>
+
+      <p>
+        Michael Aufreiter's <a href="http://github.com/michael/data">Data.js</a>,
+        a data manipulation + persistence library for JavaScript.
+      </p>
+
+      <p>
+        Python's <a href="http://docs.python.org/library/itertools.html">itertools</a>.
+      </p>
+
+      <h2 id="changelog">Change Log</h2>
+
+      <p>
+        <b class="header">1.4.4</b> &mdash; <small><i>Jan. 30, 2013</i></small> &mdash; <a href="https://github.com/documentcloud/underscore/compare/1.4.3...1.4.4">Diff</a><br />
+        <ul>
+          <li>
+            Added <tt>_.findWhere</tt>, for finding the first element in a list
+            that matches a particular set of keys and values.
+          </li>
+          <li>
+            Added <tt>_.partial</tt>, for partially applying a function <i>without</i>
+            changing its dynamic reference to <tt>this</tt>.
+          </li>
+          <li>
+            Simplified <tt>bind</tt> by removing some edge cases involving
+            constructor functions. In short: don't <tt>_.bind</tt> your
+            constructors.
+          </li>
+          <li>
+            A minor optimization to <tt>invoke</tt>.
+          </li>
+          <li>
+            Fix bug in the minified version due to the minifier incorrectly
+            optimizing-away <tt>isFunction</tt>.
+          </li>
+        </ul>
+      </p>
+
+      <p>
+        <b class="header">1.4.3</b> &mdash; <small><i>Dec. 4, 2012</i></small> &mdash; <a href="https://github.com/documentcloud/underscore/compare/1.4.2...1.4.3">Diff</a><br />
+        <ul>
+          <li>
+            Improved Underscore compatibility with Adobe's JS engine that can be
+            used to script Illustrator, Photoshop, and friends.
+          </li>
+          <li>
+            Added a default <tt>_.identity</tt> iterator to <tt>countBy</tt> and
+            <tt>groupBy</tt>.
+          </li>
+          <li>
+            The <tt>uniq</tt> function can now take <tt>array, iterator, context</tt>
+            as the argument list.
+          </li>
+          <li>
+            The <tt>times</tt> function now returns the mapped array of iterator
+            results.
+          </li>
+          <li>
+            Simplified and fixed bugs in <tt>throttle</tt>.
+          </li>
+        </ul>
+      </p>
+
+      <p>
+        <b class="header">1.4.2</b> &mdash; <small><i>Oct. 1, 2012</i></small> &mdash; <a href="https://github.com/documentcloud/underscore/compare/1.4.1...1.4.2">Diff</a><br />
+        <ul>
+          <li>
+            For backwards compatibility, returned to pre-1.4.0 behavior when
+            passing <tt>null</tt> to iteration functions. They now become no-ops
+            again.
+          </li>
+        </ul>
+      </p>
+
+      <p>
+        <b class="header">1.4.1</b> &mdash; <small><i>Oct. 1, 2012</i></small> &mdash; <a href="https://github.com/documentcloud/underscore/compare/1.4.0...1.4.1">Diff</a><br />
+        <ul>
+          <li>
+            Fixed a 1.4.0 regression in the <tt>lastIndexOf</tt> function.
+          </li>
+        </ul>
+      </p>
+
+      <p>
+        <b class="header">1.4.0</b> &mdash; <small><i>Sept. 27, 2012</i></small>  &mdash; <a href="https://github.com/documentcloud/underscore/compare/1.3.3...1.4.0">Diff</a><br />
+        <ul>
+          <li>
+            Added a <tt>pairs</tt> function, for turning a JavaScript object
+            into <tt>[key, value]</tt> pairs ... as well as an <tt>object</tt>
+            function, for converting an array of <tt>[key, value]</tt> pairs
+            into an object.
+          </li>
+          <li>
+            Added a <tt>countBy</tt> function, for counting the number of objects
+            in a list that match a certain criteria.
+          </li>
+          <li>
+            Added an <tt>invert</tt> function, for performing a simple inversion
+            of the keys and values in an object.
+          </li>
+          <li>
+            Added a <tt>where</tt> function, for easy cases of filtering a list
+            for objects with specific values.
+          </li>
+          <li>
+            Added an <tt>omit</tt> function, for filtering an object to remove
+            certain keys.
+          </li>
+          <li>
+            Added a <tt>random</tt> function, to return a random number in a
+            given range.
+          </li>
+          <li>
+            <tt>_.debounce</tt>'d functions now return their last updated value,
+            just like <tt>_.throttle</tt>'d functions do.
+          </li>
+          <li>
+            The <tt>sortBy</tt> function now runs a stable sort algorithm.
+          </li>
+          <li>
+            Added the optional <tt>fromIndex</tt> option to <tt>indexOf</tt> and
+            <tt>lastIndexOf</tt>.
+          </li>
+          <li>
+            "Sparse" arrays are no longer supported in Underscore iteration
+            functions. Use a <tt>for</tt> loop instead (or better yet, an object).
+          </li>
+          <li>
+            The <tt>min</tt> and <tt>max</tt> functions may now be called on
+            <i>very</i> large arrays.
+          </li>
+          <li>
+            Interpolation in templates now represents <tt>null</tt> and
+            <tt>undefined</tt> as the empty string.
+          </li>
+          <li>
+            <del>Underscore iteration functions no longer accept <tt>null</tt> values
+            as a no-op argument. You'll get an early error instead.</del>
+          </li>
+          <li>
+            A number of edge-cases fixes and tweaks, which you can spot in the
+            <a href="https://github.com/documentcloud/underscore/compare/1.3.3...1.4.0">diff</a>.
+            Depending on how you're using Underscore, <b>1.4.0</b> may be more
+            backwards-incompatible than usual &mdash; please test when you upgrade.
+          </li>
+        </ul>
+      </p>
+
+      <p>
+        <b class="header">1.3.3</b> &mdash; <small><i>April 10, 2012</i></small><br />
+        <ul>
+          <li>
+            Many improvements to <tt>_.template</tt>, which now provides the
+            <tt>source</tt> of the template function as a property, for potentially
+            even more efficient pre-compilation on the server-side. You may now
+            also set the <tt>variable</tt> option when creating a template,
+            which will cause your passed-in data to be made available under the
+            variable you named, instead of using a <tt>with</tt> statement &mdash;
+            significantly improving the speed of rendering the template.
+          </li>
+          <li>
+            Added the <tt>pick</tt> function, which allows you to filter an
+            object literal with a whitelist of allowed property names.
+          </li>
+          <li>
+            Added the <tt>result</tt> function, for convenience when working
+            with APIs that allow either functions or raw properties.
+          </li>
+          <li>
+            Added the <tt>isFinite</tt> function, because sometimes knowing that
+            a value is a number just ain't quite enough.
+          </li>
+          <li>
+            The <tt>sortBy</tt> function may now also be passed the string name
+            of a property to use as the sort order on each object.
+          </li>
+          <li>
+            Fixed <tt>uniq</tt> to work with sparse arrays.
+          </li>
+          <li>
+            The <tt>difference</tt> function now performs a shallow flatten
+            instead of a deep one when computing array differences.
+          </li>
+          <li>
+            The <tt>debounce</tt> function now takes an <tt>immediate</tt>
+            parameter, which will cause the callback to fire on the leading
+            instead of the trailing edge.
+          </li>
+        </ul>
+      </p>
+
+      <p>
+        <b class="header">1.3.1</b> &mdash; <small><i>Jan. 23, 2012</i></small><br />
+        <ul>
+          <li>
+            Added an <tt>_.has</tt> function, as a safer way to use <tt>hasOwnProperty</tt>.
+          </li>
+          <li>
+            Added <tt>_.collect</tt> as an alias for <tt>_.map</tt>. Smalltalkers, rejoice.
+          </li>
+          <li>
+            Reverted an old change so that <tt>_.extend</tt> will correctly copy
+            over keys with undefined values again.
+          </li>
+          <li>
+            Bugfix to stop escaping slashes within interpolations in <tt>_.template</tt>.
+          </li>
+        </ul>
+      </p>
+
+      <p>
+        <b class="header">1.3.0</b> &mdash; <small><i>Jan. 11, 2012</i></small><br />
+        <ul>
+          <li>
+            Removed AMD (RequireJS) support from Underscore. If you'd like to use
+            Underscore with RequireJS, you can load it as a normal script, wrap
+            or patch your copy, or download a forked version.
+          </li>
+        </ul>
+      </p>
+
+      <p>
+        <b class="header">1.2.4</b> &mdash; <small><i>Jan. 4, 2012</i></small><br />
+        <ul>
+          <li>
+            You now can (and probably should, as it's simpler)
+            write <tt>_.chain(list)</tt>
+            instead of <tt>_(list).chain()</tt>.
+          </li>
+          <li>
+            Fix for escaped characters in Underscore templates, and for supporting
+            customizations of <tt>_.templateSettings</tt> that only define one or
+            two of the required regexes.
+          </li>
+          <li>
+            Fix for passing an array as the first argument to an <tt>_.wrap</tt>'d function.
+          </li>
+          <li>
+            Improved compatibility with ClojureScript, which adds a <tt>call</tt>
+            function to <tt>String.prototype</tt>.
+          </li>
+        </ul>
+      </p>
+
+      <p>
+        <b class="header">1.2.3</b> &mdash; <small><i>Dec. 7, 2011</i></small><br />
+        <ul>
+          <li>
+            Dynamic scope is now preserved for compiled <tt>_.template</tt> functions,
+            so you can use the value of <tt>this</tt> if you like.
+          </li>
+          <li>
+            Sparse array support of <tt>_.indexOf</tt>, <tt>_.lastIndexOf</tt>.
+          </li>
+          <li>
+            Both <tt>_.reduce</tt> and <tt>_.reduceRight</tt> can now be passed an
+            explicitly <tt>undefined</tt> value. (There's no reason why you'd
+            want to do this.)
+          </li>
+        </ul>
+      </p>
+
+      <p>
+        <b class="header">1.2.2</b> &mdash; <small><i>Nov. 14, 2011</i></small><br />
+        <ul>
+          <li>
+            Continued tweaks to <tt>_.isEqual</tt> semantics. Now JS primitives are
+            considered equivalent to their wrapped versions, and arrays are compared
+            by their numeric properties only <small>(#351)</small>.
+          </li>
+          <li>
+            <tt>_.escape</tt> no longer tries to be smart about not double-escaping
+            already-escaped HTML entities. Now it just escapes regardless <small>(#350)</small>.
+          </li>
+          <li>
+            In <tt>_.template</tt>, you may now leave semicolons out of evaluated
+            statements if you wish: <tt>&lt;% }) %&gt;</tt> <small>(#369)</small>.
+          </li>
+          <li>
+            <tt>_.after(callback, 0)</tt> will now trigger the callback immediately,
+            making "after" easier to use with asynchronous APIs <small>(#366)</small>.
+          </li>
+        </ul>
+      </p>
+
+      <p>
+        <b class="header">1.2.1</b> &mdash; <small><i>Oct. 24, 2011</i></small><br />
+        <ul>
+          <li>
+            Several important bug fixes for <tt>_.isEqual</tt>, which should now
+            do better on mutated Arrays, and on non-Array objects with
+            <tt>length</tt> properties. <small>(#329)</small>
+          </li>
+          <li>
+            <b>jrburke</b> contributed Underscore exporting for AMD module loaders,
+            and <b>tonylukasavage</b> for Appcelerator Titanium.
+            <small>(#335, #338)</small>
+          </li>
+          <li>
+            You can now <tt>_.groupBy(list, 'property')</tt> as a shortcut for
+            grouping values by a particular common property.
+          </li>
+          <li>
+            <tt>_.throttle</tt>'d functions now fire immediately upon invocation,
+            and are rate-limited thereafter <small>(#170, #266)</small>.
+          </li>
+          <li>
+            Most of the <tt>_.is[Type]</tt> checks no longer ducktype.
+          </li>
+          <li>
+            The <tt>_.bind</tt> function now also works on constructors, a-la
+            ES5 ... but you would never want to use <tt>_.bind</tt> on a
+            constructor function.
+          </li>
+          <li>
+            <tt>_.clone</tt> no longer wraps non-object types in Objects.
+          </li>
+          <li>
+            <tt>_.find</tt> and <tt>_.filter</tt> are now the preferred names for
+            <tt>_.detect</tt> and <tt>_.select</tt>.
+          </li>
+        </ul>
+      </p>
+
+      <p>
+        <b class="header">1.2.0</b> &mdash; <small><i>Oct. 5, 2011</i></small><br />
+        <ul>
+          <li>
+            The <tt>_.isEqual</tt> function now
+            supports true deep equality comparisons, with checks for cyclic structures,
+            thanks to Kit Cambridge.
+          </li>
+          <li>
+            Underscore templates now support HTML escaping interpolations, using
+            <tt>&lt;%- ... %&gt;</tt> syntax.
+          </li>
+          <li>
+            Ryan Tenney contributed <tt>_.shuffle</tt>, which uses a modified
+            Fisher-Yates to give you a shuffled copy of an array.
+          </li>
+          <li>
+            <tt>_.uniq</tt> can now be passed an optional iterator, to determine by
+            what criteria an object should be considered unique.
+          </li>
+          <li>
+            <tt>_.last</tt> now takes an optional argument which will return the last
+            N elements of the list.
+          </li>
+          <li>
+            A new <tt>_.initial</tt> function was added, as a mirror of <tt>_.rest</tt>,
+            which returns all the initial values of a list (except the last N).
+          </li>
+        </ul>
+      </p>
+
+      <p>
+        <b class="header">1.1.7</b> &mdash; <small><i>July 13, 2011</i></small><br />
+        Added <tt>_.groupBy</tt>, which aggregates a collection into groups of like items.
+        Added <tt>_.union</tt> and <tt>_.difference</tt>, to complement the
+        (re-named) <tt>_.intersection</tt>.
+        Various improvements for support of sparse arrays.
+        <tt>_.toArray</tt> now returns a clone, if directly passed an array.
+        <tt>_.functions</tt> now also returns the names of functions that are present
+        in the prototype chain.
+      </p>
+
+      <p>
+        <b class="header">1.1.6</b> &mdash; <small><i>April 18, 2011</i></small><br />
+        Added <tt>_.after</tt>, which will return a function that only runs after
+        first being called a specified number of times.
+        <tt>_.invoke</tt> can now take a direct function reference.
+        <tt>_.every</tt> now requires an iterator function to be passed, which
+        mirrors the ECMA5 API.
+        <tt>_.extend</tt> no longer copies keys when the value is undefined.
+        <tt>_.bind</tt> now errors when trying to bind an undefined value.
+      </p>
+
+      <p>
+        <b class="header">1.1.5</b> &mdash; <small><i>Mar 20, 2011</i></small><br />
+        Added an <tt>_.defaults</tt> function, for use merging together JS objects
+        representing default options.
+        Added an <tt>_.once</tt> function, for manufacturing functions that should
+        only ever execute a single time.
+        <tt>_.bind</tt> now delegates to the native ECMAScript 5 version,
+        where available.
+        <tt>_.keys</tt> now throws an error when used on non-Object values, as in
+        ECMAScript 5.
+        Fixed a bug with <tt>_.keys</tt> when used over sparse arrays.
+      </p>
+
+      <p>
+        <b class="header">1.1.4</b> &mdash; <small><i>Jan 9, 2011</i></small><br />
+        Improved compliance with ES5's Array methods when passing <tt>null</tt>
+        as a value. <tt>_.wrap</tt> now correctly sets <tt>this</tt> for the
+        wrapped function. <tt>_.indexOf</tt> now takes an optional flag for
+        finding the insertion index in an array that is guaranteed to already
+        be sorted. Avoiding the use of <tt>.callee</tt>, to allow <tt>_.isArray</tt>
+        to work properly in ES5's strict mode.
+      </p>
+
+      <p>
+        <b class="header">1.1.3</b> &mdash; <small><i>Dec 1, 2010</i></small><br />
+        In CommonJS, Underscore may now be required with just: <br />
+        <tt>var _ = require("underscore")</tt>.
+        Added <tt>_.throttle</tt> and <tt>_.debounce</tt> functions.
+        Removed <tt>_.breakLoop</tt>, in favor of an ECMA5-style un-<i>break</i>-able
+        each implementation &mdash; this removes the try/catch, and you'll now have
+        better stack traces for exceptions that are thrown within an Underscore iterator.
+        Improved the <b>isType</b> family of functions for better interoperability
+        with Internet Explorer host objects.
+        <tt>_.template</tt> now correctly escapes backslashes in templates.
+        Improved <tt>_.reduce</tt> compatibility with the ECMA5 version:
+        if you don't pass an initial value, the first item in the collection is used.
+        <tt>_.each</tt> no longer returns the iterated collection, for improved
+        consistency with ES5's <tt>forEach</tt>.
+      </p>
+
+      <p>
+        <b class="header">1.1.2</b><br />
+        Fixed <tt>_.contains</tt>, which was mistakenly pointing at
+        <tt>_.intersect</tt> instead of <tt>_.include</tt>, like it should
+        have been. Added <tt>_.unique</tt> as an alias for <tt>_.uniq</tt>.
+      </p>
+
+      <p>
+        <b class="header">1.1.1</b><br />
+        Improved the speed of <tt>_.template</tt>, and its handling of multiline
+        interpolations. Ryan Tenney contributed optimizations to many Underscore
+        functions. An annotated version of the source code is now available.
+      </p>
+
+      <p>
+        <b class="header">1.1.0</b><br />
+        The method signature of <tt>_.reduce</tt> has been changed to match
+        the ECMAScript 5 signature, instead of the Ruby/Prototype.js version.
+        This is a backwards-incompatible change. <tt>_.template</tt> may now be
+        called with no arguments, and preserves whitespace. <tt>_.contains</tt>
+        is a new alias for <tt>_.include</tt>.
+      </p>
+
+      <p>
+        <b class="header">1.0.4</b><br />
+        <a href="http://themoell.com/">Andri MÃ¶ll</a> contributed the <tt>_.memoize</tt>
+        function, which can be used to speed up expensive repeated computations
+        by caching the results.
+      </p>
+
+      <p>
+        <b class="header">1.0.3</b><br />
+        Patch that makes <tt>_.isEqual</tt> return <tt>false</tt> if any property
+        of the compared object has a <tt>NaN</tt> value. Technically the correct
+        thing to do, but of questionable semantics. Watch out for NaN comparisons.
+      </p>
+
+      <p>
+        <b class="header">1.0.2</b><br />
+        Fixes <tt>_.isArguments</tt> in recent versions of Opera, which have
+        arguments objects as real Arrays.
+      </p>
+
+      <p>
+        <b class="header">1.0.1</b><br />
+        Bugfix for <tt>_.isEqual</tt>, when comparing two objects with the same
+        number of undefined keys, but with different names.
+      </p>
+
+      <p>
+        <b class="header">1.0.0</b><br />
+        Things have been stable for many months now, so Underscore is now
+        considered to be out of beta, at <b>1.0</b>. Improvements since <b>0.6</b>
+        include <tt>_.isBoolean</tt>, and the ability to have <tt>_.extend</tt>
+        take multiple source objects.
+      </p>
+
+      <p>
+        <b class="header">0.6.0</b><br />
+        Major release. Incorporates a number of
+        <a href="http://github.com/ratbeard">Mile Frawley's</a> refactors for
+        safer duck-typing on collection functions, and cleaner internals. A new
+        <tt>_.mixin</tt> method that allows you to extend Underscore with utility
+        functions of your own. Added <tt>_.times</tt>, which works the same as in
+        Ruby or Prototype.js. Native support for ECMAScript 5's <tt>Array.isArray</tt>,
+        and <tt>Object.keys</tt>.
+      </p>
+
+      <p>
+        <b class="header">0.5.8</b><br />
+        Fixed Underscore's collection functions to work on
+        <a href="https://developer.mozilla.org/En/DOM/NodeList">NodeLists</a> and
+        <a href="https://developer.mozilla.org/En/DOM/HTMLCollection">HTMLCollections</a>
+        once more, thanks to
+        <a href="http://github.com/jmtulloss">Justin Tulloss</a>.
+      </p>
+
+      <p>
+        <b class="header">0.5.7</b><br />
+        A safer implementation of <tt>_.isArguments</tt>, and a
+        faster <tt>_.isNumber</tt>,<br />thanks to
+        <a href="http://jedschmidt.com/">Jed Schmidt</a>.
+      </p>
+
+      <p>
+        <b class="header">0.5.6</b><br />
+        Customizable delimiters for <tt>_.template</tt>, contributed by
+        <a href="http://github.com/iamnoah">Noah Sloan</a>.
+      </p>
+
+      <p>
+        <b class="header">0.5.5</b><br />
+        Fix for a bug in MobileSafari's OOP-wrapper, with the arguments object.
+      </p>
+
+      <p>
+        <b class="header">0.5.4</b><br />
+        Fix for multiple single quotes within a template string for
+        <tt>_.template</tt>. See:
+        <a href="http://www.west-wind.com/Weblog/posts/509108.aspx">Rick Strahl's blog post</a>.
+      </p>
+
+      <p>
+        <b class="header">0.5.2</b><br />
+        New implementations of <tt>isArray</tt>, <tt>isDate</tt>, <tt>isFunction</tt>,
+        <tt>isNumber</tt>, <tt>isRegExp</tt>, and <tt>isString</tt>, thanks to
+        a suggestion from
+        <a href="http://www.broofa.com/">Robert Kieffer</a>.
+        Instead of doing <tt>Object#toString</tt>
+        comparisons, they now check for expected properties, which is less safe,
+        but more than an order of magnitude faster. Most other Underscore
+        functions saw minor speed improvements as a result.
+        <a href="http://dolzhenko.org/">Evgeniy Dolzhenko</a>
+        contributed <tt>_.tap</tt>,
+        <a href="http://ruby-doc.org/core-1.9/classes/Object.html#M000191">similar to Ruby 1.9's</a>,
+        which is handy for injecting side effects (like logging) into chained calls.
+      </p>
+
+      <p>
+        <b class="header">0.5.1</b><br />
+        Added an <tt>_.isArguments</tt> function. Lots of little safety checks
+        and optimizations contributed by
+        <a href="http://github.com/iamnoah/">Noah Sloan</a> and
+        <a href="http://themoell.com/">Andri MÃ¶ll</a>.
+      </p>
+
+      <p>
+        <b class="header">0.5.0</b><br />
+        <b>[API Changes]</b> <tt>_.bindAll</tt> now takes the context object as
+        its first parameter. If no method names are passed, all of the context
+        object's methods are bound to it, enabling chaining and easier binding.
+        <tt>_.functions</tt> now takes a single argument and returns the names
+        of its Function properties. Calling <tt>_.functions(_)</tt> will get you
+        the previous behavior.
+        Added <tt>_.isRegExp</tt> so that <tt>isEqual</tt> can now test for RegExp equality.
+        All of the "is" functions have been shrunk down into a single definition.
+        <a href="http://github.com/grayrest/">Karl Guertin</a> contributed patches.
+      </p>
+
+      <p>
+        <b class="header">0.4.7</b><br />
+        Added <tt>isDate</tt>, <tt>isNaN</tt>, and <tt>isNull</tt>, for completeness.
+        Optimizations for <tt>isEqual</tt> when checking equality between Arrays
+        or Dates. <tt>_.keys</tt> is now <small><i><b>25%&ndash;2X</b></i></small> faster (depending on your
+        browser) which speeds up the functions that rely on it, such as <tt>_.each</tt>.
+      </p>
+
+      <p>
+        <b class="header">0.4.6</b><br />
+        Added the <tt>range</tt> function, a port of the
+        <a href="http://docs.python.org/library/functions.html#range">Python
+        function of the same name</a>, for generating flexibly-numbered lists
+        of integers. Original patch contributed by
+        <a href="http://github.com/kylichuku">Kirill Ishanov</a>.
+      </p>
+
+      <p>
+        <b class="header">0.4.5</b><br />
+        Added <tt>rest</tt> for Arrays and arguments objects, and aliased
+        <tt>first</tt> as <tt>head</tt>, and <tt>rest</tt> as <tt>tail</tt>,
+        thanks to <a href="http://github.com/lukesutton/">Luke Sutton</a>'s patches.
+        Added tests ensuring that all Underscore Array functions also work on
+        <i>arguments</i> objects.
+      </p>
+
+      <p>
+        <b class="header">0.4.4</b><br />
+        Added <tt>isString</tt>, and <tt>isNumber</tt>, for consistency. Fixed
+        <tt>_.isEqual(NaN, NaN)</tt> to return <i>true</i> (which is debatable).
+      </p>
+
+      <p>
+        <b class="header">0.4.3</b><br />
+        Started using the native <tt>StopIteration</tt> object in browsers that support it.
+        Fixed Underscore setup for CommonJS environments.
+      </p>
+
+      <p>
+        <b class="header">0.4.2</b><br />
+        Renamed the unwrapping function to <tt>value</tt>, for clarity.
+      </p>
+
+      <p>
+        <b class="header">0.4.1</b><br />
+        Chained Underscore objects now support the Array prototype methods, so
+        that you can perform the full range of operations on a wrapped array
+        without having to break your chain. Added a <tt>breakLoop</tt> method
+        to <b>break</b> in the middle of any Underscore iteration. Added an
+        <tt>isEmpty</tt> function that works on arrays and objects.
+      </p>
+
+      <p>
+        <b class="header">0.4.0</b><br />
+        All Underscore functions can now be called in an object-oriented style,
+        like so: <tt>_([1, 2, 3]).map(...);</tt>. Original patch provided by
+        <a href="http://macournoyer.com/">Marc-AndrÃ© Cournoyer</a>.
+        Wrapped objects can be chained through multiple
+        method invocations. A <a href="#object-functions"><tt>functions</tt></a> method
+        was added, providing a sorted list of all the functions in Underscore.
+      </p>
+
+      <p>
+        <b class="header">0.3.3</b><br />
+        Added the JavaScript 1.8 function <tt>reduceRight</tt>. Aliased it
+        as <tt>foldr</tt>, and aliased <tt>reduce</tt> as <tt>foldl</tt>.
+      </p>
+
+      <p>
+        <b class="header">0.3.2</b><br />
+        Now runs on stock <a href="http://www.mozilla.org/rhino/">Rhino</a>
+        interpreters with: <tt>load("underscore.js")</tt>.
+        Added <a href="#identity"><tt>identity</tt></a> as a utility function.
+      </p>
+
+      <p>
+        <b class="header">0.3.1</b><br />
+        All iterators are now passed in the original collection as their third
+        argument, the same as JavaScript 1.6's <b>forEach</b>. Iterating over
+        objects is now called with <tt>(value, key, collection)</tt>, for details
+        see <a href="#each"><tt>_.each</tt></a>.
+      </p>
+
+      <p>
+        <b class="header">0.3.0</b><br />
+        Added <a href="http://github.com/dmitryBaranovskiy">Dmitry Baranovskiy</a>'s
+        comprehensive optimizations, merged in
+        <a href="http://github.com/kriskowal/">Kris Kowal</a>'s patches to make Underscore
+        <a href="http://wiki.commonjs.org/wiki/CommonJS">CommonJS</a> and
+        <a href="http://narwhaljs.org/">Narwhal</a> compliant.
+      </p>
+
+      <p>
+        <b class="header">0.2.0</b><br />
+        Added <tt>compose</tt> and <tt>lastIndexOf</tt>, renamed <tt>inject</tt> to
+        <tt>reduce</tt>, added aliases for <tt>inject</tt>, <tt>filter</tt>,
+        <tt>every</tt>, <tt>some</tt>, and <tt>forEach</tt>.
+      </p>
+
+      <p>
+        <b class="header">0.1.1</b><br />
+        Added <tt>noConflict</tt>, so that the "Underscore" object can be assigned to
+        other variables.
+      </p>
+
+      <p>
+        <b class="header">0.1.0</b><br />
+        Initial release of Underscore.js.
+      </p>
+
+      <p>
+        <a href="http://documentcloud.org/" title="A DocumentCloud Project" style="background:none;">
+          <img src="http://jashkenas.s3.amazonaws.com/images/a_documentcloud_project.png" alt="A DocumentCloud Project" />
+        </a>
+      </p>
+
+    </div>
+
+  </div>
+
+  <!-- Include Underscore, so you can play with it in the console. -->
+  <script type="text/javascript" src="underscore.js"></script>
+
+</body>
+</html>
Index: /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/index.js
===================================================================
--- /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/index.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/index.js	(revision 516)
@@ -0,0 +1,1 @@
+module.exports = require('./underscore');
Index: /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/package.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/package.json	(revision 516)
@@ -0,0 +1,35 @@
+{
+  "name": "underscore",
+  "description": "JavaScript's functional programming helper library.",
+  "homepage": "http://underscorejs.org",
+  "keywords": [
+    "util",
+    "functional",
+    "server",
+    "client",
+    "browser"
+  ],
+  "author": {
+    "name": "Jeremy Ashkenas",
+    "email": "jeremy@documentcloud.org"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/documentcloud/underscore.git"
+  },
+  "main": "underscore.js",
+  "version": "1.4.4",
+  "devDependencies": {
+    "phantomjs": "0.2.2"
+  },
+  "scripts": {
+    "test": "phantomjs test/vendor/runner.js test/index.html?noglobals=true"
+  },
+  "readme": "                       __\n                      /\\ \\                                                         __\n     __  __    ___    \\_\\ \\     __   _ __   ____    ___    ___   _ __    __       /\\_\\    ____\n    /\\ \\/\\ \\ /' _ `\\  /'_  \\  /'__`\\/\\  __\\/ ,__\\  / ___\\ / __`\\/\\  __\\/'__`\\     \\/\\ \\  /',__\\\n    \\ \\ \\_\\ \\/\\ \\/\\ \\/\\ \\ \\ \\/\\  __/\\ \\ \\//\\__, `\\/\\ \\__//\\ \\ \\ \\ \\ \\//\\  __/  __  \\ \\ \\/\\__, `\\\n     \\ \\____/\\ \\_\\ \\_\\ \\___,_\\ \\____\\\\ \\_\\\\/\\____/\\ \\____\\ \\____/\\ \\_\\\\ \\____\\/\\_\\ _\\ \\ \\/\\____/\n      \\/___/  \\/_/\\/_/\\/__,_ /\\/____/ \\/_/ \\/___/  \\/____/\\/___/  \\/_/ \\/____/\\/_//\\ \\_\\ \\/___/\n                                                                                  \\ \\____/\n                                                                                   \\/___/\n\nUnderscore.js is a utility-belt library for JavaScript that provides\nsupport for the usual functional suspects (each, map, reduce, filter...)\nwithout extending any core JavaScript objects.\n\nFor Docs, License, Tests, and pre-packed downloads, see:\nhttp://underscorejs.org\n\nMany thanks to our contributors:\nhttps://github.com/documentcloud/underscore/contributors\n",
+  "readmeFilename": "README.md",
+  "bugs": {
+    "url": "https://github.com/documentcloud/underscore/issues"
+  },
+  "_id": "underscore@1.4.4",
+  "_from": "underscore@1.4.4"
+}
Index: /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/underscore-min.js
===================================================================
--- /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/underscore-min.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/underscore-min.js	(revision 516)
@@ -0,0 +1,1 @@
+(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,d=e.filter,g=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,_=Object.keys,j=i.bind,w=function(n){return n instanceof w?n:this instanceof w?(this._wrapped=n,void 0):new w(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=w),exports._=w):n._=w,w.VERSION="1.4.4";var A=w.each=w.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a in n)if(w.has(n,a)&&t.call(e,n[a],a,n)===r)return};w.map=w.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e[e.length]=t.call(r,n,u,i)}),e)};var O="Reduce of empty array with no initial value";w.reduce=w.foldl=w.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=w.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},w.reduceRight=w.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=w.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=w.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},w.find=w.detect=function(n,t,r){var e;return E(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},w.filter=w.select=function(n,t,r){var e=[];return null==n?e:d&&n.filter===d?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&(e[e.length]=n)}),e)},w.reject=function(n,t,r){return w.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},w.every=w.all=function(n,t,e){t||(t=w.identity);var u=!0;return null==n?u:g&&n.every===g?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var E=w.some=w.any=function(n,t,e){t||(t=w.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};w.contains=w.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:E(n,function(n){return n===t})},w.invoke=function(n,t){var r=o.call(arguments,2),e=w.isFunction(t);return w.map(n,function(n){return(e?t:n[t]).apply(n,r)})},w.pluck=function(n,t){return w.map(n,function(n){return n[t]})},w.where=function(n,t,r){return w.isEmpty(t)?r?null:[]:w[r?"find":"filter"](n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},w.findWhere=function(n,t){return w.where(n,t,!0)},w.max=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.max.apply(Math,n);if(!t&&w.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>=e.computed&&(e={value:n,computed:a})}),e.value},w.min=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.min.apply(Math,n);if(!t&&w.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;e.computed>a&&(e={value:n,computed:a})}),e.value},w.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=w.random(r++),e[r-1]=e[t],e[t]=n}),e};var k=function(n){return w.isFunction(n)?n:function(t){return t[n]}};w.sortBy=function(n,t,r){var e=k(t);return w.pluck(w.map(n,function(n,t,u){return{value:n,index:t,criteria:e.call(r,n,t,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index<t.index?-1:1}),"value")};var F=function(n,t,r,e){var u={},i=k(t||w.identity);return A(n,function(t,a){var o=i.call(r,t,a,n);e(u,o,t)}),u};w.groupBy=function(n,t,r){return F(n,t,r,function(n,t,r){(w.has(n,t)?n[t]:n[t]=[]).push(r)})},w.countBy=function(n,t,r){return F(n,t,r,function(n,t){w.has(n,t)||(n[t]=0),n[t]++})},w.sortedIndex=function(n,t,r,e){r=null==r?w.identity:k(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;u>r.call(e,n[o])?i=o+1:a=o}return i},w.toArray=function(n){return n?w.isArray(n)?o.call(n):n.length===+n.length?w.map(n,w.identity):w.values(n):[]},w.size=function(n){return null==n?0:n.length===+n.length?n.length:w.keys(n).length},w.first=w.head=w.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:o.call(n,0,t)},w.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},w.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},w.rest=w.tail=w.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},w.compact=function(n){return w.filter(n,w.identity)};var R=function(n,t,r){return A(n,function(n){w.isArray(n)?t?a.apply(r,n):R(n,t,r):r.push(n)}),r};w.flatten=function(n,t){return R(n,t,[])},w.without=function(n){return w.difference(n,o.call(arguments,1))},w.uniq=w.unique=function(n,t,r,e){w.isFunction(t)&&(e=r,r=t,t=!1);var u=r?w.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:w.contains(a,r))||(a.push(r),i.push(n[e]))}),i},w.union=function(){return w.uniq(c.apply(e,arguments))},w.intersection=function(n){var t=o.call(arguments,1);return w.filter(w.uniq(n),function(n){return w.every(t,function(t){return w.indexOf(t,n)>=0})})},w.difference=function(n){var t=c.apply(e,o.call(arguments,1));return w.filter(n,function(n){return!w.contains(t,n)})},w.zip=function(){for(var n=o.call(arguments),t=w.max(w.pluck(n,"length")),r=Array(t),e=0;t>e;e++)r[e]=w.pluck(n,""+e);return r},w.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},w.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=w.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},w.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},w.range=function(n,t,r){1>=arguments.length&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=Array(e);e>u;)i[u++]=n,n+=r;return i},w.bind=function(n,t){if(n.bind===j&&j)return j.apply(n,o.call(arguments,1));var r=o.call(arguments,2);return function(){return n.apply(t,r.concat(o.call(arguments)))}},w.partial=function(n){var t=o.call(arguments,1);return function(){return n.apply(this,t.concat(o.call(arguments)))}},w.bindAll=function(n){var t=o.call(arguments,1);return 0===t.length&&(t=w.functions(n)),A(t,function(t){n[t]=w.bind(n[t],n)}),n},w.memoize=function(n,t){var r={};return t||(t=w.identity),function(){var e=t.apply(this,arguments);return w.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},w.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},w.defer=function(n){return w.delay.apply(w,[n,1].concat(o.call(arguments,1)))},w.throttle=function(n,t){var r,e,u,i,a=0,o=function(){a=new Date,u=null,i=n.apply(r,e)};return function(){var c=new Date,l=t-(c-a);return r=this,e=arguments,0>=l?(clearTimeout(u),u=null,a=c,i=n.apply(r,e)):u||(u=setTimeout(o,l)),i}},w.debounce=function(n,t,r){var e,u;return function(){var i=this,a=arguments,o=function(){e=null,r||(u=n.apply(i,a))},c=r&&!e;return clearTimeout(e),e=setTimeout(o,t),c&&(u=n.apply(i,a)),u}},w.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},w.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},w.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},w.after=function(n,t){return 0>=n?t():function(){return 1>--n?t.apply(this,arguments):void 0}},w.keys=_||function(n){if(n!==Object(n))throw new TypeError("Invalid object");var t=[];for(var r in n)w.has(n,r)&&(t[t.length]=r);return t},w.values=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push(n[r]);return t},w.pairs=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push([r,n[r]]);return t},w.invert=function(n){var t={};for(var r in n)w.has(n,r)&&(t[n[r]]=r);return t},w.functions=w.methods=function(n){var t=[];for(var r in n)w.isFunction(n[r])&&t.push(r);return t.sort()},w.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},w.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},w.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)w.contains(r,u)||(t[u]=n[u]);return t},w.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)null==n[r]&&(n[r]=t[r])}),n},w.clone=function(n){return w.isObject(n)?w.isArray(n)?n.slice():w.extend({},n):n},w.tap=function(n,t){return t(n),n};var I=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof w&&(n=n._wrapped),t instanceof w&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==t+"";case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;r.push(n),e.push(t);var a=0,o=!0;if("[object Array]"==u){if(a=n.length,o=a==t.length)for(;a--&&(o=I(n[a],t[a],r,e)););}else{var c=n.constructor,f=t.constructor;if(c!==f&&!(w.isFunction(c)&&c instanceof c&&w.isFunction(f)&&f instanceof f))return!1;for(var s in n)if(w.has(n,s)&&(a++,!(o=w.has(t,s)&&I(n[s],t[s],r,e))))break;if(o){for(s in t)if(w.has(t,s)&&!a--)break;o=!a}}return r.pop(),e.pop(),o};w.isEqual=function(n,t){return I(n,t,[],[])},w.isEmpty=function(n){if(null==n)return!0;if(w.isArray(n)||w.isString(n))return 0===n.length;for(var t in n)if(w.has(n,t))return!1;return!0},w.isElement=function(n){return!(!n||1!==n.nodeType)},w.isArray=x||function(n){return"[object Array]"==l.call(n)},w.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){w["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),w.isArguments(arguments)||(w.isArguments=function(n){return!(!n||!w.has(n,"callee"))}),"function"!=typeof/./&&(w.isFunction=function(n){return"function"==typeof n}),w.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},w.isNaN=function(n){return w.isNumber(n)&&n!=+n},w.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},w.isNull=function(n){return null===n},w.isUndefined=function(n){return n===void 0},w.has=function(n,t){return f.call(n,t)},w.noConflict=function(){return n._=t,this},w.identity=function(n){return n},w.times=function(n,t,r){for(var e=Array(n),u=0;n>u;u++)e[u]=t.call(r,u);return e},w.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))};var M={escape:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","/":"&#x2F;"}};M.unescape=w.invert(M.escape);var S={escape:RegExp("["+w.keys(M.escape).join("")+"]","g"),unescape:RegExp("("+w.keys(M.unescape).join("|")+")","g")};w.each(["escape","unescape"],function(n){w[n]=function(t){return null==t?"":(""+t).replace(S[n],function(t){return M[n][t]})}}),w.result=function(n,t){if(null==n)return null;var r=n[t];return w.isFunction(r)?r.call(n):r},w.mixin=function(n){A(w.functions(n),function(t){var r=w[t]=n[t];w.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),D.call(this,r.apply(w,n))}})};var N=0;w.uniqueId=function(n){var t=++N+"";return n?n+t:t},w.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var T=/(.)^/,q={"'":"'","\\":"\\","\r":"r","\n":"n","	":"t","\u2028":"u2028","\u2029":"u2029"},B=/\\|'|\r|\n|\t|\u2028|\u2029/g;w.template=function(n,t,r){var e;r=w.defaults({},r,w.templateSettings);var u=RegExp([(r.escape||T).source,(r.interpolate||T).source,(r.evaluate||T).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(B,function(n){return"\\"+q[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,w);var c=function(n){return e.call(this,n,w)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},w.chain=function(n){return w(n).chain()};var D=function(n){return this._chain?w(n).chain():n};w.mixin(w),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];w.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],D.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];w.prototype[n]=function(){return D.call(this,t.apply(this._wrapped,arguments))}}),w.extend(w.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this);
Index: /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/underscore.js
===================================================================
--- /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/underscore.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/node_modules/underscore/underscore.js	(revision 516)
@@ -0,0 +1,1226 @@
+//     Underscore.js 1.4.4
+//     http://underscorejs.org
+//     (c) 2009-2013 Jeremy Ashkenas, DocumentCloud Inc.
+//     Underscore may be freely distributed under the MIT license.
+
+(function() {
+
+  // Baseline setup
+  // --------------
+
+  // Establish the root object, `window` in the browser, or `global` on the server.
+  var root = this;
+
+  // Save the previous value of the `_` variable.
+  var previousUnderscore = root._;
+
+  // Establish the object that gets returned to break out of a loop iteration.
+  var breaker = {};
+
+  // Save bytes in the minified (but not gzipped) version:
+  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
+
+  // Create quick reference variables for speed access to core prototypes.
+  var push             = ArrayProto.push,
+      slice            = ArrayProto.slice,
+      concat           = ArrayProto.concat,
+      toString         = ObjProto.toString,
+      hasOwnProperty   = ObjProto.hasOwnProperty;
+
+  // All **ECMAScript 5** native function implementations that we hope to use
+  // are declared here.
+  var
+    nativeForEach      = ArrayProto.forEach,
+    nativeMap          = ArrayProto.map,
+    nativeReduce       = ArrayProto.reduce,
+    nativeReduceRight  = ArrayProto.reduceRight,
+    nativeFilter       = ArrayProto.filter,
+    nativeEvery        = ArrayProto.every,
+    nativeSome         = ArrayProto.some,
+    nativeIndexOf      = ArrayProto.indexOf,
+    nativeLastIndexOf  = ArrayProto.lastIndexOf,
+    nativeIsArray      = Array.isArray,
+    nativeKeys         = Object.keys,
+    nativeBind         = FuncProto.bind;
+
+  // Create a safe reference to the Underscore object for use below.
+  var _ = function(obj) {
+    if (obj instanceof _) return obj;
+    if (!(this instanceof _)) return new _(obj);
+    this._wrapped = obj;
+  };
+
+  // Export the Underscore object for **Node.js**, with
+  // backwards-compatibility for the old `require()` API. If we're in
+  // the browser, add `_` as a global object via a string identifier,
+  // for Closure Compiler "advanced" mode.
+  if (typeof exports !== 'undefined') {
+    if (typeof module !== 'undefined' && module.exports) {
+      exports = module.exports = _;
+    }
+    exports._ = _;
+  } else {
+    root._ = _;
+  }
+
+  // Current version.
+  _.VERSION = '1.4.4';
+
+  // Collection Functions
+  // --------------------
+
+  // The cornerstone, an `each` implementation, aka `forEach`.
+  // Handles objects with the built-in `forEach`, arrays, and raw objects.
+  // Delegates to **ECMAScript 5**'s native `forEach` if available.
+  var each = _.each = _.forEach = function(obj, iterator, context) {
+    if (obj == null) return;
+    if (nativeForEach && obj.forEach === nativeForEach) {
+      obj.forEach(iterator, context);
+    } else if (obj.length === +obj.length) {
+      for (var i = 0, l = obj.length; i < l; i++) {
+        if (iterator.call(context, obj[i], i, obj) === breaker) return;
+      }
+    } else {
+      for (var key in obj) {
+        if (_.has(obj, key)) {
+          if (iterator.call(context, obj[key], key, obj) === breaker) return;
+        }
+      }
+    }
+  };
+
+  // Return the results of applying the iterator to each element.
+  // Delegates to **ECMAScript 5**'s native `map` if available.
+  _.map = _.collect = function(obj, iterator, context) {
+    var results = [];
+    if (obj == null) return results;
+    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
+    each(obj, function(value, index, list) {
+      results[results.length] = iterator.call(context, value, index, list);
+    });
+    return results;
+  };
+
+  var reduceError = 'Reduce of empty array with no initial value';
+
+  // **Reduce** builds up a single result from a list of values, aka `inject`,
+  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
+  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
+    var initial = arguments.length > 2;
+    if (obj == null) obj = [];
+    if (nativeReduce && obj.reduce === nativeReduce) {
+      if (context) iterator = _.bind(iterator, context);
+      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
+    }
+    each(obj, function(value, index, list) {
+      if (!initial) {
+        memo = value;
+        initial = true;
+      } else {
+        memo = iterator.call(context, memo, value, index, list);
+      }
+    });
+    if (!initial) throw new TypeError(reduceError);
+    return memo;
+  };
+
+  // The right-associative version of reduce, also known as `foldr`.
+  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.
+  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
+    var initial = arguments.length > 2;
+    if (obj == null) obj = [];
+    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
+      if (context) iterator = _.bind(iterator, context);
+      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
+    }
+    var length = obj.length;
+    if (length !== +length) {
+      var keys = _.keys(obj);
+      length = keys.length;
+    }
+    each(obj, function(value, index, list) {
+      index = keys ? keys[--length] : --length;
+      if (!initial) {
+        memo = obj[index];
+        initial = true;
+      } else {
+        memo = iterator.call(context, memo, obj[index], index, list);
+      }
+    });
+    if (!initial) throw new TypeError(reduceError);
+    return memo;
+  };
+
+  // Return the first value which passes a truth test. Aliased as `detect`.
+  _.find = _.detect = function(obj, iterator, context) {
+    var result;
+    any(obj, function(value, index, list) {
+      if (iterator.call(context, value, index, list)) {
+        result = value;
+        return true;
+      }
+    });
+    return result;
+  };
+
+  // Return all the elements that pass a truth test.
+  // Delegates to **ECMAScript 5**'s native `filter` if available.
+  // Aliased as `select`.
+  _.filter = _.select = function(obj, iterator, context) {
+    var results = [];
+    if (obj == null) return results;
+    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
+    each(obj, function(value, index, list) {
+      if (iterator.call(context, value, index, list)) results[results.length] = value;
+    });
+    return results;
+  };
+
+  // Return all the elements for which a truth test fails.
+  _.reject = function(obj, iterator, context) {
+    return _.filter(obj, function(value, index, list) {
+      return !iterator.call(context, value, index, list);
+    }, context);
+  };
+
+  // Determine whether all of the elements match a truth test.
+  // Delegates to **ECMAScript 5**'s native `every` if available.
+  // Aliased as `all`.
+  _.every = _.all = function(obj, iterator, context) {
+    iterator || (iterator = _.identity);
+    var result = true;
+    if (obj == null) return result;
+    if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
+    each(obj, function(value, index, list) {
+      if (!(result = result && iterator.call(context, value, index, list))) return breaker;
+    });
+    return !!result;
+  };
+
+  // Determine if at least one element in the object matches a truth test.
+  // Delegates to **ECMAScript 5**'s native `some` if available.
+  // Aliased as `any`.
+  var any = _.some = _.any = function(obj, iterator, context) {
+    iterator || (iterator = _.identity);
+    var result = false;
+    if (obj == null) return result;
+    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
+    each(obj, function(value, index, list) {
+      if (result || (result = iterator.call(context, value, index, list))) return breaker;
+    });
+    return !!result;
+  };
+
+  // Determine if the array or object contains a given value (using `===`).
+  // Aliased as `include`.
+  _.contains = _.include = function(obj, target) {
+    if (obj == null) return false;
+    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
+    return any(obj, function(value) {
+      return value === target;
+    });
+  };
+
+  // Invoke a method (with arguments) on every item in a collection.
+  _.invoke = function(obj, method) {
+    var args = slice.call(arguments, 2);
+    var isFunc = _.isFunction(method);
+    return _.map(obj, function(value) {
+      return (isFunc ? method : value[method]).apply(value, args);
+    });
+  };
+
+  // Convenience version of a common use case of `map`: fetching a property.
+  _.pluck = function(obj, key) {
+    return _.map(obj, function(value){ return value[key]; });
+  };
+
+  // Convenience version of a common use case of `filter`: selecting only objects
+  // containing specific `key:value` pairs.
+  _.where = function(obj, attrs, first) {
+    if (_.isEmpty(attrs)) return first ? null : [];
+    return _[first ? 'find' : 'filter'](obj, function(value) {
+      for (var key in attrs) {
+        if (attrs[key] !== value[key]) return false;
+      }
+      return true;
+    });
+  };
+
+  // Convenience version of a common use case of `find`: getting the first object
+  // containing specific `key:value` pairs.
+  _.findWhere = function(obj, attrs) {
+    return _.where(obj, attrs, true);
+  };
+
+  // Return the maximum element or (element-based computation).
+  // Can't optimize arrays of integers longer than 65,535 elements.
+  // See: https://bugs.webkit.org/show_bug.cgi?id=80797
+  _.max = function(obj, iterator, context) {
+    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
+      return Math.max.apply(Math, obj);
+    }
+    if (!iterator && _.isEmpty(obj)) return -Infinity;
+    var result = {computed : -Infinity, value: -Infinity};
+    each(obj, function(value, index, list) {
+      var computed = iterator ? iterator.call(context, value, index, list) : value;
+      computed >= result.computed && (result = {value : value, computed : computed});
+    });
+    return result.value;
+  };
+
+  // Return the minimum element (or element-based computation).
+  _.min = function(obj, iterator, context) {
+    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
+      return Math.min.apply(Math, obj);
+    }
+    if (!iterator && _.isEmpty(obj)) return Infinity;
+    var result = {computed : Infinity, value: Infinity};
+    each(obj, function(value, index, list) {
+      var computed = iterator ? iterator.call(context, value, index, list) : value;
+      computed < result.computed && (result = {value : value, computed : computed});
+    });
+    return result.value;
+  };
+
+  // Shuffle an array.
+  _.shuffle = function(obj) {
+    var rand;
+    var index = 0;
+    var shuffled = [];
+    each(obj, function(value) {
+      rand = _.random(index++);
+      shuffled[index - 1] = shuffled[rand];
+      shuffled[rand] = value;
+    });
+    return shuffled;
+  };
+
+  // An internal function to generate lookup iterators.
+  var lookupIterator = function(value) {
+    return _.isFunction(value) ? value : function(obj){ return obj[value]; };
+  };
+
+  // Sort the object's values by a criterion produced by an iterator.
+  _.sortBy = function(obj, value, context) {
+    var iterator = lookupIterator(value);
+    return _.pluck(_.map(obj, function(value, index, list) {
+      return {
+        value : value,
+        index : index,
+        criteria : iterator.call(context, value, index, list)
+      };
+    }).sort(function(left, right) {
+      var a = left.criteria;
+      var b = right.criteria;
+      if (a !== b) {
+        if (a > b || a === void 0) return 1;
+        if (a < b || b === void 0) return -1;
+      }
+      return left.index < right.index ? -1 : 1;
+    }), 'value');
+  };
+
+  // An internal function used for aggregate "group by" operations.
+  var group = function(obj, value, context, behavior) {
+    var result = {};
+    var iterator = lookupIterator(value || _.identity);
+    each(obj, function(value, index) {
+      var key = iterator.call(context, value, index, obj);
+      behavior(result, key, value);
+    });
+    return result;
+  };
+
+  // Groups the object's values by a criterion. Pass either a string attribute
+  // to group by, or a function that returns the criterion.
+  _.groupBy = function(obj, value, context) {
+    return group(obj, value, context, function(result, key, value) {
+      (_.has(result, key) ? result[key] : (result[key] = [])).push(value);
+    });
+  };
+
+  // Counts instances of an object that group by a certain criterion. Pass
+  // either a string attribute to count by, or a function that returns the
+  // criterion.
+  _.countBy = function(obj, value, context) {
+    return group(obj, value, context, function(result, key) {
+      if (!_.has(result, key)) result[key] = 0;
+      result[key]++;
+    });
+  };
+
+  // Use a comparator function to figure out the smallest index at which
+  // an object should be inserted so as to maintain order. Uses binary search.
+  _.sortedIndex = function(array, obj, iterator, context) {
+    iterator = iterator == null ? _.identity : lookupIterator(iterator);
+    var value = iterator.call(context, obj);
+    var low = 0, high = array.length;
+    while (low < high) {
+      var mid = (low + high) >>> 1;
+      iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;
+    }
+    return low;
+  };
+
+  // Safely convert anything iterable into a real, live array.
+  _.toArray = function(obj) {
+    if (!obj) return [];
+    if (_.isArray(obj)) return slice.call(obj);
+    if (obj.length === +obj.length) return _.map(obj, _.identity);
+    return _.values(obj);
+  };
+
+  // Return the number of elements in an object.
+  _.size = function(obj) {
+    if (obj == null) return 0;
+    return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;
+  };
+
+  // Array Functions
+  // ---------------
+
+  // Get the first element of an array. Passing **n** will return the first N
+  // values in the array. Aliased as `head` and `take`. The **guard** check
+  // allows it to work with `_.map`.
+  _.first = _.head = _.take = function(array, n, guard) {
+    if (array == null) return void 0;
+    return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
+  };
+
+  // Returns everything but the last entry of the array. Especially useful on
+  // the arguments object. Passing **n** will return all the values in
+  // the array, excluding the last N. The **guard** check allows it to work with
+  // `_.map`.
+  _.initial = function(array, n, guard) {
+    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
+  };
+
+  // Get the last element of an array. Passing **n** will return the last N
+  // values in the array. The **guard** check allows it to work with `_.map`.
+  _.last = function(array, n, guard) {
+    if (array == null) return void 0;
+    if ((n != null) && !guard) {
+      return slice.call(array, Math.max(array.length - n, 0));
+    } else {
+      return array[array.length - 1];
+    }
+  };
+
+  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
+  // Especially useful on the arguments object. Passing an **n** will return
+  // the rest N values in the array. The **guard**
+  // check allows it to work with `_.map`.
+  _.rest = _.tail = _.drop = function(array, n, guard) {
+    return slice.call(array, (n == null) || guard ? 1 : n);
+  };
+
+  // Trim out all falsy values from an array.
+  _.compact = function(array) {
+    return _.filter(array, _.identity);
+  };
+
+  // Internal implementation of a recursive `flatten` function.
+  var flatten = function(input, shallow, output) {
+    each(input, function(value) {
+      if (_.isArray(value)) {
+        shallow ? push.apply(output, value) : flatten(value, shallow, output);
+      } else {
+        output.push(value);
+      }
+    });
+    return output;
+  };
+
+  // Return a completely flattened version of an array.
+  _.flatten = function(array, shallow) {
+    return flatten(array, shallow, []);
+  };
+
+  // Return a version of the array that does not contain the specified value(s).
+  _.without = function(array) {
+    return _.difference(array, slice.call(arguments, 1));
+  };
+
+  // Produce a duplicate-free version of the array. If the array has already
+  // been sorted, you have the option of using a faster algorithm.
+  // Aliased as `unique`.
+  _.uniq = _.unique = function(array, isSorted, iterator, context) {
+    if (_.isFunction(isSorted)) {
+      context = iterator;
+      iterator = isSorted;
+      isSorted = false;
+    }
+    var initial = iterator ? _.map(array, iterator, context) : array;
+    var results = [];
+    var seen = [];
+    each(initial, function(value, index) {
+      if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {
+        seen.push(value);
+        results.push(array[index]);
+      }
+    });
+    return results;
+  };
+
+  // Produce an array that contains the union: each distinct element from all of
+  // the passed-in arrays.
+  _.union = function() {
+    return _.uniq(concat.apply(ArrayProto, arguments));
+  };
+
+  // Produce an array that contains every item shared between all the
+  // passed-in arrays.
+  _.intersection = function(array) {
+    var rest = slice.call(arguments, 1);
+    return _.filter(_.uniq(array), function(item) {
+      return _.every(rest, function(other) {
+        return _.indexOf(other, item) >= 0;
+      });
+    });
+  };
+
+  // Take the difference between one array and a number of other arrays.
+  // Only the elements present in just the first array will remain.
+  _.difference = function(array) {
+    var rest = concat.apply(ArrayProto, slice.call(arguments, 1));
+    return _.filter(array, function(value){ return !_.contains(rest, value); });
+  };
+
+  // Zip together multiple lists into a single array -- elements that share
+  // an index go together.
+  _.zip = function() {
+    var args = slice.call(arguments);
+    var length = _.max(_.pluck(args, 'length'));
+    var results = new Array(length);
+    for (var i = 0; i < length; i++) {
+      results[i] = _.pluck(args, "" + i);
+    }
+    return results;
+  };
+
+  // Converts lists into objects. Pass either a single array of `[key, value]`
+  // pairs, or two parallel arrays of the same length -- one of keys, and one of
+  // the corresponding values.
+  _.object = function(list, values) {
+    if (list == null) return {};
+    var result = {};
+    for (var i = 0, l = list.length; i < l; i++) {
+      if (values) {
+        result[list[i]] = values[i];
+      } else {
+        result[list[i][0]] = list[i][1];
+      }
+    }
+    return result;
+  };
+
+  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
+  // we need this function. Return the position of the first occurrence of an
+  // item in an array, or -1 if the item is not included in the array.
+  // Delegates to **ECMAScript 5**'s native `indexOf` if available.
+  // If the array is large and already in sort order, pass `true`
+  // for **isSorted** to use binary search.
+  _.indexOf = function(array, item, isSorted) {
+    if (array == null) return -1;
+    var i = 0, l = array.length;
+    if (isSorted) {
+      if (typeof isSorted == 'number') {
+        i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);
+      } else {
+        i = _.sortedIndex(array, item);
+        return array[i] === item ? i : -1;
+      }
+    }
+    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
+    for (; i < l; i++) if (array[i] === item) return i;
+    return -1;
+  };
+
+  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
+  _.lastIndexOf = function(array, item, from) {
+    if (array == null) return -1;
+    var hasIndex = from != null;
+    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {
+      return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);
+    }
+    var i = (hasIndex ? from : array.length);
+    while (i--) if (array[i] === item) return i;
+    return -1;
+  };
+
+  // Generate an integer Array containing an arithmetic progression. A port of
+  // the native Python `range()` function. See
+  // [the Python documentation](http://docs.python.org/library/functions.html#range).
+  _.range = function(start, stop, step) {
+    if (arguments.length <= 1) {
+      stop = start || 0;
+      start = 0;
+    }
+    step = arguments[2] || 1;
+
+    var len = Math.max(Math.ceil((stop - start) / step), 0);
+    var idx = 0;
+    var range = new Array(len);
+
+    while(idx < len) {
+      range[idx++] = start;
+      start += step;
+    }
+
+    return range;
+  };
+
+  // Function (ahem) Functions
+  // ------------------
+
+  // Create a function bound to a given object (assigning `this`, and arguments,
+  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
+  // available.
+  _.bind = function(func, context) {
+    if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
+    var args = slice.call(arguments, 2);
+    return function() {
+      return func.apply(context, args.concat(slice.call(arguments)));
+    };
+  };
+
+  // Partially apply a function by creating a version that has had some of its
+  // arguments pre-filled, without changing its dynamic `this` context.
+  _.partial = function(func) {
+    var args = slice.call(arguments, 1);
+    return function() {
+      return func.apply(this, args.concat(slice.call(arguments)));
+    };
+  };
+
+  // Bind all of an object's methods to that object. Useful for ensuring that
+  // all callbacks defined on an object belong to it.
+  _.bindAll = function(obj) {
+    var funcs = slice.call(arguments, 1);
+    if (funcs.length === 0) funcs = _.functions(obj);
+    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
+    return obj;
+  };
+
+  // Memoize an expensive function by storing its results.
+  _.memoize = function(func, hasher) {
+    var memo = {};
+    hasher || (hasher = _.identity);
+    return function() {
+      var key = hasher.apply(this, arguments);
+      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
+    };
+  };
+
+  // Delays a function for the given number of milliseconds, and then calls
+  // it with the arguments supplied.
+  _.delay = function(func, wait) {
+    var args = slice.call(arguments, 2);
+    return setTimeout(function(){ return func.apply(null, args); }, wait);
+  };
+
+  // Defers a function, scheduling it to run after the current call stack has
+  // cleared.
+  _.defer = function(func) {
+    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
+  };
+
+  // Returns a function, that, when invoked, will only be triggered at most once
+  // during a given window of time.
+  _.throttle = function(func, wait) {
+    var context, args, timeout, result;
+    var previous = 0;
+    var later = function() {
+      previous = new Date;
+      timeout = null;
+      result = func.apply(context, args);
+    };
+    return function() {
+      var now = new Date;
+      var remaining = wait - (now - previous);
+      context = this;
+      args = arguments;
+      if (remaining <= 0) {
+        clearTimeout(timeout);
+        timeout = null;
+        previous = now;
+        result = func.apply(context, args);
+      } else if (!timeout) {
+        timeout = setTimeout(later, remaining);
+      }
+      return result;
+    };
+  };
+
+  // Returns a function, that, as long as it continues to be invoked, will not
+  // be triggered. The function will be called after it stops being called for
+  // N milliseconds. If `immediate` is passed, trigger the function on the
+  // leading edge, instead of the trailing.
+  _.debounce = function(func, wait, immediate) {
+    var timeout, result;
+    return function() {
+      var context = this, args = arguments;
+      var later = function() {
+        timeout = null;
+        if (!immediate) result = func.apply(context, args);
+      };
+      var callNow = immediate && !timeout;
+      clearTimeout(timeout);
+      timeout = setTimeout(later, wait);
+      if (callNow) result = func.apply(context, args);
+      return result;
+    };
+  };
+
+  // Returns a function that will be executed at most one time, no matter how
+  // often you call it. Useful for lazy initialization.
+  _.once = function(func) {
+    var ran = false, memo;
+    return function() {
+      if (ran) return memo;
+      ran = true;
+      memo = func.apply(this, arguments);
+      func = null;
+      return memo;
+    };
+  };
+
+  // Returns the first function passed as an argument to the second,
+  // allowing you to adjust arguments, run code before and after, and
+  // conditionally execute the original function.
+  _.wrap = function(func, wrapper) {
+    return function() {
+      var args = [func];
+      push.apply(args, arguments);
+      return wrapper.apply(this, args);
+    };
+  };
+
+  // Returns a function that is the composition of a list of functions, each
+  // consuming the return value of the function that follows.
+  _.compose = function() {
+    var funcs = arguments;
+    return function() {
+      var args = arguments;
+      for (var i = funcs.length - 1; i >= 0; i--) {
+        args = [funcs[i].apply(this, args)];
+      }
+      return args[0];
+    };
+  };
+
+  // Returns a function that will only be executed after being called N times.
+  _.after = function(times, func) {
+    if (times <= 0) return func();
+    return function() {
+      if (--times < 1) {
+        return func.apply(this, arguments);
+      }
+    };
+  };
+
+  // Object Functions
+  // ----------------
+
+  // Retrieve the names of an object's properties.
+  // Delegates to **ECMAScript 5**'s native `Object.keys`
+  _.keys = nativeKeys || function(obj) {
+    if (obj !== Object(obj)) throw new TypeError('Invalid object');
+    var keys = [];
+    for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;
+    return keys;
+  };
+
+  // Retrieve the values of an object's properties.
+  _.values = function(obj) {
+    var values = [];
+    for (var key in obj) if (_.has(obj, key)) values.push(obj[key]);
+    return values;
+  };
+
+  // Convert an object into a list of `[key, value]` pairs.
+  _.pairs = function(obj) {
+    var pairs = [];
+    for (var key in obj) if (_.has(obj, key)) pairs.push([key, obj[key]]);
+    return pairs;
+  };
+
+  // Invert the keys and values of an object. The values must be serializable.
+  _.invert = function(obj) {
+    var result = {};
+    for (var key in obj) if (_.has(obj, key)) result[obj[key]] = key;
+    return result;
+  };
+
+  // Return a sorted list of the function names available on the object.
+  // Aliased as `methods`
+  _.functions = _.methods = function(obj) {
+    var names = [];
+    for (var key in obj) {
+      if (_.isFunction(obj[key])) names.push(key);
+    }
+    return names.sort();
+  };
+
+  // Extend a given object with all the properties in passed-in object(s).
+  _.extend = function(obj) {
+    each(slice.call(arguments, 1), function(source) {
+      if (source) {
+        for (var prop in source) {
+          obj[prop] = source[prop];
+        }
+      }
+    });
+    return obj;
+  };
+
+  // Return a copy of the object only containing the whitelisted properties.
+  _.pick = function(obj) {
+    var copy = {};
+    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
+    each(keys, function(key) {
+      if (key in obj) copy[key] = obj[key];
+    });
+    return copy;
+  };
+
+   // Return a copy of the object without the blacklisted properties.
+  _.omit = function(obj) {
+    var copy = {};
+    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
+    for (var key in obj) {
+      if (!_.contains(keys, key)) copy[key] = obj[key];
+    }
+    return copy;
+  };
+
+  // Fill in a given object with default properties.
+  _.defaults = function(obj) {
+    each(slice.call(arguments, 1), function(source) {
+      if (source) {
+        for (var prop in source) {
+          if (obj[prop] == null) obj[prop] = source[prop];
+        }
+      }
+    });
+    return obj;
+  };
+
+  // Create a (shallow-cloned) duplicate of an object.
+  _.clone = function(obj) {
+    if (!_.isObject(obj)) return obj;
+    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
+  };
+
+  // Invokes interceptor with the obj, and then returns obj.
+  // The primary purpose of this method is to "tap into" a method chain, in
+  // order to perform operations on intermediate results within the chain.
+  _.tap = function(obj, interceptor) {
+    interceptor(obj);
+    return obj;
+  };
+
+  // Internal recursive comparison function for `isEqual`.
+  var eq = function(a, b, aStack, bStack) {
+    // Identical objects are equal. `0 === -0`, but they aren't identical.
+    // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.
+    if (a === b) return a !== 0 || 1 / a == 1 / b;
+    // A strict comparison is necessary because `null == undefined`.
+    if (a == null || b == null) return a === b;
+    // Unwrap any wrapped objects.
+    if (a instanceof _) a = a._wrapped;
+    if (b instanceof _) b = b._wrapped;
+    // Compare `[[Class]]` names.
+    var className = toString.call(a);
+    if (className != toString.call(b)) return false;
+    switch (className) {
+      // Strings, numbers, dates, and booleans are compared by value.
+      case '[object String]':
+        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+        // equivalent to `new String("5")`.
+        return a == String(b);
+      case '[object Number]':
+        // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
+        // other numeric values.
+        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
+      case '[object Date]':
+      case '[object Boolean]':
+        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+        // millisecond representations. Note that invalid dates with millisecond representations
+        // of `NaN` are not equivalent.
+        return +a == +b;
+      // RegExps are compared by their source patterns and flags.
+      case '[object RegExp]':
+        return a.source == b.source &&
+               a.global == b.global &&
+               a.multiline == b.multiline &&
+               a.ignoreCase == b.ignoreCase;
+    }
+    if (typeof a != 'object' || typeof b != 'object') return false;
+    // Assume equality for cyclic structures. The algorithm for detecting cyclic
+    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+    var length = aStack.length;
+    while (length--) {
+      // Linear search. Performance is inversely proportional to the number of
+      // unique nested structures.
+      if (aStack[length] == a) return bStack[length] == b;
+    }
+    // Add the first object to the stack of traversed objects.
+    aStack.push(a);
+    bStack.push(b);
+    var size = 0, result = true;
+    // Recursively compare objects and arrays.
+    if (className == '[object Array]') {
+      // Compare array lengths to determine if a deep comparison is necessary.
+      size = a.length;
+      result = size == b.length;
+      if (result) {
+        // Deep compare the contents, ignoring non-numeric properties.
+        while (size--) {
+          if (!(result = eq(a[size], b[size], aStack, bStack))) break;
+        }
+      }
+    } else {
+      // Objects with different constructors are not equivalent, but `Object`s
+      // from different frames are.
+      var aCtor = a.constructor, bCtor = b.constructor;
+      if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&
+                               _.isFunction(bCtor) && (bCtor instanceof bCtor))) {
+        return false;
+      }
+      // Deep compare objects.
+      for (var key in a) {
+        if (_.has(a, key)) {
+          // Count the expected number of properties.
+          size++;
+          // Deep compare each member.
+          if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
+        }
+      }
+      // Ensure that both objects contain the same number of properties.
+      if (result) {
+        for (key in b) {
+          if (_.has(b, key) && !(size--)) break;
+        }
+        result = !size;
+      }
+    }
+    // Remove the first object from the stack of traversed objects.
+    aStack.pop();
+    bStack.pop();
+    return result;
+  };
+
+  // Perform a deep comparison to check if two objects are equal.
+  _.isEqual = function(a, b) {
+    return eq(a, b, [], []);
+  };
+
+  // Is a given array, string, or object empty?
+  // An "empty" object has no enumerable own-properties.
+  _.isEmpty = function(obj) {
+    if (obj == null) return true;
+    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
+    for (var key in obj) if (_.has(obj, key)) return false;
+    return true;
+  };
+
+  // Is a given value a DOM element?
+  _.isElement = function(obj) {
+    return !!(obj && obj.nodeType === 1);
+  };
+
+  // Is a given value an array?
+  // Delegates to ECMA5's native Array.isArray
+  _.isArray = nativeIsArray || function(obj) {
+    return toString.call(obj) == '[object Array]';
+  };
+
+  // Is a given variable an object?
+  _.isObject = function(obj) {
+    return obj === Object(obj);
+  };
+
+  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
+  each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
+    _['is' + name] = function(obj) {
+      return toString.call(obj) == '[object ' + name + ']';
+    };
+  });
+
+  // Define a fallback version of the method in browsers (ahem, IE), where
+  // there isn't any inspectable "Arguments" type.
+  if (!_.isArguments(arguments)) {
+    _.isArguments = function(obj) {
+      return !!(obj && _.has(obj, 'callee'));
+    };
+  }
+
+  // Optimize `isFunction` if appropriate.
+  if (typeof (/./) !== 'function') {
+    _.isFunction = function(obj) {
+      return typeof obj === 'function';
+    };
+  }
+
+  // Is a given object a finite number?
+  _.isFinite = function(obj) {
+    return isFinite(obj) && !isNaN(parseFloat(obj));
+  };
+
+  // Is the given value `NaN`? (NaN is the only number which does not equal itself).
+  _.isNaN = function(obj) {
+    return _.isNumber(obj) && obj != +obj;
+  };
+
+  // Is a given value a boolean?
+  _.isBoolean = function(obj) {
+    return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
+  };
+
+  // Is a given value equal to null?
+  _.isNull = function(obj) {
+    return obj === null;
+  };
+
+  // Is a given variable undefined?
+  _.isUndefined = function(obj) {
+    return obj === void 0;
+  };
+
+  // Shortcut function for checking if an object has a given property directly
+  // on itself (in other words, not on a prototype).
+  _.has = function(obj, key) {
+    return hasOwnProperty.call(obj, key);
+  };
+
+  // Utility Functions
+  // -----------------
+
+  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
+  // previous owner. Returns a reference to the Underscore object.
+  _.noConflict = function() {
+    root._ = previousUnderscore;
+    return this;
+  };
+
+  // Keep the identity function around for default iterators.
+  _.identity = function(value) {
+    return value;
+  };
+
+  // Run a function **n** times.
+  _.times = function(n, iterator, context) {
+    var accum = Array(n);
+    for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);
+    return accum;
+  };
+
+  // Return a random integer between min and max (inclusive).
+  _.random = function(min, max) {
+    if (max == null) {
+      max = min;
+      min = 0;
+    }
+    return min + Math.floor(Math.random() * (max - min + 1));
+  };
+
+  // List of HTML entities for escaping.
+  var entityMap = {
+    escape: {
+      '&': '&amp;',
+      '<': '&lt;',
+      '>': '&gt;',
+      '"': '&quot;',
+      "'": '&#x27;',
+      '/': '&#x2F;'
+    }
+  };
+  entityMap.unescape = _.invert(entityMap.escape);
+
+  // Regexes containing the keys and values listed immediately above.
+  var entityRegexes = {
+    escape:   new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),
+    unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')
+  };
+
+  // Functions for escaping and unescaping strings to/from HTML interpolation.
+  _.each(['escape', 'unescape'], function(method) {
+    _[method] = function(string) {
+      if (string == null) return '';
+      return ('' + string).replace(entityRegexes[method], function(match) {
+        return entityMap[method][match];
+      });
+    };
+  });
+
+  // If the value of the named property is a function then invoke it;
+  // otherwise, return it.
+  _.result = function(object, property) {
+    if (object == null) return null;
+    var value = object[property];
+    return _.isFunction(value) ? value.call(object) : value;
+  };
+
+  // Add your own custom functions to the Underscore object.
+  _.mixin = function(obj) {
+    each(_.functions(obj), function(name){
+      var func = _[name] = obj[name];
+      _.prototype[name] = function() {
+        var args = [this._wrapped];
+        push.apply(args, arguments);
+        return result.call(this, func.apply(_, args));
+      };
+    });
+  };
+
+  // Generate a unique integer id (unique within the entire client session).
+  // Useful for temporary DOM ids.
+  var idCounter = 0;
+  _.uniqueId = function(prefix) {
+    var id = ++idCounter + '';
+    return prefix ? prefix + id : id;
+  };
+
+  // By default, Underscore uses ERB-style template delimiters, change the
+  // following template settings to use alternative delimiters.
+  _.templateSettings = {
+    evaluate    : /<%([\s\S]+?)%>/g,
+    interpolate : /<%=([\s\S]+?)%>/g,
+    escape      : /<%-([\s\S]+?)%>/g
+  };
+
+  // When customizing `templateSettings`, if you don't want to define an
+  // interpolation, evaluation or escaping regex, we need one that is
+  // guaranteed not to match.
+  var noMatch = /(.)^/;
+
+  // Certain characters need to be escaped so that they can be put into a
+  // string literal.
+  var escapes = {
+    "'":      "'",
+    '\\':     '\\',
+    '\r':     'r',
+    '\n':     'n',
+    '\t':     't',
+    '\u2028': 'u2028',
+    '\u2029': 'u2029'
+  };
+
+  var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
+
+  // JavaScript micro-templating, similar to John Resig's implementation.
+  // Underscore templating handles arbitrary delimiters, preserves whitespace,
+  // and correctly escapes quotes within interpolated code.
+  _.template = function(text, data, settings) {
+    var render;
+    settings = _.defaults({}, settings, _.templateSettings);
+
+    // Combine delimiters into one regular expression via alternation.
+    var matcher = new RegExp([
+      (settings.escape || noMatch).source,
+      (settings.interpolate || noMatch).source,
+      (settings.evaluate || noMatch).source
+    ].join('|') + '|$', 'g');
+
+    // Compile the template source, escaping string literals appropriately.
+    var index = 0;
+    var source = "__p+='";
+    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+      source += text.slice(index, offset)
+        .replace(escaper, function(match) { return '\\' + escapes[match]; });
+
+      if (escape) {
+        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+      }
+      if (interpolate) {
+        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+      }
+      if (evaluate) {
+        source += "';\n" + evaluate + "\n__p+='";
+      }
+      index = offset + match.length;
+      return match;
+    });
+    source += "';\n";
+
+    // If a variable is not specified, place data values in local scope.
+    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
+
+    source = "var __t,__p='',__j=Array.prototype.join," +
+      "print=function(){__p+=__j.call(arguments,'');};\n" +
+      source + "return __p;\n";
+
+    try {
+      render = new Function(settings.variable || 'obj', '_', source);
+    } catch (e) {
+      e.source = source;
+      throw e;
+    }
+
+    if (data) return render(data, _);
+    var template = function(data) {
+      return render.call(this, data, _);
+    };
+
+    // Provide the compiled function source as a convenience for precompilation.
+    template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
+
+    return template;
+  };
+
+  // Add a "chain" function, which will delegate to the wrapper.
+  _.chain = function(obj) {
+    return _(obj).chain();
+  };
+
+  // OOP
+  // ---------------
+  // If Underscore is called as a function, it returns a wrapped object that
+  // can be used OO-style. This wrapper holds altered versions of all the
+  // underscore functions. Wrapped objects may be chained.
+
+  // Helper function to continue chaining intermediate results.
+  var result = function(obj) {
+    return this._chain ? _(obj).chain() : obj;
+  };
+
+  // Add all of the Underscore functions to the wrapper object.
+  _.mixin(_);
+
+  // Add all mutator Array functions to the wrapper.
+  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+    var method = ArrayProto[name];
+    _.prototype[name] = function() {
+      var obj = this._wrapped;
+      method.apply(obj, arguments);
+      if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];
+      return result.call(this, obj);
+    };
+  });
+
+  // Add all accessor Array functions to the wrapper.
+  each(['concat', 'join', 'slice'], function(name) {
+    var method = ArrayProto[name];
+    _.prototype[name] = function() {
+      return result.call(this, method.apply(this._wrapped, arguments));
+    };
+  });
+
+  _.extend(_.prototype, {
+
+    // Start chaining a wrapped Underscore object.
+    chain: function() {
+      this._chain = true;
+      return this;
+    },
+
+    // Extracts the result from a wrapped and chained object.
+    value: function() {
+      return this._wrapped;
+    }
+
+  });
+
+}).call(this);
Index: /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-jsonlint/node_modules/jsonlint/node_modules/nomnom/package.json	(revision 516)
@@ -27,5 +27,7 @@
   },
   "devDependencies": {
-    "nodeunit": "~0.7.4"
+    "nodeunit": "~0.7.4",
+    "colors": "^0.5.1",
+    "underscore": "^1.4.4"
   },
   "readme": "# nomnom\nnomnom is an option parser for node. It noms your args and gives them back to you in a hash.\n\n```javascript\nvar opts = require(\"nomnom\")\n   .option('debug', {\n      abbr: 'd',\n      flag: true,\n      help: 'Print debugging info'\n   })\n   .option('config', {\n      abbr: 'c',\n      default: 'config.json',\n      help: 'JSON file with tests to run'\n   })\n   .option('version', {\n      flag: true,\n      help: 'print version and exit',\n      callback: function() {\n         return \"version 1.2.4\";\n      }\n   })\n   .parse();\n\nif (opts.debug)\n   // do stuff\n```\n\nYou don't have to specify anything if you don't want to:\n\n```javascript\nvar opts = require(\"nomnom\").parse();\n\nvar url = opts[0];     // get the first positional arg\nvar file = opts.file   // see if --file was specified\nvar verbose = opts.v   // see if -v was specified\nvar extras = opts._    // get an array of the unmatched, positional args\n```\n\n# Install\nfor [node.js](http://nodejs.org/) and [npm](http://github.com/isaacs/npm):\n\n\tnpm install nomnom\n\n# More Details\nNomnom supports args like `-d`, `--debug`, `--no-debug`, `--file=test.txt`, `--file test.txt`, `-f test.txt`, `-xvf`, and positionals. Positionals are arguments that don't fit the `-a` or `--atomic` format and aren't attached to an option.\n\nValues are JSON parsed, so `--debug=true --count=3 --file=log.txt` would give you:\n\n```\n{\n   \"debug\": true,\n   \"count\": 3,\n   \"file\": \"log.txt\"\n}\n```\n\n# Commands\nNomnom supports command-based interfaces (e.g. with git: `git add -p` and `git rebase -i` where `add` and `rebase` are the commands):\n\n```javascript\nvar parser = require(\"nomnom\");\n\nparser.command('browser')\n   .callback(function(opts) {\n      runBrowser(opts.url);\n   })\n   .help(\"run browser tests\");\n\nparser.command('sanity')\n   .option('outfile', {\n      abbr: 'o',\n      help: \"file to write results to\"\n   })\n   .option('config', {\n      abbr: 'c',\n      default: 'config.json',\n      help: \"json manifest of tests to run\"\n   })\n   .callback(function(opts) {\n      runSanity(opts.filename);\n   })\n   .help(\"run the sanity tests\")\n\nparser.parse();\n```\n\nEach command generates its own usage message when `-h` or `--help` is specified with the command.\n\n# Usage\nNomnom prints out a usage message if `--help` or `-h` is an argument. Usage for these options in `test.js`:\n\n```javascript\nvar opts = require(\"nomnom\")\n   .script(\"runtests\")\n   .options({\n      path: {\n         position: 0,\n         help: \"Test file to run\",\n         list: true\n      },\n      config: {\n         abbr: 'c',\n         metavar: 'FILE',\n         help: \"Config file with tests to run\"\n      },\n      debug: {\n         abbr: 'd',\n         flag: true,\n         help: \"Print debugging info\"\n      }\n   }).parse();\n```\n\n...would look like this:\n\n\tusage: runtests <path>... [options]\n\n\tpath     Test file to run\n\n\toptions:\n\t   -c FILE, --config FILE   Config file with tests to run\n\t   -d, --debug              Print debugging info\n\n# Options\nYou can either add a specification for an option with `nomnom.option('name', spec)` or pass the specifications to `nomnom.options()` as a hash keyed on option name. Each option specification can have the following fields:\n\n#### abbr and full\n`abbr` is the single character string to match to this option, `full` is the full-length string (defaults to the name of the option).\n\nThis option matches `-d` and `--debug` on the command line:\n\n```javascript\nnomnom.option('debug', {\n   abbr: 'd'\n})\n```\n\nThis option matches `-n 3`, `--num-lines 12` on the command line:\n\n```javascript\nnomnom.option('numLines', {\n   abbr: 'n',\n   full: 'num-lines'\n})\n```\n\n#### flag\n\nIf this is set to true, the option acts as a flag and doesn't swallow the next value on the command line. Default is `false`, so normally if you had a command line `--config test.js`, `config` would get a value of `test.js` in the options hash. Whereas if you specify:\n\n```javascript\nnomnom.option('config', {\n   flag: true\n})\n```\n\n`config` would get a value of `true` in the options hash, and `test.js` would be a free positional arg.\n\n#### metavar\n\n`metavar` is used in the usage printout e.g. `\"PATH\"` in `\"-f PATH, --file PATH\"`.\n\n#### string\n\nA shorthand for `abbr`, `full`, and `metavar`. For example, to attach an option to `-c` and `--config` use a `string: \"-c FILE, --config=FILE\"`\n\n#### help\n\nA string description of the option for the usage printout.\n\n#### default\n\nThe value to give the option if it's not specified in the arguments.\n\n#### callback\n\nA callback that will be executed as soon as the option is encountered. If the callback returns a string it will print the string and exit:\n\n```javascript\nnomnom.option('count', {\n   callback: function(count) {\n      if (count != parseInt(count))\n         return \"count must be an integer\";\n   }\n})\n```\n\n#### position\n\nThe position of the option if it's a positional argument. If the option should be matched to the first positional arg use position `0`, etc.\n\n#### list\n\nSpecifies that the option is a list. Appending can be achieved by specifying the arg more than once on the command line:\n\n\tnode test.js --file=test1.js --file=test2.js\n\nIf the option has a `position` and `list` is `true`, all positional args including and after `position` will be appended to the array.\n\n#### required\n\nIf this is set to `true` and the option isn't in the args, a message will be printed and the program will exit.\n\n#### choices\n\nA list of the possible values for the option (e.g. `['run', 'test', 'open']`). If the parsed value isn't in the list a message will be printed and the program will exit.\n\n#### type\n\nIf you don't want the option JSON-parsed, specify type `\"string\"`.\n\n#### hidden\n\nOption won't be printed in the usage\n\n\n# Parser interface\n`require(\"nomnom\")` will give you the option parser. You can also make an instance of a parser with `require(\"nomnom\")()`. You can chain any of these functions off of a parser:\n\n#### option\n\nAdd an option specification with the given name:\n\n```javascript\nnomnom.option('debug', {\n   abbr: 'd',\n   flag: true,\n   help: \"Print debugging info\"\n})\n```\n\n#### options\n\nAdd options as a hash keyed by option name, good for a cli with tons of options like [this example](http://github.com/harthur/replace/blob/master/bin/replace.js):\n\n```javascript\nnomnom.options({\n   debug: {\n      abbr: 'd',\n      flag: true,\n      help: \"Print debugging info\"\n   },\n   fruit: {\n      help: \"Fruit to buy\"\n   }\n})\n```\n\n#### usage\n\nThe string that will override the default generated usage message.\n\n#### help\n\nA string that is appended to the usage.\n\n#### script\n\nNomnom can't detect the alias used to run your script. You can use `script` to provide the correct name for the usage printout instead of e.g. `node test.js`.\n\n#### printer\n\nOverrides the usage printing function.\n\n#### command\n\nTakes a command name and gives you a command object on which you can chain command options.\n\n#### nocommand\n\nGives a command object that will be used when no command is called.\n\n#### parse\n\nParses node's `process.argv` and returns the parsed options hash. You can also provide argv:\n\n```javascript\nvar opts = nomnom.parse([\"-xvf\", \"--atomic=true\"])\n```\n\n#### nom\n\nThe same as `parse()`.\n\n# Command interface\nA command is specified with `nomnom.command('name')`. All these functions can be chained on a command:\n\n#### option\n\nAdd an option specifically for this command.\n\n#### options\n\nAdd options for this command as a hash of options keyed by name.\n\n#### callback\n\nA callback that will be called with the parsed options when the command is used.\n\n#### help\n\nA help string describing the function of this command.\n\n#### usage\n\nOverride the default generated usage string for this command.\n",
Index: /Dev/trunk/node_modules/grunt-path-check/.npmignore
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/.npmignore	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/.npmignore	(revision 516)
@@ -0,0 +1,3 @@
+node_modules
+sample/build
+sample/node_modules
Index: /Dev/trunk/node_modules/grunt-path-check/Gruntfile.js
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/Gruntfile.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/Gruntfile.js	(revision 516)
@@ -0,0 +1,47 @@
+/*
+**  grunt-path-check -- Grunt Task for Checking Existence of Programs on PATH
+**  Copyright (c) 2013 Ralf S. Engelschall <rse@engelschall.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.
+*/
+
+/* global module: true */
+module.exports = function (grunt) {
+    grunt.initConfig({
+        pkg: grunt.file.readJSON("package.json"),
+        jshint: {
+            options: {
+                jshintrc: "jshint.json"
+            },
+            gruntfile:   [ "Gruntfile.js" ],
+            sourcefiles: [ "tasks/grunt-path-check.js" ]
+        },
+        clean: {
+            clean:     [ ],
+            distclean: [ "node_modules" ]
+        }
+    });
+
+    grunt.loadNpmTasks("grunt-contrib-jshint");
+    grunt.loadNpmTasks("grunt-contrib-clean");
+
+    grunt.registerTask("default", [ "jshint" ]);
+};
+
Index: /Dev/trunk/node_modules/grunt-path-check/LICENSE.md
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/LICENSE.md	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/LICENSE.md	(revision 516)
@@ -0,0 +1,21 @@
+Copyright (c) 2013 Ralf S. Engelschall (http://engelschall.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.
+
Index: /Dev/trunk/node_modules/grunt-path-check/Makefile
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/Makefile	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/Makefile	(revision 516)
@@ -0,0 +1,41 @@
+##
+##  grunt-path-check -- Grunt Task for Checking Existence of Programs on PATH
+##  Copyright (c) 2013 Ralf S. Engelschall <rse@engelschall.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.
+##
+
+NPM   = npm
+GRUNT = ./node_modules/grunt-cli/bin/grunt 
+
+all: build
+
+bootstrap:
+	@if [ ! -x $(GRUNT) ]; then $(NPM) install; fi
+
+build: bootstrap
+	@$(GRUNT)
+
+clean: bootstrap
+	@$(GRUNT) clean:clean
+
+distclean: bootstrap
+	@$(GRUNT) clean:clean clean:distclean
+
Index: /Dev/trunk/node_modules/grunt-path-check/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/README.md	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/README.md	(revision 516)
@@ -0,0 +1,80 @@
+
+# grunt-path-check
+
+Grunt Task for Checking Existence of Programs on PATH.
+In case a program is not found a warning is issues and
+Grunt by default stop processing until option `--force` is used.
+
+<p/>
+<img src="https://nodei.co/npm/grunt-path-check.png?downloads=true&stars=true" alt=""/>
+
+<p/>
+<img src="https://david-dm.org/rse/grunt-path-check.png" alt=""/>
+
+
+## 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-path-check --save-dev
+```
+
+Once the plugin has been installed, it may be enabled inside your
+Gruntfile with this line of JavaScript:
+
+```js
+grunt.loadNpmTasks("grunt-path-check");
+```
+
+## Task Options
+
+- `tasks`: (default `[]`) the names of Grunt tasks to run if
+   the patch check for the `src` programs are successful.
+
+- `mandatory`: (default `true`) whether the
+   patch check for the `src` programs are mandatory, i.e., if they are
+   not successful, stop processing. Set this to `false` in combination
+   with the `tasks` option to execute a task if a program exists or skip
+   a task if a program does not exist.
+
+## Task Usage
+
+_Run this task with the `grunt path-check` command._
+
+Task targets, files and options may be specified according to the Grunt
+[Configuring tasks](http://gruntjs.com/configuring-tasks) guide.
+
+## Usage Example
+
+```js
+// [...]
+grunt.loadNpmTasks("grunt-shell");
+grunt.loadNpmTasks("grunt-path-check");
+grunt.initConfig({
+    "shell": {
+        "generate-txt": {
+            command: "w3m -dump doc.html >doc.txt"
+        }
+    },
+    "path-check": {
+        "generate-txt": {
+            src: [ "w3m" ],
+            options: {
+                mandatory: false,
+                tasks: [ "shell:generate-txt" ]
+            }
+        }
+    }
+});
+grunt.registerTask("default", [ "path-check:generate-txt" ]);
+// [...]
+```
+
Index: /Dev/trunk/node_modules/grunt-path-check/jshint.json
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/jshint.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/jshint.json	(revision 516)
@@ -0,0 +1,26 @@
+{
+    "maxerr":        200,
+    "bitwise":       true,
+    "camelcase":     false,
+    "curly":         false,
+    "eqeqeq":        true,
+    "forin":         false,
+    "immed":         true,
+    "latedef":       true,
+    "newcap":        false,
+    "noarg":         false,
+    "noempty":       false,
+    "nonew":         true,
+    "plusplus":      false,
+    "quotmark":      "double",
+    "regexp":        false,
+    "undef":         true,
+    "unused":        true,
+    "strict":        false,
+    "trailing":      true,
+    "maxparams":     9,
+    "maxdepth":      7,
+    "maxstatements": 150,
+    "maxlen":        200,
+    "loopfunc":      true
+}
Index: /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/chalk.js
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/chalk.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/chalk.js	(revision 516)
@@ -0,0 +1,64 @@
+'use strict';
+var ansi = require('ansi-styles');
+var defineProps = Object.defineProperties;
+
+ansi.grey = ansi.gray;
+
+var styles = (function () {
+	var ret = {};
+
+	Object.keys(ansi).forEach(function (key) {
+		ret[key] = {
+			get: function () {
+				this._styles.push(key);
+				return this;
+			}
+		};
+	});
+
+	return ret;
+})();
+
+var chalk = module.exports = defineProps({}, init());
+
+function init() {
+	var ret = {};
+
+	Object.keys(styles).forEach(function (name) {
+		ret[name] = {
+			get: function () {
+				var obj = defineProps(function self() {
+					var str = [].slice.call(arguments).join(' ');
+
+					if (!chalk.enabled) {
+						return str;
+					}
+
+					return self._styles.reduce(function (str, name) {
+						var code = ansi[name];
+						return code[0] + (str || '') + code[1];
+					}, str);
+				}, styles);
+
+				obj._styles = [];
+
+				return obj[name];
+			}
+		}
+	});
+
+	return ret;
+}
+
+chalk.styles = ansi;
+
+chalk.stripColor = function (str) {
+	return typeof str === 'string' ? str.replace(/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]/g, '') : str;
+};
+
+chalk.supportsColor = require('has-color');
+
+// detect mode if not set manually
+if (chalk.enabled === undefined) {
+	chalk.enabled = chalk.supportsColor;
+}
Index: /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/node_modules/ansi-styles/ansi-styles.js
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/node_modules/ansi-styles/ansi-styles.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/node_modules/ansi-styles/ansi-styles.js	(revision 516)
@@ -0,0 +1,29 @@
+'use strict';
+module.exports = {
+	reset: ['\x1b[0m', '\x1b[0m'],
+
+	bold: ['\x1b[1m', '\x1b[22m'],
+	italic: ['\x1b[3m', '\x1b[23m'],
+	underline: ['\x1b[4m', '\x1b[24m'],
+	inverse: ['\x1b[7m', '\x1b[27m'],
+	strikethrough: ['\x1b[9m', '\x1b[29m'],
+
+	black: ['\x1b[30m', '\x1b[39m'],
+	red: ['\x1b[31m', '\x1b[39m'],
+	green: ['\x1b[32m', '\x1b[39m'],
+	yellow: ['\x1b[33m', '\x1b[39m'],
+	blue: ['\x1b[34m', '\x1b[39m'],
+	magenta: ['\x1b[35m', '\x1b[39m'],
+	cyan: ['\x1b[36m', '\x1b[39m'],
+	white: ['\x1b[37m', '\x1b[39m'],
+	gray: ['\x1B[90m', '\x1b[39m'],
+
+	bgBlack: ['\x1b[40m', '\x1b[49m'],
+	bgRed: ['\x1b[41m', '\x1b[49m'],
+	bgGreen: ['\x1b[42m', '\x1b[49m'],
+	bgYellow: ['\x1b[43m', '\x1b[49m'],
+	bgBlue: ['\x1b[44m', '\x1b[49m'],
+	bgMagenta: ['\x1b[45m', '\x1b[49m'],
+	bgCyan: ['\x1b[46m', '\x1b[49m'],
+	bgWhite: ['\x1b[47m', '\x1b[49m']
+};
Index: /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/node_modules/ansi-styles/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/node_modules/ansi-styles/package.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/node_modules/ansi-styles/package.json	(revision 516)
@@ -0,0 +1,58 @@
+{
+  "name": "ansi-styles",
+  "version": "0.2.0",
+  "description": "ANSI escape codes for colorizing strings in the terminal",
+  "keywords": [
+    "ansi",
+    "styles",
+    "color",
+    "colour",
+    "colors",
+    "terminal",
+    "console",
+    "cli",
+    "string",
+    "tty",
+    "escape",
+    "formatting",
+    "rgb",
+    "256",
+    "shell",
+    "xterm",
+    "log",
+    "logging",
+    "command-line",
+    "text"
+  ],
+  "homepage": "https://github.com/sindresorhus/ansi-styles",
+  "bugs": {
+    "url": "https://github.com/sindresorhus/ansi-styles/issues"
+  },
+  "license": "MIT",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "http://sindresorhus.com"
+  },
+  "files": [
+    "ansi-styles.js"
+  ],
+  "main": "ansi-styles",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/sindresorhus/ansi-styles.git"
+  },
+  "scripts": {
+    "test": "mocha"
+  },
+  "devDependencies": {
+    "mocha": "~1.12.0"
+  },
+  "engines": {
+    "node": ">=0.8.0"
+  },
+  "readme": "# ansi-styles [![Build Status](https://secure.travis-ci.org/sindresorhus/ansi-styles.png?branch=master)](http://travis-ci.org/sindresorhus/ansi-styles)\n\n> ANSI escape codes for colorizing strings in the terminal.\n\nYou probably want the higher-level [chalk](https://github.com/sindresorhus/chalk) module for styling your strings.\n\n![screenshot](screenshot.png)\n\n\n## Install\n\nInstall with [npm](https://npmjs.org/package/ansi-styles): `npm install --save ansi-styles`\n\n\n## Example\n\n```js\nvar ansi = require('ansi-styles');\n\nconsole.log(ansi.green[0] + 'Hello world!' + ansi.green[1]);\n```\n\n## API\n\nEach style is an array of a start and end escape code.\n\n\n## Styles\n\n### General\n\n- reset\n- bold\n- italic\n- underline\n- inverse\n- strikethrough\n\n### Text colors\n\n- black\n- red\n- green\n- yellow\n- blue\n- magenta\n- cyan\n- white\n- gray\n\n### Background colors\n\n- bgBlack\n- bgRed\n- bgGreen\n- bgYellow\n- bgBlue\n- bgMagenta\n- bgCyan\n- bgWhite\n\n\n## License\n\nMIT License â¢ Â© [Sindre Sorhus](http://sindresorhus.com)\n",
+  "readmeFilename": "readme.md",
+  "_id": "ansi-styles@0.2.0",
+  "_from": "ansi-styles@~0.2.0"
+}
Index: /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/node_modules/ansi-styles/readme.md
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/node_modules/ansi-styles/readme.md	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/node_modules/ansi-styles/readme.md	(revision 516)
@@ -0,0 +1,65 @@
+# ansi-styles [![Build Status](https://secure.travis-ci.org/sindresorhus/ansi-styles.png?branch=master)](http://travis-ci.org/sindresorhus/ansi-styles)
+
+> ANSI escape codes for colorizing strings in the terminal.
+
+You probably want the higher-level [chalk](https://github.com/sindresorhus/chalk) module for styling your strings.
+
+![screenshot](screenshot.png)
+
+
+## Install
+
+Install with [npm](https://npmjs.org/package/ansi-styles): `npm install --save ansi-styles`
+
+
+## Example
+
+```js
+var ansi = require('ansi-styles');
+
+console.log(ansi.green[0] + 'Hello world!' + ansi.green[1]);
+```
+
+## API
+
+Each style is an array of a start and end escape code.
+
+
+## Styles
+
+### General
+
+- reset
+- bold
+- italic
+- underline
+- inverse
+- strikethrough
+
+### Text colors
+
+- black
+- red
+- green
+- yellow
+- blue
+- magenta
+- cyan
+- white
+- gray
+
+### Background colors
+
+- bgBlack
+- bgRed
+- bgGreen
+- bgYellow
+- bgBlue
+- bgMagenta
+- bgCyan
+- bgWhite
+
+
+## License
+
+MIT License â¢ Â© [Sindre Sorhus](http://sindresorhus.com)
Index: /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/node_modules/has-color/has-color.js
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/node_modules/has-color/has-color.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/node_modules/has-color/has-color.js	(revision 516)
@@ -0,0 +1,24 @@
+'use strict';
+module.exports = (function () {
+	if (process.argv.indexOf('--no-color') !== -1) {
+		return false;
+	}
+
+	if (process.argv.indexOf('--color') !== -1) {
+		return true;
+	}
+
+	if (!process.stdout.isTTY) {
+		return false;
+	}
+
+	if (process.platform === 'win32') {
+		return true;
+	}
+
+	if ('COLORTERM' in process.env) {
+		return true;
+	}
+
+	return /^screen|^xterm|color|ansi|cygwin|linux/i.test(process.env.TERM);
+})();
Index: /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/node_modules/has-color/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/node_modules/has-color/package.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/node_modules/has-color/package.json	(revision 516)
@@ -0,0 +1,55 @@
+{
+  "name": "has-color",
+  "version": "0.1.4",
+  "description": "Detect whether a terminal supports color",
+  "keywords": [
+    "color",
+    "colour",
+    "colors",
+    "terminal",
+    "console",
+    "cli",
+    "ansi",
+    "styles",
+    "tty",
+    "rgb",
+    "256",
+    "shell",
+    "xterm",
+    "command-line",
+    "support",
+    "capability",
+    "detect"
+  ],
+  "homepage": "https://github.com/sindresorhus/has-color",
+  "bugs": {
+    "url": "https://github.com/sindresorhus/has-color/issues"
+  },
+  "license": "MIT",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "http://sindresorhus.com"
+  },
+  "files": [
+    "has-color.js"
+  ],
+  "main": "has-color",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/sindresorhus/has-color.git"
+  },
+  "scripts": {
+    "test": "mocha"
+  },
+  "devDependencies": {
+    "mocha": "~1.12.0"
+  },
+  "engines": {
+    "node": ">=0.8.0"
+  },
+  "readme": "# has-color [![Build Status](https://secure.travis-ci.org/sindresorhus/has-color.png?branch=master)](http://travis-ci.org/sindresorhus/has-color)\n\n> Detect whether a terminal supports color.\n\nUsed in the terminal color module [chalk](https://github.com/sindresorhus/chalk).\n\n\n## Install\n\nInstall with [npm](https://npmjs.org/package/has-color): `npm install --save has-color`\n\n\n## Example\n\n```js\nvar hasColor = require('has-color');\n\nif (hasColor) {\n\tconsole.log('Terminal supports color.');\n}\n```\n\nIt obeys the CLI flags `--color` and `--no-color`.\n\n\n## License\n\nMIT Â© [Sindre Sorhus](http://sindresorhus.com)\n",
+  "readmeFilename": "readme.md",
+  "_id": "has-color@0.1.4",
+  "_from": "has-color@~0.1.0"
+}
Index: /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/node_modules/has-color/readme.md
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/node_modules/has-color/readme.md	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/node_modules/has-color/readme.md	(revision 516)
@@ -0,0 +1,28 @@
+# has-color [![Build Status](https://secure.travis-ci.org/sindresorhus/has-color.png?branch=master)](http://travis-ci.org/sindresorhus/has-color)
+
+> Detect whether a terminal supports color.
+
+Used in the terminal color module [chalk](https://github.com/sindresorhus/chalk).
+
+
+## Install
+
+Install with [npm](https://npmjs.org/package/has-color): `npm install --save has-color`
+
+
+## Example
+
+```js
+var hasColor = require('has-color');
+
+if (hasColor) {
+	console.log('Terminal supports color.');
+}
+```
+
+It obeys the CLI flags `--color` and `--no-color`.
+
+
+## License
+
+MIT Â© [Sindre Sorhus](http://sindresorhus.com)
Index: /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/package.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/package.json	(revision 516)
@@ -0,0 +1,65 @@
+{
+  "name": "chalk",
+  "version": "0.3.0",
+  "description": "Terminal string styling done right",
+  "keywords": [
+    "color",
+    "colour",
+    "colors",
+    "terminal",
+    "console",
+    "cli",
+    "string",
+    "ansi",
+    "styles",
+    "tty",
+    "formatting",
+    "rgb",
+    "256",
+    "shell",
+    "xterm",
+    "log",
+    "logging",
+    "command-line",
+    "text"
+  ],
+  "homepage": "https://github.com/sindresorhus/chalk",
+  "bugs": {
+    "url": "https://github.com/sindresorhus/chalk/issues"
+  },
+  "license": "MIT",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "http://sindresorhus.com"
+  },
+  "files": [
+    "chalk.js"
+  ],
+  "main": "chalk",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/sindresorhus/chalk.git"
+  },
+  "scripts": {
+    "test": "mocha"
+  },
+  "dependencies": {
+    "has-color": "~0.1.0",
+    "ansi-styles": "~0.2.0"
+  },
+  "devDependencies": {
+    "mocha": "~1.12.0"
+  },
+  "engines": {
+    "node": ">=0.8.0"
+  },
+  "readme": "# chalk [![Build Status](https://secure.travis-ci.org/sindresorhus/chalk.png?branch=master)](http://travis-ci.org/sindresorhus/chalk)\n\n> Terminal string styling done right.\n\n[colors.js](https://github.com/Marak/colors.js) is currently the most popular string styling module, but it has serious deficiencies like extending String.prototype which causes all kinds of problems. Although there are other ones, they either do too much or not enough.\n\n**Chalk is a clean and focused alternative.**\n\n![screenshot](screenshot.png)\n\n\n## Why\n\n- **Doesn't extend String.prototype**\n- Expressive API\n- Clean and focused\n- Auto-detects color support\n- Actively maintained\n\n\n## Install\n\nInstall with [npm](https://npmjs.org/package/chalk): `npm install --save chalk`\n\n\n## Example\n\nChalk comes with an easy to use composable API where you just chain the styles you want.\n\n```js\nvar chalk = require('chalk');\n\n// style a string\nconsole.log(chalk.blue('Hello world!'));\n\n// combine styled and normal strings\nconsole.log(chalk.blue('Hello'), 'World' + chalk.red('!'));\n\n// compose multiple styles using the chainable API\nconsole.log(chalk.blue.bgRed.bold('Hello world!'));\n\n// nest styles\nchalk.red('Hello', chalk.underline.bgBlue('world') + '!');\n\n// pass in multiple arguments\nconsole.log(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz')) \n```\n\nYou can easily define your own themes.\n\n```js\nvar chalk = require('chalk');\nvar error = chalk.bold.red;\nconsole.log(error('Error!'));\n```\n\n\n## API\n\n### chalk.\\<style>\\[.\\<style>...](string)\n\nChain [styles](#styles) and call the last one as a method with a string argument.\n\nMultiple arguments are also supported. Chalk will add a space between each one.\n\n### chalk.enabled\n\nColor support is automatically detected, but you can override it.\n\n### chalk.supportsColor\n\nDetect whether the terminal [supports color](https://github.com/sindresorhus/has-color).\n\nCan be overridden by the user with the flags `--color` and `--no-color`.\n\nUsed internally and handled for you, but exposed for convenience.\n\n### chalk.styles\n\nExposes the styles as [ANSI escape codes](https://github.com/sindresorhus/ansi-styles).\n\n```js\nvar chalk = require('chalk');\n\nconsole.log(chalk.styles.red);\n//=> ['\\x1b[31m', '\\x1b[39m']\n\nconsole.log(chalk.styles.red[0] + 'Hello' + chalk.styles.red[1]);\n// first item is the style escape code and second is the reset escape code\n```\n\n### chalk.stripColor(string)\n\nStrip color from a string.\n\n\n## Styles\n\n### General\n\n- reset\n- bold\n- italic\n- underline\n- inverse\n- strikethrough\n\n### Text colors\n\n- black\n- red\n- green\n- yellow\n- blue\n- magenta\n- cyan\n- white\n- gray\n\n### Background colors\n\n- bgBlack\n- bgRed\n- bgGreen\n- bgYellow\n- bgBlue\n- bgMagenta\n- bgCyan\n- bgWhite\n\n\n## License\n\nMIT License â¢ Â© [Sindre Sorhus](http://sindresorhus.com)\n",
+  "readmeFilename": "readme.md",
+  "_id": "chalk@0.3.0",
+  "dist": {
+    "shasum": "3060223cf27f5acc9953ba1a25e177b55da23665"
+  },
+  "_from": "chalk@0.3.0",
+  "_resolved": "https://registry.npmjs.org/chalk/-/chalk-0.3.0.tgz"
+}
Index: /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/readme.md
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/readme.md	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/node_modules/chalk/readme.md	(revision 516)
@@ -0,0 +1,134 @@
+# chalk [![Build Status](https://secure.travis-ci.org/sindresorhus/chalk.png?branch=master)](http://travis-ci.org/sindresorhus/chalk)
+
+> Terminal string styling done right.
+
+[colors.js](https://github.com/Marak/colors.js) is currently the most popular string styling module, but it has serious deficiencies like extending String.prototype which causes all kinds of problems. Although there are other ones, they either do too much or not enough.
+
+**Chalk is a clean and focused alternative.**
+
+![screenshot](screenshot.png)
+
+
+## Why
+
+- **Doesn't extend String.prototype**
+- Expressive API
+- Clean and focused
+- Auto-detects color support
+- Actively maintained
+
+
+## Install
+
+Install with [npm](https://npmjs.org/package/chalk): `npm install --save chalk`
+
+
+## Example
+
+Chalk comes with an easy to use composable API where you just chain the styles you want.
+
+```js
+var chalk = require('chalk');
+
+// style a string
+console.log(chalk.blue('Hello world!'));
+
+// combine styled and normal strings
+console.log(chalk.blue('Hello'), 'World' + chalk.red('!'));
+
+// compose multiple styles using the chainable API
+console.log(chalk.blue.bgRed.bold('Hello world!'));
+
+// nest styles
+chalk.red('Hello', chalk.underline.bgBlue('world') + '!');
+
+// pass in multiple arguments
+console.log(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz')) 
+```
+
+You can easily define your own themes.
+
+```js
+var chalk = require('chalk');
+var error = chalk.bold.red;
+console.log(error('Error!'));
+```
+
+
+## API
+
+### chalk.\<style>\[.\<style>...](string)
+
+Chain [styles](#styles) and call the last one as a method with a string argument.
+
+Multiple arguments are also supported. Chalk will add a space between each one.
+
+### chalk.enabled
+
+Color support is automatically detected, but you can override it.
+
+### chalk.supportsColor
+
+Detect whether the terminal [supports color](https://github.com/sindresorhus/has-color).
+
+Can be overridden by the user with the flags `--color` and `--no-color`.
+
+Used internally and handled for you, but exposed for convenience.
+
+### chalk.styles
+
+Exposes the styles as [ANSI escape codes](https://github.com/sindresorhus/ansi-styles).
+
+```js
+var chalk = require('chalk');
+
+console.log(chalk.styles.red);
+//=> ['\x1b[31m', '\x1b[39m']
+
+console.log(chalk.styles.red[0] + 'Hello' + chalk.styles.red[1]);
+// first item is the style escape code and second is the reset escape code
+```
+
+### chalk.stripColor(string)
+
+Strip color from a string.
+
+
+## Styles
+
+### General
+
+- reset
+- bold
+- italic
+- underline
+- inverse
+- strikethrough
+
+### Text colors
+
+- black
+- red
+- green
+- yellow
+- blue
+- magenta
+- cyan
+- white
+- gray
+
+### Background colors
+
+- bgBlack
+- bgRed
+- bgGreen
+- bgYellow
+- bgBlue
+- bgMagenta
+- bgCyan
+- bgWhite
+
+
+## License
+
+MIT License â¢ Â© [Sindre Sorhus](http://sindresorhus.com)
Index: /Dev/trunk/node_modules/grunt-path-check/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/package.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/package.json	(revision 516)
@@ -0,0 +1,52 @@
+{
+  "name": "grunt-path-check",
+  "homepage": "http://github.com/rse/grunt-path-check",
+  "description": "Grunt Task for Checking Existence of Programs on PATH",
+  "version": "0.9.3",
+  "license": "MIT",
+  "author": {
+    "name": "Ralf S. Engelschall",
+    "email": "rse@engelschall.com",
+    "url": "http://engelschall.com"
+  },
+  "keywords": [
+    "gruntplugin",
+    "path",
+    "check",
+    "executable",
+    "program",
+    "binary"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/rse/grunt-path-check.git"
+  },
+  "bugs": {
+    "url": "http://github.com/rse/grunt-path-check/issues"
+  },
+  "main": "Gruntfile.js",
+  "devDependencies": {
+    "grunt": "~0.4.1",
+    "grunt-cli": "~0.1.10",
+    "grunt-contrib-jshint": "~0.7.1",
+    "grunt-contrib-clean": "~0.5.0",
+    "chalk": "^0.3.0"
+  },
+  "peerDependencies": {
+    "grunt": "~0.4.1"
+  },
+  "dependencies": {
+    "chalk": "~0.3.0"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "readme": "\n# grunt-path-check\n\nGrunt Task for Checking Existence of Programs on PATH.\nIn case a program is not found a warning is issues and\nGrunt by default stop processing until option `--force` is used.\n\n<p/>\n<img src=\"https://nodei.co/npm/grunt-path-check.png?downloads=true&stars=true\" alt=\"\"/>\n\n<p/>\n<img src=\"https://david-dm.org/rse/grunt-path-check.png\" alt=\"\"/>\n\n\n## Getting Started\n\nThis plugin requires Grunt `~0.4.0`\n\nIf you haven't used [Grunt](http://gruntjs.com/)\nbefore, be sure to check out the [Getting\nStarted](http://gruntjs.com/getting-started) guide, as it explains how\nto create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as\ninstall and use Grunt plugins. Once you're familiar with that process,\nyou may install this plugin with this command:\n\n```shell\nnpm install grunt-path-check --save-dev\n```\n\nOnce the plugin has been installed, it may be enabled inside your\nGruntfile with this line of JavaScript:\n\n```js\ngrunt.loadNpmTasks(\"grunt-path-check\");\n```\n\n## Task Options\n\n- `tasks`: (default `[]`) the names of Grunt tasks to run if\n   the patch check for the `src` programs are successful.\n\n- `mandatory`: (default `true`) whether the\n   patch check for the `src` programs are mandatory, i.e., if they are\n   not successful, stop processing. Set this to `false` in combination\n   with the `tasks` option to execute a task if a program exists or skip\n   a task if a program does not exist.\n\n## Task Usage\n\n_Run this task with the `grunt path-check` command._\n\nTask targets, files and options may be specified according to the Grunt\n[Configuring tasks](http://gruntjs.com/configuring-tasks) guide.\n\n## Usage Example\n\n```js\n// [...]\ngrunt.loadNpmTasks(\"grunt-shell\");\ngrunt.loadNpmTasks(\"grunt-path-check\");\ngrunt.initConfig({\n    \"shell\": {\n        \"generate-txt\": {\n            command: \"w3m -dump doc.html >doc.txt\"\n        }\n    },\n    \"path-check\": {\n        \"generate-txt\": {\n            src: [ \"w3m\" ],\n            options: {\n                mandatory: false,\n                tasks: [ \"shell:generate-txt\" ]\n            }\n        }\n    }\n});\ngrunt.registerTask(\"default\", [ \"path-check:generate-txt\" ]);\n// [...]\n```\n\n",
+  "readmeFilename": "README.md",
+  "_id": "grunt-path-check@0.9.3",
+  "dist": {
+    "shasum": "a9ca77e1f008a403dd770dfa0dd596375a782347"
+  },
+  "_from": "grunt-path-check@",
+  "_resolved": "https://registry.npmjs.org/grunt-path-check/-/grunt-path-check-0.9.3.tgz"
+}
Index: /Dev/trunk/node_modules/grunt-path-check/sample/Gruntfile.js
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/sample/Gruntfile.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/sample/Gruntfile.js	(revision 516)
@@ -0,0 +1,27 @@
+
+/* global module: true */
+module.exports = function (grunt) {
+    grunt.loadNpmTasks("grunt-shell");
+    grunt.loadTasks("../tasks");
+
+    grunt.initConfig({
+        pkg: grunt.file.readJSON("package.json"),
+        shell: {
+            "cat": {
+                command: "cat Gruntfile.js"
+            }
+        },
+        "path-check": {
+            "tools1": {
+                src: [ "cp", "ls", "mv", "perl", "w3m" ]
+            },
+            "tools2": {
+                src: [ "catx" ],
+                options: { mandatory: false, tasks: [ "shell:cat" ] }
+            }
+        }
+    });
+
+    grunt.registerTask("default", [ "path-check" ]);
+};
+
Index: /Dev/trunk/node_modules/grunt-path-check/sample/Makefile
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/sample/Makefile	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/sample/Makefile	(revision 516)
@@ -0,0 +1,18 @@
+
+NPM   = npm
+GRUNT = ./node_modules/grunt-cli/bin/grunt 
+
+all: build
+
+bootstrap:
+	@if [ ! -x $(GRUNT) ]; then $(NPM) install; fi
+
+build: bootstrap
+	@$(GRUNT)
+
+clean: bootstrap
+	@$(GRUNT) clean:clean
+
+distclean: bootstrap
+	@$(GRUNT) clean:clean clean:distclean
+
Index: /Dev/trunk/node_modules/grunt-path-check/sample/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/sample/README.md	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/sample/README.md	(revision 516)
@@ -0,0 +1,4 @@
+
+Sample
+======
+
Index: /Dev/trunk/node_modules/grunt-path-check/sample/jshint.json
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/sample/jshint.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/sample/jshint.json	(revision 516)
@@ -0,0 +1,26 @@
+{
+    "maxerr":        200,
+    "bitwise":       true,
+    "camelcase":     false,
+    "curly":         false,
+    "eqeqeq":        true,
+    "forin":         false,
+    "immed":         true,
+    "latedef":       true,
+    "newcap":        false,
+    "noarg":         false,
+    "noempty":       false,
+    "nonew":         true,
+    "plusplus":      false,
+    "quotmark":      "double",
+    "regexp":        false,
+    "undef":         true,
+    "unused":        true,
+    "strict":        false,
+    "trailing":      true,
+    "maxparams":     9,
+    "maxdepth":      7,
+    "maxstatements": 150,
+    "maxlen":        200,
+    "loopfunc":      true
+}
Index: /Dev/trunk/node_modules/grunt-path-check/sample/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/sample/package.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/sample/package.json	(revision 516)
@@ -0,0 +1,28 @@
+{
+    "name":        "sample",
+    "version":     "1.2.3",
+    "description": "",
+    "scripts": {
+        "test": "grunt"
+    },
+    "repository": {
+        "type": "git",
+        "url":  "https://github.com/rse/grunt-path-check.git"
+    },
+    "author": {
+        "name":  "Ralf S. Engelschall",
+        "email": "rse@engelschall.com",
+        "url":   "http://engelschall.com"
+    },
+    "licenses": [{
+        "type": "MIT",
+        "url":  "http://opensource.org/licenses/MIT"
+    }],
+    "homepage": "https://github.com/rse/grunt-path-check",
+    "bugs":     "https://github.com/rse/grunt-path-check/issues",
+    "devDependencies": {
+        "grunt":                "~0.4.1",
+        "grunt-cli":            "~0.1.9",
+        "grunt-shell":          "~0.4.0"
+    }
+}
Index: /Dev/trunk/node_modules/grunt-path-check/tasks/grunt-path-check.js
===================================================================
--- /Dev/trunk/node_modules/grunt-path-check/tasks/grunt-path-check.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-path-check/tasks/grunt-path-check.js	(revision 516)
@@ -0,0 +1,94 @@
+/*
+**  grunt-path-check -- Grunt Task for Checking Existence of Programs on PATH
+**  Copyright (c) 2013 Ralf S. Engelschall <rse@engelschall.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.
+*/
+
+/* global module: false */
+module.exports = function (grunt) {
+    /* global require: false */
+    var path  = require("path");
+    var chalk = require("chalk");
+
+    /*  define the Grunt task  */
+    grunt.registerMultiTask("path-check", "Check Existence of Programs on PATH", function () {
+        /*  prepare task options  */
+        var options = this.options({
+            mandatory: true,
+            tasks: []
+        });
+        grunt.verbose.writeflags(options, "Options");
+
+        /*  retrieve the PATH elements  */
+        /* global process: false */
+        var PATH = process.env.PATH.split(path.delimiter);
+
+        /*  iterate over all src-dest file pairs  */
+        var errors = 0;
+        this.files.forEach(function (f) {
+            /*  iterate over all programs  */
+            f.orig.src.forEach(function (name) {
+                /*  iterate over all path elements  */
+                var found = false;
+                PATH.forEach(function (dir) {
+                    /*  short-circuiting  */
+                    if (found)
+                        return;
+
+                    /*  check for program existence  */
+                    var file = path.join(dir, name);
+                    if (grunt.file.exists(file)) {
+                        grunt.log.writeln("Program \"" + chalk.green(name) + "\" found under \"" + chalk.green(file) + "\".");
+                        found = true;
+                    }
+                });
+
+                /*  just record the fact that a program is not found
+                    (intentionally still does not abort Grunt processing)  */
+                if (!found) {
+                    grunt.log.warn("Program \"" + chalk.red(name) + "\" not found in PATH.");
+                    errors++;
+                }
+            });
+        });
+        if (errors > 0) {
+            if (options.mandatory)
+                grunt.fail.warn(chalk.red(errors) + " program(s) not found in PATH!");
+            else
+                grunt.log.warn(chalk.red(errors) + " program(s) not found in PATH!");
+            if (options.tasks.length > 0)
+                grunt.log.writeln("Skipping dependent tasks: \"" +
+                    options.tasks
+                    .map(function (task) { return chalk.red(task); })
+                    .join("\", \"") +
+                "\"");
+        }
+        else if (options.tasks.length > 0) {
+            grunt.log.writeln("Running dependent tasks: \"" +
+                options.tasks
+                .map(function (task) { return chalk.green(task); })
+                .join("\", \"") +
+            "\"");
+            grunt.task.run(options.tasks);
+        }
+    });
+};
+
Index: /Dev/trunk/node_modules/grunt-svninfo/.jshintrc
===================================================================
--- /Dev/trunk/node_modules/grunt-svninfo/.jshintrc	(revision 516)
+++ /Dev/trunk/node_modules/grunt-svninfo/.jshintrc	(revision 516)
@@ -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
+}
Index: /Dev/trunk/node_modules/grunt-svninfo/.npmignore
===================================================================
--- /Dev/trunk/node_modules/grunt-svninfo/.npmignore	(revision 516)
+++ /Dev/trunk/node_modules/grunt-svninfo/.npmignore	(revision 516)
@@ -0,0 +1,1 @@
+/node_modules/
Index: /Dev/trunk/node_modules/grunt-svninfo/Gruntfile.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-svninfo/Gruntfile.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-svninfo/Gruntfile.coffee	(revision 516)
@@ -0,0 +1,47 @@
+#
+# * grunt-svninfo
+# * https://github.com/liqweed/grunt-svninfo
+# *
+# * Copyright (c) 2013 liqweed
+# * Licensed under the MIT license.
+#
+"use strict"
+module.exports = (grunt) ->
+
+  # Project configuration.
+  grunt.initConfig
+
+    # Before generating any new files, remove any previously-created files.
+    clean:
+      tests: ["tmp"]
+
+    # Unit tests.
+    nodeunit:
+      tests: ["test/*_test.js"]
+
+    coffeelint:
+      app: ['Gruntfile.coffee','tasks/*.coffee', 'test/*.coffee']
+      options:
+        'no_trailing_whitespace':
+          'level': 'error'
+        'max_line_length':
+          value: 100,
+          level: "warn"
+    svninfo:
+      options:
+        cwd:"test/fixtures/svninfo/"
+
+  # Actually load this plugin's task(s).
+  grunt.loadTasks "tasks"
+
+  # These plugins provide necessary tasks.
+  grunt.loadNpmTasks "grunt-coffeelint"
+  grunt.loadNpmTasks "grunt-contrib-clean"
+  grunt.loadNpmTasks "grunt-contrib-nodeunit"
+
+  # 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", "svninfo", "nodeunit"]
+
+  # By default, lint and run all tests.
+  grunt.registerTask "default", ["coffeelint"]
Index: /Dev/trunk/node_modules/grunt-svninfo/LICENSE-MIT
===================================================================
--- /Dev/trunk/node_modules/grunt-svninfo/LICENSE-MIT	(revision 516)
+++ /Dev/trunk/node_modules/grunt-svninfo/LICENSE-MIT	(revision 516)
@@ -0,0 +1,22 @@
+Copyright (c) 2013 liqweed
+
+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.
Index: /Dev/trunk/node_modules/grunt-svninfo/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt-svninfo/README.md	(revision 516)
+++ /Dev/trunk/node_modules/grunt-svninfo/README.md	(revision 516)
@@ -0,0 +1,128 @@
+# grunt-svninfo
+
+> A Grunt.js plugin that provides easy access to Subversion working copy metadata (svn info).
+
+## 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-svninfo --save-dev
+```
+
+One the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:
+
+```js
+grunt.loadNpmTasks('grunt-svninfo');
+```
+
+That's about it, no configuration necessary.
+
+## The "svninfo" task
+
+### Overview
+In your project's Gruntfile, add a section named `svninfo` to the data object passed into `grunt.initConfig()`.
+Executing the task `svninfo` would run `svn info` in the command line and would make the retrieved data available via grunt.config (e.g. `<%= svninfo.rev %>`) in your build.
+The resulting `svninfo` object has the following structure:
+
+
+```js
+{
+  "rev": "321",
+  "url": "https://yourproject.unfuddle.com/svn/repo/trunk",
+  "last": {
+ 	  "rev": "321",
+ 	  "author": "me",
+ 	  "date": "2013-02-10 12:35:30 +0200"
+  },
+  "repository": {
+ 	  "root": "https://yourproject.unfuddle.com/svn/repo",
+ 	  "id": "f5d41312-1fa6-4ca6-a93e-e27d7e98fc43"
+  }
+}
+```
+
+### Options
+
+#### cwd
+Type: `String`
+
+Allows to specify a cwd (current working directory) path for the SVN repository of which to retrieve the information. The default directory is the where you run grunt from (`'.'`).
+
+Example:
+``` js
+svninfo: {
+  options: {
+    cwd: './myproject/ishere'
+  },
+  ...
+}
+```
+
+#### output
+Type: `String`
+
+Allows to specify a custom object that would contain the retrieved and parsed SVN info. Defaults to 'svninfo'. This feature came about to support projects with multiple external dependencies ("extenals"), in which each external would have its own info object instead of having them override each other with each 'info' call.
+
+Name of object can be redefined or specified by the first argument of task (see below).
+
+Example:
+``` js
+svninfo: {
+  options: {
+    output: 'myExternal_svninfo'
+  },
+  ...
+}
+```
+
+#### args
+Type: `Array`
+
+Allows to specify options for `svn info` command (e.g. target, username, password etc).
+
+Example:
+``` js
+svninfo: {
+  options: {
+    args: ['http://some.svn-server.net/repo/project/trunk', '--username', 'name', '--password', 'pass']
+  },
+  ...
+}
+```
+
+It is possible to retrieve command options from other option instead of `args`.
+It can be done by using the second argument of task (see below).
+
+### Task arguments
+
+Two arguments can be passed to the task:
+
+1. Allows to specify a custom object that would contain the retrieved and parsed SVN info. This argument has priority over the `output` option.
+2. Allows to specify name of options field that contains list of command options. This argument has priority over the `args` option.
+
+Example: 
+``` js
+grunt.initConfig({
+  svninfo: {
+    options: {
+      abcArgs: ['http://some.svn-server.net/repo/abc/trunk', '--username', 'name', '--password', 'pass']
+    },
+    ...
+  }
+...
+grunt.registerTask("abcInfo", ["svninfo:abc:abcArgs"]);
+// or `grunt svninfo:abc:abcArgs` from command line
+});
+```
+
+## Contributing
+In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).
+
+## Release History
+ * 0.1.4 - Support for task arguments and args option (thanks to @gamtiq)
+ * 0.1.3 - Support for a custom name for the info object (thanks to @solomojb)
+ * 0.1.2 - Support for 'cwd' option (thanks to @richmarr)
+ * 0.1.1 - Grunt 0.4.x compatibility
+ * 0.1.0 - Initial release
Index: /Dev/trunk/node_modules/grunt-svninfo/bin/grunt-svninfo
===================================================================
--- /Dev/trunk/node_modules/grunt-svninfo/bin/grunt-svninfo	(revision 516)
+++ /Dev/trunk/node_modules/grunt-svninfo/bin/grunt-svninfo	(revision 516)
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+require('grunt').npmTasks('grunt-svninfo').cli();
Index: /Dev/trunk/node_modules/grunt-svninfo/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-svninfo/package.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt-svninfo/package.json	(revision 516)
@@ -0,0 +1,53 @@
+{
+  "name": "grunt-svninfo",
+  "description": "Subversion working copy metadata (svn info) grunt plugin",
+  "version": "0.1.4",
+  "homepage": "https://github.com/liqweed/grunt-svninfo",
+  "author": {
+    "name": "liqweed"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/liqweed/grunt-svninfo.git"
+  },
+  "bugs": {
+    "url": "https://github.com/liqweed/grunt-svninfo/issues"
+  },
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "https://github.com/liqweed/grunt-svninfo/blob/master/LICENSE-MIT"
+    }
+  ],
+  "main": "Gruntfile.js",
+  "engines": {
+    "node": ">= 0.8.0"
+  },
+  "scripts": {
+    "test": "grunt test"
+  },
+  "devDependencies": {
+    "grunt-contrib-clean": "~0.5.0",
+    "grunt-contrib-nodeunit": "~0.2.0",
+    "grunt-coffeelint": "*",
+    "grunt-mocha-cli": "*",
+    "grunt": "~0.4.x"
+  },
+  "peerDependencies": {
+    "grunt": "~0.4.x"
+  },
+  "keywords": [
+    "gruntplugin",
+    "svn",
+    "subversion",
+    "svninfo"
+  ],
+  "readme": "# grunt-svninfo\r\n\r\n> A Grunt.js plugin that provides easy access to Subversion working copy metadata (svn info).\r\n\r\n## Getting Started\r\nThis plugin requires Grunt `~0.4.0`\r\n\r\nIf 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:\r\n\r\n```shell\r\nnpm install grunt-svninfo --save-dev\r\n```\r\n\r\nOne the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:\r\n\r\n```js\r\ngrunt.loadNpmTasks('grunt-svninfo');\r\n```\r\n\r\nThat's about it, no configuration necessary.\r\n\r\n## The \"svninfo\" task\r\n\r\n### Overview\r\nIn your project's Gruntfile, add a section named `svninfo` to the data object passed into `grunt.initConfig()`.\r\nExecuting the task `svninfo` would run `svn info` in the command line and would make the retrieved data available via grunt.config (e.g. `<%= svninfo.rev %>`) in your build.\r\nThe resulting `svninfo` object has the following structure:\r\n\r\n\r\n```js\r\n{\r\n  \"rev\": \"321\",\r\n  \"url\": \"https://yourproject.unfuddle.com/svn/repo/trunk\",\r\n  \"last\": {\r\n \t  \"rev\": \"321\",\r\n \t  \"author\": \"me\",\r\n \t  \"date\": \"2013-02-10 12:35:30 +0200\"\r\n  },\r\n  \"repository\": {\r\n \t  \"root\": \"https://yourproject.unfuddle.com/svn/repo\",\r\n \t  \"id\": \"f5d41312-1fa6-4ca6-a93e-e27d7e98fc43\"\r\n  }\r\n}\r\n```\r\n\r\n### Options\r\n\r\n#### cwd\r\nType: `String`\r\n\r\nAllows to specify a cwd (current working directory) path for the SVN repository of which to retrieve the information. The default directory is the where you run grunt from (`'.'`).\r\n\r\nExample:\r\n``` js\r\nsvninfo: {\r\n  options: {\r\n    cwd: './myproject/ishere'\r\n  },\r\n  ...\r\n}\r\n```\r\n\r\n#### output\r\nType: `String`\r\n\r\nAllows to specify a custom object that would contain the retrieved and parsed SVN info. Defaults to 'svninfo'. This feature came about to support projects with multiple external dependencies (\"extenals\"), in which each external would have its own info object instead of having them override each other with each 'info' call.\r\n\r\nName of object can be redefined or specified by the first argument of task (see below).\r\n\r\nExample:\r\n``` js\r\nsvninfo: {\r\n  options: {\r\n    output: 'myExternal_svninfo'\r\n  },\r\n  ...\r\n}\r\n```\r\n\r\n#### args\r\nType: `Array`\r\n\r\nAllows to specify options for `svn info` command (e.g. target, username, password etc).\r\n\r\nExample:\r\n``` js\r\nsvninfo: {\r\n  options: {\r\n    args: ['http://some.svn-server.net/repo/project/trunk', '--username', 'name', '--password', 'pass']\r\n  },\r\n  ...\r\n}\r\n```\r\n\r\nIt is possible to retrieve command options from other option instead of `args`.\r\nIt can be done by using the second argument of task (see below).\r\n\r\n### Task arguments\r\n\r\nTwo arguments can be passed to the task:\r\n\r\n1. Allows to specify a custom object that would contain the retrieved and parsed SVN info. This argument has priority over the `output` option.\r\n2. Allows to specify name of options field that contains list of command options. This argument has priority over the `args` option.\r\n\r\nExample: \r\n``` js\r\ngrunt.initConfig({\r\n  svninfo: {\r\n    options: {\r\n      abcArgs: ['http://some.svn-server.net/repo/abc/trunk', '--username', 'name', '--password', 'pass']\r\n    },\r\n    ...\r\n  }\r\n...\r\ngrunt.registerTask(\"abcInfo\", [\"svninfo:abc:abcArgs\"]);\r\n// or `grunt svninfo:abc:abcArgs` from command line\r\n});\r\n```\r\n\r\n## Contributing\r\nIn lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).\r\n\r\n## Release History\r\n * 0.1.4 - Support for task arguments and args option (thanks to @gamtiq)\r\n * 0.1.3 - Support for a custom name for the info object (thanks to @solomojb)\r\n * 0.1.2 - Support for 'cwd' option (thanks to @richmarr)\r\n * 0.1.1 - Grunt 0.4.x compatibility\r\n * 0.1.0 - Initial release\r\n",
+  "readmeFilename": "README.md",
+  "_id": "grunt-svninfo@0.1.4",
+  "dist": {
+    "shasum": "c07f3be71abdb93c0477c49154cd4496ead7b488"
+  },
+  "_from": "grunt-svninfo@",
+  "_resolved": "https://registry.npmjs.org/grunt-svninfo/-/grunt-svninfo-0.1.4.tgz"
+}
Index: /Dev/trunk/node_modules/grunt-svninfo/tasks/svninfo.coffee
===================================================================
--- /Dev/trunk/node_modules/grunt-svninfo/tasks/svninfo.coffee	(revision 516)
+++ /Dev/trunk/node_modules/grunt-svninfo/tasks/svninfo.coffee	(revision 516)
@@ -0,0 +1,55 @@
+#
+# * grunt-svninfo
+# * https://github.com/liqweed/grunt-svninfo
+# *
+# * Copyright (c) 2013 liqweed
+# * Licensed under the MIT license.
+#
+# 
+# require("child_process").spawn("svn",["info"],{cwd:"./test/fixtures/svninfo"}).stdout.on('data',function(data){ console.log(data.toString()); });
+
+"use strict"
+module.exports = (grunt) ->
+
+  # Please see the Grunt documentation for more information regarding task
+  # creation: http://gruntjs.com/creating-tasks
+  grunt.registerTask 'svninfo', 'Get Subversion info from a working copy and populate grunt.config with the data', (output, argsKey) ->
+    done = @async()
+    options = @options
+      cwd: '.'
+      output: 'svninfo'
+    options.output = output if output
+    args = options[argsKey or 'args']
+    
+    grunt.verbose.writeln("svninfo start: output - ", options.output, ", args - ", args)
+    
+    grunt.util.spawn
+      cmd: 'svn'
+      args: if args then ['info'].concat(args) else ['info']
+      opts: options
+    , (err, result) ->
+      if err
+        grunt.log.warn err
+        return done()
+      info = {}
+      # Split SVN info by lines:
+      result.stdout.split('\n').forEach (line) ->
+        lineParts =line.split(': ')
+        if lineParts.length == 2
+          # Populate info object
+          info[lineParts[0]] = lineParts[1].trim()
+
+      # Populate grunt.config with nicely parsed object:
+      grunt.config.set options.output,
+        rev: info['Revision']
+        url: info['URL']
+        last:
+          rev: info['Last Changed Rev']
+          author: info['Last Changed Author']
+          date: info['Last Changed Date']
+        repository:
+          root: info['Repository Root']
+          id: info['Repository UUID']
+
+      grunt.log.writeln "SVN info fetched (rev: #{grunt.config.get(options.output + '.rev')})"
+      done()
Index: /Dev/trunk/node_modules/grunt-svninfo/test/fixtures/svninfo/LICENSE-MIT
===================================================================
--- /Dev/trunk/node_modules/grunt-svninfo/test/fixtures/svninfo/LICENSE-MIT	(revision 516)
+++ /Dev/trunk/node_modules/grunt-svninfo/test/fixtures/svninfo/LICENSE-MIT	(revision 516)
@@ -0,0 +1,22 @@
+Copyright (c) 2013 liqweed
+
+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.
Index: /Dev/trunk/node_modules/grunt-svninfo/test/svn_test.js
===================================================================
--- /Dev/trunk/node_modules/grunt-svninfo/test/svn_test.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt-svninfo/test/svn_test.js	(revision 516)
@@ -0,0 +1,57 @@
+'use strict';
+
+var grunt = require('grunt');
+
+/*
+  ======== A Handy Little Nodeunit Reference ========
+  https://github.com/caolan/nodeunit
+
+  Test methods:
+    test.expect(numAssertions)
+    test.done()
+  Test assertions:
+    test.ok(value, [message])
+    test.equal(actual, expected, [message])
+    test.notEqual(actual, expected, [message])
+    test.deepEqual(actual, expected, [message])
+    test.notDeepEqual(actual, expected, [message])
+    test.strictEqual(actual, expected, [message])
+    test.notStrictEqual(actual, expected, [message])
+    test.throws(block, [error], [message])
+    test.doesNotThrow(block, [error], [message])
+    test.ifError(value)
+*/
+
+exports.svn = {
+  setUp: function(done) {
+    // setup here if necessary
+    done();
+  },
+  /*default_options: function(test) {
+    test.expect(1);
+
+    var actual = grunt.file.read('tmp/default_options');
+    var expected = grunt.file.read('test/expected/default_options');
+    test.equal(actual, expected, 'should describe what the default behavior is.');
+
+    test.done();
+  },
+  custom_options: function(test) {
+    test.expect(1);
+
+    var actual = grunt.file.read('tmp/custom_options');
+    var expected = grunt.file.read('test/expected/custom_options');
+    test.equal(actual, expected, 'should describe what the custom option(s) behavior is.');
+
+    test.done();
+  },*/
+  known_rev: function(test) {
+    test.expect(1);
+
+    var actual = grunt.config.get('svninfo.rev');
+    var expected = 25;
+    test.equal(actual, expected, 'should return the rev of the defined repo');
+
+    test.done();
+  }
+};
Index: /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/forever-agent/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/forever-agent/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/forever-agent/package.json	(revision 516)
@@ -25,8 +25,4 @@
   "homepage": "https://github.com/mikeal/forever-agent",
   "_id": "forever-agent@0.5.2",
-  "dist": {
-    "shasum": "30e8bcea70478fa57599fc40b09a4a45c0710443"
-  },
-  "_from": "forever-agent@~0.5.0",
-  "_resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz"
+  "_from": "forever-agent@~0.5.0"
 }
Index: /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/form-data/node_modules/async/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/form-data/node_modules/async/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/form-data/node_modules/async/package.json	(revision 516)
@@ -40,8 +40,4 @@
   "homepage": "https://github.com/caolan/async",
   "_id": "async@0.2.10",
-  "dist": {
-    "shasum": "7c691f5d6d8c59427796e198d4a5f5acf0e76417"
-  },
-  "_from": "async@~0.2.9",
-  "_resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz"
+  "_from": "async@~0.2.9"
 }
Index: /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json	(revision 516)
@@ -28,8 +28,4 @@
   },
   "_id": "delayed-stream@0.0.5",
-  "dist": {
-    "shasum": "65fc527ce0503b527205f943369177a48e8932fd"
-  },
-  "_from": "delayed-stream@0.0.5",
-  "_resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz"
+  "_from": "delayed-stream@0.0.5"
 }
Index: /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/http-signature/node_modules/asn1/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/http-signature/node_modules/asn1/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/http-signature/node_modules/asn1/package.json	(revision 516)
@@ -40,8 +40,4 @@
   "homepage": "https://github.com/mcavage/node-asn1",
   "_id": "asn1@0.1.11",
-  "dist": {
-    "shasum": "fbbb4e0c892ea47308ff4a0e90cc4aac37e44a38"
-  },
-  "_from": "asn1@0.1.11",
-  "_resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz"
+  "_from": "asn1@0.1.11"
 }
Index: /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json	(revision 516)
@@ -17,8 +17,4 @@
   "readmeFilename": "README.md",
   "_id": "assert-plus@0.1.2",
-  "dist": {
-    "shasum": "45a89f54ea7c2d3462aba816e3387f5723659c1e"
-  },
-  "_from": "assert-plus@0.1.2",
-  "_resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.2.tgz"
+  "_from": "assert-plus@0.1.2"
 }
Index: /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/http-signature/node_modules/ctype/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/http-signature/node_modules/ctype/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/http-signature/node_modules/ctype/package.json	(revision 516)
@@ -15,8 +15,4 @@
   "readmeFilename": "README",
   "_id": "ctype@0.5.2",
-  "dist": {
-    "shasum": "f4d4f9aa7e3086e282e40d78cfa6f4e3543c3bbf"
-  },
-  "_from": "ctype@0.5.2",
-  "_resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.2.tgz"
+  "_from": "ctype@0.5.2"
 }
Index: /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/qs/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/qs/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-tv4/node_modules/request/node_modules/qs/package.json	(revision 516)
@@ -35,8 +35,4 @@
   "homepage": "https://github.com/visionmedia/node-querystring",
   "_id": "qs@0.6.6",
-  "dist": {
-    "shasum": "9273308fc9b808b041bb75e632cbf82fe83b45fd"
-  },
-  "_from": "qs@~0.6.0",
-  "_resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz"
+  "_from": "qs@~0.6.0"
 }
Index: /Dev/trunk/node_modules/grunt-tv4/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt-tv4/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt-tv4/package.json	(revision 516)
@@ -52,5 +52,6 @@
     "grunt-contrib-jshint": "~0.7.2",
     "jshint-path-reporter": "~0.1.3",
-    "package.json-schema": "~0.1.2"
+    "package.json-schema": "~0.1.2",
+    "request": "^2.25.0"
   },
   "peerDependencies": {
Index: /Dev/trunk/node_modules/grunt/.npmignore
===================================================================
--- /Dev/trunk/node_modules/grunt/.npmignore	(revision 515)
+++ /Dev/trunk/node_modules/grunt/.npmignore	(revision 516)
@@ -4,5 +4,5 @@
 AUTHORS
 CHANGELOG
-CONTRIBUTING.MD
+CONTRIBUTING.md
 custom-gruntfile.js
 Gruntfile.js
Index: v/trunk/node_modules/grunt/CONTRIBUTING.md
===================================================================
--- /Dev/trunk/node_modules/grunt/CONTRIBUTING.md	(revision 515)
+++ 	(revision )
@@ -1,1 +1,0 @@
-Please see the [Contributing to grunt](http://gruntjs.com/contributing) guide for information on contributing to this project.
Index: /Dev/trunk/node_modules/grunt/LICENSE-MIT
===================================================================
--- /Dev/trunk/node_modules/grunt/LICENSE-MIT	(revision 515)
+++ /Dev/trunk/node_modules/grunt/LICENSE-MIT	(revision 516)
@@ -1,3 +1,3 @@
-Copyright (c) 2013 "Cowboy" Ben Alman
+Copyright (c) 2014 "Cowboy" Ben Alman
 
 Permission is hereby granted, free of charge, to any person
Index: /Dev/trunk/node_modules/grunt/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt/README.md	(revision 516)
@@ -1,3 +1,6 @@
-# Grunt: The JavaScript Task Runner [![Build Status](https://secure.travis-ci.org/gruntjs/grunt.png?branch=master)](http://travis-ci.org/gruntjs/grunt)
+# Grunt: The JavaScript Task Runner
+
+[![Build Status](https://secure.travis-ci.org/gruntjs/grunt.png?branch=master)](http://travis-ci.org/gruntjs/grunt)
+[![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/)
 
 <img align="right" height="260" src="http://gruntjs.com/img/grunt-logo-no-wordmark.svg">
Index: /Dev/trunk/node_modules/grunt/internal-tasks/bump.js
===================================================================
--- /Dev/trunk/node_modules/grunt/internal-tasks/bump.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt/internal-tasks/bump.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman, contributors
+ * Copyright (c) 2014 "Cowboy" Ben Alman, contributors
  * Licensed under the MIT license.
  */
Index: /Dev/trunk/node_modules/grunt/internal-tasks/subgrunt.js
===================================================================
--- /Dev/trunk/node_modules/grunt/internal-tasks/subgrunt.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt/internal-tasks/subgrunt.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt/lib/grunt.js
===================================================================
--- /Dev/trunk/node_modules/grunt/lib/grunt.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt/lib/grunt.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
@@ -23,5 +23,9 @@
   return grunt[name] = require('./grunt/' + name);
 }
-var util = gRequire('util');
+
+var util = require('grunt-legacy-util');
+grunt.util = util;
+grunt.util.task = require('./util/task');
+
 gRequire('template');
 gRequire('event');
@@ -153,4 +157,6 @@
   // allows the error callback to execute multiple times.
   tasks.forEach(function(name) { task.run(name); });
-  task.start();
+  // Run tasks async internally to reduce call-stack, per:
+  // https://github.com/gruntjs/grunt/pull/1026
+  task.start({asyncDone:true});
 };
Index: /Dev/trunk/node_modules/grunt/lib/grunt/cli.js
===================================================================
--- /Dev/trunk/node_modules/grunt/lib/grunt/cli.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt/lib/grunt/cli.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
@@ -22,5 +22,5 @@
   // CLI-parsed options override any passed-in "default" options.
   if (options) {
-    // For each defult option...
+    // For each default option...
     Object.keys(options).forEach(function(key) {
       if (!(key in cli.options)) {
@@ -62,5 +62,5 @@
     short: 'd',
     info: 'Enable debugging mode for tasks that support it.',
-    type: Number
+    type: [Number, Boolean]
   },
   stack: {
Index: /Dev/trunk/node_modules/grunt/lib/grunt/config.js
===================================================================
--- /Dev/trunk/node_modules/grunt/lib/grunt/config.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt/lib/grunt/config.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt/lib/grunt/event.js
===================================================================
--- /Dev/trunk/node_modules/grunt/lib/grunt/event.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt/lib/grunt/event.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt/lib/grunt/fail.js
===================================================================
--- /Dev/trunk/node_modules/grunt/lib/grunt/fail.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt/lib/grunt/fail.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt/lib/grunt/file.js
===================================================================
--- /Dev/trunk/node_modules/grunt/lib/grunt/file.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt/lib/grunt/file.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
@@ -134,7 +134,15 @@
 var pathSeparatorRe = /[\/\\]/g;
 
+// The "ext" option refers to either everything after the first dot (default)
+// or everything after the last dot.
+var extDotRe = {
+  first: /(\.[^\/]*)?$/,
+  last: /(\.[^\/\.]*)?$/,
+};
+
 // Build a multi task "files" object dynamically.
 file.expandMapping = function(patterns, destBase, options) {
   options = grunt.util._.defaults({}, options, {
+    extDot: 'first',
     rename: function(destBase, destPath) {
       return path.join(destBase || '', destPath);
@@ -151,6 +159,6 @@
     }
     // Change the extension?
-    if (options.ext) {
-      destPath = destPath.replace(/(\.[^\/]*)?$/, options.ext);
+    if ('ext' in options) {
+      destPath = destPath.replace(extDotRe[options.extDot], options.ext);
     }
     // Generate destination filename.
Index: /Dev/trunk/node_modules/grunt/lib/grunt/help.js
===================================================================
--- /Dev/trunk/node_modules/grunt/lib/grunt/help.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt/lib/grunt/help.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt/lib/grunt/log.js
===================================================================
--- /Dev/trunk/node_modules/grunt/lib/grunt/log.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt/lib/grunt/log.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt/lib/grunt/option.js
===================================================================
--- /Dev/trunk/node_modules/grunt/lib/grunt/option.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt/lib/grunt/option.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: /Dev/trunk/node_modules/grunt/lib/grunt/task.js
===================================================================
--- /Dev/trunk/node_modules/grunt/lib/grunt/task.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt/lib/grunt/task.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
@@ -108,5 +108,5 @@
       }
     } else if (Array.isArray(data.files)) {
-      data.files.forEach(function(obj) {
+      grunt.util._.flatten(data.files).forEach(function(obj) {
         var prop;
         if ('src' in obj || 'dest' in obj) {
@@ -245,4 +245,9 @@
       return options;
     };
+    // Expose the current target.
+    this.target = target;
+    // Recreate flags object so that the target isn't set as a flag.
+    this.flags = {};
+    this.args.forEach(function(arg) { this.flags[arg] = true; }, this);
     // Expose data on `this` (as well as task.current).
     this.data = grunt.config([name, target]);
@@ -256,9 +261,4 @@
       }.bind(this)
     });
-    // Expose the current target.
-    this.target = target;
-    // Recreate flags object so that the target isn't set as a flag.
-    this.flags = {};
-    this.args.forEach(function(arg) { this.flags[arg] = true; }, this);
     // Call original task function, passing in the target and any other args.
     return fn.apply(this, this.args);
@@ -278,9 +278,16 @@
 // Override built-in renameTask to use the registry.
 task.renameTask = function(oldname, newname) {
-  // Add and remove task.
-  registry.untasks.push(oldname);
-  registry.tasks.push(newname);
-  // Actually rename task.
-  return parent.renameTask.apply(task, arguments);
+  var result;
+  try {
+    // Actually rename task.
+    result = parent.renameTask.apply(task, arguments);
+    // Add and remove task.
+    registry.untasks.push(oldname);
+    registry.tasks.push(newname);
+    // Return result.
+    return result;
+  } catch(e) {
+    grunt.log.error(e.message);
+  }
 };
 
Index: /Dev/trunk/node_modules/grunt/lib/grunt/template.js
===================================================================
--- /Dev/trunk/node_modules/grunt/lib/grunt/template.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt/lib/grunt/template.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
Index: v/trunk/node_modules/grunt/lib/grunt/util.js
===================================================================
--- /Dev/trunk/node_modules/grunt/lib/grunt/util.js	(revision 515)
+++ 	(revision )
@@ -1,188 +1,0 @@
-/*
- * grunt
- * http://gruntjs.com/
- *
- * Copyright (c) 2013 "Cowboy" Ben Alman
- * Licensed under the MIT license.
- * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
- */
-
-'use strict';
-
-// Nodejs libs.
-var spawn = require('child_process').spawn;
-var nodeUtil = require('util');
-var path = require('path');
-
-// The module to be exported.
-var util = module.exports = {};
-
-// A few internal utilites, exposed.
-util.task = require('../util/task');
-util.namespace = require('getobject');
-
-// External libs.
-util.hooker = require('hooker');
-util.async = require('async');
-var _ = util._ = require('lodash');
-var which = require('which').sync;
-// Instead of process.exit. See https://github.com/cowboy/node-exit
-util.exit = require('exit');
-
-// Mixin Underscore.string methods.
-_.str = require('underscore.string');
-_.mixin(_.str.exports());
-
-// Return a function that normalizes the given function either returning a
-// value or accepting a "done" callback that accepts a single value.
-util.callbackify = function(fn) {
-  return function callbackable() {
-    // Invoke original function, getting its result.
-    var result = fn.apply(this, arguments);
-    // If the same number or less arguments were specified than fn accepts,
-    // assume the "done" callback was already handled.
-    var length = arguments.length;
-    if (length === fn.length) { return; }
-    // Otherwise, if the last argument is a function, assume it is a "done"
-    // callback and call it.
-    var done = arguments[length - 1];
-    if (typeof done === 'function') { done(result); }
-  };
-};
-
-// Create a new Error object, with an origError property that will be dumped
-// if grunt was run with the --debug=9 option.
-util.error = function(err, origError) {
-  if (!nodeUtil.isError(err)) { err = new Error(err); }
-  if (origError) { err.origError = origError; }
-  return err;
-};
-
-// The line feed char for the current system.
-util.linefeed = process.platform === 'win32' ? '\r\n' : '\n';
-
-// Normalize linefeeds in a string.
-util.normalizelf = function(str) {
-  return str.replace(/\r\n|\n/g, util.linefeed);
-};
-
-// What "kind" is a value?
-// I really need to rework https://github.com/cowboy/javascript-getclass
-var kindsOf = {};
-'Number String Boolean Function RegExp Array Date Error'.split(' ').forEach(function(k) {
-  kindsOf['[object ' + k + ']'] = k.toLowerCase();
-});
-util.kindOf = function(value) {
-  // Null or undefined.
-  if (value == null) { return String(value); }
-  // Everything else.
-  return kindsOf[kindsOf.toString.call(value)] || 'object';
-};
-
-// Coerce something to an Array.
-util.toArray = Function.call.bind(Array.prototype.slice);
-
-// Return the string `str` repeated `n` times.
-util.repeat = function(n, str) {
-  return new Array(n + 1).join(str || ' ');
-};
-
-// Given str of "a/b", If n is 1, return "a" otherwise "b".
-util.pluralize = function(n, str, separator) {
-  var parts = str.split(separator || '/');
-  return n === 1 ? (parts[0] || '') : (parts[1] || '');
-};
-
-// Recurse through objects and arrays, executing fn for each non-object.
-util.recurse = function recurse(value, fn, fnContinue) {
-  var obj;
-  if (fnContinue && fnContinue(value) === false) {
-    // Skip value if necessary.
-    return value;
-  } else if (util.kindOf(value) === 'array') {
-    // If value is an array, recurse.
-    return value.map(function(value) {
-      return recurse(value, fn, fnContinue);
-    });
-  } else if (util.kindOf(value) === 'object') {
-    // If value is an object, recurse.
-    obj = {};
-    Object.keys(value).forEach(function(key) {
-      obj[key] = recurse(value[key], fn, fnContinue);
-    });
-    return obj;
-  } else {
-    // Otherwise pass value into fn and return.
-    return fn(value);
-  }
-};
-
-// Spawn a child process, capturing its stdout and stderr.
-util.spawn = function(opts, done) {
-  // Build a result object and pass it (among other things) into the
-  // done function.
-  var callDone = function(code, stdout, stderr) {
-    // Remove trailing whitespace (newline)
-    stdout = _.rtrim(stdout);
-    stderr = _.rtrim(stderr);
-    // Create the result object.
-    var result = {
-      stdout: stdout,
-      stderr: stderr,
-      code: code,
-      toString: function() {
-        if (code === 0) {
-          return stdout;
-        } else if ('fallback' in opts) {
-          return opts.fallback;
-        } else if (opts.grunt) {
-          // grunt.log.error uses standard out, to be fixed in 0.5.
-          return stderr || stdout;
-        }
-        return stderr;
-      }
-    };
-    // On error (and no fallback) pass an error object, otherwise pass null.
-    done(code === 0 || 'fallback' in opts ? null : new Error(stderr), result, code);
-  };
-
-  var cmd, args;
-  var pathSeparatorRe = /[\\\/]/g;
-  if (opts.grunt) {
-    cmd = process.argv[0];
-    args = [process.argv[1]].concat(opts.args);
-  } else {
-    // On Windows, child_process.spawn will only file .exe files in the PATH,
-    // not other executable types (grunt issue #155).
-    try {
-      if (!pathSeparatorRe.test(opts.cmd)) {
-        // Only use which if cmd has no path component.
-        cmd = which(opts.cmd);
-      } else {
-        cmd = opts.cmd.replace(pathSeparatorRe, path.sep);
-      }
-    } catch (err) {
-      callDone(127, '', String(err));
-      return;
-    }
-    args = opts.args;
-  }
-
-  var child = spawn(cmd, args, opts.opts);
-  var stdout = new Buffer('');
-  var stderr = new Buffer('');
-  if (child.stdout) {
-    child.stdout.on('data', function(buf) {
-      stdout = Buffer.concat([stdout, new Buffer(buf)]);
-    });
-  }
-  if (child.stderr) {
-    child.stderr.on('data', function(buf) {
-      stderr = Buffer.concat([stderr, new Buffer(buf)]);
-    });
-  }
-  child.on('close', function(code) {
-    callDone(code, stdout.toString(), stderr.toString());
-  });
-  return child;
-};
Index: /Dev/trunk/node_modules/grunt/lib/util/task.js
===================================================================
--- /Dev/trunk/node_modules/grunt/lib/util/task.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt/lib/util/task.js	(revision 516)
@@ -3,5 +3,5 @@
  * http://gruntjs.com/
  *
- * Copyright (c) 2013 "Cowboy" Ben Alman
+ * Copyright (c) 2014 "Cowboy" Ben Alman
  * Licensed under the MIT license.
  * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
@@ -90,4 +90,7 @@
   // easier to implement than some kind of in-task "super" functionality.
   Task.prototype.renameTask = function(oldname, newname) {
+    if (!this._tasks[oldname]) {
+      throw new Error('Cannot rename missing "' + oldname + '" task.');
+    }
     // Rename task.
     this._tasks[newname] = this._tasks[oldname];
@@ -186,5 +189,5 @@
 
   // Run a task function, handling this.async / return value.
-  Task.prototype.runTaskFn = function(context, fn, done) {
+  Task.prototype.runTaskFn = function(context, fn, done, asyncDone) {
     // Async flag.
     var async = false;
@@ -213,5 +216,13 @@
         this._options.error.call({name: context.name, nameArgs: context.nameArgs}, err);
       }
-      done(err, success);
+      // only call done async if explicitly requested to
+      // see: https://github.com/gruntjs/grunt/pull/1026
+      if (asyncDone) {
+        process.nextTick(function () {
+          done(err, success);
+        });
+      } else {
+        done(err, success);
+      }
     }.bind(this);
 
@@ -244,5 +255,8 @@
 
   // Begin task queue processing. Ie. run all tasks.
-  Task.prototype.start = function() {
+  Task.prototype.start = function(opts) {
+    if (!opts) {
+      opts = {};
+    }
     // Abort if already running.
     if (this._running) { return false; }
@@ -281,5 +295,5 @@
       this.runTaskFn(context, function() {
         return thing.task.fn.apply(this, this.args);
-      }, nextTask);
+      }, nextTask, !!opts.asyncDone);
 
     }.bind(this);
Index: /Dev/trunk/node_modules/grunt/node_modules/.bin/rimraf
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/.bin/rimraf	(revision 516)
+++ /Dev/trunk/node_modules/grunt/node_modules/.bin/rimraf	(revision 516)
@@ -0,0 +1,1 @@
+link ../rimraf/bin.js
Index: /Dev/trunk/node_modules/grunt/node_modules/colors/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/colors/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt/node_modules/colors/package.json	(revision 516)
@@ -26,9 +26,4 @@
   "readmeFilename": "ReadMe.md",
   "_id": "colors@0.6.2",
-  "dist": {
-    "shasum": "57915cf80820c121e254ec8b7819ab808d2beae5"
-  },
-  "_from": "colors@~0.6.2",
-  "_resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
-  "scripts": {}
+  "_from": "colors@~0.6.2"
 }
Index: /Dev/trunk/node_modules/grunt/node_modules/eventemitter2/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/eventemitter2/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt/node_modules/eventemitter2/package.json	(revision 516)
@@ -59,8 +59,4 @@
   "homepage": "https://github.com/hij1nx/EventEmitter2",
   "_id": "eventemitter2@0.4.13",
-  "dist": {
-    "shasum": "2a03bdff50bda6586cf2e27c71feeaf6d37c383c"
-  },
-  "_from": "eventemitter2@~0.4.13",
-  "_resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.13.tgz"
+  "_from": "eventemitter2@~0.4.13"
 }
Index: /Dev/trunk/node_modules/grunt/node_modules/exit/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/exit/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt/node_modules/exit/package.json	(revision 516)
@@ -48,8 +48,4 @@
   "readmeFilename": "README.md",
   "_id": "exit@0.1.2",
-  "dist": {
-    "shasum": "2a1f6b7dd67aedcf9544e948cc817113b64012a5"
-  },
-  "_from": "exit@~0.1.1",
-  "_resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz"
+  "_from": "exit@~0.1.1"
 }
Index: /Dev/trunk/node_modules/grunt/node_modules/getobject/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/getobject/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt/node_modules/getobject/package.json	(revision 516)
@@ -45,8 +45,4 @@
   "readmeFilename": "README.md",
   "_id": "getobject@0.1.0",
-  "dist": {
-    "shasum": "4563bd9ebffaa0790ee7eec6e2d74523b7e852a6"
-  },
-  "_from": "getobject@~0.1.0",
-  "_resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz"
+  "_from": "getobject@~0.1.0"
 }
Index: /Dev/trunk/node_modules/grunt/node_modules/glob/node_modules/inherits/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/glob/node_modules/inherits/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt/node_modules/glob/node_modules/inherits/package.json	(revision 516)
@@ -27,8 +27,5 @@
   "homepage": "https://github.com/isaacs/inherits",
   "_id": "inherits@1.0.0",
-  "dist": {
-    "shasum": "26467026b3b86de1c6f72f00d9a31b1c97077a92"
-  },
   "_from": "inherits@1",
-  "_resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz"
+  "scripts": {}
 }
Index: /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/.npmignore
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/.npmignore	(revision 516)
+++ /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/.npmignore	(revision 516)
@@ -0,0 +1,1 @@
+node_modules
Index: /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/Gruntfile.js
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/Gruntfile.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/Gruntfile.js	(revision 516)
@@ -0,0 +1,16 @@
+'use strict';
+
+module.exports = function(grunt) {
+
+  grunt.initConfig({
+    nodeunit: {
+      util: ['test/index.js']
+    },
+
+  });
+
+  grunt.loadNpmTasks('grunt-contrib-nodeunit');
+
+  grunt.registerTask('default', ['nodeunit']);
+
+};
Index: /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/LICENSE-MIT
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/LICENSE-MIT	(revision 516)
+++ /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/LICENSE-MIT	(revision 516)
@@ -0,0 +1,22 @@
+Copyright (c) 2014 "Cowboy" Ben Alman
+
+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.
Index: /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/README.md	(revision 516)
+++ /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/README.md	(revision 516)
@@ -0,0 +1,26 @@
+# grunt-legacy-util
+> Deprecated Grunt utils provided for backwards compatibility.
+
+`grunt.util.namespace` use [getobject]  
+`grunt.util.hooker` use [hooker]  
+`grunt.util.async` use [async]  
+`grunt.util._` use [lodash]  
+`grunt.util.exit` use [exit]  
+`grunt.util.callbackify`  
+`grunt.util.error`  
+`grunt.util.linefeed`  
+`grunt.util.normalizelf`  
+`grunt.util.kindOf` use [lodash]  
+`grunt.util.toArray`
+`grunt.util.repeat`  
+`grunt.util.pluralize`  
+`grunt.util.recurse` use [traverse]  
+`grunt.util.spawn`  
+
+
+[getobject]: https://www.npmjs.org/package/getobject
+[hooker]: https://www.npmjs.org/package/hooker
+[async]: https://www.npmjs.org/package/async
+[lodash]: https://www.npmjs.org/package/lodash
+[exit]: https://www.npmjs.org/package/exit
+[traverse]: https://www.npmjs.org/package/lodash
Index: /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/index.js
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/index.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/index.js	(revision 516)
@@ -0,0 +1,187 @@
+/*
+ * grunt
+ * http://gruntjs.com/
+ *
+ * Copyright (c) 2014 "Cowboy" Ben Alman
+ * Licensed under the MIT license.
+ * https://github.com/gruntjs/grunt/blob/master/LICENSE-MIT
+ */
+
+'use strict';
+
+// Nodejs libs.
+var spawn = require('child_process').spawn;
+var nodeUtil = require('util');
+var path = require('path');
+
+// The module to be exported.
+var util = module.exports = {};
+
+util.namespace = require('getobject');
+
+// External libs.
+util.hooker = require('hooker');
+util.async = require('async');
+var _ = util._ = require('lodash');
+var which = require('which').sync;
+// Instead of process.exit. See https://github.com/cowboy/node-exit
+util.exit = require('exit');
+
+// Mixin Underscore.string methods.
+_.str = require('underscore.string');
+_.mixin(_.str.exports());
+
+// Return a function that normalizes the given function either returning a
+// value or accepting a "done" callback that accepts a single value.
+util.callbackify = function(fn) {
+  return function callbackable() {
+    // Invoke original function, getting its result.
+    var result = fn.apply(this, arguments);
+    // If the same number or less arguments were specified than fn accepts,
+    // assume the "done" callback was already handled.
+    var length = arguments.length;
+    if (length === fn.length) { return; }
+    // Otherwise, if the last argument is a function, assume it is a "done"
+    // callback and call it.
+    var done = arguments[length - 1];
+    if (typeof done === 'function') { done(result); }
+  };
+};
+
+// Create a new Error object, with an origError property that will be dumped
+// if grunt was run with the --debug=9 option.
+util.error = function(err, origError) {
+  if (!nodeUtil.isError(err)) { err = new Error(err); }
+  if (origError) { err.origError = origError; }
+  return err;
+};
+
+// The line feed char for the current system.
+util.linefeed = process.platform === 'win32' ? '\r\n' : '\n';
+
+// Normalize linefeeds in a string.
+util.normalizelf = function(str) {
+  return str.replace(/\r\n|\n/g, util.linefeed);
+};
+
+// What "kind" is a value?
+// I really need to rework https://github.com/cowboy/javascript-getclass
+var kindsOf = {};
+'Number String Boolean Function RegExp Array Date Error'.split(' ').forEach(function(k) {
+  kindsOf['[object ' + k + ']'] = k.toLowerCase();
+});
+util.kindOf = function(value) {
+  // Null or undefined.
+  if (value == null) { return String(value); }
+  // Everything else.
+  return kindsOf[kindsOf.toString.call(value)] || 'object';
+};
+
+// Coerce something to an Array.
+util.toArray = Function.call.bind(Array.prototype.slice);
+
+// Return the string `str` repeated `n` times.
+util.repeat = function(n, str) {
+  return new Array(n + 1).join(str || ' ');
+};
+
+// Given str of "a/b", If n is 1, return "a" otherwise "b".
+util.pluralize = function(n, str, separator) {
+  var parts = str.split(separator || '/');
+  return n === 1 ? (parts[0] || '') : (parts[1] || '');
+};
+
+// Recurse through objects and arrays, executing fn for each non-object.
+util.recurse = function recurse(value, fn, fnContinue) {
+  var obj;
+  if (fnContinue && fnContinue(value) === false) {
+    // Skip value if necessary.
+    return value;
+  } else if (util.kindOf(value) === 'array') {
+    // If value is an array, recurse.
+    return value.map(function(value) {
+      return recurse(value, fn, fnContinue);
+    });
+  } else if (util.kindOf(value) === 'object') {
+    // If value is an object, recurse.
+    obj = {};
+    Object.keys(value).forEach(function(key) {
+      obj[key] = recurse(value[key], fn, fnContinue);
+    });
+    return obj;
+  } else {
+    // Otherwise pass value into fn and return.
+    return fn(value);
+  }
+};
+
+// Spawn a child process, capturing its stdout and stderr.
+util.spawn = function(opts, done) {
+  // Build a result object and pass it (among other things) into the
+  // done function.
+  var callDone = function(code, stdout, stderr) {
+    // Remove trailing whitespace (newline)
+    stdout = _.rtrim(stdout);
+    stderr = _.rtrim(stderr);
+    // Create the result object.
+    var result = {
+      stdout: stdout,
+      stderr: stderr,
+      code: code,
+      toString: function() {
+        if (code === 0) {
+          return stdout;
+        } else if ('fallback' in opts) {
+          return opts.fallback;
+        } else if (opts.grunt) {
+          // grunt.log.error uses standard out, to be fixed in 0.5.
+          return stderr || stdout;
+        }
+        return stderr;
+      }
+    };
+    // On error (and no fallback) pass an error object, otherwise pass null.
+    done(code === 0 || 'fallback' in opts ? null : new Error(stderr), result, code);
+  };
+
+  var cmd, args;
+  var pathSeparatorRe = /[\\\/]/g;
+  if (opts.grunt) {
+    cmd = process.execPath;
+    args = process.execArgv.concat(process.argv[1], opts.args);
+  } else {
+    // On Windows, child_process.spawn will only file .exe files in the PATH,
+    // not other executable types (grunt issue #155).
+    try {
+      if (!pathSeparatorRe.test(opts.cmd)) {
+        // Only use which if cmd has no path component.
+        cmd = which(opts.cmd);
+      } else {
+        cmd = opts.cmd.replace(pathSeparatorRe, path.sep);
+      }
+    } catch (err) {
+      callDone(127, '', String(err));
+      return;
+    }
+    args = opts.args || [];
+  }
+
+  var child = spawn(cmd, args, opts.opts);
+  var stdout = new Buffer('');
+  var stderr = new Buffer('');
+  if (child.stdout) {
+    child.stdout.on('data', function(buf) {
+      stdout = Buffer.concat([stdout, new Buffer(buf)]);
+    });
+  }
+  if (child.stderr) {
+    child.stderr.on('data', function(buf) {
+      stderr = Buffer.concat([stderr, new Buffer(buf)]);
+    });
+  }
+  child.on('close', function(code) {
+    callDone(code, stdout.toString(), stderr.toString());
+  });
+  return child;
+};
+
Index: /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/package.json	(revision 516)
+++ /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/package.json	(revision 516)
@@ -0,0 +1,54 @@
+{
+  "name": "grunt-legacy-util",
+  "version": "0.1.2",
+  "description": "Deprecated Grunt utils provided for backwards compatibility.",
+  "author": {
+    "name": "\"Cowboy\" Ben Alman",
+    "url": "http://benalman.com/"
+  },
+  "homepage": "http://gruntjs.com/",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/gruntjs/grunt-legacy-util.git"
+  },
+  "bugs": {
+    "url": "http://github.com/gruntjs/grunt-legacy-util/issues"
+  },
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "http://github.com/gruntjs/grunt-legacy-util/blob/master/LICENSE-MIT"
+    }
+  ],
+  "main": "index.js",
+  "scripts": {
+    "test": "grunt test"
+  },
+  "engines": {
+    "node": ">= 0.8.0"
+  },
+  "keywords": [],
+  "dependencies": {
+    "hooker": "~0.2.3",
+    "async": "~0.1.22",
+    "lodash": "~0.9.2",
+    "exit": "~0.1.1",
+    "underscore.string": "~2.2.1",
+    "getobject": "~0.1.0",
+    "which": "~1.0.5"
+  },
+  "devDependencies": {
+    "grunt-contrib-jshint": "~0.6.4",
+    "grunt-contrib-nodeunit": "~0.2.0",
+    "grunt": "0.4.2",
+    "temporary": "0.0.8"
+  },
+  "readme": "# grunt-legacy-util\n> Deprecated Grunt utils provided for backwards compatibility.\n\n`grunt.util.namespace` use [getobject]  \n`grunt.util.hooker` use [hooker]  \n`grunt.util.async` use [async]  \n`grunt.util._` use [lodash]  \n`grunt.util.exit` use [exit]  \n`grunt.util.callbackify`  \n`grunt.util.error`  \n`grunt.util.linefeed`  \n`grunt.util.normalizelf`  \n`grunt.util.kindOf` use [lodash]  \n`grunt.util.toArray`\n`grunt.util.repeat`  \n`grunt.util.pluralize`  \n`grunt.util.recurse` use [traverse]  \n`grunt.util.spawn`  \n\n\n[getobject]: https://www.npmjs.org/package/getobject\n[hooker]: https://www.npmjs.org/package/hooker\n[async]: https://www.npmjs.org/package/async\n[lodash]: https://www.npmjs.org/package/lodash\n[exit]: https://www.npmjs.org/package/exit\n[traverse]: https://www.npmjs.org/package/lodash\n",
+  "readmeFilename": "README.md",
+  "_id": "grunt-legacy-util@0.1.2",
+  "dist": {
+    "shasum": "e1dbbcc204b3f3a744bb2e27cb028295a16d6e85"
+  },
+  "_from": "grunt-legacy-util@~0.1.2",
+  "_resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.1.2.tgz"
+}
Index: /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-execArgv-child.js
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-execArgv-child.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-execArgv-child.js	(revision 516)
@@ -0,0 +1,7 @@
+module.exports = function(grunt) {
+
+  grunt.registerTask('default', function(text) {
+    console.log('OUTPUT: ' + process.execArgv.join(' '));
+  });
+
+};
Index: /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-execArgv.js
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-execArgv.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-execArgv.js	(revision 516)
@@ -0,0 +1,17 @@
+module.exports = function(grunt) {
+
+  var util = require('../../');
+
+  grunt.registerTask('default', function(text) {
+    var done = this.async();
+    util.spawn({
+      grunt: true,
+      args: ['--gruntfile', 'Gruntfile-execArgv-child.js'],
+    }, function(err, result, code) {
+      var matches = result.stdout.match(/^(OUTPUT: .*)/m);
+      console.log(matches ? matches[1] : '');
+      done();
+    });
+  });
+
+};
Index: /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-print-text.js
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-print-text.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/Gruntfile-print-text.js	(revision 516)
@@ -0,0 +1,8 @@
+module.exports = function(grunt) {
+
+  grunt.registerTask('print', 'Print the specified text.', function(text) {
+    console.log('OUTPUT: ' + text);
+    // console.log(process.cwd());
+  });
+
+};
Index: /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/exec.cmd
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/exec.cmd	(revision 516)
+++ /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/exec.cmd	(revision 516)
@@ -0,0 +1,1 @@
+@echo done
Index: /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/exec.sh
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/exec.sh	(revision 516)
+++ /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/exec.sh	(revision 516)
@@ -0,0 +1,2 @@
+#!/bin/bash
+echo "done"
Index: /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/spawn-multibyte.js
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/spawn-multibyte.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/spawn-multibyte.js	(revision 516)
@@ -0,0 +1,17 @@
+// This is a test fixture for a case where spawn receives incomplete
+// multibyte strings in separate data events.
+
+// A multibyte buffer containing all our output. We will slice it later.
+// In this case we are using a Japanese word for hello / good day, where each
+// character takes three bytes.
+var fullOutput = new Buffer('ããã«ã¡ã¯');
+
+// Output one full character and one third of a character
+process.stdout.write(fullOutput.slice(0, 4));
+
+// Output the rest of the string
+process.stdout.write(fullOutput.slice(4));
+
+// Do the same for stderr
+process.stderr.write(fullOutput.slice(0, 4));
+process.stderr.write(fullOutput.slice(4));
Index: /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/spawn.js
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/spawn.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/fixtures/spawn.js	(revision 516)
@@ -0,0 +1,8 @@
+
+var code = Number(process.argv[2]);
+
+process.stdout.write('stdout\n');
+process.stderr.write('stderr\n');
+
+// Instead of process.exit. See https://github.com/cowboy/node-exit
+require('exit')(code);
Index: /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/index.js
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/index.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt/node_modules/grunt-legacy-util/test/index.js	(revision 516)
@@ -0,0 +1,313 @@
+'use strict';
+
+var util = require('../');
+
+var fs = require('fs');
+var path = require('path');
+
+var Tempfile = require('temporary/lib/file');
+
+exports['util.callbackify'] = {
+  'return': function(test) {
+    test.expect(1);
+    // This function returns a value.
+    function add(a, b) {
+      return a + b;
+    }
+    util.callbackify(add)(1, 2, function(result) {
+      test.equal(result, 3, 'should be the correct result.');
+      test.done();
+    });
+  },
+  'callback (sync)': function(test) {
+    test.expect(1);
+    // This function accepts a callback which it calls synchronously.
+    function add(a, b, done) {
+      done(a + b);
+    }
+    util.callbackify(add)(1, 2, function(result) {
+      test.equal(result, 3, 'should be the correct result.');
+      test.done();
+    });
+  },
+  'callback (async)': function(test) {
+    test.expect(1);
+    // This function accepts a callback which it calls asynchronously.
+    function add(a, b, done) {
+      setTimeout(done.bind(null, a + b), 0);
+    }
+    util.callbackify(add)(1, 2, function(result) {
+      test.equal(result, 3, 'should be the correct result.');
+      test.done();
+    });
+  }
+};
+
+exports['util'] = {
+  'error': function(test) {
+    test.expect(9);
+    var origError = new Error('Original error.');
+
+    var err = util.error('Test message.');
+    test.ok(err instanceof Error, 'Should be an Error.');
+    test.equal(err.name, 'Error', 'Should be an Error.');
+    test.equal(err.message, 'Test message.', 'Should have the correct message.');
+
+    err = util.error('Test message.', origError);
+    test.ok(err instanceof Error, 'Should be an Error.');
+    test.equal(err.name, 'Error', 'Should be an Error.');
+    test.equal(err.message, 'Test message.', 'Should have the correct message.');
+    test.equal(err.origError, origError, 'Should reflect the original error.');
+
+    var newError = new Error('Test message.');
+    err = util.error(newError, origError);
+    test.equal(err, newError, 'Should be the passed-in Error.');
+    test.equal(err.origError, origError, 'Should reflect the original error.');
+    test.done();
+  },
+  'linefeed': function(test) {
+    test.expect(1);
+    if (process.platform === 'win32') {
+      test.equal(util.linefeed, '\r\n', 'linefeed should be operating-system appropriate.');
+    } else {
+      test.equal(util.linefeed, '\n', 'linefeed should be operating-system appropriate.');
+    }
+    test.done();
+  },
+  'normalizelf': function(test) {
+    test.expect(1);
+    if (process.platform === 'win32') {
+      test.equal(util.normalizelf('foo\nbar\r\nbaz\r\n\r\nqux\n\nquux'), 'foo\r\nbar\r\nbaz\r\n\r\nqux\r\n\r\nquux', 'linefeeds should be normalized');
+    } else {
+      test.equal(util.normalizelf('foo\nbar\r\nbaz\r\n\r\nqux\n\nquux'), 'foo\nbar\nbaz\n\nqux\n\nquux', 'linefeeds should be normalized');
+    }
+    test.done();
+  }
+};
+
+exports['util.spawn'] = {
+  setUp: function(done) {
+    this.script = path.resolve('test/fixtures/spawn.js');
+    done();
+  },
+  'exit code 0': function(test) {
+    test.expect(6);
+    util.spawn({
+      cmd: process.execPath,
+      args: [ this.script, 0 ],
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.equals(result.stdout, 'stdout');
+      test.equals(result.stderr, 'stderr');
+      test.equals(result.code, 0);
+      test.equals(String(result), 'stdout');
+      test.done();
+    });
+  },
+  'exit code 0, fallback': function(test) {
+    test.expect(6);
+    util.spawn({
+      cmd: process.execPath,
+      args: [ this.script, 0 ],
+      fallback: 'ignored if exit code is 0'
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.equals(result.stdout, 'stdout');
+      test.equals(result.stderr, 'stderr');
+      test.equals(result.code, 0);
+      test.equals(String(result), 'stdout');
+      test.done();
+    });
+  },
+  'non-zero exit code': function(test) {
+    test.expect(7);
+    util.spawn({
+      cmd: process.execPath,
+      args: [ this.script, 123 ],
+    }, function(err, result, code) {
+      test.ok(err instanceof Error);
+      test.equals(err.message, 'stderr');
+      test.equals(code, 123);
+      test.equals(result.stdout, 'stdout');
+      test.equals(result.stderr, 'stderr');
+      test.equals(result.code, 123);
+      test.equals(String(result), 'stderr');
+      test.done();
+    });
+  },
+  'non-zero exit code, fallback': function(test) {
+    test.expect(6);
+    util.spawn({
+      cmd: process.execPath,
+      args: [ this.script, 123 ],
+      fallback: 'custom fallback'
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 123);
+      test.equals(result.stdout, 'stdout');
+      test.equals(result.stderr, 'stderr');
+      test.equals(result.code, 123);
+      test.equals(String(result), 'custom fallback');
+      test.done();
+    });
+  },
+  'cmd not found': function(test) {
+    test.expect(3);
+    util.spawn({
+      cmd: 'nodewtfmisspelled',
+    }, function(err, result, code) {
+      test.ok(err instanceof Error);
+      test.equals(code, 127);
+      test.equals(result.code, 127);
+      test.done();
+    });
+  },
+  'cmd not found, fallback': function(test) {
+    test.expect(4);
+    util.spawn({
+      cmd: 'nodewtfmisspelled',
+      fallback: 'use a fallback or good luck'
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 127);
+      test.equals(result.code, 127);
+      test.equals(String(result), 'use a fallback or good luck');
+      test.done();
+    });
+  },
+  'cmd not in path': function(test) {
+    test.expect(6);
+    var win32 = process.platform === 'win32';
+    util.spawn({
+      cmd: 'test\\fixtures\\exec' + (win32 ? '.cmd' : '.sh'),
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.equals(result.stdout, 'done');
+      test.equals(result.stderr, '');
+      test.equals(result.code, 0);
+      test.equals(String(result), 'done');
+      test.done();
+    });
+  },
+  'cmd not in path (with cwd)': function(test) {
+    test.expect(6);
+    var win32 = process.platform === 'win32';
+    util.spawn({
+      cmd: './exec' + (win32 ? '.cmd' : '.sh'),
+      opts: {cwd: 'test/fixtures'},
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.equals(result.stdout, 'done');
+      test.equals(result.stderr, '');
+      test.equals(result.code, 0);
+      test.equals(String(result), 'done');
+      test.done();
+    });
+  },
+  'grunt': function(test) {
+    test.expect(3);
+    util.spawn({
+      grunt: true,
+      args: [ '--gruntfile', 'test/fixtures/Gruntfile-print-text.js', 'print:foo' ],
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.ok(/^OUTPUT: foo/m.test(result.stdout), 'stdout should contain output indicating the grunt task was run.');
+      test.done();
+    });
+  },
+  'grunt (with cwd)': function(test) {
+    test.expect(3);
+    util.spawn({
+      grunt: true,
+      args: [ '--gruntfile', 'Gruntfile-print-text.js', 'print:foo' ],
+      opts: {cwd: 'test/fixtures'},
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.ok(/^OUTPUT: foo/m.test(result.stdout), 'stdout should contain output indicating the grunt task was run.');
+      test.done();
+    });
+  },
+  'grunt passes execArgv': function(test) {
+    test.expect(3);
+    util.spawn({
+      cmd: process.execPath,
+      args: [ '--harmony', process.argv[1], '--gruntfile', 'test/fixtures/Gruntfile-execArgv.js'],
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.ok(/^OUTPUT: --harmony/m.test(result.stdout), 'stdout should contain passed-through process.execArgv.');
+      test.done();
+    });
+  },
+  'grunt result.toString() with error': function(test) {
+    // grunt.log.error uses standard out, to be fixed in 0.5.
+    test.expect(4);
+    util.spawn({
+      grunt: true,
+      args: [ 'nonexistentTask' ]
+    }, function(err, result, code) {
+      test.ok(err instanceof Error, 'Should be an Error.');
+      test.equal(err.name, 'Error', 'Should be an Error.');
+      test.equals(code, 3);
+      test.ok(/Warning: Task "nonexistentTask" not found./m.test(result.toString()), 'stdout should contain output indicating the grunt task was (attempted to be) run.');
+      test.done();
+    });
+  },
+  'custom stdio stream(s)': function(test) {
+    test.expect(6);
+    var stdoutFile = new Tempfile();
+    var stderrFile = new Tempfile();
+    var stdout = fs.openSync(stdoutFile.path, 'a');
+    var stderr = fs.openSync(stderrFile.path, 'a');
+    var child = util.spawn({
+      cmd: process.execPath,
+      args: [ this.script, 0 ],
+      opts: {stdio: [null, stdout, stderr]},
+    }, function(err, result, code) {
+      test.equals(code, 0);
+      test.equals(String(fs.readFileSync(stdoutFile.path)), 'stdout\n', 'Child process stdout should have been captured via custom stream.');
+      test.equals(String(fs.readFileSync(stderrFile.path)), 'stderr\n', 'Child process stderr should have been captured via custom stream.');
+      stdoutFile.unlinkSync();
+      stderrFile.unlinkSync();
+      test.equals(result.stdout, '', 'Nothing will be passed to the stdout string when spawn stdio is a custom stream.');
+      test.done();
+    });
+    test.ok(!child.stdout, 'child should not have a stdout property.');
+    test.ok(!child.stderr, 'child should not have a stderr property.');
+  },
+};
+
+exports['util.spawn.multibyte'] = {
+  setUp: function(done) {
+    this.script = path.resolve('test/fixtures/spawn-multibyte.js');
+    done();
+  },
+  'partial stdout': function(test) {
+    test.expect(4);
+    util.spawn({
+      cmd: process.execPath,
+      args: [ this.script ],
+    }, function(err, result, code) {
+      test.equals(err, null);
+      test.equals(code, 0);
+      test.equals(result.stdout, 'ããã«ã¡ã¯');
+      test.equals(result.stderr, 'ããã«ã¡ã¯');
+      test.done();
+    });
+  }
+};
+
+exports['util.underscore.string'] = function(test) {
+  test.expect(4);
+  test.equals(util._.trim('    foo     '), 'foo', 'Should have trimmed the string.');
+  test.equals(util._.capitalize('foo'), 'Foo', 'Should have capitalized the first letter.');
+  test.equals(util._.words('one two three').length, 3, 'Should have counted three words.');
+  test.ok(util._.isBlank(' '), 'Should be blank.');
+  test.done();
+};
Index: /Dev/trunk/node_modules/grunt/node_modules/iconv-lite/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/iconv-lite/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt/node_modules/iconv-lite/package.json	(revision 516)
@@ -77,8 +77,4 @@
   },
   "_id": "iconv-lite@0.2.11",
-  "dist": {
-    "shasum": "1827821f46962889765690b557c045f5cc3976eb"
-  },
-  "_from": "iconv-lite@~0.2.11",
-  "_resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz"
+  "_from": "iconv-lite@~0.2.11"
 }
Index: /Dev/trunk/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json	(revision 516)
@@ -70,8 +70,4 @@
   "readmeFilename": "README.markdown",
   "_id": "underscore.string@2.3.3",
-  "dist": {
-    "shasum": "a7cea3b9aa84d24cf1363ccbddd02ee10abee0c0"
-  },
-  "_from": "underscore.string@~2.3.1",
-  "_resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz"
+  "_from": "underscore.string@~2.3.1"
 }
Index: /Dev/trunk/node_modules/grunt/node_modules/minimatch/.npmignore
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/minimatch/.npmignore	(revision 516)
+++ /Dev/trunk/node_modules/grunt/node_modules/minimatch/.npmignore	(revision 516)
@@ -0,0 +1,1 @@
+node_modules
Index: /Dev/trunk/node_modules/grunt/node_modules/minimatch/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/minimatch/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt/node_modules/minimatch/README.md	(revision 516)
@@ -20,4 +20,5 @@
 minimatch("bar.foo", "*.foo") // true!
 minimatch("bar.foo", "*.bar") // false!
+minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy!
 ```
 
@@ -36,42 +37,4 @@
 * `man 3 fnmatch`
 * `man 5 gitignore`
-
-### Comparisons to other fnmatch/glob implementations
-
-While strict compliance with the existing standards is a worthwhile
-goal, some discrepancies exist between minimatch and other
-implementations, and are intentional.
-
-If the pattern starts with a `!` character, then it is negated.  Set the
-`nonegate` flag to suppress this behavior, and treat leading `!`
-characters normally.  This is perhaps relevant if you wish to start the
-pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
-characters at the start of a pattern will negate the pattern multiple
-times.
-
-If a pattern starts with `#`, then it is treated as a comment, and
-will not match anything.  Use `\#` to match a literal `#` at the
-start of a line, or set the `nocomment` flag to suppress this behavior.
-
-The double-star character `**` is supported by default, unless the
-`noglobstar` flag is set.  This is supported in the manner of bsdglob
-and bash 4.1, where `**` only has special significance if it is the only
-thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
-`a/**b` will not.  **Note that this is different from the way that `**` is
-handled by ruby's `Dir` class.**
-
-If an escaped pattern has no matches, and the `nonull` flag is set,
-then minimatch.match returns the pattern as-provided, rather than
-interpreting the character escapes.  For example,
-`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
-`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
-that it does not resolve escaped pattern characters.
-
-If brace expansion is not disabled, then it is performed before any
-other interpretation of the glob pattern.  Thus, a pattern like
-`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
-**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
-checked for validity.  Since those two are valid, matching proceeds.
-
 
 ## Minimatch Class
@@ -217,2 +180,39 @@
 Returns from negate expressions the same as if they were not negated.
 (Ie, true on a hit, false on a miss.)
+
+
+## Comparisons to other fnmatch/glob implementations
+
+While strict compliance with the existing standards is a worthwhile
+goal, some discrepancies exist between minimatch and other
+implementations, and are intentional.
+
+If the pattern starts with a `!` character, then it is negated.  Set the
+`nonegate` flag to suppress this behavior, and treat leading `!`
+characters normally.  This is perhaps relevant if you wish to start the
+pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
+characters at the start of a pattern will negate the pattern multiple
+times.
+
+If a pattern starts with `#`, then it is treated as a comment, and
+will not match anything.  Use `\#` to match a literal `#` at the
+start of a line, or set the `nocomment` flag to suppress this behavior.
+
+The double-star character `**` is supported by default, unless the
+`noglobstar` flag is set.  This is supported in the manner of bsdglob
+and bash 4.1, where `**` only has special significance if it is the only
+thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
+`a/**b` will not.
+
+If an escaped pattern has no matches, and the `nonull` flag is set,
+then minimatch.match returns the pattern as-provided, rather than
+interpreting the character escapes.  For example,
+`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
+`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
+that it does not resolve escaped pattern characters.
+
+If brace expansion is not disabled, then it is performed before any
+other interpretation of the glob pattern.  Thus, a pattern like
+`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
+**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
+checked for validity.  Since those two are valid, matching proceeds.
Index: /Dev/trunk/node_modules/grunt/node_modules/minimatch/minimatch.js
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/minimatch/minimatch.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt/node_modules/minimatch/minimatch.js	(revision 516)
@@ -69,15 +69,4 @@
 var slashSplit = /\/+/
 
-minimatch.monkeyPatch = monkeyPatch
-function monkeyPatch () {
-  var desc = Object.getOwnPropertyDescriptor(String.prototype, "match")
-  var orig = desc.value
-  desc.value = function (p) {
-    if (p instanceof Minimatch) return p.match(this)
-    return orig.call(this, p)
-  }
-  Object.defineProperty(String.prototype, desc)
-}
-
 minimatch.filter = filter
 function filter (pattern, options) {
@@ -179,4 +168,6 @@
 }
 
+Minimatch.prototype.debug = function() {}
+
 Minimatch.prototype.make = make
 function make () {
@@ -203,5 +194,7 @@
   var set = this.globSet = this.braceExpand()
 
-  if (options.debug) console.error(this.pattern, set)
+  if (options.debug) this.debug = console.error
+
+  this.debug(this.pattern, set)
 
   // step 3: now we have a set, so turn each one into a series of path-portion
@@ -214,5 +207,5 @@
   })
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   // glob --> regexps
@@ -221,5 +214,5 @@
   }, this)
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   // filter out everything that didn't compile properly.
@@ -228,5 +221,5 @@
   })
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   this.set = set
@@ -303,9 +296,9 @@
   // and then prepend it to everything we find.
   if (pattern.charAt(0) !== "{") {
-    // console.error(pattern)
+    this.debug(pattern)
     var prefix = null
     for (var i = 0, l = pattern.length; i < l; i ++) {
       var c = pattern.charAt(i)
-      // console.error(i, c)
+      this.debug(i, c)
       if (c === "\\") {
         escaping = !escaping
@@ -318,9 +311,9 @@
     // actually no sets, all { were escaped.
     if (prefix === null) {
-      // console.error("no sets")
+      this.debug("no sets")
       return [pattern]
     }
 
-    var tail = braceExpand(pattern.substr(i), options)
+   var tail = braceExpand.call(this, pattern.substr(i), options)
     return tail.map(function (t) {
       return prefix + t
@@ -337,6 +330,6 @@
   var numset = pattern.match(/^\{(-?[0-9]+)\.\.(-?[0-9]+)\}/)
   if (numset) {
-    // console.error("numset", numset[1], numset[2])
-    var suf = braceExpand(pattern.substr(numset[0].length), options)
+    this.debug("numset", numset[1], numset[2])
+    var suf = braceExpand.call(this, pattern.substr(numset[0].length), options)
       , start = +numset[1]
       , end = +numset[2]
@@ -370,8 +363,8 @@
   }
 
-  // console.error("Entering for")
+  this.debug("Entering for")
   FOR: for (i = 1, l = pattern.length; i < l; i ++) {
     var c = pattern.charAt(i)
-    // console.error("", i, c)
+    this.debug("", i, c)
 
     if (escaping) {
@@ -421,20 +414,20 @@
   // and need to escape the leading brace
   if (depth !== 0) {
-    // console.error("didn't close", pattern)
-    return braceExpand("\\" + pattern, options)
+    this.debug("didn't close", pattern)
+    return braceExpand.call(this, "\\" + pattern, options)
   }
 
   // x{y,z} -> ["xy", "xz"]
-  // console.error("set", set)
-  // console.error("suffix", pattern.substr(i))
-  var suf = braceExpand(pattern.substr(i), options)
+  this.debug("set", set)
+  this.debug("suffix", pattern.substr(i))
+  var suf = braceExpand.call(this, pattern.substr(i), options)
   // ["b", "c{d,e}","{f,g}h"] ->
   //   [["b"], ["cd", "ce"], ["fh", "gh"]]
   var addBraces = set.length === 1
-  // console.error("set pre-expanded", set)
+  this.debug("set pre-expanded", set)
   set = set.map(function (p) {
-    return braceExpand(p, options)
-  })
-  // console.error("set expanded", set)
+    return braceExpand.call(this, p, options)
+  }, this)
+  this.debug("set expanded", set)
 
 
@@ -497,4 +490,5 @@
       : options.dot ? "(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))"
       : "(?!\\.)"
+    , self = this
 
   function clearStateChar () {
@@ -515,4 +509,5 @@
           break
       }
+      self.debug('clearStateChar %j %j', stateChar, re)
       stateChar = false
     }
@@ -523,7 +518,5 @@
       ; i ++ ) {
 
-    if (options.debug) {
-      console.error("%s\t%s %s %j", pattern, i, re, c)
-    }
+    this.debug("%s\t%s %s %j", pattern, i, re, c)
 
     // skip over any that are escaped.
@@ -552,11 +545,10 @@
       case "@":
       case "!":
-        if (options.debug) {
-          console.error("%s\t%s %s %j <-- stateChar", pattern, i, re, c)
-        }
+        this.debug("%s\t%s %s %j <-- stateChar", pattern, i, re, c)
 
         // all of those are literals inside a class, except that
         // the glob [!a] means [^a] in regexp
         if (inClass) {
+          this.debug('  in class')
           if (c === "!" && i === classStart + 1) c = "^"
           re += c
@@ -567,4 +559,5 @@
         // that there was something like ** or +? in there.
         // Handle the stateChar, then proceed with this one.
+        self.debug('call clearStateChar %j', stateChar)
         clearStateChar()
         stateChar = c
@@ -592,4 +585,5 @@
         // negation is (?:(?!js)[^/]*)
         re += stateChar === "!" ? "(?:(?!" : "(?:"
+        this.debug('plType %j %j', stateChar, re)
         stateChar = false
         continue
@@ -601,4 +595,5 @@
         }
 
+        clearStateChar()
         hasMagic = true
         re += ")"
@@ -624,4 +619,5 @@
         }
 
+        clearStateChar()
         re += "|"
         continue
@@ -716,5 +712,5 @@
     })
 
-    // console.error("tail=%j\n   %s", tail, tail)
+    this.debug("tail=%j\n   %s", tail, tail)
     var t = pl.type === "*" ? star
           : pl.type === "?" ? qmark
@@ -830,5 +826,5 @@
 Minimatch.prototype.match = match
 function match (f, partial) {
-  // console.error("match", f, this.pattern)
+  this.debug("match", f, this.pattern)
   // short-circuit in the case of busted things.
   // comments, etc.
@@ -848,7 +844,5 @@
   // treat the test path as a set of pathparts.
   f = f.split(slashSplit)
-  if (options.debug) {
-    console.error(this.pattern, "split", f)
-  }
+  this.debug(this.pattern, "split", f)
 
   // just ONE of the pattern sets in this.set needs to match
@@ -858,9 +852,14 @@
 
   var set = this.set
-  // console.error(this.pattern, "set", set)
+  this.debug(this.pattern, "set", set)
+
+  var splitFile = path.basename(f.join("/")).split("/")
 
   for (var i = 0, l = set.length; i < l; i ++) {
-    var pattern = set[i]
-    var hit = this.matchOne(f, pattern, partial)
+    var pattern = set[i], file = f
+    if (options.matchBase && pattern.length === 1) {
+      file = splitFile
+    }
+    var hit = this.matchOne(file, pattern, partial)
     if (hit) {
       if (options.flipNegate) return true
@@ -883,18 +882,10 @@
   var options = this.options
 
-  if (options.debug) {
-    console.error("matchOne",
-                  { "this": this
-                  , file: file
-                  , pattern: pattern })
-  }
-
-  if (options.matchBase && pattern.length === 1) {
-    file = path.basename(file.join("/")).split("/")
-  }
-
-  if (options.debug) {
-    console.error("matchOne", file.length, pattern.length)
-  }
+  this.debug("matchOne",
+              { "this": this
+              , file: file
+              , pattern: pattern })
+
+  this.debug("matchOne", file.length, pattern.length)
 
   for ( var fi = 0
@@ -905,13 +896,9 @@
       ; fi ++, pi ++ ) {
 
-    if (options.debug) {
-      console.error("matchOne loop")
-    }
+    this.debug("matchOne loop")
     var p = pattern[pi]
       , f = file[fi]
 
-    if (options.debug) {
-      console.error(pattern, p, f)
-    }
+    this.debug(pattern, p, f)
 
     // should be impossible.
@@ -920,6 +907,5 @@
 
     if (p === GLOBSTAR) {
-      if (options.debug)
-        console.error('GLOBSTAR', [pattern, p, f])
+      this.debug('GLOBSTAR', [pattern, p, f])
 
       // "**"
@@ -948,6 +934,5 @@
         , pr = pi + 1
       if (pr === pl) {
-        if (options.debug)
-          console.error('** at the end')
+        this.debug('** at the end')
         // a ** at the end will just swallow the rest.
         // We have found a match.
@@ -967,13 +952,10 @@
         var swallowee = file[fr]
 
-        if (options.debug) {
-          console.error('\nglobstar while',
-                        file, fr, pattern, pr, swallowee)
-        }
+        this.debug('\nglobstar while',
+                    file, fr, pattern, pr, swallowee)
 
         // XXX remove this slice.  Just pass the start index.
         if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
-          if (options.debug)
-            console.error('globstar found match!', fr, fl, swallowee)
+          this.debug('globstar found match!', fr, fl, swallowee)
           // found a match.
           return true
@@ -983,12 +965,10 @@
           if (swallowee === "." || swallowee === ".." ||
               (!options.dot && swallowee.charAt(0) === ".")) {
-            if (options.debug)
-              console.error("dot detected!", file, fr, pattern, pr)
+            this.debug("dot detected!", file, fr, pattern, pr)
             break WHILE
           }
 
           // ** swallows a segment, and continue.
-          if (options.debug)
-            console.error('globstar swallow a segment, and continue')
+          this.debug('globstar swallow a segment, and continue')
           fr ++
         }
@@ -999,5 +979,5 @@
       if (partial) {
         // ran out of file
-        // console.error("\n>>> no match, partial?", file, fr, pattern, pr)
+        this.debug("\n>>> no match, partial?", file, fr, pattern, pr)
         if (fr === fl) return true
       }
@@ -1015,12 +995,8 @@
         hit = f === p
       }
-      if (options.debug) {
-        console.error("string match", p, f, hit)
-      }
+      this.debug("string match", p, f, hit)
     } else {
       hit = f.match(p)
-      if (options.debug) {
-        console.error("pattern match", p, f, hit)
-      }
+      this.debug("pattern match", p, f, hit)
     }
 
Index: /Dev/trunk/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/package.json	(revision 516)
@@ -30,8 +30,4 @@
   "homepage": "https://github.com/isaacs/node-lru-cache",
   "_id": "lru-cache@2.5.0",
-  "dist": {
-    "shasum": "be07d09e5b05f10b83d0cf01d4891a7729288c69"
-  },
-  "_from": "lru-cache@2",
-  "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
+  "_from": "lru-cache@2"
 }
Index: /Dev/trunk/node_modules/grunt/node_modules/minimatch/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/minimatch/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt/node_modules/minimatch/package.json	(revision 516)
@@ -7,5 +7,5 @@
   "name": "minimatch",
   "description": "a glob matcher in javascript",
-  "version": "0.2.12",
+  "version": "0.2.14",
   "repository": {
     "type": "git",
@@ -14,5 +14,5 @@
   "main": "minimatch.js",
   "scripts": {
-    "test": "tap test"
+    "test": "tap test/*.js"
   },
   "engines": {
@@ -30,5 +30,5 @@
     "url": "http://github.com/isaacs/minimatch/raw/master/LICENSE"
   },
-  "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n### Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated.  Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally.  This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything.  Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set.  This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.  **Note that this is different from the way that `**` is\nhandled by ruby's `Dir` class.**\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes.  For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`.  This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern.  Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity.  Since those two are valid, matching proceeds.\n\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n  Each row in the\n  array corresponds to a brace-expanded pattern.  Each item in the row\n  corresponds to a single path-part.  For example, the pattern\n  `{a,b/c}/d` would expand to a set of patterns like:\n\n        [ [ a, d ]\n        , [ b, c, d ] ]\n\n    If a portion of the pattern doesn't have any \"magic\" in it\n    (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n    will be left as a string rather than converted to a regular\n    expression.\n\n* `regexp` Created by the `makeRe` method.  A single regular expression\n  expressing the entire pattern.  This is useful in cases where you wish\n  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n  Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n  false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n  filename, and match it against a single row in the `regExpSet`.  This\n  method is mainly for internal use, but is exposed so that it can be\n  used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items.  So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export.  Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`.  Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob.  If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself.  When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes.  For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n",
+  "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\nminimatch(\"bar.foo\", \"*.+(bar|foo)\", { debug: true }) // true, and noisy!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n  Each row in the\n  array corresponds to a brace-expanded pattern.  Each item in the row\n  corresponds to a single path-part.  For example, the pattern\n  `{a,b/c}/d` would expand to a set of patterns like:\n\n        [ [ a, d ]\n        , [ b, c, d ] ]\n\n    If a portion of the pattern doesn't have any \"magic\" in it\n    (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n    will be left as a string rather than converted to a regular\n    expression.\n\n* `regexp` Created by the `makeRe` method.  A single regular expression\n  expressing the entire pattern.  This is useful in cases where you wish\n  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n  Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n  false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n  filename, and match it against a single row in the `regExpSet`.  This\n  method is mainly for internal use, but is exposed so that it can be\n  used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items.  So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export.  Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`.  Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob.  If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself.  When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes.  For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated.  Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally.  This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything.  Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set.  This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes.  For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`.  This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern.  Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity.  Since those two are valid, matching proceeds.\n",
   "readmeFilename": "README.md",
   "bugs": {
@@ -36,5 +36,5 @@
   },
   "homepage": "https://github.com/isaacs/minimatch",
-  "_id": "minimatch@0.2.12",
-  "_from": "minimatch@0.x.x"
+  "_id": "minimatch@0.2.14",
+  "_from": "minimatch@~0.2.12"
 }
Index: /Dev/trunk/node_modules/grunt/node_modules/minimatch/test/extglob-ending-with-state-char.js
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/minimatch/test/extglob-ending-with-state-char.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt/node_modules/minimatch/test/extglob-ending-with-state-char.js	(revision 516)
@@ -0,0 +1,8 @@
+var test = require('tap').test
+var minimatch = require('../')
+
+test('extglob ending with statechar', function(t) {
+  t.notOk(minimatch('ax', 'a?(b*)'))
+  t.ok(minimatch('ax', '?(a*|b)'))
+  t.end()
+})
Index: /Dev/trunk/node_modules/grunt/node_modules/rimraf/README.md
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/rimraf/README.md	(revision 515)
+++ /Dev/trunk/node_modules/grunt/node_modules/rimraf/README.md	(revision 516)
@@ -1,3 +1,3 @@
-A `rm -rf` for node.
+`rm -rf` for node.
 
 Install with `npm install rimraf`, or just drop rimraf.js somewhere.
@@ -10,9 +10,8 @@
 errors are handled for you:
 
-* `EBUSY` -  rimraf will back off a maximum of opts.maxBusyTries times
-  before giving up.
-* `EMFILE` - If too many file descriptors get opened, rimraf will
-  patiently wait until more become available.
-
+* Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of
+  `opts.maxBusyTries` times before giving up.
+* `ENOENT` - If the file doesn't exist, rimraf will return
+  successfully, since your desired outcome is already the case.
 
 ## rimraf.sync
@@ -20,2 +19,12 @@
 It can remove stuff synchronously, too.  But that's not so good.  Use
 the async API.  It's better.
+
+## CLI
+
+If installed with `npm install rimraf -g` it can be used as a global
+command `rimraf <path>` which is useful for cross platform support.
+
+## mkdirp
+
+If you need to create a directory recursively, check out
+[mkdirp](https://github.com/substack/node-mkdirp).
Index: /Dev/trunk/node_modules/grunt/node_modules/rimraf/bin.js
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/rimraf/bin.js	(revision 516)
+++ /Dev/trunk/node_modules/grunt/node_modules/rimraf/bin.js	(revision 516)
@@ -0,0 +1,33 @@
+#!/usr/bin/env node
+
+var rimraf = require('./')
+
+var help = false
+var dashdash = false
+var args = process.argv.slice(2).filter(function(arg) {
+  if (dashdash)
+    return !!arg
+  else if (arg === '--')
+    dashdash = true
+  else if (arg.match(/^(-+|\/)(h(elp)?|\?)$/))
+    help = true
+  else
+    return !!arg
+});
+
+if (help || args.length === 0) {
+  // If they didn't ask for help, then this is not a "success"
+  var log = help ? console.log : console.error
+  log('Usage: rimraf <path>')
+  log('')
+  log('  Deletes all files and folders at "path" recursively.')
+  log('')
+  log('Options:')
+  log('')
+  log('  -h, --help    Display this usage info')
+  process.exit(help ? 0 : 1)
+} else {
+  args.forEach(function(arg) {
+    rimraf.sync(arg)
+  })
+}
Index: /Dev/trunk/node_modules/grunt/node_modules/rimraf/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/rimraf/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt/node_modules/rimraf/package.json	(revision 516)
@@ -1,5 +1,5 @@
 {
   "name": "rimraf",
-  "version": "2.0.3",
+  "version": "2.2.6",
   "main": "rimraf.js",
   "description": "A deep deletion module for node (like `rm -rf`)",
@@ -13,7 +13,4 @@
     "url": "https://github.com/isaacs/rimraf/raw/master/LICENSE"
   },
-  "optionalDependencies": {
-    "graceful-fs": "~1.1"
-  },
   "repository": {
     "type": "git",
@@ -22,4 +19,7 @@
   "scripts": {
     "test": "cd test && bash run.sh"
+  },
+  "bin": {
+    "rimraf": "./bin.js"
   },
   "contributors": [
@@ -46,5 +46,5 @@
     }
   ],
-  "readme": "A `rm -rf` for node.\n\nInstall with `npm install rimraf`, or just drop rimraf.js somewhere.\n\n## API\n\n`rimraf(f, callback)`\n\nThe callback will be called with an error if there is one.  Certain\nerrors are handled for you:\n\n* `EBUSY` -  rimraf will back off a maximum of opts.maxBusyTries times\n  before giving up.\n* `EMFILE` - If too many file descriptors get opened, rimraf will\n  patiently wait until more become available.\n\n\n## rimraf.sync\n\nIt can remove stuff synchronously, too.  But that's not so good.  Use\nthe async API.  It's better.\n",
+  "readme": "`rm -rf` for node.\n\nInstall with `npm install rimraf`, or just drop rimraf.js somewhere.\n\n## API\n\n`rimraf(f, callback)`\n\nThe callback will be called with an error if there is one.  Certain\nerrors are handled for you:\n\n* Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of\n  `opts.maxBusyTries` times before giving up.\n* `ENOENT` - If the file doesn't exist, rimraf will return\n  successfully, since your desired outcome is already the case.\n\n## rimraf.sync\n\nIt can remove stuff synchronously, too.  But that's not so good.  Use\nthe async API.  It's better.\n\n## CLI\n\nIf installed with `npm install rimraf -g` it can be used as a global\ncommand `rimraf <path>` which is useful for cross platform support.\n\n## mkdirp\n\nIf you need to create a directory recursively, check out\n[mkdirp](https://github.com/substack/node-mkdirp).\n",
   "readmeFilename": "README.md",
   "bugs": {
@@ -52,8 +52,9 @@
   },
   "homepage": "https://github.com/isaacs/rimraf",
-  "dependencies": {
-    "graceful-fs": "~1.1"
+  "_id": "rimraf@2.2.6",
+  "dist": {
+    "shasum": "c28d4de4cafcd392b82d02729509c65e3502240c"
   },
-  "_id": "rimraf@2.0.3",
-  "_from": "rimraf@~2.0.3"
+  "_from": "rimraf@~2.2.6",
+  "_resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz"
 }
Index: /Dev/trunk/node_modules/grunt/node_modules/rimraf/rimraf.js
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/rimraf/rimraf.js	(revision 515)
+++ /Dev/trunk/node_modules/grunt/node_modules/rimraf/rimraf.js	(revision 516)
@@ -3,23 +3,5 @@
 
 var path = require("path")
-  , fs
-
-try {
-  // optional dependency
-  fs = require("graceful-fs")
-} catch (er) {
-  fs = require("fs")
-}
-
-var lstat = "lstat"
-if (process.platform === "win32") {
-  // not reliable on windows prior to 0.7.9
-  var v = process.version.replace(/^v/, '').split(/\.|-/).map(Number)
-  if (v[0] === 0 && (v[1] < 7 || v[1] == 7 && v[2] < 9)) {
-    lstat = "stat"
-  }
-}
-if (!fs[lstat]) lstat = "stat"
-var lstatSync = lstat + "Sync"
+var fs = require("fs")
 
 // for EMFILE handling
@@ -28,13 +10,14 @@
 exports.BUSYTRIES_MAX = 3
 
+var isWindows = (process.platform === "win32")
+
 function rimraf (p, cb) {
-
   if (!cb) throw new Error("No callback passed to rimraf()")
 
   var busyTries = 0
-
   rimraf_(p, function CB (er) {
     if (er) {
-      if (er.code === "EBUSY" && busyTries < exports.BUSYTRIES_MAX) {
+      if (isWindows && (er.code === "EBUSY" || er.code === "ENOTEMPTY") &&
+          busyTries < exports.BUSYTRIES_MAX) {
         busyTries ++
         var time = busyTries * 100
@@ -61,98 +44,132 @@
 }
 
+// Two possible strategies.
+// 1. Assume it's a file.  unlink it, then do the dir stuff on EPERM or EISDIR
+// 2. Assume it's a directory.  readdir, then do the file stuff on ENOTDIR
+//
+// Both result in an extra syscall when you guess wrong.  However, there
+// are likely far more normal files in the world than directories.  This
+// is based on the assumption that a the average number of files per
+// directory is >= 1.
+//
+// If anyone ever complains about this, then I guess the strategy could
+// be made configurable somehow.  But until then, YAGNI.
 function rimraf_ (p, cb) {
-  fs[lstat](p, function (er, s) {
+  fs.unlink(p, function (er) {
     if (er) {
-      // already gone
-      if (er.code === "ENOENT") return cb()
-      // some other kind of error, permissions, etc.
-      return cb(er)
+      if (er.code === "ENOENT")
+        return cb(null)
+      if (er.code === "EPERM")
+        return (isWindows) ? fixWinEPERM(p, er, cb) : rmdir(p, er, cb)
+      if (er.code === "EISDIR")
+        return rmdir(p, er, cb)
     }
-
-    return rm_(p, s, false, cb)
+    return cb(er)
   })
 }
 
-
-var myGid = function myGid () {
-  var g = process.getgid && process.getgid()
-  myGid = function myGid () { return g }
-  return g
+function fixWinEPERM (p, er, cb) {
+  fs.chmod(p, 666, function (er2) {
+    if (er2)
+      cb(er2.code === "ENOENT" ? null : er)
+    else
+      fs.stat(p, function(er3, stats) {
+        if (er3)
+          cb(er3.code === "ENOENT" ? null : er)
+        else if (stats.isDirectory())
+          rmdir(p, er, cb)
+        else
+          fs.unlink(p, cb)
+      })
+  })
 }
 
-var myUid = function myUid () {
-  var u = process.getuid && process.getuid()
-  myUid = function myUid () { return u }
-  return u
+function fixWinEPERMSync (p, er, cb) {
+  try {
+    fs.chmodSync(p, 666)
+  } catch (er2) {
+    if (er2.code !== "ENOENT")
+      throw er
+  }
+
+  try {
+    var stats = fs.statSync(p)
+  } catch (er3) {
+    if (er3 !== "ENOENT")
+      throw er
+  }
+
+  if (stats.isDirectory())
+    rmdirSync(p, er)
+  else
+    fs.unlinkSync(p)
 }
 
-
-function writable (s) {
-  var mode = s.mode || 0777
-    , uid = myUid()
-    , gid = myGid()
-  return (mode & 0002)
-      || (gid === s.gid && (mode & 0020))
-      || (uid === s.uid && (mode & 0200))
+function rmdir (p, originalEr, cb) {
+  // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
+  // if we guessed wrong, and it's not a directory, then
+  // raise the original error.
+  fs.rmdir(p, function (er) {
+    if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM"))
+      rmkids(p, cb)
+    else if (er && er.code === "ENOTDIR")
+      cb(originalEr)
+    else
+      cb(er)
+  })
 }
 
-function rm_ (p, s, didWritableCheck, cb) {
-  if (!didWritableCheck && !writable(s)) {
-    // make file writable
-    // user/group/world, doesn't matter at this point
-    // since it's about to get nuked.
-    return fs.chmod(p, s.mode | 0222, function (er) {
-      if (er) return cb(er)
-      rm_(p, s, true, cb)
-    })
-  }
-
-  if (!s.isDirectory()) {
-    return fs.unlink(p, cb)
-  }
-
-  // directory
+function rmkids(p, cb) {
   fs.readdir(p, function (er, files) {
-    if (er) return cb(er)
-    asyncForEach(files.map(function (f) {
-      return path.join(p, f)
-    }), function (file, cb) {
-      rimraf(file, cb)
-    }, function (er) {
-      if (er) return cb(er)
-      fs.rmdir(p, cb)
+    if (er)
+      return cb(er)
+    var n = files.length
+    if (n === 0)
+      return fs.rmdir(p, cb)
+    var errState
+    files.forEach(function (f) {
+      rimraf(path.join(p, f), function (er) {
+        if (errState)
+          return
+        if (er)
+          return cb(errState = er)
+        if (--n === 0)
+          fs.rmdir(p, cb)
+      })
     })
   })
 }
 
-function asyncForEach (list, fn, cb) {
-  if (!list.length) cb()
-  var c = list.length
-    , errState = null
-  list.forEach(function (item, i, list) {
-    fn(item, function (er) {
-      if (errState) return
-      if (er) return cb(errState = er)
-      if (-- c === 0) return cb()
-    })
-  })
+// this looks simpler, and is strictly *faster*, but will
+// tie up the JavaScript thread and fail on excessively
+// deep directory trees.
+function rimrafSync (p) {
+  try {
+    fs.unlinkSync(p)
+  } catch (er) {
+    if (er.code === "ENOENT")
+      return
+    if (er.code === "EPERM")
+      return isWindows ? fixWinEPERMSync(p, er) : rmdirSync(p, er)
+    if (er.code !== "EISDIR")
+      throw er
+    rmdirSync(p, er)
+  }
 }
 
-// this looks simpler, but it will fail with big directory trees,
-// or on slow stupid awful cygwin filesystems
-function rimrafSync (p) {
+function rmdirSync (p, originalEr) {
   try {
-    var s = fs[lstatSync](p)
+    fs.rmdirSync(p)
   } catch (er) {
-    if (er.code === "ENOENT") return
-    throw er
+    if (er.code === "ENOENT")
+      return
+    if (er.code === "ENOTDIR")
+      throw originalEr
+    if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")
+      rmkidsSync(p)
   }
+}
 
-  if (!writable(s)) {
-    fs.chmodSync(p, s.mode | 0222)
-  }
-
-  if (!s.isDirectory()) return fs.unlinkSync(p)
-
+function rmkidsSync (p) {
   fs.readdirSync(p).forEach(function (f) {
     rimrafSync(path.join(p, f))
Index: /Dev/trunk/node_modules/grunt/node_modules/underscore.string/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt/node_modules/underscore.string/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt/node_modules/underscore.string/package.json	(revision 516)
@@ -69,8 +69,4 @@
   "readmeFilename": "README.markdown",
   "_id": "underscore.string@2.2.1",
-  "dist": {
-    "shasum": "2aa155e7c49bcbfd88ec69b8c9694d885385c717"
-  },
-  "_from": "underscore.string@~2.2.1",
-  "_resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz"
+  "_from": "underscore.string@~2.2.1"
 }
Index: /Dev/trunk/node_modules/grunt/package.json
===================================================================
--- /Dev/trunk/node_modules/grunt/package.json	(revision 515)
+++ /Dev/trunk/node_modules/grunt/package.json	(revision 516)
@@ -2,5 +2,5 @@
   "name": "grunt",
   "description": "The JavaScript Task Runner",
-  "version": "0.4.2",
+  "version": "0.4.4",
   "author": {
     "name": "\"Cowboy\" Ben Alman",
@@ -59,5 +59,5 @@
     "minimatch": "~0.2.12",
     "nopt": "~1.0.10",
-    "rimraf": "~2.0.3",
+    "rimraf": "~2.2.6",
     "lodash": "~0.9.2",
     "underscore.string": "~2.2.1",
@@ -65,5 +65,6 @@
     "js-yaml": "~2.0.5",
     "exit": "~0.1.1",
-    "getobject": "~0.1.0"
+    "getobject": "~0.1.0",
+    "grunt-legacy-util": "~0.1.2"
   },
   "devDependencies": {
@@ -76,11 +77,11 @@
     "shelljs": "~0.2.5"
   },
-  "readme": "# Grunt: The JavaScript Task Runner [![Build Status](https://secure.travis-ci.org/gruntjs/grunt.png?branch=master)](http://travis-ci.org/gruntjs/grunt)\n\n<img align=\"right\" height=\"260\" src=\"http://gruntjs.com/img/grunt-logo-no-wordmark.svg\">\n\n\n### Documentation\n\nVisit the [gruntjs.com](http://gruntjs.com/) website for all the things.\n\n### Support / Contributing\nBefore you make an issue, please read our [Contributing](http://gruntjs.com/contributing) guide.\n\nYou can find the grunt team in [#grunt on irc.freenode.net](http://webchat.freenode.net/?channels=grunt).\n\n### Release History\nSee the [CHANGELOG](CHANGELOG).\n",
+  "readme": "# Grunt: The JavaScript Task Runner\n\n[![Build Status](https://secure.travis-ci.org/gruntjs/grunt.png?branch=master)](http://travis-ci.org/gruntjs/grunt)\n[![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/)\n\n<img align=\"right\" height=\"260\" src=\"http://gruntjs.com/img/grunt-logo-no-wordmark.svg\">\n\n\n### Documentation\n\nVisit the [gruntjs.com](http://gruntjs.com/) website for all the things.\n\n### Support / Contributing\nBefore you make an issue, please read our [Contributing](http://gruntjs.com/contributing) guide.\n\nYou can find the grunt team in [#grunt on irc.freenode.net](http://webchat.freenode.net/?channels=grunt).\n\n### Release History\nSee the [CHANGELOG](CHANGELOG).\n",
   "readmeFilename": "README.md",
-  "_id": "grunt@0.4.2",
+  "_id": "grunt@0.4.4",
   "dist": {
-    "shasum": "1f6804f00e977dd90b9f97b1faed480215db0857"
+    "shasum": "64f477fef801475ab92f1819a691c6c71b72902e"
   },
-  "_from": "grunt@0.4.2",
-  "_resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.2.tgz"
+  "_from": "grunt@0.4.4",
+  "_resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.4.tgz"
 }
Index: /Dev/trunk/node_modules/mocha/node_modules/commander/package.json
===================================================================
--- /Dev/trunk/node_modules/mocha/node_modules/commander/package.json	(revision 515)
+++ /Dev/trunk/node_modules/mocha/node_modules/commander/package.json	(revision 516)
@@ -35,8 +35,4 @@
   "homepage": "https://github.com/visionmedia/commander.js",
   "_id": "commander@2.0.0",
-  "dist": {
-    "shasum": "45ba4f69d428bc6178e81d200893e6c3d103eb8b"
-  },
-  "_from": "commander@2.0.0",
-  "_resolved": "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz"
+  "_from": "commander@2.0.0"
 }
Index: /Dev/trunk/node_modules/mocha/node_modules/debug/package.json
===================================================================
--- /Dev/trunk/node_modules/mocha/node_modules/debug/package.json	(revision 515)
+++ /Dev/trunk/node_modules/mocha/node_modules/debug/package.json	(revision 516)
@@ -43,8 +43,4 @@
   "homepage": "https://github.com/visionmedia/debug",
   "_id": "debug@0.7.4",
-  "dist": {
-    "shasum": "6283150882c46779d1f025aa25cf9953001b33b8"
-  },
-  "_from": "debug@*",
-  "_resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz"
+  "_from": "debug@*"
 }
Index: /Dev/trunk/node_modules/mocha/node_modules/diff/package.json
===================================================================
--- /Dev/trunk/node_modules/mocha/node_modules/diff/package.json	(revision 515)
+++ /Dev/trunk/node_modules/mocha/node_modules/diff/package.json	(revision 516)
@@ -33,5 +33,5 @@
   "main": "./diff",
   "scripts": {
-    "test": "node_modules/.bin/mocha test/*.js"
+    "test": "mocha test/*.js"
   },
   "dependencies": {},
@@ -48,8 +48,4 @@
   "homepage": "https://github.com/kpdecker/jsdiff",
   "_id": "diff@1.0.7",
-  "dist": {
-    "shasum": "bc32d3a6173e197f3eff7fe82ab81b821da8909a"
-  },
-  "_from": "diff@1.0.7",
-  "_resolved": "https://registry.npmjs.org/diff/-/diff-1.0.7.tgz"
+  "_from": "diff@1.0.7"
 }
Index: /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/graceful-fs.js
===================================================================
--- /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/graceful-fs.js	(revision 515)
+++ /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/graceful-fs.js	(revision 516)
@@ -87,4 +87,6 @@
 
 ReaddirReq.prototype.done = function(er, files) {
+  if (files && files.sort)
+    files = files.sort()
   Req.prototype.done.call(this, er, files)
   onclose()
Index: /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/package.json
===================================================================
--- /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/package.json	(revision 515)
+++ /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/package.json	(revision 516)
@@ -7,5 +7,5 @@
   "name": "graceful-fs",
   "description": "A drop-in replacement for fs, making various improvements.",
-  "version": "2.0.1",
+  "version": "2.0.2",
   "repository": {
     "type": "git",
@@ -45,5 +45,5 @@
   },
   "homepage": "https://github.com/isaacs/node-graceful-fs",
-  "_id": "graceful-fs@2.0.1",
-  "_from": "graceful-fs@~2"
+  "_id": "graceful-fs@2.0.2",
+  "_from": "graceful-fs@~2.0.0"
 }
Index: /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/test/readdir-sort.js
===================================================================
--- /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/test/readdir-sort.js	(revision 516)
+++ /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/test/readdir-sort.js	(revision 516)
@@ -0,0 +1,21 @@
+var test = require("tap").test
+var fs = require("fs")
+
+var readdir = fs.readdir
+fs.readdir = function(path, cb) {
+  process.nextTick(function() {
+    cb(null, ["b", "z", "a"])
+  })
+}
+
+var g = require("../")
+
+test("readdir reorder", function (t) {
+  g.readdir("whatevers", function (er, files) {
+    if (er)
+      throw er
+    console.error(files)
+    t.same(files, [ "a", "b", "z" ])
+    t.end()
+  })
+})
Index: /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/minimatch/.npmignore
===================================================================
--- /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/minimatch/.npmignore	(revision 516)
+++ /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/minimatch/.npmignore	(revision 516)
@@ -0,0 +1,1 @@
+node_modules
Index: /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/minimatch/README.md
===================================================================
--- /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/minimatch/README.md	(revision 515)
+++ /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/minimatch/README.md	(revision 516)
@@ -20,4 +20,5 @@
 minimatch("bar.foo", "*.foo") // true!
 minimatch("bar.foo", "*.bar") // false!
+minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy!
 ```
 
@@ -36,42 +37,4 @@
 * `man 3 fnmatch`
 * `man 5 gitignore`
-
-### Comparisons to other fnmatch/glob implementations
-
-While strict compliance with the existing standards is a worthwhile
-goal, some discrepancies exist between minimatch and other
-implementations, and are intentional.
-
-If the pattern starts with a `!` character, then it is negated.  Set the
-`nonegate` flag to suppress this behavior, and treat leading `!`
-characters normally.  This is perhaps relevant if you wish to start the
-pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
-characters at the start of a pattern will negate the pattern multiple
-times.
-
-If a pattern starts with `#`, then it is treated as a comment, and
-will not match anything.  Use `\#` to match a literal `#` at the
-start of a line, or set the `nocomment` flag to suppress this behavior.
-
-The double-star character `**` is supported by default, unless the
-`noglobstar` flag is set.  This is supported in the manner of bsdglob
-and bash 4.1, where `**` only has special significance if it is the only
-thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
-`a/**b` will not.  **Note that this is different from the way that `**` is
-handled by ruby's `Dir` class.**
-
-If an escaped pattern has no matches, and the `nonull` flag is set,
-then minimatch.match returns the pattern as-provided, rather than
-interpreting the character escapes.  For example,
-`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
-`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
-that it does not resolve escaped pattern characters.
-
-If brace expansion is not disabled, then it is performed before any
-other interpretation of the glob pattern.  Thus, a pattern like
-`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
-**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
-checked for validity.  Since those two are valid, matching proceeds.
-
 
 ## Minimatch Class
@@ -217,2 +180,39 @@
 Returns from negate expressions the same as if they were not negated.
 (Ie, true on a hit, false on a miss.)
+
+
+## Comparisons to other fnmatch/glob implementations
+
+While strict compliance with the existing standards is a worthwhile
+goal, some discrepancies exist between minimatch and other
+implementations, and are intentional.
+
+If the pattern starts with a `!` character, then it is negated.  Set the
+`nonegate` flag to suppress this behavior, and treat leading `!`
+characters normally.  This is perhaps relevant if you wish to start the
+pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
+characters at the start of a pattern will negate the pattern multiple
+times.
+
+If a pattern starts with `#`, then it is treated as a comment, and
+will not match anything.  Use `\#` to match a literal `#` at the
+start of a line, or set the `nocomment` flag to suppress this behavior.
+
+The double-star character `**` is supported by default, unless the
+`noglobstar` flag is set.  This is supported in the manner of bsdglob
+and bash 4.1, where `**` only has special significance if it is the only
+thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
+`a/**b` will not.
+
+If an escaped pattern has no matches, and the `nonull` flag is set,
+then minimatch.match returns the pattern as-provided, rather than
+interpreting the character escapes.  For example,
+`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
+`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
+that it does not resolve escaped pattern characters.
+
+If brace expansion is not disabled, then it is performed before any
+other interpretation of the glob pattern.  Thus, a pattern like
+`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
+**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
+checked for validity.  Since those two are valid, matching proceeds.
Index: /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/minimatch/minimatch.js
===================================================================
--- /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/minimatch/minimatch.js	(revision 515)
+++ /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/minimatch/minimatch.js	(revision 516)
@@ -69,15 +69,4 @@
 var slashSplit = /\/+/
 
-minimatch.monkeyPatch = monkeyPatch
-function monkeyPatch () {
-  var desc = Object.getOwnPropertyDescriptor(String.prototype, "match")
-  var orig = desc.value
-  desc.value = function (p) {
-    if (p instanceof Minimatch) return p.match(this)
-    return orig.call(this, p)
-  }
-  Object.defineProperty(String.prototype, desc)
-}
-
 minimatch.filter = filter
 function filter (pattern, options) {
@@ -179,4 +168,6 @@
 }
 
+Minimatch.prototype.debug = function() {}
+
 Minimatch.prototype.make = make
 function make () {
@@ -203,5 +194,7 @@
   var set = this.globSet = this.braceExpand()
 
-  if (options.debug) console.error(this.pattern, set)
+  if (options.debug) this.debug = console.error
+
+  this.debug(this.pattern, set)
 
   // step 3: now we have a set, so turn each one into a series of path-portion
@@ -214,5 +207,5 @@
   })
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   // glob --> regexps
@@ -221,5 +214,5 @@
   }, this)
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   // filter out everything that didn't compile properly.
@@ -228,5 +221,5 @@
   })
 
-  if (options.debug) console.error(this.pattern, set)
+  this.debug(this.pattern, set)
 
   this.set = set
@@ -303,9 +296,9 @@
   // and then prepend it to everything we find.
   if (pattern.charAt(0) !== "{") {
-    // console.error(pattern)
+    this.debug(pattern)
     var prefix = null
     for (var i = 0, l = pattern.length; i < l; i ++) {
       var c = pattern.charAt(i)
-      // console.error(i, c)
+      this.debug(i, c)
       if (c === "\\") {
         escaping = !escaping
@@ -318,9 +311,9 @@
     // actually no sets, all { were escaped.
     if (prefix === null) {
-      // console.error("no sets")
+      this.debug("no sets")
       return [pattern]
     }
 
-    var tail = braceExpand(pattern.substr(i), options)
+   var tail = braceExpand.call(this, pattern.substr(i), options)
     return tail.map(function (t) {
       return prefix + t
@@ -337,6 +330,6 @@
   var numset = pattern.match(/^\{(-?[0-9]+)\.\.(-?[0-9]+)\}/)
   if (numset) {
-    // console.error("numset", numset[1], numset[2])
-    var suf = braceExpand(pattern.substr(numset[0].length), options)
+    this.debug("numset", numset[1], numset[2])
+    var suf = braceExpand.call(this, pattern.substr(numset[0].length), options)
       , start = +numset[1]
       , end = +numset[2]
@@ -370,8 +363,8 @@
   }
 
-  // console.error("Entering for")
+  this.debug("Entering for")
   FOR: for (i = 1, l = pattern.length; i < l; i ++) {
     var c = pattern.charAt(i)
-    // console.error("", i, c)
+    this.debug("", i, c)
 
     if (escaping) {
@@ -421,20 +414,20 @@
   // and need to escape the leading brace
   if (depth !== 0) {
-    // console.error("didn't close", pattern)
-    return braceExpand("\\" + pattern, options)
+    this.debug("didn't close", pattern)
+    return braceExpand.call(this, "\\" + pattern, options)
   }
 
   // x{y,z} -> ["xy", "xz"]
-  // console.error("set", set)
-  // console.error("suffix", pattern.substr(i))
-  var suf = braceExpand(pattern.substr(i), options)
+  this.debug("set", set)
+  this.debug("suffix", pattern.substr(i))
+  var suf = braceExpand.call(this, pattern.substr(i), options)
   // ["b", "c{d,e}","{f,g}h"] ->
   //   [["b"], ["cd", "ce"], ["fh", "gh"]]
   var addBraces = set.length === 1
-  // console.error("set pre-expanded", set)
+  this.debug("set pre-expanded", set)
   set = set.map(function (p) {
-    return braceExpand(p, options)
-  })
-  // console.error("set expanded", set)
+    return braceExpand.call(this, p, options)
+  }, this)
+  this.debug("set expanded", set)
 
 
@@ -497,4 +490,5 @@
       : options.dot ? "(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))"
       : "(?!\\.)"
+    , self = this
 
   function clearStateChar () {
@@ -515,4 +509,5 @@
           break
       }
+      self.debug('clearStateChar %j %j', stateChar, re)
       stateChar = false
     }
@@ -523,7 +518,5 @@
       ; i ++ ) {
 
-    if (options.debug) {
-      console.error("%s\t%s %s %j", pattern, i, re, c)
-    }
+    this.debug("%s\t%s %s %j", pattern, i, re, c)
 
     // skip over any that are escaped.
@@ -552,11 +545,10 @@
       case "@":
       case "!":
-        if (options.debug) {
-          console.error("%s\t%s %s %j <-- stateChar", pattern, i, re, c)
-        }
+        this.debug("%s\t%s %s %j <-- stateChar", pattern, i, re, c)
 
         // all of those are literals inside a class, except that
         // the glob [!a] means [^a] in regexp
         if (inClass) {
+          this.debug('  in class')
           if (c === "!" && i === classStart + 1) c = "^"
           re += c
@@ -567,4 +559,5 @@
         // that there was something like ** or +? in there.
         // Handle the stateChar, then proceed with this one.
+        self.debug('call clearStateChar %j', stateChar)
         clearStateChar()
         stateChar = c
@@ -592,4 +585,5 @@
         // negation is (?:(?!js)[^/]*)
         re += stateChar === "!" ? "(?:(?!" : "(?:"
+        this.debug('plType %j %j', stateChar, re)
         stateChar = false
         continue
@@ -601,4 +595,5 @@
         }
 
+        clearStateChar()
         hasMagic = true
         re += ")"
@@ -624,4 +619,5 @@
         }
 
+        clearStateChar()
         re += "|"
         continue
@@ -716,5 +712,5 @@
     })
 
-    // console.error("tail=%j\n   %s", tail, tail)
+    this.debug("tail=%j\n   %s", tail, tail)
     var t = pl.type === "*" ? star
           : pl.type === "?" ? qmark
@@ -830,5 +826,5 @@
 Minimatch.prototype.match = match
 function match (f, partial) {
-  // console.error("match", f, this.pattern)
+  this.debug("match", f, this.pattern)
   // short-circuit in the case of busted things.
   // comments, etc.
@@ -848,7 +844,5 @@
   // treat the test path as a set of pathparts.
   f = f.split(slashSplit)
-  if (options.debug) {
-    console.error(this.pattern, "split", f)
-  }
+  this.debug(this.pattern, "split", f)
 
   // just ONE of the pattern sets in this.set needs to match
@@ -858,9 +852,14 @@
 
   var set = this.set
-  // console.error(this.pattern, "set", set)
+  this.debug(this.pattern, "set", set)
+
+  var splitFile = path.basename(f.join("/")).split("/")
 
   for (var i = 0, l = set.length; i < l; i ++) {
-    var pattern = set[i]
-    var hit = this.matchOne(f, pattern, partial)
+    var pattern = set[i], file = f
+    if (options.matchBase && pattern.length === 1) {
+      file = splitFile
+    }
+    var hit = this.matchOne(file, pattern, partial)
     if (hit) {
       if (options.flipNegate) return true
@@ -883,18 +882,10 @@
   var options = this.options
 
-  if (options.debug) {
-    console.error("matchOne",
-                  { "this": this
-                  , file: file
-                  , pattern: pattern })
-  }
-
-  if (options.matchBase && pattern.length === 1) {
-    file = path.basename(file.join("/")).split("/")
-  }
-
-  if (options.debug) {
-    console.error("matchOne", file.length, pattern.length)
-  }
+  this.debug("matchOne",
+              { "this": this
+              , file: file
+              , pattern: pattern })
+
+  this.debug("matchOne", file.length, pattern.length)
 
   for ( var fi = 0
@@ -905,13 +896,9 @@
       ; fi ++, pi ++ ) {
 
-    if (options.debug) {
-      console.error("matchOne loop")
-    }
+    this.debug("matchOne loop")
     var p = pattern[pi]
       , f = file[fi]
 
-    if (options.debug) {
-      console.error(pattern, p, f)
-    }
+    this.debug(pattern, p, f)
 
     // should be impossible.
@@ -920,6 +907,5 @@
 
     if (p === GLOBSTAR) {
-      if (options.debug)
-        console.error('GLOBSTAR', [pattern, p, f])
+      this.debug('GLOBSTAR', [pattern, p, f])
 
       // "**"
@@ -948,6 +934,5 @@
         , pr = pi + 1
       if (pr === pl) {
-        if (options.debug)
-          console.error('** at the end')
+        this.debug('** at the end')
         // a ** at the end will just swallow the rest.
         // We have found a match.
@@ -967,13 +952,10 @@
         var swallowee = file[fr]
 
-        if (options.debug) {
-          console.error('\nglobstar while',
-                        file, fr, pattern, pr, swallowee)
-        }
+        this.debug('\nglobstar while',
+                    file, fr, pattern, pr, swallowee)
 
         // XXX remove this slice.  Just pass the start index.
         if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
-          if (options.debug)
-            console.error('globstar found match!', fr, fl, swallowee)
+          this.debug('globstar found match!', fr, fl, swallowee)
           // found a match.
           return true
@@ -983,12 +965,10 @@
           if (swallowee === "." || swallowee === ".." ||
               (!options.dot && swallowee.charAt(0) === ".")) {
-            if (options.debug)
-              console.error("dot detected!", file, fr, pattern, pr)
+            this.debug("dot detected!", file, fr, pattern, pr)
             break WHILE
           }
 
           // ** swallows a segment, and continue.
-          if (options.debug)
-            console.error('globstar swallow a segment, and continue')
+          this.debug('globstar swallow a segment, and continue')
           fr ++
         }
@@ -999,5 +979,5 @@
       if (partial) {
         // ran out of file
-        // console.error("\n>>> no match, partial?", file, fr, pattern, pr)
+        this.debug("\n>>> no match, partial?", file, fr, pattern, pr)
         if (fr === fl) return true
       }
@@ -1015,12 +995,8 @@
         hit = f === p
       }
-      if (options.debug) {
-        console.error("string match", p, f, hit)
-      }
+      this.debug("string match", p, f, hit)
     } else {
       hit = f.match(p)
-      if (options.debug) {
-        console.error("pattern match", p, f, hit)
-      }
+      this.debug("pattern match", p, f, hit)
     }
 
Index: /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json
===================================================================
--- /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json	(revision 515)
+++ /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json	(revision 516)
@@ -30,8 +30,4 @@
   "homepage": "https://github.com/isaacs/node-lru-cache",
   "_id": "lru-cache@2.5.0",
-  "dist": {
-    "shasum": "be07d09e5b05f10b83d0cf01d4891a7729288c69"
-  },
-  "_from": "lru-cache@2",
-  "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz"
+  "_from": "lru-cache@2"
 }
Index: /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/minimatch/package.json
===================================================================
--- /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/minimatch/package.json	(revision 515)
+++ /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/minimatch/package.json	(revision 516)
@@ -7,5 +7,5 @@
   "name": "minimatch",
   "description": "a glob matcher in javascript",
-  "version": "0.2.12",
+  "version": "0.2.14",
   "repository": {
     "type": "git",
@@ -14,5 +14,5 @@
   "main": "minimatch.js",
   "scripts": {
-    "test": "tap test"
+    "test": "tap test/*.js"
   },
   "engines": {
@@ -30,5 +30,5 @@
     "url": "http://github.com/isaacs/minimatch/raw/master/LICENSE"
   },
-  "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n### Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated.  Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally.  This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything.  Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set.  This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.  **Note that this is different from the way that `**` is\nhandled by ruby's `Dir` class.**\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes.  For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`.  This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern.  Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity.  Since those two are valid, matching proceeds.\n\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n  Each row in the\n  array corresponds to a brace-expanded pattern.  Each item in the row\n  corresponds to a single path-part.  For example, the pattern\n  `{a,b/c}/d` would expand to a set of patterns like:\n\n        [ [ a, d ]\n        , [ b, c, d ] ]\n\n    If a portion of the pattern doesn't have any \"magic\" in it\n    (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n    will be left as a string rather than converted to a regular\n    expression.\n\n* `regexp` Created by the `makeRe` method.  A single regular expression\n  expressing the entire pattern.  This is useful in cases where you wish\n  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n  Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n  false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n  filename, and match it against a single row in the `regExpSet`.  This\n  method is mainly for internal use, but is exposed so that it can be\n  used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items.  So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export.  Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`.  Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob.  If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself.  When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes.  For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n",
+  "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\nminimatch(\"bar.foo\", \"*.+(bar|foo)\", { debug: true }) // true, and noisy!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n  Each row in the\n  array corresponds to a brace-expanded pattern.  Each item in the row\n  corresponds to a single path-part.  For example, the pattern\n  `{a,b/c}/d` would expand to a set of patterns like:\n\n        [ [ a, d ]\n        , [ b, c, d ] ]\n\n    If a portion of the pattern doesn't have any \"magic\" in it\n    (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n    will be left as a string rather than converted to a regular\n    expression.\n\n* `regexp` Created by the `makeRe` method.  A single regular expression\n  expressing the entire pattern.  This is useful in cases where you wish\n  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n  Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n  false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n  filename, and match it against a single row in the `regExpSet`.  This\n  method is mainly for internal use, but is exposed so that it can be\n  used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items.  So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export.  Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`.  Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob.  If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself.  When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes.  For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated.  Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally.  This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything.  Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set.  This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes.  For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`.  This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern.  Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity.  Since those two are valid, matching proceeds.\n",
   "readmeFilename": "README.md",
   "bugs": {
@@ -36,5 +36,5 @@
   },
   "homepage": "https://github.com/isaacs/minimatch",
-  "_id": "minimatch@0.2.12",
+  "_id": "minimatch@0.2.14",
   "_from": "minimatch@~0.2.11"
 }
Index: /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js
===================================================================
--- /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js	(revision 516)
+++ /Dev/trunk/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js	(revision 516)
@@ -0,0 +1,8 @@
+var test = require('tap').test
+var minimatch = require('../')
+
+test('extglob ending with statechar', function(t) {
+  t.notOk(minimatch('ax', 'a?(b*)'))
+  t.ok(minimatch('ax', '?(a*|b)'))
+  t.end()
+})
Index: /Dev/trunk/node_modules/mocha/node_modules/glob/package.json
===================================================================
--- /Dev/trunk/node_modules/mocha/node_modules/glob/package.json	(revision 515)
+++ /Dev/trunk/node_modules/mocha/node_modules/glob/package.json	(revision 516)
@@ -37,4 +37,8 @@
   "homepage": "https://github.com/isaacs/node-glob",
   "_id": "glob@3.2.3",
-  "_from": "glob@3.2.3"
+  "dist": {
+    "shasum": "bb766eb21bf5e312976269aa9a97ae6a1952e404"
+  },
+  "_from": "glob@3.2.3",
+  "_resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz"
 }
Index: /Dev/trunk/node_modules/mocha/node_modules/jade/node_modules/commander/package.json
===================================================================
--- /Dev/trunk/node_modules/mocha/node_modules/jade/node_modules/commander/package.json	(revision 515)
+++ /Dev/trunk/node_modules/mocha/node_modules/jade/node_modules/commander/package.json	(revision 516)
@@ -36,8 +36,4 @@
   "homepage": "https://github.com/visionmedia/commander.js",
   "_id": "commander@0.6.1",
-  "dist": {
-    "shasum": "c725ed5e9b2bf532b3fe3cba4f81b552cecf0550"
-  },
-  "_from": "commander@0.6.1",
-  "_resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz"
+  "_from": "commander@0.6.1"
 }
Index: /Dev/trunk/node_modules/mocha/node_modules/jade/node_modules/mkdirp/package.json
===================================================================
--- /Dev/trunk/node_modules/mocha/node_modules/jade/node_modules/mkdirp/package.json	(revision 515)
+++ /Dev/trunk/node_modules/mocha/node_modules/jade/node_modules/mkdirp/package.json	(revision 516)
@@ -34,8 +34,4 @@
   "homepage": "https://github.com/substack/node-mkdirp",
   "_id": "mkdirp@0.3.0",
-  "dist": {
-    "shasum": "03e1756c8f2160b57caad091908d67ff928d0664"
-  },
-  "_from": "mkdirp@0.3.0",
-  "_resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz"
+  "_from": "mkdirp@0.3.0"
 }
Index: /Dev/trunk/node_modules/mocha/node_modules/jade/package.json
===================================================================
--- /Dev/trunk/node_modules/mocha/node_modules/jade/package.json	(revision 515)
+++ /Dev/trunk/node_modules/mocha/node_modules/jade/package.json	(revision 516)
@@ -45,8 +45,4 @@
   "homepage": "https://github.com/visionmedia/jade",
   "_id": "jade@0.26.3",
-  "dist": {
-    "shasum": "43c0b6da7fd794b3d7a28db08c37407ab90bd1ad"
-  },
-  "_from": "jade@0.26.3",
-  "_resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz"
+  "_from": "jade@0.26.3"
 }
Index: /Dev/trunk/node_modules/mocha/node_modules/mkdirp/package.json
===================================================================
--- /Dev/trunk/node_modules/mocha/node_modules/mkdirp/package.json	(revision 515)
+++ /Dev/trunk/node_modules/mocha/node_modules/mkdirp/package.json	(revision 516)
@@ -31,8 +31,4 @@
   "homepage": "https://github.com/substack/node-mkdirp",
   "_id": "mkdirp@0.3.5",
-  "dist": {
-    "shasum": "7d4fee48c751e68eddf5903038ad25370cd80618"
-  },
-  "_from": "mkdirp@0.3.5",
-  "_resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz"
+  "_from": "mkdirp@0.3.5"
 }
Index: /Dev/trunk/node_modules/mocha/package.json
===================================================================
--- /Dev/trunk/node_modules/mocha/package.json	(revision 515)
+++ /Dev/trunk/node_modules/mocha/package.json	(revision 516)
@@ -60,5 +60,5 @@
     "shasum": "d904d1c3635c491f4c0adc6afe8cd8b2580dbae7"
   },
-  "_from": "mocha@",
+  "_from": "mocha@1.14.0",
   "_resolved": "https://registry.npmjs.org/mocha/-/mocha-1.14.0.tgz"
 }
Index: /Dev/trunk/node_modules/should/.idea/workspace.xml
===================================================================
--- /Dev/trunk/node_modules/should/.idea/workspace.xml	(revision 515)
+++ /Dev/trunk/node_modules/should/.idea/workspace.xml	(revision 516)
@@ -5,4 +5,5 @@
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/History.md" afterPath="$PROJECT_DIR$/History.md" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/package.json" afterPath="$PROJECT_DIR$/package.json" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/should.js" afterPath="$PROJECT_DIR$/should.js" />
     </list>
     <ignored path="should.js.iws" />
@@ -39,5 +40,5 @@
         <entry file="file://$PROJECT_DIR$/lib/should.js">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="27" column="84" selection-start="644" selection-end="644" vertical-scroll-proportion="0.0" vertical-offset="1045" max-vertical-offset="19019">
+            <state line="29" column="88" selection-start="656" selection-end="656" vertical-scroll-proportion="-8.796296" vertical-offset="0" max-vertical-offset="19057">
               <folding />
             </state>
@@ -48,14 +49,14 @@
         <entry file="file://$PROJECT_DIR$/Readme.md">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="419" column="0" selection-start="10358" selection-end="10358" vertical-scroll-proportion="0.0" vertical-offset="7961" max-vertical-offset="8702">
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="package.json" pinned="false" current="true" current-in-tab="true">
+            <state line="420" column="0" selection-start="10380" selection-end="10380" vertical-scroll-proportion="0.0" vertical-offset="7980" max-vertical-offset="8702">
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="package.json" pinned="false" current="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/package.json">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="2" column="21" selection-start="108" selection-end="108" vertical-scroll-proportion="0.0479798" vertical-offset="0" max-vertical-offset="792">
+            <state line="2" column="21" selection-start="108" selection-end="108" vertical-scroll-proportion="-1.52" vertical-offset="0" max-vertical-offset="399">
               <folding />
             </state>
@@ -66,7 +67,7 @@
         <entry file="file://$PROJECT_DIR$/test/should.test.js">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="913" column="62" selection-start="25161" selection-end="25161" vertical-scroll-proportion="0.0" vertical-offset="16720" max-vertical-offset="17537">
+            <state line="913" column="59" selection-start="25150" selection-end="25150" vertical-scroll-proportion="0.0" vertical-offset="16720" max-vertical-offset="17537">
               <folding>
-                <marker date="1384152632000" expanded="true" signature="24476:24735" placeholder="{...}" />
+                <marker date="1386247488000" expanded="true" signature="24476:24735" placeholder="{...}" />
               </folding>
             </state>
@@ -74,8 +75,8 @@
         </entry>
       </file>
-      <file leaf-file-name="History.md" pinned="false" current="false" current-in-tab="false">
+      <file leaf-file-name="History.md" pinned="false" current="true" current-in-tab="true">
         <entry file="file://$PROJECT_DIR$/History.md">
           <provider selected="true" editor-type-id="text-editor">
-            <state line="3" column="60" selection-start="99" selection-end="99" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="3572">
+            <state line="3" column="45" selection-start="84" selection-end="84" vertical-scroll-proportion="0.069767445" vertical-offset="0" max-vertical-offset="3667">
               <folding />
             </state>
@@ -131,6 +132,6 @@
         <option value="$PROJECT_DIR$/lib/should.js" />
         <option value="$PROJECT_DIR$/test/should.test.js" />
+        <option value="$PROJECT_DIR$/package.json" />
         <option value="$PROJECT_DIR$/History.md" />
-        <option value="$PROJECT_DIR$/package.json" />
       </list>
     </option>
@@ -201,4 +202,18 @@
             </PATH_ELEMENT>
           </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="should.js" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="should.js" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="lib" />
+              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
+            </PATH_ELEMENT>
+          </PATH>
         </subPane>
       </pane>
@@ -212,16 +227,8 @@
     <property name="FullScreen" value="false" />
     <property name="DefaultHtmlFileTemplate" value="Html5" />
+    <property name="options.splitter.details.proportions" value="0.2" />
     <property name="options.searchVisible" value="true" />
-    <property name="options.splitter.details.proportions" value="0.2" />
   </component>
   <component name="RunManager">
-    <configuration default="true" type="DartUnitRunConfigurationType" factoryName="DartUnit">
-      <option name="VMOptions" />
-      <option name="arguments" />
-      <option name="filePath" />
-      <option name="scope" value="ALL" />
-      <option name="testName" />
-      <method />
-    </configuration>
     <configuration default="true" type="DartCommandLineRunConfigurationType" factoryName="Dart Command Line Application">
       <option name="VMOptions" />
@@ -232,4 +239,12 @@
       <option name="showConsoleOnStdErr" value="false" />
       <option name="showConsoleOnStdOut" value="false" />
+      <method />
+    </configuration>
+    <configuration default="true" type="DartUnitRunConfigurationType" factoryName="DartUnit">
+      <option name="VMOptions" />
+      <option name="arguments" />
+      <option name="filePath" />
+      <option name="scope" value="ALL" />
+      <option name="testName" />
       <method />
     </configuration>
@@ -354,5 +369,5 @@
     <entry file="file://$PROJECT_DIR$/Readme.md">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="419" column="0" selection-start="10358" selection-end="10358" vertical-scroll-proportion="0.0" vertical-offset="7961" max-vertical-offset="8702">
+        <state line="420" column="0" selection-start="10380" selection-end="10380" vertical-scroll-proportion="0.0" vertical-offset="7980" max-vertical-offset="8702">
           <folding />
         </state>
@@ -368,6 +383,20 @@
     <entry file="file://$PROJECT_DIR$/.npmignore">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="1" column="4" selection-start="13" selection-end="13" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="105">
-          <folding />
+        <state line="1" column="4" selection-start="13" selection-end="13" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="105" />
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/lib/should.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="29" column="88" selection-start="656" selection-end="656" vertical-scroll-proportion="-8.796296" vertical-offset="0" max-vertical-offset="19057">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/test/should.test.js">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="913" column="59" selection-start="25150" selection-end="25150" vertical-scroll-proportion="0.0" vertical-offset="16720" max-vertical-offset="17537">
+          <folding>
+            <marker date="1386247488000" expanded="true" signature="24476:24735" placeholder="{...}" />
+          </folding>
         </state>
       </provider>
@@ -375,22 +404,13 @@
     <entry file="file://$PROJECT_DIR$/Makefile">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="6" column="5" selection-start="64" selection-end="64" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="210">
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/lib/should.js">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="27" column="84" selection-start="644" selection-end="644" vertical-scroll-proportion="0.0" vertical-offset="57" max-vertical-offset="19019">
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/test/should.test.js">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="913" column="62" selection-start="25161" selection-end="25161" vertical-scroll-proportion="0.0" vertical-offset="16720" max-vertical-offset="17537">
-          <folding>
-            <marker date="1384152632000" expanded="true" signature="24476:24735" placeholder="{...}" />
-          </folding>
+        <state line="6" column="5" selection-start="64" selection-end="64" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="266">
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/package.json">
+      <provider selected="true" editor-type-id="text-editor">
+        <state line="2" column="21" selection-start="108" selection-end="108" vertical-scroll-proportion="-1.52" vertical-offset="0" max-vertical-offset="399">
+          <folding />
         </state>
       </provider>
@@ -398,12 +418,5 @@
     <entry file="file://$PROJECT_DIR$/History.md">
       <provider selected="true" editor-type-id="text-editor">
-        <state line="3" column="60" selection-start="99" selection-end="99" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="3572">
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/package.json">
-      <provider selected="true" editor-type-id="text-editor">
-        <state line="2" column="21" selection-start="108" selection-end="108" vertical-scroll-proportion="0.0479798" vertical-offset="0" max-vertical-offset="792">
+        <state line="3" column="45" selection-start="84" selection-end="84" vertical-scroll-proportion="0.069767445" vertical-offset="0" max-vertical-offset="3667">
           <folding />
         </state>
Index: /Dev/trunk/node_modules/should/History.md
===================================================================
--- /Dev/trunk/node_modules/should/History.md	(revision 515)
+++ /Dev/trunk/node_modules/should/History.md	(revision 516)
@@ -1,2 +1,7 @@
+2.1.1 / 2013-12-05
+==================
+
+ * Move date formatting out of should.inspect
+
 2.1.0 / 2013-11-11
 ==================
Index: /Dev/trunk/node_modules/should/Readme.md
===================================================================
--- /Dev/trunk/node_modules/should/Readme.md	(revision 515)
+++ /Dev/trunk/node_modules/should/Readme.md	(revision 516)
@@ -223,5 +223,5 @@
 ## property
 
-Assert property exists and has optional value:
+Assert property exists and has optional value(compare using `===`):
 ```javascript
 user.should.have.property('name')
Index: /Dev/trunk/node_modules/should/lib/should.js
===================================================================
--- /Dev/trunk/node_modules/should/lib/should.js	(revision 515)
+++ /Dev/trunk/node_modules/should/lib/should.js	(revision 516)
@@ -25,8 +25,10 @@
 };
 
-should.inspect = function(obj, opts) {
-  if(util.isDate(obj) && typeof obj.inspect !== 'function') obj = obj.toISOString();
-  return inspect(obj, opts);
-};
+should.inspect = inspect;
+
+function i(value) {
+  if(util.isDate(value) && typeof value.inspect !== 'function') return value.toISOString(); //show millis in dates
+  return should.inspect(value);
+}
 
 /**
@@ -52,5 +54,5 @@
   if(null == obj) {
     throw new AssertionError({
-      message: msg || ('expected ' + should.inspect(obj) + ' to exist')
+      message: msg || ('expected ' + i(obj) + ' to exist')
       , stackStartFunction: should.exist
     });
@@ -70,5 +72,5 @@
   if (null != obj) {
     throw new AssertionError({
-      message: msg || ('expected ' + should.inspect(obj) + ' to not exist')
+      message: msg || ('expected ' + i(obj) + ' to not exist')
       , stackStartFunction: should.not.exist
     });
@@ -238,5 +240,5 @@
 
   get inspect() {
-    return should.inspect(this.obj);
+    return i(this.obj);
   },
 
@@ -368,6 +370,6 @@
     this.assert(
         eql(val, this.obj)
-      , function(){ return 'expected ' + this.inspect + ' to equal ' + should.inspect(val) + (description ? " | " + description : "") }
-      , function(){ return 'expected ' + this.inspect + ' to not equal ' + should.inspect(val) + (description ? " | " + description : "") }
+      , function(){ return 'expected ' + this.inspect + ' to equal ' + i(val) + (description ? " | " + description : "") }
+      , function(){ return 'expected ' + this.inspect + ' to not equal ' + i(val) + (description ? " | " + description : "") }
       , val
       , true
@@ -387,6 +389,6 @@
     this.assert(
         val === this.obj
-      , function(){ return 'expected ' + this.inspect + ' to equal ' + should.inspect(val) + (description ? " | " + description : "") }
-      , function(){ return 'expected ' + this.inspect + ' to not equal ' + should.inspect(val) + (description ? " | " + description : "") }
+      , function(){ return 'expected ' + this.inspect + ' to equal ' + i(val) + (description ? " | " + description : "") }
+      , function(){ return 'expected ' + this.inspect + ' to not equal ' + i(val) + (description ? " | " + description : "") }
       , val
       , void 0
@@ -640,11 +642,11 @@
     if (this.negate && undefined !== val) {
       if (undefined === this.obj[name]) {
-        throw new Error(this.inspect + ' has no property ' + should.inspect(name) + (description ? " | " + description : ""));
+        throw new Error(this.inspect + ' has no property ' + i(name) + (description ? " | " + description : ""));
       }
     } else {
       this.assert(
           undefined !== this.obj[name]
-        , function(){ return 'expected ' + this.inspect + ' to have a property ' + should.inspect(name) + (description ? " | " + description : "") }
-        , function(){ return 'expected ' + this.inspect + ' to not have a property ' + should.inspect(name) + (description ? " | " + description : "") }
+        , function(){ return 'expected ' + this.inspect + ' to have a property ' + i(name) + (description ? " | " + description : "") }
+        , function(){ return 'expected ' + this.inspect + ' to not have a property ' + i(name) + (description ? " | " + description : "") }
         , void 0
         , void 0
@@ -655,7 +657,7 @@
       this.assert(
           val === this.obj[name]
-        , function(){ return 'expected ' + this.inspect + ' to have a property ' + should.inspect(name)
-          + ' of ' + should.inspect(val) + ', but got ' + should.inspect(this.obj[name]) + (description ? " | " + description : "") }
-        , function(){ return 'expected ' + this.inspect + ' to not have a property ' + should.inspect(name) + ' of ' + should.inspect(val) + (description ? " | " + description : "") }
+        , function(){ return 'expected ' + this.inspect + ' to have a property ' + i(name)
+          + ' of ' + i(val) + ', but got ' + i(this.obj[name]) + (description ? " | " + description : "") }
+        , function(){ return 'expected ' + this.inspect + ' to not have a property ' + i(name) + ' of ' + i(val) + (description ? " | " + description : "") }
         , void 0
         , void 0
@@ -691,10 +693,10 @@
     if (len > 1) {
       names = names.map(function(name){
-        return should.inspect(name);
+        return i(name);
       });
       var last = names.pop();
       str = names.join(', ') + ', and ' + last;
     } else {
-      str = should.inspect(names[0]);
+      str = i(names[0]);
     }
 
@@ -721,6 +723,6 @@
     this.assert(
       hasOwnProperty.call(this.obj, name)
-      , function(){ return 'expected ' + this.inspect + ' to have own property ' + should.inspect(name) + (description ? " | " + description : "") }
-      , function(){ return 'expected ' + this.inspect + ' to not have own property ' + should.inspect(name) + (description ? " | " + description : "") }
+      , function(){ return 'expected ' + this.inspect + ' to have own property ' + i(name) + (description ? " | " + description : "") }
+      , function(){ return 'expected ' + this.inspect + ' to not have own property ' + i(name) + (description ? " | " + description : "") }
       , void 0
       , void 0
@@ -739,6 +741,6 @@
   startWith: function(str, description) {
     this.assert(0 === this.obj.indexOf(str)
-    , function() { return 'expected ' + this.inspect + ' to start with ' + should.inspect(str) + (description ? " | " + description : "") }
-    , function() { return 'expected ' + this.inspect + ' to not start with ' + should.inspect(str) + (description ? " | " + description : "") }
+    , function() { return 'expected ' + this.inspect + ' to start with ' + i(str) + (description ? " | " + description : "") }
+    , function() { return 'expected ' + this.inspect + ' to not start with ' + i(str) + (description ? " | " + description : "") }
     , void 0
     , void 0
@@ -756,6 +758,6 @@
   endWith: function(str, description) {
     this.assert(-1 !== this.obj.indexOf(str, this.obj.length - str.length)
-    , function() { return 'expected ' + this.inspect + ' to end with ' + should.inspect(str) + (description ? " | " + description : "") }
-    , function() { return 'expected ' + this.inspect + ' to not end with ' + should.inspect(str) + (description ? " | " + description : "") }
+    , function() { return 'expected ' + this.inspect + ' to end with ' + i(str) + (description ? " | " + description : "") }
+    , function() { return 'expected ' + this.inspect + ' to not end with ' + i(str) + (description ? " | " + description : "") }
     , void 0
     , void 0
@@ -778,6 +780,6 @@
       this.assert(
           eql(cmp, obj)
-        , function(){ return 'expected ' + this.inspect + ' to include an object equal to ' + should.inspect(obj) + (description ? " | " + description : "") }
-        , function(){ return 'expected ' + this.inspect + ' to not include an object equal to ' + should.inspect(obj) + (description ? " | " + description : "") }
+        , function(){ return 'expected ' + this.inspect + ' to include an object equal to ' + i(obj) + (description ? " | " + description : "") }
+        , function(){ return 'expected ' + this.inspect + ' to not include an object equal to ' + i(obj) + (description ? " | " + description : "") }
         , void 0
         , void 0
@@ -786,6 +788,6 @@
       this.assert(
           ~this.obj.indexOf(obj)
-        , function(){ return 'expected ' + this.inspect + ' to include ' + should.inspect(obj) + (description ? " | " + description : "") }
-        , function(){ return 'expected ' + this.inspect + ' to not include ' + should.inspect(obj) + (description ? " | " + description : "") }
+        , function(){ return 'expected ' + this.inspect + ' to include ' + i(obj) + (description ? " | " + description : "") }
+        , function(){ return 'expected ' + this.inspect + ' to not include ' + i(obj) + (description ? " | " + description : "") }
         , void 0
         , void 0
@@ -806,6 +808,6 @@
     this.assert(
       this.obj.some(function(item) { return eql(obj, item); })
-      , function(){ return 'expected ' + this.inspect + ' to include an object equal to ' + should.inspect(obj) + (description ? " | " + description : "") }
-      , function(){ return 'expected ' + this.inspect + ' to not include an object equal to ' + should.inspect(obj) + (description ? " | " + description : "") }
+      , function(){ return 'expected ' + this.inspect + ' to include an object equal to ' + i(obj) + (description ? " | " + description : "") }
+      , function(){ return 'expected ' + this.inspect + ' to not include an object equal to ' + i(obj) + (description ? " | " + description : "") }
       , void 0
       , void 0
@@ -846,10 +848,10 @@
     if (len > 1) {
       keys = keys.map(function(key){
-        return should.inspect(key);
+        return i(key);
       });
       var last = keys.pop();
       str = keys.join(', ') + ', and ' + last;
     } else {
-      str = should.inspect(keys[0]);
+      str = i(keys[0]);
     }
 
@@ -895,7 +897,7 @@
     this.assert(
         code == status
-      , function(){ return 'expected response code of ' + code + ' ' + should.inspect(statusCodes[code])
-        + ', but got ' + status + ' ' + should.inspect(statusCodes[status]) }
-      , function(){ return 'expected to not respond with ' + code + ' ' + should.inspect(statusCodes[code]) });
+      , function(){ return 'expected response code of ' + code + ' ' + i(statusCodes[code])
+        + ', but got ' + status + ' ' + i(statusCodes[status]) }
+      , function(){ return 'expected to not respond with ' + code + ' ' + i(statusCodes[code]) });
 
     return this;
Index: /Dev/trunk/node_modules/should/package.json
===================================================================
--- /Dev/trunk/node_modules/should/package.json	(revision 515)
+++ /Dev/trunk/node_modules/should/package.json	(revision 516)
@@ -2,5 +2,5 @@
   "name": "should",
   "description": "test framework agnostic BDD-style assertions",
-  "version": "2.1.0",
+  "version": "2.1.1",
   "author": {
     "name": "TJ Holowaychuk",
@@ -33,14 +33,14 @@
     "node": ">= 0.2.0"
   },
-  "readme": "# should.js\n\n_should_ is an expressive, readable, test framework agnostic, assertion library for [node](http://nodejs.org).\n\nIt extends the Object prototype with a single non-enumerable getter that allows you to express how that object should behave.\n\n## Example\n```javascript\nvar should = require('should');\n\nvar user = {\n    name: 'tj'\n  , pets: ['tobi', 'loki', 'jane', 'bandit']\n};\n\nuser.should.have.property('name', 'tj');\nuser.should.have.property('pets').with.lengthOf(4);\n\n// or without Object.prototype, for guys how did Object.create(null)\nshould(user).have.property('name', 'tj');\nshould(true).ok;\n\nsomeAsyncTask(foo, function(err, result){\n  should.not.exist(err);\n  should.exist(result);\n  result.bar.should.equal(foo);\n});\n```\n## Installation\n\n    $ npm install should --save-dev\n\n## In browser\n\nIf you want to use _should_ in browser, use version that is in root of repository. It is build with browserify (see [Makefile](https://github.com/visionmedia/should.js/blob/master/Makefile) about how it is build). To build fresh version:\n\n```bash\n# you should have browserify\nnpm install -g browserify\nmake browser\n```\n\n## chaining assertions\n\nEvery assertion will return a should.js-wraped Object, so assertions can be chained. For example:\n\n```js\nuser.should.be.an.instanceOf(Object).and.have.property('name', 'tj');\nuser.pets.should.be.instanceof(Array).and.have.lengthOf(4);\n```\n\nAll assertions return themselves but not `property` and `ownProperty`. They two would return the property value.\n\nfor example if a property is volatile we can first assert property existence:\n```javascript\n// `user.should.have.property('pets')` returned `should(user.pets)` but not `should(user)`\nuser.should.have.property('pets').with.lengthOf(4)\n```\nwhich is essentially equivalent to below, however the property may not exist:\n```javascript\nuser.pets.should.have.lengthOf(4)\n```\n\nour dummy getters such as _a_, _an_, _be_, _of_ and _have_ make tests more readable while the getters _and_ and _with_ helps express chaining:\n```javascript\nuser.should.be.an.instanceOf(Object).and.have.property('name', 'tj')\nuser.should.have.property('pets').with.a.lengthOf(4)\n```\nThose getters don't have any actual effect, just for readability.\n\n## static\n\nFor some rare cases should can be used statically, without `Object.prototype`.\nIt can be replacement for node assert module (and it uses the same `AssertionError`):\n\n```javascript\nassert.fail(actual, expected, message, operator) // just write wrong should assertion\nassert(value, message), assert.ok(value, [message]) // should(value).ok\nassert.equal(actual, expected, [message]) // should(actual).eql(expected, [message])\nassert.notEqual(actual, expected, [message]) // should(actual).not.eql(expected, [message])\nassert.deepEqual(actual, expected, [message]) // should(actual).eql(expected, [message])\nassert.notDeepEqual(actual, expected, [message]) // should(actual).not.eql(expected, [message])\nassert.strictEqual(actual, expected, [message]) // should(actual).equal(expected, [message])\nassert.notStrictEqual(actual, expected, [message]) // should(actual).not.equal(expected, [message])\nassert.throws(block, [error], [message]) // should(block).throw([error])\nassert.doesNotThrow(block, [message]) // should(block).not.throw([error])\nassert.ifError(value) // should(value).Error (to check if it is error) or should(value).not.ok (to check that it is falsy)\n```\n\n## ok\n\nAssert truthfulness:\n```javascript\ntrue.should.be.ok\n'yay'.should.be.ok\n(1).should.be.ok\n```\nor negated:\n```javascript\nfalse.should.not.be.ok\n''.should.not.be.ok\n(0).should.not.be.ok\n```\n## true\n\nAssert === true:\n```javascript\ntrue.should.be.true\n'1'.should.not.be.true\n```\n## false\n\nAssert === false:\n```javascript\nfalse.should.be.false\n(0).should.not.be.false\n```\n## arguments\n\nAssert `Arguments`:\n```javascript\nvar args = (function(){ return arguments; })(1,2,3);\nargs.should.be.arguments;\n[].should.not.be.arguments;\n```\n## empty\n\nAsserts that given object is empty\n```javascript\n[].should.be.empty\n''.should.be.empty\n({}).should.be.empty\n(function() {\n  arguments.should.be.empty;\n})()\n```\n## eql\n\nequality:\n```javascript\n({ foo: 'bar' }).should.eql({ foo: 'bar' })\n[1,2,3].should.eql([1,2,3])\n```\n## equal and exactly\n\nstrict equality:\n```javascript\nshould.strictEqual(undefined, value)\nshould.strictEqual(false, value)\n(4).should.equal(4)\n'test'.should.equal('test')\n[1,2,3].should.not.equal([1,2,3])\n(4).should.be.exactly(4)\n```\n## within\n\nAssert inclusive numeric range:\n```javascript\nuser.age.should.be.within(5, 50)\n```\n## approximately\n\nAssert floating point number:\n```javascript\n(99.99).should.be.approximately(100, 0.1);\n```\n## type\n\nAssert __typeof__:\n```javascript\nuser.should.be.type('object')\n'test'.should.be.type('string')\n```\n## instanceof and instanceOf\n\nAssert __instanceof__ or __instanceOf__:\n```javascript\nuser.should.be.an.instanceof(User)\n[].should.be.an.instanceOf(Array)\n```\n## above\n\nAssert numeric value above the given value:\n```javascript\nuser.age.should.be.above(5)\nuser.age.should.not.be.above(100)\n```\n## below\n\nAssert numeric value below the given value:\n```javascript\nuser.age.should.be.below(100)\nuser.age.should.not.be.below(5)\n```\n## NaN\n\nAssert numeric valus is NaN:\n```javascript\n(undefined + 0).should.be.NaN;\n```\n## Infinity\n\nAssert numeric valus is Infinity:\n```javascript\n(1/0).should.be.Infinity;\n```\n## match\n\nAssert regexp match:\n```javascript\nusername.should.match(/^\\w+$/)\n```\n## length\n\nAssert _length_ property exists and has a value of the given number:\n```javascript\nuser.pets.should.have.length(5)\nuser.pets.should.have.a.lengthOf(5)\n({ length: 10}).should.have.length(10);\n```\nAliases: _lengthOf_\n\n## property\n\nAssert property exists and has optional value:\n```javascript\nuser.should.have.property('name')\nuser.should.have.property('age', 15)\nuser.should.not.have.property('rawr')\nuser.should.not.have.property('age', 0)\n```\n\n## properties\n\nAssert given properties exists:\n```javascript\nuser.should.have.properties('name', 'age');\nuser.should.have.properties(['name', 'age']);\n```\n## ownProperty\n\nAssert own property (on the immediate object):\n```javascript\n({ foo: 'bar' }).should.have.ownProperty('foo')\n```\n## status(code)\n\n Asserts that `.statusCode` is `code`:\n```javascript\nres.should.have.status(200);\n```\n## header(field[, value])\n\n Asserts that a `.headers` object with `field` and optional `value` are present:\n```javascript\nres.should.have.header('content-length');\nres.should.have.header('Content-Length', '123');\nres.should.have.header('content-length', '123');\n```\n## json\n\n  Assert that Content-Type is \"application/json; charset=utf-8\"\n```javascript\nres.should.be.json\n```\n## html\n\n  Assert that Content-Type is \"text/html; charset=utf-8\"\n```javascript\nres.should.be.html\n```\n\n## include(obj) or contain(obj)\n\nAssert that the given `obj` is present via `indexOf()`, so this works for strings, arrays, or custom objects implementing indexOf. Also it can assert if given object will have some sub-object.\n\nAssert array value:\n```javascript\n[1,2,3].should.include(3)\n[1,2,3].should.include(2)\n[1,2,3].should.not.include(4)\n```\nAssert substring:\n```javascript\n'foo bar baz'.should.include('foo')\n'foo bar baz'.should.include('bar')\n'foo bar baz'.should.include('baz')\n'foo bar baz'.should.not.include('FOO')\n```\nAssert object includes another object:\n```javascript\nvar tobi = { name: 'Tobi', age: 1 };\nvar jane = { name: 'Jane', age: 5 };\nvar user = { name: 'TJ', pet: tobi };\n\nuser.should.include({ pet: tobi });\nuser.should.include({ pet: tobi, name: 'TJ' });\nuser.should.not.include({ pet: jane });\nuser.should.not.include({ name: 'Someone' });\n```\n## includeEql(obj)\n\nAssert that an object equal to the given `obj` is present in an Array:\n```javascript\n[[1],[2],[3]].should.includeEql([3])\n[[1],[2],[3]].should.includeEql([2])\n[[1],[2],[3]].should.not.includeEql([4])\n```\n## throw()\n\nAssert an exception is thrown:\n\n```js\n(function(){\n  throw new Error('fail');\n}).should.throw();\n```\n\nAssert an exception is not thrown:\n\n```js\n(function(){\n\n}).should.not.throw();\n```\nAssert exception message matches string:\n\n```js\n(function(){\n  throw new Error('fail');\n}).should.throw('fail');\n```\n\nAssert exepection message matches regexp:\n\n```js\n(function(){\n  throw new Error('failed to foo');\n}).should.throw(/^fail/);\n```\n\n## throwError()\n\nAn alias of `throw`, its purpose is to be an option for those who run\n[jshint](https://github.com/jshint/node-jshint/) in strict mode.\n\n```js\n(function(){\n  throw new Error('failed to baz');\n}).should.throwError(/^fail.*/);\n```\n\n## startWith(str)\n\nAssert that string starts with `str`.\n\n```javascript\n'foobar'.should.startWith('foo')\n'foobar'.should.not.startWith('bar')\n```\n## endWith(str)\n\nAssert that string ends with `str`.\n\n```javascript\n'foobar'.should.endWith('bar')\n'foobar'.should.not.endWith('foo')\n```\n\n## keys\n\nAssert own object keys, which must match _exactly_,\nand will fail if you omit a key or two:\n\n    var obj = { foo: 'bar', baz: 'raz' };\n    obj.should.have.keys('foo', 'baz');\n    obj.should.have.keys(['foo', 'baz']);\n\n## type assertions\n\n```javascript\n({}).should.be.an.Object;\n(1).should.be.an.Number;\n[].should.be.an.Array;\n(true).should.be.a.Boolean;\n''.should.be.a.String;\n```\n\n## Optional Error description\n\nAs it can often be difficult to ascertain exactly where failed assertions are coming from in your tests, an optional description parameter can be passed to several should matchers. The description will follow the failed assertion in the error:\n\n    (1).should.eql(0, 'some useful description')\n\n    AssertionError: expected 1 to equal 0 | some useful description\n      at Object.eql (/Users/swift/code/should.js/node_modules/should/lib/should.js:280:10)\n      ...\n\nThe methods that support this optional description are: `eql`, `equal`, `within`, `a`, `instanceof`, `above`, `below`, `match`, `length`, `property`, `ownProperty`, `include`, and `includeEql`.\n\n## Mocha example\n\nFor example you can use should with the [Mocha test framework](http://visionmedia.github.io/mocha/) by simply including it:\n\n```javascript\nvar should = require('should');\nvar mylib = require('mylib');\n\n\ndescribe('mylib', function () {\n  it('should have a version with the format #.#.#', function() {\n    lib.version.should.match(/^\\d+\\.\\d+\\.\\d+$/);\n  }\n});\n```\n\n## Running tests\n\nTo run the tests for _should_ simply run:\n\n    $ make test\n\n## OMG IT EXTENDS OBJECT???!?!@\n\nYes, yes it does, with a single getter _should_, and no it won't break your code, because it does this **properly** with a non-enumerable property.\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2010-2011 TJ Holowaychuk &lt;tj@vision-media.ca&gt;\n\nCopyright (c) 2011 Aseem Kishore &lt;aseem.kishore@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n",
+  "readme": "# should.js\n\n_should_ is an expressive, readable, test framework agnostic, assertion library for [node](http://nodejs.org).\n\nIt extends the Object prototype with a single non-enumerable getter that allows you to express how that object should behave.\n\n## Example\n```javascript\nvar should = require('should');\n\nvar user = {\n    name: 'tj'\n  , pets: ['tobi', 'loki', 'jane', 'bandit']\n};\n\nuser.should.have.property('name', 'tj');\nuser.should.have.property('pets').with.lengthOf(4);\n\n// or without Object.prototype, for guys how did Object.create(null)\nshould(user).have.property('name', 'tj');\nshould(true).ok;\n\nsomeAsyncTask(foo, function(err, result){\n  should.not.exist(err);\n  should.exist(result);\n  result.bar.should.equal(foo);\n});\n```\n## Installation\n\n    $ npm install should --save-dev\n\n## In browser\n\nIf you want to use _should_ in browser, use version that is in root of repository. It is build with browserify (see [Makefile](https://github.com/visionmedia/should.js/blob/master/Makefile) about how it is build). To build fresh version:\n\n```bash\n# you should have browserify\nnpm install -g browserify\nmake browser\n```\n\n## chaining assertions\n\nEvery assertion will return a should.js-wraped Object, so assertions can be chained. For example:\n\n```js\nuser.should.be.an.instanceOf(Object).and.have.property('name', 'tj');\nuser.pets.should.be.instanceof(Array).and.have.lengthOf(4);\n```\n\nAll assertions return themselves but not `property` and `ownProperty`. They two would return the property value.\n\nfor example if a property is volatile we can first assert property existence:\n```javascript\n// `user.should.have.property('pets')` returned `should(user.pets)` but not `should(user)`\nuser.should.have.property('pets').with.lengthOf(4)\n```\nwhich is essentially equivalent to below, however the property may not exist:\n```javascript\nuser.pets.should.have.lengthOf(4)\n```\n\nour dummy getters such as _a_, _an_, _be_, _of_ and _have_ make tests more readable while the getters _and_ and _with_ helps express chaining:\n```javascript\nuser.should.be.an.instanceOf(Object).and.have.property('name', 'tj')\nuser.should.have.property('pets').with.a.lengthOf(4)\n```\nThose getters don't have any actual effect, just for readability.\n\n## static\n\nFor some rare cases should can be used statically, without `Object.prototype`.\nIt can be replacement for node assert module (and it uses the same `AssertionError`):\n\n```javascript\nassert.fail(actual, expected, message, operator) // just write wrong should assertion\nassert(value, message), assert.ok(value, [message]) // should(value).ok\nassert.equal(actual, expected, [message]) // should(actual).eql(expected, [message])\nassert.notEqual(actual, expected, [message]) // should(actual).not.eql(expected, [message])\nassert.deepEqual(actual, expected, [message]) // should(actual).eql(expected, [message])\nassert.notDeepEqual(actual, expected, [message]) // should(actual).not.eql(expected, [message])\nassert.strictEqual(actual, expected, [message]) // should(actual).equal(expected, [message])\nassert.notStrictEqual(actual, expected, [message]) // should(actual).not.equal(expected, [message])\nassert.throws(block, [error], [message]) // should(block).throw([error])\nassert.doesNotThrow(block, [message]) // should(block).not.throw([error])\nassert.ifError(value) // should(value).Error (to check if it is error) or should(value).not.ok (to check that it is falsy)\n```\n\n## ok\n\nAssert truthfulness:\n```javascript\ntrue.should.be.ok\n'yay'.should.be.ok\n(1).should.be.ok\n```\nor negated:\n```javascript\nfalse.should.not.be.ok\n''.should.not.be.ok\n(0).should.not.be.ok\n```\n## true\n\nAssert === true:\n```javascript\ntrue.should.be.true\n'1'.should.not.be.true\n```\n## false\n\nAssert === false:\n```javascript\nfalse.should.be.false\n(0).should.not.be.false\n```\n## arguments\n\nAssert `Arguments`:\n```javascript\nvar args = (function(){ return arguments; })(1,2,3);\nargs.should.be.arguments;\n[].should.not.be.arguments;\n```\n## empty\n\nAsserts that given object is empty\n```javascript\n[].should.be.empty\n''.should.be.empty\n({}).should.be.empty\n(function() {\n  arguments.should.be.empty;\n})()\n```\n## eql\n\nequality:\n```javascript\n({ foo: 'bar' }).should.eql({ foo: 'bar' })\n[1,2,3].should.eql([1,2,3])\n```\n## equal and exactly\n\nstrict equality:\n```javascript\nshould.strictEqual(undefined, value)\nshould.strictEqual(false, value)\n(4).should.equal(4)\n'test'.should.equal('test')\n[1,2,3].should.not.equal([1,2,3])\n(4).should.be.exactly(4)\n```\n## within\n\nAssert inclusive numeric range:\n```javascript\nuser.age.should.be.within(5, 50)\n```\n## approximately\n\nAssert floating point number:\n```javascript\n(99.99).should.be.approximately(100, 0.1);\n```\n## type\n\nAssert __typeof__:\n```javascript\nuser.should.be.type('object')\n'test'.should.be.type('string')\n```\n## instanceof and instanceOf\n\nAssert __instanceof__ or __instanceOf__:\n```javascript\nuser.should.be.an.instanceof(User)\n[].should.be.an.instanceOf(Array)\n```\n## above\n\nAssert numeric value above the given value:\n```javascript\nuser.age.should.be.above(5)\nuser.age.should.not.be.above(100)\n```\n## below\n\nAssert numeric value below the given value:\n```javascript\nuser.age.should.be.below(100)\nuser.age.should.not.be.below(5)\n```\n## NaN\n\nAssert numeric valus is NaN:\n```javascript\n(undefined + 0).should.be.NaN;\n```\n## Infinity\n\nAssert numeric valus is Infinity:\n```javascript\n(1/0).should.be.Infinity;\n```\n## match\n\nAssert regexp match:\n```javascript\nusername.should.match(/^\\w+$/)\n```\n## length\n\nAssert _length_ property exists and has a value of the given number:\n```javascript\nuser.pets.should.have.length(5)\nuser.pets.should.have.a.lengthOf(5)\n({ length: 10}).should.have.length(10);\n```\nAliases: _lengthOf_\n\n## property\n\nAssert property exists and has optional value(compare using `===`):\n```javascript\nuser.should.have.property('name')\nuser.should.have.property('age', 15)\nuser.should.not.have.property('rawr')\nuser.should.not.have.property('age', 0)\n```\n\n## properties\n\nAssert given properties exists:\n```javascript\nuser.should.have.properties('name', 'age');\nuser.should.have.properties(['name', 'age']);\n```\n## ownProperty\n\nAssert own property (on the immediate object):\n```javascript\n({ foo: 'bar' }).should.have.ownProperty('foo')\n```\n## status(code)\n\n Asserts that `.statusCode` is `code`:\n```javascript\nres.should.have.status(200);\n```\n## header(field[, value])\n\n Asserts that a `.headers` object with `field` and optional `value` are present:\n```javascript\nres.should.have.header('content-length');\nres.should.have.header('Content-Length', '123');\nres.should.have.header('content-length', '123');\n```\n## json\n\n  Assert that Content-Type is \"application/json; charset=utf-8\"\n```javascript\nres.should.be.json\n```\n## html\n\n  Assert that Content-Type is \"text/html; charset=utf-8\"\n```javascript\nres.should.be.html\n```\n\n## include(obj) or contain(obj)\n\nAssert that the given `obj` is present via `indexOf()`, so this works for strings, arrays, or custom objects implementing indexOf. Also it can assert if given object will have some sub-object.\n\nAssert array value:\n```javascript\n[1,2,3].should.include(3)\n[1,2,3].should.include(2)\n[1,2,3].should.not.include(4)\n```\nAssert substring:\n```javascript\n'foo bar baz'.should.include('foo')\n'foo bar baz'.should.include('bar')\n'foo bar baz'.should.include('baz')\n'foo bar baz'.should.not.include('FOO')\n```\nAssert object includes another object:\n```javascript\nvar tobi = { name: 'Tobi', age: 1 };\nvar jane = { name: 'Jane', age: 5 };\nvar user = { name: 'TJ', pet: tobi };\n\nuser.should.include({ pet: tobi });\nuser.should.include({ pet: tobi, name: 'TJ' });\nuser.should.not.include({ pet: jane });\nuser.should.not.include({ name: 'Someone' });\n```\n## includeEql(obj)\n\nAssert that an object equal to the given `obj` is present in an Array:\n```javascript\n[[1],[2],[3]].should.includeEql([3])\n[[1],[2],[3]].should.includeEql([2])\n[[1],[2],[3]].should.not.includeEql([4])\n```\n## throw()\n\nAssert an exception is thrown:\n\n```js\n(function(){\n  throw new Error('fail');\n}).should.throw();\n```\n\nAssert an exception is not thrown:\n\n```js\n(function(){\n\n}).should.not.throw();\n```\nAssert exception message matches string:\n\n```js\n(function(){\n  throw new Error('fail');\n}).should.throw('fail');\n```\n\nAssert exepection message matches regexp:\n\n```js\n(function(){\n  throw new Error('failed to foo');\n}).should.throw(/^fail/);\n```\n\n## throwError()\n\nAn alias of `throw`, its purpose is to be an option for those who run\n[jshint](https://github.com/jshint/node-jshint/) in strict mode.\n\n```js\n(function(){\n  throw new Error('failed to baz');\n}).should.throwError(/^fail.*/);\n```\n\n## startWith(str)\n\nAssert that string starts with `str`.\n\n```javascript\n'foobar'.should.startWith('foo')\n'foobar'.should.not.startWith('bar')\n```\n## endWith(str)\n\nAssert that string ends with `str`.\n\n```javascript\n'foobar'.should.endWith('bar')\n'foobar'.should.not.endWith('foo')\n```\n\n## keys\n\nAssert own object keys, which must match _exactly_,\nand will fail if you omit a key or two:\n\n    var obj = { foo: 'bar', baz: 'raz' };\n    obj.should.have.keys('foo', 'baz');\n    obj.should.have.keys(['foo', 'baz']);\n\n## type assertions\n\n```javascript\n({}).should.be.an.Object;\n(1).should.be.an.Number;\n[].should.be.an.Array;\n(true).should.be.a.Boolean;\n''.should.be.a.String;\n```\n\n## Optional Error description\n\nAs it can often be difficult to ascertain exactly where failed assertions are coming from in your tests, an optional description parameter can be passed to several should matchers. The description will follow the failed assertion in the error:\n\n    (1).should.eql(0, 'some useful description')\n\n    AssertionError: expected 1 to equal 0 | some useful description\n      at Object.eql (/Users/swift/code/should.js/node_modules/should/lib/should.js:280:10)\n      ...\n\nThe methods that support this optional description are: `eql`, `equal`, `within`, `a`, `instanceof`, `above`, `below`, `match`, `length`, `property`, `ownProperty`, `include`, and `includeEql`.\n\n## Mocha example\n\nFor example you can use should with the [Mocha test framework](http://visionmedia.github.io/mocha/) by simply including it:\n\n```javascript\nvar should = require('should');\nvar mylib = require('mylib');\n\n\ndescribe('mylib', function () {\n  it('should have a version with the format #.#.#', function() {\n    lib.version.should.match(/^\\d+\\.\\d+\\.\\d+$/);\n  }\n});\n```\n\n## Running tests\n\nTo run the tests for _should_ simply run:\n\n    $ make test\n\n## OMG IT EXTENDS OBJECT???!?!@\n\nYes, yes it does, with a single getter _should_, and no it won't break your code, because it does this **properly** with a non-enumerable property.\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2010-2011 TJ Holowaychuk &lt;tj@vision-media.ca&gt;\n\nCopyright (c) 2011 Aseem Kishore &lt;aseem.kishore@gmail.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n",
   "readmeFilename": "Readme.md",
   "bugs": {
     "url": "https://github.com/visionmedia/should.js/issues"
   },
-  "_id": "should@2.1.0",
+  "_id": "should@2.1.1",
   "dist": {
-    "shasum": "7bceb94366f4e87672f3ced74cc9f1561f234336"
+    "shasum": "4a86e19fe38285785031d253938daedb169f72e5"
   },
-  "_from": "should@",
-  "_resolved": "https://registry.npmjs.org/should/-/should-2.1.0.tgz"
+  "_from": "should@2.1.1",
+  "_resolved": "https://registry.npmjs.org/should/-/should-2.1.1.tgz"
 }
Index: /Dev/trunk/node_modules/should/should.js
===================================================================
--- /Dev/trunk/node_modules/should/should.js	(revision 515)
+++ /Dev/trunk/node_modules/should/should.js	(revision 516)
@@ -189,8 +189,10 @@
 };
 
-should.inspect = function(obj, opts) {
-  if(util.isDate(obj) && typeof obj.inspect !== 'function') obj = obj.toISOString();
-  return inspect(obj, opts);
-};
+should.inspect = inspect;
+
+function i(value) {
+  if(util.isDate(value) && typeof value.inspect !== 'function') return value.toISOString(); //show millis in dates
+  return should.inspect(value);
+}
 
 /**
@@ -216,5 +218,5 @@
   if(null == obj) {
     throw new AssertionError({
-      message: msg || ('expected ' + should.inspect(obj) + ' to exist')
+      message: msg || ('expected ' + i(obj) + ' to exist')
       , stackStartFunction: should.exist
     });
@@ -234,5 +236,5 @@
   if (null != obj) {
     throw new AssertionError({
-      message: msg || ('expected ' + should.inspect(obj) + ' to not exist')
+      message: msg || ('expected ' + i(obj) + ' to not exist')
       , stackStartFunction: should.not.exist
     });
@@ -402,5 +404,5 @@
 
   get inspect() {
-    return should.inspect(this.obj);
+    return i(this.obj);
   },
 
@@ -532,6 +534,6 @@
     this.assert(
         eql(val, this.obj)
-      , function(){ return 'expected ' + this.inspect + ' to equal ' + should.inspect(val) + (description ? " | " + description : "") }
-      , function(){ return 'expected ' + this.inspect + ' to not equal ' + should.inspect(val) + (description ? " | " + description : "") }
+      , function(){ return 'expected ' + this.inspect + ' to equal ' + i(val) + (description ? " | " + description : "") }
+      , function(){ return 'expected ' + this.inspect + ' to not equal ' + i(val) + (description ? " | " + description : "") }
       , val
       , true
@@ -551,6 +553,6 @@
     this.assert(
         val === this.obj
-      , function(){ return 'expected ' + this.inspect + ' to equal ' + should.inspect(val) + (description ? " | " + description : "") }
-      , function(){ return 'expected ' + this.inspect + ' to not equal ' + should.inspect(val) + (description ? " | " + description : "") }
+      , function(){ return 'expected ' + this.inspect + ' to equal ' + i(val) + (description ? " | " + description : "") }
+      , function(){ return 'expected ' + this.inspect + ' to not equal ' + i(val) + (description ? " | " + description : "") }
       , val
       , void 0
@@ -804,11 +806,11 @@
     if (this.negate && undefined !== val) {
       if (undefined === this.obj[name]) {
-        throw new Error(this.inspect + ' has no property ' + should.inspect(name) + (description ? " | " + description : ""));
+        throw new Error(this.inspect + ' has no property ' + i(name) + (description ? " | " + description : ""));
       }
     } else {
       this.assert(
           undefined !== this.obj[name]
-        , function(){ return 'expected ' + this.inspect + ' to have a property ' + should.inspect(name) + (description ? " | " + description : "") }
-        , function(){ return 'expected ' + this.inspect + ' to not have a property ' + should.inspect(name) + (description ? " | " + description : "") }
+        , function(){ return 'expected ' + this.inspect + ' to have a property ' + i(name) + (description ? " | " + description : "") }
+        , function(){ return 'expected ' + this.inspect + ' to not have a property ' + i(name) + (description ? " | " + description : "") }
         , void 0
         , void 0
@@ -819,7 +821,7 @@
       this.assert(
           val === this.obj[name]
-        , function(){ return 'expected ' + this.inspect + ' to have a property ' + should.inspect(name)
-          + ' of ' + should.inspect(val) + ', but got ' + should.inspect(this.obj[name]) + (description ? " | " + description : "") }
-        , function(){ return 'expected ' + this.inspect + ' to not have a property ' + should.inspect(name) + ' of ' + should.inspect(val) + (description ? " | " + description : "") }
+        , function(){ return 'expected ' + this.inspect + ' to have a property ' + i(name)
+          + ' of ' + i(val) + ', but got ' + i(this.obj[name]) + (description ? " | " + description : "") }
+        , function(){ return 'expected ' + this.inspect + ' to not have a property ' + i(name) + ' of ' + i(val) + (description ? " | " + description : "") }
         , void 0
         , void 0
@@ -855,10 +857,10 @@
     if (len > 1) {
       names = names.map(function(name){
-        return should.inspect(name);
+        return i(name);
       });
       var last = names.pop();
       str = names.join(', ') + ', and ' + last;
     } else {
-      str = should.inspect(names[0]);
+      str = i(names[0]);
     }
 
@@ -885,6 +887,6 @@
     this.assert(
       hasOwnProperty.call(this.obj, name)
-      , function(){ return 'expected ' + this.inspect + ' to have own property ' + should.inspect(name) + (description ? " | " + description : "") }
-      , function(){ return 'expected ' + this.inspect + ' to not have own property ' + should.inspect(name) + (description ? " | " + description : "") }
+      , function(){ return 'expected ' + this.inspect + ' to have own property ' + i(name) + (description ? " | " + description : "") }
+      , function(){ return 'expected ' + this.inspect + ' to not have own property ' + i(name) + (description ? " | " + description : "") }
       , void 0
       , void 0
@@ -903,6 +905,6 @@
   startWith: function(str, description) {
     this.assert(0 === this.obj.indexOf(str)
-    , function() { return 'expected ' + this.inspect + ' to start with ' + should.inspect(str) + (description ? " | " + description : "") }
-    , function() { return 'expected ' + this.inspect + ' to not start with ' + should.inspect(str) + (description ? " | " + description : "") }
+    , function() { return 'expected ' + this.inspect + ' to start with ' + i(str) + (description ? " | " + description : "") }
+    , function() { return 'expected ' + this.inspect + ' to not start with ' + i(str) + (description ? " | " + description : "") }
     , void 0
     , void 0
@@ -920,6 +922,6 @@
   endWith: function(str, description) {
     this.assert(-1 !== this.obj.indexOf(str, this.obj.length - str.length)
-    , function() { return 'expected ' + this.inspect + ' to end with ' + should.inspect(str) + (description ? " | " + description : "") }
-    , function() { return 'expected ' + this.inspect + ' to not end with ' + should.inspect(str) + (description ? " | " + description : "") }
+    , function() { return 'expected ' + this.inspect + ' to end with ' + i(str) + (description ? " | " + description : "") }
+    , function() { return 'expected ' + this.inspect + ' to not end with ' + i(str) + (description ? " | " + description : "") }
     , void 0
     , void 0
@@ -942,6 +944,6 @@
       this.assert(
           eql(cmp, obj)
-        , function(){ return 'expected ' + this.inspect + ' to include an object equal to ' + should.inspect(obj) + (description ? " | " + description : "") }
-        , function(){ return 'expected ' + this.inspect + ' to not include an object equal to ' + should.inspect(obj) + (description ? " | " + description : "") }
+        , function(){ return 'expected ' + this.inspect + ' to include an object equal to ' + i(obj) + (description ? " | " + description : "") }
+        , function(){ return 'expected ' + this.inspect + ' to not include an object equal to ' + i(obj) + (description ? " | " + description : "") }
         , void 0
         , void 0
@@ -950,6 +952,6 @@
       this.assert(
           ~this.obj.indexOf(obj)
-        , function(){ return 'expected ' + this.inspect + ' to include ' + should.inspect(obj) + (description ? " | " + description : "") }
-        , function(){ return 'expected ' + this.inspect + ' to not include ' + should.inspect(obj) + (description ? " | " + description : "") }
+        , function(){ return 'expected ' + this.inspect + ' to include ' + i(obj) + (description ? " | " + description : "") }
+        , function(){ return 'expected ' + this.inspect + ' to not include ' + i(obj) + (description ? " | " + description : "") }
         , void 0
         , void 0
@@ -970,6 +972,6 @@
     this.assert(
       this.obj.some(function(item) { return eql(obj, item); })
-      , function(){ return 'expected ' + this.inspect + ' to include an object equal to ' + should.inspect(obj) + (description ? " | " + description : "") }
-      , function(){ return 'expected ' + this.inspect + ' to not include an object equal to ' + should.inspect(obj) + (description ? " | " + description : "") }
+      , function(){ return 'expected ' + this.inspect + ' to include an object equal to ' + i(obj) + (description ? " | " + description : "") }
+      , function(){ return 'expected ' + this.inspect + ' to not include an object equal to ' + i(obj) + (description ? " | " + description : "") }
       , void 0
       , void 0
@@ -1010,10 +1012,10 @@
     if (len > 1) {
       keys = keys.map(function(key){
-        return should.inspect(key);
+        return i(key);
       });
       var last = keys.pop();
       str = keys.join(', ') + ', and ' + last;
     } else {
-      str = should.inspect(keys[0]);
+      str = i(keys[0]);
     }
 
@@ -1059,7 +1061,7 @@
     this.assert(
         code == status
-      , function(){ return 'expected response code of ' + code + ' ' + should.inspect(statusCodes[code])
-        + ', but got ' + status + ' ' + should.inspect(statusCodes[status]) }
-      , function(){ return 'expected to not respond with ' + code + ' ' + should.inspect(statusCodes[code]) });
+      , function(){ return 'expected response code of ' + code + ' ' + i(statusCodes[code])
+        + ', but got ' + status + ' ' + i(statusCodes[status]) }
+      , function(){ return 'expected to not respond with ' + code + ' ' + i(statusCodes[code]) });
 
     return this;
Index: /Dev/trunk/node_modules/underscore/package.json
===================================================================
--- /Dev/trunk/node_modules/underscore/package.json	(revision 515)
+++ /Dev/trunk/node_modules/underscore/package.json	(revision 516)
@@ -32,8 +32,4 @@
   },
   "_id": "underscore@1.4.4",
-  "_from": "underscore@1.4.4",
-  "dist": {
-    "shasum": "3e7ceb21f205bc19964685e1fdd52c8f77773674"
-  },
-  "_resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz"
+  "_from": "underscore@1.4.4"
 }
Index: /Dev/trunk/package.json
===================================================================
--- /Dev/trunk/package.json	(revision 515)
+++ /Dev/trunk/package.json	(revision 516)
@@ -4,21 +4,24 @@
   "description": "QED Full",
   "devDependencies": {
-    "grunt": "~0.4.0",
-    "grunt-contrib-copy": "~0.4.1",
-    "grunt-contrib-jshint": "~0.6.0",
-    "grunt-contrib-less": "~0.6.4",
+    "grunt": "^0.4.4",
+    "grunt-contrib-copy": "^0.4.1",
+    "grunt-contrib-jshint": "^0.6.5",
+    "grunt-contrib-less": "^0.6.5",
     "grunt-dojo": "~0.2.3",
-    "grunt-exec": "~0.4.1",
+    "grunt-exec": "^0.4.5",
     "grunt-htmlhint": "~0.4.0",
     "grunt-contrib-clean": "~0.5.0",
-    "grunt-contrib-coffee": "~0.7.0",
-    "underscore": "~1.4.4",
-    "grunt-coffeelint": "~0.0.6",
-    "grunt-banner": "~0.1.4",
+    "grunt-contrib-coffee": "^0.7.0",
+    "underscore": "^1.4.4",
+    "grunt-coffeelint": "0.0.8",
+    "grunt-banner": "^0.1.4",
     "grunt-amd-check": "~0.5.2",
-    "mocha": "~1.14.0",
-    "should": "~2.1.0",
-    "grunt-tv4": "^0.4.0",
-    "grunt-jsonlint": "^1.0.4"
+    "mocha": "^1.14.0",
+    "should": "^2.1.1",
+    "grunt-tv4": "~0.4.0",
+    "grunt-jsonlint": "~1.0.4",
+    "grunt-path-check": "~0.9.3",
+    "grunt-git-deploy": "~0.1.1",
+    "grunt-svninfo": "~0.1.4"
   },
   "dependencies": {}
Index: /Dev/trunk/src/server/config/couchdb-design-docs.js
===================================================================
--- /Dev/trunk/src/server/config/couchdb-design-docs.js	(revision 515)
+++ /Dev/trunk/src/server/config/couchdb-design-docs.js	(revision 516)
@@ -26,7 +26,7 @@
     },
 
-    "qed/_design/default": {
+    "qed/_design/protectPublished": {
         __configAction: "replace",
-        _id: "_design/default",
+        _id: "_design/protectPublished",
         language: "javascript",
         validate_doc_update: function(newDoc, oldDoc, userCtx, secObj) {
@@ -34,5 +34,11 @@
                 throw({forbidden:'Published documents cannot be modified.'});
             }
-        },
+        }
+    },
+
+    "qed/_design/default": {
+        __configAction: "replace",
+        _id: "_design/default",
+        language: "javascript",
         views: {
             by_type: {
Index: /Dev/trunk/src/server/config/couchdb-upgrade-design-docs.js
===================================================================
--- /Dev/trunk/src/server/config/couchdb-upgrade-design-docs.js	(revision 515)
+++ /Dev/trunk/src/server/config/couchdb-upgrade-design-docs.js	(revision 516)
@@ -5,6 +5,7 @@
     },
 
-    "qed/_design/default": {
-        __configAction: "replace"
+    "qed/_design/protectPublished": {
+        __configAction: "replace",
+        _id: "_design/protectPublished"
     }
 
