Upgrade vulcanize to 0.7.6.

BUG=452328
R=esprehn@chromium.org

Review URL: https://codereview.chromium.org/877193002
diff --git a/node_modules/vulcanize/CHANGELOG b/node_modules/vulcanize/CHANGELOG
index 7b4da84..b1b8d99 100644
--- a/node_modules/vulcanize/CHANGELOG
+++ b/node_modules/vulcanize/CHANGELOG
@@ -1,3 +1,5 @@
+### 0.7.5
+- Remove cssom, just use regexes
 ### 0.7.4
 - Workaround for cssom not liking '{{ }}' bindings in <style> tags (unsupported, use <core-style> instead)
 ### 0.7.3
diff --git a/node_modules/vulcanize/lib/constants.js b/node_modules/vulcanize/lib/constants.js
index 081dc79..8812df9 100644
--- a/node_modules/vulcanize/lib/constants.js
+++ b/node_modules/vulcanize/lib/constants.js
@@ -15,7 +15,7 @@
   EOL: require('os').EOL,
   ELEMENTS: 'polymer-element:not([assetpath])',
   ELEMENTS_NOSCRIPT: 'polymer-element[noscript]',
-  ABS_URL: /(^data:)|(^http[s]?:)|(^\/)|(^mailto:)|(^tel:)|(^sms:)/,
+  ABS_URL: /(^data:)|(^http[s]?:)|(^\/)|(^mailto:)|(^tel:)|(^sms:)|(^#)/,
   REMOTE_ABS_URL: /(^http[s]?\:)|(^\/\/)/,
   IMPORTS: 'link[rel="import"][href]',
   URL: /url\([^)]*\)/g,
diff --git a/node_modules/vulcanize/lib/vulcan.js b/node_modules/vulcanize/lib/vulcan.js
index 0d7e230..82c3969 100644
--- a/node_modules/vulcanize/lib/vulcan.js
+++ b/node_modules/vulcanize/lib/vulcan.js
@@ -10,7 +10,6 @@
 
 // jshint node: true
 
-var cssom = require('cssom');
 var fs = require('fs');
 var path = require('path');
 var uglify = require('uglify-js');
@@ -200,19 +199,13 @@
 }
 
 function compressCSS(content) {
-  var out;
-  try {
-    var ast = cssom.parse(content);
-    out = ast.toString();
-  } catch (e) {
-    if (options.verbose) {
-      console.log('Error parsing CSS:', e.toString());
-      console.log('Falling back to removing newlines only');
-    }
-    out = content;
-  } finally {
-    return out.replace(/[\r\n]/g, '');
-  }
+  // remove newlines
+  var out = content.replace(/[\r\n]/g, '');
+  // remove css comments (/* ... */)
+  out = out.replace(/\/\*(.+?)\*\//g, '');
+  // remove duplicate whitespace
+  out = out.replace(/\s{2,}/g, ' ');
+  return out;
 }
 
 function removeCommentsAndWhitespace($) {
diff --git a/node_modules/vulcanize/node_modules/cssom/.gitmodules b/node_modules/vulcanize/node_modules/cssom/.gitmodules
deleted file mode 100644
index 6357c00..0000000
--- a/node_modules/vulcanize/node_modules/cssom/.gitmodules
+++ /dev/null
@@ -1,6 +0,0 @@
-[submodule "spec/vendor/objectDiff"]
-	path = spec/vendor/objectDiff
-	url = git://github.com/NV/objectDiff.js.git
-[submodule "spec/vendor/jasmine-html-reporter"]
-	path = spec/vendor/jasmine-html-reporter
-	url = git://github.com/NV/jasmine-html-reporter.git
diff --git a/node_modules/vulcanize/node_modules/cssom/.npmignore b/node_modules/vulcanize/node_modules/cssom/.npmignore
deleted file mode 100644
index 9c8f462..0000000
--- a/node_modules/vulcanize/node_modules/cssom/.npmignore
+++ /dev/null
@@ -1,7 +0,0 @@
-docs/
-src/
-test/
-spec/
-Jakefile.js
-MIT-LICENSE.txt
-README.mdown
diff --git a/node_modules/vulcanize/node_modules/cssom/README.mdown b/node_modules/vulcanize/node_modules/cssom/README.mdown
deleted file mode 100644
index 31996f9..0000000
--- a/node_modules/vulcanize/node_modules/cssom/README.mdown
+++ /dev/null
@@ -1,34 +0,0 @@
-# CSSOM
-
-CSSOM.js is a CSS parser written in pure JavaScript. It also a partial implementation of [CSS Object Model](http://dev.w3.org/csswg/cssom/). 
-
-    CSSOM.parse("body {color: black}")
-    -> {
-      cssRules: [
-        {
-          selectorText: "body",
-          style: {
-            0: "color",
-            color: "black",
-            length: 1
-          }
-        }
-      ]
-    }
-
-
-## [Parser demo](http://nv.github.com/CSSOM/docs/parse.html)
-
-Works well in Google Chrome 6+, Safari 5+, Firefox 3.6+, Opera 10.63+.
-Doesn't work in IE < 9 because of unsupported getters/setters.
-
-To use CSSOM.js in the browser you might want to build a one-file version with [Jake](http://github.com/mde/node-jake):
-
-    ➤ jake
-    build/CSSOM.js is done
-
-To use it with Node.js:
-
-    npm install cssom
-
-## [Specs](http://nv.github.com/CSSOM/spec/)
diff --git a/node_modules/vulcanize/node_modules/cssom/lib/CSSFontFaceRule.js b/node_modules/vulcanize/node_modules/cssom/lib/CSSFontFaceRule.js
deleted file mode 100644
index b7a56cf..0000000
--- a/node_modules/vulcanize/node_modules/cssom/lib/CSSFontFaceRule.js
+++ /dev/null
@@ -1,34 +0,0 @@
-//.CommonJS
-var CSSOM = {
-	CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration,
-	CSSRule: require("./CSSRule").CSSRule
-};
-///CommonJS
-
-
-/**
- * @constructor
- * @see http://dev.w3.org/csswg/cssom/#css-font-face-rule
- */
-CSSOM.CSSFontFaceRule = function CSSFontFaceRule() {
-	CSSOM.CSSRule.call(this);
-	this.style = new CSSOM.CSSStyleDeclaration;
-	this.style.parentRule = this;
-};
-
-CSSOM.CSSFontFaceRule.prototype = new CSSOM.CSSRule;
-CSSOM.CSSFontFaceRule.prototype.constructor = CSSOM.CSSFontFaceRule;
-CSSOM.CSSFontFaceRule.prototype.type = 5;
-//FIXME
-//CSSOM.CSSFontFaceRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule;
-//CSSOM.CSSFontFaceRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule;
-
-// http://www.opensource.apple.com/source/WebCore/WebCore-955.66.1/css/WebKitCSSFontFaceRule.cpp
-CSSOM.CSSFontFaceRule.prototype.__defineGetter__("cssText", function() {
-	return "@font-face {" + this.style.cssText + "}";
-});
-
-
-//.CommonJS
-exports.CSSFontFaceRule = CSSOM.CSSFontFaceRule;
-///CommonJS
diff --git a/node_modules/vulcanize/node_modules/cssom/lib/CSSImportRule.js b/node_modules/vulcanize/node_modules/cssom/lib/CSSImportRule.js
deleted file mode 100644
index 3539b3e..0000000
--- a/node_modules/vulcanize/node_modules/cssom/lib/CSSImportRule.js
+++ /dev/null
@@ -1,131 +0,0 @@
-//.CommonJS
-var CSSOM = {
-	CSSRule: require("./CSSRule").CSSRule,
-	CSSStyleSheet: require("./CSSStyleSheet").CSSStyleSheet,
-	MediaList: require("./MediaList").MediaList
-};
-///CommonJS
-
-
-/**
- * @constructor
- * @see http://dev.w3.org/csswg/cssom/#cssimportrule
- * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSImportRule
- */
-CSSOM.CSSImportRule = function CSSImportRule() {
-	CSSOM.CSSRule.call(this);
-	this.href = "";
-	this.media = new CSSOM.MediaList;
-	this.styleSheet = new CSSOM.CSSStyleSheet;
-};
-
-CSSOM.CSSImportRule.prototype = new CSSOM.CSSRule;
-CSSOM.CSSImportRule.prototype.constructor = CSSOM.CSSImportRule;
-CSSOM.CSSImportRule.prototype.type = 3;
-CSSOM.CSSImportRule.prototype.__defineGetter__("cssText", function() {
-	var mediaText = this.media.mediaText;
-	return "@import url(" + this.href + ")" + (mediaText ? " " + mediaText : "") + ";";
-});
-
-CSSOM.CSSImportRule.prototype.__defineSetter__("cssText", function(cssText) {
-	var i = 0;
-
-	/**
-	 * @import url(partial.css) screen, handheld;
-	 *        ||               |
-	 *        after-import     media
-	 *         |
-	 *         url
-	 */
-	var state = '';
-
-	var buffer = '';
-	var index;
-	var mediaText = '';
-	for (var character; character = cssText.charAt(i); i++) {
-
-		switch (character) {
-			case ' ':
-			case '\t':
-			case '\r':
-			case '\n':
-			case '\f':
-				if (state === 'after-import') {
-					state = 'url';
-				} else {
-					buffer += character;
-				}
-				break;
-
-			case '@':
-				if (!state && cssText.indexOf('@import', i) === i) {
-					state = 'after-import';
-					i += 'import'.length;
-					buffer = '';
-				}
-				break;
-
-			case 'u':
-				if (state === 'url' && cssText.indexOf('url(', i) === i) {
-					index = cssText.indexOf(')', i + 1);
-					if (index === -1) {
-						throw i + ': ")" not found';
-					}
-					i += 'url('.length;
-					var url = cssText.slice(i, index);
-					if (url[0] === url[url.length - 1]) {
-						if (url[0] === '"' || url[0] === "'") {
-							url = url.slice(1, -1);
-						}
-					}
-					this.href = url;
-					i = index;
-					state = 'media';
-				}
-				break;
-
-			case '"':
-				if (state === 'url') {
-					index = cssText.indexOf('"', i + 1);
-					if (!index) {
-						throw i + ": '\"' not found";
-					}
-					this.href = cssText.slice(i + 1, index);
-					i = index;
-					state = 'media';
-				}
-				break;
-
-			case "'":
-				if (state === 'url') {
-					index = cssText.indexOf("'", i + 1);
-					if (!index) {
-						throw i + ': "\'" not found';
-					}
-					this.href = cssText.slice(i + 1, index);
-					i = index;
-					state = 'media';
-				}
-				break;
-
-			case ';':
-				if (state === 'media') {
-					if (buffer) {
-						this.media.mediaText = buffer.trim();
-					}
-				}
-				break;
-
-			default:
-				if (state === 'media') {
-					buffer += character;
-				}
-				break;
-		}
-	}
-});
-
-
-//.CommonJS
-exports.CSSImportRule = CSSOM.CSSImportRule;
-///CommonJS
diff --git a/node_modules/vulcanize/node_modules/cssom/lib/CSSKeyframeRule.js b/node_modules/vulcanize/node_modules/cssom/lib/CSSKeyframeRule.js
deleted file mode 100644
index 8238c6b..0000000
--- a/node_modules/vulcanize/node_modules/cssom/lib/CSSKeyframeRule.js
+++ /dev/null
@@ -1,35 +0,0 @@
-//.CommonJS
-var CSSOM = {
-	CSSRule: require("./CSSRule").CSSRule,
-	CSSStyleDeclaration: require('./CSSStyleDeclaration').CSSStyleDeclaration
-};
-///CommonJS
-
-
-/**
- * @constructor
- * @see http://www.w3.org/TR/css3-animations/#DOM-CSSKeyframeRule
- */
-CSSOM.CSSKeyframeRule = function CSSKeyframeRule() {
-	CSSOM.CSSRule.call(this);
-	this.keyText = '';
-	this.style = new CSSOM.CSSStyleDeclaration;
-	this.style.parentRule = this;
-};
-
-CSSOM.CSSKeyframeRule.prototype = new CSSOM.CSSRule;
-CSSOM.CSSKeyframeRule.prototype.constructor = CSSOM.CSSKeyframeRule;
-CSSOM.CSSKeyframeRule.prototype.type = 9;
-//FIXME
-//CSSOM.CSSKeyframeRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule;
-//CSSOM.CSSKeyframeRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule;
-
-// http://www.opensource.apple.com/source/WebCore/WebCore-955.66.1/css/WebKitCSSKeyframeRule.cpp
-CSSOM.CSSKeyframeRule.prototype.__defineGetter__("cssText", function() {
-	return this.keyText + " {" + this.style.cssText + "} ";
-});
-
-
-//.CommonJS
-exports.CSSKeyframeRule = CSSOM.CSSKeyframeRule;
-///CommonJS
diff --git a/node_modules/vulcanize/node_modules/cssom/lib/CSSKeyframesRule.js b/node_modules/vulcanize/node_modules/cssom/lib/CSSKeyframesRule.js
deleted file mode 100644
index 0ae70ba..0000000
--- a/node_modules/vulcanize/node_modules/cssom/lib/CSSKeyframesRule.js
+++ /dev/null
@@ -1,37 +0,0 @@
-//.CommonJS
-var CSSOM = {
-	CSSRule: require("./CSSRule").CSSRule
-};
-///CommonJS
-
-
-/**
- * @constructor
- * @see http://www.w3.org/TR/css3-animations/#DOM-CSSKeyframesRule
- */
-CSSOM.CSSKeyframesRule = function CSSKeyframesRule() {
-	CSSOM.CSSRule.call(this);
-	this.name = '';
-	this.cssRules = [];
-};
-
-CSSOM.CSSKeyframesRule.prototype = new CSSOM.CSSRule;
-CSSOM.CSSKeyframesRule.prototype.constructor = CSSOM.CSSKeyframesRule;
-CSSOM.CSSKeyframesRule.prototype.type = 8;
-//FIXME
-//CSSOM.CSSKeyframesRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule;
-//CSSOM.CSSKeyframesRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule;
-
-// http://www.opensource.apple.com/source/WebCore/WebCore-955.66.1/css/WebKitCSSKeyframesRule.cpp
-CSSOM.CSSKeyframesRule.prototype.__defineGetter__("cssText", function() {
-	var cssTexts = [];
-	for (var i=0, length=this.cssRules.length; i < length; i++) {
-		cssTexts.push("  " + this.cssRules[i].cssText);
-	}
-	return "@" + (this._vendorPrefix || '') + "keyframes " + this.name + " { \n" + cssTexts.join("\n") + "\n}";
-});
-
-
-//.CommonJS
-exports.CSSKeyframesRule = CSSOM.CSSKeyframesRule;
-///CommonJS
diff --git a/node_modules/vulcanize/node_modules/cssom/lib/CSSMediaRule.js b/node_modules/vulcanize/node_modules/cssom/lib/CSSMediaRule.js
deleted file mode 100644
index a6d15f8..0000000
--- a/node_modules/vulcanize/node_modules/cssom/lib/CSSMediaRule.js
+++ /dev/null
@@ -1,39 +0,0 @@
-//.CommonJS
-var CSSOM = {
-	CSSRule: require("./CSSRule").CSSRule,
-	MediaList: require("./MediaList").MediaList
-};
-///CommonJS
-
-
-/**
- * @constructor
- * @see http://dev.w3.org/csswg/cssom/#cssmediarule
- * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule
- */
-CSSOM.CSSMediaRule = function CSSMediaRule() {
-	CSSOM.CSSRule.call(this);
-	this.media = new CSSOM.MediaList;
-	this.cssRules = [];
-};
-
-CSSOM.CSSMediaRule.prototype = new CSSOM.CSSRule;
-CSSOM.CSSMediaRule.prototype.constructor = CSSOM.CSSMediaRule;
-CSSOM.CSSMediaRule.prototype.type = 4;
-//FIXME
-//CSSOM.CSSMediaRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule;
-//CSSOM.CSSMediaRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule;
-
-// http://opensource.apple.com/source/WebCore/WebCore-658.28/css/CSSMediaRule.cpp
-CSSOM.CSSMediaRule.prototype.__defineGetter__("cssText", function() {
-	var cssTexts = [];
-	for (var i=0, length=this.cssRules.length; i < length; i++) {
-		cssTexts.push(this.cssRules[i].cssText);
-	}
-	return "@media " + this.media.mediaText + " {" + cssTexts.join("") + "}";
-});
-
-
-//.CommonJS
-exports.CSSMediaRule = CSSOM.CSSMediaRule;
-///CommonJS
diff --git a/node_modules/vulcanize/node_modules/cssom/lib/CSSRule.js b/node_modules/vulcanize/node_modules/cssom/lib/CSSRule.js
deleted file mode 100644
index 4acff83..0000000
--- a/node_modules/vulcanize/node_modules/cssom/lib/CSSRule.js
+++ /dev/null
@@ -1,39 +0,0 @@
-//.CommonJS
-var CSSOM = {};
-///CommonJS
-
-
-/**
- * @constructor
- * @see http://dev.w3.org/csswg/cssom/#the-cssrule-interface
- * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule
- */
-CSSOM.CSSRule = function CSSRule() {
-	this.parentRule = null;
-	this.parentStyleSheet = null;
-};
-
-CSSOM.CSSRule.STYLE_RULE = 1;
-CSSOM.CSSRule.IMPORT_RULE = 3;
-CSSOM.CSSRule.MEDIA_RULE = 4;
-CSSOM.CSSRule.FONT_FACE_RULE = 5;
-CSSOM.CSSRule.PAGE_RULE = 6;
-CSSOM.CSSRule.WEBKIT_KEYFRAMES_RULE = 8;
-CSSOM.CSSRule.WEBKIT_KEYFRAME_RULE = 9;
-
-// Obsolete in CSSOM http://dev.w3.org/csswg/cssom/
-//CSSOM.CSSRule.UNKNOWN_RULE = 0;
-//CSSOM.CSSRule.CHARSET_RULE = 2;
-
-// Never implemented
-//CSSOM.CSSRule.VARIABLES_RULE = 7;
-
-CSSOM.CSSRule.prototype = {
-	constructor: CSSOM.CSSRule
-	//FIXME
-};
-
-
-//.CommonJS
-exports.CSSRule = CSSOM.CSSRule;
-///CommonJS
diff --git a/node_modules/vulcanize/node_modules/cssom/lib/CSSStyleDeclaration.js b/node_modules/vulcanize/node_modules/cssom/lib/CSSStyleDeclaration.js
deleted file mode 100644
index 365a1d3..0000000
--- a/node_modules/vulcanize/node_modules/cssom/lib/CSSStyleDeclaration.js
+++ /dev/null
@@ -1,148 +0,0 @@
-//.CommonJS
-var CSSOM = {};
-///CommonJS
-
-
-/**
- * @constructor
- * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration
- */
-CSSOM.CSSStyleDeclaration = function CSSStyleDeclaration(){
-	this.length = 0;
-	this.parentRule = null;
-
-	// NON-STANDARD
-	this._importants = {};
-};
-
-
-CSSOM.CSSStyleDeclaration.prototype = {
-
-	constructor: CSSOM.CSSStyleDeclaration,
-
-	/**
-	 *
-	 * @param {string} name
-	 * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-getPropertyValue
-	 * @return {string} the value of the property if it has been explicitly set for this declaration block.
-	 * Returns the empty string if the property has not been set.
-	 */
-	getPropertyValue: function(name) {
-		return this[name] || "";
-	},
-
-	/**
-	 *
-	 * @param {string} name
-	 * @param {string} value
-	 * @param {string} [priority=null] "important" or null
-	 * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-setProperty
-	 */
-	setProperty: function(name, value, priority) {
-		if (this[name]) {
-			// Property already exist. Overwrite it.
-			var index = Array.prototype.indexOf.call(this, name);
-			if (index < 0) {
-				this[this.length] = name;
-				this.length++;
-			}
-		} else {
-			// New property.
-			this[this.length] = name;
-			this.length++;
-		}
-		this[name] = value;
-		this._importants[name] = priority;
-	},
-
-	/**
-	 *
-	 * @param {string} name
-	 * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-removeProperty
-	 * @return {string} the value of the property if it has been explicitly set for this declaration block.
-	 * Returns the empty string if the property has not been set or the property name does not correspond to a known CSS property.
-	 */
-	removeProperty: function(name) {
-		if (!(name in this)) {
-			return "";
-		}
-		var index = Array.prototype.indexOf.call(this, name);
-		if (index < 0) {
-			return "";
-		}
-		var prevValue = this[name];
-		this[name] = "";
-
-		// That's what WebKit and Opera do
-		Array.prototype.splice.call(this, index, 1);
-
-		// That's what Firefox does
-		//this[index] = ""
-
-		return prevValue;
-	},
-
-	getPropertyCSSValue: function() {
-		//FIXME
-	},
-
-	/**
-	 *
-	 * @param {String} name
-	 */
-	getPropertyPriority: function(name) {
-		return this._importants[name] || "";
-	},
-
-
-	/**
-	 *   element.style.overflow = "auto"
-	 *   element.style.getPropertyShorthand("overflow-x")
-	 *   -> "overflow"
-	 */
-	getPropertyShorthand: function() {
-		//FIXME
-	},
-
-	isPropertyImplicit: function() {
-		//FIXME
-	},
-
-	// Doesn't work in IE < 9
-	get cssText(){
-		var properties = [];
-		for (var i=0, length=this.length; i < length; ++i) {
-			var name = this[i];
-			var value = this.getPropertyValue(name);
-			var priority = this.getPropertyPriority(name);
-			if (priority) {
-				priority = " !" + priority;
-			}
-			properties[i] = name + ": " + value + priority + ";";
-		}
-		return properties.join(" ");
-	},
-
-	set cssText(cssText){
-		var i, name;
-		for (i = this.length; i--;) {
-			name = this[i];
-			this[name] = "";
-		}
-		Array.prototype.splice.call(this, 0, this.length);
-		this._importants = {};
-
-		var dummyRule = CSSOM.parse('#bogus{' + cssText + '}').cssRules[0].style;
-		var length = dummyRule.length;
-		for (i = 0; i < length; ++i) {
-			name = dummyRule[i];
-			this.setProperty(dummyRule[i], dummyRule.getPropertyValue(name), dummyRule.getPropertyPriority(name));
-		}
-	}
-};
-
-
-//.CommonJS
-exports.CSSStyleDeclaration = CSSOM.CSSStyleDeclaration;
-CSSOM.parse = require('./parse').parse; // Cannot be included sooner due to the mutual dependency between parse.js and CSSStyleDeclaration.js
-///CommonJS
diff --git a/node_modules/vulcanize/node_modules/cssom/lib/CSSStyleRule.js b/node_modules/vulcanize/node_modules/cssom/lib/CSSStyleRule.js
deleted file mode 100644
index 4224397..0000000
--- a/node_modules/vulcanize/node_modules/cssom/lib/CSSStyleRule.js
+++ /dev/null
@@ -1,189 +0,0 @@
-//.CommonJS
-var CSSOM = {
-	CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration,
-	CSSRule: require("./CSSRule").CSSRule
-};
-///CommonJS
-
-
-/**
- * @constructor
- * @see http://dev.w3.org/csswg/cssom/#cssstylerule
- * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleRule
- */
-CSSOM.CSSStyleRule = function CSSStyleRule() {
-	CSSOM.CSSRule.call(this);
-	this.selectorText = "";
-	this.style = new CSSOM.CSSStyleDeclaration;
-	this.style.parentRule = this;
-};
-
-CSSOM.CSSStyleRule.prototype = new CSSOM.CSSRule;
-CSSOM.CSSStyleRule.prototype.constructor = CSSOM.CSSStyleRule;
-CSSOM.CSSStyleRule.prototype.type = 1;
-
-CSSOM.CSSStyleRule.prototype.__defineGetter__("cssText", function() {
-	var text;
-	if (this.selectorText) {
-		text = this.selectorText + " {" + this.style.cssText + "}";
-	} else {
-		text = "";
-	}
-	return text;
-});
-
-CSSOM.CSSStyleRule.prototype.__defineSetter__("cssText", function(cssText) {
-	var rule = CSSOM.CSSStyleRule.parse(cssText);
-	this.style = rule.style;
-	this.selectorText = rule.selectorText;
-});
-
-
-/**
- * NON-STANDARD
- * lightweight version of parse.js.
- * @param {string} ruleText
- * @return CSSStyleRule
- */
-CSSOM.CSSStyleRule.parse = function(ruleText) {
-	var i = 0;
-	var state = "selector";
-	var index;
-	var j = i;
-	var buffer = "";
-
-	var SIGNIFICANT_WHITESPACE = {
-		"selector": true,
-		"value": true
-	};
-
-	var styleRule = new CSSOM.CSSStyleRule;
-	var selector, name, value, priority="";
-
-	for (var character; character = ruleText.charAt(i); i++) {
-
-		switch (character) {
-
-		case " ":
-		case "\t":
-		case "\r":
-		case "\n":
-		case "\f":
-			if (SIGNIFICANT_WHITESPACE[state]) {
-				// Squash 2 or more white-spaces in the row into 1
-				switch (ruleText.charAt(i - 1)) {
-					case " ":
-					case "\t":
-					case "\r":
-					case "\n":
-					case "\f":
-						break;
-					default:
-						buffer += " ";
-						break;
-				}
-			}
-			break;
-
-		// String
-		case '"':
-			j = i + 1;
-			index = ruleText.indexOf('"', j) + 1;
-			if (!index) {
-				throw '" is missing';
-			}
-			buffer += ruleText.slice(i, index);
-			i = index - 1;
-			break;
-
-		case "'":
-			j = i + 1;
-			index = ruleText.indexOf("'", j) + 1;
-			if (!index) {
-				throw "' is missing";
-			}
-			buffer += ruleText.slice(i, index);
-			i = index - 1;
-			break;
-
-		// Comment
-		case "/":
-			if (ruleText.charAt(i + 1) === "*") {
-				i += 2;
-				index = ruleText.indexOf("*/", i);
-				if (index === -1) {
-					throw new SyntaxError("Missing */");
-				} else {
-					i = index + 1;
-				}
-			} else {
-				buffer += character;
-			}
-			break;
-
-		case "{":
-			if (state === "selector") {
-				styleRule.selectorText = buffer.trim();
-				buffer = "";
-				state = "name";
-			}
-			break;
-
-		case ":":
-			if (state === "name") {
-				name = buffer.trim();
-				buffer = "";
-				state = "value";
-			} else {
-				buffer += character;
-			}
-			break;
-
-		case "!":
-			if (state === "value" && ruleText.indexOf("!important", i) === i) {
-				priority = "important";
-				i += "important".length;
-			} else {
-				buffer += character;
-			}
-			break;
-
-		case ";":
-			if (state === "value") {
-				styleRule.style.setProperty(name, buffer.trim(), priority);
-				priority = "";
-				buffer = "";
-				state = "name";
-			} else {
-				buffer += character;
-			}
-			break;
-
-		case "}":
-			if (state === "value") {
-				styleRule.style.setProperty(name, buffer.trim(), priority);
-				priority = "";
-				buffer = "";
-			} else if (state === "name") {
-				break;
-			} else {
-				buffer += character;
-			}
-			state = "selector";
-			break;
-
-		default:
-			buffer += character;
-			break;
-
-		}
-	}
-
-	return styleRule;
-
-};
-
-
-//.CommonJS
-exports.CSSStyleRule = CSSOM.CSSStyleRule;
-///CommonJS
diff --git a/node_modules/vulcanize/node_modules/cssom/lib/CSSStyleSheet.js b/node_modules/vulcanize/node_modules/cssom/lib/CSSStyleSheet.js
deleted file mode 100644
index 3ec733f..0000000
--- a/node_modules/vulcanize/node_modules/cssom/lib/CSSStyleSheet.js
+++ /dev/null
@@ -1,87 +0,0 @@
-//.CommonJS
-var CSSOM = {
-	StyleSheet: require("./StyleSheet").StyleSheet,
-	CSSStyleRule: require("./CSSStyleRule").CSSStyleRule
-};
-///CommonJS
-
-
-/**
- * @constructor
- * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet
- */
-CSSOM.CSSStyleSheet = function CSSStyleSheet() {
-	CSSOM.StyleSheet.call(this);
-	this.cssRules = [];
-};
-
-
-CSSOM.CSSStyleSheet.prototype = new CSSOM.StyleSheet;
-CSSOM.CSSStyleSheet.prototype.constructor = CSSOM.CSSStyleSheet;
-
-
-/**
- * Used to insert a new rule into the style sheet. The new rule now becomes part of the cascade.
- *
- *   sheet = new Sheet("body {margin: 0}")
- *   sheet.toString()
- *   -> "body{margin:0;}"
- *   sheet.insertRule("img {border: none}", 0)
- *   -> 0
- *   sheet.toString()
- *   -> "img{border:none;}body{margin:0;}"
- *
- * @param {string} rule
- * @param {number} index
- * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet-insertRule
- * @return {number} The index within the style sheet's rule collection of the newly inserted rule.
- */
-CSSOM.CSSStyleSheet.prototype.insertRule = function(rule, index) {
-	if (index < 0 || index > this.cssRules.length) {
-		throw new RangeError("INDEX_SIZE_ERR");
-	}
-	var cssRule = CSSOM.parse(rule).cssRules[0];
-	this.cssRules.splice(index, 0, cssRule);
-	return index;
-};
-
-
-/**
- * Used to delete a rule from the style sheet.
- *
- *   sheet = new Sheet("img{border:none} body{margin:0}")
- *   sheet.toString()
- *   -> "img{border:none;}body{margin:0;}"
- *   sheet.deleteRule(0)
- *   sheet.toString()
- *   -> "body{margin:0;}"
- *
- * @param {number} index within the style sheet's rule list of the rule to remove.
- * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet-deleteRule
- */
-CSSOM.CSSStyleSheet.prototype.deleteRule = function(index) {
-	if (index < 0 || index >= this.cssRules.length) {
-		throw new RangeError("INDEX_SIZE_ERR");
-	}
-	this.cssRules.splice(index, 1);
-};
-
-
-/**
- * NON-STANDARD
- * @return {string} serialize stylesheet
- */
-CSSOM.CSSStyleSheet.prototype.toString = function() {
-	var result = "";
-	var rules = this.cssRules;
-	for (var i=0; i<rules.length; i++) {
-		result += rules[i].cssText + "\n";
-	}
-	return result;
-};
-
-
-//.CommonJS
-exports.CSSStyleSheet = CSSOM.CSSStyleSheet;
-CSSOM.parse = require('./parse').parse; // Cannot be included sooner due to the mutual dependency between parse.js and CSSStyleSheet.js
-///CommonJS
diff --git a/node_modules/vulcanize/node_modules/cssom/lib/MediaList.js b/node_modules/vulcanize/node_modules/cssom/lib/MediaList.js
deleted file mode 100644
index 9ce18ab..0000000
--- a/node_modules/vulcanize/node_modules/cssom/lib/MediaList.js
+++ /dev/null
@@ -1,61 +0,0 @@
-//.CommonJS
-var CSSOM = {};
-///CommonJS
-
-
-/**
- * @constructor
- * @see http://dev.w3.org/csswg/cssom/#the-medialist-interface
- */
-CSSOM.MediaList = function MediaList(){
-	this.length = 0;
-};
-
-CSSOM.MediaList.prototype = {
-
-	constructor: CSSOM.MediaList,
-
-	/**
-	 * @return {string}
-	 */
-	get mediaText() {
-		return Array.prototype.join.call(this, ", ");
-	},
-
-	/**
-	 * @param {string} value
-	 */
-	set mediaText(value) {
-		var values = value.split(",");
-		var length = this.length = values.length;
-		for (var i=0; i<length; i++) {
-			this[i] = values[i].trim();
-		}
-	},
-
-	/**
-	 * @param {string} medium
-	 */
-	appendMedium: function(medium) {
-		if (Array.prototype.indexOf.call(this, medium) === -1) {
-			this[this.length] = medium;
-			this.length++;
-		}
-	},
-
-	/**
-	 * @param {string} medium
-	 */
-	deleteMedium: function(medium) {
-		var index = Array.prototype.indexOf.call(this, medium);
-		if (index !== -1) {
-			Array.prototype.splice.call(this, index, 1);
-		}
-	}
-
-};
-
-
-//.CommonJS
-exports.MediaList = CSSOM.MediaList;
-///CommonJS
diff --git a/node_modules/vulcanize/node_modules/cssom/lib/StyleSheet.js b/node_modules/vulcanize/node_modules/cssom/lib/StyleSheet.js
deleted file mode 100644
index cfe69b5..0000000
--- a/node_modules/vulcanize/node_modules/cssom/lib/StyleSheet.js
+++ /dev/null
@@ -1,17 +0,0 @@
-//.CommonJS
-var CSSOM = {};
-///CommonJS
-
-
-/**
- * @constructor
- * @see http://dev.w3.org/csswg/cssom/#the-stylesheet-interface
- */
-CSSOM.StyleSheet = function StyleSheet() {
-	this.parentStyleSheet = null;
-};
-
-
-//.CommonJS
-exports.StyleSheet = CSSOM.StyleSheet;
-///CommonJS
diff --git a/node_modules/vulcanize/node_modules/cssom/lib/clone.js b/node_modules/vulcanize/node_modules/cssom/lib/clone.js
deleted file mode 100644
index 1d81f10..0000000
--- a/node_modules/vulcanize/node_modules/cssom/lib/clone.js
+++ /dev/null
@@ -1,76 +0,0 @@
-//.CommonJS
-var CSSOM = {
-	CSSStyleSheet: require("./CSSStyleSheet").CSSStyleSheet,
-	CSSStyleRule: require("./CSSStyleRule").CSSStyleRule,
-	CSSMediaRule: require("./CSSMediaRule").CSSMediaRule,
-	CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration,
-	CSSKeyframeRule: require('./CSSKeyframeRule').CSSKeyframeRule,
-	CSSKeyframesRule: require('./CSSKeyframesRule').CSSKeyframesRule
-};
-///CommonJS
-
-
-/**
- * Produces a deep copy of stylesheet — the instance variables of stylesheet are copied recursively.
- * @param {CSSStyleSheet|CSSOM.CSSStyleSheet} stylesheet
- * @nosideeffects
- * @return {CSSOM.CSSStyleSheet}
- */
-CSSOM.clone = function clone(stylesheet) {
-
-	var cloned = new CSSOM.CSSStyleSheet;
-
-	var rules = stylesheet.cssRules;
-	if (!rules) {
-		return cloned;
-	}
-
-	var RULE_TYPES = {
-		1: CSSOM.CSSStyleRule,
-		4: CSSOM.CSSMediaRule,
-		//3: CSSOM.CSSImportRule,
-		//5: CSSOM.CSSFontFaceRule,
-		//6: CSSOM.CSSPageRule,
-		8: CSSOM.CSSKeyframesRule,
-		9: CSSOM.CSSKeyframeRule
-	};
-
-	for (var i=0, rulesLength=rules.length; i < rulesLength; i++) {
-		var rule = rules[i];
-		var ruleClone = cloned.cssRules[i] = new RULE_TYPES[rule.type];
-
-		var style = rule.style;
-		if (style) {
-			var styleClone = ruleClone.style = new CSSOM.CSSStyleDeclaration;
-			for (var j=0, styleLength=style.length; j < styleLength; j++) {
-				var name = styleClone[j] = style[j];
-				styleClone[name] = style[name];
-				styleClone._importants[name] = style.getPropertyPriority(name);
-			}
-			styleClone.length = style.length;
-		}
-
-		if (rule.hasOwnProperty('keyText')) {
-			ruleClone.keyText = rule.keyText;
-		}
-
-		if (rule.hasOwnProperty('selectorText')) {
-			ruleClone.selectorText = rule.selectorText;
-		}
-
-		if (rule.hasOwnProperty('mediaText')) {
-			ruleClone.mediaText = rule.mediaText;
-		}
-
-		if (rule.hasOwnProperty('cssRules')) {
-			ruleClone.cssRules = clone(rule).cssRules;
-		}
-	}
-
-	return cloned;
-
-};
-
-//.CommonJS
-exports.clone = CSSOM.clone;
-///CommonJS
diff --git a/node_modules/vulcanize/node_modules/cssom/lib/index.js b/node_modules/vulcanize/node_modules/cssom/lib/index.js
deleted file mode 100644
index bc5692e..0000000
--- a/node_modules/vulcanize/node_modules/cssom/lib/index.js
+++ /dev/null
@@ -1,15 +0,0 @@
-'use strict';
-
-exports.CSSStyleDeclaration = require('./CSSStyleDeclaration').CSSStyleDeclaration;
-exports.CSSRule = require('./CSSRule').CSSRule;
-exports.CSSStyleRule = require('./CSSStyleRule').CSSStyleRule;
-exports.MediaList = require('./MediaList').MediaList;
-exports.CSSMediaRule = require('./CSSMediaRule').CSSMediaRule;
-exports.CSSImportRule = require('./CSSImportRule').CSSImportRule;
-exports.CSSFontFaceRule = require('./CSSFontFaceRule').CSSFontFaceRule;
-exports.StyleSheet = require('./StyleSheet').StyleSheet;
-exports.CSSStyleSheet = require('./CSSStyleSheet').CSSStyleSheet;
-exports.CSSKeyframesRule = require('./CSSKeyframesRule').CSSKeyframesRule;
-exports.CSSKeyframeRule = require('./CSSKeyframeRule').CSSKeyframeRule;
-exports.parse = require('./parse').parse;
-exports.clone = require('./clone').clone;
diff --git a/node_modules/vulcanize/node_modules/cssom/lib/parse.js b/node_modules/vulcanize/node_modules/cssom/lib/parse.js
deleted file mode 100644
index 223017b..0000000
--- a/node_modules/vulcanize/node_modules/cssom/lib/parse.js
+++ /dev/null
@@ -1,338 +0,0 @@
-//.CommonJS
-var CSSOM = {};
-///CommonJS
-
-
-/**
- * @param {string} token
- */
-CSSOM.parse = function parse(token) {
-
-	var i = 0;
-
-	/**
-	  "before-selector" or
-	  "selector" or
-	  "atRule" or
-	  "atBlock" or
-	  "before-name" or
-	  "name" or
-	  "before-value" or
-	  "value"
-	*/
-	var state = "before-selector";
-
-	var index;
-	var buffer = "";
-
-	var SIGNIFICANT_WHITESPACE = {
-		"selector": true,
-		"value": true,
-		"atRule": true,
-		"importRule-begin": true,
-		"importRule": true,
-		"atBlock": true
-	};
-
-	var styleSheet = new CSSOM.CSSStyleSheet;
-
-	// @type CSSStyleSheet|CSSMediaRule|CSSFontFaceRule|CSSKeyframesRule
-	var currentScope = styleSheet;
-
-	// @type CSSMediaRule|CSSKeyframesRule
-	var parentRule;
-
-	var selector, name, value, priority="", styleRule, mediaRule, importRule, fontFaceRule, keyframesRule, keyframeRule;
-
-	var atKeyframesRegExp = /@(-(?:\w+-)+)?keyframes/g;
-
-	var parseError = function(message) {
-		var lines = token.substring(0, i).split('\n');
-		var lineCount = lines.length;
-		var charCount = lines.pop().length + 1;
-		var error = new Error(message + ' (line ' + lineCount + ', char ' + charCount + ')');
-		error.line = lineCount;
-		error.char = charCount;
-		error.styleSheet = styleSheet;
-		throw error;
-	};
-
-	for (var character; character = token.charAt(i); i++) {
-
-		switch (character) {
-
-		case " ":
-		case "\t":
-		case "\r":
-		case "\n":
-		case "\f":
-			if (SIGNIFICANT_WHITESPACE[state]) {
-				buffer += character;
-			}
-			break;
-
-		// String
-		case '"':
-			index = token.indexOf('"', i + 1) + 1;
-			if (!index) {
-				parseError('Unmatched "');
-			}
-			buffer += token.slice(i, index);
-			i = index - 1;
-			switch (state) {
-				case 'before-value':
-					state = 'value';
-					break;
-				case 'importRule-begin':
-					state = 'importRule';
-					break;
-			}
-			break;
-
-		case "'":
-			index = token.indexOf("'", i + 1) + 1;
-			if (!index) {
-				parseError("Unmatched '");
-			}
-			buffer += token.slice(i, index);
-			i = index - 1;
-			switch (state) {
-				case 'before-value':
-					state = 'value';
-					break;
-				case 'importRule-begin':
-					state = 'importRule';
-					break;
-			}
-			break;
-
-		// Comment
-		case "/":
-			if (token.charAt(i + 1) === "*") {
-				i += 2;
-				index = token.indexOf("*/", i);
-				if (index === -1) {
-					parseError("Missing */");
-				} else {
-					i = index + 1;
-				}
-			} else {
-				buffer += character;
-			}
-			if (state === "importRule-begin") {
-				buffer += " ";
-				state = "importRule";
-			}
-			break;
-
-		// At-rule
-		case "@":
-			if (token.indexOf("@media", i) === i) {
-				state = "atBlock";
-				mediaRule = new CSSOM.CSSMediaRule;
-				mediaRule.__starts = i;
-				i += "media".length;
-				buffer = "";
-				break;
-			} else if (token.indexOf("@import", i) === i) {
-				state = "importRule-begin";
-				i += "import".length;
-				buffer += "@import";
-				break;
-			} else if (token.indexOf("@font-face", i) === i) {
-				state = "fontFaceRule-begin";
-				i += "font-face".length;
-				fontFaceRule = new CSSOM.CSSFontFaceRule;
-				fontFaceRule.__starts = i;
-				buffer = "";
-				break;
-			} else {
-				atKeyframesRegExp.lastIndex = i;
-				var matchKeyframes = atKeyframesRegExp.exec(token);
-				if (matchKeyframes && matchKeyframes.index === i) {
-					state = "keyframesRule-begin";
-					keyframesRule = new CSSOM.CSSKeyframesRule;
-					keyframesRule.__starts = i;
-					keyframesRule._vendorPrefix = matchKeyframes[1]; // Will come out as undefined if no prefix was found
-					i += matchKeyframes[0].length - 1;
-					buffer = "";
-					break;
-				} else if (state == "selector") {
-					state = "atRule";
-				}
-			}
-			buffer += character;
-			break;
-
-		case "{":
-			if (state === "selector" || state === "atRule") {
-				styleRule.selectorText = buffer.trim();
-				styleRule.style.__starts = i;
-				buffer = "";
-				state = "before-name";
-			} else if (state === "atBlock") {
-				mediaRule.media.mediaText = buffer.trim();
-				currentScope = parentRule = mediaRule;
-				mediaRule.parentStyleSheet = styleSheet;
-				buffer = "";
-				state = "before-selector";
-			} else if (state === "fontFaceRule-begin") {
-				if (parentRule) {
-					fontFaceRule.parentRule = parentRule;
-				}
-				fontFaceRule.parentStyleSheet = styleSheet;
-				styleRule = fontFaceRule;
-				buffer = "";
-				state = "before-name";
-			} else if (state === "keyframesRule-begin") {
-				keyframesRule.name = buffer.trim();
-				if (parentRule) {
-					keyframesRule.parentRule = parentRule;
-				}
-				keyframesRule.parentStyleSheet = styleSheet;
-				currentScope = parentRule = keyframesRule;
-				buffer = "";
-				state = "keyframeRule-begin";
-			} else if (state === "keyframeRule-begin") {
-				styleRule = new CSSOM.CSSKeyframeRule;
-				styleRule.keyText = buffer.trim();
-				styleRule.__starts = i;
-				buffer = "";
-				state = "before-name";
-			}
-			break;
-
-		case ":":
-			if (state === "name") {
-				name = buffer.trim();
-				buffer = "";
-				state = "before-value";
-			} else {
-				buffer += character;
-			}
-			break;
-
-		case '(':
-			if (state === 'value') {
-				index = token.indexOf(')', i + 1);
-				if (index === -1) {
-					parseError('Unmatched "("');
-				}
-				buffer += token.slice(i, index + 1);
-				i = index;
-			} else {
-				buffer += character;
-			}
-			break;
-
-		case "!":
-			if (state === "value" && token.indexOf("!important", i) === i) {
-				priority = "important";
-				i += "important".length;
-			} else {
-				buffer += character;
-			}
-			break;
-
-		case ";":
-			switch (state) {
-				case "value":
-					styleRule.style.setProperty(name, buffer.trim(), priority);
-					priority = "";
-					buffer = "";
-					state = "before-name";
-					break;
-				case "atRule":
-					buffer = "";
-					state = "before-selector";
-					break;
-				case "importRule":
-					importRule = new CSSOM.CSSImportRule;
-					importRule.parentStyleSheet = importRule.styleSheet.parentStyleSheet = styleSheet;
-					importRule.cssText = buffer + character;
-					styleSheet.cssRules.push(importRule);
-					buffer = "";
-					state = "before-selector";
-					break;
-				default:
-					buffer += character;
-					break;
-			}
-			break;
-
-		case "}":
-			switch (state) {
-				case "value":
-					styleRule.style.setProperty(name, buffer.trim(), priority);
-					priority = "";
-				case "before-name":
-				case "name":
-					styleRule.__ends = i + 1;
-					if (parentRule) {
-						styleRule.parentRule = parentRule;
-					}
-					styleRule.parentStyleSheet = styleSheet;
-					currentScope.cssRules.push(styleRule);
-					buffer = "";
-					if (currentScope.constructor === CSSOM.CSSKeyframesRule) {
-						state = "keyframeRule-begin";
-					} else {
-						state = "before-selector";
-					}
-					break;
-				case "keyframeRule-begin":
-				case "before-selector":
-				case "selector":
-					// End of media rule.
-					if (!parentRule) {
-						parseError("Unexpected }");
-					}
-					currentScope.__ends = i + 1;
-					// Nesting rules aren't supported yet
-					styleSheet.cssRules.push(currentScope);
-					currentScope = styleSheet;
-					parentRule = null;
-					buffer = "";
-					state = "before-selector";
-					break;
-			}
-			break;
-
-		default:
-			switch (state) {
-				case "before-selector":
-					state = "selector";
-					styleRule = new CSSOM.CSSStyleRule;
-					styleRule.__starts = i;
-					break;
-				case "before-name":
-					state = "name";
-					break;
-				case "before-value":
-					state = "value";
-					break;
-				case "importRule-begin":
-					state = "importRule";
-					break;
-			}
-			buffer += character;
-			break;
-		}
-	}
-
-	return styleSheet;
-};
-
-
-//.CommonJS
-exports.parse = CSSOM.parse;
-// The following modules cannot be included sooner due to the mutual dependency with parse.js
-CSSOM.CSSStyleSheet = require("./CSSStyleSheet").CSSStyleSheet;
-CSSOM.CSSStyleRule = require("./CSSStyleRule").CSSStyleRule;
-CSSOM.CSSImportRule = require("./CSSImportRule").CSSImportRule;
-CSSOM.CSSMediaRule = require("./CSSMediaRule").CSSMediaRule;
-CSSOM.CSSFontFaceRule = require("./CSSFontFaceRule").CSSFontFaceRule;
-CSSOM.CSSStyleDeclaration = require('./CSSStyleDeclaration').CSSStyleDeclaration;
-CSSOM.CSSKeyframeRule = require('./CSSKeyframeRule').CSSKeyframeRule;
-CSSOM.CSSKeyframesRule = require('./CSSKeyframesRule').CSSKeyframesRule;
-///CommonJS
diff --git a/node_modules/vulcanize/node_modules/cssom/package.json b/node_modules/vulcanize/node_modules/cssom/package.json
deleted file mode 100644
index dceb8e0..0000000
--- a/node_modules/vulcanize/node_modules/cssom/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "name": "cssom",
-  "description": "CSS Object Model implementation and CSS parser",
-  "keywords": [
-    "CSS",
-    "CSSOM",
-    "parser",
-    "styleSheet"
-  ],
-  "version": "0.2.5",
-  "homepage": "https://github.com/NV/CSSOM",
-  "author": {
-    "name": "Nikita Vasilyev",
-    "email": "me@elv1s.ru"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/NV/CSSOM.git"
-  },
-  "bugs": {
-    "url": "https://github.com/NV/CSSOM/issues"
-  },
-  "directories": {
-    "lib": "./lib"
-  },
-  "main": "./lib/index.js",
-  "engines": {
-    "node": ">=0.2.0"
-  },
-  "devDependencies": {
-    "jake": "0.2.x"
-  },
-  "licenses": [
-    {
-      "type": "MIT",
-      "url": "http://creativecommons.org/licenses/MIT/"
-    }
-  ],
-  "scripts": {
-    "prepublish": "jake lib/index.js"
-  },
-  "readme": "# CSSOM\n\nCSSOM.js is a CSS parser written in pure JavaScript. It also a partial implementation of [CSS Object Model](http://dev.w3.org/csswg/cssom/). \n\n    CSSOM.parse(\"body {color: black}\")\n    -> {\n      cssRules: [\n        {\n          selectorText: \"body\",\n          style: {\n            0: \"color\",\n            color: \"black\",\n            length: 1\n          }\n        }\n      ]\n    }\n\n\n## [Parser demo](http://nv.github.com/CSSOM/docs/parse.html)\n\nWorks well in Google Chrome 6+, Safari 5+, Firefox 3.6+, Opera 10.63+.\nDoesn't work in IE < 9 because of unsupported getters/setters.\n\nTo use CSSOM.js in the browser you might want to build a one-file version with [Jake](http://github.com/mde/node-jake):\n\n    ➤ jake\n    build/CSSOM.js is done\n\nTo use it with Node.js:\n\n    npm install cssom\n\n## [Specs](http://nv.github.com/CSSOM/spec/)\n",
-  "readmeFilename": "README.mdown",
-  "_id": "cssom@0.2.5",
-  "_from": "cssom@^0.2.3"
-}
diff --git a/node_modules/vulcanize/node_modules/uglify-js/node_modules/source-map/package.json b/node_modules/vulcanize/node_modules/uglify-js/node_modules/source-map/package.json
index 9d51f22..44e493d 100644
--- a/node_modules/vulcanize/node_modules/uglify-js/node_modules/source-map/package.json
+++ b/node_modules/vulcanize/node_modules/uglify-js/node_modules/source-map/package.json
@@ -126,5 +126,9 @@
     "url": "https://github.com/mozilla/source-map/issues"
   },
   "_id": "source-map@0.1.34",
-  "_from": "source-map@0.1.34"
+  "dist": {
+    "shasum": "70574b9fd562a046c13fb38cbd503100b03a895e"
+  },
+  "_from": "source-map@0.1.34",
+  "_resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz"
 }
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/package.json b/node_modules/vulcanize/node_modules/update-notifier/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/package.json
index a7e23fb..c9edefc 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/package.json
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/package.json
@@ -58,5 +58,5 @@
   },
   "homepage": "https://github.com/sindresorhus/ansi-regex",
   "_id": "ansi-regex@0.2.1",
-  "_from": "ansi-regex@^0.2.0"
+  "_from": "ansi-regex@^0.2.1"
 }
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/package.json b/node_modules/vulcanize/node_modules/update-notifier/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/package.json
index a7e23fb..c9edefc 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/package.json
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/package.json
@@ -58,5 +58,5 @@
   },
   "homepage": "https://github.com/sindresorhus/ansi-regex",
   "_id": "ansi-regex@0.2.1",
-  "_from": "ansi-regex@^0.2.0"
+  "_from": "ansi-regex@^0.2.1"
 }
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/configstore.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/configstore.js
deleted file mode 100644
index e43d5a9..0000000
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/configstore.js
+++ /dev/null
@@ -1,100 +0,0 @@
-'use strict';
-var path = require('path');
-var os = require('os');
-var fs = require('graceful-fs');
-var osenv = require('osenv');
-var assign = require('object-assign');
-var mkdirp = require('mkdirp');
-var yaml = require('js-yaml');
-var uuid = require('uuid');
-var getTempDir = os.tmpdir || os.tmpDir; //support node 0.8
-
-var user = (osenv.user() || uuid.v4()).replace(/\\/g, '');
-var tmpDir = path.join(getTempDir(), user);
-var configDir = process.env.XDG_CONFIG_HOME || path.join(osenv.home() || tmpDir, '.config');
-var permissionError = 'You don\'t have access to this file.';
-var defaultPathMode = parseInt('0700', 8);
-var writeFileOptions = { mode: parseInt('0600', 8) };
-
-
-if (/^v0\.8\./.test(process.version)) {
-	writeFileOptions = undefined;
-}
-
-function Configstore(id, defaults) {
-	this.path = path.join(configDir, 'configstore', id + '.yml');
-	this.all = assign({}, defaults || {}, this.all || {});
-}
-
-Configstore.prototype = Object.create(Object.prototype, {
-	all: {
-		get: function () {
-			try {
-				return yaml.safeLoad(fs.readFileSync(this.path, 'utf8'), {
-					filename: this.path,
-					schema: yaml.JSON_SCHEMA
-				});
-			} catch (err) {
-				// create dir if it doesn't exist
-				if (err.code === 'ENOENT') {
-					mkdirp.sync(path.dirname(this.path), defaultPathMode);
-					return {};
-				}
-
-				// improve the message of permission errors
-				if (err.code === 'EACCES') {
-					err.message = err.message + '\n' + permissionError + '\n';
-				}
-
-				// empty the file if it encounters invalid YAML
-				if (err.name === 'YAMLException') {
-					fs.writeFileSync(this.path, '', writeFileOptions);
-					return {};
-				}
-
-				throw err;
-			}
-		},
-		set: function (val) {
-			try {
-				// make sure the folder exists, it could have been
-				// deleted meanwhile
-				mkdirp.sync(path.dirname(this.path), defaultPathMode);
-				fs.writeFileSync(this.path, yaml.safeDump(val, {
-					skipInvalid: true,
-					schema: yaml.JSON_SCHEMA
-				}), writeFileOptions);
-			} catch (err) {
-				// improve the message of permission errors
-				if (err.code === 'EACCES') {
-					err.message = err.message + '\n' + permissionError + '\n';
-				}
-
-				throw err;
-			}
-		}
-	},
-	size: {
-		get: function () {
-			return Object.keys(this.all || {}).length;
-		}
-	}
-});
-
-Configstore.prototype.get = function (key) {
-	return this.all[key];
-};
-
-Configstore.prototype.set = function (key, val) {
-	var config = this.all;
-	config[key] = val;
-	this.all = config;
-};
-
-Configstore.prototype.del = function (key) {
-	var config = this.all;
-	delete config[key];
-	this.all = config;
-};
-
-module.exports = Configstore;
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/graceful-fs/package.json b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/graceful-fs/package.json
index 48dfa5c..44d635b 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/graceful-fs/package.json
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/graceful-fs/package.json
@@ -50,5 +50,5 @@
   },
   "homepage": "https://github.com/isaacs/node-graceful-fs",
   "_id": "graceful-fs@3.0.5",
-  "_from": "graceful-fs@~3.0.1"
+  "_from": "graceful-fs@^3.0.1"
 }
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/HISTORY.md b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/HISTORY.md
index af98005..0733e89 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/HISTORY.md
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/HISTORY.md
@@ -1,3 +1,59 @@
+3.2.5 / 2014-12-28
+------------------
+
+- Fixed resolving of all built-in types on empty nodes.
+- Fixed invalid warning on empty lines within quoted scalars and flow collections.
+- Fixed bug: Tag on an empty node didn't resolve in some cases.
+
+
+3.2.4 / 2014-12-19
+------------------
+
+- Fixed resolving of !!null tag on an empty node.
+
+
+3.2.3 / 2014-11-08
+------------------
+
+- Implemented dumping of objects with circular and cross references.
+- Partially fixed aliasing of constructed objects. (see issue #141 for details)
+
+
+3.2.2 / 2014-09-07
+------------------
+
+- Fixed infinite loop on unindented block scalars.
+- Rewritten base64 encode/decode in binary type, to keep code licence clear.
+
+
+3.2.1 / 2014-08-24
+------------------
+
+- Nothig new. Just fix npm publish error.
+
+
+3.2.0 / 2014-08-24
+------------------
+
+- Added input piping support to CLI.
+- Fixed typo, that could cause hand on initial indent (#139).
+
+
+3.1.0 / 2014-07-07
+------------------
+
+- 1.5x-2x speed boost.
+- Removed deprecated `require('xxx.yml')` support.
+- Significant code cleanup and refactoring.
+- Internal API changed. If you used custom types - see updated examples.
+  Others are not affected.
+- Even if the input string has no trailing line break character,
+  it will be parsed as if it has one.
+- Added benchmark scripts.
+- Moved bower files to /dist folder
+- Bugfixes.
+
+
 3.0.2 / 2014-02-27
 ------------------
 
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/README.md b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/README.md
index d288447..c181df1 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/README.md
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/README.md
@@ -1,7 +1,8 @@
 JS-YAML - YAML 1.2 parser and serializer for JavaScript
 =======================================================
 
-[![Build Status](https://secure.travis-ci.org/nodeca/js-yaml.png)](http://travis-ci.org/nodeca/js-yaml)
+[![Build Status](https://travis-ci.org/nodeca/js-yaml.svg?branch=master)](https://travis-ci.org/nodeca/js-yaml)
+[![NPM version](https://img.shields.io/npm/v/js-yaml.svg)](https://www.npmjs.org/package/js-yaml)
 
 [Online Demo](http://nodeca.github.com/js-yaml/)
 
@@ -102,8 +103,8 @@
 
 - `filename` _(default: null)_ - string to be used as a file path in
   error/warning messages.
-- `strict` _(default - false)_ makes the loader to throw errors instead of
-  warnings.
+- `onWarning` _(default: null)_ - function to call on warning messages.
+  Loader will throw on warnings if this function is not provided.
 - `schema` _(default: `DEFAULT_SAFE_SCHEMA`)_ - specifies a schema to use.
   - `FAILSAFE_SCHEMA` - only strings, arrays and plain objects:
     http://www.yaml.org/spec/1.2/spec.html#id2802346
@@ -264,7 +265,7 @@
 ```
 
 
-Breaking changes in 2.x.x -> 3.0.x
+Breaking changes in 2.x.x -> 3.x.x
 ----------------------------------
 
 If your have not used __custom__ tags or loader classes and not loaded yaml
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/bin/js-yaml.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/bin/js-yaml.js
index fc3a27f..d6fb6d6 100755
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/bin/js-yaml.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/bin/js-yaml.js
@@ -46,9 +46,10 @@
   action: 'storeTrue'
 });
 
-
 cli.addArgument(['file'], {
-  help:   'File to read, utf-8 encoded without BOM'
+  help:   'File to read, utf-8 encoded without BOM',
+  nargs:  '?',
+  defaultValue: '-'
 });
 
 
@@ -60,8 +61,25 @@
 
 ////////////////////////////////////////////////////////////////////////////////
 
+function readFile(filename, encoding, callback) {
+  if (options.file === '-') {
+    // read from stdin
 
-fs.readFile(options.file, 'utf8', function (error, input) {
+    var chunks = [];
+
+    process.stdin.on('data', function(chunk) {
+      chunks.push(chunk);
+    });
+
+    process.stdin.on('end', function() {
+      return callback(null, Buffer.concat(chunks).toString(encoding));
+    });
+  } else {
+    fs.readFile(filename, encoding, callback);
+  }
+}
+
+readFile(options.file, 'utf8', function (error, input) {
   var output, isYaml;
 
   if (error) {
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/bower.json b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/bower.json
index 26a7d81..010912f 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/bower.json
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/bower.json
@@ -1,8 +1,7 @@
 
 {
   "name": "js-yaml",
-  "main": "js-yaml.js",
-  "version": "3.0.2",
+  "main": "dist/js-yaml.js",
   "homepage": "https://github.com/nodeca/js-yaml",
   "authors": [ "Dervus Grim <dervus.grim@gmail.com>",
                "Vitaly Puzrin <vitaly@rcdesign.ru>",
@@ -14,6 +13,7 @@
   "ignore": [
     "**/.*",
     "node_modules",
+    "benchmark",
     "bower_components",
     "test",
     "Makefile",
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/examples/custom_types.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/examples/custom_types.js
index 6c01578..8ffa1c0 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/examples/custom_types.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/examples/custom_types.js
@@ -7,7 +7,7 @@
 var yaml = require('../lib/js-yaml');
 
 
-// Let define a couple of classes...
+// Let's define a couple of classes.
 
 function Point(x, y, z) {
   this.klass = 'Point';
@@ -31,55 +31,57 @@
 }
 
 
-// Let's define YAML types to load and dump our Point/Space objects.
+// Then define YAML types to load and dump our Point/Space objects.
 
-var pointYamlType = new yaml.Type('!point', {
-  //
-  // The information used to load a Point.
-  //
-  loadKind: 'sequence', // See node kinds in YAML spec: http://www.yaml.org/spec/1.2/spec.html#kind//
-  loadResolver: function (state) {
-    // You can access actual data from YAML via `state.result`.
-    // After the resolving, you should put the resolved value into `state.result`.
+var PointYamlType = new yaml.Type('!point', {
+  // Loader must parse sequence nodes only for this type (i.e. arrays in JS terminology).
+  // Other available kinds are 'scalar' (string) and 'mapping' (object).
+  // http://www.yaml.org/spec/1.2/spec.html#kind//
+  kind: 'sequence',
 
-    if (3 === state.result.length) { // `state.result`
-      state.result = new Point(state.result[0], state.result[1], state.result[2]);
-      return true; // Resolved successfully.
-    } else {
-      return false; // Can't resolve.
-    }
+  // Loader must check if the input object is suitable for this type.
+  resolve: function (data) {
+    // `data` may be either:
+    // - Null in case of an "empty node" (http://www.yaml.org/spec/1.2/spec.html#id2786563)
+    // - Array since we specified `kind` to 'sequence'
+    return data !== null && data.length === 3;
   },
-  //
-  // The information used to dump a Point.
-  //
-  dumpInstanceOf: Point, // Dump only instances of Point constructor as this YAML type.
-  dumpRepresenter: function (point) {
-    // Represent in YAML as three-element sequence.
+
+  // If a node is resolved, use it to create a Point instance.
+  construct: function (data) {
+    return new Point(data[0], data[1], data[2]);
+  },
+
+  // Dumper must process instances of Point by rules of this YAML type.
+  instanceOf: Point,
+
+  // Dumper must represent Point objects as three-element sequence in YAML.
+  represent: function (point) {
     return [ point.x, point.y, point.z ];
   }
 });
 
 
-var spaceYamlType = new yaml.Type('!space', {
-  loadKind: 'mapping',
-  loadResolver: function (state) {
-    state.result = new Space(state.result.height, state.result.width, state.result.points);
-    return true;
+var SpaceYamlType = new yaml.Type('!space', {
+  kind: 'mapping',
+  construct: function (data) {
+    data = data || {}; // in case of empty node
+    return new Space(data.height || 0, data.width || 0, data.points || []);
   },
-  dumpInstanceOf: Space
-  // `dumpRepresenter` is omitted here. So, Space objects will be dumped as is.
+  instanceOf: Space
+  // `represent` is omitted here. So, Space objects will be dumped as is.
   // That is regular mapping with three key-value pairs but with !space tag.
 });
 
 
 // After our types are defined, it's time to join them into a schema.
 
-var SPACE_SCHEMA = yaml.Schema.create([ spaceYamlType, pointYamlType ]);
+var SPACE_SCHEMA = yaml.Schema.create([ SpaceYamlType, PointYamlType ]);
 
 
 // And read a document using that schema.
 
-fs.readFile(path.join(__dirname, 'custom_types.yaml'), 'utf8', function (error, data) {
+fs.readFile(path.join(__dirname, 'custom_types.yml'), 'utf8', function (error, data) {
   var loaded;
 
   if (!error) {
@@ -95,6 +97,6 @@
 
 module.exports.Point         = Point;
 module.exports.Space         = Space;
-module.exports.pointYamlType = pointYamlType;
-module.exports.spaceYamlType = spaceYamlType;
+module.exports.PointYamlType = PointYamlType;
+module.exports.SpaceYamlType = SpaceYamlType;
 module.exports.SPACE_SCHEMA  = SPACE_SCHEMA;
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/examples/custom_types.yaml b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/examples/custom_types.yaml
deleted file mode 100644
index 033134f..0000000
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/examples/custom_types.yaml
+++ /dev/null
@@ -1,18 +0,0 @@
-subject: Custom types in JS-YAML
-spaces:
-- !space
-  height: 1000
-  width: 1000
-  points:
-  - !point [ 10, 43, 23 ]
-  - !point [ 165, 0, 50 ]
-  - !point [ 100, 100, 100 ]
-
-- !space
-  height: 64
-  width: 128
-  points:
-  - !point [ 12, 43, 0 ]
-  - !point [ 1, 4, 90 ]
-
-- !space {} # An empty space
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/examples/sample_document.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/examples/sample_document.js
index 2378aba..5a99e18 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/examples/sample_document.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/examples/sample_document.js
@@ -8,7 +8,7 @@
 
 
 try {
-  var filename = path.join(__dirname, 'sample_document.yaml'),
+  var filename = path.join(__dirname, 'sample_document.yml'),
       contents = fs.readFileSync(filename, 'utf8'),
       data     = yaml.load(contents);
 
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/examples/sample_document.yaml b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/examples/sample_document.yaml
deleted file mode 100644
index 4479ee9..0000000
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/examples/sample_document.yaml
+++ /dev/null
@@ -1,197 +0,0 @@
----
-# Collection Types #############################################################
-################################################################################
-
-# http://yaml.org/type/map.html -----------------------------------------------#
-
-map:
-  # Unordered set of key: value pairs.
-  Block style: !!map
-    Clark : Evans
-    Ingy  : döt Net
-    Oren  : Ben-Kiki
-  Flow style: !!map { Clark: Evans, Ingy: döt Net, Oren: Ben-Kiki }
-
-# http://yaml.org/type/omap.html ----------------------------------------------#
-
-omap:
-  # Explicitly typed ordered map (dictionary).
-  Bestiary: !!omap
-    - aardvark: African pig-like ant eater. Ugly.
-    - anteater: South-American ant eater. Two species.
-    - anaconda: South-American constrictor snake. Scaly.
-    # Etc.
-  # Flow style
-  Numbers: !!omap [ one: 1, two: 2, three : 3 ]
-
-# http://yaml.org/type/pairs.html ---------------------------------------------#
-
-pairs:
-  # Explicitly typed pairs.
-  Block tasks: !!pairs
-    - meeting: with team.
-    - meeting: with boss.
-    - break: lunch.
-    - meeting: with client.
-  Flow tasks: !!pairs [ meeting: with team, meeting: with boss ]
-
-# http://yaml.org/type/set.html -----------------------------------------------#
-
-set:
-  # Explicitly typed set.
-  baseball players: !!set
-    ? Mark McGwire
-    ? Sammy Sosa
-    ? Ken Griffey
-  # Flow style
-  baseball teams: !!set { Boston Red Sox, Detroit Tigers, New York Yankees }
-
-# http://yaml.org/type/seq.html -----------------------------------------------#
-
-seq:
-  # Ordered sequence of nodes
-  Block style: !!seq
-  - Mercury   # Rotates - no light/dark sides.
-  - Venus     # Deadliest. Aptly named.
-  - Earth     # Mostly dirt.
-  - Mars      # Seems empty.
-  - Jupiter   # The king.
-  - Saturn    # Pretty.
-  - Uranus    # Where the sun hardly shines.
-  - Neptune   # Boring. No rings.
-  - Pluto     # You call this a planet?
-  Flow style: !!seq [ Mercury, Venus, Earth, Mars,      # Rocks
-                      Jupiter, Saturn, Uranus, Neptune, # Gas
-                      Pluto ]                           # Overrated
-
-
-# Scalar Types #################################################################
-################################################################################
-
-# http://yaml.org/type/binary.html --------------------------------------------#
-
-binary:
-  canonical: !!binary "\
-    R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5\
-    OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+\
-    +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC\
-    AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs="
-  generic: !!binary |
-    R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5
-    OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+
-    +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC
-    AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=
-  description:
-    The binary value above is a tiny arrow encoded as a gif image.
-
-# http://yaml.org/type/bool.html ----------------------------------------------#
-
-bool:
-  - true
-  - True
-  - TRUE
-  - false
-  - False
-  - FALSE
-
-# http://yaml.org/type/float.html ---------------------------------------------#
-
-float:
-  canonical: 6.8523015e+5
-  exponentioal: 685.230_15e+03
-  fixed: 685_230.15
-  sexagesimal: 190:20:30.15
-  negative infinity: -.inf
-  not a number: .NaN
-
-# http://yaml.org/type/int.html -----------------------------------------------#
-
-int:
-  canonical: 685230
-  decimal: +685_230
-  octal: 02472256
-  hexadecimal: 0x_0A_74_AE
-  binary: 0b1010_0111_0100_1010_1110
-  sexagesimal: 190:20:30
-
-# http://yaml.org/type/merge.html ---------------------------------------------#
-
-merge:
-  - &CENTER { x: 1, y: 2 }
-  - &LEFT { x: 0, y: 2 }
-  - &BIG { r: 10 }
-  - &SMALL { r: 1 }
-  
-  # All the following maps are equal:
-  
-  - # Explicit keys
-    x: 1
-    y: 2
-    r: 10
-    label: nothing
-  
-  - # Merge one map
-    << : *CENTER
-    r: 10
-    label: center
-  
-  - # Merge multiple maps
-    << : [ *CENTER, *BIG ]
-    label: center/big
-  
-  - # Override
-    << : [ *BIG, *LEFT, *SMALL ]
-    x: 1
-    label: big/left/small
-
-# http://yaml.org/type/null.html ----------------------------------------------#
-
-null:
-  # This mapping has four keys,
-  # one has a value.
-  empty:
-  canonical: ~
-  english: null
-  ~: null key
-  # This sequence has five
-  # entries, two have values.
-  sparse:
-    - ~
-    - 2nd entry
-    -
-    - 4th entry
-    - Null
-
-# http://yaml.org/type/str.html -----------------------------------------------#
-
-string: abcd
-
-# http://yaml.org/type/timestamp.html -----------------------------------------#
-
-timestamp:
-  canonical:        2001-12-15T02:59:43.1Z
-  valid iso8601:    2001-12-14t21:59:43.10-05:00
-  space separated:  2001-12-14 21:59:43.10 -5
-  no time zone (Z): 2001-12-15 2:59:43.10
-  date (00:00:00Z): 2002-12-14
-
-
-# JavaScript Specific Types ####################################################
-################################################################################
-
-# https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp
-
-regexp:
-  simple: !!js/regexp      foobar
-  modifiers: !!js/regexp   /foobar/mi
-
-# https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/undefined
-
-undefined: !!js/undefined ~
-
-# https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function
-
-function: !!js/function >
-  function foobar() {
-    return 'Wow! JS-YAML Rocks!';
-  }
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/index.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/index.js
index cddf804..1374435 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/index.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/index.js
@@ -1,15 +1,7 @@
 'use strict';
 
 
-var fs   = require('fs');
-var util = require('util');
 var yaml = require('./lib/js-yaml.js');
 
 
-require.extensions['.yml'] = require.extensions['.yaml'] =
-  util.deprecate(function (m, f) {
-    m.exports = yaml.safeLoad(fs.readFileSync(f, 'utf8'), { filename: f });
-  }, 'Direct yaml files load via require() is deprecated! Use safeLoad() instead.');
-
-
 module.exports = yaml;
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/index_browser.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/index_browser.js
deleted file mode 100644
index 1374435..0000000
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/index_browser.js
+++ /dev/null
@@ -1,7 +0,0 @@
-'use strict';
-
-
-var yaml = require('./lib/js-yaml.js');
-
-
-module.exports = yaml;
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/common.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/common.js
index d60b749..71d3ec8 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/common.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/common.js
@@ -49,8 +49,14 @@
 }
 
 
-module.exports.isNothing  = isNothing;
-module.exports.isObject   = isObject;
-module.exports.toArray    = toArray;
-module.exports.repeat     = repeat;
-module.exports.extend     = extend;
+function isNegativeZero(number) {
+  return (0 === number) && (Number.NEGATIVE_INFINITY === 1 / number);
+}
+
+
+module.exports.isNothing      = isNothing;
+module.exports.isObject       = isObject;
+module.exports.toArray        = toArray;
+module.exports.repeat         = repeat;
+module.exports.isNegativeZero = isNegativeZero;
+module.exports.extend         = extend;
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/dumper.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/dumper.js
index e562f3f..6c93141 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/dumper.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/dumper.js
@@ -81,8 +81,8 @@
 
     type = schema.compiledTypeMap[tag];
 
-    if (type && _hasOwnProperty.call(type.dumpStyleAliases, style)) {
-      style = type.dumpStyleAliases[style];
+    if (type && _hasOwnProperty.call(type.styleAliases, style)) {
+      style = type.styleAliases[style];
     }
 
     result[tag] = style;
@@ -126,6 +126,9 @@
 
   this.tag = null;
   this.result = '';
+
+  this.duplicates = [];
+  this.usedDuplicates = null;
 }
 
 
@@ -139,7 +142,7 @@
   for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {
     type = state.implicitTypes[index];
 
-    if (type.loadResolver && type.loadResolver({ result: str })) {
+    if (type.resolve(str)) {
       return true;
     }
   }
@@ -378,19 +381,19 @@
   for (index = 0, length = typeList.length; index < length; index += 1) {
     type = typeList[index];
 
-    if ((type.dumpInstanceOf  || type.dumpPredicate) &&
-        (!type.dumpInstanceOf || (('object' === typeof object) && (object instanceof type.dumpInstanceOf))) &&
-        (!type.dumpPredicate  || type.dumpPredicate(object))) {
+    if ((type.instanceOf  || type.predicate) &&
+        (!type.instanceOf || (('object' === typeof object) && (object instanceof type.instanceOf))) &&
+        (!type.predicate  || type.predicate(object))) {
 
       state.tag = explicit ? type.tag : '?';
 
-      if (type.dumpRepresenter) {
-        style = state.styleMap[type.tag] || type.dumpDefaultStyle;
+      if (type.represent) {
+        style = state.styleMap[type.tag] || type.defaultStyle;
 
-        if ('[object Function]' === _toString.call(type.dumpRepresenter)) {
-          _result = type.dumpRepresenter(object, style);
-        } else if (_hasOwnProperty.call(type.dumpRepresenter, style)) {
-          _result = type.dumpRepresenter[style](object, style);
+        if ('[object Function]' === _toString.call(type.represent)) {
+          _result = type.represent(object, style);
+        } else if (_hasOwnProperty.call(type.represent, style)) {
+          _result = type.represent[style](object, style);
         } else {
           throw new YAMLException('!<' + type.tag + '> tag resolver accepts not "' + style + '" style');
         }
@@ -426,40 +429,114 @@
     compact = false;
   }
 
-  if ('[object Object]' === type) {
-    if (block && (0 !== Object.keys(state.dump).length)) {
-      writeBlockMapping(state, level, state.dump, compact);
-    } else {
-      writeFlowMapping(state, level, state.dump);
-    }
-  } else if ('[object Array]' === type) {
-    if (block && (0 !== state.dump.length)) {
-      writeBlockSequence(state, level, state.dump, compact);
-    } else {
-      writeFlowSequence(state, level, state.dump);
-    }
-  } else if ('[object String]' === type) {
-    if ('?' !== state.tag) {
-      writeScalar(state, state.dump);
-    }
-  } else if (state.skipInvalid) {
-    return false;
-  } else {
-    throw new YAMLException('unacceptabe kind of an object to dump ' + type);
+  var objectOrArray = '[object Object]' === type || '[object Array]' === type,
+      duplicateIndex,
+      duplicate;
+
+  if (objectOrArray) {
+    duplicateIndex = state.duplicates.indexOf(object);
+    duplicate = duplicateIndex !== -1;
   }
 
-  if (null !== state.tag && '?' !== state.tag) {
-    state.dump = '!<' + state.tag + '> ' + state.dump;
+  if (duplicate && state.usedDuplicates[duplicateIndex]) {
+    state.dump = '*ref_' + duplicateIndex;
+  } else {
+    if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {
+      state.usedDuplicates[duplicateIndex] = true;
+    }
+    if ('[object Object]' === type) {
+      if (block && (0 !== Object.keys(state.dump).length)) {
+        writeBlockMapping(state, level, state.dump, compact);
+        if (duplicate) {
+          state.dump = '&ref_' + duplicateIndex + (0 === level ? '\n' : '') + state.dump;
+        }
+      } else {
+        writeFlowMapping(state, level, state.dump);
+        if (duplicate) {
+          state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;
+        }
+      }
+    } else if ('[object Array]' === type) {
+      if (block && (0 !== state.dump.length)) {
+        writeBlockSequence(state, level, state.dump, compact);
+        if (duplicate) {
+          state.dump = '&ref_' + duplicateIndex + (0 === level ? '\n' : '') + state.dump;
+        }
+      } else {
+        writeFlowSequence(state, level, state.dump);
+        if (duplicate) {
+          state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;
+        }
+      }
+    } else if ('[object String]' === type) {
+      if ('?' !== state.tag) {
+        writeScalar(state, state.dump);
+      }
+    } else if (state.skipInvalid) {
+      return false;
+    } else {
+      throw new YAMLException('unacceptable kind of an object to dump ' + type);
+    }
+
+    if (null !== state.tag && '?' !== state.tag) {
+      state.dump = '!<' + state.tag + '> ' + state.dump;
+    }
   }
+
   return true;
 }
 
+function getDuplicateReferences(object, state) {
+  var objects = [],
+      duplicatesIndexes = [],
+      index,
+      length;
+
+  inspectNode(object, objects, duplicatesIndexes);
+
+  for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {
+    state.duplicates.push(objects[duplicatesIndexes[index]]);
+  }
+  state.usedDuplicates = new Array(length);
+}
+
+function inspectNode(object, objects, duplicatesIndexes) {
+  var type = _toString.call(object),
+      objectKeyList,
+      index,
+      length;
+
+  if (null !== object && 'object' === typeof object) {
+    index = objects.indexOf(object);
+    if (-1 !== index) {
+      if (-1 === duplicatesIndexes.indexOf(index)) {
+        duplicatesIndexes.push(index);
+      }
+    } else {
+      objects.push(object);
+    
+      if(Array.isArray(object)) {
+        for (index = 0, length = object.length; index < length; index += 1) {
+          inspectNode(object[index], objects, duplicatesIndexes);
+        }
+      } else {
+        objectKeyList = Object.keys(object);
+
+        for (index = 0, length = objectKeyList.length; index < length; index += 1) {
+          inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);
+        }
+      }
+    }
+  }
+}
 
 function dump(input, options) {
   options = options || {};
 
   var state = new State(options);
 
+  getDuplicateReferences(input, state);
+
   if (writeNode(state, 0, input, true, true)) {
     return state.dump + '\n';
   } else {
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/loader.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/loader.js
index 129aae3..7e924a8 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/loader.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/loader.js
@@ -22,85 +22,6 @@
 var CHOMPING_KEEP  = 3;
 
 
-var CHAR_TAB                  = 0x09;   /* Tab */
-var CHAR_LINE_FEED            = 0x0A;   /* LF */
-var CHAR_CARRIAGE_RETURN      = 0x0D;   /* CR */
-var CHAR_SPACE                = 0x20;   /* Space */
-var CHAR_EXCLAMATION          = 0x21;   /* ! */
-var CHAR_DOUBLE_QUOTE         = 0x22;   /* " */
-var CHAR_SHARP                = 0x23;   /* # */
-var CHAR_PERCENT              = 0x25;   /* % */
-var CHAR_AMPERSAND            = 0x26;   /* & */
-var CHAR_SINGLE_QUOTE         = 0x27;   /* ' */
-var CHAR_ASTERISK             = 0x2A;   /* * */
-var CHAR_PLUS                 = 0x2B;   /* + */
-var CHAR_COMMA                = 0x2C;   /* , */
-var CHAR_MINUS                = 0x2D;   /* - */
-var CHAR_DOT                  = 0x2E;   /* . */
-var CHAR_SLASH                = 0x2F;   /* / */
-var CHAR_DIGIT_ZERO           = 0x30;   /* 0 */
-var CHAR_DIGIT_ONE            = 0x31;   /* 1 */
-var CHAR_DIGIT_NINE           = 0x39;   /* 9 */
-var CHAR_COLON                = 0x3A;   /* : */
-var CHAR_LESS_THAN            = 0x3C;   /* < */
-var CHAR_GREATER_THAN         = 0x3E;   /* > */
-var CHAR_QUESTION             = 0x3F;   /* ? */
-var CHAR_COMMERCIAL_AT        = 0x40;   /* @ */
-var CHAR_CAPITAL_A            = 0x41;   /* A */
-var CHAR_CAPITAL_F            = 0x46;   /* F */
-var CHAR_CAPITAL_L            = 0x4C;   /* L */
-var CHAR_CAPITAL_N            = 0x4E;   /* N */
-var CHAR_CAPITAL_P            = 0x50;   /* P */
-var CHAR_CAPITAL_U            = 0x55;   /* U */
-var CHAR_LEFT_SQUARE_BRACKET  = 0x5B;   /* [ */
-var CHAR_BACKSLASH            = 0x5C;   /* \ */
-var CHAR_RIGHT_SQUARE_BRACKET = 0x5D;   /* ] */
-var CHAR_UNDERSCORE           = 0x5F;   /* _ */
-var CHAR_GRAVE_ACCENT         = 0x60;   /* ` */
-var CHAR_SMALL_A              = 0x61;   /* a */
-var CHAR_SMALL_B              = 0x62;   /* b */
-var CHAR_SMALL_E              = 0x65;   /* e */
-var CHAR_SMALL_F              = 0x66;   /* f */
-var CHAR_SMALL_N              = 0x6E;   /* n */
-var CHAR_SMALL_R              = 0x72;   /* r */
-var CHAR_SMALL_T              = 0x74;   /* t */
-var CHAR_SMALL_U              = 0x75;   /* u */
-var CHAR_SMALL_V              = 0x76;   /* v */
-var CHAR_SMALL_X              = 0x78;   /* x */
-var CHAR_LEFT_CURLY_BRACKET   = 0x7B;   /* { */
-var CHAR_VERTICAL_LINE        = 0x7C;   /* | */
-var CHAR_RIGHT_CURLY_BRACKET  = 0x7D;   /* } */
-
-
-var SIMPLE_ESCAPE_SEQUENCES = {};
-
-SIMPLE_ESCAPE_SEQUENCES[CHAR_DIGIT_ZERO]   = '\x00';
-SIMPLE_ESCAPE_SEQUENCES[CHAR_SMALL_A]      = '\x07';
-SIMPLE_ESCAPE_SEQUENCES[CHAR_SMALL_B]      = '\x08';
-SIMPLE_ESCAPE_SEQUENCES[CHAR_SMALL_T]      = '\x09';
-SIMPLE_ESCAPE_SEQUENCES[CHAR_TAB]          = '\x09';
-SIMPLE_ESCAPE_SEQUENCES[CHAR_SMALL_N]      = '\x0A';
-SIMPLE_ESCAPE_SEQUENCES[CHAR_SMALL_V]      = '\x0B';
-SIMPLE_ESCAPE_SEQUENCES[CHAR_SMALL_F]      = '\x0C';
-SIMPLE_ESCAPE_SEQUENCES[CHAR_SMALL_R]      = '\x0D';
-SIMPLE_ESCAPE_SEQUENCES[CHAR_SMALL_E]      = '\x1B';
-SIMPLE_ESCAPE_SEQUENCES[CHAR_SPACE]        = ' ';
-SIMPLE_ESCAPE_SEQUENCES[CHAR_DOUBLE_QUOTE] = '\x22';
-SIMPLE_ESCAPE_SEQUENCES[CHAR_SLASH]        = '/';
-SIMPLE_ESCAPE_SEQUENCES[CHAR_BACKSLASH]    = '\x5C';
-SIMPLE_ESCAPE_SEQUENCES[CHAR_CAPITAL_N]    = '\x85';
-SIMPLE_ESCAPE_SEQUENCES[CHAR_UNDERSCORE]   = '\xA0';
-SIMPLE_ESCAPE_SEQUENCES[CHAR_CAPITAL_L]    = '\u2028';
-SIMPLE_ESCAPE_SEQUENCES[CHAR_CAPITAL_P]    = '\u2029';
-
-
-var HEXADECIMAL_ESCAPE_SEQUENCES = {};
-
-HEXADECIMAL_ESCAPE_SEQUENCES[CHAR_SMALL_X]   = 2;
-HEXADECIMAL_ESCAPE_SEQUENCES[CHAR_SMALL_U]   = 4;
-HEXADECIMAL_ESCAPE_SEQUENCES[CHAR_CAPITAL_U] = 8;
-
-
 var PATTERN_NON_PRINTABLE         = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uD800-\uDFFF\uFFFE\uFFFF]/;
 var PATTERN_NON_ASCII_LINE_BREAKS = /[\x85\u2028\u2029]/;
 var PATTERN_FLOW_INDICATORS       = /[,\[\]\{\}]/;
@@ -108,23 +29,106 @@
 var PATTERN_TAG_URI               = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;
 
 
+function is_EOL(c) {
+  return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);
+}
+
+function is_WHITE_SPACE(c) {
+  return (c === 0x09/* Tab */) || (c === 0x20/* Space */);
+}
+
+function is_WS_OR_EOL(c) {
+  return (c === 0x09/* Tab */) ||
+         (c === 0x20/* Space */) ||
+         (c === 0x0A/* LF */) ||
+         (c === 0x0D/* CR */);
+}
+
+function is_FLOW_INDICATOR(c) {
+  return 0x2C/* , */ === c ||
+         0x5B/* [ */ === c ||
+         0x5D/* ] */ === c ||
+         0x7B/* { */ === c ||
+         0x7D/* } */ === c;
+}
+
+function fromHexCode(c) {
+  var lc;
+
+  if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {
+    return c - 0x30;
+  }
+
+  lc = c | 0x20;
+  if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {
+    return lc - 0x61 + 10;
+  }
+
+  return -1;
+}
+
+function escapedHexLen(c) {
+  if (c === 0x78/* x */) { return 2; }
+  if (c === 0x75/* u */) { return 4; }
+  if (c === 0x55/* U */) { return 8; }
+  return 0;
+}
+
+function fromDecimalCode(c) {
+  if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {
+    return c - 0x30;
+  }
+
+  return -1;
+}
+
+function simpleEscapeSequence(c) {
+ return (c === 0x30/* 0 */) ? '\x00' :
+        (c === 0x61/* a */) ? '\x07' :
+        (c === 0x62/* b */) ? '\x08' :
+        (c === 0x74/* t */) ? '\x09' :
+        (c === 0x09/* Tab */) ? '\x09' :
+        (c === 0x6E/* n */) ? '\x0A' :
+        (c === 0x76/* v */) ? '\x0B' :
+        (c === 0x66/* f */) ? '\x0C' :
+        (c === 0x72/* r */) ? '\x0D' :
+        (c === 0x65/* e */) ? '\x1B' :
+        (c === 0x20/* Space */) ? ' ' :
+        (c === 0x22/* " */) ? '\x22' :
+        (c === 0x2F/* / */) ? '/' :
+        (c === 0x5C/* \ */) ? '\x5C' :
+        (c === 0x4E/* N */) ? '\x85' :
+        (c === 0x5F/* _ */) ? '\xA0' :
+        (c === 0x4C/* L */) ? '\u2028' :
+        (c === 0x50/* P */) ? '\u2029' : '';
+}
+
+var simpleEscapeCheck = new Array(256); // integer, for fast access
+var simpleEscapeMap = new Array(256);
+for (var i = 0; i < 256; i++) {
+  simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;
+  simpleEscapeMap[i] = simpleEscapeSequence(i);
+}
+
+
 function State(input, options) {
-  this.input    = input;
+  this.input = input;
 
-  this.filename = options['filename'] || null;
-  this.schema   = options['schema']   || DEFAULT_FULL_SCHEMA;
-  this.strict   = options['strict']   || false;
-  this.legacy   = options['legacy']   || false;
+  this.filename  = options['filename']  || null;
+  this.schema    = options['schema']    || DEFAULT_FULL_SCHEMA;
+  this.onWarning = options['onWarning'] || null;
+  this.legacy    = options['legacy']    || false;
 
-  this.implicitTypes     = this.schema.compiledImplicit;
-  this.typeMap           = this.schema.compiledTypeMap;
+  this.implicitTypes = this.schema.compiledImplicit;
+  this.typeMap       = this.schema.compiledTypeMap;
 
   this.length     = input.length;
   this.position   = 0;
   this.line       = 0;
   this.lineStart  = 0;
   this.lineIndent = 0;
-  this.character  = input.charCodeAt(0 /*position*/);
+
+  this.documents = [];
 
   /*
   this.version;
@@ -152,10 +156,10 @@
 function throwWarning(state, message) {
   var error = generateError(state, message);
 
-  if (state.strict) {
-    throw error;
+  if (state.onWarning) {
+    state.onWarning.call(null, error);
   } else {
-    console.warn(error.toString());
+    throw error;
   }
 }
 
@@ -288,13 +292,16 @@
 }
 
 function readLineBreak(state) {
-  if (CHAR_LINE_FEED === state.character) {
-    state.position += 1;
-  } else if (CHAR_CARRIAGE_RETURN === state.character) {
-    if (CHAR_LINE_FEED === state.input.charCodeAt(state.position + 1)) {
-      state.position += 2;
-    } else {
-      state.position += 1;
+  var ch;
+
+  ch = state.input.charCodeAt(state.position);
+
+  if (0x0A/* LF */ === ch) {
+    state.position++;
+  } else if (0x0D/* CR */ === ch) {
+    state.position++;
+    if (0x0A/* LF */ === state.input.charCodeAt(state.position)) {
+      state.position++;
     }
   } else {
     throwError(state, 'a line break is expected');
@@ -302,61 +309,63 @@
 
   state.line += 1;
   state.lineStart = state.position;
-  state.character = state.input.charCodeAt(state.position);
 }
 
 function skipSeparationSpace(state, allowComments, checkIndent) {
-  var lineBreaks = 0;
+  var lineBreaks = 0,
+      ch = state.input.charCodeAt(state.position);
 
-  while (state.position < state.length) {
-    while (CHAR_SPACE === state.character || CHAR_TAB === state.character) {
-      state.character = state.input.charCodeAt(++state.position);
+  while (0 !== ch) {
+    while (is_WHITE_SPACE(ch)) {
+      ch = state.input.charCodeAt(++state.position);
     }
 
-    if (allowComments && CHAR_SHARP === state.character) {
-      do { state.character = state.input.charCodeAt(++state.position); }
-      while (state.position < state.length &&
-             CHAR_LINE_FEED !== state.character &&
-             CHAR_CARRIAGE_RETURN !== state.character);
+    if (allowComments && 0x23/* # */ === ch) {
+      do {
+        ch = state.input.charCodeAt(++state.position);
+      } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && 0 !== ch);
     }
 
-    if (CHAR_LINE_FEED === state.character || CHAR_CARRIAGE_RETURN === state.character) {
+    if (is_EOL(ch)) {
       readLineBreak(state);
-      lineBreaks += 1;
+
+      ch = state.input.charCodeAt(state.position);
+      lineBreaks++;
       state.lineIndent = 0;
 
-      while (CHAR_SPACE === state.character) {
-        state.lineIndent += 1;
-        state.character = state.input.charCodeAt(++state.position);
-      }
-
-      if (state.lineIndent < checkIndent) {
-        throwWarning(state, 'deficient indentation');
+      while (0x20/* Space */ === ch) {
+        state.lineIndent++;
+        ch = state.input.charCodeAt(++state.position);
       }
     } else {
       break;
     }
   }
 
+  if (-1 !== checkIndent && 0 !== lineBreaks && state.lineIndent < checkIndent) {
+    throwWarning(state, 'deficient indentation');
+  }
+
   return lineBreaks;
 }
 
 function testDocumentSeparator(state) {
-  var _position, _character;
+  var _position = state.position,
+      ch;
 
-  if (state.position === state.lineStart &&
-      (CHAR_MINUS === state.character || CHAR_DOT === state.character) &&
-      state.input.charCodeAt(state.position + 1) === state.character &&
-      state.input.charCodeAt(state.position + 2) === state.character) {
+  ch = state.input.charCodeAt(_position);
 
-    _position = state.position + 3;
-    _character = state.input.charCodeAt(_position);
+  // Condition state.position === state.lineStart is tested
+  // in parent on each call, for efficiency. No needs to test here again.
+  if ((0x2D/* - */ === ch || 0x2E/* . */ === ch) &&
+      state.input.charCodeAt(_position + 1) === ch &&
+      state.input.charCodeAt(_position+ 2) === ch) {
 
-    if (_position >= state.length ||
-        CHAR_SPACE           === _character ||
-        CHAR_TAB             === _character ||
-        CHAR_LINE_FEED       === _character ||
-        CHAR_CARRIAGE_RETURN === _character) {
+    _position += 3;
+
+    ch = state.input.charCodeAt(_position);
+
+    if (ch === 0 || is_WS_OR_EOL(ch)) {
       return true;
     }
   }
@@ -383,45 +392,32 @@
       _lineStart,
       _lineIndent,
       _kind = state.kind,
-      _result = state.result;
+      _result = state.result,
+      ch;
 
-  if (CHAR_SPACE                === state.character ||
-      CHAR_TAB                  === state.character ||
-      CHAR_LINE_FEED            === state.character ||
-      CHAR_CARRIAGE_RETURN      === state.character ||
-      CHAR_COMMA                === state.character ||
-      CHAR_LEFT_SQUARE_BRACKET  === state.character ||
-      CHAR_RIGHT_SQUARE_BRACKET === state.character ||
-      CHAR_LEFT_CURLY_BRACKET   === state.character ||
-      CHAR_RIGHT_CURLY_BRACKET  === state.character ||
-      CHAR_SHARP                === state.character ||
-      CHAR_AMPERSAND            === state.character ||
-      CHAR_ASTERISK             === state.character ||
-      CHAR_EXCLAMATION          === state.character ||
-      CHAR_VERTICAL_LINE        === state.character ||
-      CHAR_GREATER_THAN         === state.character ||
-      CHAR_SINGLE_QUOTE         === state.character ||
-      CHAR_DOUBLE_QUOTE         === state.character ||
-      CHAR_PERCENT              === state.character ||
-      CHAR_COMMERCIAL_AT        === state.character ||
-      CHAR_GRAVE_ACCENT         === state.character) {
+  ch = state.input.charCodeAt(state.position);
+
+  if (is_WS_OR_EOL(ch)             ||
+      is_FLOW_INDICATOR(ch)        ||
+      0x23/* # */           === ch ||
+      0x26/* & */           === ch ||
+      0x2A/* * */           === ch ||
+      0x21/* ! */           === ch ||
+      0x7C/* | */           === ch ||
+      0x3E/* > */           === ch ||
+      0x27/* ' */           === ch ||
+      0x22/* " */           === ch ||
+      0x25/* % */           === ch ||
+      0x40/* @ */           === ch ||
+      0x60/* ` */           === ch) {
     return false;
   }
 
-  if (CHAR_QUESTION === state.character ||
-      CHAR_MINUS === state.character) {
+  if (0x3F/* ? */ === ch || 0x2D/* - */ === ch) {
     following = state.input.charCodeAt(state.position + 1);
 
-    if (CHAR_SPACE                 === following ||
-        CHAR_TAB                   === following ||
-        CHAR_LINE_FEED             === following ||
-        CHAR_CARRIAGE_RETURN       === following ||
-        withinFlowCollection &&
-        (CHAR_COMMA                === following ||
-         CHAR_LEFT_SQUARE_BRACKET  === following ||
-         CHAR_RIGHT_SQUARE_BRACKET === following ||
-         CHAR_LEFT_CURLY_BRACKET   === following ||
-         CHAR_RIGHT_CURLY_BRACKET  === following)) {
+    if (is_WS_OR_EOL(following) ||
+        withinFlowCollection && is_FLOW_INDICATOR(following)) {
       return false;
     }
   }
@@ -431,44 +427,27 @@
   captureStart = captureEnd = state.position;
   hasPendingContent = false;
 
-  while (state.position < state.length) {
-    if (CHAR_COLON === state.character) {
-      following = state.input.charCodeAt(state.position + 1);
+  while (0 !== ch) {
+    if (0x3A/* : */ === ch) {
+      following = state.input.charCodeAt(state.position+1);
 
-      if (CHAR_SPACE                 === following ||
-          CHAR_TAB                   === following ||
-          CHAR_LINE_FEED             === following ||
-          CHAR_CARRIAGE_RETURN       === following ||
-          withinFlowCollection &&
-          (CHAR_COMMA                === following ||
-           CHAR_LEFT_SQUARE_BRACKET  === following ||
-           CHAR_RIGHT_SQUARE_BRACKET === following ||
-           CHAR_LEFT_CURLY_BRACKET   === following ||
-           CHAR_RIGHT_CURLY_BRACKET  === following)) {
+      if (is_WS_OR_EOL(following) ||
+          withinFlowCollection && is_FLOW_INDICATOR(following)) {
         break;
       }
 
-    } else if (CHAR_SHARP === state.character) {
+    } else if (0x23/* # */ === ch) {
       preceding = state.input.charCodeAt(state.position - 1);
 
-      if (CHAR_SPACE           === preceding ||
-          CHAR_TAB             === preceding ||
-          CHAR_LINE_FEED       === preceding ||
-          CHAR_CARRIAGE_RETURN === preceding) {
+      if (is_WS_OR_EOL(preceding)) {
         break;
       }
 
     } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||
-               withinFlowCollection &&
-               (CHAR_COMMA                === state.character ||
-                CHAR_LEFT_SQUARE_BRACKET  === state.character ||
-                CHAR_RIGHT_SQUARE_BRACKET === state.character ||
-                CHAR_LEFT_CURLY_BRACKET   === state.character ||
-                CHAR_RIGHT_CURLY_BRACKET  === state.character)) {
+               withinFlowCollection && is_FLOW_INDICATOR(ch)) {
       break;
 
-    } else if (CHAR_LINE_FEED === state.character ||
-               CHAR_CARRIAGE_RETURN === state.character) {
+    } else if (is_EOL(ch)) {
       _line = state.line;
       _lineStart = state.lineStart;
       _lineIndent = state.lineIndent;
@@ -476,13 +455,13 @@
 
       if (state.lineIndent >= nodeIndent) {
         hasPendingContent = true;
+        ch = state.input.charCodeAt(state.position);
         continue;
       } else {
         state.position = captureEnd;
         state.line = _line;
         state.lineStart = _lineStart;
         state.lineIndent = _lineIndent;
-        state.character = state.input.charCodeAt(state.position);
         break;
       }
     }
@@ -494,11 +473,11 @@
       hasPendingContent = false;
     }
 
-    if (CHAR_SPACE !== state.character && CHAR_TAB !== state.character) {
+    if (!is_WHITE_SPACE(ch)) {
       captureEnd = state.position + 1;
     }
 
-    state.character = state.input.charCodeAt(++state.position);
+    ch = state.input.charCodeAt(++state.position);
   }
 
   captureSegment(state, captureStart, captureEnd, false);
@@ -513,41 +492,42 @@
 }
 
 function readSingleQuotedScalar(state, nodeIndent) {
-  var captureStart, captureEnd;
+  var ch,
+      captureStart, captureEnd;
 
-  if (CHAR_SINGLE_QUOTE !== state.character) {
+  ch = state.input.charCodeAt(state.position);
+
+  if (0x27/* ' */ !== ch) {
     return false;
   }
 
   state.kind = 'scalar';
   state.result = '';
-  state.character = state.input.charCodeAt(++state.position);
+  state.position++;
   captureStart = captureEnd = state.position;
 
-  while (state.position < state.length) {
-    if (CHAR_SINGLE_QUOTE === state.character) {
+  while (0 !== (ch = state.input.charCodeAt(state.position))) {
+    if (0x27/* ' */ === ch) {
       captureSegment(state, captureStart, state.position, true);
-      state.character = state.input.charCodeAt(++state.position);
+      ch = state.input.charCodeAt(++state.position);
 
-      if (CHAR_SINGLE_QUOTE === state.character) {
+      if (0x27/* ' */ === ch) {
         captureStart = captureEnd = state.position;
-        state.character = state.input.charCodeAt(++state.position);
+        state.position++;
       } else {
         return true;
       }
 
-    } else if (CHAR_LINE_FEED === state.character ||
-               CHAR_CARRIAGE_RETURN === state.character) {
+    } else if (is_EOL(ch)) {
       captureSegment(state, captureStart, captureEnd, true);
       writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
       captureStart = captureEnd = state.position;
-      state.character = state.input.charCodeAt(state.position);
 
     } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
       throwError(state, 'unexpected end of the document within a single quoted scalar');
 
     } else {
-      state.character = state.input.charCodeAt(++state.position);
+      state.position++;
       captureEnd = state.position;
     }
   }
@@ -559,53 +539,48 @@
   var captureStart,
       captureEnd,
       hexLength,
-      hexIndex,
-      hexOffset,
-      hexResult;
+      hexResult,
+      tmp, tmpEsc,
+      ch;
 
-  if (CHAR_DOUBLE_QUOTE !== state.character) {
+  ch = state.input.charCodeAt(state.position);
+
+  if (0x22/* " */ !== ch) {
     return false;
   }
 
   state.kind = 'scalar';
   state.result = '';
-  state.character = state.input.charCodeAt(++state.position);
+  state.position++;
   captureStart = captureEnd = state.position;
 
-  while (state.position < state.length) {
-    if (CHAR_DOUBLE_QUOTE === state.character) {
+  while (0 !== (ch = state.input.charCodeAt(state.position))) {
+    if (0x22/* " */ === ch) {
       captureSegment(state, captureStart, state.position, true);
-      state.character = state.input.charCodeAt(++state.position);
+      state.position++;
       return true;
 
-    } else if (CHAR_BACKSLASH === state.character) {
+    } else if (0x5C/* \ */ === ch) {
       captureSegment(state, captureStart, state.position, true);
-      state.character = state.input.charCodeAt(++state.position);
+      ch = state.input.charCodeAt(++state.position);
 
-      if (CHAR_LINE_FEED       === state.character ||
-          CHAR_CARRIAGE_RETURN === state.character) {
+      if (is_EOL(ch)) {
         skipSeparationSpace(state, false, nodeIndent);
 
-      } else if (SIMPLE_ESCAPE_SEQUENCES[state.character]) {
-        state.result += SIMPLE_ESCAPE_SEQUENCES[state.character];
-        state.character = state.input.charCodeAt(++state.position);
+        //TODO: rework to inline fn with no type cast?
+      } else if (ch < 256 && simpleEscapeCheck[ch]) {
+        state.result += simpleEscapeMap[ch];
+        state.position++;
 
-      } else if (HEXADECIMAL_ESCAPE_SEQUENCES[state.character]) {
-        hexLength = HEXADECIMAL_ESCAPE_SEQUENCES[state.character];
+      } else if ((tmp = escapedHexLen(ch)) > 0) {
+        hexLength = tmp;
         hexResult = 0;
 
-        for (hexIndex = 1; hexIndex <= hexLength; hexIndex += 1) {
-          hexOffset = (hexLength - hexIndex) * 4;
-          state.character = state.input.charCodeAt(++state.position);
+        for (; hexLength > 0; hexLength--) {
+          ch = state.input.charCodeAt(++state.position);
 
-          if (CHAR_DIGIT_ZERO <= state.character && state.character <= CHAR_DIGIT_NINE) {
-            hexResult |= (state.character - CHAR_DIGIT_ZERO) << hexOffset;
-
-          } else if (CHAR_CAPITAL_A <= state.character && state.character <= CHAR_CAPITAL_F) {
-            hexResult |= (state.character - CHAR_CAPITAL_A + 10) << hexOffset;
-
-          } else if (CHAR_SMALL_A <= state.character && state.character <= CHAR_SMALL_F) {
-            hexResult |= (state.character - CHAR_SMALL_A + 10) << hexOffset;
+          if ((tmp = fromHexCode(ch)) >= 0) {
+            hexResult = (hexResult << 4) + tmp;
 
           } else {
             throwError(state, 'expected hexadecimal character');
@@ -613,7 +588,7 @@
         }
 
         state.result += String.fromCharCode(hexResult);
-        state.character = state.input.charCodeAt(++state.position);
+        state.position++;
 
       } else {
         throwError(state, 'unknown escape sequence');
@@ -621,18 +596,16 @@
 
       captureStart = captureEnd = state.position;
 
-    } else if (CHAR_LINE_FEED === state.character ||
-               CHAR_CARRIAGE_RETURN === state.character) {
+    } else if (is_EOL(ch)) {
       captureSegment(state, captureStart, captureEnd, true);
       writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));
       captureStart = captureEnd = state.position;
-      state.character = state.input.charCodeAt(state.position);
 
     } else if (state.position === state.lineStart && testDocumentSeparator(state)) {
       throwError(state, 'unexpected end of the document within a double quoted scalar');
 
     } else {
-      state.character = state.input.charCodeAt(++state.position);
+      state.position++;
       captureEnd = state.position;
     }
   }
@@ -645,6 +618,7 @@
       _line,
       _tag     = state.tag,
       _result,
+      _anchor  = state.anchor,
       following,
       terminator,
       isPair,
@@ -652,22 +626,20 @@
       isMapping,
       keyNode,
       keyTag,
-      valueNode;
+      valueNode,
+      ch;
 
-  switch (state.character) {
-  case CHAR_LEFT_SQUARE_BRACKET:
-    terminator = CHAR_RIGHT_SQUARE_BRACKET;
+  ch = state.input.charCodeAt(state.position);
+
+  if (ch === 0x5B/* [ */) {
+    terminator = 0x5D/* ] */;
     isMapping = false;
     _result = [];
-    break;
-
-  case CHAR_LEFT_CURLY_BRACKET:
-    terminator = CHAR_RIGHT_CURLY_BRACKET;
+  } else if (ch === 0x7B/* { */) {
+    terminator = 0x7D/* } */;
     isMapping = true;
     _result = {};
-    break;
-
-  default:
+  } else {
     return false;
   }
 
@@ -675,14 +647,17 @@
     state.anchorMap[state.anchor] = _result;
   }
 
-  state.character = state.input.charCodeAt(++state.position);
+  ch = state.input.charCodeAt(++state.position);
 
-  while (state.position < state.length) {
+  while (0 !== ch) {
     skipSeparationSpace(state, true, nodeIndent);
 
-    if (state.character === terminator) {
-      state.character = state.input.charCodeAt(++state.position);
+    ch = state.input.charCodeAt(state.position);
+
+    if (ch === terminator) {
+      state.position++;
       state.tag = _tag;
+      state.anchor = _anchor;
       state.kind = isMapping ? 'mapping' : 'sequence';
       state.result = _result;
       return true;
@@ -693,16 +668,12 @@
     keyTag = keyNode = valueNode = null;
     isPair = isExplicitPair = false;
 
-    if (CHAR_QUESTION === state.character) {
+    if (0x3F/* ? */ === ch) {
       following = state.input.charCodeAt(state.position + 1);
 
-      if (CHAR_SPACE === following ||
-          CHAR_TAB === following ||
-          CHAR_LINE_FEED === following ||
-          CHAR_CARRIAGE_RETURN === following) {
+      if (is_WS_OR_EOL(following)) {
         isPair = isExplicitPair = true;
-        state.position += 1;
-        state.character = following;
+        state.position++;
         skipSeparationSpace(state, true, nodeIndent);
       }
     }
@@ -713,9 +684,11 @@
     keyNode = state.result;
     skipSeparationSpace(state, true, nodeIndent);
 
-    if ((isExplicitPair || state.line === _line) && CHAR_COLON === state.character) {
+    ch = state.input.charCodeAt(state.position);
+
+    if ((isExplicitPair || state.line === _line) && 0x3A/* : */ === ch) {
       isPair = true;
-      state.character = state.input.charCodeAt(++state.position);
+      ch = state.input.charCodeAt(++state.position);
       skipSeparationSpace(state, true, nodeIndent);
       composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);
       valueNode = state.result;
@@ -731,9 +704,11 @@
 
     skipSeparationSpace(state, true, nodeIndent);
 
-    if (CHAR_COMMA === state.character) {
+    ch = state.input.charCodeAt(state.position);
+
+    if (0x2C/* , */ === ch) {
       readNext = true;
-      state.character = state.input.charCodeAt(++state.position);
+      ch = state.input.charCodeAt(++state.position);
     } else {
       readNext = false;
     }
@@ -749,39 +724,38 @@
       detectedIndent = false,
       textIndent     = nodeIndent,
       emptyLines     = 0,
-      atMoreIndented = false;
+      atMoreIndented = false,
+      tmp,
+      ch;
 
-  switch (state.character) {
-  case CHAR_VERTICAL_LINE:
+  ch = state.input.charCodeAt(state.position);
+
+  if (ch === 0x7C/* | */) {
     folding = false;
-    break;
-
-  case CHAR_GREATER_THAN:
+  } else if (ch === 0x3E/* > */) {
     folding = true;
-    break;
-
-  default:
+  } else {
     return false;
   }
 
   state.kind = 'scalar';
   state.result = '';
 
-  while (state.position < state.length) {
-    state.character = state.input.charCodeAt(++state.position);
+  while (0 !== ch) {
+    ch = state.input.charCodeAt(++state.position);
 
-    if (CHAR_PLUS === state.character || CHAR_MINUS === state.character) {
+    if (0x2B/* + */ === ch || 0x2D/* - */ === ch) {
       if (CHOMPING_CLIP === chomping) {
-        chomping = (CHAR_PLUS === state.character) ? CHOMPING_KEEP : CHOMPING_STRIP;
+        chomping = (0x2B/* + */ === ch) ? CHOMPING_KEEP : CHOMPING_STRIP;
       } else {
         throwError(state, 'repeat of a chomping mode identifier');
       }
 
-    } else if (CHAR_DIGIT_ZERO <= state.character && state.character <= CHAR_DIGIT_NINE) {
-      if (CHAR_DIGIT_ZERO === state.character) {
+    } else if ((tmp = fromDecimalCode(ch)) >= 0) {
+      if (tmp === 0) {
         throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');
       } else if (!detectedIndent) {
-        textIndent = nodeIndent + (state.character - CHAR_DIGIT_ONE);
+        textIndent = nodeIndent + tmp - 1;
         detectedIndent = true;
       } else {
         throwError(state, 'repeat of an indentation width identifier');
@@ -792,34 +766,34 @@
     }
   }
 
-  if (CHAR_SPACE === state.character || CHAR_TAB === state.character) {
-    do { state.character = state.input.charCodeAt(++state.position); }
-    while (CHAR_SPACE === state.character || CHAR_TAB === state.character);
+  if (is_WHITE_SPACE(ch)) {
+    do { ch = state.input.charCodeAt(++state.position); }
+    while (is_WHITE_SPACE(ch));
 
-    if (CHAR_SHARP === state.character) {
-      do { state.character = state.input.charCodeAt(++state.position); }
-      while (state.position < state.length &&
-             CHAR_LINE_FEED !== state.character &&
-             CHAR_CARRIAGE_RETURN !== state.character);
+    if (0x23/* # */ === ch) {
+      do { ch = state.input.charCodeAt(++state.position); }
+      while (!is_EOL(ch) && (0 !== ch));
     }
   }
 
-  while (state.position < state.length) {
+  while (0 !== ch) {
     readLineBreak(state);
     state.lineIndent = 0;
 
+    ch = state.input.charCodeAt(state.position);
+
     while ((!detectedIndent || state.lineIndent < textIndent) &&
-           (CHAR_SPACE === state.character)) {
-      state.lineIndent += 1;
-      state.character = state.input.charCodeAt(++state.position);
+           (0x20/* Space */ === ch)) {
+      state.lineIndent++;
+      ch = state.input.charCodeAt(++state.position);
     }
 
     if (!detectedIndent && state.lineIndent > textIndent) {
       textIndent = state.lineIndent;
     }
 
-    if (CHAR_LINE_FEED === state.character || CHAR_CARRIAGE_RETURN === state.character) {
-      emptyLines += 1;
+    if (is_EOL(ch)) {
+      emptyLines++;
       continue;
     }
 
@@ -827,16 +801,12 @@
     if (state.lineIndent < textIndent) {
 
       // Perform the chomping.
-      switch (chomping) {
-      case CHOMPING_KEEP:
+      if (chomping === CHOMPING_KEEP) {
         state.result += common.repeat('\n', emptyLines);
-        break;
-
-      case CHOMPING_CLIP:
+      } else if (chomping === CHOMPING_CLIP) {
         if (detectedIndent) { // i.e. only if the scalar is not empty.
           state.result += '\n';
         }
-        break;
       }
 
       // Break this `while` cycle and go to the funciton's epilogue.
@@ -847,7 +817,7 @@
     if (folding) {
 
       // Lines starting with white space characters (more-indented lines) are not folded.
-      if (CHAR_SPACE === state.character || CHAR_TAB === state.character) {
+      if (is_WHITE_SPACE(ch)) {
         atMoreIndented = true;
         state.result += common.repeat('\n', emptyLines + 1);
 
@@ -884,10 +854,8 @@
     emptyLines = 0;
     captureStart = state.position;
 
-    do { state.character = state.input.charCodeAt(++state.position); }
-    while (state.position < state.length &&
-           CHAR_LINE_FEED !== state.character &&
-           CHAR_CARRIAGE_RETURN !== state.character);
+    while (!is_EOL(ch) && (0 !== ch))
+    { ch = state.input.charCodeAt(++state.position); }
 
     captureSegment(state, captureStart, state.position, false);
   }
@@ -898,35 +866,37 @@
 function readBlockSequence(state, nodeIndent) {
   var _line,
       _tag      = state.tag,
+      _anchor   = state.anchor,
       _result   = [],
       following,
-      detected  = false;
+      detected  = false,
+      ch;
 
   if (null !== state.anchor) {
     state.anchorMap[state.anchor] = _result;
   }
 
-  while (state.position < state.length) {
-    if (CHAR_MINUS !== state.character) {
+  ch = state.input.charCodeAt(state.position);
+
+  while (0 !== ch) {
+
+    if (0x2D/* - */ !== ch) {
       break;
     }
 
     following = state.input.charCodeAt(state.position + 1);
 
-    if (CHAR_SPACE           !== following &&
-        CHAR_TAB             !== following &&
-        CHAR_LINE_FEED       !== following &&
-        CHAR_CARRIAGE_RETURN !== following) {
+    if (!is_WS_OR_EOL(following)) {
       break;
     }
 
     detected = true;
-    state.position += 1;
-    state.character = following;
+    state.position++;
 
     if (skipSeparationSpace(state, true, -1)) {
       if (state.lineIndent <= nodeIndent) {
         _result.push(null);
+        ch = state.input.charCodeAt(state.position);
         continue;
       }
     }
@@ -936,7 +906,9 @@
     _result.push(state.result);
     skipSeparationSpace(state, true, -1);
 
-    if ((state.line === _line || state.lineIndent > nodeIndent) && state.position < state.length) {
+    ch = state.input.charCodeAt(state.position);
+
+    if ((state.line === _line || state.lineIndent > nodeIndent) && (0 !== ch)) {
       throwError(state, 'bad indentation of a sequence entry');
     } else if (state.lineIndent < nodeIndent) {
       break;
@@ -945,6 +917,7 @@
 
   if (detected) {
     state.tag = _tag;
+    state.anchor = _anchor;
     state.kind = 'sequence';
     state.result = _result;
     return true;
@@ -953,23 +926,27 @@
   }
 }
 
-function readBlockMapping(state, nodeIndent) {
+function readBlockMapping(state, nodeIndent, flowIndent) {
   var following,
       allowCompact,
       _line,
       _tag          = state.tag,
+      _anchor       = state.anchor,
       _result       = {},
       keyTag        = null,
       keyNode       = null,
       valueNode     = null,
       atExplicitKey = false,
-      detected      = false;
+      detected      = false,
+      ch;
 
   if (null !== state.anchor) {
     state.anchorMap[state.anchor] = _result;
   }
 
-  while (state.position < state.length) {
+  ch = state.input.charCodeAt(state.position);
+
+  while (0 !== ch) {
     following = state.input.charCodeAt(state.position + 1);
     _line = state.line; // Save the current line.
 
@@ -977,14 +954,9 @@
     // Explicit notation case. There are two separate blocks:
     // first for the key (denoted by "?") and second for the value (denoted by ":")
     //
-    if ((CHAR_QUESTION        === state.character ||
-         CHAR_COLON           === state.character) &&
-        (CHAR_SPACE           === following ||
-         CHAR_TAB             === following ||
-         CHAR_LINE_FEED       === following ||
-         CHAR_CARRIAGE_RETURN === following)) {
+    if ((0x3F/* ? */ === ch || 0x3A/* : */  === ch) && is_WS_OR_EOL(following)) {
 
-      if (CHAR_QUESTION === state.character) {
+      if (0x3F/* ? */ === ch) {
         if (atExplicitKey) {
           storeMappingPair(state, _result, keyTag, keyNode, null);
           keyTag = keyNode = valueNode = null;
@@ -995,7 +967,7 @@
         allowCompact = true;
 
       } else if (atExplicitKey) {
-        // i.e. CHAR_COLON === character after the explicit key.
+        // i.e. 0x3A/* : */ === character after the explicit key.
         atExplicitKey = false;
         allowCompact = true;
 
@@ -1004,25 +976,24 @@
       }
 
       state.position += 1;
-      state.character = following;
+      ch = following;
 
     //
     // Implicit notation case. Flow-style node as the key first, then ":", and the value.
     //
-    } else if (composeNode(state, nodeIndent, CONTEXT_FLOW_OUT, false, true)) {
+    } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {
+
       if (state.line === _line) {
-        while (CHAR_SPACE === state.character ||
-               CHAR_TAB === state.character) {
-          state.character = state.input.charCodeAt(++state.position);
+        ch = state.input.charCodeAt(state.position);
+
+        while (is_WHITE_SPACE(ch)) {
+          ch = state.input.charCodeAt(++state.position);
         }
 
-        if (CHAR_COLON === state.character) {
-          state.character = state.input.charCodeAt(++state.position);
+        if (0x3A/* : */ === ch) {
+          ch = state.input.charCodeAt(++state.position);
 
-          if (CHAR_SPACE           !== state.character &&
-              CHAR_TAB             !== state.character &&
-              CHAR_LINE_FEED       !== state.character &&
-              CHAR_CARRIAGE_RETURN !== state.character) {
+          if (!is_WS_OR_EOL(ch)) {
             throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');
           }
 
@@ -1042,6 +1013,7 @@
 
         } else {
           state.tag = _tag;
+          state.anchor = _anchor;
           return true; // Keep the result of `composeNode`.
         }
 
@@ -1050,6 +1022,7 @@
 
       } else {
         state.tag = _tag;
+        state.anchor = _anchor;
         return true; // Keep the result of `composeNode`.
       }
 
@@ -1075,9 +1048,10 @@
       }
 
       skipSeparationSpace(state, true, -1);
+      ch = state.input.charCodeAt(state.position);
     }
 
-    if (state.lineIndent > nodeIndent && state.position < state.length) {
+    if (state.lineIndent > nodeIndent && (0 !== ch)) {
       throwError(state, 'bad indentation of a mapping entry');
     } else if (state.lineIndent < nodeIndent) {
       break;
@@ -1096,6 +1070,7 @@
   // Expose the resulting mapping.
   if (detected) {
     state.tag = _tag;
+    state.anchor = _anchor;
     state.kind = 'mapping';
     state.result = _result;
   }
@@ -1108,9 +1083,12 @@
       isVerbatim = false,
       isNamed    = false,
       tagHandle,
-      tagName;
+      tagName,
+      ch;
 
-  if (CHAR_EXCLAMATION !== state.character) {
+  ch = state.input.charCodeAt(state.position);
+
+  if (0x21/* ! */ !== ch) {
     return false;
   }
 
@@ -1118,16 +1096,16 @@
     throwError(state, 'duplication of a tag property');
   }
 
-  state.character = state.input.charCodeAt(++state.position);
+  ch = state.input.charCodeAt(++state.position);
 
-  if (CHAR_LESS_THAN === state.character) {
+  if (0x3C/* < */ === ch) {
     isVerbatim = true;
-    state.character = state.input.charCodeAt(++state.position);
+    ch = state.input.charCodeAt(++state.position);
 
-  } else if (CHAR_EXCLAMATION === state.character) {
+  } else if (0x21/* ! */ === ch) {
     isNamed = true;
     tagHandle = '!!';
-    state.character = state.input.charCodeAt(++state.position);
+    ch = state.input.charCodeAt(++state.position);
 
   } else {
     tagHandle = '!';
@@ -1136,23 +1114,19 @@
   _position = state.position;
 
   if (isVerbatim) {
-    do { state.character = state.input.charCodeAt(++state.position); }
-    while (state.position < state.length && CHAR_GREATER_THAN !== state.character);
+    do { ch = state.input.charCodeAt(++state.position); }
+    while (0 !== ch && 0x3E/* > */ !== ch);
 
     if (state.position < state.length) {
       tagName = state.input.slice(_position, state.position);
-      state.character = state.input.charCodeAt(++state.position);
+      ch = state.input.charCodeAt(++state.position);
     } else {
       throwError(state, 'unexpected end of the stream within a verbatim tag');
     }
   } else {
-    while (state.position < state.length &&
-           CHAR_SPACE           !== state.character &&
-           CHAR_TAB             !== state.character &&
-           CHAR_LINE_FEED       !== state.character &&
-           CHAR_CARRIAGE_RETURN !== state.character) {
+    while (0 !== ch && !is_WS_OR_EOL(ch)) {
 
-      if (CHAR_EXCLAMATION === state.character) {
+      if (0x21/* ! */ === ch) {
         if (!isNamed) {
           tagHandle = state.input.slice(_position - 1, state.position + 1);
 
@@ -1167,7 +1141,7 @@
         }
       }
 
-      state.character = state.input.charCodeAt(++state.position);
+      ch = state.input.charCodeAt(++state.position);
     }
 
     tagName = state.input.slice(_position, state.position);
@@ -1201,9 +1175,12 @@
 }
 
 function readAnchorProperty(state) {
-  var _position;
+  var _position,
+      ch;
 
-  if (CHAR_AMPERSAND !== state.character) {
+  ch = state.input.charCodeAt(state.position);
+
+  if (0x26/* & */ !== ch) {
     return false;
   }
 
@@ -1211,20 +1188,11 @@
     throwError(state, 'duplication of an anchor property');
   }
 
-  state.character = state.input.charCodeAt(++state.position);
+  ch = state.input.charCodeAt(++state.position);
   _position = state.position;
 
-  while (state.position < state.length &&
-         CHAR_SPACE                !== state.character &&
-         CHAR_TAB                  !== state.character &&
-         CHAR_LINE_FEED            !== state.character &&
-         CHAR_CARRIAGE_RETURN      !== state.character &&
-         CHAR_COMMA                !== state.character &&
-         CHAR_LEFT_SQUARE_BRACKET  !== state.character &&
-         CHAR_RIGHT_SQUARE_BRACKET !== state.character &&
-         CHAR_LEFT_CURLY_BRACKET   !== state.character &&
-         CHAR_RIGHT_CURLY_BRACKET  !== state.character) {
-    state.character = state.input.charCodeAt(++state.position);
+  while (0 !== ch && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
+    ch = state.input.charCodeAt(++state.position);
   }
 
   if (state.position === _position) {
@@ -1236,26 +1204,22 @@
 }
 
 function readAlias(state) {
-  var _position, alias;
+  var _position, alias,
+      len = state.length,
+      input = state.input,
+      ch;
 
-  if (CHAR_ASTERISK !== state.character) {
+  ch = state.input.charCodeAt(state.position);
+
+  if (0x2A/* * */ !== ch) {
     return false;
   }
 
-  state.character = state.input.charCodeAt(++state.position);
+  ch = state.input.charCodeAt(++state.position);
   _position = state.position;
 
-  while (state.position < state.length &&
-         CHAR_SPACE                !== state.character &&
-         CHAR_TAB                  !== state.character &&
-         CHAR_LINE_FEED            !== state.character &&
-         CHAR_CARRIAGE_RETURN      !== state.character &&
-         CHAR_COMMA                !== state.character &&
-         CHAR_LEFT_SQUARE_BRACKET  !== state.character &&
-         CHAR_RIGHT_SQUARE_BRACKET !== state.character &&
-         CHAR_LEFT_CURLY_BRACKET   !== state.character &&
-         CHAR_RIGHT_CURLY_BRACKET  !== state.character) {
-    state.character = state.input.charCodeAt(++state.position);
+  while (0 !== ch && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {
+    ch = state.input.charCodeAt(++state.position);
   }
 
   if (state.position === _position) {
@@ -1277,8 +1241,8 @@
   var allowBlockStyles,
       allowBlockScalars,
       allowBlockCollections,
+      indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this<parent
       atNewLine  = false,
-      isIndented = true,
       hasContent = false,
       typeIndex,
       typeQuantity,
@@ -1300,33 +1264,28 @@
     if (skipSeparationSpace(state, true, -1)) {
       atNewLine = true;
 
-      if (state.lineIndent === parentIndent) {
-        isIndented = false;
-
-      } else if (state.lineIndent > parentIndent) {
-        isIndented = true;
-
-      } else {
-        return false;
+      if (state.lineIndent > parentIndent) {
+        indentStatus = 1;
+      } else if (state.lineIndent === parentIndent) {
+        indentStatus = 0;
+      } else if (state.lineIndent < parentIndent) {
+        indentStatus = -1;
       }
     }
   }
 
-  if (isIndented) {
+  if (1 === indentStatus) {
     while (readTagProperty(state) || readAnchorProperty(state)) {
       if (skipSeparationSpace(state, true, -1)) {
         atNewLine = true;
+        allowBlockCollections = allowBlockStyles;
 
         if (state.lineIndent > parentIndent) {
-          isIndented = true;
-          allowBlockCollections = allowBlockStyles;
-
+          indentStatus = 1;
         } else if (state.lineIndent === parentIndent) {
-          isIndented = false;
-          allowBlockCollections = allowBlockStyles;
-
-        } else {
-          return true;
+          indentStatus = 0;
+        } else if (state.lineIndent < parentIndent) {
+          indentStatus = -1;
         }
       } else {
         allowBlockCollections = false;
@@ -1338,7 +1297,7 @@
     allowBlockCollections = atNewLine || allowCompact;
   }
 
-  if (isIndented || CONTEXT_BLOCK_OUT === nodeContext) {
+  if (1 === indentStatus || CONTEXT_BLOCK_OUT === nodeContext) {
     if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {
       flowIndent = parentIndent;
     } else {
@@ -1347,10 +1306,10 @@
 
     blockIndent = state.position - state.lineStart;
 
-    if (isIndented) {
+    if (1 === indentStatus) {
       if (allowBlockCollections &&
           (readBlockSequence(state, blockIndent) ||
-           readBlockMapping(state, blockIndent)) ||
+           readBlockMapping(state, blockIndent, flowIndent)) ||
           readFlowCollection(state, flowIndent)) {
         hasContent = true;
       } else {
@@ -1378,7 +1337,9 @@
           state.anchorMap[state.anchor] = state.result;
         }
       }
-    } else {
+    } else if (0 === indentStatus) {
+      // Special case: block sequences are allowed to have same indentation level as the parent.
+      // http://www.yaml.org/spec/1.2/spec.html#id2799784
       hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);
     }
   }
@@ -1394,21 +1355,29 @@
         // non-specific tag is only assigned to plain scalars. So, it isn't
         // needed to check for 'kind' conformity.
 
-        if (type.loadResolver && type.loadResolver(state)) { // `state.result` updated in resolver if matched
+        if (type.resolve(state.result)) { // `state.result` updated in resolver if matched
+          state.result = type.construct(state.result);
           state.tag = type.tag;
+          if (null !== state.anchor) {
+            state.anchorMap[state.anchor] = state.result;
+          }
           break;
         }
-
       }
     } else if (_hasOwnProperty.call(state.typeMap, state.tag)) {
       type = state.typeMap[state.tag];
 
-      if (null !== state.result && type.loadKind !== state.kind) {
-        throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.loadKind + '", not "' + state.kind + '"');
+      if (null !== state.result && type.kind !== state.kind) {
+        throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be "' + type.kind + '", not "' + state.kind + '"');
       }
 
-      if (type.loadResolver && !type.loadResolver(state)) { // `state.result` updated in resolver if matched
+      if (!type.resolve(state.result)) { // `state.result` updated in resolver if matched
         throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');
+      } else {
+        state.result = type.construct(state.result);
+        if (null !== state.anchor) {
+          state.anchorMap[state.anchor] = state.result;
+        }
       }
     } else {
       throwWarning(state, 'unknown tag !<' + state.tag + '>');
@@ -1418,35 +1387,34 @@
   return null !== state.tag || null !== state.anchor || hasContent;
 }
 
-function readDocument(state, iterator) {
+function readDocument(state) {
   var documentStart = state.position,
       _position,
       directiveName,
       directiveArgs,
-      hasDirectives = false;
+      hasDirectives = false,
+      ch;
 
   state.version = null;
   state.checkLineBreaks = state.legacy;
   state.tagMap = {};
   state.anchorMap = {};
 
-  while (state.position < state.length) {
+  while (0 !== (ch = state.input.charCodeAt(state.position))) {
     skipSeparationSpace(state, true, -1);
 
-    if (state.lineIndent > 0 || CHAR_PERCENT !== state.character) {
+    ch = state.input.charCodeAt(state.position);
+
+    if (state.lineIndent > 0 || 0x25/* % */ !== ch) {
       break;
     }
 
     hasDirectives = true;
-    state.character = state.input.charCodeAt(++state.position);
+    ch = state.input.charCodeAt(++state.position);
     _position = state.position;
 
-    while (state.position < state.length &&
-           CHAR_SPACE           !== state.character &&
-           CHAR_TAB             !== state.character &&
-           CHAR_LINE_FEED       !== state.character &&
-           CHAR_CARRIAGE_RETURN !== state.character) {
-      state.character = state.input.charCodeAt(++state.position);
+    while (0 !== ch && !is_WS_OR_EOL(ch)) {
+      ch = state.input.charCodeAt(++state.position);
     }
 
     directiveName = state.input.slice(_position, state.position);
@@ -1456,37 +1424,31 @@
       throwError(state, 'directive name must not be less than one character in length');
     }
 
-    while (state.position < state.length) {
-      while (CHAR_SPACE === state.character || CHAR_TAB === state.character) {
-        state.character = state.input.charCodeAt(++state.position);
+    while (0 !== ch) {
+      while (is_WHITE_SPACE(ch)) {
+        ch = state.input.charCodeAt(++state.position);
       }
 
-      if (CHAR_SHARP === state.character) {
-        do { state.character = state.input.charCodeAt(++state.position); }
-        while (state.position < state.length &&
-               CHAR_LINE_FEED !== state.character &&
-               CHAR_CARRIAGE_RETURN !== state.character);
+      if (0x23/* # */ === ch) {
+        do { ch = state.input.charCodeAt(++state.position); }
+        while (0 !== ch && !is_EOL(ch));
         break;
       }
 
-      if (CHAR_LINE_FEED === state.character || CHAR_CARRIAGE_RETURN === state.character) {
+      if (is_EOL(ch)) {
         break;
       }
 
       _position = state.position;
 
-      while (state.position < state.length &&
-             CHAR_SPACE           !== state.character &&
-             CHAR_TAB             !== state.character &&
-             CHAR_LINE_FEED       !== state.character &&
-             CHAR_CARRIAGE_RETURN !== state.character) {
-        state.character = state.input.charCodeAt(++state.position);
+      while (0 !== ch && !is_WS_OR_EOL(ch)) {
+        ch = state.input.charCodeAt(++state.position);
       }
 
       directiveArgs.push(state.input.slice(_position, state.position));
     }
 
-    if (state.position < state.length) {
+    if (0 !== ch) {
       readLineBreak(state);
     }
 
@@ -1500,11 +1462,10 @@
   skipSeparationSpace(state, true, -1);
 
   if (0 === state.lineIndent &&
-      CHAR_MINUS === state.character &&
-      CHAR_MINUS === state.input.charCodeAt(state.position + 1) &&
-      CHAR_MINUS === state.input.charCodeAt(state.position + 2)) {
+      0x2D/* - */ === state.input.charCodeAt(state.position) &&
+      0x2D/* - */ === state.input.charCodeAt(state.position + 1) &&
+      0x2D/* - */ === state.input.charCodeAt(state.position + 2)) {
     state.position += 3;
-    state.character = state.input.charCodeAt(state.position);
     skipSeparationSpace(state, true, -1);
 
   } else if (hasDirectives) {
@@ -1519,18 +1480,18 @@
     throwWarning(state, 'non-ASCII line breaks are interpreted as content');
   }
 
-  iterator(state.result);
+  state.documents.push(state.result);
 
   if (state.position === state.lineStart && testDocumentSeparator(state)) {
-    if (CHAR_DOT === state.character) {
+
+    if (0x2E/* . */ === state.input.charCodeAt(state.position)) {
       state.position += 3;
-      state.character = state.input.charCodeAt(state.position);
       skipSeparationSpace(state, true, -1);
     }
     return;
   }
 
-  if (state.position < state.length) {
+  if (state.position < (state.length - 1)) {
     throwError(state, 'end of the stream or a document separator is expected');
   } else {
     return;
@@ -1538,42 +1499,57 @@
 }
 
 
-
-function loadAll(input, iterator, options) {
+function loadDocuments(input, options) {
+  input = String(input);
   options = options || {};
 
+  if (0 !== input.length &&
+      0x0A/* LF */ !== input.charCodeAt(input.length - 1) &&
+      0x0D/* CR */ !== input.charCodeAt(input.length - 1)) {
+    input += '\n';
+  }
+
   var state = new State(input, options);
 
   if (PATTERN_NON_PRINTABLE.test(state.input)) {
     throwError(state, 'the stream contains non-printable characters');
   }
 
-  while (CHAR_SPACE === state.character) {
+  // Use 0 as string terminator. That significantly simplifies bounds check.
+  state.input += '\0';
+
+  while (0x20/* Space */ === state.input.charCodeAt(state.position)) {
     state.lineIndent += 1;
-    state.character = state.input.charCodeAt(++state.position);
+    state.position += 1;
   }
 
-  while (state.position < state.length) {
-    readDocument(state, iterator);
+  while (state.position < (state.length - 1)) {
+    readDocument(state);
+  }
+
+  return state.documents;
+}
+
+
+function loadAll(input, iterator, options) {
+  var documents = loadDocuments(input, options), index, length;
+
+  for (index = 0, length = documents.length; index < length; index += 1) {
+    iterator(documents[index]);
   }
 }
 
 
 function load(input, options) {
-  var result = null, received = false;
+  var documents = loadDocuments(input, options), index, length;
 
-  function iterator(data) {
-    if (!received) {
-      result = data;
-      received = true;
-    } else {
-      throw new YAMLException('expected a single document in the stream, but found more');
-    }
+  if (0 === documents.length) {
+    return undefined;
+  } else if (1 === documents.length) {
+    return documents[0];
+  } else {
+    throw new YAMLException('expected a single document in the stream, but found more');
   }
-
-  loadAll(input, iterator, options);
-
-  return result;
 }
 
 
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type.js
index 2d368bf..5e3176c 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type.js
@@ -1,27 +1,24 @@
 'use strict';
 
-
 var YAMLException = require('./exception');
 
-
 var TYPE_CONSTRUCTOR_OPTIONS = [
-  'loadKind',
-  'loadResolver',
-  'dumpInstanceOf',
-  'dumpPredicate',
-  'dumpRepresenter',
-  'dumpDefaultStyle',
-  'dumpStyleAliases'
+  'kind',
+  'resolve',
+  'construct',
+  'instanceOf',
+  'predicate',
+  'represent',
+  'defaultStyle',
+  'styleAliases'
 ];
 
-
 var YAML_NODE_KINDS = [
   'scalar',
   'sequence',
   'mapping'
 ];
 
-
 function compileStyleAliases(map) {
   var result = {};
 
@@ -36,7 +33,6 @@
   return result;
 }
 
-
 function Type(tag, options) {
   options = options || {};
 
@@ -47,19 +43,19 @@
   });
 
   // TODO: Add tag format check.
-  this.tag              = tag;
-  this.loadKind         = options['loadKind']         || null;
-  this.loadResolver     = options['loadResolver']     || null;
-  this.dumpInstanceOf   = options['dumpInstanceOf']   || null;
-  this.dumpPredicate    = options['dumpPredicate']    || null;
-  this.dumpRepresenter  = options['dumpRepresenter']  || null;
-  this.dumpDefaultStyle = options['dumpDefaultStyle'] || null;
-  this.dumpStyleAliases = compileStyleAliases(options['dumpStyleAliases'] || null);
+  this.tag          = tag;
+  this.kind         = options['kind']         || null;
+  this.resolve      = options['resolve']      || function () { return true; };
+  this.construct    = options['construct']    || function (data) { return data; };
+  this.instanceOf   = options['instanceOf']   || null;
+  this.predicate    = options['predicate']    || null;
+  this.represent    = options['represent']    || null;
+  this.defaultStyle = options['defaultStyle'] || null;
+  this.styleAliases = compileStyleAliases(options['styleAliases'] || null);
 
-  if (-1 === YAML_NODE_KINDS.indexOf(this.loadKind)) {
-    throw new YAMLException('Unknown loadKind "' + this.loadKind + '" is specified for "' + tag + '" YAML type.');
+  if (-1 === YAML_NODE_KINDS.indexOf(this.kind)) {
+    throw new YAMLException('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.');
   }
 }
 
-
 module.exports = Type;
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/binary.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/binary.js
index d8617fe..1fdf47d 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/binary.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/binary.js
@@ -1,125 +1,133 @@
-// Modified from:
-// https://raw.github.com/kanaka/noVNC/d890e8640f20fba3215ba7be8e0ff145aeb8c17c/include/base64.js
-
 'use strict';
 
+
 // A trick for browserified version.
 // Since we make browserifier to ignore `buffer` module, NodeBuffer will be undefined
 var NodeBuffer = require('buffer').Buffer;
-
 var Type       = require('../type');
 
 
-
-var BASE64_PADDING = '=';
-
-var BASE64_BINTABLE = [
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-  -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
-  52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1,  0, -1, -1,
-  -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
-  15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
-  -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
-  41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1
-];
-
-var BASE64_CHARTABLE =
-  'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');
+// [ 64, 65, 66 ] -> [ padding, CR, LF ]
+var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r';
 
 
-function resolveYamlBinary(state) {
-  var value, code, idx = 0, result = [], leftbits, leftdata,
-      object = state.result;
+function resolveYamlBinary(data) {
+  if (null === data) {
+    return false;
+  }
 
-  leftbits = 0; // number of bits decoded, but yet to be appended
-  leftdata = 0; // bits decoded, but yet to be appended
+  var code, idx, bitlen = 0, len = 0, max = data.length, map = BASE64_MAP;
 
   // Convert one by one.
-  for (idx = 0; idx < object.length; idx += 1) {
-    code = object.charCodeAt(idx);
-    value = BASE64_BINTABLE[code & 0x7F];
+  for (idx = 0; idx < max; idx ++) {
+    code = map.indexOf(data.charAt(idx));
 
-    // Skip LF(NL) || CR
-    if (0x0A !== code && 0x0D !== code) {
-      // Fail on illegal characters
-      if (-1 === value) {
-        return false;
-      }
+    // Skip CR/LF
+    if (code > 64) { continue; }
 
-      // Collect data into leftdata, update bitcount
-      leftdata = (leftdata << 6) | value;
-      leftbits += 6;
+    // Fail on illegal characters
+    if (code < 0) { return false; }
 
-      // If we have 8 or more bits, append 8 bits to the result
-      if (leftbits >= 8) {
-        leftbits -= 8;
-
-        // Append if not padding.
-        if (BASE64_PADDING !== object.charAt(idx)) {
-          result.push((leftdata >> leftbits) & 0xFF);
-        }
-
-        leftdata &= (1 << leftbits) - 1;
-      }
-    }
+    bitlen += 6;
   }
 
-  // If there are any bits left, the base64 string was corrupted
-  if (leftbits) {
-    return false;
-  } else {
-    // Wrap into Buffer for NodeJS and leave Array for browser
-    if (NodeBuffer) {
-      state.result = new NodeBuffer(result);
-    } else {
-      state.result = result;
-    }
-    return true;
-  }
+  // If there are any bits left, source was corrupted
+  return (bitlen % 8) === 0;
 }
 
+function constructYamlBinary(data) {
+  var code, idx, tailbits,
+      input = data.replace(/[\r\n=]/g, ''), // remove CR/LF & padding to simplify scan
+      max = input.length,
+      map = BASE64_MAP,
+      bits = 0,
+      result = [];
 
-function representYamlBinary(object /*, style*/) {
-  var result = '', index, length, rest;
+  // Collect by 6*4 bits (3 bytes)
 
-  // Convert every three bytes to 4 ASCII characters.
-  for (index = 0, length = object.length - 2; index < length; index += 3) {
-    result += BASE64_CHARTABLE[object[index + 0] >> 2];
-    result += BASE64_CHARTABLE[((object[index + 0] & 0x03) << 4) + (object[index + 1] >> 4)];
-    result += BASE64_CHARTABLE[((object[index + 1] & 0x0F) << 2) + (object[index + 2] >> 6)];
-    result += BASE64_CHARTABLE[object[index + 2] & 0x3F];
+  for (idx = 0; idx < max; idx++) {
+    if ((idx % 4 === 0) && idx) {
+      result.push((bits >> 16) & 0xFF);
+      result.push((bits >> 8) & 0xFF);
+      result.push(bits & 0xFF);
+    }
+
+    bits = (bits << 6) | map.indexOf(input.charAt(idx));
   }
 
-  rest = object.length % 3;
+  // Dump tail
 
-  // Convert the remaining 1 or 2 bytes, padding out to 4 characters.
-  if (0 !== rest) {
-    index = object.length - rest;
-    result += BASE64_CHARTABLE[object[index + 0] >> 2];
+  tailbits = (max % 4)*6;
 
-    if (2 === rest) {
-      result += BASE64_CHARTABLE[((object[index + 0] & 0x03) << 4) + (object[index + 1] >> 4)];
-      result += BASE64_CHARTABLE[(object[index + 1] & 0x0F) << 2];
-      result += BASE64_PADDING;
-    } else {
-      result += BASE64_CHARTABLE[(object[index + 0] & 0x03) << 4];
-      result += BASE64_PADDING + BASE64_PADDING;
-    }
+  if (tailbits === 0) {
+    result.push((bits >> 16) & 0xFF);
+    result.push((bits >> 8) & 0xFF);
+    result.push(bits & 0xFF);
+  } else if (tailbits === 18) {
+    result.push((bits >> 10) & 0xFF);
+    result.push((bits >> 2) & 0xFF);
+  } else if (tailbits === 12) {
+    result.push((bits >> 4) & 0xFF);
+  }
+
+  // Wrap into Buffer for NodeJS and leave Array for browser
+  if (NodeBuffer) {
+    return new NodeBuffer(result);
   }
 
   return result;
 }
 
+function representYamlBinary(object /*, style*/) {
+  var result = '', bits = 0, idx, tail,
+      max = object.length,
+      map = BASE64_MAP;
+
+  // Convert every three bytes to 4 ASCII characters.
+
+  for (idx = 0; idx < max; idx++) {
+    if ((idx % 3 === 0) && idx) {
+      result += map[(bits >> 18) & 0x3F];
+      result += map[(bits >> 12) & 0x3F];
+      result += map[(bits >> 6) & 0x3F];
+      result += map[bits & 0x3F];
+    }
+
+    bits = (bits << 8) + object[idx];
+  }
+
+  // Dump tail
+
+  tail = max % 3;
+
+  if (tail === 0) {
+    result += map[(bits >> 18) & 0x3F];
+    result += map[(bits >> 12) & 0x3F];
+    result += map[(bits >> 6) & 0x3F];
+    result += map[bits & 0x3F];
+  } else if (tail === 2) {
+    result += map[(bits >> 10) & 0x3F];
+    result += map[(bits >> 4) & 0x3F];
+    result += map[(bits << 2) & 0x3F];
+    result += map[64];
+  } else if (tail === 1) {
+    result += map[(bits >> 2) & 0x3F];
+    result += map[(bits << 4) & 0x3F];
+    result += map[64];
+    result += map[64];
+  }
+
+  return result;
+}
 
 function isBinary(object) {
   return NodeBuffer && NodeBuffer.isBuffer(object);
 }
 
-
 module.exports = new Type('tag:yaml.org,2002:binary', {
-  loadKind: 'scalar',
-  loadResolver: resolveYamlBinary,
-  dumpPredicate: isBinary,
-  dumpRepresenter: representYamlBinary
+  kind: 'scalar',
+  resolve: resolveYamlBinary,
+  construct: constructYamlBinary,
+  predicate: isBinary,
+  represent: representYamlBinary
 });
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/bool.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/bool.js
index 9e69f4a..5c2a304 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/bool.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/bool.js
@@ -1,67 +1,37 @@
 'use strict';
 
-
 var Type = require('../type');
 
-
-var YAML_IMPLICIT_BOOLEAN_MAP = {
-  'true'  : true,
-  'True'  : true,
-  'TRUE'  : true,
-  'false' : false,
-  'False' : false,
-  'FALSE' : false
-};
-
-/*var YAML_EXPLICIT_BOOLEAN_MAP = {
-  'true'  : true,
-  'True'  : true,
-  'TRUE'  : true,
-  'false' : false,
-  'False' : false,
-  'FALSE' : false,
-  'y'     : true,
-  'Y'     : true,
-  'yes'   : true,
-  'Yes'   : true,
-  'YES'   : true,
-  'n'     : false,
-  'N'     : false,
-  'no'    : false,
-  'No'    : false,
-  'NO'    : false,
-  'on'    : true,
-  'On'    : true,
-  'ON'    : true,
-  'off'   : false,
-  'Off'   : false,
-  'OFF'   : false
-};*/
-
-
-function resolveYamlBoolean(state) {
-  if (YAML_IMPLICIT_BOOLEAN_MAP.hasOwnProperty(state.result)) {
-    state.result = YAML_IMPLICIT_BOOLEAN_MAP[state.result];
-    return true;
-  } else {
+function resolveYamlBoolean(data) {
+  if (null === data) {
     return false;
   }
+
+  var max = data.length;
+
+  return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||
+         (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));
 }
 
+function constructYamlBoolean(data) {
+  return data === 'true' ||
+         data === 'True' ||
+         data === 'TRUE';
+}
 
 function isBoolean(object) {
   return '[object Boolean]' === Object.prototype.toString.call(object);
 }
 
-
 module.exports = new Type('tag:yaml.org,2002:bool', {
-  loadKind: 'scalar',
-  loadResolver: resolveYamlBoolean,
-  dumpPredicate: isBoolean,
-  dumpRepresenter: {
+  kind: 'scalar',
+  resolve: resolveYamlBoolean,
+  construct: constructYamlBoolean,
+  predicate: isBoolean,
+  represent: {
     lowercase: function (object) { return object ? 'true' : 'false'; },
     uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },
     camelcase: function (object) { return object ? 'True' : 'False'; }
   },
-  dumpDefaultStyle: 'lowercase'
+  defaultStyle: 'lowercase'
 });
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/float.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/float.js
index 644ff4b..9e3eff4 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/float.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/float.js
@@ -1,8 +1,7 @@
 'use strict';
 
-
-var Type = require('../type');
-
+var common = require('../common');
+var Type   = require('../type');
 
 var YAML_FLOAT_PATTERN = new RegExp(
   '^(?:[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+][0-9]+)?' +
@@ -11,16 +10,23 @@
   '|[-+]?\\.(?:inf|Inf|INF)' +
   '|\\.(?:nan|NaN|NAN))$');
 
-
-function resolveYamlFloat(state) {
-  var value, sign, base, digits,
-      object = state.result;
-
-  if (!YAML_FLOAT_PATTERN.test(object)) {
+function resolveYamlFloat(data) {
+  if (null === data) {
     return false;
   }
 
-  value  = object.replace(/_/g, '').toLowerCase();
+  var value, sign, base, digits;
+
+  if (!YAML_FLOAT_PATTERN.test(data)) {
+    return false;
+  }
+  return true;
+}
+
+function constructYamlFloat(data) {
+  var value, sign, base, digits;
+
+  value  = data.replace(/_/g, '').toLowerCase();
   sign   = '-' === value[0] ? -1 : 1;
   digits = [];
 
@@ -29,12 +35,10 @@
   }
 
   if ('.inf' === value) {
-    state.result = (1 === sign) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;
-    return true;
+    return (1 === sign) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;
 
   } else if ('.nan' === value) {
-    state.result = NaN;
-    return true;
+    return NaN;
 
   } else if (0 <= value.indexOf(':')) {
     value.split(':').forEach(function (v) {
@@ -49,16 +53,13 @@
       base *= 60;
     });
 
-    state.result = sign * value;
-    return true;
+    return sign * value;
 
   } else {
-    state.result = sign * parseFloat(value, 10);
-    return true;
+    return sign * parseFloat(value, 10);
   }
 }
 
-
 function representYamlFloat(object, style) {
   if (isNaN(object)) {
     switch (style) {
@@ -87,22 +88,23 @@
     case 'camelcase':
       return '-.Inf';
     }
+  } else if (common.isNegativeZero(object)) {
+    return '-0.0';
   } else {
     return object.toString(10);
   }
 }
 
-
 function isFloat(object) {
   return ('[object Number]' === Object.prototype.toString.call(object)) &&
-         (0 !== object % 1);
+         (0 !== object % 1 || common.isNegativeZero(object));
 }
 
-
 module.exports = new Type('tag:yaml.org,2002:float', {
-  loadKind: 'scalar',
-  loadResolver: resolveYamlFloat,
-  dumpPredicate: isFloat,
-  dumpRepresenter: representYamlFloat,
-  dumpDefaultStyle: 'lowercase'
+  kind: 'scalar',
+  resolve: resolveYamlFloat,
+  construct: constructYamlFloat,
+  predicate: isFloat,
+  represent: representYamlFloat,
+  defaultStyle: 'lowercase'
 });
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/int.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/int.js
index 81b1ef8..efada88 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/int.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/int.js
@@ -1,50 +1,143 @@
 'use strict';
 
+var common = require('../common');
+var Type   = require('../type');
 
-var Type = require('../type');
+function isHexCode(c) {
+  return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||
+         ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||
+         ((0x61/* a */ <= c) && (c <= 0x66/* f */));
+}
 
+function isOctCode(c) {
+  return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));
+}
 
-var YAML_INTEGER_PATTERN = new RegExp(
-  '^(?:[-+]?0b[0-1_]+' +
-  '|[-+]?0[0-7_]+' +
-  '|[-+]?(?:0|[1-9][0-9_]*)' +
-  '|[-+]?0x[0-9a-fA-F_]+' +
-  '|[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$');
+function isDecCode(c) {
+  return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));
+}
 
-
-function resolveYamlInteger(state) {
-  var value, sign, base, digits,
-      object = state.result;
-
-  if (!YAML_INTEGER_PATTERN.test(object)) {
+function resolveYamlInteger(data) {
+  if (null === data) {
     return false;
   }
 
-  value  = object.replace(/_/g, '');
-  sign   = '-' === value[0] ? -1 : 1;
-  digits = [];
+  var max = data.length,
+      index = 0,
+      hasDigits = false,
+      ch;
 
-  if (0 <= '+-'.indexOf(value[0])) {
+  if (!max) { return false; }
+
+  ch = data[index];
+
+  // sign
+  if (ch === '-' || ch === '+') {
+    ch = data[++index];
+  }
+
+  if (ch === '0') {
+    // 0
+    if (index+1 === max) { return true; }
+    ch = data[++index];
+
+    // base 2, base 8, base 16
+
+    if (ch === 'b') {
+      // base 2
+      index++;
+
+      for (; index < max; index++) {
+        ch = data[index];
+        if (ch === '_') { continue; }
+        if (ch !== '0' && ch !== '1') {
+          return false;
+        }
+        hasDigits = true;
+      }
+      return hasDigits;
+    }
+
+
+    if (ch === 'x') {
+      // base 16
+      index++;
+
+      for (; index < max; index++) {
+        ch = data[index];
+        if (ch === '_') { continue; }
+        if (!isHexCode(data.charCodeAt(index))) {
+          return false;
+        }
+        hasDigits = true;
+      }
+      return hasDigits;
+    }
+
+    // base 8
+    for (; index < max; index++) {
+      ch = data[index];
+      if (ch === '_') { continue; }
+      if (!isOctCode(data.charCodeAt(index))) {
+        return false;
+      }
+      hasDigits = true;
+    }
+    return hasDigits;
+  }
+
+  // base 10 (except 0) or base 60
+
+  for (; index < max; index++) {
+    ch = data[index];
+    if (ch === '_') { continue; }
+    if (ch === ':') { break; }
+    if (!isDecCode(data.charCodeAt(index))) {
+      return false;
+    }
+    hasDigits = true;
+  }
+
+  if (!hasDigits) { return false; }
+
+  // if !base60 - done;
+  if (ch !== ':') { return true; }
+
+  // base60 almost not used, no needs to optimize
+  return /^(:[0-5]?[0-9])+$/.test(data.slice(index));
+}
+
+function constructYamlInteger(data) {
+  var value = data, sign = 1, ch, base, digits = [];
+
+  if (value.indexOf('_') !== -1) {
+    value = value.replace(/_/g, '');
+  }
+
+  ch = value[0];
+
+  if (ch === '-' || ch === '+') {
+    if (ch === '-') { sign = -1; }
     value = value.slice(1);
+    ch = value[0];
   }
 
   if ('0' === value) {
-    state.result = 0;
-    return true;
+    return 0;
+  }
 
-  } else if (/^0b/.test(value)) {
-    state.result = sign * parseInt(value.slice(2), 2);
-    return true;
+  if (ch === '0') {
+    if (value[1] === 'b') {
+      return sign * parseInt(value.slice(2), 2);
+    }
+    if (value[1] === 'x') {
+      return sign * parseInt(value, 16);
+    }
+    return sign * parseInt(value, 8);
 
-  } else if (/^0x/.test(value)) {
-    state.result = sign * parseInt(value, 16);
-    return true;
+  }
 
-  } else if ('0' === value[0]) {
-    state.result = sign * parseInt(value, 8);
-    return true;
-
-  } else if (0 <= value.indexOf(':')) {
+  if (value.indexOf(':') !== -1) {
     value.split(':').forEach(function (v) {
       digits.unshift(parseInt(v, 10));
     });
@@ -57,34 +150,31 @@
       base *= 60;
     });
 
-    state.result = sign * value;
-    return true;
+    return sign * value;
 
-  } else {
-    state.result = sign * parseInt(value, 10);
-    return true;
   }
-}
 
+  return sign * parseInt(value, 10);
+}
 
 function isInteger(object) {
   return ('[object Number]' === Object.prototype.toString.call(object)) &&
-         (0 === object % 1);
+         (0 === object % 1 && !common.isNegativeZero(object));
 }
 
-
 module.exports = new Type('tag:yaml.org,2002:int', {
-  loadKind: 'scalar',
-  loadResolver: resolveYamlInteger,
-  dumpPredicate: isInteger,
-  dumpRepresenter: {
+  kind: 'scalar',
+  resolve: resolveYamlInteger,
+  construct: constructYamlInteger,
+  predicate: isInteger,
+  represent: {
     binary:      function (object) { return '0b' + object.toString(2); },
     octal:       function (object) { return '0'  + object.toString(8); },
     decimal:     function (object) { return        object.toString(10); },
     hexadecimal: function (object) { return '0x' + object.toString(16).toUpperCase(); }
   },
-  dumpDefaultStyle: 'decimal',
-  dumpStyleAliases: {
+  defaultStyle: 'decimal',
+  styleAliases: {
     binary:      [ 2,  'bin' ],
     octal:       [ 8,  'oct' ],
     decimal:     [ 10, 'dec' ],
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/js/function.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/js/function.js
index 65dcf7f..05eface 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/js/function.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/js/function.js
@@ -1,6 +1,5 @@
 'use strict';
 
-
 var esprima;
 
 // Browserified version does not have esprima
@@ -14,18 +13,18 @@
   esprima = require('esprima');
 } catch (_) {
   /*global window */
-  if (window) { esprima = window.esprima; }
+  if (typeof window !== 'undefined') { esprima = window.esprima; }
 }
 
-
 var Type = require('../../type');
 
-
-function resolveJavascriptFunction(state) {
-  /*jslint evil:true*/
+function resolveJavascriptFunction(data) {
+  if (null === data) {
+    return false;
+  }
 
   try {
-    var source = '(' + state.result + ')',
+    var source = '(' + data + ')',
         ast    = esprima.parse(source, { range: true }),
         params = [],
         body;
@@ -37,35 +36,50 @@
       return false;
     }
 
-    ast.body[0].expression.params.forEach(function (param) {
-      params.push(param.name);
-    });
-
-    body = ast.body[0].expression.body.range;
-
-    // Esprima's ranges include the first '{' and the last '}' characters on
-    // function expressions. So cut them out.
-    state.result = new Function(params, source.slice(body[0]+1, body[1]-1));
     return true;
   } catch (err) {
     return false;
   }
 }
 
+function constructJavascriptFunction(data) {
+  /*jslint evil:true*/
+
+  var source = '(' + data + ')',
+      ast    = esprima.parse(source, { range: true }),
+      params = [],
+      body;
+
+  if ('Program'             !== ast.type         ||
+      1                     !== ast.body.length  ||
+      'ExpressionStatement' !== ast.body[0].type ||
+      'FunctionExpression'  !== ast.body[0].expression.type) {
+    throw new Error('Failed to resolve function');
+  }
+
+  ast.body[0].expression.params.forEach(function (param) {
+    params.push(param.name);
+  });
+
+  body = ast.body[0].expression.body.range;
+
+  // Esprima's ranges include the first '{' and the last '}' characters on
+  // function expressions. So cut them out.
+  return new Function(params, source.slice(body[0]+1, body[1]-1));
+}
 
 function representJavascriptFunction(object /*, style*/) {
   return object.toString();
 }
 
-
 function isFunction(object) {
   return '[object Function]' === Object.prototype.toString.call(object);
 }
 
-
 module.exports = new Type('tag:yaml.org,2002:js/function', {
-  loadKind: 'scalar',
-  loadResolver: resolveJavascriptFunction,
-  dumpPredicate: isFunction,
-  dumpRepresenter: representJavascriptFunction
+  kind: 'scalar',
+  resolve: resolveJavascriptFunction,
+  construct: constructJavascriptFunction,
+  predicate: isFunction,
+  represent: representJavascriptFunction
 });
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js
index b38cb6d..07ef521 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js
@@ -1,28 +1,57 @@
 'use strict';
 
-
 var Type = require('../../type');
 
+function resolveJavascriptRegExp(data) {
+  if (null === data) {
+    return false;
+  }
 
-function resolveJavascriptRegExp(state) {
-  var regexp = state.result,
-      tail   = /\/([gim]*)$/.exec(state.result),
-      modifiers;
+  if (0 === data.length) {
+    return false;
+  }
 
-  // `/foo/gim` - tail can be maximum 4 chars
-  if ('/' === regexp[0] && tail && 4 >= tail[0].length) {
-    regexp = regexp.slice(1, regexp.length - tail[0].length);
-    modifiers = tail[1];
+  var regexp = data,
+      tail   = /\/([gim]*)$/.exec(data),
+      modifiers = '';
+
+  // if regexp starts with '/' it can have modifiers and must be properly closed
+  // `/foo/gim` - modifiers tail can be maximum 3 chars
+  if ('/' === regexp[0]) {
+    if (tail) {
+      modifiers = tail[1];
+    }
+
+    if (modifiers.length > 3) { return false; }
+    // if expression starts with /, is should be properly terminated
+    if (regexp[regexp.length - modifiers.length - 1] !== '/') { return false; }
+
+    regexp = regexp.slice(1, regexp.length - modifiers.length - 1);
   }
 
   try {
-    state.result =  new RegExp(regexp, modifiers);
+    var dummy = new RegExp(regexp, modifiers);
     return true;
   } catch (error) {
     return false;
   }
 }
 
+function constructJavascriptRegExp(data) {
+  var regexp = data,
+      tail   = /\/([gim]*)$/.exec(data),
+      modifiers = '';
+
+  // `/foo/gim` - tail can be maximum 4 chars
+  if ('/' === regexp[0]) {
+    if (tail) {
+      modifiers = tail[1];
+    }
+    regexp = regexp.slice(1, regexp.length - modifiers.length - 1);
+  }
+
+  return new RegExp(regexp, modifiers);
+}
 
 function representJavascriptRegExp(object /*, style*/) {
   var result = '/' + object.source + '/';
@@ -42,15 +71,14 @@
   return result;
 }
 
-
 function isRegExp(object) {
   return '[object RegExp]' === Object.prototype.toString.call(object);
 }
 
-
 module.exports = new Type('tag:yaml.org,2002:js/regexp', {
-  loadKind: 'scalar',
-  loadResolver: resolveJavascriptRegExp,
-  dumpPredicate: isRegExp,
-  dumpRepresenter: representJavascriptRegExp
+  kind: 'scalar',
+  resolve: resolveJavascriptRegExp,
+  construct: constructJavascriptRegExp,
+  predicate: isRegExp,
+  represent: representJavascriptRegExp
 });
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js
index 31b8cfd..1a2f41a 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js
@@ -1,28 +1,27 @@
 'use strict';
 
-
 var Type = require('../../type');
 
-
-function resolveJavascriptUndefined(state) {
-  state.result = undefined;
+function resolveJavascriptUndefined() {
   return true;
 }
 
-
-function representJavascriptUndefined(/*object, explicit*/) {
-  return '';
+function constructJavascriptUndefined() {
+  return undefined;
 }
 
+function representJavascriptUndefined() {
+  return '';
+}
 
 function isUndefined(object) {
   return 'undefined' === typeof object;
 }
 
-
 module.exports = new Type('tag:yaml.org,2002:js/undefined', {
-  loadKind: 'scalar',
-  loadResolver: resolveJavascriptUndefined,
-  dumpPredicate: isUndefined,
-  dumpRepresenter: representJavascriptUndefined
+  kind: 'scalar',
+  resolve: resolveJavascriptUndefined,
+  construct: constructJavascriptUndefined,
+  predicate: isUndefined,
+  represent: representJavascriptUndefined
 });
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/map.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/map.js
index 5e2fcde..dab9838 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/map.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/map.js
@@ -1,9 +1,8 @@
 'use strict';
 
-
 var Type = require('../type');
 
-
 module.exports = new Type('tag:yaml.org,2002:map', {
-  loadKind: 'mapping'
+  kind: 'mapping',
+  construct: function (data) { return null !== data ? data : {}; }
 });
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/merge.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/merge.js
index 450809c..29fa382 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/merge.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/merge.js
@@ -1,15 +1,12 @@
 'use strict';
 
-
 var Type = require('../type');
 
-
-function resolveYamlMerge(state) {
-  return '<<' === state.result;
+function resolveYamlMerge(data) {
+  return '<<' === data || null === data;
 }
 
-
 module.exports = new Type('tag:yaml.org,2002:merge', {
-  loadKind: 'scalar',
-  loadResolver: resolveYamlMerge
+  kind: 'scalar',
+  resolve: resolveYamlMerge
 });
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/null.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/null.js
index 3ea02df..3474055 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/null.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/null.js
@@ -1,40 +1,36 @@
 'use strict';
 
-
 var Type = require('../type');
 
-
-var YAML_NULL_MAP = {
-  '~'    : true,
-  'null' : true,
-  'Null' : true,
-  'NULL' : true
-};
-
-
-function resolveYamlNull(state) {
-  if (YAML_NULL_MAP.hasOwnProperty(state.result)) {
-    state.result = null;
+function resolveYamlNull(data) {
+  if (null === data) {
     return true;
   }
-  return false;
+
+  var max = data.length;
+
+  return (max === 1 && data === '~') ||
+         (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));
 }
 
+function constructYamlNull() {
+  return null;
+}
 
 function isNull(object) {
   return null === object;
 }
 
-
 module.exports = new Type('tag:yaml.org,2002:null', {
-  loadKind: 'scalar',
-  loadResolver: resolveYamlNull,
-  dumpPredicate: isNull,
-  dumpRepresenter: {
+  kind: 'scalar',
+  resolve: resolveYamlNull,
+  construct: constructYamlNull,
+  predicate: isNull,
+  represent: {
     canonical: function () { return '~';    },
     lowercase: function () { return 'null'; },
     uppercase: function () { return 'NULL'; },
     camelcase: function () { return 'Null'; }
   },
-  dumpDefaultStyle: 'lowercase'
+  defaultStyle: 'lowercase'
 });
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/omap.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/omap.js
index cbb21bd..f956459 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/omap.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/omap.js
@@ -1,16 +1,17 @@
 'use strict';
 
-
 var Type = require('../type');
 
-
 var _hasOwnProperty = Object.prototype.hasOwnProperty;
 var _toString       = Object.prototype.toString;
 
+function resolveYamlOmap(data) {
+  if (null === data) {
+    return true;
+  }
 
-function resolveYamlOmap(state) {
   var objectKeys = [], index, length, pair, pairKey, pairHasKey,
-      object = state.result;
+      object = data;
 
   for (index = 0, length = object.length; index < length; index += 1) {
     pair = object[index];
@@ -44,8 +45,12 @@
   return true;
 }
 
+function constructYamlOmap(data) {
+  return null !== data ? data : [];
+}
 
 module.exports = new Type('tag:yaml.org,2002:omap', {
-  loadKind: 'sequence',
-  loadResolver: resolveYamlOmap
+  kind: 'sequence',
+  resolve: resolveYamlOmap,
+  construct: constructYamlOmap
 });
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/pairs.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/pairs.js
index da3a02d..02a0af6 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/pairs.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/pairs.js
@@ -1,15 +1,16 @@
 'use strict';
 
-
 var Type = require('../type');
 
-
 var _toString = Object.prototype.toString;
 
+function resolveYamlPairs(data) {
+  if (null === data) {
+    return true;
+  }
 
-function resolveYamlPairs(state) {
   var index, length, pair, keys, result,
-      object = state.result;
+      object = data;
 
   result = new Array(object.length);
 
@@ -29,12 +30,32 @@
     result[index] = [ keys[0], pair[keys[0]] ];
   }
 
-  state.result = result;
   return true;
 }
 
+function constructYamlPairs(data) {
+  if (null === data) {
+    return [];
+  }
+
+  var index, length, pair, keys, result,
+      object = data;
+
+  result = new Array(object.length);
+
+  for (index = 0, length = object.length; index < length; index += 1) {
+    pair = object[index];
+
+    keys = Object.keys(pair);
+
+    result[index] = [ keys[0], pair[keys[0]] ];
+  }
+
+  return result;
+}
 
 module.exports = new Type('tag:yaml.org,2002:pairs', {
-  loadKind: 'sequence',
-  loadResolver: resolveYamlPairs
+  kind: 'sequence',
+  resolve: resolveYamlPairs,
+  construct: constructYamlPairs
 });
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/seq.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/seq.js
index 8c20122..5b860a2 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/seq.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/seq.js
@@ -1,9 +1,8 @@
 'use strict';
 
-
 var Type = require('../type');
 
-
 module.exports = new Type('tag:yaml.org,2002:seq', {
-  loadKind: 'sequence'
+  kind: 'sequence',
+  construct: function (data) { return null !== data ? data : []; }
 });
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/set.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/set.js
index 5b99218..64d29e9 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/set.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/set.js
@@ -1,14 +1,15 @@
 'use strict';
 
-
 var Type = require('../type');
 
-
 var _hasOwnProperty = Object.prototype.hasOwnProperty;
 
+function resolveYamlSet(data) {
+  if (null === data) {
+    return true;
+  }
 
-function resolveYamlSet(state) {
-  var key, object = state.result;
+  var key, object = data;
 
   for (key in object) {
     if (_hasOwnProperty.call(object, key)) {
@@ -21,8 +22,12 @@
   return true;
 }
 
+function constructYamlSet(data) {
+  return null !== data ? data : {};
+}
 
 module.exports = new Type('tag:yaml.org,2002:set', {
-  loadKind: 'mapping',
-  loadResolver: resolveYamlSet
+  kind: 'mapping',
+  resolve: resolveYamlSet,
+  construct: constructYamlSet
 });
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/str.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/str.js
index 35a82ad..8b5284f 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/str.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/str.js
@@ -1,9 +1,8 @@
 'use strict';
 
-
 var Type = require('../type');
 
-
 module.exports = new Type('tag:yaml.org,2002:str', {
-  loadKind: 'scalar'
+  kind: 'scalar',
+  construct: function (data) { return null !== data ? data : ''; }
 });
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/timestamp.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/timestamp.js
index 34aa693..dc8cf15 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/timestamp.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/lib/js-yaml/type/timestamp.js
@@ -1,9 +1,7 @@
 'use strict';
 
-
 var Type = require('../type');
 
-
 var YAML_TIMESTAMP_REGEXP = new RegExp(
   '^([0-9][0-9][0-9][0-9])'          + // [1] year
   '-([0-9][0-9]?)'                   + // [2] month
@@ -16,17 +14,33 @@
   '(?:[ \\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour
   '(?::([0-9][0-9]))?))?)?$');         // [11] tz_minute
 
+function resolveYamlTimestamp(data) {
+  if (null === data) {
+    return false;
+  }
 
-function resolveYamlTimestamp(state) {
   var match, year, month, day, hour, minute, second, fraction = 0,
-      delta = null, tz_hour, tz_minute, data;
+      delta = null, tz_hour, tz_minute, date;
 
-  match = YAML_TIMESTAMP_REGEXP.exec(state.result);
+  match = YAML_TIMESTAMP_REGEXP.exec(data);
 
   if (null === match) {
     return false;
   }
 
+  return true;
+}
+
+function constructYamlTimestamp(data) {
+  var match, year, month, day, hour, minute, second, fraction = 0,
+      delta = null, tz_hour, tz_minute, date;
+
+  match = YAML_TIMESTAMP_REGEXP.exec(data);
+
+  if (null === match) {
+    throw new Error('Date resolve error');
+  }
+
   // match: [1] year [2] month [3] day
 
   year = +(match[1]);
@@ -34,8 +48,7 @@
   day = +(match[3]);
 
   if (!match[4]) { // no hour
-    state.result = new Date(Date.UTC(year, month, day));
-    return true;
+    return new Date(Date.UTC(year, month, day));
   }
 
   // match: [4] hour [5] minute [6] second [7] fraction
@@ -63,25 +76,23 @@
     }
   }
 
-  data = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));
+  date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));
 
   if (delta) {
-    data.setTime(data.getTime() - delta);
+    date.setTime(date.getTime() - delta);
   }
 
-  state.result = data;
-  return true;
+  return date;
 }
 
-
 function representYamlTimestamp(object /*, style*/) {
   return object.toISOString();
 }
 
-
 module.exports = new Type('tag:yaml.org,2002:timestamp', {
-  loadKind: 'scalar',
-  loadResolver: resolveYamlTimestamp,
-  dumpInstanceOf: Date,
-  dumpRepresenter: representYamlTimestamp
+  kind: 'scalar',
+  resolve: resolveYamlTimestamp,
+  construct: constructYamlTimestamp,
+  instanceOf: Date,
+  represent: representYamlTimestamp
 });
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/package.json b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/package.json
index 9fbb64f..443187d 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/package.json
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/js-yaml/package.json
@@ -1,6 +1,6 @@
 {
   "name": "js-yaml",
-  "version": "3.0.2",
+  "version": "3.2.5",
   "description": "YAML 1.2 parser and serializer",
   "keywords": [
     "yaml",
@@ -50,14 +50,19 @@
     "esprima": "~ 1.0.2"
   },
   "devDependencies": {
+    "ansi": "*",
+    "benchmark": "*",
     "mocha": "*"
   },
   "browser": {
-    "./index.js": "./index_browser.js",
     "buffer": false
   },
-  "readme": "JS-YAML - YAML 1.2 parser and serializer for JavaScript\n=======================================================\n\n[![Build Status](https://secure.travis-ci.org/nodeca/js-yaml.png)](http://travis-ci.org/nodeca/js-yaml)\n\n[Online Demo](http://nodeca.github.com/js-yaml/)\n\n\nThis is an implementation of [YAML](http://yaml.org/), a human friendly data\nserialization language. Started as [PyYAML](http://pyyaml.org/) port, it was\ncompletely rewritten from scratch. Now it's very fast, and supports 1.2 spec.\n\n\nInstallation\n------------\n\n### YAML module for node.js\n\n```\nnpm install js-yaml\n```\n\n\n### CLI executable\n\nIf you want to inspect your YAML files from CLI, install js-yaml globally:\n\n```\nnpm install -g js-yaml\n```\n\n#### Usage\n\n```\nusage: js-yaml [-h] [-v] [-c] [-t] file\n\nPositional arguments:\n  file           File with YAML document(s)\n\nOptional arguments:\n  -h, --help     Show this help message and exit.\n  -v, --version  Show program's version number and exit.\n  -c, --compact  Display errors in compact mode\n  -t, --trace    Show stack trace on error\n```\n\n\n### Bundled YAML library for browsers\n\n``` html\n<!-- esprima required only for !!js/function -->\n<script src=\"esprima.js\"></script>\n<script src=\"js-yaml.min.js\"></script>\n<script type=\"text/javascript\">\nvar doc = jsyaml.load('greeting: hello\\nname: world');\n</script>\n```\n\nBrowser support was done mostly for online demo. If you find any errors - feel\nfree to send pull requests with fixes. Also note, that IE and other old browsers\nneeds [es5-shims](https://github.com/kriskowal/es5-shim) to operate.\n\nNotes:\n\n1. We have no resourses to support browserified version. Don't expect it to be\n   well tested. Don't expect fast fixes if something goes wrong there.\n2. `!!js/function` in browser bundle will not work by default. If you really need\n   it - load `esprima` parser first (via amd or directly).\n3. `!!bin` in browser will return `Array`, because browsers do not support\n   node.js `Buffer` and adding Buffer shims is completely useless on practice.\n\n\nAPI\n---\n\nHere we cover the most 'useful' methods. If you need advanced details (creating\nyour own tags), see [wiki](https://github.com/nodeca/js-yaml/wiki) and\n[examples](https://github.com/nodeca/js-yaml/tree/master/examples) for more\ninfo.\n\n``` javascript\nyaml = require('js-yaml');\nfs   = require('fs');\n\n// Get document, or throw exception on error\ntry {\n  var doc = yaml.safeLoad(fs.readFileSync('/home/ixti/example.yml', 'utf8'));\n  console.log(doc);\n} catch (e) {\n  console.log(e);\n}\n```\n\n\n### safeLoad (string [ , options ])\n\n**Recommended loading way.** Parses `string` as single YAML document. Returns a JavaScript\nobject or throws `YAMLException` on error. By default, does not support regexps,\nfunctions and undefined. This method is safe for untrusted data.\n\noptions:\n\n- `filename` _(default: null)_ - string to be used as a file path in\n  error/warning messages.\n- `strict` _(default - false)_ makes the loader to throw errors instead of\n  warnings.\n- `schema` _(default: `DEFAULT_SAFE_SCHEMA`)_ - specifies a schema to use.\n  - `FAILSAFE_SCHEMA` - only strings, arrays and plain objects:\n    http://www.yaml.org/spec/1.2/spec.html#id2802346\n  - `JSON_SCHEMA` - all JSON-supported types:\n    http://www.yaml.org/spec/1.2/spec.html#id2803231\n  - `CORE_SCHEMA` - same as `JSON_SCHEMA`:\n    http://www.yaml.org/spec/1.2/spec.html#id2804923\n  - `DEFAULT_SAFE_SCHEMA` - all supported YAML types, without unsafe ones\n    (`!!js/undefined`, `!!js/regexp` and `!!js/function`):\n    http://yaml.org/type/\n  - `DEFAULT_FULL_SCHEMA` - all supported YAML types.\n\nNOTE: This function **does not** understand multi-document sources, it throws\nexception on those.\n\nNOTE: JS-YAML **does not** support schema-specific tag resolution restrictions.\nSo, JSON schema is not as strict as defined in the YAML specification.\nIt allows numbers in any notaion, use `Null` and `NULL` as `null`, etc.\nCore schema also has no such restrictions. It allows binary notation for integers.\n\n\n### load (string [ , options ])\n\n**Use with care with untrusted sources**. The same as `safeLoad()` but uses\n`DEFAULT_FULL_SCHEMA` by default - adds some JavaScript-specific types:\n`!!js/function`, `!!js/regexp` and `!!js/undefined`. For untrusted sources you\nmust additionally validate object structure, to avoid injections:\n\n``` javascript\nvar untrusted_code = '\"toString\": !<tag:yaml.org,2002:js/function> \"function (){very_evil_thing();}\"';\n\n// I'm just converting that string, what could possibly go wrong?\nrequire('js-yaml').load(untrusted_code) + ''\n```\n\n\n### safeLoadAll (string, iterator [ , options ])\n\nSame as `safeLoad()`, but understands multi-document sources and apply\n`iterator` to each document.\n\n``` javascript\nvar yaml = require('js-yaml');\n\nyaml.safeLoadAll(data, function (doc) {\n  console.log(doc);\n});\n```\n\n\n### loadAll (string, iterator [ , options ])\n\nSame as `safeLoadAll()` but uses `DEFAULT_FULL_SCHEMA` by default.\n\n\n### safeDump (object [ , options ])\n\nSerializes `object` as YAML document. Uses `DEFAULT_SAFE_SCHEMA`, so it will\nthrow exception if you try to dump regexps or functions. However, you can\ndisable exceptions by `skipInvalid` option.\n\noptions:\n\n- `indent` _(default: 2)_ - indentation width to use (in spaces).\n- `skipInvalid` _(default: false)_ - do not throw on invalid types (like function\n  in the safe schema) and skip pairs and single values with such types.\n- `flowLevel` (default: -1) - specifies level of nesting, when to switch from\n  block to flow style for collections. -1 means block style everwhere\n- `styles` - \"tag\" => \"style\" map. Each tag may have own set of styles.\n- `schema` _(default: `DEFAULT_SAFE_SCHEMA`)_ specifies a schema to use.\n\nstyles:\n\n``` none\n!!null\n  \"canonical\"   => \"~\"\n\n!!int\n  \"binary\"      => \"0b1\", \"0b101010\", \"0b1110001111010\"\n  \"octal\"       => \"01\", \"052\", \"016172\"\n  \"decimal\"     => \"1\", \"42\", \"7290\"\n  \"hexadecimal\" => \"0x1\", \"0x2A\", \"0x1C7A\"\n\n!!null, !!bool, !!float\n  \"lowercase\"   => \"null\", \"true\", \"false\", \".nan\", '.inf'\n  \"uppercase\"   => \"NULL\", \"TRUE\", \"FALSE\", \".NAN\", '.INF'\n  \"camelcase\"   => \"Null\", \"True\", \"False\", \".NaN\", '.Inf'\n```\n\nBy default, !!int uses `decimal`, and !!null, !!bool, !!float use `lowercase`.\n\n\n\n### dump (object [ , options ])\n\nSame as `safeDump()` but without limits (uses `DEFAULT_FULL_SCHEMA` by default).\n\n\nSupported YAML types\n--------------------\n\nThe list of standard YAML tags and corresponding JavaScipt types. See also\n[YAML tag discussion](http://pyyaml.org/wiki/YAMLTagDiscussion) and\n[YAML types repository](http://yaml.org/type/).\n\n```\n!!null ''                   # null\n!!bool 'yes'                # bool\n!!int '3...'                # number\n!!float '3.14...'           # number\n!!binary '...base64...'     # buffer\n!!timestamp 'YYYY-...'      # date\n!!omap [ ... ]              # array of key-value pairs\n!!pairs [ ... ]             # array or array pairs\n!!set { ... }               # array of objects with given keys and null values\n!!str '...'                 # string\n!!seq [ ... ]               # array\n!!map { ... }               # object\n```\n\n**JavaScript-specific tags**\n\n```\n!!js/regexp /pattern/gim            # RegExp\n!!js/undefined ''                   # Undefined\n!!js/function 'function () {...}'   # Function\n```\n\nCaveats\n-------\n\nNote, that you use arrays or objects as key in JS-YAML. JS do not allows objects\nor array as keys, and stringifies (by calling .toString method) them at the\nmoment of adding them.\n\n``` yaml\n---\n? [ foo, bar ]\n: - baz\n? { foo: bar }\n: - baz\n  - baz\n```\n\n``` javascript\n{ \"foo,bar\": [\"baz\"], \"[object Object]\": [\"baz\", \"baz\"] }\n```\n\nAlso, reading of properties on implicit block mapping keys is not supported yet.\nSo, the following YAML document cannot be loaded.\n\n``` yaml\n&anchor foo:\n  foo: bar\n  *anchor: duplicate key\n  baz: bat\n  *anchor: duplicate key\n```\n\n\nBreaking changes in 2.x.x -> 3.0.x\n----------------------------------\n\nIf your have not used __custom__ tags or loader classes and not loaded yaml\nfiles via `require()` - no changes needed. Just upgrade library.\n\nIn other case, you should:\n\n1. Replace all occurences of `require('xxxx.yml')` by `fs.readFileSync()` +\n  `yaml.safeLoad()`.\n2. rewrite your custom tags constructors and custom loader\n  classes, to conform new API. See\n  [examples](https://github.com/nodeca/js-yaml/tree/master/examples) and\n  [wiki](https://github.com/nodeca/js-yaml/wiki) for details.\n\n\nLicense\n-------\n\nView the [LICENSE](https://github.com/nodeca/js-yaml/blob/master/LICENSE) file\n(MIT).\n",
+  "readme": "JS-YAML - YAML 1.2 parser and serializer for JavaScript\n=======================================================\n\n[![Build Status](https://travis-ci.org/nodeca/js-yaml.svg?branch=master)](https://travis-ci.org/nodeca/js-yaml)\n[![NPM version](https://img.shields.io/npm/v/js-yaml.svg)](https://www.npmjs.org/package/js-yaml)\n\n[Online Demo](http://nodeca.github.com/js-yaml/)\n\n\nThis is an implementation of [YAML](http://yaml.org/), a human friendly data\nserialization language. Started as [PyYAML](http://pyyaml.org/) port, it was\ncompletely rewritten from scratch. Now it's very fast, and supports 1.2 spec.\n\n\nInstallation\n------------\n\n### YAML module for node.js\n\n```\nnpm install js-yaml\n```\n\n\n### CLI executable\n\nIf you want to inspect your YAML files from CLI, install js-yaml globally:\n\n```\nnpm install -g js-yaml\n```\n\n#### Usage\n\n```\nusage: js-yaml [-h] [-v] [-c] [-t] file\n\nPositional arguments:\n  file           File with YAML document(s)\n\nOptional arguments:\n  -h, --help     Show this help message and exit.\n  -v, --version  Show program's version number and exit.\n  -c, --compact  Display errors in compact mode\n  -t, --trace    Show stack trace on error\n```\n\n\n### Bundled YAML library for browsers\n\n``` html\n<!-- esprima required only for !!js/function -->\n<script src=\"esprima.js\"></script>\n<script src=\"js-yaml.min.js\"></script>\n<script type=\"text/javascript\">\nvar doc = jsyaml.load('greeting: hello\\nname: world');\n</script>\n```\n\nBrowser support was done mostly for online demo. If you find any errors - feel\nfree to send pull requests with fixes. Also note, that IE and other old browsers\nneeds [es5-shims](https://github.com/kriskowal/es5-shim) to operate.\n\nNotes:\n\n1. We have no resourses to support browserified version. Don't expect it to be\n   well tested. Don't expect fast fixes if something goes wrong there.\n2. `!!js/function` in browser bundle will not work by default. If you really need\n   it - load `esprima` parser first (via amd or directly).\n3. `!!bin` in browser will return `Array`, because browsers do not support\n   node.js `Buffer` and adding Buffer shims is completely useless on practice.\n\n\nAPI\n---\n\nHere we cover the most 'useful' methods. If you need advanced details (creating\nyour own tags), see [wiki](https://github.com/nodeca/js-yaml/wiki) and\n[examples](https://github.com/nodeca/js-yaml/tree/master/examples) for more\ninfo.\n\n``` javascript\nyaml = require('js-yaml');\nfs   = require('fs');\n\n// Get document, or throw exception on error\ntry {\n  var doc = yaml.safeLoad(fs.readFileSync('/home/ixti/example.yml', 'utf8'));\n  console.log(doc);\n} catch (e) {\n  console.log(e);\n}\n```\n\n\n### safeLoad (string [ , options ])\n\n**Recommended loading way.** Parses `string` as single YAML document. Returns a JavaScript\nobject or throws `YAMLException` on error. By default, does not support regexps,\nfunctions and undefined. This method is safe for untrusted data.\n\noptions:\n\n- `filename` _(default: null)_ - string to be used as a file path in\n  error/warning messages.\n- `onWarning` _(default: null)_ - function to call on warning messages.\n  Loader will throw on warnings if this function is not provided.\n- `schema` _(default: `DEFAULT_SAFE_SCHEMA`)_ - specifies a schema to use.\n  - `FAILSAFE_SCHEMA` - only strings, arrays and plain objects:\n    http://www.yaml.org/spec/1.2/spec.html#id2802346\n  - `JSON_SCHEMA` - all JSON-supported types:\n    http://www.yaml.org/spec/1.2/spec.html#id2803231\n  - `CORE_SCHEMA` - same as `JSON_SCHEMA`:\n    http://www.yaml.org/spec/1.2/spec.html#id2804923\n  - `DEFAULT_SAFE_SCHEMA` - all supported YAML types, without unsafe ones\n    (`!!js/undefined`, `!!js/regexp` and `!!js/function`):\n    http://yaml.org/type/\n  - `DEFAULT_FULL_SCHEMA` - all supported YAML types.\n\nNOTE: This function **does not** understand multi-document sources, it throws\nexception on those.\n\nNOTE: JS-YAML **does not** support schema-specific tag resolution restrictions.\nSo, JSON schema is not as strict as defined in the YAML specification.\nIt allows numbers in any notaion, use `Null` and `NULL` as `null`, etc.\nCore schema also has no such restrictions. It allows binary notation for integers.\n\n\n### load (string [ , options ])\n\n**Use with care with untrusted sources**. The same as `safeLoad()` but uses\n`DEFAULT_FULL_SCHEMA` by default - adds some JavaScript-specific types:\n`!!js/function`, `!!js/regexp` and `!!js/undefined`. For untrusted sources you\nmust additionally validate object structure, to avoid injections:\n\n``` javascript\nvar untrusted_code = '\"toString\": !<tag:yaml.org,2002:js/function> \"function (){very_evil_thing();}\"';\n\n// I'm just converting that string, what could possibly go wrong?\nrequire('js-yaml').load(untrusted_code) + ''\n```\n\n\n### safeLoadAll (string, iterator [ , options ])\n\nSame as `safeLoad()`, but understands multi-document sources and apply\n`iterator` to each document.\n\n``` javascript\nvar yaml = require('js-yaml');\n\nyaml.safeLoadAll(data, function (doc) {\n  console.log(doc);\n});\n```\n\n\n### loadAll (string, iterator [ , options ])\n\nSame as `safeLoadAll()` but uses `DEFAULT_FULL_SCHEMA` by default.\n\n\n### safeDump (object [ , options ])\n\nSerializes `object` as YAML document. Uses `DEFAULT_SAFE_SCHEMA`, so it will\nthrow exception if you try to dump regexps or functions. However, you can\ndisable exceptions by `skipInvalid` option.\n\noptions:\n\n- `indent` _(default: 2)_ - indentation width to use (in spaces).\n- `skipInvalid` _(default: false)_ - do not throw on invalid types (like function\n  in the safe schema) and skip pairs and single values with such types.\n- `flowLevel` (default: -1) - specifies level of nesting, when to switch from\n  block to flow style for collections. -1 means block style everwhere\n- `styles` - \"tag\" => \"style\" map. Each tag may have own set of styles.\n- `schema` _(default: `DEFAULT_SAFE_SCHEMA`)_ specifies a schema to use.\n\nstyles:\n\n``` none\n!!null\n  \"canonical\"   => \"~\"\n\n!!int\n  \"binary\"      => \"0b1\", \"0b101010\", \"0b1110001111010\"\n  \"octal\"       => \"01\", \"052\", \"016172\"\n  \"decimal\"     => \"1\", \"42\", \"7290\"\n  \"hexadecimal\" => \"0x1\", \"0x2A\", \"0x1C7A\"\n\n!!null, !!bool, !!float\n  \"lowercase\"   => \"null\", \"true\", \"false\", \".nan\", '.inf'\n  \"uppercase\"   => \"NULL\", \"TRUE\", \"FALSE\", \".NAN\", '.INF'\n  \"camelcase\"   => \"Null\", \"True\", \"False\", \".NaN\", '.Inf'\n```\n\nBy default, !!int uses `decimal`, and !!null, !!bool, !!float use `lowercase`.\n\n\n\n### dump (object [ , options ])\n\nSame as `safeDump()` but without limits (uses `DEFAULT_FULL_SCHEMA` by default).\n\n\nSupported YAML types\n--------------------\n\nThe list of standard YAML tags and corresponding JavaScipt types. See also\n[YAML tag discussion](http://pyyaml.org/wiki/YAMLTagDiscussion) and\n[YAML types repository](http://yaml.org/type/).\n\n```\n!!null ''                   # null\n!!bool 'yes'                # bool\n!!int '3...'                # number\n!!float '3.14...'           # number\n!!binary '...base64...'     # buffer\n!!timestamp 'YYYY-...'      # date\n!!omap [ ... ]              # array of key-value pairs\n!!pairs [ ... ]             # array or array pairs\n!!set { ... }               # array of objects with given keys and null values\n!!str '...'                 # string\n!!seq [ ... ]               # array\n!!map { ... }               # object\n```\n\n**JavaScript-specific tags**\n\n```\n!!js/regexp /pattern/gim            # RegExp\n!!js/undefined ''                   # Undefined\n!!js/function 'function () {...}'   # Function\n```\n\nCaveats\n-------\n\nNote, that you use arrays or objects as key in JS-YAML. JS do not allows objects\nor array as keys, and stringifies (by calling .toString method) them at the\nmoment of adding them.\n\n``` yaml\n---\n? [ foo, bar ]\n: - baz\n? { foo: bar }\n: - baz\n  - baz\n```\n\n``` javascript\n{ \"foo,bar\": [\"baz\"], \"[object Object]\": [\"baz\", \"baz\"] }\n```\n\nAlso, reading of properties on implicit block mapping keys is not supported yet.\nSo, the following YAML document cannot be loaded.\n\n``` yaml\n&anchor foo:\n  foo: bar\n  *anchor: duplicate key\n  baz: bat\n  *anchor: duplicate key\n```\n\n\nBreaking changes in 2.x.x -> 3.x.x\n----------------------------------\n\nIf your have not used __custom__ tags or loader classes and not loaded yaml\nfiles via `require()` - no changes needed. Just upgrade library.\n\nIn other case, you should:\n\n1. Replace all occurences of `require('xxxx.yml')` by `fs.readFileSync()` +\n  `yaml.safeLoad()`.\n2. rewrite your custom tags constructors and custom loader\n  classes, to conform new API. See\n  [examples](https://github.com/nodeca/js-yaml/tree/master/examples) and\n  [wiki](https://github.com/nodeca/js-yaml/wiki) for details.\n\n\nLicense\n-------\n\nView the [LICENSE](https://github.com/nodeca/js-yaml/blob/master/LICENSE) file\n(MIT).\n",
   "readmeFilename": "README.md",
-  "_id": "js-yaml@3.0.2",
-  "_from": "js-yaml@~3.0.1"
+  "_id": "js-yaml@3.2.5",
+  "dist": {
+    "shasum": "9405de91f3bb53c2eab961f9d71f4ca39c0a35ae"
+  },
+  "_from": "js-yaml@^3.1.0",
+  "_resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.2.5.tgz"
 }
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/mkdirp/node_modules/minimist/package.json b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/mkdirp/node_modules/minimist/package.json
index 9952e47..a1b82bf 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/mkdirp/node_modules/minimist/package.json
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/mkdirp/node_modules/minimist/package.json
@@ -46,5 +46,9 @@
     "url": "https://github.com/substack/minimist/issues"
   },
   "_id": "minimist@0.0.8",
-  "_from": "minimist@0.0.8"
+  "dist": {
+    "shasum": "f2139b0976da868029cf96d5931b90cd807bfc0e"
+  },
+  "_from": "minimist@0.0.8",
+  "_resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz"
 }
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/mkdirp/package.json b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/mkdirp/package.json
index 27b4e83..ab5690f 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/mkdirp/package.json
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/mkdirp/package.json
@@ -37,5 +37,5 @@
   },
   "homepage": "https://github.com/substack/node-mkdirp",
   "_id": "mkdirp@0.5.0",
-  "_from": "mkdirp@~0.5.0"
+  "_from": "mkdirp@^0.5.0"
 }
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/object-assign/object-assign.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/object-assign/object-assign.js
deleted file mode 100644
index ee5c228..0000000
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/object-assign/object-assign.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/*!
-	object-assign
-	ES6 Object.assign() ponyfill
-	https://github.com/sindresorhus/object-assign
-	by Sindre Sorhus
-	MIT License
-*/
-(function () {
-	'use strict';
-
-	var ToObject = function (val) {
-		if (val == null) {
-			throw new TypeError('Object.assign cannot be called with null or undefined');
-		}
-
-		return Object(val);
-	}
-
-	var objectAssign = Object.assign || function (target, source) {
-		var pendingException;
-		var from;
-		var keys;
-		var to = ToObject(target);
-
-		for (var s = 1; s < arguments.length; s++) {
-			from = ToObject(arguments[s]);
-			keys = Object.keys(from)
-
-			for (var i = 0; i < keys.length; i++) {
-				try {
-					to[keys[i]] = from[keys[i]];
-				} catch (err) {
-					if (pendingException === undefined) {
-						pendingException = err;
-					}
-				}
-			}
-		}
-
-		if (pendingException) {
-			throw pendingException;
-		}
-
-		return to;
-	};
-
-	if (typeof module !== 'undefined' && module.exports) {
-		module.exports = objectAssign;
-	} else {
-		window.objectAssign = objectAssign;
-	}
-})();
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/object-assign/package.json b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/object-assign/package.json
index 850c1ae..7e1e8f1 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/object-assign/package.json
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/object-assign/package.json
@@ -1,9 +1,8 @@
 {
   "name": "object-assign",
-  "version": "0.3.1",
+  "version": "2.0.0",
   "description": "ES6 Object.assign() ponyfill",
   "license": "MIT",
-  "main": "object-assign.js",
   "repository": {
     "type": "git",
     "url": "git://github.com/sindresorhus/object-assign"
@@ -20,7 +19,7 @@
     "test": "mocha"
   },
   "files": [
-    "object-assign.js"
+    "index.js"
   ],
   "keywords": [
     "object",
@@ -39,12 +38,16 @@
   "devDependencies": {
     "mocha": "*"
   },
-  "readme": "# object-assign [![Build Status](https://travis-ci.org/sindresorhus/object-assign.svg?branch=master)](https://travis-ci.org/sindresorhus/object-assign)\n\n> ES6 [`Object.assign()`](http://www.2ality.com/2014/01/object-assign.html) ponyfill\n\n> Ponyfill: A polyfill that doesn't overwrite the native method\n\n\n## Install\n\n```sh\n$ npm install --save object-assign\n```\n\n```sh\n$ bower install --save object-assign\n```\n\n```sh\n$ component install sindresorhus/object-assign\n```\n\n\n## Usage\n\n```js\nobjectAssign({foo: 0}, {bar: 1});\n//=> {foo: 0, bar: 1}\n\n// multiple sources\nobjectAssign({foo: 0}, {bar: 1}, {baz: 3});\n//=> {foo: 0, bar: 1, baz: 2}\n```\n\n\n## API\n\n### objectAssign(target, source, [source, ...])\n\nAssigns enumerable own properties of `source` objects to the `target` object and returns the `target` object. Additional `source` objects will overwrite previous ones.\n\n\n## Resources\n\n- [ES6 spec - Object.assign](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign)\n\n\n## License\n\n[MIT](http://opensource.org/licenses/MIT) © [Sindre Sorhus](http://sindresorhus.com)\n",
+  "readme": "# object-assign [![Build Status](https://travis-ci.org/sindresorhus/object-assign.svg?branch=master)](https://travis-ci.org/sindresorhus/object-assign)\n\n> ES6 [`Object.assign()`](http://www.2ality.com/2014/01/object-assign.html) ponyfill\n\n> Ponyfill: A polyfill that doesn't overwrite the native method\n\n\n## Install\n\n```sh\n$ npm install --save object-assign\n```\n\n\n## Usage\n\n```js\nvar objectAssign = require('object-assign');\n\nobjectAssign({foo: 0}, {bar: 1});\n//=> {foo: 0, bar: 1}\n\n// multiple sources\nobjectAssign({foo: 0}, {bar: 1}, {baz: 2});\n//=> {foo: 0, bar: 1, baz: 2}\n\n// overwrites equal keys\nobjectAssign({foo: 0}, {foo: 1}, {foo: 2});\n//=> {foo: 2}\n\n// ignores null and undefined sources\nobjectAssign({foo: 0}, null, {bar: 1}, undefined);\n//=> {foo: 0, bar: 1}\n```\n\n\n## API\n\n### objectAssign(target, source, [source, ...])\n\nAssigns enumerable own properties of `source` objects to the `target` object and returns the `target` object. Additional `source` objects will overwrite previous ones.\n\n\n## Resources\n\n- [ES6 spec - Object.assign](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign)\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
   "readmeFilename": "readme.md",
   "bugs": {
     "url": "https://github.com/sindresorhus/object-assign/issues"
   },
   "homepage": "https://github.com/sindresorhus/object-assign",
-  "_id": "object-assign@0.3.1",
-  "_from": "object-assign@~0.3.1"
+  "_id": "object-assign@2.0.0",
+  "dist": {
+    "shasum": "8e6a0d23307e450f3ed82e4b46cce833f3301738"
+  },
+  "_from": "object-assign@^2.0.0",
+  "_resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.0.0.tgz"
 }
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/object-assign/readme.md b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/object-assign/readme.md
index a8b470b..aee51c1 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/object-assign/readme.md
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/object-assign/readme.md
@@ -11,24 +11,26 @@
 $ npm install --save object-assign
 ```
 
-```sh
-$ bower install --save object-assign
-```
-
-```sh
-$ component install sindresorhus/object-assign
-```
-
 
 ## Usage
 
 ```js
+var objectAssign = require('object-assign');
+
 objectAssign({foo: 0}, {bar: 1});
 //=> {foo: 0, bar: 1}
 
 // multiple sources
-objectAssign({foo: 0}, {bar: 1}, {baz: 3});
+objectAssign({foo: 0}, {bar: 1}, {baz: 2});
 //=> {foo: 0, bar: 1, baz: 2}
+
+// overwrites equal keys
+objectAssign({foo: 0}, {foo: 1}, {foo: 2});
+//=> {foo: 2}
+
+// ignores null and undefined sources
+objectAssign({foo: 0}, null, {bar: 1}, undefined);
+//=> {foo: 0, bar: 1}
 ```
 
 
@@ -46,4 +48,4 @@
 
 ## License
 
-[MIT](http://opensource.org/licenses/MIT) © [Sindre Sorhus](http://sindresorhus.com)
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/osenv/package.json b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/osenv/package.json
index 5f0f358..fbe9432 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/osenv/package.json
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/osenv/package.json
@@ -39,5 +39,5 @@
   },
   "homepage": "https://github.com/isaacs/osenv",
   "_id": "osenv@0.1.0",
-  "_from": "osenv@~0.1.0"
+  "_from": "osenv@^0.1.0"
 }
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/uuid/benchmark/package.json b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/uuid/benchmark/package.json
index aa1a421..94e0b59 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/uuid/benchmark/package.json
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/uuid/benchmark/package.json
@@ -3,7 +3,7 @@
   "private": true,
   "description": "Benchmarks for node-uuid",
   "dependencies": {
-    "uuid": "^1.4.1",
-    "uuid-js": "^0.7.4"
+    "uuid": "1.4.1",
+    "uuid-js": "0.7.4"
   }
 }
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/uuid/buffer-browser.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/uuid/buffer-browser.js
deleted file mode 100644
index f5a9358..0000000
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/uuid/buffer-browser.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = Array;
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/uuid/buffer.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/uuid/buffer.js
deleted file mode 100644
index 66c989c..0000000
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/uuid/buffer.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = Buffer;
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/uuid/package.json b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/uuid/package.json
index 779662b..f9b0ffe 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/uuid/package.json
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/uuid/package.json
@@ -1,6 +1,6 @@
 {
   "name": "uuid",
-  "version": "1.4.2",
+  "version": "2.0.1",
   "description": "Rigorous implementation of RFC4122 (v1 and v4) UUIDs.",
   "keywords": [
     "uuid",
@@ -29,8 +29,7 @@
     "test": "mocha test/test.js"
   },
   "browser": {
-    "./rng.js": "./rng-browser.js",
-    "./buffer.js": "./buffer-browser.js"
+    "./rng.js": "./rng-browser.js"
   },
   "repository": {
     "type": "git",
@@ -52,6 +51,10 @@
     "url": "https://github.com/shtylman/node-uuid/issues"
   },
   "homepage": "https://github.com/shtylman/node-uuid",
-  "_id": "uuid@1.4.2",
-  "_from": "uuid@~1.4.1"
+  "_id": "uuid@2.0.1",
+  "dist": {
+    "shasum": "45ba18110874d22c6c63f9f7028b121be22b4469"
+  },
+  "_from": "uuid@^2.0.1",
+  "_resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz"
 }
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/uuid/uuid.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/uuid/uuid.js
index f037bd4..be5bfed 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/uuid/uuid.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/node_modules/uuid/uuid.js
@@ -8,11 +8,6 @@
 // returns 128-bits of randomness, since that's what's usually required
 var _rng = require('./rng');
 
-// Buffer class to use,
-// we can't use `Buffer || Array` otherwise Buffer would be
-// shimmed by browserify and added to the browser build
-var BufferClass = require('./buffer');
-
 // Maps for number <-> hex string conversion
 var _byteToHex = [];
 var _hexToByte = {};
@@ -157,7 +152,7 @@
   var i = buf && offset || 0;
 
   if (typeof(options) == 'string') {
-    buf = options == 'binary' ? new BufferClass(16) : null;
+    buf = options == 'binary' ? new Array(16) : null;
     options = null;
   }
   options = options || {};
@@ -184,6 +179,5 @@
 uuid.v4 = v4;
 uuid.parse = parse;
 uuid.unparse = unparse;
-uuid.BufferClass = BufferClass;
 
 module.exports = uuid;
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/package.json b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/package.json
index d902c6d..132e5de 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/package.json
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/package.json
@@ -1,6 +1,6 @@
 {
   "name": "configstore",
-  "version": "0.3.1",
+  "version": "0.3.2",
   "description": "Easily load and save config without having to think about where and how",
   "keywords": [
     "conf",
@@ -17,7 +17,6 @@
     "email": "sindresorhus@gmail.com",
     "url": "http://sindresorhus.com"
   },
-  "main": "configstore.js",
   "repository": {
     "type": "git",
     "url": "git://github.com/yeoman/configstore"
@@ -30,25 +29,31 @@
   },
   "license": "BSD",
   "dependencies": {
-    "graceful-fs": "~3.0.1",
-    "js-yaml": "~3.0.1",
-    "mkdirp": "~0.5.0",
-    "object-assign": "~0.3.1",
-    "osenv": "~0.1.0",
-    "uuid": "~1.4.1"
+    "graceful-fs": "^3.0.1",
+    "js-yaml": "^3.1.0",
+    "mkdirp": "^0.5.0",
+    "object-assign": "^2.0.0",
+    "osenv": "^0.1.0",
+    "user-home": "^1.0.0",
+    "uuid": "^2.0.1",
+    "xdg-basedir": "^1.0.0"
   },
   "devDependencies": {
     "mocha": "*"
   },
   "files": [
-    "configstore.js"
+    "index.js"
   ],
-  "readme": "# configstore [![Build Status](https://secure.travis-ci.org/yeoman/configstore.svg?branch=master)](http://travis-ci.org/yeoman/configstore)\n\nEasily load and persist config without having to think about where and how.\n\nConfig is stored in a YAML file to make it simple for users to edit the config directly themselves. The file is located in `$XDG_CONFIG_HOME` or `~/.config`. Eg: `~/.config/configstore/id-of-your-choosing.yml`\n\n\n## Example usage\n\n```js\nvar Configstore = require('configstore');\nvar packageName = require('./package').name;\n\n// Init a Configstore instance with an unique ID eg. package name\n// and optionally some default values\nvar conf = new Configstore(packageName, { foo: 'bar' });\n\nconf.set('awesome', true);\nconsole.log(conf.get('awesome'));  // true\nconsole.log(conf.get('foo'));      // bar\n\nconf.del('awesome');\nconsole.log(conf.get('awesome'));  // undefined\n```\n\n\n## Documentation\n\n### Methods\n\n#### .set(key, val)\n\nSet an item\n\n#### .get(key)\n\nGet an item\n\n#### .del(key)\n\nDelete an item\n\n### Properties\n\n#### .all\n\nGet all items as an object or replace the current config with an object:\n\n```js\nconf.all = {\n\thello: 'world'\n};\n```\n\n#### .size\n\nGet the item count\n\n#### .path\n\nGet the path to the config file. Can be used to show the user where the config file is located or even better open it for them.\n\n\n## License\n\n[BSD license](http://opensource.org/licenses/bsd-license.php)  \nCopyright Google\n",
+  "readme": "# configstore [![Build Status](https://secure.travis-ci.org/yeoman/configstore.svg?branch=master)](http://travis-ci.org/yeoman/configstore)\n\n> Easily load and persist config without having to think about where and how.\n\nConfig is stored in a YAML file to make it simple for users to edit the config directly themselves. The file is located in `$XDG_CONFIG_HOME` or `~/.config`. Eg: `~/.config/configstore/id-of-your-choosing.yml`\n\n\n## Usage\n\n```js\nvar Configstore = require('configstore');\nvar packageName = require('./package').name;\n\n// Init a Configstore instance with an unique ID eg. package name\n// and optionally some default values\nvar conf = new Configstore(packageName, { foo: 'bar' });\n\nconf.set('awesome', true);\nconsole.log(conf.get('awesome'));  // true\nconsole.log(conf.get('foo'));      // bar\n\nconf.del('awesome');\nconsole.log(conf.get('awesome'));  // undefined\n```\n\n\n## Documentation\n\n### Methods\n\n#### .set(key, val)\n\nSet an item\n\n#### .get(key)\n\nGet an item\n\n#### .del(key)\n\nDelete an item\n\n### Properties\n\n#### .all\n\nGet all items as an object or replace the current config with an object:\n\n```js\nconf.all = {\n\thello: 'world'\n};\n```\n\n#### .size\n\nGet the item count\n\n#### .path\n\nGet the path to the config file. Can be used to show the user where the config file is located or even better open it for them.\n\n\n## License\n\n[BSD license](http://opensource.org/licenses/bsd-license.php)  \nCopyright Google\n",
   "readmeFilename": "readme.md",
   "bugs": {
     "url": "https://github.com/yeoman/configstore/issues"
   },
   "homepage": "https://github.com/yeoman/configstore",
-  "_id": "configstore@0.3.1",
-  "_from": "configstore@^0.3.1"
+  "_id": "configstore@0.3.2",
+  "dist": {
+    "shasum": "aff5ca661066e24f1a1b81a2e6077e4df0af9918"
+  },
+  "_from": "configstore@^0.3.1",
+  "_resolved": "https://registry.npmjs.org/configstore/-/configstore-0.3.2.tgz"
 }
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/readme.md b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/readme.md
index 1d94848..28005b7 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/readme.md
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/configstore/readme.md
@@ -1,11 +1,11 @@
 # configstore [![Build Status](https://secure.travis-ci.org/yeoman/configstore.svg?branch=master)](http://travis-ci.org/yeoman/configstore)
 
-Easily load and persist config without having to think about where and how.
+> Easily load and persist config without having to think about where and how.
 
 Config is stored in a YAML file to make it simple for users to edit the config directly themselves. The file is located in `$XDG_CONFIG_HOME` or `~/.config`. Eg: `~/.config/configstore/id-of-your-choosing.yml`
 
 
-## Example usage
+## Usage
 
 ```js
 var Configstore = require('configstore');
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/index.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/index.js
index f067104..e2965b8 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/index.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/index.js
@@ -1,2 +1,2 @@
 'use strict';
-module.exports = require('rc')('npm').registry || 'http://registry.npmjs.org/';
+module.exports = require('rc')('npm').registry || 'https://registry.npmjs.org/';
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/LICENSE b/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/LICENSE
index 05a4010..19129e3 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/LICENSE
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/LICENSE
@@ -1,23 +1,15 @@
-Copyright 2009, 2010, 2011 Isaac Z. Schlueter.
-All rights reserved.
+The ISC 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:
+Copyright (c) Isaac Z. Schlueter and Contributors
 
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
+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", 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 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.
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/README.md b/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/README.md
index acbe8ec..33df258 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/README.md
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/README.md
@@ -1,7 +1,7 @@
 An ini format parser and serializer for node.
 
-Sections are treated as nested objects.  Items before the first heading
-are saved on the object directly.
+Sections are treated as nested objects.  Items before the first
+heading are saved on the object directly.
 
 ## Usage
 
@@ -34,40 +34,62 @@
     delete config.paths.default.datadir
     config.paths.default.array.push('fourth value')
 
-    fs.writeFileSync('./config_modified.ini', ini.stringify(config, 'section'))
+    fs.writeFileSync('./config_modified.ini', ini.stringify(config, { section: 'section' }))
 
-This will result in a file called `config_modified.ini` being written to the filesystem with the following content:
+This will result in a file called `config_modified.ini` being written
+to the filesystem with the following content:
 
     [section]
-    scope = local
+    scope=local
     [section.database]
-    user = dbuser
-    password = dbpassword
-    database = use_another_database
+    user=dbuser
+    password=dbpassword
+    database=use_another_database
     [section.paths.default]
-    tmpdir = /tmp
-    array[] = first value
-    array[] = second value
-    array[] = third value
-    array[] = fourth value
+    tmpdir=/tmp
+    array[]=first value
+    array[]=second value
+    array[]=third value
+    array[]=fourth value
 
 
 ## API
 
 ### decode(inistring)
+
 Decode the ini-style formatted `inistring` into a nested object.
 
 ### parse(inistring)
+
 Alias for `decode(inistring)`
 
-### encode(object, [section])
-Encode the object `object` into an ini-style formatted string. If the optional parameter `section` is given, then all top-level properties of the object are put into this section and the `section`-string is prepended to all sub-sections, see the usage example above.
+### encode(object, [options])
 
-### stringify(object, [section])
-Alias for `encode(object, [section])`
+Encode the object `object` into an ini-style formatted string. If the
+optional parameter `section` is given, then all top-level properties
+of the object are put into this section and the `section`-string is
+prepended to all sub-sections, see the usage example above.
+
+The `options` object may contain the following:
+
+* `section` A string which will be the first `section` in the encoded
+  ini data.  Defaults to none.
+* `whitespace` Boolean to specify whether to put whitespace around the
+  `=` character.  By default, whitespace is omitted, to be friendly to
+  some persnickety old parsers that don't tolerate it well.  But some
+  find that it's more human-readable and pretty with the whitespace.
+
+For backwards compatibility reasons, if a `string` options is passed
+in, then it is assumed to be the `section` value.
+
+### stringify(object, [options])
+
+Alias for `encode(object, [options])`
 
 ### safe(val)
-Escapes the string `val` such that it is safe to be used as a key or value in an ini-file. Basically escapes quotes. For example
+
+Escapes the string `val` such that it is safe to be used as a key or
+value in an ini-file. Basically escapes quotes. For example
 
     ini.safe('"unsafe string"')
 
@@ -76,4 +98,5 @@
     "\"unsafe string\""
 
 ### unsafe(val)
+
 Unescapes the string `val`
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/ini.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/ini.js
index eaf3209..1e232e7 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/ini.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/ini.js
@@ -7,31 +7,47 @@
 
 var eol = process.platform === "win32" ? "\r\n" : "\n"
 
-function encode (obj, section) {
+function encode (obj, opt) {
   var children = []
     , out = ""
 
+  if (typeof opt === "string") {
+    opt = {
+      section: opt,
+      whitespace: false
+    }
+  } else {
+    opt = opt || {}
+    opt.whitespace = opt.whitespace === true
+  }
+
+  var separator = opt.whitespace ? " = " : "="
+
   Object.keys(obj).forEach(function (k, _, __) {
     var val = obj[k]
     if (val && Array.isArray(val)) {
         val.forEach(function(item) {
-            out += safe(k + "[]") + " = " + safe(item) + "\n"
+            out += safe(k + "[]") + separator + safe(item) + "\n"
         })
     }
     else if (val && typeof val === "object") {
       children.push(k)
     } else {
-      out += safe(k) + " = " + safe(val) + eol
+      out += safe(k) + separator + safe(val) + eol
     }
   })
 
-  if (section && out.length) {
-    out = "[" + safe(section) + "]" + eol + out
+  if (opt.section && out.length) {
+    out = "[" + safe(opt.section) + "]" + eol + out
   }
 
   children.forEach(function (k, _, __) {
     var nk = dotSplit(k).join('\\.')
-    var child = encode(obj[k], (section ? section + "." : "") + nk)
+    var section = (opt.section ? opt.section + "." : "") + nk
+    var child = encode(obj[k], {
+      section: section,
+      whitespace: opt.whitespace
+    })
     if (out.length && child.length) {
       out += eol
     }
@@ -42,12 +58,12 @@
 }
 
 function dotSplit (str) {
-  return str.replace(/\1/g, '\2LITERAL\\1LITERAL\2')
-         .replace(/\\\./g, '\1')
+  return str.replace(/\1/g, '\u0002LITERAL\\1LITERAL\u0002')
+         .replace(/\\\./g, '\u0001')
          .split(/\./).map(function (part) {
            return part.replace(/\1/g, '\\.')
-                  .replace(/\2LITERAL\\1LITERAL\2/g, '\1')
-         })
+                  .replace(/\2LITERAL\\1LITERAL\2/g, '\u0001')
+        })
 }
 
 function decode (str) {
@@ -61,7 +77,7 @@
     , section = null
 
   lines.forEach(function (line, _, __) {
-    if (!line || line.match(/^\s*;/)) return
+    if (!line || line.match(/^\s*[;#]/)) return
     var match = line.match(re)
     if (!match) return
     if (match[1] !== undefined) {
@@ -122,21 +138,29 @@
   return out
 }
 
+function isQuoted (val) {
+  return (val.charAt(0) === "\"" && val.slice(-1) === "\"")
+         || (val.charAt(0) === "'" && val.slice(-1) === "'")
+}
+
 function safe (val) {
   return ( typeof val !== "string"
          || val.match(/[\r\n]/)
          || val.match(/^\[/)
          || (val.length > 1
-             && val.charAt(0) === "\""
-             && val.slice(-1) === "\"")
+             && isQuoted(val))
          || val !== val.trim() )
          ? JSON.stringify(val)
-         : val.replace(/;/g, '\\;')
+         : val.replace(/;/g, '\\;').replace(/#/g, "\\#")
 }
 
 function unsafe (val, doUnesc) {
   val = (val || "").trim()
-  if (val.charAt(0) === "\"" && val.slice(-1) === "\"") {
+  if (isQuoted(val)) {
+    // remove the single quotes before calling JSON.parse
+    if (val.charAt(0) === "'") {
+      val = val.substr(1, val.length - 2);
+    }
     try { val = JSON.parse(val) } catch (_) {}
   } else {
     // walk the val to find the first not-escaped ; character
@@ -145,12 +169,12 @@
     for (var i = 0, l = val.length; i < l; i++) {
       var c = val.charAt(i)
       if (esc) {
-        if (c === "\\" || c === ";")
+        if ("\\;#".indexOf(c) !== -1)
           unesc += c
         else
           unesc += "\\" + c
         esc = false
-      } else if (c === ";") {
+      } else if (";#".indexOf(c) !== -1) {
         break
       } else if (c === "\\") {
         esc = true
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/package.json b/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/package.json
index d30ca08..4e14c2a 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/package.json
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/package.json
@@ -6,7 +6,7 @@
   },
   "name": "ini",
   "description": "An ini encoder/decoder for node",
-  "version": "1.1.0",
+  "version": "1.3.2",
   "repository": {
     "type": "git",
     "url": "git://github.com/isaacs/ini.git"
@@ -20,14 +20,19 @@
   },
   "dependencies": {},
   "devDependencies": {
-    "tap": "~0.0.9"
+    "tap": "~0.4.0"
   },
-  "readme": "An ini format parser and serializer for node.\n\nSections are treated as nested objects.  Items before the first heading\nare saved on the object directly.\n\n## Usage\n\nConsider an ini-file `config.ini` that looks like this:\n\n    ; this comment is being ignored\n    scope = global\n\n    [database]\n    user = dbuser\n    password = dbpassword\n    database = use_this_database\n\n    [paths.default]\n    datadir = /var/lib/data\n    array[] = first value\n    array[] = second value\n    array[] = third value\n\nYou can read, manipulate and write the ini-file like so:\n\n    var fs = require('fs')\n      , ini = require('ini')\n\n    var config = ini.parse(fs.readFileSync('./config.ini', 'utf-8'))\n\n    config.scope = 'local'\n    config.database.database = 'use_another_database'\n    config.paths.default.tmpdir = '/tmp'\n    delete config.paths.default.datadir\n    config.paths.default.array.push('fourth value')\n\n    fs.writeFileSync('./config_modified.ini', ini.stringify(config, 'section'))\n\nThis will result in a file called `config_modified.ini` being written to the filesystem with the following content:\n\n    [section]\n    scope = local\n    [section.database]\n    user = dbuser\n    password = dbpassword\n    database = use_another_database\n    [section.paths.default]\n    tmpdir = /tmp\n    array[] = first value\n    array[] = second value\n    array[] = third value\n    array[] = fourth value\n\n\n## API\n\n### decode(inistring)\nDecode the ini-style formatted `inistring` into a nested object.\n\n### parse(inistring)\nAlias for `decode(inistring)`\n\n### encode(object, [section])\nEncode the object `object` into an ini-style formatted string. If the optional parameter `section` is given, then all top-level properties of the object are put into this section and the `section`-string is prepended to all sub-sections, see the usage example above.\n\n### stringify(object, [section])\nAlias for `encode(object, [section])`\n\n### safe(val)\nEscapes the string `val` such that it is safe to be used as a key or value in an ini-file. Basically escapes quotes. For example\n\n    ini.safe('\"unsafe string\"')\n\nwould result in\n\n    \"\\\"unsafe string\\\"\"\n\n### unsafe(val)\nUnescapes the string `val`\n",
+  "license": "ISC",
+  "readme": "An ini format parser and serializer for node.\n\nSections are treated as nested objects.  Items before the first\nheading are saved on the object directly.\n\n## Usage\n\nConsider an ini-file `config.ini` that looks like this:\n\n    ; this comment is being ignored\n    scope = global\n\n    [database]\n    user = dbuser\n    password = dbpassword\n    database = use_this_database\n\n    [paths.default]\n    datadir = /var/lib/data\n    array[] = first value\n    array[] = second value\n    array[] = third value\n\nYou can read, manipulate and write the ini-file like so:\n\n    var fs = require('fs')\n      , ini = require('ini')\n\n    var config = ini.parse(fs.readFileSync('./config.ini', 'utf-8'))\n\n    config.scope = 'local'\n    config.database.database = 'use_another_database'\n    config.paths.default.tmpdir = '/tmp'\n    delete config.paths.default.datadir\n    config.paths.default.array.push('fourth value')\n\n    fs.writeFileSync('./config_modified.ini', ini.stringify(config, { section: 'section' }))\n\nThis will result in a file called `config_modified.ini` being written\nto the filesystem with the following content:\n\n    [section]\n    scope=local\n    [section.database]\n    user=dbuser\n    password=dbpassword\n    database=use_another_database\n    [section.paths.default]\n    tmpdir=/tmp\n    array[]=first value\n    array[]=second value\n    array[]=third value\n    array[]=fourth value\n\n\n## API\n\n### decode(inistring)\n\nDecode the ini-style formatted `inistring` into a nested object.\n\n### parse(inistring)\n\nAlias for `decode(inistring)`\n\n### encode(object, [options])\n\nEncode the object `object` into an ini-style formatted string. If the\noptional parameter `section` is given, then all top-level properties\nof the object are put into this section and the `section`-string is\nprepended to all sub-sections, see the usage example above.\n\nThe `options` object may contain the following:\n\n* `section` A string which will be the first `section` in the encoded\n  ini data.  Defaults to none.\n* `whitespace` Boolean to specify whether to put whitespace around the\n  `=` character.  By default, whitespace is omitted, to be friendly to\n  some persnickety old parsers that don't tolerate it well.  But some\n  find that it's more human-readable and pretty with the whitespace.\n\nFor backwards compatibility reasons, if a `string` options is passed\nin, then it is assumed to be the `section` value.\n\n### stringify(object, [options])\n\nAlias for `encode(object, [options])`\n\n### safe(val)\n\nEscapes the string `val` such that it is safe to be used as a key or\nvalue in an ini-file. Basically escapes quotes. For example\n\n    ini.safe('\"unsafe string\"')\n\nwould result in\n\n    \"\\\"unsafe string\\\"\"\n\n### unsafe(val)\n\nUnescapes the string `val`\n",
   "readmeFilename": "README.md",
   "bugs": {
     "url": "https://github.com/isaacs/ini/issues"
   },
   "homepage": "https://github.com/isaacs/ini",
-  "_id": "ini@1.1.0",
-  "_from": "ini@~1.1.0"
+  "_id": "ini@1.3.2",
+  "dist": {
+    "shasum": "988b16d63e5cdd8122bc92166dc8e7b446998472"
+  },
+  "_from": "ini@~1.3.0",
+  "_resolved": "https://registry.npmjs.org/ini/-/ini-1.3.2.tgz"
 }
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/test/fixtures/foo.ini b/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/test/fixtures/foo.ini
index 1d81378..27555e9 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/test/fixtures/foo.ini
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/test/fixtures/foo.ini
@@ -8,6 +8,16 @@
 ; wrap in quotes to get a key with a bracket, not a section.
 "[disturbing]" = hey you never know
 
+; Test single quotes
+s = 'something'
+
+; Test mixing quotes
+
+s1 = "something'
+
+; Test double quotes
+s2 = "something else"
+
 ; Test arrays
 zr[] = deedee
 ar[] = one
@@ -45,3 +55,9 @@
 
 ; this next one is not a comment!  it's escaped!
 nocomment = this\; this is not a comment
+
+# Support the use of the number sign (#) as an alternative to the semicolon for indicating comments.
+# http://en.wikipedia.org/wiki/INI_file#Comments
+
+# this next one is not a comment!  it's escaped!
+noHashComment = this\# this is not a comment
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/test/foo.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/test/foo.js
index 3a05eaf..9d34aa6 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/test/foo.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/node_modules/ini/test/foo.js
@@ -6,33 +6,40 @@
   , fixture = path.resolve(__dirname, "./fixtures/foo.ini")
   , data = fs.readFileSync(fixture, "utf8")
   , d
-  , expectE = 'o = p\n'
-            + 'a with spaces = b  c\n'
-            + '" xa  n          p " = "\\"\\r\\nyoyoyo\\r\\r\\n"\n'
-            + '"[disturbing]" = hey you never know\n'
-            + 'zr[] = deedee\n'
-            + 'ar[] = one\n'
-            + 'ar[] = three\n'
-            + 'ar[] = this is included\n'
-            + 'br = warm\n'
+  , expectE = 'o=p\n'
+            + 'a with spaces=b  c\n'
+            + '" xa  n          p "="\\"\\r\\nyoyoyo\\r\\r\\n"\n'
+            + '"[disturbing]"=hey you never know\n'
+            + 's=something\n'
+            + 's1=\"something\'\n'
+            + 's2=something else\n'
+            + 'zr[]=deedee\n'
+            + 'ar[]=one\n'
+            + 'ar[]=three\n'
+            + 'ar[]=this is included\n'
+            + 'br=warm\n'
             + '\n'
             + '[a]\n'
-            + 'av = a val\n'
-            + 'e = { o: p, a: '
+            + 'av=a val\n'
+            + 'e={ o: p, a: '
             + '{ av: a val, b: { c: { e: "this [value]" '
-            + '} } } }\nj = "\\"{ o: \\"p\\", a: { av:'
+            + '} } } }\nj="\\"{ o: \\"p\\", a: { av:'
             + ' \\"a val\\", b: { c: { e: \\"this [value]'
-            + '\\" } } } }\\""\n"[]" = a square?\n'
-            + 'cr[] = four\ncr[] = eight\n\n'
-            +'[a.b.c]\ne = 1\n'
-            + 'j = 2\n\n[x\\.y\\.z]\nx.y.z = xyz\n\n'
-            + '[x\\.y\\.z.a\\.b\\.c]\na.b.c = abc\n'
-            + 'nocomment = this\\; this is not a comment\n'
+            + '\\" } } } }\\""\n"[]"=a square?\n'
+            + 'cr[]=four\ncr[]=eight\n\n'
+            +'[a.b.c]\ne=1\n'
+            + 'j=2\n\n[x\\.y\\.z]\nx.y.z=xyz\n\n'
+            + '[x\\.y\\.z.a\\.b\\.c]\na.b.c=abc\n'
+            + 'nocomment=this\\; this is not a comment\n'
+            + 'noHashComment=this\\# this is not a comment\n'
   , expectD =
     { o: 'p',
       'a with spaces': 'b  c',
       " xa  n          p ":'"\r\nyoyoyo\r\r\n',
       '[disturbing]': 'hey you never know',
+      's': 'something',
+      's1' : '\"something\'',
+      's2': 'something else',
       'zr': ['deedee'],
       'ar': ['one', 'three', 'this is included'],
       'br': 'warm',
@@ -47,10 +54,21 @@
         'x.y.z': 'xyz',
         'a.b.c': {
           'a.b.c': 'abc',
-          'nocomment': 'this\; this is not a comment'
+          'nocomment': 'this\; this is not a comment',
+          noHashComment: 'this\# this is not a comment'
         }
       }
     }
+  , expectF = '[prefix.log]\n'
+            + 'type=file\n\n'
+            + '[prefix.log.level]\n'
+            + 'label=debug\n'
+            + 'value=10\n'
+  , expectG = '[log]\n'
+            + 'type = file\n\n'
+            + '[log.level]\n'
+            + 'label = debug\n'
+            + 'value = 10\n'
 
 test("decode from file", function (t) {
   var d = i.decode(data)
@@ -69,3 +87,19 @@
 
   t.end()
 })
+
+test("encode with option", function (t) {
+  var obj = {log: { type:'file', level: {label:'debug', value:10} } }
+  e = i.encode(obj, {section: 'prefix'})
+
+  t.equal(e, expectF)
+  t.end()
+})
+
+test("encode with whitespace", function (t) {
+  var obj = {log: { type:'file', level: {label:'debug', value:10} } }
+  e = i.encode(obj, {whitespace: true})
+
+  t.equal(e, expectG)
+  t.end()
+})
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/package.json b/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/package.json
index 5e21ff8..ed2b5db 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/package.json
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/node_modules/rc/package.json
@@ -1,6 +1,6 @@
 {
   "name": "rc",
-  "version": "0.5.4",
+  "version": "0.5.5",
   "description": "hardwired configuration loader",
   "main": "index.js",
   "browserify": "browser.js",
@@ -34,7 +34,7 @@
     "minimist": "~0.0.7",
     "deep-extend": "~0.2.5",
     "strip-json-comments": "0.1.x",
-    "ini": "~1.1.0"
+    "ini": "~1.3.0"
   },
   "readme": "# rc\n\nThe non-configurable configuration loader for lazy people.\n\n## Usage\n\nThe only option is to pass rc the name of your app, and your default configuration.\n\n```javascript\nvar conf = require('rc')(appname, {\n  //defaults go here.\n  port: 2468,\n\n  //defaults which are objects will be merged, not replaced\n  views: {\n    engine: 'jade'\n  }\n});\n```\n\n`rc` will return your configuration options merged with the defaults you specify.\nIf you pass in a predefined defaults object, it will be mutated:\n\n```javascript\nvar conf = {};\nrequire('rc')(appname, conf);\n```\n\n\n## Standards\n\nGiven your application name (`appname`), rc will look in all the obvious places for configuration.\n\n  * command line arguments (parsed by minimist)\n  * environment variables prefixed with `${appname}_`\n    * or use \"\\_\\_\" to indicate nested properties <br/> _(e.g. `appname_foo__bar__baz` => `foo.bar.baz`)_\n  * if you passed an option `--config file` then from that file\n  * a local `.${appname}rc` or the first found looking in `./ ../ ../../ ../../../` etc.\n  * `$HOME/.${appname}rc`\n  * `$HOME/.${appname}/config`\n  * `$HOME/.config/${appname}`\n  * `$HOME/.config/${appname}/config`\n  * `/etc/${appname}rc`\n  * `/etc/${appname}/config`\n  * the defaults object you passed in.\n\nAll configuration sources that were found will be flattened into one object,\nso that sources **earlier** in this list override later ones.\n\n\n## Configuration File Formats\n\nConfiguration files (e.g. `.appnamerc`) may be in either [json](http://json.org/example) or [ini](http://en.wikipedia.org/wiki/INI_file) format. The example configurations below are equivalent:\n\n\n#### Formatted as `ini`\n\n```\n; You can include comments in `ini` format if you want.\n\ndependsOn=0.10.0\n\n\n; `rc` has built-in support for ini sections, see?\n\n[commands]\n  www     = ./commands/www\n  console = ./commands/repl\n\n\n; You can even do nested sections\n\n[generators.options]\n  engine  = ejs\n\n[generators.modules]\n  new     = generate-new\n  engine  = generate-backend\n\n```\n\n#### Formatted as `json`\n\n```json\n{\n  // You can even comment your JSON, if you want\n  \"dependsOn\": \"0.10.0\",\n  \"commands\": {\n    \"www\": \"./commands/www\",\n    \"console\": \"./commands/repl\"\n  },\n  \"generators\": {\n    \"options\": {\n      \"engine\": \"ejs\"\n    },\n    \"modules\": {\n      \"new\": \"generate-new\",\n      \"backend\": \"generate-backend\"\n    }\n  }\n}\n```\n\nComments are stripped from JSON config via [strip-json-comments](https://github.com/sindresorhus/strip-json-comments).\n\n> Since ini, and env variables do not have a standard for types, your application needs be prepared for strings.\n\n\n\n## Advanced Usage\n\n#### Pass in your own `argv`\n\nYou may pass in your own `argv` as the third argument to `rc`.  This is in case you want to [use your own command-line opts parser](https://github.com/dominictarr/rc/pull/12).\n\n```javascript\nrequire('rc')(appname, defaults, customArgvParser);\n```\n\n\n## Note on Performance\n\n`rc` is running `fs.statSync`-- so make sure you don't use it in a hot code path (e.g. a request handler) \n\n\n## License\n\nBSD / MIT / Apache2\n",
   "readmeFilename": "README.md",
@@ -42,6 +42,10 @@
     "url": "https://github.com/dominictarr/rc/issues"
   },
   "homepage": "https://github.com/dominictarr/rc",
-  "_id": "rc@0.5.4",
-  "_from": "rc@^0.5.1"
+  "_id": "rc@0.5.5",
+  "dist": {
+    "shasum": "845e4b7f13f91d581624a2aebc9da7413a8f54cd"
+  },
+  "_from": "rc@^0.5.1",
+  "_resolved": "https://registry.npmjs.org/rc/-/rc-0.5.5.tgz"
 }
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/package.json b/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/package.json
index 22247e9..f9a9078 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/package.json
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/registry-url/package.json
@@ -1,6 +1,6 @@
 {
   "name": "registry-url",
-  "version": "2.0.0",
+  "version": "2.1.0",
   "description": "Get the set npm registry URL",
   "license": "MIT",
   "repository": {
@@ -42,6 +42,10 @@
     "url": "https://github.com/sindresorhus/registry-url/issues"
   },
   "homepage": "https://github.com/sindresorhus/registry-url",
-  "_id": "registry-url@2.0.0",
-  "_from": "registry-url@^2.0.0"
+  "_id": "registry-url@2.1.0",
+  "dist": {
+    "shasum": "f52abd6092ff2eac183792952404a22ebe6a7cc4"
+  },
+  "_from": "registry-url@^2.0.0",
+  "_resolved": "https://registry.npmjs.org/registry-url/-/registry-url-2.1.0.tgz"
 }
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/README.md b/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/README.md
index 5e2862f..1ec8089 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/README.md
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/README.md
@@ -267,6 +267,9 @@
   `v2` is greater.  Sorts in ascending order if passed to `Array.sort()`.
 * `rcompare(v1, v2)`: The reverse of compare.  Sorts an array of versions
   in descending order when passed to `Array.sort()`.
+* `diff(v1, v2)`: Returns difference between two versions by the release type
+  (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`),
+  or null if the versions are the same.
 
 
 ### Ranges
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/package.json b/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/package.json
index d941df1..65f4231 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/package.json
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/package.json
@@ -1,6 +1,6 @@
 {
   "name": "semver",
-  "version": "4.1.1",
+  "version": "4.2.0",
   "description": "The semantic version parser used by npm.",
   "main": "semver.js",
   "browser": "semver.browser.js",
@@ -21,12 +21,12 @@
   "bin": {
     "semver": "./bin/semver"
   },
-  "readme": "semver(1) -- The semantic versioner for npm\n===========================================\n\n## Usage\n\n    $ npm install semver\n\n    semver.valid('1.2.3') // '1.2.3'\n    semver.valid('a.b.c') // null\n    semver.clean('  =v1.2.3   ') // '1.2.3'\n    semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true\n    semver.gt('1.2.3', '9.8.7') // false\n    semver.lt('1.2.3', '9.8.7') // true\n\nAs a command-line utility:\n\n    $ semver -h\n\n    Usage: semver <version> [<version> [...]] [-r <range> | -i <inc> | --preid <identifier> | -l | -rv]\n    Test if version(s) satisfy the supplied range(s), and sort them.\n\n    Multiple versions or ranges may be supplied, unless increment\n    option is specified.  In that case, only a single version may\n    be used, and it is incremented by the specified level\n\n    Program exits successfully if any valid version satisfies\n    all supplied ranges, and prints all satisfying versions.\n\n    If no versions are valid, or ranges are not satisfied,\n    then exits failure.\n\n    Versions are printed in ascending order, so supplying\n    multiple versions to the utility will just sort them.\n\n## Versions\n\nA \"version\" is described by the `v2.0.0` specification found at\n<http://semver.org/>.\n\nA leading `\"=\"` or `\"v\"` character is stripped off and ignored.\n\n## Ranges\n\nA `version range` is a set of `comparators` which specify versions\nthat satisfy the range.\n\nA `comparator` is composed of an `operator` and a `version`.  The set\nof primitive `operators` is:\n\n* `<` Less than\n* `<=` Less than or equal to\n* `>` Greater than\n* `>=` Greater than or equal to\n* `=` Equal.  If no operator is specified, then equality is assumed,\n  so this operator is optional, but MAY be included.\n\nFor example, the comparator `>=1.2.7` would match the versions\n`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6`\nor `1.1.0`.\n\nComparators can be joined by whitespace to form a `comparator set`,\nwhich is satisfied by the **intersection** of all of the comparators\nit includes.\n\nA range is composed of one or more comparator sets, joined by `||`.  A\nversion matches a range if and only if every comparator in at least\none of the `||`-separated comparator sets is satisfied by the version.\n\nFor example, the range `>=1.2.7 <1.3.0` would match the versions\n`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`,\nor `1.1.0`.\n\nThe range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`,\n`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`.\n\n### Prerelease Tags\n\nIf a version has a prerelease tag (for example, `1.2.3-alpha.3`) then\nit will only be allowed to satisfy comparator sets if at least one\ncomparator with the same `[major, minor, patch]` tuple also has a\nprerelease tag.\n\nFor example, the range `>1.2.3-alpha.3` would be allowed to match the\nversion `1.2.3-alpha.7`, but it would *not* be satisfied by\n`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically \"greater\nthan\" `1.2.3-alpha.3` according to the SemVer sort rules.  The version\nrange only accepts prerelease tags on the `1.2.3` version.  The\nversion `3.4.5` *would* satisfy the range, because it does not have a\nprerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`.\n\nThe purpose for this behavior is twofold.  First, prerelease versions\nfrequently are updated very quickly, and contain many breaking changes\nthat are (by the author's design) not yet fit for public consumption.\nTherefore, by default, they are excluded from range matching\nsemantics.\n\nSecond, a user who has opted into using a prerelease version has\nclearly indicated the intent to use *that specific* set of\nalpha/beta/rc versions.  By including a prerelease tag in the range,\nthe user is indicating that they are aware of the risk.  However, it\nis still not appropriate to assume that they have opted into taking a\nsimilar risk on the *next* set of prerelease versions.\n\n#### Prerelease Identifiers\n\nThe method `.inc` takes an additional `identifier` string argument that\nwill append the value of the string as a prerelease identifier:\n\n````javascript\n> semver.inc('1.2.3', 'pre', 'beta')\n'1.2.4-beta.0'\n```\n\ncommand-line example:\n\n```shell\n$ semver 1.2.3 -i prerelease --preid beta\n1.2.4-beta.0\n```\n\nWhich then can be used to increment further:\n\n```shell\n$ semver 1.2.4-beta.0 -i prerelease\n1.2.4-beta.1\n```\n\n### Advanced Range Syntax\n\nAdvanced range syntax desugars to primitive comparators in\ndeterministic ways.\n\nAdvanced ranges may be combined in the same way as primitive\ncomparators using white space or `||`.\n\n#### Hyphen Ranges `X.Y.Z - A.B.C`\n\nSpecifies an inclusive set.\n\n* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`\n\nIf a partial version is provided as the first version in the inclusive\nrange, then the missing pieces are replaced with zeroes.\n\n* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4`\n\nIf a partial version is provided as the second version in the\ninclusive range, then all versions that start with the supplied parts\nof the tuple are accepted, but nothing that would be greater than the\nprovided tuple parts.\n\n* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0`\n* `1.2.3 - 2` := `>=1.2.3 <3.0.0`\n\n#### X-Ranges `1.2.x` `1.X` `1.2.*` `*`\n\nAny of `X`, `x`, or `*` may be used to \"stand in\" for one of the\nnumeric values in the `[major, minor, patch]` tuple.\n\n* `*` := `>=0.0.0` (Any version satisfies)\n* `1.x` := `>=1.0.0 <2.0.0` (Matching major version)\n* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions)\n\nA partial version range is treated as an X-Range, so the special\ncharacter is in fact optional.\n\n* `\"\"` (empty string) := `*` := `>=0.0.0`\n* `1` := `1.x.x` := `>=1.0.0 <2.0.0`\n* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0`\n\n#### Tilde Ranges `~1.2.3` `~1.2` `~1`\n\nAllows patch-level changes if a minor version is specified on the\ncomparator.  Allows minor-level changes if not.\n\n* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0`\n* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`)\n* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`)\n* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0`\n* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`)\n* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`)\n* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in\n  the `1.2.3` version will be allowed, if they are greater than or\n  equal to `beta.2`.  So, `1.2.3-beta.4` would be allowed, but\n  `1.2.4-beta.2` would not, because it is a prerelease of a\n  different `[major, minor, patch]` tuple.\n\n#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4`\n\nAllows changes that do not modify the left-most non-zero digit in the\n`[major, minor, patch]` tuple.  In other words, this allows patch and\nminor updates for versions `1.0.0` and above, patch updates for\nversions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`.\n\nMany authors treat a `0.x` version as if the `x` were the major\n\"breaking-change\" indicator.\n\nCaret ranges are ideal when an author may make breaking changes\nbetween `0.2.4` and `0.3.0` releases, which is a common practice.\nHowever, it presumes that there will *not* be breaking changes between\n`0.2.4` and `0.2.5`.  It allows for changes that are presumed to be\nadditive (but non-breaking), according to commonly observed practices.\n\n* `^1.2.3` := `>=1.2.3 <2.0.0`\n* `^0.2.3` := `>=0.2.3 <0.3.0`\n* `^0.0.3` := `>=0.0.3 <0.0.4`\n* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in\n  the `1.2.3` version will be allowed, if they are greater than or\n  equal to `beta.2`.  So, `1.2.3-beta.4` would be allowed, but\n  `1.2.4-beta.2` would not, because it is a prerelease of a\n  different `[major, minor, patch]` tuple.\n* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4`  Note that prereleases in the\n  `0.0.3` version *only* will be allowed, if they are greater than or\n  equal to `beta`.  So, `0.0.3-pr.2` would be allowed.\n\nWhen parsing caret ranges, a missing `patch` value desugars to the\nnumber `0`, but will allow flexibility within that value, even if the\nmajor and minor versions are both `0`.\n\n* `^1.2.x` := `>=1.2.0 <2.0.0`\n* `^0.0.x` := `>=0.0.0 <0.1.0`\n* `^0.0` := `>=0.0.0 <0.1.0`\n\nA missing `minor` and `patch` values will desugar to zero, but also\nallow flexibility within those values, even if the major version is\nzero.\n\n* `^1.x` := `>=1.0.0 <2.0.0`\n* `^0.x` := `>=0.0.0 <1.0.0`\n\n## Functions\n\nAll methods and classes take a final `loose` boolean argument that, if\ntrue, will be more forgiving about not-quite-valid semver strings.\nThe resulting output will always be 100% strict, of course.\n\nStrict-mode Comparators and Ranges will be strict about the SemVer\nstrings that they parse.\n\n* `valid(v)`: Return the parsed version, or null if it's not valid.\n* `inc(v, release)`: Return the version incremented by the release\n  type (`major`,   `premajor`, `minor`, `preminor`, `patch`,\n  `prepatch`, or `prerelease`), or null if it's not valid\n  * `premajor` in one call will bump the version up to the next major\n    version and down to a prerelease of that major version.\n    `preminor`, and `prepatch` work the same way.\n  * If called from a non-prerelease version, the `prerelease` will work the\n    same as `prepatch`. It increments the patch version, then makes a\n    prerelease. If the input version is already a prerelease it simply\n    increments it.\n\n### Comparison\n\n* `gt(v1, v2)`: `v1 > v2`\n* `gte(v1, v2)`: `v1 >= v2`\n* `lt(v1, v2)`: `v1 < v2`\n* `lte(v1, v2)`: `v1 <= v2`\n* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent,\n  even if they're not the exact same string.  You already know how to\n  compare strings.\n* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`.\n* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call\n  the corresponding function above.  `\"===\"` and `\"!==\"` do simple\n  string comparison, but are included for completeness.  Throws if an\n  invalid comparison string is provided.\n* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if\n  `v2` is greater.  Sorts in ascending order if passed to `Array.sort()`.\n* `rcompare(v1, v2)`: The reverse of compare.  Sorts an array of versions\n  in descending order when passed to `Array.sort()`.\n\n\n### Ranges\n\n* `validRange(range)`: Return the valid range or null if it's not valid\n* `satisfies(version, range)`: Return true if the version satisfies the\n  range.\n* `maxSatisfying(versions, range)`: Return the highest version in the list\n  that satisfies the range, or `null` if none of them do.\n* `gtr(version, range)`: Return `true` if version is greater than all the\n  versions possible in the range.\n* `ltr(version, range)`: Return `true` if version is less than all the\n  versions possible in the range.\n* `outside(version, range, hilo)`: Return true if the version is outside\n  the bounds of the range in either the high or low direction.  The\n  `hilo` argument must be either the string `'>'` or `'<'`.  (This is\n  the function called by `gtr` and `ltr`.)\n\nNote that, since ranges may be non-contiguous, a version might not be\ngreater than a range, less than a range, *or* satisfy a range!  For\nexample, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9`\nuntil `2.0.0`, so the version `1.2.10` would not be greater than the\nrange (because `2.0.1` satisfies, which is higher), nor less than the\nrange (since `1.2.8` satisfies, which is lower), and it also does not\nsatisfy the range.\n\nIf you want to know if a version satisfies or does not satisfy a\nrange, use the `satisfies(version, range)` function.\n",
+  "readme": "semver(1) -- The semantic versioner for npm\n===========================================\n\n## Usage\n\n    $ npm install semver\n\n    semver.valid('1.2.3') // '1.2.3'\n    semver.valid('a.b.c') // null\n    semver.clean('  =v1.2.3   ') // '1.2.3'\n    semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true\n    semver.gt('1.2.3', '9.8.7') // false\n    semver.lt('1.2.3', '9.8.7') // true\n\nAs a command-line utility:\n\n    $ semver -h\n\n    Usage: semver <version> [<version> [...]] [-r <range> | -i <inc> | --preid <identifier> | -l | -rv]\n    Test if version(s) satisfy the supplied range(s), and sort them.\n\n    Multiple versions or ranges may be supplied, unless increment\n    option is specified.  In that case, only a single version may\n    be used, and it is incremented by the specified level\n\n    Program exits successfully if any valid version satisfies\n    all supplied ranges, and prints all satisfying versions.\n\n    If no versions are valid, or ranges are not satisfied,\n    then exits failure.\n\n    Versions are printed in ascending order, so supplying\n    multiple versions to the utility will just sort them.\n\n## Versions\n\nA \"version\" is described by the `v2.0.0` specification found at\n<http://semver.org/>.\n\nA leading `\"=\"` or `\"v\"` character is stripped off and ignored.\n\n## Ranges\n\nA `version range` is a set of `comparators` which specify versions\nthat satisfy the range.\n\nA `comparator` is composed of an `operator` and a `version`.  The set\nof primitive `operators` is:\n\n* `<` Less than\n* `<=` Less than or equal to\n* `>` Greater than\n* `>=` Greater than or equal to\n* `=` Equal.  If no operator is specified, then equality is assumed,\n  so this operator is optional, but MAY be included.\n\nFor example, the comparator `>=1.2.7` would match the versions\n`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6`\nor `1.1.0`.\n\nComparators can be joined by whitespace to form a `comparator set`,\nwhich is satisfied by the **intersection** of all of the comparators\nit includes.\n\nA range is composed of one or more comparator sets, joined by `||`.  A\nversion matches a range if and only if every comparator in at least\none of the `||`-separated comparator sets is satisfied by the version.\n\nFor example, the range `>=1.2.7 <1.3.0` would match the versions\n`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`,\nor `1.1.0`.\n\nThe range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`,\n`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`.\n\n### Prerelease Tags\n\nIf a version has a prerelease tag (for example, `1.2.3-alpha.3`) then\nit will only be allowed to satisfy comparator sets if at least one\ncomparator with the same `[major, minor, patch]` tuple also has a\nprerelease tag.\n\nFor example, the range `>1.2.3-alpha.3` would be allowed to match the\nversion `1.2.3-alpha.7`, but it would *not* be satisfied by\n`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically \"greater\nthan\" `1.2.3-alpha.3` according to the SemVer sort rules.  The version\nrange only accepts prerelease tags on the `1.2.3` version.  The\nversion `3.4.5` *would* satisfy the range, because it does not have a\nprerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`.\n\nThe purpose for this behavior is twofold.  First, prerelease versions\nfrequently are updated very quickly, and contain many breaking changes\nthat are (by the author's design) not yet fit for public consumption.\nTherefore, by default, they are excluded from range matching\nsemantics.\n\nSecond, a user who has opted into using a prerelease version has\nclearly indicated the intent to use *that specific* set of\nalpha/beta/rc versions.  By including a prerelease tag in the range,\nthe user is indicating that they are aware of the risk.  However, it\nis still not appropriate to assume that they have opted into taking a\nsimilar risk on the *next* set of prerelease versions.\n\n#### Prerelease Identifiers\n\nThe method `.inc` takes an additional `identifier` string argument that\nwill append the value of the string as a prerelease identifier:\n\n````javascript\n> semver.inc('1.2.3', 'pre', 'beta')\n'1.2.4-beta.0'\n```\n\ncommand-line example:\n\n```shell\n$ semver 1.2.3 -i prerelease --preid beta\n1.2.4-beta.0\n```\n\nWhich then can be used to increment further:\n\n```shell\n$ semver 1.2.4-beta.0 -i prerelease\n1.2.4-beta.1\n```\n\n### Advanced Range Syntax\n\nAdvanced range syntax desugars to primitive comparators in\ndeterministic ways.\n\nAdvanced ranges may be combined in the same way as primitive\ncomparators using white space or `||`.\n\n#### Hyphen Ranges `X.Y.Z - A.B.C`\n\nSpecifies an inclusive set.\n\n* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`\n\nIf a partial version is provided as the first version in the inclusive\nrange, then the missing pieces are replaced with zeroes.\n\n* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4`\n\nIf a partial version is provided as the second version in the\ninclusive range, then all versions that start with the supplied parts\nof the tuple are accepted, but nothing that would be greater than the\nprovided tuple parts.\n\n* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0`\n* `1.2.3 - 2` := `>=1.2.3 <3.0.0`\n\n#### X-Ranges `1.2.x` `1.X` `1.2.*` `*`\n\nAny of `X`, `x`, or `*` may be used to \"stand in\" for one of the\nnumeric values in the `[major, minor, patch]` tuple.\n\n* `*` := `>=0.0.0` (Any version satisfies)\n* `1.x` := `>=1.0.0 <2.0.0` (Matching major version)\n* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions)\n\nA partial version range is treated as an X-Range, so the special\ncharacter is in fact optional.\n\n* `\"\"` (empty string) := `*` := `>=0.0.0`\n* `1` := `1.x.x` := `>=1.0.0 <2.0.0`\n* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0`\n\n#### Tilde Ranges `~1.2.3` `~1.2` `~1`\n\nAllows patch-level changes if a minor version is specified on the\ncomparator.  Allows minor-level changes if not.\n\n* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0`\n* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`)\n* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`)\n* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0`\n* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`)\n* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`)\n* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in\n  the `1.2.3` version will be allowed, if they are greater than or\n  equal to `beta.2`.  So, `1.2.3-beta.4` would be allowed, but\n  `1.2.4-beta.2` would not, because it is a prerelease of a\n  different `[major, minor, patch]` tuple.\n\n#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4`\n\nAllows changes that do not modify the left-most non-zero digit in the\n`[major, minor, patch]` tuple.  In other words, this allows patch and\nminor updates for versions `1.0.0` and above, patch updates for\nversions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`.\n\nMany authors treat a `0.x` version as if the `x` were the major\n\"breaking-change\" indicator.\n\nCaret ranges are ideal when an author may make breaking changes\nbetween `0.2.4` and `0.3.0` releases, which is a common practice.\nHowever, it presumes that there will *not* be breaking changes between\n`0.2.4` and `0.2.5`.  It allows for changes that are presumed to be\nadditive (but non-breaking), according to commonly observed practices.\n\n* `^1.2.3` := `>=1.2.3 <2.0.0`\n* `^0.2.3` := `>=0.2.3 <0.3.0`\n* `^0.0.3` := `>=0.0.3 <0.0.4`\n* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in\n  the `1.2.3` version will be allowed, if they are greater than or\n  equal to `beta.2`.  So, `1.2.3-beta.4` would be allowed, but\n  `1.2.4-beta.2` would not, because it is a prerelease of a\n  different `[major, minor, patch]` tuple.\n* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4`  Note that prereleases in the\n  `0.0.3` version *only* will be allowed, if they are greater than or\n  equal to `beta`.  So, `0.0.3-pr.2` would be allowed.\n\nWhen parsing caret ranges, a missing `patch` value desugars to the\nnumber `0`, but will allow flexibility within that value, even if the\nmajor and minor versions are both `0`.\n\n* `^1.2.x` := `>=1.2.0 <2.0.0`\n* `^0.0.x` := `>=0.0.0 <0.1.0`\n* `^0.0` := `>=0.0.0 <0.1.0`\n\nA missing `minor` and `patch` values will desugar to zero, but also\nallow flexibility within those values, even if the major version is\nzero.\n\n* `^1.x` := `>=1.0.0 <2.0.0`\n* `^0.x` := `>=0.0.0 <1.0.0`\n\n## Functions\n\nAll methods and classes take a final `loose` boolean argument that, if\ntrue, will be more forgiving about not-quite-valid semver strings.\nThe resulting output will always be 100% strict, of course.\n\nStrict-mode Comparators and Ranges will be strict about the SemVer\nstrings that they parse.\n\n* `valid(v)`: Return the parsed version, or null if it's not valid.\n* `inc(v, release)`: Return the version incremented by the release\n  type (`major`,   `premajor`, `minor`, `preminor`, `patch`,\n  `prepatch`, or `prerelease`), or null if it's not valid\n  * `premajor` in one call will bump the version up to the next major\n    version and down to a prerelease of that major version.\n    `preminor`, and `prepatch` work the same way.\n  * If called from a non-prerelease version, the `prerelease` will work the\n    same as `prepatch`. It increments the patch version, then makes a\n    prerelease. If the input version is already a prerelease it simply\n    increments it.\n\n### Comparison\n\n* `gt(v1, v2)`: `v1 > v2`\n* `gte(v1, v2)`: `v1 >= v2`\n* `lt(v1, v2)`: `v1 < v2`\n* `lte(v1, v2)`: `v1 <= v2`\n* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent,\n  even if they're not the exact same string.  You already know how to\n  compare strings.\n* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`.\n* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call\n  the corresponding function above.  `\"===\"` and `\"!==\"` do simple\n  string comparison, but are included for completeness.  Throws if an\n  invalid comparison string is provided.\n* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if\n  `v2` is greater.  Sorts in ascending order if passed to `Array.sort()`.\n* `rcompare(v1, v2)`: The reverse of compare.  Sorts an array of versions\n  in descending order when passed to `Array.sort()`.\n* `diff(v1, v2)`: Returns difference between two versions by the release type\n  (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`),\n  or null if the versions are the same.\n\n\n### Ranges\n\n* `validRange(range)`: Return the valid range or null if it's not valid\n* `satisfies(version, range)`: Return true if the version satisfies the\n  range.\n* `maxSatisfying(versions, range)`: Return the highest version in the list\n  that satisfies the range, or `null` if none of them do.\n* `gtr(version, range)`: Return `true` if version is greater than all the\n  versions possible in the range.\n* `ltr(version, range)`: Return `true` if version is less than all the\n  versions possible in the range.\n* `outside(version, range, hilo)`: Return true if the version is outside\n  the bounds of the range in either the high or low direction.  The\n  `hilo` argument must be either the string `'>'` or `'<'`.  (This is\n  the function called by `gtr` and `ltr`.)\n\nNote that, since ranges may be non-contiguous, a version might not be\ngreater than a range, less than a range, *or* satisfy a range!  For\nexample, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9`\nuntil `2.0.0`, so the version `1.2.10` would not be greater than the\nrange (because `2.0.1` satisfies, which is higher), nor less than the\nrange (since `1.2.8` satisfies, which is lower), and it also does not\nsatisfy the range.\n\nIf you want to know if a version satisfies or does not satisfy a\nrange, use the `satisfies(version, range)` function.\n",
   "readmeFilename": "README.md",
   "bugs": {
     "url": "https://github.com/isaacs/node-semver/issues"
   },
   "homepage": "https://github.com/isaacs/node-semver",
-  "_id": "semver@4.1.1",
+  "_id": "semver@4.2.0",
   "_from": "semver@^4.0.0"
 }
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.browser.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.browser.js
index 712de83..49d7856 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.browser.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.browser.js
@@ -454,6 +454,33 @@
   }
 }
 
+exports.diff = diff;
+function diff(version1, version2) {
+  if (eq(version1, version2)) {
+    return null;
+  } else {
+    var v1 = parse(version1);
+    var v2 = parse(version2);
+    if (v1.prerelease.length || v2.prerelease.length) {
+      for (var key in v1) {
+        if (key === 'major' || key === 'minor' || key === 'patch') {
+          if (v1[key] !== v2[key]) {
+            return 'pre'+key;
+          }
+        }
+      }
+      return 'prerelease';
+    }
+    for (var key in v1) {
+      if (key === 'major' || key === 'minor' || key === 'patch') {
+        if (v1[key] !== v2[key]) {
+          return key;
+        }
+      }
+    }
+  }
+}
+
 exports.compareIdentifiers = compareIdentifiers;
 
 var numeric = /^[0-9]+$/;
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.browser.js.gz b/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.browser.js.gz
index 53d5194..c6b27c9 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.browser.js.gz
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.browser.js.gz
Binary files differ
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.js
index 22673fd..026173e 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.js
@@ -464,6 +464,33 @@
   }
 }
 
+exports.diff = diff;
+function diff(version1, version2) {
+  if (eq(version1, version2)) {
+    return null;
+  } else {
+    var v1 = parse(version1);
+    var v2 = parse(version2);
+    if (v1.prerelease.length || v2.prerelease.length) {
+      for (var key in v1) {
+        if (key === 'major' || key === 'minor' || key === 'patch') {
+          if (v1[key] !== v2[key]) {
+            return 'pre'+key;
+          }
+        }
+      }
+      return 'prerelease';
+    }
+    for (var key in v1) {
+      if (key === 'major' || key === 'minor' || key === 'patch') {
+        if (v1[key] !== v2[key]) {
+          return key;
+        }
+      }
+    }
+  }
+}
+
 exports.compareIdentifiers = compareIdentifiers;
 
 var numeric = /^[0-9]+$/;
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.min.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.min.js
index e69de29..2f07e16 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.min.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.min.js
@@ -0,0 +1 @@
+(function(e){if(typeof module==="object"&&module.exports===e)e=module.exports=H;e.SEMVER_SPEC_VERSION="2.0.0";var r=e.re=[];var t=e.src=[];var n=0;var i=n++;t[i]="0|[1-9]\\d*";var s=n++;t[s]="[0-9]+";var a=n++;t[a]="\\d*[a-zA-Z-][a-zA-Z0-9-]*";var o=n++;t[o]="("+t[i]+")\\."+"("+t[i]+")\\."+"("+t[i]+")";var f=n++;t[f]="("+t[s]+")\\."+"("+t[s]+")\\."+"("+t[s]+")";var u=n++;t[u]="(?:"+t[i]+"|"+t[a]+")";var l=n++;t[l]="(?:"+t[s]+"|"+t[a]+")";var p=n++;t[p]="(?:-("+t[u]+"(?:\\."+t[u]+")*))";var c=n++;t[c]="(?:-?("+t[l]+"(?:\\."+t[l]+")*))";var h=n++;t[h]="[0-9A-Za-z-]+";var v=n++;t[v]="(?:\\+("+t[h]+"(?:\\."+t[h]+")*))";var m=n++;var g="v?"+t[o]+t[p]+"?"+t[v]+"?";t[m]="^"+g+"$";var w="[v=\\s]*"+t[f]+t[c]+"?"+t[v]+"?";var d=n++;t[d]="^"+w+"$";var y=n++;t[y]="((?:<|>)?=?)";var j=n++;t[j]=t[s]+"|x|X|\\*";var b=n++;t[b]=t[i]+"|x|X|\\*";var $=n++;t[$]="[v=\\s]*("+t[b]+")"+"(?:\\.("+t[b]+")"+"(?:\\.("+t[b]+")"+"(?:"+t[p]+")?"+t[v]+"?"+")?)?";var k=n++;t[k]="[v=\\s]*("+t[j]+")"+"(?:\\.("+t[j]+")"+"(?:\\.("+t[j]+")"+"(?:"+t[c]+")?"+t[v]+"?"+")?)?";var E=n++;t[E]="^"+t[y]+"\\s*"+t[$]+"$";var x=n++;t[x]="^"+t[y]+"\\s*"+t[k]+"$";var R=n++;t[R]="(?:~>?)";var S=n++;t[S]="(\\s*)"+t[R]+"\\s+";r[S]=new RegExp(t[S],"g");var V="$1~";var I=n++;t[I]="^"+t[R]+t[$]+"$";var T=n++;t[T]="^"+t[R]+t[k]+"$";var A=n++;t[A]="(?:\\^)";var C=n++;t[C]="(\\s*)"+t[A]+"\\s+";r[C]=new RegExp(t[C],"g");var M="$1^";var z=n++;t[z]="^"+t[A]+t[$]+"$";var N=n++;t[N]="^"+t[A]+t[k]+"$";var P=n++;t[P]="^"+t[y]+"\\s*("+w+")$|^$";var Z=n++;t[Z]="^"+t[y]+"\\s*("+g+")$|^$";var q=n++;t[q]="(\\s*)"+t[y]+"\\s*("+w+"|"+t[$]+")";r[q]=new RegExp(t[q],"g");var L="$1$2$3";var X=n++;t[X]="^\\s*("+t[$]+")"+"\\s+-\\s+"+"("+t[$]+")"+"\\s*$";var _=n++;t[_]="^\\s*("+t[k]+")"+"\\s+-\\s+"+"("+t[k]+")"+"\\s*$";var O=n++;t[O]="(<|>)?=?\\s*\\*";for(var B=0;B<n;B++){if(!r[B])r[B]=new RegExp(t[B])}e.parse=D;function D(e,t){var n=t?r[d]:r[m];return n.test(e)?new H(e,t):null}e.valid=F;function F(e,r){var t=D(e,r);return t?t.version:null}e.clean=G;function G(e,r){var t=D(e.trim().replace(/^[=v]+/,""),r);return t?t.version:null}e.SemVer=H;function H(e,t){if(e instanceof H){if(e.loose===t)return e;else e=e.version}else if(typeof e!=="string"){throw new TypeError("Invalid Version: "+e)}if(!(this instanceof H))return new H(e,t);this.loose=t;var n=e.trim().match(t?r[d]:r[m]);if(!n)throw new TypeError("Invalid Version: "+e);this.raw=e;this.major=+n[1];this.minor=+n[2];this.patch=+n[3];if(!n[4])this.prerelease=[];else this.prerelease=n[4].split(".").map(function(e){return/^[0-9]+$/.test(e)?+e:e});this.build=n[5]?n[5].split("."):[];this.format()}H.prototype.format=function(){this.version=this.major+"."+this.minor+"."+this.patch;if(this.prerelease.length)this.version+="-"+this.prerelease.join(".");return this.version};H.prototype.inspect=function(){return'<SemVer "'+this+'">'};H.prototype.toString=function(){return this.version};H.prototype.compare=function(e){if(!(e instanceof H))e=new H(e,this.loose);return this.compareMain(e)||this.comparePre(e)};H.prototype.compareMain=function(e){if(!(e instanceof H))e=new H(e,this.loose);return U(this.major,e.major)||U(this.minor,e.minor)||U(this.patch,e.patch)};H.prototype.comparePre=function(e){if(!(e instanceof H))e=new H(e,this.loose);if(this.prerelease.length&&!e.prerelease.length)return-1;else if(!this.prerelease.length&&e.prerelease.length)return 1;else if(!this.prerelease.length&&!e.prerelease.length)return 0;var r=0;do{var t=this.prerelease[r];var n=e.prerelease[r];if(t===undefined&&n===undefined)return 0;else if(n===undefined)return 1;else if(t===undefined)return-1;else if(t===n)continue;else return U(t,n)}while(++r)};H.prototype.inc=function(e,r){switch(e){case"premajor":this.prerelease.length=0;this.patch=0;this.minor=0;this.major++;this.inc("pre",r);break;case"preminor":this.prerelease.length=0;this.patch=0;this.minor++;this.inc("pre",r);break;case"prepatch":this.prerelease.length=0;this.inc("patch",r);this.inc("pre",r);break;case"prerelease":if(this.prerelease.length===0)this.inc("patch",r);this.inc("pre",r);break;case"major":if(this.minor!==0||this.patch!==0||this.prerelease.length===0)this.major++;this.minor=0;this.patch=0;this.prerelease=[];break;case"minor":if(this.patch!==0||this.prerelease.length===0)this.minor++;this.patch=0;this.prerelease=[];break;case"patch":if(this.prerelease.length===0)this.patch++;this.prerelease=[];break;case"pre":if(this.prerelease.length===0)this.prerelease=[0];else{var t=this.prerelease.length;while(--t>=0){if(typeof this.prerelease[t]==="number"){this.prerelease[t]++;t=-2}}if(t===-1)this.prerelease.push(0)}if(r){if(this.prerelease[0]===r){if(isNaN(this.prerelease[1]))this.prerelease=[r,0]}else this.prerelease=[r,0]}break;default:throw new Error("invalid increment argument: "+e)}this.format();return this};e.inc=J;function J(e,r,t,n){if(typeof t==="string"){n=t;t=undefined}try{return new H(e,t).inc(r,n).version}catch(i){return null}}e.diff=K;function K(e,r){if(ar(e,r)){return null}else{var t=D(e);var n=D(r);if(t.prerelease.length||n.prerelease.length){for(var i in t){if(i==="major"||i==="minor"||i==="patch"){if(t[i]!==n[i]){return"pre"+i}}}return"prerelease"}for(var i in t){if(i==="major"||i==="minor"||i==="patch"){if(t[i]!==n[i]){return i}}}}}e.compareIdentifiers=U;var Q=/^[0-9]+$/;function U(e,r){var t=Q.test(e);var n=Q.test(r);if(t&&n){e=+e;r=+r}return t&&!n?-1:n&&!t?1:e<r?-1:e>r?1:0}e.rcompareIdentifiers=W;function W(e,r){return U(r,e)}e.compare=Y;function Y(e,r,t){return new H(e,t).compare(r)}e.compareLoose=er;function er(e,r){return Y(e,r,true)}e.rcompare=rr;function rr(e,r,t){return Y(r,e,t)}e.sort=tr;function tr(r,t){return r.sort(function(r,n){return e.compare(r,n,t)})}e.rsort=nr;function nr(r,t){return r.sort(function(r,n){return e.rcompare(r,n,t)})}e.gt=ir;function ir(e,r,t){return Y(e,r,t)>0}e.lt=sr;function sr(e,r,t){return Y(e,r,t)<0}e.eq=ar;function ar(e,r,t){return Y(e,r,t)===0}e.neq=or;function or(e,r,t){return Y(e,r,t)!==0}e.gte=fr;function fr(e,r,t){return Y(e,r,t)>=0}e.lte=ur;function ur(e,r,t){return Y(e,r,t)<=0}e.cmp=lr;function lr(e,r,t,n){var i;switch(r){case"===":if(typeof e==="object")e=e.version;if(typeof t==="object")t=t.version;i=e===t;break;case"!==":if(typeof e==="object")e=e.version;if(typeof t==="object")t=t.version;i=e!==t;break;case"":case"=":case"==":i=ar(e,t,n);break;case"!=":i=or(e,t,n);break;case">":i=ir(e,t,n);break;case">=":i=fr(e,t,n);break;case"<":i=sr(e,t,n);break;case"<=":i=ur(e,t,n);break;default:throw new TypeError("Invalid operator: "+r)}return i}e.Comparator=pr;function pr(e,r){if(e instanceof pr){if(e.loose===r)return e;else e=e.value}if(!(this instanceof pr))return new pr(e,r);this.loose=r;this.parse(e);if(this.semver===cr)this.value="";else this.value=this.operator+this.semver.version}var cr={};pr.prototype.parse=function(e){var t=this.loose?r[P]:r[Z];var n=e.match(t);if(!n)throw new TypeError("Invalid comparator: "+e);this.operator=n[1];if(this.operator==="=")this.operator="";if(!n[2])this.semver=cr;else this.semver=new H(n[2],this.loose)};pr.prototype.inspect=function(){return'<SemVer Comparator "'+this+'">'};pr.prototype.toString=function(){return this.value};pr.prototype.test=function(e){if(this.semver===cr)return true;if(typeof e==="string")e=new H(e,this.loose);return lr(e,this.operator,this.semver,this.loose)};e.Range=hr;function hr(e,r){if(e instanceof hr&&e.loose===r)return e;if(!(this instanceof hr))return new hr(e,r);this.loose=r;this.raw=e;this.set=e.split(/\s*\|\|\s*/).map(function(e){return this.parseRange(e.trim())},this).filter(function(e){return e.length});if(!this.set.length){throw new TypeError("Invalid SemVer Range: "+e)}this.format()}hr.prototype.inspect=function(){return'<SemVer Range "'+this.range+'">'};hr.prototype.format=function(){this.range=this.set.map(function(e){return e.join(" ").trim()}).join("||").trim();return this.range};hr.prototype.toString=function(){return this.range};hr.prototype.parseRange=function(e){var t=this.loose;e=e.trim();var n=t?r[_]:r[X];e=e.replace(n,Er);e=e.replace(r[q],L);e=e.replace(r[S],V);e=e.replace(r[C],M);e=e.split(/\s+/).join(" ");var i=t?r[P]:r[Z];var s=e.split(" ").map(function(e){return mr(e,t)}).join(" ").split(/\s+/);if(this.loose){s=s.filter(function(e){return!!e.match(i)})}s=s.map(function(e){return new pr(e,t)});return s};e.toComparators=vr;function vr(e,r){return new hr(e,r).set.map(function(e){return e.map(function(e){return e.value}).join(" ").trim().split(" ")})}function mr(e,r){e=yr(e,r);e=wr(e,r);e=br(e,r);e=kr(e,r);return e}function gr(e){return!e||e.toLowerCase()==="x"||e==="*"}function wr(e,r){return e.trim().split(/\s+/).map(function(e){return dr(e,r)}).join(" ")}function dr(e,t){var n=t?r[T]:r[I];return e.replace(n,function(e,r,t,n,i){var s;if(gr(r))s="";else if(gr(t))s=">="+r+".0.0 <"+(+r+1)+".0.0";else if(gr(n))s=">="+r+"."+t+".0 <"+r+"."+(+t+1)+".0";else if(i){if(i.charAt(0)!=="-")i="-"+i;s=">="+r+"."+t+"."+n+i+" <"+r+"."+(+t+1)+".0"}else s=">="+r+"."+t+"."+n+" <"+r+"."+(+t+1)+".0";return s})}function yr(e,r){return e.trim().split(/\s+/).map(function(e){return jr(e,r)}).join(" ")}function jr(e,t){var n=t?r[N]:r[z];return e.replace(n,function(e,r,t,n,i){var s;if(gr(r))s="";else if(gr(t))s=">="+r+".0.0 <"+(+r+1)+".0.0";else if(gr(n)){if(r==="0")s=">="+r+"."+t+".0 <"+r+"."+(+t+1)+".0";else s=">="+r+"."+t+".0 <"+(+r+1)+".0.0"}else if(i){if(i.charAt(0)!=="-")i="-"+i;if(r==="0"){if(t==="0")s=">="+r+"."+t+"."+n+i+" <"+r+"."+t+"."+(+n+1);else s=">="+r+"."+t+"."+n+i+" <"+r+"."+(+t+1)+".0"}else s=">="+r+"."+t+"."+n+i+" <"+(+r+1)+".0.0"}else{if(r==="0"){if(t==="0")s=">="+r+"."+t+"."+n+" <"+r+"."+t+"."+(+n+1);else s=">="+r+"."+t+"."+n+" <"+r+"."+(+t+1)+".0"}else s=">="+r+"."+t+"."+n+" <"+(+r+1)+".0.0"}return s})}function br(e,r){return e.split(/\s+/).map(function(e){return $r(e,r)}).join(" ")}function $r(e,t){e=e.trim();var n=t?r[x]:r[E];return e.replace(n,function(e,r,t,n,i,s){var a=gr(t);var o=a||gr(n);var f=o||gr(i);var u=f;if(r==="="&&u)r="";if(a){if(r===">"||r==="<"){e="<0.0.0"}else{e="*"}}else if(r&&u){if(o)n=0;if(f)i=0;if(r===">"){r=">=";if(o){t=+t+1;n=0;i=0}else if(f){n=+n+1;i=0}}else if(r==="<="){r="<";if(o)t=+t+1;else n=+n+1}e=r+t+"."+n+"."+i}else if(o){e=">="+t+".0.0 <"+(+t+1)+".0.0"}else if(f){e=">="+t+"."+n+".0 <"+t+"."+(+n+1)+".0"}return e})}function kr(e,t){return e.trim().replace(r[O],"")}function Er(e,r,t,n,i,s,a,o,f,u,l,p,c){if(gr(t))r="";else if(gr(n))r=">="+t+".0.0";else if(gr(i))r=">="+t+"."+n+".0";else r=">="+r;if(gr(f))o="";else if(gr(u))o="<"+(+f+1)+".0.0";else if(gr(l))o="<"+f+"."+(+u+1)+".0";else if(p)o="<="+f+"."+u+"."+l+"-"+p;else o="<="+o;return(r+" "+o).trim()}hr.prototype.test=function(e){if(!e)return false;if(typeof e==="string")e=new H(e,this.loose);for(var r=0;r<this.set.length;r++){if(xr(this.set[r],e))return true}return false};function xr(e,r){for(var t=0;t<e.length;t++){if(!e[t].test(r))return false}if(r.prerelease.length){for(var t=0;t<e.length;t++){if(e[t].semver===cr)return true;if(e[t].semver.prerelease.length>0){var n=e[t].semver;if(n.major===r.major&&n.minor===r.minor&&n.patch===r.patch)return true}}return false}return true}e.satisfies=Rr;function Rr(e,r,t){try{r=new hr(r,t)}catch(n){return false}return r.test(e)}e.maxSatisfying=Sr;function Sr(e,r,t){return e.filter(function(e){return Rr(e,r,t)}).sort(function(e,r){return rr(e,r,t)})[0]||null}e.validRange=Vr;function Vr(e,r){try{return new hr(e,r).range||"*"}catch(t){return null}}e.ltr=Ir;function Ir(e,r,t){return Ar(e,r,"<",t)}e.gtr=Tr;function Tr(e,r,t){return Ar(e,r,">",t)}e.outside=Ar;function Ar(e,r,t,n){e=new H(e,n);r=new hr(r,n);var i,s,a,o,f;switch(t){case">":i=ir;s=ur;a=sr;o=">";f=">=";break;case"<":i=sr;s=fr;a=ir;o="<";f="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(Rr(e,r,n)){return false}for(var u=0;u<r.set.length;++u){var l=r.set[u];var p=null;var c=null;l.forEach(function(e){p=p||e;c=c||e;if(i(e.semver,p.semver,n)){p=e}else if(a(e.semver,c.semver,n)){c=e}});if(p.operator===o||p.operator===f){return false}if((!c.operator||c.operator===o)&&s(e,c.semver)){return false}else if(c.operator===f&&a(e,c.semver)){return false}}return true}if(typeof define==="function"&&define.amd)define(e)})(typeof exports==="object"?exports:typeof define==="function"&&define.amd?{}:semver={});
\ No newline at end of file
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.min.js.gz b/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.min.js.gz
index 1b2a757..4a48bed 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.min.js.gz
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/semver.min.js.gz
Binary files differ
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/test/index.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/test/index.js
index de8acae..1528bb7 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/test/index.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/semver-diff/node_modules/semver/test/index.js
@@ -13,6 +13,7 @@
 var satisfies = semver.satisfies;
 var validRange = semver.validRange;
 var inc = semver.inc;
+var diff = semver.diff;
 var replaceStars = semver.replaceStars;
 var toComparators = semver.toComparators;
 var SemVer = semver.SemVer;
@@ -411,6 +412,34 @@
   t.end();
 });
 
+test('\ndiff versions test', function(t) {
+//  [version1, version2, result]
+//  diff(version1, version2) -> result
+  [['1.2.3', '0.2.3', 'major'],
+    ['1.4.5', '0.2.3', 'major'],
+    ['1.2.3', '2.0.0-pre', 'premajor'],
+    ['1.2.3', '1.3.3', 'minor'],
+    ['1.0.1', '1.1.0-pre', 'preminor'],
+    ['1.2.3', '1.2.4', 'patch'],
+    ['1.2.3', '1.2.4-pre', 'prepatch'],
+    ['0.0.1', '0.0.1-pre', 'prerelease'],
+    ['0.0.1', '0.0.1-pre-2', 'prerelease'],
+    ['1.1.0', '1.1.0-pre', 'prerelease'],
+    ['1.1.0-pre-1', '1.1.0-pre-2', 'prerelease'],
+    ['1.0.0', '1.0.0', null]
+
+  ].forEach(function(v) {
+    var version1 = v[0];
+    var version2 = v[1];
+    var wanted = v[2];
+    var found = diff(version1, version2);
+    var cmd = 'diff(' + version1 + ', ' + version2 + ')';
+    t.equal(found, wanted, cmd + ' === ' + wanted);
+  });
+
+  t.end();
+});
+
 test('\nvalid range test', function(t) {
   // [range, result]
   // validRange(range) -> result
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/string-length/node_modules/strip-ansi/cli.js b/node_modules/vulcanize/node_modules/update-notifier/node_modules/string-length/node_modules/strip-ansi/cli.js
index 5b9546a..b83f63b 100755
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/string-length/node_modules/strip-ansi/cli.js
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/string-length/node_modules/strip-ansi/cli.js
@@ -34,12 +34,12 @@
 	return;
 }
 
-if (process.stdin.isTTY) {
-	if (!input) {
-		help();
-		return;
-	}
+if (!input && process.stdin.isTTY) {
+	help();
+	return;
+}
 
+if (input) {
 	init(fs.readFileSync(input, 'utf8'));
 } else {
 	process.stdin.setEncoding('utf8');
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/string-length/node_modules/strip-ansi/package.json b/node_modules/vulcanize/node_modules/update-notifier/node_modules/string-length/node_modules/strip-ansi/package.json
index 23c0ceb..e608578 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/string-length/node_modules/strip-ansi/package.json
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/string-length/node_modules/strip-ansi/package.json
@@ -1,6 +1,6 @@
 {
   "name": "strip-ansi",
-  "version": "2.0.0",
+  "version": "2.0.1",
   "description": "Strip ANSI escape codes",
   "license": "MIT",
   "repository": {
@@ -56,12 +56,16 @@
   "devDependencies": {
     "mocha": "*"
   },
-  "readme": "# strip-ansi [![Build Status](https://travis-ci.org/sindresorhus/strip-ansi.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-ansi)\n\n> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)\n\n\n## Install\n\n```sh\n$ npm install --save strip-ansi\n```\n\n\n## Usage\n\n```js\nvar stripAnsi = require('strip-ansi');\n\nstripAnsi('\\x1b[4mcake\\x1b[0m');\n//=> 'cake'\n```\n\n\n## CLI\n\n```sh\n$ npm install --global strip-ansi\n```\n\n```sh\n$ strip-ansi --help\n\nUsage\n  $ strip-ansi <input-file> > <output-file>\n  $ cat <input-file> | strip-ansi > <output-file>\n\nExample\n  $ strip-ansi unicorn.txt > unicorn-stripped.txt\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
+  "readme": "# strip-ansi [![Build Status](https://travis-ci.org/sindresorhus/strip-ansi.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-ansi)\n\n> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)\n\n\n## Install\n\n```sh\n$ npm install --save strip-ansi\n```\n\n\n## Usage\n\n```js\nvar stripAnsi = require('strip-ansi');\n\nstripAnsi('\\u001b[4mcake\\u001b[0m');\n//=> 'cake'\n```\n\n\n## CLI\n\n```sh\n$ npm install --global strip-ansi\n```\n\n```sh\n$ strip-ansi --help\n\n  Usage\n    strip-ansi <input-file> > <output-file>\n    cat <input-file> | strip-ansi > <output-file>\n\n  Example\n    strip-ansi unicorn.txt > unicorn-stripped.txt\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
   "readmeFilename": "readme.md",
   "bugs": {
     "url": "https://github.com/sindresorhus/strip-ansi/issues"
   },
   "homepage": "https://github.com/sindresorhus/strip-ansi",
-  "_id": "strip-ansi@2.0.0",
-  "_from": "strip-ansi@^2.0.0"
+  "_id": "strip-ansi@2.0.1",
+  "dist": {
+    "shasum": "98d011bfd675c91a340f728ce50a8c54330fc0f2"
+  },
+  "_from": "strip-ansi@^2.0.0",
+  "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz"
 }
diff --git a/node_modules/vulcanize/node_modules/update-notifier/node_modules/string-length/node_modules/strip-ansi/readme.md b/node_modules/vulcanize/node_modules/update-notifier/node_modules/string-length/node_modules/strip-ansi/readme.md
index 5477079..53ec264 100644
--- a/node_modules/vulcanize/node_modules/update-notifier/node_modules/string-length/node_modules/strip-ansi/readme.md
+++ b/node_modules/vulcanize/node_modules/update-notifier/node_modules/string-length/node_modules/strip-ansi/readme.md
@@ -15,7 +15,7 @@
 ```js
 var stripAnsi = require('strip-ansi');
 
-stripAnsi('\x1b[4mcake\x1b[0m');
+stripAnsi('\u001b[4mcake\u001b[0m');
 //=> 'cake'
 ```
 
@@ -29,12 +29,12 @@
 ```sh
 $ strip-ansi --help
 
-Usage
-  $ strip-ansi <input-file> > <output-file>
-  $ cat <input-file> | strip-ansi > <output-file>
+  Usage
+    strip-ansi <input-file> > <output-file>
+    cat <input-file> | strip-ansi > <output-file>
 
-Example
-  $ strip-ansi unicorn.txt > unicorn-stripped.txt
+  Example
+    strip-ansi unicorn.txt > unicorn-stripped.txt
 ```
 
 
diff --git a/node_modules/vulcanize/node_modules/whacko/node_modules/parse5/package.json b/node_modules/vulcanize/node_modules/whacko/node_modules/parse5/package.json
index ad99a70..c052178 100644
--- a/node_modules/vulcanize/node_modules/whacko/node_modules/parse5/package.json
+++ b/node_modules/vulcanize/node_modules/whacko/node_modules/parse5/package.json
@@ -60,5 +60,9 @@
     "url": "https://github.com/inikulin/parse5/issues"
   },
   "_id": "parse5@1.2.0",
-  "_from": "parse5@1.2.0"
+  "dist": {
+    "shasum": "9008cd66ced288943562d1661f33875391d8c02f"
+  },
+  "_from": "parse5@1.2.0",
+  "_resolved": "https://registry.npmjs.org/parse5/-/parse5-1.2.0.tgz"
 }
diff --git a/node_modules/vulcanize/node_modules/whacko/package.json b/node_modules/vulcanize/node_modules/whacko/package.json
index ebf548b..4f304df 100644
--- a/node_modules/vulcanize/node_modules/whacko/package.json
+++ b/node_modules/vulcanize/node_modules/whacko/package.json
@@ -52,5 +52,9 @@
   },
   "homepage": "https://github.com/MatthewMueller/cheerio",
   "_id": "whacko@0.17.2",
-  "_from": "whacko@0.17.2"
+  "dist": {
+    "shasum": "fb016f201945f48823fae1e70f96ab123aacb2e7"
+  },
+  "_from": "whacko@0.17.2",
+  "_resolved": "https://registry.npmjs.org/whacko/-/whacko-0.17.2.tgz"
 }
diff --git a/node_modules/vulcanize/package.json b/node_modules/vulcanize/package.json
index 7163a01..68995fa 100644
--- a/node_modules/vulcanize/package.json
+++ b/node_modules/vulcanize/package.json
@@ -1,13 +1,12 @@
 {
   "name": "vulcanize",
-  "version": "0.7.4",
+  "version": "0.7.6",
   "description": "Process Web Components into one output file",
   "main": "lib/vulcan.js",
   "bin": {
     "vulcanize": "bin/vulcanize"
   },
   "dependencies": {
-    "cssom": "^0.2.3",
     "nopt": "^3.0.1",
     "uglify-js": "^2.4.15",
     "whacko": "0.17.2",
@@ -44,6 +43,10 @@
   "readme": "[![NPM version](http://img.shields.io/npm/v/vulcanize.svg)](https://npmjs.org/package/vulcanize)\n[![Build Status](http://img.shields.io/travis/Polymer/vulcanize.svg)](https://travis-ci.org/Polymer/vulcanize)\n\n# Vulcanize\n\n### Concatenate a set of Web Components into one file\n\n>Named for the [Vulcanization](http://en.wikipedia.org/wiki/Vulcanization) process that turns polymers into more durable\nmaterials.\n\n## Installation\n\n`vulcanize` is available on npm. For maximium utility, `vulcanize` should be installed globally.\n\n    sudo npm install -g vulcanize\n\nThis will install `vulcanize` to `/usr/local/bin/vulcanize`.\n\n## Usage\n\n    vulcanize index.html\n\nAt the simplest, `vulcanize` only requires an html file as an argument. The optimized output file will be named\n`vulcanized.html`.\n\nIf you want to control the output name, use the `-o` flag\n\n    vulcanize -o build.html index.html\n\nMost URLs will be automatically adjusted by the vulcanizer.\n\n\n## Options\n\n-  `--output`, `-o`\n  - Output file name (defaults to vulcanized.html)\n-  `--verbose`, `-v`\n  - More verbose logging\n-  `--help`, `-v`, `-?`\n  - Print this message\n- `--config`\n  - Read a given config file\n- `--strip`, `-s`\n  - Remove comments and empty text nodes\n-  `--csp`\n  - Extract inline scripts to a separate file (uses `<output file name>`.js)\n-  `--inline`\n  - The opposite of CSP mode, inline all assets (script and css) into the document\n- `--inline --csp`\n  - Bundle all javascript (inline and external) into `<output file name>`.js\n- `--abspath`, `-p`\n  - Specify site root. Resolve paths to absolute paths based on site root\n- `--no-strip-excludes`\n  - Keep imports excluded from inlining\n- `--version`, ` -V`\n  - print version information\n\n## Additional options when used as Node module\n\nIn addition to the above options, `vulcan` when used as Node module has additional options for string-based rather than file-based document processing. These are:\n\n- `inputSrc`\n  - The document to process, represented as String, String Buffer, or any Object with a `toString` function that yields valid HTML souce. Imports are resolved relative to the directory in which the node process was started.\n- `outputHandler`\n  - An output handler function to call rather than writing the processing result to file. The handler must be of the form `function(filename, data)`, which is called with the following arguments:\n    - `filename`\n      - The file that vulcanize would create if it were running in file I/O mode.\n    -  `data`\n      - The HTML source that vulcanize writes to file if no outputhandler is used.\n\nAn example of using these options is shown below:\n\n```\nvar vulcan = require(\"./lib/vulcan\");\n\nvar head = \"<head><link rel='import' href='test/html/imports/simple-import.html'></head>\";\nvar body = \"<body><my-element>test</my-element></body>\";\nvar input = \"<!doctype><html>\" + head + body + \"</html>\";\n\nvar outputHandler = function(filename, data) {\n  console.log(data);\n};\n\nvulcan.setOptions({inputSrc: input, outputHandler: outputHandler}, function(err) {\n  if(err) {\n    console.error(err);\n    process.exit(1);\n  }\n  vulcan.processDocument();\n});\n\n```\n\n## Config\n> JSON file for additional options\n\n- Excludes: Remove the selected urls from the vulcanized bundle:\n\n### Example Config\n```json\n{\n  \"excludes\": {\n    \"imports\": [\n      \"regex-to-exclude\"\n    ]\n  }\n}\n```\n\n## Example Usage\n\nSay we have three html files: `index.html`, `x-app.html`, and `x-dep.html`.\n\nindex.html:\n\n```html\n<!DOCTYPE html>\n<link rel=\"import\" href=\"x-app.html\">\n<x-app></x-app>\n```\n\nx-app.html:\n\n```html\n<link rel=\"import\" href=\"path/to/x-dep.html\">\n<polymer-element name=\"x-app\">\n  <template>\n    <x-dep></x-dep>\n  </template>\n  <script>Polymer('x-app')</script>\n</polymer-element>\n```\n\nx-dep.html:\n\n```html\n<polymer-element name=\"x-dep\">\n  <template>\n    <img src=\"x-dep-icon.jpg\">\n  </template>\n  <script>\n    Polymer('x-dep');\n  </script>\n</polymer-element>\n```\n\nRunning vulcan on `index.html`, and specifying `build.html` as the output:\n\n    vulcanize -o build.html index.html\n\nWill result in `build.html` that appears as so:\n\n```html\n<!DOCTYPE html>\n<div hidden><polymer-element name=\"x-dep\" assetpath=\"path/to/\">\n  <template>\n    <img src=\"http://www.polymer-project.org/images/logos/p-logo.svg\">\n  </template>\n  <script>\n    Polymer('x-dep');\n  </script>\n</polymer-element>\n\n<polymer-element name=\"x-app\" assetpath=\"\">\n  <template>\n    <x-dep></x-dep>\n  </template>\n  <script>Polymer('x-app')</script>\n</polymer-element>\n</div>\n<x-app></x-app>\n```\n\n## Content Security Policy\n[Content Security Policy](http://en.wikipedia.org/wiki/Content_Security_Policy), or CSP, is a Javascript security model\nthat aims to prevent XSS and other attacks. In so doing, it prohibits the use of inline scripts.\n\nTo help automate the use of Polymer element registration with CSP, the `--csp` flag to vulcan will remove all scripts\nfrom the HTML Imports and place their contents into an output javascript file.\n\nUsing the previous example, the output from `vulcanize --csp -o build.html index.html` will be\n\nbuild.html:\n```html\n<!DOCTYPE html>\n<div hidden><polymer-element name=\"x-dep\" assetpath=\"path/to/\">\n  <template>\n    <img src=\"http://www.polymer-project.org/images/logos/p-logo.svg\">\n  </template>\n\n</polymer-element>\n\n<polymer-element name=\"x-app\" assetpath=\"\">\n  <template>\n    <x-dep></x-dep>\n  </template>\n\n</polymer-element>\n</div>\n<x-app></x-app>\n<script src=\"build.js\"></script>\n```\n\nbuild.js:\n```js\n\n    Polymer('x-dep');\n  ;\nPolymer('x-app')\n```\n\nThe JS files can become a bit messy without reformatting, and semi-colons are inserted between script contents as a\nprecaution.\n\n## Stripping whitespace\n\nVulcanize includes a set of size reducing heuristics to remove unnecessary whitespace and comments in HTML, JS, and CSS.\nThis can be activated by using the `--strip` option.\n\nUsing the previous example, the output from `vulcanize --csp -o build.html --strip index.html` will be\n\nbuild.html:\n```html\n<!DOCTYPE html>\n<div hidden><polymer-element name=\"x-dep\" assetpath=\"path/to/\"><template><img src=\"http://www.polymer-project.org/images/logos/p-logo.svg\"></template></polymer-element><polymer-element name=\"x-app\" assetpath=\"\"><template><x-dep></x-dep></template></polymer-element></div>\n<x-app></x-app>\n<script src=\"build.js\"></script>\n```\n\n```js\nPolymer(\"x-dep\");Polymer(\"x-app\");\n```\n\n[![Analytics](https://ga-beacon.appspot.com/UA-39334307-2/Polymer/vulcanize/README)](https://github.com/igrigorik/ga-beacon)\n",
   "readmeFilename": "README.md",
   "homepage": "https://github.com/Polymer/vulcanize",
-  "_id": "vulcanize@0.7.4",
-  "_from": "vulcanize@"
+  "_id": "vulcanize@0.7.6",
+  "dist": {
+    "shasum": "7ab198342da088da9510a0d9b1ee905aae27ac83"
+  },
+  "_from": "vulcanize@0.7.6",
+  "_resolved": "https://registry.npmjs.org/vulcanize/-/vulcanize-0.7.6.tgz"
 }
diff --git a/node_modules/vulcanize/test/test.js b/node_modules/vulcanize/test/test.js
index 60c011d..b3d213d 100644
--- a/node_modules/vulcanize/test/test.js
+++ b/node_modules/vulcanize/test/test.js
@@ -29,6 +29,7 @@
       assert(abs.test('sms:1-123-123456'), 'sms');
       assert(abs.test('//foo.com'), 'protocol-free');
       assert(abs.test('/components/'), '/');
+      assert(abs.test('#foo'), 'hash url');
       assert(!abs.test('../foo/bar.html'), '../');
       assert(!abs.test('bar.html'), 'sibling dependency');
     });
@@ -113,6 +114,7 @@
 
     testPath('biz.jpg', 'my-element/biz.jpg', null, 'local');
     testPath('http://foo/biz.jpg', 'http://foo/biz.jpg', null, 'remote');
+    testPath('#foo', '#foo', null, 'hash');
     testPath('biz.jpg', 'bar/my-element/biz.jpg', '/foo/', 'build path');
   });
 
@@ -500,6 +502,7 @@
         process({inputSrc: input, output: outputPath, strip: true}, function(outputs) {
           var vulcanized = outputs[outputPath];
           assert(vulcanized);
+          assert(vulcanized.indexOf('{{ foo }}') > -1, 'braces kept');
           assert(vulcanized.indexOf(input.replace(/[\r\n]/g, '')) > -1, 'newlines removed at least');
           done();
         });
@@ -521,6 +524,17 @@
       });
     });
 
+    test('keep fallback declarations', function(done) {
+      var options = {inputSrc: '<style>div { display: flex; display: -webkit-flex; }</style>', output: outputPath, strip: true};
+      process(options, function(outputs) {
+        var vulcanized = outputs[outputPath];
+        assert(vulcanized);
+        assert(vulcanized.indexOf('display: flex') > -1, 'keep flex');
+        assert(vulcanized.indexOf('display: -webkit-flex') > -1, 'keep -webkit-flex');
+        done();
+      });
+    });
+
   });
 
   test('Multiple Polymer Invocations', function(done) {