" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
// Otherwise use the full result
responseText );
- }).complete( callback && function( jqXHR, status ) {
- self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
- });
+ // If the request succeeds, this function gets "data", "status", "jqXHR"
+ // but they are ignored because response was set above.
+ // If it fails, this function gets "jqXHR", "status", "error"
+ } ).always( callback && function( jqXHR, status ) {
+ self.each( function() {
+ callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
+ } );
+ } );
}
return this;
@@ -10030,27 +10650,32 @@ jQuery.fn.load = function( url, params, callback ) {
// Attach a bunch of functions for handling common AJAX events
-jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
+jQuery.each( [
+ "ajaxStart",
+ "ajaxStop",
+ "ajaxComplete",
+ "ajaxError",
+ "ajaxSuccess",
+ "ajaxSend"
+], function( i, type ) {
jQuery.fn[ type ] = function( fn ) {
return this.on( type, fn );
};
-});
+} );
jQuery.expr.filters.animated = function( elem ) {
- return jQuery.grep(jQuery.timers, function( fn ) {
+ return jQuery.grep( jQuery.timers, function( fn ) {
return elem === fn.elem;
- }).length;
+ } ).length;
};
-var docElem = window.document.documentElement;
-
/**
* Gets a window from an element
*/
@@ -10078,9 +10703,10 @@ jQuery.offset = {
curCSSTop = jQuery.css( elem, "top" );
curCSSLeft = jQuery.css( elem, "left" );
calculatePosition = ( position === "absolute" || position === "fixed" ) &&
- jQuery.inArray("auto", [ curCSSTop, curCSSLeft ] ) > -1;
+ jQuery.inArray( "auto", [ curCSSTop, curCSSLeft ] ) > -1;
- // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+ // need to be able to calculate position if either top or left
+ // is auto and position is either absolute or fixed
if ( calculatePosition ) {
curPosition = curElem.position();
curTop = curPosition.top;
@@ -10091,7 +10717,9 @@ jQuery.offset = {
}
if ( jQuery.isFunction( options ) ) {
- options = options.call( elem, i, curOffset );
+
+ // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
+ options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
}
if ( options.top != null ) {
@@ -10109,14 +10737,14 @@ jQuery.offset = {
}
};
-jQuery.fn.extend({
+jQuery.fn.extend( {
offset: function( options ) {
if ( arguments.length ) {
return options === undefined ?
this :
- this.each(function( i ) {
+ this.each( function( i ) {
jQuery.offset.setOffset( this, options, i );
- });
+ } );
}
var docElem, win,
@@ -10137,7 +10765,7 @@ jQuery.fn.extend({
// If we don't have gBCR, just use 0,0 rather than error
// BlackBerry 5, iOS 3 (original iPhone)
- if ( typeof elem.getBoundingClientRect !== strundefined ) {
+ if ( typeof elem.getBoundingClientRect !== "undefined" ) {
box = elem.getBoundingClientRect();
}
win = getWindow( doc );
@@ -10156,11 +10784,14 @@ jQuery.fn.extend({
parentOffset = { top: 0, left: 0 },
elem = this[ 0 ];
- // fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
+ // Fixed elements are offset from window (parentOffset = {top:0, left: 0},
+ // because it is its only offset parent
if ( jQuery.css( elem, "position" ) === "fixed" ) {
+
// we assume that getBoundingClientRect is available when computed position is fixed
offset = elem.getBoundingClientRect();
} else {
+
// Get *real* offsetParent
offsetParent = this.offsetParent();
@@ -10180,21 +10811,22 @@ jQuery.fn.extend({
// are the same in Safari causing offset.left to incorrectly be 0
return {
top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
- left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
};
},
offsetParent: function() {
- return this.map(function() {
- var offsetParent = this.offsetParent || docElem;
+ return this.map( function() {
+ var offsetParent = this.offsetParent;
- while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
+ while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) &&
+ jQuery.css( offsetParent, "position" ) === "static" ) ) {
offsetParent = offsetParent.offsetParent;
}
- return offsetParent || docElem;
- });
+ return offsetParent || documentElement;
+ } );
}
-});
+} );
// Create scrollLeft and scrollTop methods
jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
@@ -10205,7 +10837,7 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(
var win = getWindow( elem );
if ( val === undefined ) {
- return win ? (prop in win) ? win[ prop ] :
+ return win ? ( prop in win ) ? win[ prop ] :
win.document.documentElement[ method ] :
elem[ method ];
}
@@ -10221,8 +10853,9 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(
}
}, method, val, arguments.length, null );
};
-});
+} );
+// Support: Safari<7-8+, Chrome<37-44+
// Add the top/left cssHooks using jQuery.fn.position
// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
// getComputedStyle returns percent when specified for top/left/bottom/right
@@ -10232,6 +10865,7 @@ jQuery.each( [ "top", "left" ], function( i, prop ) {
function( elem, computed ) {
if ( computed ) {
computed = curCSS( elem, prop );
+
// if curCSS returns percentage, fallback to offset
return rnumnonpx.test( computed ) ?
jQuery( elem ).position()[ prop ] + "px" :
@@ -10239,12 +10873,14 @@ jQuery.each( [ "top", "left" ], function( i, prop ) {
}
}
);
-});
+} );
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+ jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
+ function( defaultExtra, funcName ) {
+
// margin is only for outerHeight, outerWidth
jQuery.fn[ funcName ] = function( margin, value ) {
var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
@@ -10254,6 +10890,7 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
var doc;
if ( jQuery.isWindow( elem ) ) {
+
// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
// isn't a whole lot we can do. See pull request at this URL for discussion:
// https://github.com/jquery/jquery/pull/764
@@ -10264,8 +10901,10 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
if ( elem.nodeType === 9 ) {
doc = elem.documentElement;
- // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
- // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+ // whichever is greatest
+ // unfortunately, this causes bug #3838 in IE6/8 only,
+ // but there is currently no good, small way to fix it.
return Math.max(
elem.body[ "scroll" + name ], doc[ "scroll" + name ],
elem.body[ "offset" + name ], doc[ "offset" + name ],
@@ -10274,6 +10913,7 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
}
return value === undefined ?
+
// Get width or height on the element, requesting but not forcing parseFloat
jQuery.css( elem, type, extra ) :
@@ -10281,9 +10921,30 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
jQuery.style( elem, type, value, extra );
}, type, chainable ? margin : undefined, chainable, null );
};
- });
-});
+ } );
+} );
+
+
+jQuery.fn.extend( {
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1 ?
+ this.off( selector, "**" ) :
+ this.off( types, selector || "**", fn );
+ }
+} );
// The number of elements contained in the matched element set
jQuery.fn.size = function() {
@@ -10311,13 +10972,13 @@ jQuery.fn.andSelf = jQuery.fn.addBack;
if ( typeof define === "function" && define.amd ) {
define( "jquery", [], function() {
return jQuery;
- });
+ } );
}
-
var
+
// Map over jQuery in case of overwrite
_jQuery = window.jQuery,
@@ -10339,13 +11000,9 @@ jQuery.noConflict = function( deep ) {
// Expose jQuery and $ identifiers, even in
// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
// and CommonJS for browser emulators (#13566)
-if ( typeof noGlobal === strundefined ) {
+if ( !noGlobal ) {
window.jQuery = window.$ = jQuery;
}
-
-
-
return jQuery;
-
}));
diff --git a/js/vendor/promise-polyfill.js b/js/vendor/promise-polyfill.js
new file mode 100644
index 0000000..a6646f5
--- /dev/null
+++ b/js/vendor/promise-polyfill.js
@@ -0,0 +1,357 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (factory());
+}(this, (function () { 'use strict';
+
+/**
+ * @this {Promise}
+ */
+function finallyConstructor(callback) {
+ var constructor = this.constructor;
+ return this.then(
+ function(value) {
+ // @ts-ignore
+ return constructor.resolve(callback()).then(function() {
+ return value;
+ });
+ },
+ function(reason) {
+ // @ts-ignore
+ return constructor.resolve(callback()).then(function() {
+ // @ts-ignore
+ return constructor.reject(reason);
+ });
+ }
+ );
+}
+
+function allSettled(arr) {
+ var P = this;
+ return new P(function(resolve, reject) {
+ if (!(arr && typeof arr.length !== 'undefined')) {
+ return reject(
+ new TypeError(
+ typeof arr +
+ ' ' +
+ arr +
+ ' is not iterable(cannot read property Symbol(Symbol.iterator))'
+ )
+ );
+ }
+ var args = Array.prototype.slice.call(arr);
+ if (args.length === 0) return resolve([]);
+ var remaining = args.length;
+
+ function res(i, val) {
+ if (val && (typeof val === 'object' || typeof val === 'function')) {
+ var then = val.then;
+ if (typeof then === 'function') {
+ then.call(
+ val,
+ function(val) {
+ res(i, val);
+ },
+ function(e) {
+ args[i] = { status: 'rejected', reason: e };
+ if (--remaining === 0) {
+ resolve(args);
+ }
+ }
+ );
+ return;
+ }
+ }
+ args[i] = { status: 'fulfilled', value: val };
+ if (--remaining === 0) {
+ resolve(args);
+ }
+ }
+
+ for (var i = 0; i < args.length; i++) {
+ res(i, args[i]);
+ }
+ });
+}
+
+// Store setTimeout reference so promise-polyfill will be unaffected by
+// other code modifying setTimeout (like sinon.useFakeTimers())
+var setTimeoutFunc = setTimeout;
+
+function isArray(x) {
+ return Boolean(x && typeof x.length !== 'undefined');
+}
+
+function noop() {}
+
+// Polyfill for Function.prototype.bind
+function bind(fn, thisArg) {
+ return function() {
+ fn.apply(thisArg, arguments);
+ };
+}
+
+/**
+ * @constructor
+ * @param {Function} fn
+ */
+function Promise(fn) {
+ if (!(this instanceof Promise))
+ throw new TypeError('Promises must be constructed via new');
+ if (typeof fn !== 'function') throw new TypeError('not a function');
+ /** @type {!number} */
+ this._state = 0;
+ /** @type {!boolean} */
+ this._handled = false;
+ /** @type {Promise|undefined} */
+ this._value = undefined;
+ /** @type {!Array} */
+ this._deferreds = [];
+
+ doResolve(fn, this);
+}
+
+function handle(self, deferred) {
+ while (self._state === 3) {
+ self = self._value;
+ }
+ if (self._state === 0) {
+ self._deferreds.push(deferred);
+ return;
+ }
+ self._handled = true;
+ Promise._immediateFn(function() {
+ var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
+ if (cb === null) {
+ (self._state === 1 ? resolve : reject)(deferred.promise, self._value);
+ return;
+ }
+ var ret;
+ try {
+ ret = cb(self._value);
+ } catch (e) {
+ reject(deferred.promise, e);
+ return;
+ }
+ resolve(deferred.promise, ret);
+ });
+}
+
+function resolve(self, newValue) {
+ try {
+ // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
+ if (newValue === self)
+ throw new TypeError('A promise cannot be resolved with itself.');
+ if (
+ newValue &&
+ (typeof newValue === 'object' || typeof newValue === 'function')
+ ) {
+ var then = newValue.then;
+ if (newValue instanceof Promise) {
+ self._state = 3;
+ self._value = newValue;
+ finale(self);
+ return;
+ } else if (typeof then === 'function') {
+ doResolve(bind(then, newValue), self);
+ return;
+ }
+ }
+ self._state = 1;
+ self._value = newValue;
+ finale(self);
+ } catch (e) {
+ reject(self, e);
+ }
+}
+
+function reject(self, newValue) {
+ self._state = 2;
+ self._value = newValue;
+ finale(self);
+}
+
+function finale(self) {
+ if (self._state === 2 && self._deferreds.length === 0) {
+ Promise._immediateFn(function() {
+ if (!self._handled) {
+ Promise._unhandledRejectionFn(self._value);
+ }
+ });
+ }
+
+ for (var i = 0, len = self._deferreds.length; i < len; i++) {
+ handle(self, self._deferreds[i]);
+ }
+ self._deferreds = null;
+}
+
+/**
+ * @constructor
+ */
+function Handler(onFulfilled, onRejected, promise) {
+ this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
+ this.onRejected = typeof onRejected === 'function' ? onRejected : null;
+ this.promise = promise;
+}
+
+/**
+ * Take a potentially misbehaving resolver function and make sure
+ * onFulfilled and onRejected are only called once.
+ *
+ * Makes no guarantees about asynchrony.
+ */
+function doResolve(fn, self) {
+ var done = false;
+ try {
+ fn(
+ function(value) {
+ if (done) return;
+ done = true;
+ resolve(self, value);
+ },
+ function(reason) {
+ if (done) return;
+ done = true;
+ reject(self, reason);
+ }
+ );
+ } catch (ex) {
+ if (done) return;
+ done = true;
+ reject(self, ex);
+ }
+}
+
+Promise.prototype['catch'] = function(onRejected) {
+ return this.then(null, onRejected);
+};
+
+Promise.prototype.then = function(onFulfilled, onRejected) {
+ // @ts-ignore
+ var prom = new this.constructor(noop);
+
+ handle(this, new Handler(onFulfilled, onRejected, prom));
+ return prom;
+};
+
+Promise.prototype['finally'] = finallyConstructor;
+
+Promise.all = function(arr) {
+ return new Promise(function(resolve, reject) {
+ if (!isArray(arr)) {
+ return reject(new TypeError('Promise.all accepts an array'));
+ }
+
+ var args = Array.prototype.slice.call(arr);
+ if (args.length === 0) return resolve([]);
+ var remaining = args.length;
+
+ function res(i, val) {
+ try {
+ if (val && (typeof val === 'object' || typeof val === 'function')) {
+ var then = val.then;
+ if (typeof then === 'function') {
+ then.call(
+ val,
+ function(val) {
+ res(i, val);
+ },
+ reject
+ );
+ return;
+ }
+ }
+ args[i] = val;
+ if (--remaining === 0) {
+ resolve(args);
+ }
+ } catch (ex) {
+ reject(ex);
+ }
+ }
+
+ for (var i = 0; i < args.length; i++) {
+ res(i, args[i]);
+ }
+ });
+};
+
+Promise.allSettled = allSettled;
+
+Promise.resolve = function(value) {
+ if (value && typeof value === 'object' && value.constructor === Promise) {
+ return value;
+ }
+
+ return new Promise(function(resolve) {
+ resolve(value);
+ });
+};
+
+Promise.reject = function(value) {
+ return new Promise(function(resolve, reject) {
+ reject(value);
+ });
+};
+
+Promise.race = function(arr) {
+ return new Promise(function(resolve, reject) {
+ if (!isArray(arr)) {
+ return reject(new TypeError('Promise.race accepts an array'));
+ }
+
+ for (var i = 0, len = arr.length; i < len; i++) {
+ Promise.resolve(arr[i]).then(resolve, reject);
+ }
+ });
+};
+
+// Use polyfill for setImmediate for performance gains
+Promise._immediateFn =
+ // @ts-ignore
+ (typeof setImmediate === 'function' &&
+ function(fn) {
+ // @ts-ignore
+ setImmediate(fn);
+ }) ||
+ function(fn) {
+ setTimeoutFunc(fn, 0);
+ };
+
+Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {
+ if (typeof console !== 'undefined' && console) {
+ console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console
+ }
+};
+
+/** @suppress {undefinedVars} */
+var globalNS = (function() {
+ // the only reliable means to get the global object is
+ // `Function('return this')()`
+ // However, this causes CSP violations in Chrome apps.
+ if (typeof self !== 'undefined') {
+ return self;
+ }
+ if (typeof window !== 'undefined') {
+ return window;
+ }
+ if (typeof global !== 'undefined') {
+ return global;
+ }
+ throw new Error('unable to locate global object');
+})();
+
+// Expose the polyfill if Promise is undefined or set to a
+// non-function value. The latter can be due to a named HTMLElement
+// being exposed by browsers for legacy reasons.
+// https://github.com/taylorhakes/promise-polyfill/issues/114
+if (typeof globalNS['Promise'] !== 'function') {
+ globalNS['Promise'] = Promise;
+} else if (!globalNS.Promise.prototype['finally']) {
+ globalNS.Promise.prototype['finally'] = finallyConstructor;
+} else if (!globalNS.Promise.allSettled) {
+ globalNS.Promise.allSettled = allSettled;
+}
+
+})));
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..1ec73dc
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,3655 @@
+{
+ "name": "blueimp-load-image",
+ "version": "5.16.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "blueimp-load-image",
+ "version": "5.16.0",
+ "license": "MIT",
+ "devDependencies": {
+ "blueimp-canvas-to-blob": "3",
+ "chai": "4",
+ "eslint": "7",
+ "eslint-config-blueimp": "2",
+ "eslint-config-prettier": "8",
+ "eslint-plugin-jsdoc": "36",
+ "eslint-plugin-prettier": "4",
+ "jquery": "1",
+ "mocha": "9",
+ "prettier": "2",
+ "promise-polyfill": "8",
+ "uglify-js": "3"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.15.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
+ "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
+ "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.14.5",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@es-joy/jsdoccomment": {
+ "version": "0.10.8",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.10.8.tgz",
+ "integrity": "sha512-3P1JiGL4xaR9PoTKUHa2N/LKwa2/eUdRqGwijMWWgBqbFEqJUVpmaOi2TcjcemrsRMgFLBzQCK4ToPhrSVDiFQ==",
+ "dev": true,
+ "dependencies": {
+ "comment-parser": "1.2.4",
+ "esquery": "^1.4.0",
+ "jsdoc-type-pratt-parser": "1.1.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || ^16"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
+ "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^13.9.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
+ "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.0",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz",
+ "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==",
+ "dev": true
+ },
+ "node_modules/@ungap/promise-all-settled": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
+ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
+ "dev": true
+ },
+ "node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/blueimp-canvas-to-blob": {
+ "version": "3.29.0",
+ "resolved": "https://registry.npmjs.org/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-3.29.0.tgz",
+ "integrity": "sha512-0pcSSGxC0QxT+yVkivxIqW0Y4VlO2XSDPofBAqoJ1qJxgH9eiUDLv50Rixij2cDuEfx4M6DpD9UGZpRhT5Q8qg==",
+ "dev": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
+ "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/chai": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz",
+ "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==",
+ "dev": true,
+ "dependencies": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^3.0.1",
+ "get-func-name": "^2.0.0",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.0.5"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
+ "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/comment-parser": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.2.4.tgz",
+ "integrity": "sha512-pm0b+qv+CkWNriSTMsfnjChF9kH0kxz55y44Wo5le9qLxMj5xDQAaEd9ZN1ovSuk9CsrncWaFwgpOMg7ClJwkw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-eql": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/diff": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "7.32.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
+ "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "7.12.11",
+ "@eslint/eslintrc": "^0.4.3",
+ "@humanwhocodes/config-array": "^0.5.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.1.2",
+ "globals": "^13.6.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^6.0.9",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-blueimp": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-blueimp/-/eslint-config-blueimp-2.3.0.tgz",
+ "integrity": "sha512-OC1+7YHBpXYdl/Jt2PZMpIPAUogHf4iDnqf8vVMlmkKls1Xemu7DAZqdFgdYhZxgaJ/d+qXH8b66L/D/pU4btA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=7"
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz",
+ "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-jsdoc": {
+ "version": "36.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-36.1.0.tgz",
+ "integrity": "sha512-Qpied2AJCQcScxfzTObLKRiP5QgLXjMU/ITjBagEV5p2Q/HpumD1EQtazdRYdjDSwPmXhwOl2yquwOGQ4HOJNw==",
+ "dev": true,
+ "dependencies": {
+ "@es-joy/jsdoccomment": "0.10.8",
+ "comment-parser": "1.2.4",
+ "debug": "^4.3.2",
+ "esquery": "^1.4.0",
+ "jsdoc-type-pratt-parser": "^1.1.1",
+ "lodash": "^4.17.21",
+ "regextras": "^0.8.0",
+ "semver": "^7.3.5",
+ "spdx-expression-parse": "^3.0.1"
+ },
+ "engines": {
+ "node": "^12 || ^14 || ^16"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-prettier": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz",
+ "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==",
+ "dev": true,
+ "dependencies": {
+ "prettier-linter-helpers": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.28.0",
+ "prettier": ">=2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "eslint-config-prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/espree": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esquery/node_modules/estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-diff": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+ "dev": true
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz",
+ "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==",
+ "dev": true
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-func-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.11.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz",
+ "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/growl": {
+ "version": "1.10.5",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
+ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.x"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "node_modules/jquery": {
+ "version": "1.12.4",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-1.12.4.tgz",
+ "integrity": "sha1-AeHfuikP5z3rp3zurLD5ui/sngw=",
+ "dev": true
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsdoc-type-pratt-parser": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.1.1.tgz",
+ "integrity": "sha512-uelRmpghNwPBuZScwgBG/OzodaFk5RbO5xaivBdsAY70icWfShwZ7PCMO0x1zSkOa8T1FzHThmrdoyg/0AwV5g==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+ "dev": true
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
+ "dev": true
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/mocha": {
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz",
+ "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==",
+ "dev": true,
+ "dependencies": {
+ "@ungap/promise-all-settled": "1.1.2",
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.2",
+ "debug": "4.3.2",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "7.1.7",
+ "growl": "1.10.5",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "3.0.4",
+ "ms": "2.1.3",
+ "nanoid": "3.1.25",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "which": "2.0.2",
+ "workerpool": "6.1.5",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mochajs"
+ }
+ },
+ "node_modules/mocha/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/mocha/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/mocha/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "node_modules/mocha/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.1.25",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz",
+ "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz",
+ "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "dependencies": {
+ "fast-diff": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/promise-polyfill": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.0.tgz",
+ "integrity": "sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g==",
+ "dev": true
+ },
+ "node_modules/punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/regextras": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz",
+ "integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.1.14"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+ "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+ "dev": true
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz",
+ "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==",
+ "dev": true
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/table": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz",
+ "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^8.0.1",
+ "lodash.clonedeep": "^4.5.0",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/table/node_modules/ajv": {
+ "version": "8.6.3",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz",
+ "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/table/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/uglify-js": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz",
+ "integrity": "sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==",
+ "dev": true,
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/workerpool": {
+ "version": "6.1.5",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz",
+ "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+ "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.10.4"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.15.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
+ "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
+ "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.14.5",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "@es-joy/jsdoccomment": {
+ "version": "0.10.8",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.10.8.tgz",
+ "integrity": "sha512-3P1JiGL4xaR9PoTKUHa2N/LKwa2/eUdRqGwijMWWgBqbFEqJUVpmaOi2TcjcemrsRMgFLBzQCK4ToPhrSVDiFQ==",
+ "dev": true,
+ "requires": {
+ "comment-parser": "1.2.4",
+ "esquery": "^1.4.0",
+ "jsdoc-type-pratt-parser": "1.1.1"
+ }
+ },
+ "@eslint/eslintrc": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
+ "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^13.9.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ }
+ },
+ "@humanwhocodes/config-array": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
+ "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==",
+ "dev": true,
+ "requires": {
+ "@humanwhocodes/object-schema": "^1.2.0",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "@humanwhocodes/object-schema": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz",
+ "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==",
+ "dev": true
+ },
+ "@ungap/promise-all-settled": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
+ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
+ "dev": true
+ },
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true
+ },
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true
+ },
+ "blueimp-canvas-to-blob": {
+ "version": "3.29.0",
+ "resolved": "https://registry.npmjs.org/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-3.29.0.tgz",
+ "integrity": "sha512-0pcSSGxC0QxT+yVkivxIqW0Y4VlO2XSDPofBAqoJ1qJxgH9eiUDLv50Rixij2cDuEfx4M6DpD9UGZpRhT5Q8qg==",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
+ "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
+ "dev": true
+ },
+ "chai": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz",
+ "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==",
+ "dev": true,
+ "requires": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^3.0.1",
+ "get-func-name": "^2.0.0",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.0.5"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "dev": true
+ },
+ "chokidar": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
+ "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ }
+ },
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "comment-parser": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.2.4.tgz",
+ "integrity": "sha512-pm0b+qv+CkWNriSTMsfnjChF9kH0kxz55y44Wo5le9qLxMj5xDQAaEd9ZN1ovSuk9CsrncWaFwgpOMg7ClJwkw==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "debug": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+ "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true
+ },
+ "deep-eql": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "dev": true,
+ "requires": {
+ "type-detect": "^4.0.0"
+ }
+ },
+ "deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "diff": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "^4.1.1"
+ }
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true
+ },
+ "eslint": {
+ "version": "7.32.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz",
+ "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.12.11",
+ "@eslint/eslintrc": "^0.4.3",
+ "@humanwhocodes/config-array": "^0.5.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.1.2",
+ "globals": "^13.6.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^6.0.9",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ }
+ },
+ "eslint-config-blueimp": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-blueimp/-/eslint-config-blueimp-2.3.0.tgz",
+ "integrity": "sha512-OC1+7YHBpXYdl/Jt2PZMpIPAUogHf4iDnqf8vVMlmkKls1Xemu7DAZqdFgdYhZxgaJ/d+qXH8b66L/D/pU4btA==",
+ "dev": true,
+ "requires": {}
+ },
+ "eslint-config-prettier": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz",
+ "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==",
+ "dev": true,
+ "requires": {}
+ },
+ "eslint-plugin-jsdoc": {
+ "version": "36.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-36.1.0.tgz",
+ "integrity": "sha512-Qpied2AJCQcScxfzTObLKRiP5QgLXjMU/ITjBagEV5p2Q/HpumD1EQtazdRYdjDSwPmXhwOl2yquwOGQ4HOJNw==",
+ "dev": true,
+ "requires": {
+ "@es-joy/jsdoccomment": "0.10.8",
+ "comment-parser": "1.2.4",
+ "debug": "^4.3.2",
+ "esquery": "^1.4.0",
+ "jsdoc-type-pratt-parser": "^1.1.1",
+ "lodash": "^4.17.21",
+ "regextras": "^0.8.0",
+ "semver": "^7.3.5",
+ "spdx-expression-parse": "^3.0.1"
+ }
+ },
+ "eslint-plugin-prettier": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz",
+ "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==",
+ "dev": true,
+ "requires": {
+ "prettier-linter-helpers": "^1.0.0"
+ }
+ },
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true
+ },
+ "espree": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ }
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "fast-diff": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true
+ },
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz",
+ "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==",
+ "dev": true
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
+ "get-func-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+ "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "globals": {
+ "version": "13.11.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz",
+ "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "growl": {
+ "version": "1.10.5",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
+ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true
+ },
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true
+ },
+ "is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "jquery": {
+ "version": "1.12.4",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-1.12.4.tgz",
+ "integrity": "sha1-AeHfuikP5z3rp3zurLD5ui/sngw=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "jsdoc-type-pratt-parser": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.1.1.tgz",
+ "integrity": "sha512-uelRmpghNwPBuZScwgBG/OzodaFk5RbO5xaivBdsAY70icWfShwZ7PCMO0x1zSkOa8T1FzHThmrdoyg/0AwV5g==",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^5.0.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+ "dev": true
+ },
+ "lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ }
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "mocha": {
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz",
+ "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==",
+ "dev": true,
+ "requires": {
+ "@ungap/promise-all-settled": "1.1.2",
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.2",
+ "debug": "4.3.2",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "7.1.7",
+ "growl": "1.10.5",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "3.0.4",
+ "ms": "2.1.3",
+ "nanoid": "3.1.25",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "which": "2.0.2",
+ "workerpool": "6.1.5",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "dependencies": {
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "nanoid": {
+ "version": "3.1.25",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz",
+ "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "requires": {
+ "yocto-queue": "^0.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^3.0.2"
+ }
+ },
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true
+ },
+ "prettier": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz",
+ "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==",
+ "dev": true
+ },
+ "prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "requires": {
+ "fast-diff": "^1.1.2"
+ }
+ },
+ "progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true
+ },
+ "promise-polyfill": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.0.tgz",
+ "integrity": "sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g==",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ },
+ "randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true
+ },
+ "regextras": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz",
+ "integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==",
+ "dev": true
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true
+ },
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "serialize-javascript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+ "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz",
+ "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "table": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz",
+ "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==",
+ "dev": true,
+ "requires": {
+ "ajv": "^8.0.1",
+ "lodash.clonedeep": "^4.5.0",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "8.6.3",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz",
+ "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ }
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz",
+ "integrity": "sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==",
+ "dev": true
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
+ },
+ "workerpool": {
+ "version": "6.1.5",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz",
+ "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "20.2.4",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "dev": true
+ },
+ "yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ }
+ },
+ "yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true
+ }
+ }
+}
diff --git a/package.json b/package.json
index e8d5612..f4327f8 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
{
"name": "blueimp-load-image",
- "version": "2.11.0",
+ "version": "5.16.0",
"title": "JavaScript Load Image",
- "description": "JavaScript Load Image is a library to load images provided as File or Blob objects or via URL. It returns an optionally scaled and/or cropped HTML img or canvas element. It also provides a method to parse image meta data to extract Exif tags and thumbnails and to restore the complete image header after resizing.",
+ "description": "JavaScript Load Image is a library to load images provided as File or Blob objects or via URL. It returns an optionally scaled, cropped or rotated HTML img or canvas element. It also provides methods to parse image metadata to extract IPTC and Exif tags as well as embedded thumbnail images, to overwrite the Exif Orientation value and to restore the complete image header after resizing.",
"keywords": [
"javascript",
"load",
@@ -13,12 +13,14 @@
"url",
"scale",
"crop",
+ "rotate",
"img",
"canvas",
"meta",
"exif",
+ "orientation",
"thumbnail",
- "resizing"
+ "iptc"
],
"homepage": "https://github.com/blueimp/JavaScript-Load-Image",
"author": {
@@ -31,19 +33,55 @@
},
"license": "MIT",
"devDependencies": {
- "phantomjs-prebuilt": "2.1.13",
- "mocha-phantomjs-core": "1.3.1",
- "standard": "8.3.0",
- "uglify-js": "2.7.3"
+ "blueimp-canvas-to-blob": "3",
+ "chai": "4",
+ "eslint": "7",
+ "eslint-config-blueimp": "2",
+ "eslint-config-prettier": "8",
+ "eslint-plugin-jsdoc": "36",
+ "eslint-plugin-prettier": "4",
+ "jquery": "1",
+ "mocha": "9",
+ "prettier": "2",
+ "promise-polyfill": "8",
+ "uglify-js": "3"
+ },
+ "eslintConfig": {
+ "extends": [
+ "blueimp",
+ "plugin:jsdoc/recommended",
+ "plugin:prettier/recommended"
+ ],
+ "env": {
+ "browser": true
+ }
+ },
+ "eslintIgnore": [
+ "js/*.min.js",
+ "js/vendor",
+ "test/vendor"
+ ],
+ "prettier": {
+ "arrowParens": "avoid",
+ "proseWrap": "always",
+ "semi": false,
+ "singleQuote": true,
+ "trailingComma": "none"
},
"scripts": {
- "lint": "standard *.js js/*.js test/*.js",
- "unit": "phantomjs node_modules/mocha-phantomjs-core/mocha-phantomjs-core.js test/index.html",
+ "lint": "eslint .",
+ "preunit": "bin/sync-vendor-libs.sh",
+ "unit": "docker-compose run --rm mocha",
"test": "npm run lint && npm run unit",
- "build": "cd js && uglifyjs load-image.js load-image-meta.js load-image-exif.js load-image-exif-map.js load-image-orientation.js -c -m -o load-image.all.min.js --source-map load-image.all.min.js.map",
+ "posttest": "docker-compose down -v",
+ "build": "cd js && uglifyjs load-image.js load-image-scale.js load-image-meta.js load-image-fetch.js load-image-orientation.js load-image-exif.js load-image-exif-map.js load-image-iptc.js load-image-iptc-map.js --ie8 -c -m -o load-image.all.min.js --source-map url=load-image.all.min.js.map",
"preversion": "npm test",
"version": "npm run build && git add -A js",
"postversion": "git push --tags origin master master:gh-pages && npm publish"
},
+ "files": [
+ "js/*.js",
+ "js/*.js.map"
+ ],
"main": "js/index.js"
}
diff --git a/test/index.html b/test/index.html
index ec65fbd..b375150 100644
--- a/test/index.html
+++ b/test/index.html
@@ -1,44 +1,48 @@
-
+
-
-
-
-
JavaScript Load Image Test
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
JavaScript Load Image Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/test.js b/test/test.js
index e0762df..2a8ea21 100644
--- a/test/test.js
+++ b/test/test.js
@@ -9,548 +9,2821 @@
* https://opensource.org/licenses/MIT
*/
-/* global describe, it, Blob */
+/* global describe, before, after, it, Promise, ArrayBuffer */
+/* eslint-disable no-unused-expressions */
;(function (expect, loadImage) {
'use strict'
- var canCreateBlob = !!window.dataURLtoBlob
- // 80x60px GIF image (color black, base64 data):
- var b64DataGIF = 'R0lGODdhUAA8AIABAAAAAP///ywAAAAAUAA8AAACS4SPqcvtD6' +
- 'OctNqLs968+w+G4kiW5omm6sq27gvH8kzX9o3n+s73/g8MCofE' +
- 'ovGITCqXzKbzCY1Kp9Sq9YrNarfcrvcLDovH5PKsAAA7'
+ var browser = {
+ canCreateBlob: !!window.dataURLtoBlob
+ }
+
+ // black+white 60x40 GIF
+ // Image data layout (B=black, F=white), scaled to 3x2:
+ // BFF
+ // BBB
+ var b64DataGIF =
+ 'R0lGODlhPAAoAPECAAAAAP///wAAAAAAACH5BAUAAAIALAAAAAA8ACgAQAJihI+Zwe0Po3Sq' +
+ '1okztvzoDwbdSJbmiaaqGbbTCrjyA9f2jef6Ts6+uPrNYEIZsdg6IkG8pvMJjUqnVOgypLxm' +
+ 'stpXsLv9gr2q8UZshnDTjTUbWH7TqvS6/Y7P6/f8vv9vVwAAOw=='
var imageUrlGIF = 'data:image/gif;base64,' + b64DataGIF
- var blobGIF = canCreateBlob && window.dataURLtoBlob(imageUrlGIF)
- // 2x1px JPEG (color white, with the Exif orientation flag set to 6):
- var b64DataJPEG = '/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAASUkqAAgAAA' +
- 'ABABIBAwABAAAABgASAAAAAAD/2wBDAAEBAQEBAQEBAQEBAQEB' +
- 'AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ' +
- 'EBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB' +
- 'AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQ' +
- 'EBAQEBAQH/wAARCAABAAIDASIAAhEBAxEB/8QAHwAAAQUBAQEB' +
- 'AQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBA' +
- 'QAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAk' +
- 'M2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1' +
- 'hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKj' +
- 'pKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+' +
- 'Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAA' +
- 'AAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAx' +
- 'EEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl' +
- '8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2' +
- 'hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmq' +
- 'srO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8v' +
- 'P09fb3+Pn6/9oADAMBAAIRAxEAPwD+/iiiigD/2Q=='
+ var blobGIF = browser.canCreateBlob && window.dataURLtoBlob(imageUrlGIF)
+ var fileGIF
+ try {
+ fileGIF = new File([blobGIF], 'image.gif')
+ } catch (_) {
+ // No File constructor support
+ }
+
+ // black+white 3x2 GIF
+ // Image data layout (B=black, F=white):
+ // BFF
+ // BBB
+ var b64DataGIF2 =
+ 'R0lGODdhAwACAPEAAAAAAP///yZFySZFySH5BAEAAAIALAAAAAADAAIAAAIDRAJZADs='
+ var imageUrlGIF2 = 'data:image/gif;base64,' + b64DataGIF2
+ var blobGIF2 = browser.canCreateBlob && window.dataURLtoBlob(imageUrlGIF2)
+
+ // black+white 3x2 JPEG, with the following meta information set:
+ // - EXIF Orientation: 6 (Rotated 90° CCW)
+ // - IPTC ObjectName: blueimp.net
+ // Meta information has been set via exiftool (exiftool.org):
+ // exiftool -all= -Orientation#=6 -YCbCrPositioning= -ResolutionUnit= \
+ // -YResolution= -XResolution= -ObjectName=blueimp.net black+white-3x2.jpg
+ // Image data layout (B=black, F=white):
+ // BFF
+ // BBB
+ var b64DataJPEG =
+ '/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/7QA0UGhvdG9zaG9wIDMu' +
+ 'MAA4QklNBAQAAAAAABccAgUAC2JsdWVpbXAubmV0HAIAAAIABAD/2wCEAAEBAQEBAQEBAQEB' +
+ 'AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB' +
+ 'AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB' +
+ 'AQEBAQEBAQEBAf/AABEIAAIAAwMBEQACEQEDEQH/xABRAAEAAAAAAAAAAAAAAAAAAAAKEAEB' +
+ 'AQADAQEAAAAAAAAAAAAGBQQDCAkCBwEBAAAAAAAAAAAAAAAAAAAAABEBAAAAAAAAAAAAAAAA' +
+ 'AAAAAP/aAAwDAQACEQMRAD8AG8T9NfSMEVMhQvoP3fFiRZ+MTHDifa/95OFSZU5OzRzxkyej' +
+ 'v8ciEfhSceSXGjS8eSdLnZc2HDm4M3BxcXwH/9k='
var imageUrlJPEG = 'data:image/jpeg;base64,' + b64DataJPEG
- var blobJPEG = canCreateBlob && window.dataURLtoBlob(imageUrlJPEG)
- function createBlob (data, type) {
+ var blobJPEG = browser.canCreateBlob && window.dataURLtoBlob(imageUrlJPEG)
+
+ ;(function imageSmoothingTest($) {
+ var canvas = document.createElement('canvas')
+ if (!canvas.getContext) return
+ var ctx = canvas.getContext('2d')
+ if (ctx.msImageSmoothingEnabled) {
+ $.imageSmoothingEnabled = ctx.msImageSmoothingEnabled
+ $.imageSmoothingEnabledKey = 'msImageSmoothingEnabled'
+ } else {
+ $.imageSmoothingEnabled = ctx.imageSmoothingEnabled
+ $.imageSmoothingEnabledKey = 'imageSmoothingEnabled'
+ }
+ $.imageSmoothingQuality = ctx.imageSmoothingQuality
+ })(browser)
+
+ // Test if the browser is using exact image data when transforming the canvas.
+ // Both Internet Explorer and Edge Legacy have off-by-one changes to color and
+ // transparency values when flipping images.
+ ;(function exactImageDataTest($) {
+ var img = document.createElement('img')
+ img.onload = function () {
+ var canvas = document.createElement('canvas')
+ if (!canvas.getContext) return
+ var ctx = canvas.getContext('2d')
+ // horizontal flip:
+ ctx.translate(img.width, 0)
+ ctx.scale(-1, 1)
+ ctx.drawImage(img, 0, 0)
+ $.exactImageData =
+ // Workaround for IE11 not supporting .join() for imageData.data:
+ Array.prototype.slice
+ .call(ctx.getImageData(0, 0, img.width, img.height).data)
+ // Resulting image data layout (B=black, F=white): FB
+ .join(',') === '255,255,255,255,0,0,0,255'
+ }
+ // black+white 2x1 GIF
+ // Image data layout (B=black, F=white): BF
+ img.src =
+ 'data:image/gif;base64,' +
+ 'R0lGODdhAgABAPEAAAAAAP///yZFySZFySH5BAEAAAIALAAAAAACAAEAAAICRAoAOw=='
+ })(browser)
+
+ /**
+ * Helper function to create a blob object from the given image data
+ *
+ * @param {ArrayBuffer} data Image data
+ * @param {string} type Image content type
+ * @returns {Blob} Image Blob object
+ */
+ function createBlob(data, type) {
try {
- return new Blob([data], {type: type})
+ return new Blob([data], { type: type })
} catch (e) {
- var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder ||
- window.MozBlobBuilder || window.MSBlobBuilder
+ var BlobBuilder =
+ window.BlobBuilder ||
+ window.WebKitBlobBuilder ||
+ window.MozBlobBuilder ||
+ window.MSBlobBuilder
var builder = new BlobBuilder()
- builder.append(data.buffer || data)
+ builder.append(data)
return builder.getBlob(type)
}
}
+ /**
+ * Request helper function.
+ *
+ * @param {string} url URL to request
+ * @param {Function} callback Request callback
+ */
+ function request(url, callback) {
+ var xhr = new XMLHttpRequest()
+ xhr.onload = callback
+ xhr.onerror = callback
+ try {
+ xhr.open('GET', url, true)
+ } catch (e) {
+ callback.call(xhr, e)
+ return
+ }
+ xhr.send()
+ }
+
describe('Loading', function () {
- it('Return the img element or FileReader object to allow aborting the image load', function () {
- var img = loadImage(blobGIF, function () {
- return
- })
+ it('Return an object with onload and onerror methods', function () {
+ var img = loadImage(blobGIF, function () {})
expect(img).to.be.an.instanceOf(Object)
- expect(img.onload).to.be.a('function')
- expect(img.onerror).to.be.a('function')
+ expect(img.onload).to.be.an.instanceOf(Function)
+ expect(img.onerror).to.be.an.instanceOf(Function)
})
- it('Load image url', function (done) {
- expect(loadImage(imageUrlGIF, function (img) {
- expect(img.width).to.equal(80)
- expect(img.height).to.equal(60)
- done()
- })).to.be.ok
+ it('Load image url as img element', function (done) {
+ expect(
+ loadImage(imageUrlGIF, function (img) {
+ expect(img.nodeName.toLowerCase()).to.equal('img')
+ expect(img.width).to.equal(60)
+ expect(img.height).to.equal(40)
+ done()
+ })
+ ).to.be.ok
})
- it('Load image blob', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(80)
- expect(img.height).to.equal(60)
- done()
- })).to.be.ok
+ it('Load image blob as img element', function (done) {
+ expect(
+ loadImage(blobGIF, function (img) {
+ expect(img.nodeName.toLowerCase()).to.equal('img')
+ expect(img.width).to.equal(60)
+ expect(img.height).to.equal(40)
+ done()
+ })
+ ).to.be.ok
})
- it('Return image loading error to callback', function (done) {
- expect(loadImage('404', function (img) {
- expect(img).to.be.an.instanceOf(window.Event)
- expect(img.type).to.equal('error')
- done()
- })).to.be.ok
+ it('Handle image loading error', function (done) {
+ expect(
+ loadImage('404', function (err) {
+ expect(err).to.be.an.instanceOf(window.Event)
+ expect(err.type).to.equal('error')
+ done()
+ })
+ ).to.be.ok
})
- it('Keep object URL if noRevoke is true', function (done) {
- expect(loadImage(blobGIF, function (img) {
- loadImage(img.src, function (img2) {
- expect(img.width).to.equal(img2.width)
- expect(img.height).to.equal(img2.height)
+ it('Provide original image width+height in callback data', function (done) {
+ expect(
+ loadImage(imageUrlGIF, function (img, data) {
+ expect(data.originalWidth).to.equal(60)
+ expect(data.originalHeight).to.equal(40)
done()
})
- }, {noRevoke: true})).to.be.ok
+ ).to.be.ok
})
- it('Discard object URL if noRevoke is undefined or false', function (done) {
- expect(loadImage(blobGIF, function (img) {
- loadImage(img.src, function (img2) {
- if (!window.callPhantom) {
- // revokeObjectUrl doesn't seem to have an effect in PhantomJS
- expect(img2).to.be.an.instanceOf(window.Event)
- expect(img2.type).to.equal('error')
- }
- done()
+ it('Load image as canvas for canvas: true', function (done) {
+ expect(
+ loadImage(
+ imageUrlGIF,
+ function (img) {
+ expect(img.getContext).to.be.an.instanceOf(Function)
+ expect(img.nodeName.toLowerCase()).to.equal('canvas')
+ done()
+ },
+ { canvas: true }
+ )
+ ).to.be.ok
+ })
+
+ describe('File', function () {
+ if (!fileGIF) return
+
+ it('Load image file as img element', function (done) {
+ expect(
+ loadImage(fileGIF, function (img) {
+ expect(img.nodeName.toLowerCase()).to.equal('img')
+ expect(img.width).to.equal(60)
+ expect(img.height).to.equal(40)
+ done()
+ })
+ ).to.be.ok
+ })
+ })
+
+ describe('Object URL', function () {
+ // Using XMLHttpRequest via the request helper function to test Object
+ // URLs to work around Edge Legacy and IE caching image URLs.
+ if (!window.XMLHttpRequest) return
+
+ it('Keep object URL if noRevoke is set to true', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ request(img.src, function (event) {
+ expect(event.type).to.equal('load')
+ done()
+ })
+ },
+ { noRevoke: true }
+ )
+ ).to.be.ok
+ })
+
+ it('Discard object URL if noRevoke is not set', function (done) {
+ expect(
+ loadImage(blobGIF, function (img) {
+ request(img.src, function (event) {
+ // IE throws an error that has no type property:
+ expect(event.type).to.be.oneOf(['error', undefined])
+ done()
+ })
+ })
+ ).to.be.ok
+ })
+ })
+
+ describe('Promise', function () {
+ if (!window.Promise) return
+
+ it('Load image url as img element', function () {
+ return loadImage(imageUrlGIF).then(function (data) {
+ var img = data.image
+ expect(img.nodeName.toLowerCase()).to.equal('img')
+ expect(img.width).to.equal(60)
+ expect(img.height).to.equal(40)
+ })
+ })
+
+ it('Load image blob as img element', function () {
+ return loadImage(blobGIF).then(function (data) {
+ var img = data.image
+ expect(img.nodeName.toLowerCase()).to.equal('img')
+ expect(img.width).to.equal(60)
+ expect(img.height).to.equal(40)
+ })
+ })
+
+ it('Handle image loading error', function () {
+ return loadImage('404')
+ .then(function () {
+ throw new Error('Promise not rejected')
+ })
+ .catch(function (err) {
+ expect(err).to.be.an.instanceOf(window.Event)
+ expect(err.type).to.equal('error')
+ })
+ })
+
+ it('Provide original image width+height in callback data', function () {
+ return loadImage(imageUrlGIF).then(function (data) {
+ expect(data.originalWidth).to.equal(60)
+ expect(data.originalHeight).to.equal(40)
+ })
+ })
+
+ it('Load image as canvas for canvas: true', function () {
+ return loadImage(imageUrlGIF, { canvas: true }).then(function (data) {
+ var img = data.image
+ expect(img.getContext).to.be.an.instanceOf(Function)
+ expect(img.nodeName.toLowerCase()).to.equal('canvas')
})
- })).to.be.ok
+ })
+ })
+ })
+
+ describe('Exceptions', function () {
+ var originalTransform = loadImage.transform
+
+ before(function () {
+ loadImage.transform = function (img, options, callback) {
+ if (options.throwError) throw options.throwError
+ callback(options.callbackError)
+ }
+ })
+
+ after(function () {
+ loadImage.transform = originalTransform
+ })
+
+ it('Pass error to callback', function (done) {
+ var error = new Error('ERROR')
+ expect(
+ loadImage(
+ imageUrlGIF,
+ function (err) {
+ expect(err).to.be.an.instanceOf(Error)
+ expect(err.message).to.equal(error.message)
+ done()
+ },
+ { callbackError: error }
+ )
+ ).to.be.ok
+ })
+
+ it('Pass exception error to callback', function (done) {
+ var error = new Error('ERROR')
+ expect(
+ loadImage(
+ imageUrlGIF,
+ function (err) {
+ expect(err).to.be.an.instanceOf(Error)
+ expect(err.message).to.equal(error.message)
+ done()
+ },
+ { throwError: error }
+ )
+ ).to.be.ok
+ })
+
+ it('Pass exception string to callback', function (done) {
+ var error = 'ERROR'
+ expect(
+ loadImage(
+ imageUrlGIF,
+ function (err) {
+ expect(err).to.be.a('string')
+ expect(err).to.equal(error)
+ done()
+ },
+ { throwError: error }
+ )
+ ).to.be.ok
+ })
+
+ describe('Promise', function () {
+ it('Reject with error ', function () {
+ var error = new Error('ERROR')
+ return loadImage(imageUrlGIF, { callbackError: error })
+ .then(function () {
+ throw new Error('Promise not rejected')
+ })
+ .catch(function (err) {
+ expect(err).to.be.an.instanceOf(Error)
+ expect(err.message).to.equal(error.message)
+ })
+ })
+
+ it('Reject with exception error ', function () {
+ var error = new Error('ERROR')
+ return loadImage(imageUrlGIF, { throwError: error })
+ .then(function () {
+ throw new Error('Promise not rejected')
+ })
+ .catch(function (err) {
+ expect(err).to.be.an.instanceOf(Error)
+ expect(err.message).to.equal(error.message)
+ })
+ })
+
+ it('Reject with exception string ', function () {
+ var error = 'ERROR'
+ return loadImage(imageUrlGIF, { throwError: error })
+ .then(function () {
+ throw new Error('Promise not rejected')
+ })
+ .catch(function (err) {
+ expect(err).to.be.a('string')
+ expect(err).to.equal(error)
+ })
+ })
})
})
describe('Scaling', function () {
describe('max/min', function () {
it('Scale to maxWidth', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(40)
- expect(img.height).to.equal(30)
- done()
- }, {maxWidth: 40})).to.be.ok
+ expect(
+ loadImage(
+ blobGIF,
+ function (img, data) {
+ expect(img.width).to.equal(30)
+ expect(img.height).to.equal(20)
+ expect(data.originalWidth).to.equal(60)
+ expect(data.originalHeight).to.equal(40)
+ done()
+ },
+ { maxWidth: 30 }
+ )
+ ).to.be.ok
})
it('Scale to maxHeight', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(20)
- expect(img.height).to.equal(15)
- done()
- }, {maxHeight: 15})).to.be.ok
+ expect(
+ loadImage(
+ blobGIF,
+ function (img, data) {
+ expect(img.width).to.equal(30)
+ expect(img.height).to.equal(20)
+ expect(data.originalWidth).to.equal(60)
+ expect(data.originalHeight).to.equal(40)
+ done()
+ },
+ { maxHeight: 20 }
+ )
+ ).to.be.ok
})
it('Scale to minWidth', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(160)
- expect(img.height).to.equal(120)
- done()
- }, {minWidth: 160})).to.be.ok
+ expect(
+ loadImage(
+ blobGIF,
+ function (img, data) {
+ expect(img.width).to.equal(120)
+ expect(img.height).to.equal(80)
+ expect(data.originalWidth).to.equal(60)
+ expect(data.originalHeight).to.equal(40)
+ done()
+ },
+ { minWidth: 120 }
+ )
+ ).to.be.ok
})
it('Scale to minHeight', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(320)
- expect(img.height).to.equal(240)
- done()
- }, {minHeight: 240})).to.be.ok
+ expect(
+ loadImage(
+ blobGIF,
+ function (img, data) {
+ expect(img.width).to.equal(120)
+ expect(img.height).to.equal(80)
+ expect(data.originalWidth).to.equal(60)
+ expect(data.originalHeight).to.equal(40)
+ done()
+ },
+ { minHeight: 80 }
+ )
+ ).to.be.ok
})
it('Scale to minWidth but respect maxWidth', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(160)
- expect(img.height).to.equal(120)
- done()
- }, {minWidth: 240, maxWidth: 160})).to.be.ok
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(120)
+ expect(img.height).to.equal(80)
+ done()
+ },
+ { minWidth: 240, maxWidth: 120 }
+ )
+ ).to.be.ok
})
it('Scale to minHeight but respect maxHeight', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(160)
- expect(img.height).to.equal(120)
- done()
- }, {minHeight: 180, maxHeight: 120})).to.be.ok
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(120)
+ expect(img.height).to.equal(80)
+ done()
+ },
+ { minHeight: 160, maxHeight: 80 }
+ )
+ ).to.be.ok
})
it('Scale to minWidth but respect maxHeight', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(160)
- expect(img.height).to.equal(120)
- done()
- }, {minWidth: 240, maxHeight: 120})).to.be.ok
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(120)
+ expect(img.height).to.equal(80)
+ done()
+ },
+ { minWidth: 240, maxHeight: 80 }
+ )
+ ).to.be.ok
})
it('Scale to minHeight but respect maxWidth', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(160)
- expect(img.height).to.equal(120)
- done()
- }, {minHeight: 180, maxWidth: 160})).to.be.ok
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(120)
+ expect(img.height).to.equal(80)
+ done()
+ },
+ { minHeight: 160, maxWidth: 120 }
+ )
+ ).to.be.ok
})
it('Scale up with the given pixelRatio', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(320)
- expect(img.height).to.equal(240)
- expect(img.style.width).to.equal('160px')
- expect(img.style.height).to.equal('120px')
- done()
- }, {minWidth: 160, canvas: true, pixelRatio: 2})).to.be.ok
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(240)
+ expect(img.height).to.equal(160)
+ expect(img.style.width).to.equal('120px')
+ // Check if pixelRatio scaling is idempotent:
+ var img2 = loadImage.scale(img, { minWidth: 120, pixelRatio: 2 })
+ expect(img2.width).to.equal(240)
+ expect(img2.height).to.equal(160)
+ expect(img2.style.width).to.equal('120px')
+ done()
+ },
+ { minWidth: 120, canvas: true, pixelRatio: 2 }
+ )
+ ).to.be.ok
})
it('Scale down with the given pixelRatio', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(80)
- expect(img.height).to.equal(60)
- expect(img.style.width).to.equal('40px')
- expect(img.style.height).to.equal('30px')
- done()
- }, {maxWidth: 40, canvas: true, pixelRatio: 2})).to.be.ok
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(60)
+ expect(img.height).to.equal(40)
+ expect(img.style.width).to.equal('30px')
+ // Check if pixelRatio scaling is idempotent:
+ var img2 = loadImage.scale(img, { minWidth: 30, pixelRatio: 2 })
+ expect(img2.width).to.equal(60)
+ expect(img2.height).to.equal(40)
+ expect(img2.style.width).to.equal('30px')
+ done()
+ },
+ { maxWidth: 30, canvas: true, pixelRatio: 2 }
+ )
+ ).to.be.ok
})
it('Scale down with the given downsamplingRatio', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(20)
- expect(img.height).to.equal(15)
- done()
- }, {maxWidth: 20, canvas: true, downsamplingRatio: 0.5})).to.be.ok
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(15)
+ expect(img.height).to.equal(10)
+ done()
+ },
+ { maxWidth: 15, canvas: true, downsamplingRatio: 0.5 }
+ )
+ ).to.be.ok
})
- it('Ignore max settings if image dimensions are smaller', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(80)
- expect(img.height).to.equal(60)
- done()
- }, {maxWidth: 160, maxHeight: 120})).to.be.ok
+ it('Ignore max settings for smaller image dimensions', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(60)
+ expect(img.height).to.equal(40)
+ done()
+ },
+ { maxWidth: 120, maxHeight: 80 }
+ )
+ ).to.be.ok
})
- it('Ignore min settings if image dimensions are larger', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(80)
- expect(img.height).to.equal(60)
- done()
- }, {minWidth: 40, minHeight: 30})).to.be.ok
+ it('Ignore min settings for larger image dimensions', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(60)
+ expect(img.height).to.equal(40)
+ done()
+ },
+ { minWidth: 30, minHeight: 20 }
+ )
+ ).to.be.ok
+ })
+
+ it('Accept a canvas element as source image', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.getContext).to.be.an.instanceOf(Function)
+ expect(img.nodeName.toLowerCase()).to.equal('canvas')
+ // eslint-disable-next-line no-param-reassign
+ img = loadImage.scale(img, {
+ maxWidth: 30
+ })
+ expect(img.getContext).to.be.an.instanceOf(Function)
+ expect(img.nodeName.toLowerCase()).to.equal('canvas')
+ expect(img.width).to.equal(30)
+ expect(img.height).to.equal(20)
+ done()
+ },
+ { canvas: true }
+ )
+ ).to.be.ok
})
})
describe('contain', function () {
it('Scale up to contain image in max dimensions', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(160)
- expect(img.height).to.equal(120)
- done()
- }, {maxWidth: 160, maxHeight: 160, contain: true})).to.be.ok
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(120)
+ expect(img.height).to.equal(80)
+ done()
+ },
+ { maxWidth: 120, maxHeight: 120, contain: true }
+ )
+ ).to.be.ok
})
it('Scale down to contain image in max dimensions', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(40)
- expect(img.height).to.equal(30)
- done()
- }, {maxWidth: 40, maxHeight: 40, contain: true})).to.be.ok
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(30)
+ expect(img.height).to.equal(20)
+ done()
+ },
+ { maxWidth: 30, maxHeight: 30, contain: true }
+ )
+ ).to.be.ok
})
})
describe('cover', function () {
it('Scale up to cover max dimensions with image dimensions', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(160)
- expect(img.height).to.equal(120)
- done()
- }, {maxWidth: 120, maxHeight: 120, cover: true})).to.be.ok
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(180)
+ expect(img.height).to.equal(120)
+ done()
+ },
+ { maxWidth: 120, maxHeight: 120, cover: true }
+ )
+ ).to.be.ok
})
it('Scale down to cover max dimensions with image dimensions', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(40)
- expect(img.height).to.equal(30)
- done()
- }, {maxWidth: 30, maxHeight: 30, cover: true})).to.be.ok
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(30)
+ expect(img.height).to.equal(20)
+ done()
+ },
+ { maxWidth: 20, maxHeight: 20, cover: true }
+ )
+ ).to.be.ok
+ })
+ })
+
+ describe('image smoothing', function () {
+ if (!browser.imageSmoothingEnabled) {
+ return
+ }
+
+ it('imageSmoothingEnabled defaults to true', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(120)
+ expect(
+ img.getContext('2d')[browser.imageSmoothingEnabledKey]
+ ).to.equal(true)
+ done()
+ },
+ { minWidth: 120, canvas: true }
+ )
+ ).to.be.ok
+ })
+
+ it('Sets imageSmoothingEnabled to false', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(120)
+ expect(
+ img.getContext('2d')[browser.imageSmoothingEnabledKey]
+ ).to.equal(false)
+ done()
+ },
+ { minWidth: 120, canvas: true, imageSmoothingEnabled: false }
+ )
+ ).to.be.ok
+ })
+
+ if (browser.imageSmoothingQuality !== 'low') {
+ return
+ }
+
+ it('imageSmoothingQuality defaults to "low"', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(120)
+ expect(img.getContext('2d').imageSmoothingQuality).to.equal('low')
+ done()
+ },
+ { minWidth: 120, canvas: true }
+ )
+ ).to.be.ok
+ })
+
+ it('Sets imageSmoothingQuality to "medium"', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(120)
+ expect(img.getContext('2d').imageSmoothingQuality).to.equal(
+ 'medium'
+ )
+ done()
+ },
+ { minWidth: 120, canvas: true, imageSmoothingQuality: 'medium' }
+ )
+ ).to.be.ok
+ })
+
+ it('Sets imageSmoothingQuality to "high"', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(120)
+ expect(img.getContext('2d').imageSmoothingQuality).to.equal(
+ 'high'
+ )
+ done()
+ },
+ { minWidth: 120, canvas: true, imageSmoothingQuality: 'high' }
+ )
+ ).to.be.ok
+ })
+
+ it('Ignores imageSmoothingQuality if imageSmoothingEnabled is false', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(120)
+ expect(img.getContext('2d').imageSmoothingQuality).to.equal('low')
+ done()
+ },
+ {
+ minWidth: 120,
+ canvas: true,
+ imageSmoothingQuality: 'high',
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
})
})
})
describe('Cropping', function () {
it('Crop to same values for maxWidth and maxHeight', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(40)
- expect(img.height).to.equal(40)
- done()
- }, {maxWidth: 40, maxHeight: 40, crop: true})).to.be.ok
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(30)
+ expect(img.height).to.equal(30)
+ done()
+ },
+ { maxWidth: 30, maxHeight: 30, crop: true }
+ )
+ ).to.be.ok
})
it('Crop to different values for maxWidth and maxHeight', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(40)
- expect(img.height).to.equal(60)
- done()
- }, {maxWidth: 40, maxHeight: 60, crop: true})).to.be.ok
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(30)
+ expect(img.height).to.equal(40)
+ done()
+ },
+ { maxWidth: 30, maxHeight: 40, crop: true }
+ )
+ ).to.be.ok
})
- it('Crop using the given sourceWidth and sourceHeight dimensions', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(40)
- expect(img.height).to.equal(40)
- done()
- }, {sourceWidth: 40, sourceHeight: 40, crop: true})).to.be.ok
+ it('Crop using the given sourceWidth/sourceHeight dimensions', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(30)
+ expect(img.height).to.equal(30)
+ done()
+ },
+ { sourceWidth: 30, sourceHeight: 30, crop: true }
+ )
+ ).to.be.ok
})
- it('Crop using the given left and top coordinates', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(40)
- expect(img.height).to.equal(20)
- done()
- }, {left: 40, top: 40, crop: true})).to.be.ok
+ it('Crop using the given left/top coordinates', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(40)
+ expect(img.height).to.equal(20)
+ done()
+ },
+ { left: 20, top: 20, crop: true }
+ )
+ ).to.be.ok
})
- it('Crop using the given right and bottom coordinates', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(40)
- expect(img.height).to.equal(20)
- done()
- }, {right: 40, bottom: 40, crop: true})).to.be.ok
+ it('Crop using the given right/bottom coordinates', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(40)
+ expect(img.height).to.equal(20)
+ done()
+ },
+ { right: 20, bottom: 20, crop: true }
+ )
+ ).to.be.ok
})
it('Crop using the given 2:1 aspectRatio', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(80)
- expect(img.height).to.equal(40)
- done()
- }, {aspectRatio: 2})).to.be.ok
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(60)
+ expect(img.height).to.equal(30)
+ done()
+ },
+ { aspectRatio: 2 }
+ )
+ ).to.be.ok
})
- it('Crop using the given 2:3 aspectRatio', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(40)
- expect(img.height).to.equal(60)
- done()
- }, {aspectRatio: 2 / 3})).to.be.ok
+ it('Crop using the given 1:2 aspectRatio', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(20)
+ expect(img.height).to.equal(40)
+ done()
+ },
+ { aspectRatio: 1 / 2 }
+ )
+ ).to.be.ok
})
- it('Crop using maxWidth/maxHeight with the given pixelRatio', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(80)
- expect(img.height).to.equal(80)
- expect(img.style.width).to.equal('40px')
- expect(img.style.height).to.equal('40px')
- done()
- }, {maxWidth: 40, maxHeight: 40, crop: true, pixelRatio: 2})).to.be.ok
+ it('Crop using maxWidth/maxHeight and pixelRatio', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(80)
+ expect(img.height).to.equal(80)
+ expect(img.style.width).to.equal('40px')
+ done()
+ },
+ { maxWidth: 40, maxHeight: 40, crop: true, pixelRatio: 2 }
+ )
+ ).to.be.ok
})
- it('Crop using sourceWidth/sourceHeight with the given pixelRatio', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(80)
- expect(img.height).to.equal(80)
- expect(img.style.width).to.equal('40px')
- expect(img.style.height).to.equal('40px')
- done()
- }, {sourceWidth: 40, sourceHeight: 40, crop: true, pixelRatio: 2})).to.be.ok
+ it('Crop using sourceWidth/sourceHeight and pixelRatio', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(80)
+ expect(img.height).to.equal(80)
+ expect(img.style.width).to.equal('40px')
+ done()
+ },
+ { sourceWidth: 40, sourceHeight: 40, crop: true, pixelRatio: 2 }
+ )
+ ).to.be.ok
})
- it('Crop using maxWidth/maxHeight with the given downsamplingRatio', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(10)
- expect(img.height).to.equal(10)
-
- var data = img.getContext('2d').getImageData(0, 0, 10, 10).data
- for (var i = 0; i < data.length / 4; i += 4) {
- expect(data[i]).to.equal(0)
- expect(data[i + 1]).to.equal(0)
- expect(data[i + 2]).to.equal(0)
- expect(data[i + 3]).to.equal(255)
- }
-
- done()
- }, {maxWidth: 10, maxHeight: 10, crop: true, downsamplingRatio: 0.5})).to.be.ok
+ it('Crop using maxWidth/maxHeight and downsamplingRatio', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(10)
+ expect(img.height).to.equal(10)
+ done()
+ },
+ { maxWidth: 10, maxHeight: 10, crop: true, downsamplingRatio: 0.5 }
+ )
+ ).to.be.ok
})
})
describe('Orientation', function () {
- it('Should keep the orientation', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(80)
- expect(img.height).to.equal(60)
- done()
- }, {orientation: 1})).to.be.ok
+ describe('EXIF Orientation: undefined', function () {
+ it('1: keep original', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(60)
+ expect(img.height).to.equal(40)
+ done()
+ },
+ { orientation: 1 }
+ )
+ ).to.be.ok
+ })
+
+ it('2: horizontal flip', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(60)
+ expect(img.height).to.equal(40)
+ done()
+ },
+ { orientation: 2 }
+ )
+ ).to.be.ok
+ })
+
+ it('3: 180° rotate left', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(60)
+ expect(img.height).to.equal(40)
+ done()
+ },
+ { orientation: 3 }
+ )
+ ).to.be.ok
+ })
+
+ it('4: vertical flip', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(60)
+ expect(img.height).to.equal(40)
+ done()
+ },
+ { orientation: 4 }
+ )
+ ).to.be.ok
+ })
+
+ it('5: vertical flip + 90° rotate right', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(40)
+ expect(img.height).to.equal(60)
+ done()
+ },
+ { orientation: 5 }
+ )
+ ).to.be.ok
+ })
+
+ it('6: 90° rotate right', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(40)
+ expect(img.height).to.equal(60)
+ done()
+ },
+ { orientation: 6 }
+ )
+ ).to.be.ok
+ })
+
+ it('7: horizontal flip + 90° rotate right', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(40)
+ expect(img.height).to.equal(60)
+ done()
+ },
+ { orientation: 7 }
+ )
+ ).to.be.ok
+ })
+
+ it('8: 90° rotate left', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(40)
+ expect(img.height).to.equal(60)
+ done()
+ },
+ { orientation: 8 }
+ )
+ ).to.be.ok
+ })
+ it('Adjust constraints to new coordinates', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(20)
+ expect(img.height).to.equal(30)
+ done()
+ },
+ { orientation: 6, maxWidth: 20, maxHeight: 30 }
+ )
+ ).to.be.ok
+ })
+
+ it('Rotate left with the given pixelRatio', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(80)
+ expect(img.height).to.equal(120)
+ expect(img.style.width).to.equal('40px')
+ done()
+ },
+ { orientation: 8, pixelRatio: 2 }
+ )
+ ).to.be.ok
+ })
+
+ it('Rotate right with the given pixelRatio', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(80)
+ expect(img.height).to.equal(120)
+ expect(img.style.width).to.equal('40px')
+ done()
+ },
+ { orientation: 6, pixelRatio: 2 }
+ )
+ ).to.be.ok
+ })
+
+ it('Ignore too small orientation value', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(60)
+ expect(img.height).to.equal(40)
+ done()
+ },
+ { orientation: -1 }
+ )
+ ).to.be.ok
+ })
+
+ it('Ignore too large orientation value', function (done) {
+ expect(
+ loadImage(
+ blobGIF,
+ function (img) {
+ expect(img.width).to.equal(60)
+ expect(img.height).to.equal(40)
+ done()
+ },
+ { orientation: 9 }
+ )
+ ).to.be.ok
+ })
+
+ describe('Cropping', function () {
+ it('1: keep original, right: 1, bottom: 1', function (done) {
+ expect(
+ loadImage(
+ blobGIF2,
+ function (img) {
+ expect(img.width).to.equal(2)
+ expect(img.height).to.equal(1)
+ // Image data layout after orientation (B=black, F=white):
+ // BF
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 2, 1).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(0)
+ expect(imageData[1]).to.equal(0)
+ expect(imageData[2]).to.equal(0)
+ expect(imageData[3]).to.equal(255)
+ // 1:0 opaque white
+ expect(imageData[0 + 4]).to.equal(255)
+ expect(imageData[1 + 4]).to.equal(255)
+ expect(imageData[2 + 4]).to.equal(255)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 1,
+ right: 1,
+ bottom: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('2: horizontal flip, bottom: 1, left: 1', function (done) {
+ expect(
+ loadImage(
+ blobGIF2,
+ function (img) {
+ expect(img.width).to.equal(2)
+ expect(img.height).to.equal(1)
+ if (!browser.exactImageData) {
+ done()
+ return
+ }
+ // Image data layout after orientation (B=black, F=white):
+ // FB
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 2, 1).data
+ // 0:0 opaque white
+ expect(imageData[0]).to.equal(255)
+ expect(imageData[1]).to.equal(255)
+ expect(imageData[2]).to.equal(255)
+ expect(imageData[3]).to.equal(255)
+ // 1:0 opaque black
+ expect(imageData[0 + 4]).to.equal(0)
+ expect(imageData[1 + 4]).to.equal(0)
+ expect(imageData[2 + 4]).to.equal(0)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 2,
+ bottom: 1,
+ left: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('3: 180° rotate left, top: 1, left: 1', function (done) {
+ expect(
+ loadImage(
+ blobGIF2,
+ function (img) {
+ expect(img.width).to.equal(2)
+ expect(img.height).to.equal(1)
+ // Image data layout after orientation (B=black, F=white):
+ // FB
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 2, 1).data
+ // 0:0 opaque white
+ expect(imageData[0]).to.equal(255)
+ expect(imageData[1]).to.equal(255)
+ expect(imageData[2]).to.equal(255)
+ expect(imageData[3]).to.equal(255)
+ // 1:0 opaque black
+ expect(imageData[0 + 4]).to.equal(0)
+ expect(imageData[1 + 4]).to.equal(0)
+ expect(imageData[2 + 4]).to.equal(0)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 3,
+ top: 1,
+ left: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('4: vertical flip, top: 1, right: 1', function (done) {
+ expect(
+ loadImage(
+ blobGIF2,
+ function (img) {
+ expect(img.width).to.equal(2)
+ expect(img.height).to.equal(1)
+ if (!browser.exactImageData) {
+ done()
+ return
+ }
+ // Image data layout after orientation (B=black, F=white):
+ // BF
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 2, 1).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(0)
+ expect(imageData[1]).to.equal(0)
+ expect(imageData[2]).to.equal(0)
+ expect(imageData[3]).to.equal(255)
+ // 1:0 opaque white
+ expect(imageData[0 + 4]).to.equal(255)
+ expect(imageData[1 + 4]).to.equal(255)
+ expect(imageData[2 + 4]).to.equal(255)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 4,
+ top: 1,
+ right: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('5: vertical flip + 90° rotate right, right: 1, bottom: 1', function (done) {
+ expect(
+ loadImage(
+ blobGIF2,
+ function (img) {
+ expect(img.width).to.equal(1)
+ expect(img.height).to.equal(2)
+ if (!browser.exactImageData) {
+ done()
+ return
+ }
+ // Image data layout after orientation (B=black, F=white):
+ // B
+ // F
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 1, 2).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(0)
+ expect(imageData[1]).to.equal(0)
+ expect(imageData[2]).to.equal(0)
+ expect(imageData[3]).to.equal(255)
+ // 0:1 opaque white
+ expect(imageData[0 + 4]).to.equal(255)
+ expect(imageData[1 + 4]).to.equal(255)
+ expect(imageData[2 + 4]).to.equal(255)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 5,
+ right: 1,
+ bottom: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('6: 90° rotate right, bottom: 1, left: 1', function (done) {
+ expect(
+ loadImage(
+ blobGIF2,
+ function (img) {
+ expect(img.width).to.equal(1)
+ expect(img.height).to.equal(2)
+ // Image data layout after orientation (B=black, F=white):
+ // B
+ // F
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 1, 2).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(0)
+ expect(imageData[1]).to.equal(0)
+ expect(imageData[2]).to.equal(0)
+ expect(imageData[3]).to.equal(255)
+ // 0:1 opaque white
+ expect(imageData[0 + 4]).to.equal(255)
+ expect(imageData[1 + 4]).to.equal(255)
+ expect(imageData[2 + 4]).to.equal(255)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 6,
+ bottom: 1,
+ left: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('7: horizontal flip + 90° rotate right, top: 1, left: 1', function (done) {
+ expect(
+ loadImage(
+ blobGIF2,
+ function (img) {
+ expect(img.width).to.equal(1)
+ expect(img.height).to.equal(2)
+ if (!browser.exactImageData) {
+ done()
+ return
+ }
+ // Image data layout after orientation (B=black, F=white):
+ // F
+ // B
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 1, 2).data
+ // 0:0 opaque white
+ expect(imageData[0]).to.equal(255)
+ expect(imageData[1]).to.equal(255)
+ expect(imageData[2]).to.equal(255)
+ expect(imageData[3]).to.equal(255)
+ // 0:1 opaque black
+ expect(imageData[0 + 4]).to.equal(0)
+ expect(imageData[1 + 4]).to.equal(0)
+ expect(imageData[2 + 4]).to.equal(0)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 7,
+ top: 1,
+ left: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('8: 90° rotate left, top: 1, right: 1', function (done) {
+ expect(
+ loadImage(
+ blobGIF2,
+ function (img) {
+ expect(img.width).to.equal(1)
+ expect(img.height).to.equal(2)
+ // Image data layout after orientation (B=black, F=white):
+ // F
+ // B
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 1, 2).data
+ // 0:0 opaque white
+ expect(imageData[0]).to.equal(255)
+ expect(imageData[1]).to.equal(255)
+ expect(imageData[2]).to.equal(255)
+ expect(imageData[3]).to.equal(255)
+ // 0:1 opaque black
+ expect(imageData[0 + 4]).to.equal(0)
+ expect(imageData[1 + 4]).to.equal(0)
+ expect(imageData[2 + 4]).to.equal(0)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 8,
+ top: 1,
+ right: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+ })
})
- it('Should rotate left', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(60)
- expect(img.height).to.equal(80)
- done()
- }, {orientation: 8})).to.be.ok
+ describe('EXIF Orientation: 6', function () {
+ it('1: keep original', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(3)
+ expect(img.height).to.equal(2)
+ // Image data layout after orientation (B=black, F=white):
+ // BFF
+ // BBB
+ var imageData = img.getContext('2d').getImageData(0, 0, 3, 2).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(0)
+ expect(imageData[1]).to.equal(0)
+ expect(imageData[2]).to.equal(0)
+ expect(imageData[3]).to.equal(255)
+ // 1:0 opaque white
+ expect(imageData[0 + 4]).to.equal(255)
+ expect(imageData[1 + 4]).to.equal(255)
+ expect(imageData[2 + 4]).to.equal(255)
+ expect(imageData[3 + 4]).to.equal(255)
+ // 2:0 opaque white
+ expect(imageData[0 + 8]).to.equal(255)
+ expect(imageData[1 + 8]).to.equal(255)
+ expect(imageData[2 + 8]).to.equal(255)
+ expect(imageData[3 + 8]).to.equal(255)
+ // 0:1 opaque black
+ expect(imageData[0 + 12]).to.equal(0)
+ expect(imageData[1 + 12]).to.equal(0)
+ expect(imageData[2 + 12]).to.equal(0)
+ expect(imageData[3 + 12]).to.equal(255)
+ // 1:1 opaque black
+ expect(imageData[0 + 16]).to.equal(0)
+ expect(imageData[1 + 16]).to.equal(0)
+ expect(imageData[2 + 16]).to.equal(0)
+ expect(imageData[3 + 16]).to.equal(255)
+ // 2:1 opaque black
+ expect(imageData[0 + 20]).to.equal(0)
+ expect(imageData[1 + 20]).to.equal(0)
+ expect(imageData[2 + 20]).to.equal(0)
+ expect(imageData[3 + 20]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('2: horizontal flip', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(3)
+ expect(img.height).to.equal(2)
+ if (!browser.exactImageData) {
+ done()
+ return
+ }
+ // Image data layout after orientation (B=black, F=white):
+ // FFB
+ // BBB
+ var imageData = img.getContext('2d').getImageData(0, 0, 3, 2).data
+ // 0:0 opaque white
+ expect(imageData[0]).to.equal(255)
+ expect(imageData[1]).to.equal(255)
+ expect(imageData[2]).to.equal(255)
+ expect(imageData[3]).to.equal(255)
+ // 1:0 opaque white
+ expect(imageData[0 + 4]).to.equal(255)
+ expect(imageData[1 + 4]).to.equal(255)
+ expect(imageData[2 + 4]).to.equal(255)
+ expect(imageData[3 + 4]).to.equal(255)
+ // 2:0 opaque black
+ expect(imageData[0 + 8]).to.equal(0)
+ expect(imageData[1 + 8]).to.equal(0)
+ expect(imageData[2 + 8]).to.equal(0)
+ expect(imageData[3 + 8]).to.equal(255)
+ // 0:1 opaque black
+ expect(imageData[0 + 12]).to.equal(0)
+ expect(imageData[1 + 12]).to.equal(0)
+ expect(imageData[2 + 12]).to.equal(0)
+ expect(imageData[3 + 12]).to.equal(255)
+ // 1:1 opaque black
+ expect(imageData[0 + 16]).to.equal(0)
+ expect(imageData[1 + 16]).to.equal(0)
+ expect(imageData[2 + 16]).to.equal(0)
+ expect(imageData[3 + 16]).to.equal(255)
+ // 2:1 opaque black
+ expect(imageData[0 + 20]).to.equal(0)
+ expect(imageData[1 + 20]).to.equal(0)
+ expect(imageData[2 + 20]).to.equal(0)
+ expect(imageData[3 + 20]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 2,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('3: 180° rotate left', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(3)
+ expect(img.height).to.equal(2)
+ // Image data layout after orientation (B=black, F=white):
+ // BBB
+ // FFB
+ var imageData = img.getContext('2d').getImageData(0, 0, 3, 2).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(0)
+ expect(imageData[1]).to.equal(0)
+ expect(imageData[2]).to.equal(0)
+ expect(imageData[3]).to.equal(255)
+ // 1:0 opaque black
+ expect(imageData[0 + 4]).to.equal(0)
+ expect(imageData[1 + 4]).to.equal(0)
+ expect(imageData[2 + 4]).to.equal(0)
+ expect(imageData[3 + 4]).to.equal(255)
+ // 2:0 opaque black
+ expect(imageData[0 + 8]).to.equal(0)
+ expect(imageData[1 + 8]).to.equal(0)
+ expect(imageData[2 + 8]).to.equal(0)
+ expect(imageData[3 + 8]).to.equal(255)
+ // 0:1 opaque white
+ expect(imageData[0 + 12]).to.equal(255)
+ expect(imageData[1 + 12]).to.equal(255)
+ expect(imageData[2 + 12]).to.equal(255)
+ expect(imageData[3 + 12]).to.equal(255)
+ // 1:1 opaque white
+ expect(imageData[0 + 16]).to.equal(255)
+ expect(imageData[1 + 16]).to.equal(255)
+ expect(imageData[2 + 16]).to.equal(255)
+ expect(imageData[3 + 16]).to.equal(255)
+ // 2:1 opaque black
+ expect(imageData[0 + 20]).to.equal(0)
+ expect(imageData[1 + 20]).to.equal(0)
+ expect(imageData[2 + 20]).to.equal(0)
+ expect(imageData[3 + 20]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 3,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('4: vertical flip', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(3)
+ expect(img.height).to.equal(2)
+ if (!browser.exactImageData) {
+ done()
+ return
+ }
+ // Image data layout after orientation (B=black, F=white):
+ // BBB
+ // BFF
+ var imageData = img.getContext('2d').getImageData(0, 0, 3, 2).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(0)
+ expect(imageData[1]).to.equal(0)
+ expect(imageData[2]).to.equal(0)
+ expect(imageData[3]).to.equal(255)
+ // 1:0 opaque black
+ expect(imageData[0 + 4]).to.equal(0)
+ expect(imageData[1 + 4]).to.equal(0)
+ expect(imageData[2 + 4]).to.equal(0)
+ expect(imageData[3 + 4]).to.equal(255)
+ // 2:0 opaque black
+ expect(imageData[0 + 8]).to.equal(0)
+ expect(imageData[1 + 8]).to.equal(0)
+ expect(imageData[2 + 8]).to.equal(0)
+ expect(imageData[3 + 8]).to.equal(255)
+ // 0:1 opaque black
+ expect(imageData[0 + 12]).to.equal(0)
+ expect(imageData[1 + 12]).to.equal(0)
+ expect(imageData[2 + 12]).to.equal(0)
+ expect(imageData[3 + 12]).to.equal(255)
+ // 1:1 opaque white
+ expect(imageData[0 + 16]).to.equal(255)
+ expect(imageData[1 + 16]).to.equal(255)
+ expect(imageData[2 + 16]).to.equal(255)
+ expect(imageData[3 + 16]).to.equal(255)
+ // 2:1 opaque white
+ expect(imageData[0 + 20]).to.equal(255)
+ expect(imageData[1 + 20]).to.equal(255)
+ expect(imageData[2 + 20]).to.equal(255)
+ expect(imageData[3 + 20]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 4,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('5: vertical flip + 90° rotate right', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(2)
+ expect(img.height).to.equal(3)
+ if (!browser.exactImageData) {
+ done()
+ return
+ }
+ // Image data layout after orientation (B=black, F=white):
+ // BB
+ // FB
+ // FB
+ var imageData = img.getContext('2d').getImageData(0, 0, 2, 3).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(0)
+ expect(imageData[1]).to.equal(0)
+ expect(imageData[2]).to.equal(0)
+ expect(imageData[3]).to.equal(255)
+ // 1:0 opaque black
+ expect(imageData[0 + 4]).to.equal(0)
+ expect(imageData[1 + 4]).to.equal(0)
+ expect(imageData[2 + 4]).to.equal(0)
+ expect(imageData[3 + 4]).to.equal(255)
+ // 0:1 opaque white
+ expect(imageData[0 + 8]).to.equal(255)
+ expect(imageData[1 + 8]).to.equal(255)
+ expect(imageData[2 + 8]).to.equal(255)
+ expect(imageData[3 + 8]).to.equal(255)
+ // 1:1 opaque black
+ expect(imageData[0 + 12]).to.equal(0)
+ expect(imageData[1 + 12]).to.equal(0)
+ expect(imageData[2 + 12]).to.equal(0)
+ expect(imageData[3 + 12]).to.equal(255)
+ // 0:2 opaque white
+ expect(imageData[0 + 16]).to.equal(255)
+ expect(imageData[1 + 16]).to.equal(255)
+ expect(imageData[2 + 16]).to.equal(255)
+ expect(imageData[3 + 16]).to.equal(255)
+ // 1:2 opaque black
+ expect(imageData[0 + 20]).to.equal(0)
+ expect(imageData[1 + 20]).to.equal(0)
+ expect(imageData[2 + 20]).to.equal(0)
+ expect(imageData[3 + 20]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 5,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('6: 90° rotate right', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(2)
+ expect(img.height).to.equal(3)
+ // Image data layout after orientation (B=black, F=white):
+ // BB
+ // BF
+ // BF
+ var imageData = img.getContext('2d').getImageData(0, 0, 2, 3).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(0)
+ expect(imageData[1]).to.equal(0)
+ expect(imageData[2]).to.equal(0)
+ expect(imageData[3]).to.equal(255)
+ // 1:0 opaque black
+ expect(imageData[0 + 4]).to.equal(0)
+ expect(imageData[1 + 4]).to.equal(0)
+ expect(imageData[2 + 4]).to.equal(0)
+ expect(imageData[3 + 4]).to.equal(255)
+ // 0:1 opaque black
+ expect(imageData[0 + 8]).to.equal(0)
+ expect(imageData[1 + 8]).to.equal(0)
+ expect(imageData[2 + 8]).to.equal(0)
+ expect(imageData[3 + 8]).to.equal(255)
+ // 1:1 opaque white
+ expect(imageData[0 + 12]).to.equal(255)
+ expect(imageData[1 + 12]).to.equal(255)
+ expect(imageData[2 + 12]).to.equal(255)
+ expect(imageData[3 + 12]).to.equal(255)
+ // 0:2 opaque black
+ expect(imageData[0 + 16]).to.equal(0)
+ expect(imageData[1 + 16]).to.equal(0)
+ expect(imageData[2 + 16]).to.equal(0)
+ expect(imageData[3 + 16]).to.equal(255)
+ // 1:2 opaque white
+ expect(imageData[0 + 20]).to.equal(255)
+ expect(imageData[1 + 20]).to.equal(255)
+ expect(imageData[2 + 20]).to.equal(255)
+ expect(imageData[3 + 20]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 6,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('7: horizontal flip + 90° rotate right', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(2)
+ expect(img.height).to.equal(3)
+ if (!browser.exactImageData) {
+ done()
+ return
+ }
+ // Image data layout after orientation (B=black, F=white):
+ // BF
+ // BF
+ // BB
+ var imageData = img.getContext('2d').getImageData(0, 0, 2, 3).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(0)
+ expect(imageData[1]).to.equal(0)
+ expect(imageData[2]).to.equal(0)
+ expect(imageData[3]).to.equal(255)
+ // 1:0 opaque white
+ expect(imageData[0 + 4]).to.equal(255)
+ expect(imageData[1 + 4]).to.equal(255)
+ expect(imageData[2 + 4]).to.equal(255)
+ expect(imageData[3 + 4]).to.equal(255)
+ // 0:1 opaque black
+ expect(imageData[0 + 8]).to.equal(0)
+ expect(imageData[1 + 8]).to.equal(0)
+ expect(imageData[2 + 8]).to.equal(0)
+ expect(imageData[3 + 8]).to.equal(255)
+ // 1:1 opaque white
+ expect(imageData[0 + 12]).to.equal(255)
+ expect(imageData[1 + 12]).to.equal(255)
+ expect(imageData[2 + 12]).to.equal(255)
+ expect(imageData[3 + 12]).to.equal(255)
+ // 0:2 opaque black
+ expect(imageData[0 + 16]).to.equal(0)
+ expect(imageData[1 + 16]).to.equal(0)
+ expect(imageData[2 + 16]).to.equal(0)
+ expect(imageData[3 + 16]).to.equal(255)
+ // 1:2 opaque black
+ expect(imageData[0 + 20]).to.equal(0)
+ expect(imageData[1 + 20]).to.equal(0)
+ expect(imageData[2 + 20]).to.equal(0)
+ expect(imageData[3 + 20]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 7,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('8: 90° rotate left', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(2)
+ expect(img.height).to.equal(3)
+ // Image data layout after orientation (B=black, F=white):
+ // FB
+ // FB
+ // BB
+ var imageData = img.getContext('2d').getImageData(0, 0, 2, 3).data
+ // 0:0 opaque white
+ expect(imageData[0]).to.equal(255)
+ expect(imageData[1]).to.equal(255)
+ expect(imageData[2]).to.equal(255)
+ expect(imageData[3]).to.equal(255)
+ // 1:0 opaque black
+ expect(imageData[0 + 4]).to.equal(0)
+ expect(imageData[1 + 4]).to.equal(0)
+ expect(imageData[2 + 4]).to.equal(0)
+ expect(imageData[3 + 4]).to.equal(255)
+ // 0:1 opaque white
+ expect(imageData[0 + 8]).to.equal(255)
+ expect(imageData[1 + 8]).to.equal(255)
+ expect(imageData[2 + 8]).to.equal(255)
+ expect(imageData[3 + 8]).to.equal(255)
+ // 1:1 opaque black
+ expect(imageData[0 + 12]).to.equal(0)
+ expect(imageData[1 + 12]).to.equal(0)
+ expect(imageData[2 + 12]).to.equal(0)
+ expect(imageData[3 + 12]).to.equal(255)
+ // 0:2 opaque black
+ expect(imageData[0 + 16]).to.equal(0)
+ expect(imageData[1 + 16]).to.equal(0)
+ expect(imageData[2 + 16]).to.equal(0)
+ expect(imageData[3 + 16]).to.equal(255)
+ // 1:2 opaque black
+ expect(imageData[0 + 20]).to.equal(0)
+ expect(imageData[1 + 20]).to.equal(0)
+ expect(imageData[2 + 20]).to.equal(0)
+ expect(imageData[3 + 20]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 8,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('true: follow EXIF Orientation value', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(2)
+ expect(img.height).to.equal(3)
+ // Image data layout after orientation (B=black, F=white):
+ // BB
+ // BF
+ // BF
+ var imageData = img.getContext('2d').getImageData(0, 0, 2, 3).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(0)
+ expect(imageData[1]).to.equal(0)
+ expect(imageData[2]).to.equal(0)
+ expect(imageData[3]).to.equal(255)
+ // 1:0 opaque black
+ expect(imageData[0 + 4]).to.equal(0)
+ expect(imageData[1 + 4]).to.equal(0)
+ expect(imageData[2 + 4]).to.equal(0)
+ expect(imageData[3 + 4]).to.equal(255)
+ // 0:1 opaque black
+ expect(imageData[0 + 8]).to.equal(0)
+ expect(imageData[1 + 8]).to.equal(0)
+ expect(imageData[2 + 8]).to.equal(0)
+ expect(imageData[3 + 8]).to.equal(255)
+ // 1:1 opaque white
+ expect(imageData[0 + 12]).to.equal(255)
+ expect(imageData[1 + 12]).to.equal(255)
+ expect(imageData[2 + 12]).to.equal(255)
+ expect(imageData[3 + 12]).to.equal(255)
+ // 0:2 opaque black
+ expect(imageData[0 + 16]).to.equal(0)
+ expect(imageData[1 + 16]).to.equal(0)
+ expect(imageData[2 + 16]).to.equal(0)
+ expect(imageData[3 + 16]).to.equal(255)
+ // 1:2 opaque white
+ expect(imageData[0 + 20]).to.equal(255)
+ expect(imageData[1 + 20]).to.equal(255)
+ expect(imageData[2 + 20]).to.equal(255)
+ expect(imageData[3 + 20]).to.equal(255)
+ done()
+ },
+ {
+ orientation: true,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('Only use EXIF data and canvas if necessary', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img, data) {
+ expect(img.width).to.equal(2)
+ expect(img.height).to.equal(3)
+ expect(data).to.be.ok
+ if (loadImage.orientation) {
+ expect(data.exif).to.be.undefined
+ expect(img.getContext).to.be.undefined
+ } else {
+ expect(img.getContext).to.be.an.instanceOf(Function)
+ expect(data.exif).to.be.ok
+ expect(data.exif.get('Orientation')).to.equal(6)
+ }
+ done()
+ },
+ { orientation: true }
+ )
+ ).to.be.ok
+ })
+
+ it('Scale image after EXIF based orientation', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(20)
+ expect(img.height).to.equal(30)
+ done()
+ },
+ { orientation: true, minWidth: 20, minHeight: 30 }
+ )
+ ).to.be.ok
+ })
+
+ it('Provide original image width+height from before orientation', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img, data) {
+ expect(data.originalWidth).to.equal(3)
+ expect(data.originalHeight).to.equal(2)
+ done()
+ },
+ { meta: true, minWidth: 20, minHeight: 30 }
+ )
+ ).to.be.ok
+ })
+
+ describe('Cropping', function () {
+ it('1: keep original, right: 1, bottom: 1', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(2)
+ expect(img.height).to.equal(1)
+ // Image data layout after orientation (B=black, F=white):
+ // BF
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 2, 1).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(0)
+ expect(imageData[1]).to.equal(0)
+ expect(imageData[2]).to.equal(0)
+ expect(imageData[3]).to.equal(255)
+ // 1:0 opaque white
+ expect(imageData[0 + 4]).to.equal(255)
+ expect(imageData[1 + 4]).to.equal(255)
+ expect(imageData[2 + 4]).to.equal(255)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 1,
+ right: 1,
+ bottom: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('2: horizontal flip, bottom: 1, left: 1', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(2)
+ expect(img.height).to.equal(1)
+ if (!browser.exactImageData) {
+ done()
+ return
+ }
+ // Image data layout after orientation (B=black, F=white):
+ // FB
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 2, 1).data
+ // 0:0 opaque white
+ expect(imageData[0]).to.equal(255)
+ expect(imageData[1]).to.equal(255)
+ expect(imageData[2]).to.equal(255)
+ expect(imageData[3]).to.equal(255)
+ // 1:0 opaque black
+ expect(imageData[0 + 4]).to.equal(0)
+ expect(imageData[1 + 4]).to.equal(0)
+ expect(imageData[2 + 4]).to.equal(0)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 2,
+ bottom: 1,
+ left: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('3: 180° rotate left, top: 1, left: 1', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(2)
+ expect(img.height).to.equal(1)
+ // Image data layout after orientation (B=black, F=white):
+ // FB
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 2, 1).data
+ // 0:0 opaque white
+ expect(imageData[0]).to.equal(255)
+ expect(imageData[1]).to.equal(255)
+ expect(imageData[2]).to.equal(255)
+ expect(imageData[3]).to.equal(255)
+ // 1:0 opaque black
+ expect(imageData[0 + 4]).to.equal(0)
+ expect(imageData[1 + 4]).to.equal(0)
+ expect(imageData[2 + 4]).to.equal(0)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 3,
+ top: 1,
+ left: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('4: vertical flip, top: 1, right: 1', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(2)
+ expect(img.height).to.equal(1)
+ if (!browser.exactImageData) {
+ done()
+ return
+ }
+ // Image data layout after orientation (B=black, F=white):
+ // BF
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 2, 1).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(0)
+ expect(imageData[1]).to.equal(0)
+ expect(imageData[2]).to.equal(0)
+ expect(imageData[3]).to.equal(255)
+ // 1:0 opaque white
+ expect(imageData[0 + 4]).to.equal(255)
+ expect(imageData[1 + 4]).to.equal(255)
+ expect(imageData[2 + 4]).to.equal(255)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 4,
+ top: 1,
+ right: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('5: vertical flip + 90° rotate right, right: 1, bottom: 1', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(1)
+ expect(img.height).to.equal(2)
+ if (!browser.exactImageData) {
+ done()
+ return
+ }
+ // Image data layout after orientation (B=black, F=white):
+ // B
+ // F
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 1, 2).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(0)
+ expect(imageData[1]).to.equal(0)
+ expect(imageData[2]).to.equal(0)
+ expect(imageData[3]).to.equal(255)
+ // 0:1 opaque white
+ expect(imageData[0 + 4]).to.equal(255)
+ expect(imageData[1 + 4]).to.equal(255)
+ expect(imageData[2 + 4]).to.equal(255)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 5,
+ right: 1,
+ bottom: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('6: 90° rotate right, bottom: 1, left: 1', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(1)
+ expect(img.height).to.equal(2)
+ // Image data layout after orientation (B=black, F=white):
+ // B
+ // F
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 1, 2).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(0)
+ expect(imageData[1]).to.equal(0)
+ expect(imageData[2]).to.equal(0)
+ expect(imageData[3]).to.equal(255)
+ // 0:1 opaque white
+ expect(imageData[0 + 4]).to.equal(255)
+ expect(imageData[1 + 4]).to.equal(255)
+ expect(imageData[2 + 4]).to.equal(255)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 6,
+ bottom: 1,
+ left: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('7: horizontal flip + 90° rotate right, top: 1, left: 1', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(1)
+ expect(img.height).to.equal(2)
+ if (!browser.exactImageData) {
+ done()
+ return
+ }
+ // Image data layout after orientation (B=black, F=white):
+ // F
+ // B
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 1, 2).data
+ // 0:0 opaque white
+ expect(imageData[0]).to.equal(255)
+ expect(imageData[1]).to.equal(255)
+ expect(imageData[2]).to.equal(255)
+ expect(imageData[3]).to.equal(255)
+ // 0:1 opaque black
+ expect(imageData[0 + 4]).to.equal(0)
+ expect(imageData[1 + 4]).to.equal(0)
+ expect(imageData[2 + 4]).to.equal(0)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 7,
+ top: 1,
+ left: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('8: 90° rotate left, top: 1, right: 1', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(1)
+ expect(img.height).to.equal(2)
+ // Image data layout after orientation (B=black, F=white):
+ // F
+ // B
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 1, 2).data
+ // 0:0 opaque white
+ expect(imageData[0]).to.equal(255)
+ expect(imageData[1]).to.equal(255)
+ expect(imageData[2]).to.equal(255)
+ expect(imageData[3]).to.equal(255)
+ // 0:1 opaque black
+ expect(imageData[0 + 4]).to.equal(0)
+ expect(imageData[1 + 4]).to.equal(0)
+ expect(imageData[2 + 4]).to.equal(0)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: 8,
+ top: 1,
+ right: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('true: follow EXIF Orientation value, bottom: 1, left: 1', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(1)
+ expect(img.height).to.equal(2)
+ // Image data layout after orientation (B=black, F=white):
+ // B
+ // F
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 1, 2).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(0)
+ expect(imageData[1]).to.equal(0)
+ expect(imageData[2]).to.equal(0)
+ expect(imageData[3]).to.equal(255)
+ // 0:1 opaque white
+ expect(imageData[0 + 4]).to.equal(255)
+ expect(imageData[1 + 4]).to.equal(255)
+ expect(imageData[2 + 4]).to.equal(255)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: true,
+ left: 1,
+ bottom: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('true: follow EXIF Orientation value, top: 1, left: 1', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(1)
+ expect(img.height).to.equal(2)
+ // Image data layout after orientation (B=black, F=white):
+ // F
+ // F
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 1, 2).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(255)
+ expect(imageData[1]).to.equal(255)
+ expect(imageData[2]).to.equal(255)
+ expect(imageData[3]).to.equal(255)
+ // 0:1 opaque black
+ expect(imageData[0 + 4]).to.equal(255)
+ expect(imageData[1 + 4]).to.equal(255)
+ expect(imageData[2 + 4]).to.equal(255)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: true,
+ top: 1,
+ left: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('true: follow EXIF Orientation value, top: 1, right: 1', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(1)
+ expect(img.height).to.equal(2)
+ // Image data layout after orientation (B=black, F=white):
+ // B
+ // B
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 1, 2).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(0)
+ expect(imageData[1]).to.equal(0)
+ expect(imageData[2]).to.equal(0)
+ expect(imageData[3]).to.equal(255)
+ // 0:1 opaque black
+ expect(imageData[0 + 4]).to.equal(0)
+ expect(imageData[1 + 4]).to.equal(0)
+ expect(imageData[2 + 4]).to.equal(0)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: true,
+ top: 1,
+ right: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+
+ it('true: follow EXIF Orientation value, right: 1, bottom: 1', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img) {
+ expect(img.width).to.equal(1)
+ expect(img.height).to.equal(2)
+ // Image data layout after orientation (B=black, F=white):
+ // B
+ // B
+ var imageData = img
+ .getContext('2d')
+ .getImageData(0, 0, 1, 2).data
+ // 0:0 opaque black
+ expect(imageData[0]).to.equal(0)
+ expect(imageData[1]).to.equal(0)
+ expect(imageData[2]).to.equal(0)
+ expect(imageData[3]).to.equal(255)
+ // 0:1 opaque black
+ expect(imageData[0 + 4]).to.equal(0)
+ expect(imageData[1 + 4]).to.equal(0)
+ expect(imageData[2 + 4]).to.equal(0)
+ expect(imageData[3 + 4]).to.equal(255)
+ done()
+ },
+ {
+ orientation: true,
+ right: 1,
+ bottom: 1,
+ meta: true,
+ canvas: true,
+ imageSmoothingEnabled: false
+ }
+ )
+ ).to.be.ok
+ })
+ })
})
+ })
+
+ describe('Metadata', function () {
+ if (!window.DataView || !loadImage.blobSlice) return
- it('Should rotate right', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(60)
- expect(img.height).to.equal(80)
+ it('Parse EXIF tags', function (done) {
+ loadImage.parseMetaData(blobJPEG, function (data) {
+ expect(data.exif).to.be.ok
+ expect(data.exif.get('Orientation')).to.equal(6)
done()
- }, {orientation: 6})).to.be.ok
+ })
})
- it('Should adjust constraints to new coordinates', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(30)
- expect(img.height).to.equal(40)
- done()
- }, {orientation: 6, maxWidth: 30, maxHeight: 40})).to.be.ok
+ it('Do not parse EXIF tags if disabled', function (done) {
+ loadImage.parseMetaData(
+ blobJPEG,
+ function (data) {
+ expect(data.exif).to.be.undefined
+ done()
+ },
+ { disableExif: true }
+ )
})
- it('Should adjust left and top to new coordinates', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(30)
- expect(img.height).to.equal(60)
+ it('Parse EXIF tag offsets', function (done) {
+ loadImage.parseMetaData(blobJPEG, function (data) {
+ expect(data.exifOffsets).to.be.ok
+ expect(data.exifOffsets.get('Orientation')).to.equal(0x16)
+ expect(data.exifTiffOffset).to.equal(0xc)
+ expect(data.exifLittleEndian).to.equal(false)
done()
- }, {orientation: 5, left: 30, top: 20})).to.be.ok
+ })
})
- it('Should adjust right and bottom to new coordinates', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(30)
- expect(img.height).to.equal(60)
- done()
- }, {orientation: 5, right: 30, bottom: 20})).to.be.ok
+ it('Do not parse EXIF tag offsets if disabled', function (done) {
+ loadImage.parseMetaData(
+ blobJPEG,
+ function (data) {
+ expect(data.exifOffsets).to.be.undefined
+ done()
+ },
+ { disableExifOffsets: true }
+ )
})
- it('Should adjust left and bottom to new coordinates', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(30)
- expect(img.height).to.equal(60)
- done()
- }, {orientation: 7, left: 30, bottom: 20})).to.be.ok
+ it('Only parse included EXIF tags', function (done) {
+ loadImage.parseMetaData(
+ blobJPEG,
+ function (data) {
+ expect(data.exif).to.be.ok
+ expect(data.exif.get('Orientation')).to.equal(6)
+ loadImage.parseMetaData(
+ blobJPEG,
+ function (data) {
+ expect(data.exif).to.be.ok
+ expect(data.exif.get('Orientation')).to.be.undefined
+ done()
+ },
+ { includeExifTags: { 0x0132: true } } // DateTime
+ )
+ },
+ { includeExifTags: { 0x0112: true } } // Orientation
+ )
})
- it('Should adjust right and top to new coordinates', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(30)
- expect(img.height).to.equal(60)
- done()
- }, {orientation: 7, right: 30, top: 20})).to.be.ok
+ it('Do not parse excluded EXIF tags', function (done) {
+ loadImage.parseMetaData(
+ blobJPEG,
+ function (data) {
+ expect(data.exif).to.be.ok
+ expect(data.exif.get('Orientation')).to.equal(6)
+ loadImage.parseMetaData(
+ blobJPEG,
+ function (data) {
+ expect(data.exif).to.be.ok
+ expect(data.exif.get('Orientation')).to.be.undefined
+ done()
+ },
+ { excludeExifTags: { 0x0112: true } } // Orientation
+ )
+ },
+ { excludeExifTags: { 0x0132: true } } // DateTime
+ )
})
- it('Should rotate left with the given pixelRatio', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(120)
- expect(img.height).to.equal(160)
- expect(img.style.width).to.equal('60px')
- expect(img.style.height).to.equal('80px')
+ it('Parse IPTC tags', function (done) {
+ loadImage.parseMetaData(blobJPEG, function (data) {
+ expect(data.iptc).to.be.ok
+ expect(data.iptc.get('ObjectName')).to.equal('blueimp.net')
done()
- }, {orientation: 8, pixelRatio: 2})).to.be.ok
+ })
})
- it('Should rotate right with the given pixelRatio', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(120)
- expect(img.height).to.equal(160)
- expect(img.style.width).to.equal('60px')
- expect(img.style.height).to.equal('80px')
- done()
- }, {orientation: 6, pixelRatio: 2})).to.be.ok
+ it('Do not parse IPTC tags if disabled', function (done) {
+ loadImage.parseMetaData(
+ blobJPEG,
+ function (data) {
+ expect(data.iptc).to.be.undefined
+ done()
+ },
+ { disableIptc: true }
+ )
})
- it('Should ignore too small orientation value', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(80)
- expect(img.height).to.equal(60)
+ it('Parse IPTC tag offsets', function (done) {
+ loadImage.parseMetaData(blobJPEG, function (data) {
+ expect(data.iptcOffsets).to.be.ok
+ expect(data.iptcOffsets.get('ObjectName')).to.equal(0x44)
done()
- }, {orientation: -1})).to.be.ok
+ })
})
- it('Should ignore too large orientation value', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.width).to.equal(80)
- expect(img.height).to.equal(60)
- done()
- }, {orientation: 9})).to.be.ok
+ it('Do not parse IPTC tag offsets if disabled', function (done) {
+ loadImage.parseMetaData(
+ blobJPEG,
+ function (data) {
+ expect(data.iptcOffsets).to.be.undefined
+ done()
+ },
+ { disableIptcOffsets: true }
+ )
})
- it('Should rotate right based on the exif orientation value', function (done) {
- expect(loadImage(blobJPEG, function (img, data) {
- expect(data).to.be.ok
- expect(data.exif).to.be.ok
- expect(data.exif.get('Orientation')).to.equal(6)
- expect(img.width).to.equal(1)
- expect(img.height).to.equal(2)
- done()
- }, {orientation: true})).to.be.ok
+ it('Only parse included IPTC tags', function (done) {
+ loadImage.parseMetaData(
+ blobJPEG,
+ function (data) {
+ expect(data.iptc).to.be.ok
+ expect(data.iptc.get('ApplicationRecordVersion')).to.be.undefined
+ expect(data.iptc.get('ObjectName')).to.equal('blueimp.net')
+ loadImage.parseMetaData(
+ blobJPEG,
+ function (data) {
+ expect(data.iptc).to.be.ok
+ expect(data.iptc.get('ApplicationRecordVersion')).to.equal(4)
+ expect(data.iptc.get('ObjectName')).to.be.undefined
+ done()
+ },
+ { includeIptcTags: { 0: true } } // ApplicationRecordVersion
+ )
+ },
+ { includeIptcTags: { 5: true } } // ObjectName
+ )
})
- it('Should adjust constraints based on the exif orientation value', function (done) {
- expect(loadImage(blobJPEG, function (img) {
- expect(img.width).to.equal(10)
- expect(img.height).to.equal(20)
- done()
- }, {orientation: true, minWidth: 10, minHeight: 20})).to.be.ok
+ it('Do not parse excluded IPTC tags', function (done) {
+ loadImage.parseMetaData(
+ blobJPEG,
+ function (data) {
+ expect(data.iptc).to.be.ok
+ expect(data.iptc.get('ApplicationRecordVersion')).to.equal(4)
+ expect(data.iptc.get('ObjectName')).to.be.undefined
+ loadImage.parseMetaData(
+ blobJPEG,
+ function (data) {
+ expect(data.iptc).to.be.ok
+ expect(data.iptc.get('ApplicationRecordVersion')).to.be.undefined
+ expect(data.iptc.get('ObjectName')).to.equal('blueimp.net')
+ done()
+ },
+ { excludeIptcTags: { 0: true } } // Orientation
+ )
+ },
+ { excludeIptcTags: { 5: true } } // DateTime
+ )
})
- })
- describe('Canvas', function () {
- it('Return img element to callback if canvas is not true', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.getContext).to.not.be.ok
- expect(img.nodeName.toLowerCase()).to.equal('img')
- done()
- })).to.be.ok
+ it('Parse the complete image head', function (done) {
+ loadImage.parseMetaData(blobJPEG, function (data) {
+ expect(data.imageHead).to.be.ok
+ loadImage.parseMetaData(
+ createBlob(data.imageHead, 'image/jpeg'),
+ function (data) {
+ expect(data.exif).to.be.ok
+ expect(data.exif.get('Orientation')).to.equal(6)
+ done()
+ }
+ )
+ })
})
- it('Return canvas element to callback if canvas is true', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.getContext).to.be.ok
- expect(img.nodeName.toLowerCase()).to.equal('canvas')
- done()
- }, {canvas: true})).to.be.ok
+ it('Do not parse the complete image head if disabled', function (done) {
+ loadImage.parseMetaData(
+ blobJPEG,
+ function (data) {
+ expect(data.imageHead).to.be.undefined
+ done()
+ },
+ { disableImageHead: true }
+ )
})
- it('Return scaled canvas element to callback', function (done) {
- expect(loadImage(blobGIF, function (img) {
- expect(img.getContext).to.be.ok
- expect(img.nodeName.toLowerCase()).to.equal('canvas')
- expect(img.width).to.equal(40)
- expect(img.height).to.equal(30)
- done()
- }, {canvas: true, maxWidth: 40})).to.be.ok
+ it('Parse metadata automatically', function (done) {
+ expect(
+ loadImage(
+ blobJPEG,
+ function (img, data) {
+ expect(data).to.be.ok
+ expect(data.imageHead).to.be.ok
+ expect(data.exif).to.be.ok
+ expect(data.exif.get('Orientation')).to.equal(6)
+ expect(data.iptc).to.be.ok
+ expect(data.iptc.get('ObjectName')).to.equal('blueimp.net')
+ done()
+ },
+ { meta: true }
+ )
+ ).to.be.ok
})
- it('Accept a canvas element as parameter for loadImage.scale', function (done) {
- expect(loadImage(blobGIF, function (img) {
- img = loadImage.scale(img, {
- maxWidth: 40
+ it('Write EXIF Orientation tag and replace image head', function (done) {
+ loadImage(
+ blobJPEG,
+ function (img, data) {
+ expect(data.imageHead).to.be.ok
+ expect(data.exif).to.be.ok
+ expect(data.exif.get('Orientation')).to.equal(6)
+ expect(data.iptc).to.be.ok
+ expect(data.iptc.get('ObjectName')).to.equal('blueimp.net')
+ // Reset EXIF Orientation data:
+ var buffer = loadImage.writeExifData(
+ data.imageHead,
+ data,
+ 'Orientation',
+ 1
+ )
+ // Check if Orientation writer changes image head buffer in place:
+ expect(buffer).to.equal(data.imageHead)
+ img.toBlob(function (blob) {
+ loadImage.replaceHead(blob, data.imageHead, function (newBlob) {
+ loadImage(
+ newBlob,
+ function (img, data) {
+ expect(img.width).to.equal(40)
+ expect(img.height).to.equal(60)
+ expect(data.imageHead).to.be.ok
+ expect(data.exif).to.be.ok
+ expect(data.exif.get('Orientation')).to.equal(1)
+ expect(data.iptc).to.be.ok
+ expect(data.iptc.get('ObjectName')).to.equal('blueimp.net')
+ done()
+ },
+ { meta: true }
+ )
+ })
+ }, 'image/jpeg')
+ },
+ { meta: true, orientation: true, canvas: true, minWidth: 40 }
+ )
+ })
+
+ describe('Promise', function () {
+ if (!window.Promise) return
+
+ it('Parse the complete image head', function () {
+ return loadImage.parseMetaData(blobJPEG).then(function (data) {
+ expect(data.imageHead).to.be.ok
+ return loadImage
+ .parseMetaData(createBlob(data.imageHead, 'image/jpeg'))
+ .then(function (data) {
+ expect(data.exif).to.be.ok
+ expect(data.exif.get('Orientation')).to.equal(6)
+ })
})
- expect(img.getContext).to.be.ok
- expect(img.nodeName.toLowerCase()).to.equal('canvas')
- expect(img.width).to.equal(40)
- expect(img.height).to.equal(30)
- done()
- }, {canvas: true})).to.be.ok
+ })
+
+ it('Write EXIF Orientation tag and replace image head', function () {
+ return loadImage(blobJPEG, {
+ meta: true,
+ orientation: true,
+ canvas: true,
+ minWidth: 40
+ })
+ .then(function (data) {
+ expect(data.imageHead).to.be.ok
+ expect(data.exif).to.be.ok
+ expect(data.exif.get('Orientation')).to.equal(6)
+ expect(data.iptc).to.be.ok
+ expect(data.iptc.get('ObjectName')).to.equal('blueimp.net')
+ // Reset EXIF Orientation data:
+ var buffer = loadImage.writeExifData(
+ data.imageHead,
+ data,
+ 'Orientation',
+ 1
+ )
+ // Check if Orientation writer changes image head buffer in place:
+ expect(buffer).to.equal(data.imageHead)
+ return new Promise(function (resolve) {
+ data.image.toBlob(function (blob) {
+ data.blob = blob
+ resolve(data)
+ }, 'image/jpeg')
+ })
+ })
+ .then(function (data) {
+ return loadImage.replaceHead(data.blob, data.imageHead)
+ })
+ .then(function (blob) {
+ return loadImage(blob, { meta: true }).then(function (data) {
+ var img = data.image
+ expect(img.width).to.equal(40)
+ expect(img.height).to.equal(60)
+ expect(data.imageHead).to.be.ok
+ expect(data.exif).to.be.ok
+ expect(data.exif.get('Orientation')).to.equal(1)
+ expect(data.iptc).to.be.ok
+ expect(data.iptc.get('ObjectName')).to.equal('blueimp.net')
+ })
+ })
+ })
})
})
- describe('Metadata', function () {
- it('Should parse Exif information', function (done) {
- loadImage.parseMetaData(blobJPEG, function (data) {
- expect(data.exif).to.be.ok
- expect(data.exif.get('Orientation')).to.equal(6)
+ describe('Fetch', function () {
+ if (
+ !(window.fetch && window.Request) &&
+ !(window.XMLHttpRequest && window.ProgressEvent)
+ ) {
+ return
+ }
+
+ it('Fetch image URL as blob', function (done) {
+ // IE does not allow XMLHttpRequest access to data URLs,
+ // so we use an ObjectURL instead of imageUrlJPEG directly:
+ loadImage.fetchBlob(loadImage.createObjectURL(blobJPEG), function (blob) {
+ expect(blob).to.be.an.instanceOf(Blob)
done()
})
})
- it('Should parse the complete image head', function (done) {
- loadImage.parseMetaData(blobJPEG, function (data) {
- expect(data.imageHead).to.be.ok
- loadImage.parseMetaData(
- createBlob(data.imageHead, 'image/jpeg'),
- function (data) {
+ it('Fetch image URL as blob if meta option is true', function (done) {
+ expect(
+ loadImage(
+ // IE does not allow XMLHttpRequest access to data URLs,
+ // so we use an ObjectURL instead of imageUrlJPEG directly:
+ loadImage.createObjectURL(blobJPEG),
+ function (img, data) {
+ expect(data).to.be.ok
+ expect(data.imageHead).to.be.ok
expect(data.exif).to.be.ok
expect(data.exif.get('Orientation')).to.equal(6)
+ expect(data.iptc).to.be.ok
+ expect(data.iptc.get('ObjectName')).to.equal('blueimp.net')
done()
- }
+ },
+ { meta: true }
)
- })
+ ).to.be.ok
})
- it('Should parse meta data automatically', function (done) {
- expect(loadImage(blobJPEG, function (img, data) {
- expect(data).to.be.ok
- expect(data.imageHead).to.be.ok
- expect(data.exif).to.be.ok
- expect(data.exif.get('Orientation')).to.equal(6)
- done()
- }, {meta: true})).to.be.ok
+ it('Load image URL as img if meta option is false', function (done) {
+ expect(
+ loadImage(imageUrlJPEG, function (img, data) {
+ expect(data.imageHead).to.be.undefined
+ expect(data.exif).to.be.undefined
+ expect(data.iptc).to.be.undefined
+ done()
+ })
+ ).to.be.ok
+ })
+
+ describe('Promise', function () {
+ if (!window.Promise) return
+
+ it('Fetch image URL as blob', function () {
+ // IE does not allow XMLHttpRequest access to data URLs,
+ // so we use an ObjectURL instead of imageUrlJPEG directly:
+ return loadImage
+ .fetchBlob(loadImage.createObjectURL(blobJPEG))
+ .then(function (blob) {
+ expect(blob).to.be.an.instanceOf(Blob)
+ })
+ })
})
})
-}(
- this.chai.expect,
- this.loadImage
-))
+})(this.chai.expect, this.loadImage)
diff --git a/test/vendor/chai.js b/test/vendor/chai.js
index bbe4c4a..e1520f7 100644
--- a/test/vendor/chai.js
+++ b/test/vendor/chai.js
@@ -1,4 +1,4 @@
-(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.chai = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o
'foo'}).to.be.a('foo');
+ * `.a` supports objects that have a custom type set via `Symbol.toStringTag`.
+ *
+ * var myObj = {
+ * [Symbol.toStringTag]: 'myCustomType'
+ * };
+ *
+ * expect(myObj).to.be.a('myCustomType').but.not.an('object');
+ *
+ * It's often best to use `.a` to check a target's type before making more
+ * assertions on the same target. That way, you avoid unexpected behavior from
+ * any assertion that does different things based on the target's type.
+ *
+ * expect([1, 2, 3]).to.be.an('array').that.includes(2);
+ * expect([]).to.be.an('array').that.is.empty;
+ *
+ * Add `.not` earlier in the chain to negate `.a`. However, it's often best to
+ * assert that the target is the expected type, rather than asserting that it
+ * isn't one of many unexpected types.
+ *
+ * expect('foo').to.be.a('string'); // Recommended
+ * expect('foo').to.not.be.an('array'); // Not recommended
+ *
+ * `.a` accepts an optional `msg` argument which is a custom error message to
+ * show when the assertion fails. The message can also be given as the second
+ * argument to `expect`.
+ *
+ * expect(1).to.be.a('string', 'nooo why fail??');
+ * expect(1, 'nooo why fail??').to.be.a('string');
+ *
+ * `.a` can also be used as a language chain to improve the readability of
+ * your assertions.
*
- * // language chain
- * expect(foo).to.be.an.instanceof(Foo);
+ * expect({b: 2}).to.have.a.property('b');
+ *
+ * The alias `.an` can be used interchangeably with `.a`.
*
* @name a
* @alias an
* @param {String} type
- * @param {String} message _optional_
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
@@ -456,7 +676,7 @@ module.exports = function (chai, _) {
, article = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(type.charAt(0)) ? 'an ' : 'a ';
this.assert(
- type === _.type(obj)
+ type === _.type(obj).toLowerCase()
, 'expected #{this} to be ' + article + type
, 'expected #{this} not to be ' + article + type
);
@@ -466,60 +686,277 @@ module.exports = function (chai, _) {
Assertion.addChainableMethod('a', an);
/**
- * ### .include(value)
+ * ### .include(val[, msg])
+ *
+ * When the target is a string, `.include` asserts that the given string `val`
+ * is a substring of the target.
+ *
+ * expect('foobar').to.include('foo');
+ *
+ * When the target is an array, `.include` asserts that the given `val` is a
+ * member of the target.
+ *
+ * expect([1, 2, 3]).to.include(2);
+ *
+ * When the target is an object, `.include` asserts that the given object
+ * `val`'s properties are a subset of the target's properties.
+ *
+ * expect({a: 1, b: 2, c: 3}).to.include({a: 1, b: 2});
+ *
+ * When the target is a Set or WeakSet, `.include` asserts that the given `val` is a
+ * member of the target. SameValueZero equality algorithm is used.
+ *
+ * expect(new Set([1, 2])).to.include(2);
+ *
+ * When the target is a Map, `.include` asserts that the given `val` is one of
+ * the values of the target. SameValueZero equality algorithm is used.
+ *
+ * expect(new Map([['a', 1], ['b', 2]])).to.include(2);
+ *
+ * Because `.include` does different things based on the target's type, it's
+ * important to check the target's type before using `.include`. See the `.a`
+ * doc for info on testing a target's type.
+ *
+ * expect([1, 2, 3]).to.be.an('array').that.includes(2);
+ *
+ * By default, strict (`===`) equality is used to compare array members and
+ * object properties. Add `.deep` earlier in the chain to use deep equality
+ * instead (WeakSet targets are not supported). See the `deep-eql` project
+ * page for info on the deep equality algorithm: https://github.com/chaijs/deep-eql.
+ *
+ * // Target array deeply (but not strictly) includes `{a: 1}`
+ * expect([{a: 1}]).to.deep.include({a: 1});
+ * expect([{a: 1}]).to.not.include({a: 1});
*
- * The `include` and `contain` assertions can be used as either property
- * based language chains or as methods to assert the inclusion of an object
- * in an array or a substring in a string. When used as language chains,
- * they toggle the `contains` flag for the `keys` assertion.
+ * // Target object deeply (but not strictly) includes `x: {a: 1}`
+ * expect({x: {a: 1}}).to.deep.include({x: {a: 1}});
+ * expect({x: {a: 1}}).to.not.include({x: {a: 1}});
*
- * expect([1,2,3]).to.include(2);
- * expect('foobar').to.contain('foo');
- * expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo');
+ * By default, all of the target's properties are searched when working with
+ * objects. This includes properties that are inherited and/or non-enumerable.
+ * Add `.own` earlier in the chain to exclude the target's inherited
+ * properties from the search.
+ *
+ * Object.prototype.b = 2;
+ *
+ * expect({a: 1}).to.own.include({a: 1});
+ * expect({a: 1}).to.include({b: 2}).but.not.own.include({b: 2});
+ *
+ * Note that a target object is always only searched for `val`'s own
+ * enumerable properties.
+ *
+ * `.deep` and `.own` can be combined.
+ *
+ * expect({a: {b: 2}}).to.deep.own.include({a: {b: 2}});
+ *
+ * Add `.nested` earlier in the chain to enable dot- and bracket-notation when
+ * referencing nested properties.
+ *
+ * expect({a: {b: ['x', 'y']}}).to.nested.include({'a.b[1]': 'y'});
+ *
+ * If `.` or `[]` are part of an actual property name, they can be escaped by
+ * adding two backslashes before them.
+ *
+ * expect({'.a': {'[b]': 2}}).to.nested.include({'\\.a.\\[b\\]': 2});
+ *
+ * `.deep` and `.nested` can be combined.
+ *
+ * expect({a: {b: [{c: 3}]}}).to.deep.nested.include({'a.b[0]': {c: 3}});
+ *
+ * `.own` and `.nested` cannot be combined.
+ *
+ * Add `.not` earlier in the chain to negate `.include`.
+ *
+ * expect('foobar').to.not.include('taco');
+ * expect([1, 2, 3]).to.not.include(4);
+ *
+ * However, it's dangerous to negate `.include` when the target is an object.
+ * The problem is that it creates uncertain expectations by asserting that the
+ * target object doesn't have all of `val`'s key/value pairs but may or may
+ * not have some of them. It's often best to identify the exact output that's
+ * expected, and then write an assertion that only accepts that exact output.
+ *
+ * When the target object isn't even expected to have `val`'s keys, it's
+ * often best to assert exactly that.
+ *
+ * expect({c: 3}).to.not.have.any.keys('a', 'b'); // Recommended
+ * expect({c: 3}).to.not.include({a: 1, b: 2}); // Not recommended
+ *
+ * When the target object is expected to have `val`'s keys, it's often best to
+ * assert that each of the properties has its expected value, rather than
+ * asserting that each property doesn't have one of many unexpected values.
+ *
+ * expect({a: 3, b: 4}).to.include({a: 3, b: 4}); // Recommended
+ * expect({a: 3, b: 4}).to.not.include({a: 1, b: 2}); // Not recommended
+ *
+ * `.include` accepts an optional `msg` argument which is a custom error
+ * message to show when the assertion fails. The message can also be given as
+ * the second argument to `expect`.
+ *
+ * expect([1, 2, 3]).to.include(4, 'nooo why fail??');
+ * expect([1, 2, 3], 'nooo why fail??').to.include(4);
+ *
+ * `.include` can also be used as a language chain, causing all `.members` and
+ * `.keys` assertions that follow in the chain to require the target to be a
+ * superset of the expected set, rather than an identical set. Note that
+ * `.members` ignores duplicates in the subset when `.include` is added.
+ *
+ * // Target object's keys are a superset of ['a', 'b'] but not identical
+ * expect({a: 1, b: 2, c: 3}).to.include.all.keys('a', 'b');
+ * expect({a: 1, b: 2, c: 3}).to.not.have.all.keys('a', 'b');
+ *
+ * // Target array is a superset of [1, 2] but not identical
+ * expect([1, 2, 3]).to.include.members([1, 2]);
+ * expect([1, 2, 3]).to.not.have.members([1, 2]);
+ *
+ * // Duplicates in the subset are ignored
+ * expect([1, 2, 3]).to.include.members([1, 2, 2, 2]);
+ *
+ * Note that adding `.any` earlier in the chain causes the `.keys` assertion
+ * to ignore `.include`.
+ *
+ * // Both assertions are identical
+ * expect({a: 1}).to.include.any.keys('a', 'b');
+ * expect({a: 1}).to.have.any.keys('a', 'b');
+ *
+ * The aliases `.includes`, `.contain`, and `.contains` can be used
+ * interchangeably with `.include`.
*
* @name include
* @alias contain
* @alias includes
* @alias contains
- * @param {Object|String|Number} obj
- * @param {String} message _optional_
+ * @param {Mixed} val
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
+ function SameValueZero(a, b) {
+ return (_.isNaN(a) && _.isNaN(b)) || a === b;
+ }
+
function includeChainingBehavior () {
flag(this, 'contains', true);
}
function include (val, msg) {
- _.expectTypes(this, ['array', 'object', 'string']);
-
if (msg) flag(this, 'message', msg);
- var obj = flag(this, 'object');
- var expected = false;
- if (_.type(obj) === 'array' && _.type(val) === 'object') {
- for (var i in obj) {
- if (_.eql(obj[i], val)) {
- expected = true;
- break;
+ var obj = flag(this, 'object')
+ , objType = _.type(obj).toLowerCase()
+ , flagMsg = flag(this, 'message')
+ , negate = flag(this, 'negate')
+ , ssfi = flag(this, 'ssfi')
+ , isDeep = flag(this, 'deep')
+ , descriptor = isDeep ? 'deep ' : '';
+
+ flagMsg = flagMsg ? flagMsg + ': ' : '';
+
+ var included = false;
+
+ switch (objType) {
+ case 'string':
+ included = obj.indexOf(val) !== -1;
+ break;
+
+ case 'weakset':
+ if (isDeep) {
+ throw new AssertionError(
+ flagMsg + 'unable to use .deep.include with WeakSet',
+ undefined,
+ ssfi
+ );
+ }
+
+ included = obj.has(val);
+ break;
+
+ case 'map':
+ var isEql = isDeep ? _.eql : SameValueZero;
+ obj.forEach(function (item) {
+ included = included || isEql(item, val);
+ });
+ break;
+
+ case 'set':
+ if (isDeep) {
+ obj.forEach(function (item) {
+ included = included || _.eql(item, val);
+ });
+ } else {
+ included = obj.has(val);
+ }
+ break;
+
+ case 'array':
+ if (isDeep) {
+ included = obj.some(function (item) {
+ return _.eql(item, val);
+ })
+ } else {
+ included = obj.indexOf(val) !== -1;
+ }
+ break;
+
+ default:
+ // This block is for asserting a subset of properties in an object.
+ // `_.expectTypes` isn't used here because `.include` should work with
+ // objects with a custom `@@toStringTag`.
+ if (val !== Object(val)) {
+ throw new AssertionError(
+ flagMsg + 'the given combination of arguments ('
+ + objType + ' and '
+ + _.type(val).toLowerCase() + ')'
+ + ' is invalid for this assertion. '
+ + 'You can use an array, a map, an object, a set, a string, '
+ + 'or a weakset instead of a '
+ + _.type(val).toLowerCase(),
+ undefined,
+ ssfi
+ );
+ }
+
+ var props = Object.keys(val)
+ , firstErr = null
+ , numErrs = 0;
+
+ props.forEach(function (prop) {
+ var propAssertion = new Assertion(obj);
+ _.transferFlags(this, propAssertion, true);
+ flag(propAssertion, 'lockSsfi', true);
+
+ if (!negate || props.length === 1) {
+ propAssertion.property(prop, val[prop]);
+ return;
+ }
+
+ try {
+ propAssertion.property(prop, val[prop]);
+ } catch (err) {
+ if (!_.checkError.compatibleConstructor(err, AssertionError)) {
+ throw err;
+ }
+ if (firstErr === null) firstErr = err;
+ numErrs++;
+ }
+ }, this);
+
+ // When validating .not.include with multiple properties, we only want
+ // to throw an assertion error if all of the properties are included,
+ // in which case we throw the first property assertion error that we
+ // encountered.
+ if (negate && props.length > 1 && numErrs === props.length) {
+ throw firstErr;
}
- }
- } else if (_.type(val) === 'object') {
- if (!flag(this, 'negate')) {
- for (var k in val) new Assertion(obj).property(k, val[k]);
return;
- }
- var subset = {};
- for (var k in val) subset[k] = obj[k];
- expected = _.eql(subset, val);
- } else {
- expected = (obj != undefined) && ~obj.indexOf(val);
}
+
+ // Assert inclusion in collection or substring in a string.
this.assert(
- expected
- , 'expected #{this} to include ' + _.inspect(val)
- , 'expected #{this} to not include ' + _.inspect(val));
+ included
+ , 'expected #{this} to ' + descriptor + 'include ' + _.inspect(val)
+ , 'expected #{this} to not ' + descriptor + 'include ' + _.inspect(val));
}
Assertion.addChainableMethod('include', include, includeChainingBehavior);
@@ -530,13 +967,33 @@ module.exports = function (chai, _) {
/**
* ### .ok
*
- * Asserts that the target is truthy.
+ * Asserts that the target is a truthy value (considered `true` in boolean context).
+ * However, it's often best to assert that the target is strictly (`===`) or
+ * deeply equal to its expected value.
*
- * expect('everything').to.be.ok;
- * expect(1).to.be.ok;
- * expect(false).to.not.be.ok;
- * expect(undefined).to.not.be.ok;
- * expect(null).to.not.be.ok;
+ * expect(1).to.equal(1); // Recommended
+ * expect(1).to.be.ok; // Not recommended
+ *
+ * expect(true).to.be.true; // Recommended
+ * expect(true).to.be.ok; // Not recommended
+ *
+ * Add `.not` earlier in the chain to negate `.ok`.
+ *
+ * expect(0).to.equal(0); // Recommended
+ * expect(0).to.not.be.ok; // Not recommended
+ *
+ * expect(false).to.be.false; // Recommended
+ * expect(false).to.not.be.ok; // Not recommended
+ *
+ * expect(null).to.be.null; // Recommended
+ * expect(null).to.not.be.ok; // Not recommended
+ *
+ * expect(undefined).to.be.undefined; // Recommended
+ * expect(undefined).to.not.be.ok; // Not recommended
+ *
+ * A custom error message can be given as the second argument to `expect`.
+ *
+ * expect(false, 'nooo why fail??').to.be.ok;
*
* @name ok
* @namespace BDD
@@ -553,10 +1010,23 @@ module.exports = function (chai, _) {
/**
* ### .true
*
- * Asserts that the target is `true`.
+ * Asserts that the target is strictly (`===`) equal to `true`.
*
* expect(true).to.be.true;
- * expect(1).to.not.be.true;
+ *
+ * Add `.not` earlier in the chain to negate `.true`. However, it's often best
+ * to assert that the target is equal to its expected value, rather than not
+ * equal to `true`.
+ *
+ * expect(false).to.be.false; // Recommended
+ * expect(false).to.not.be.true; // Not recommended
+ *
+ * expect(1).to.equal(1); // Recommended
+ * expect(1).to.not.be.true; // Not recommended
+ *
+ * A custom error message can be given as the second argument to `expect`.
+ *
+ * expect(false, 'nooo why fail??').to.be.true;
*
* @name true
* @namespace BDD
@@ -568,17 +1038,30 @@ module.exports = function (chai, _) {
true === flag(this, 'object')
, 'expected #{this} to be true'
, 'expected #{this} to be false'
- , this.negate ? false : true
+ , flag(this, 'negate') ? false : true
);
});
/**
* ### .false
*
- * Asserts that the target is `false`.
+ * Asserts that the target is strictly (`===`) equal to `false`.
*
* expect(false).to.be.false;
- * expect(0).to.not.be.false;
+ *
+ * Add `.not` earlier in the chain to negate `.false`. However, it's often
+ * best to assert that the target is equal to its expected value, rather than
+ * not equal to `false`.
+ *
+ * expect(true).to.be.true; // Recommended
+ * expect(true).to.not.be.false; // Not recommended
+ *
+ * expect(1).to.equal(1); // Recommended
+ * expect(1).to.not.be.false; // Not recommended
+ *
+ * A custom error message can be given as the second argument to `expect`.
+ *
+ * expect(true, 'nooo why fail??').to.be.false;
*
* @name false
* @namespace BDD
@@ -590,17 +1073,27 @@ module.exports = function (chai, _) {
false === flag(this, 'object')
, 'expected #{this} to be false'
, 'expected #{this} to be true'
- , this.negate ? true : false
+ , flag(this, 'negate') ? true : false
);
});
/**
* ### .null
*
- * Asserts that the target is `null`.
+ * Asserts that the target is strictly (`===`) equal to `null`.
*
* expect(null).to.be.null;
- * expect(undefined).to.not.be.null;
+ *
+ * Add `.not` earlier in the chain to negate `.null`. However, it's often best
+ * to assert that the target is equal to its expected value, rather than not
+ * equal to `null`.
+ *
+ * expect(1).to.equal(1); // Recommended
+ * expect(1).to.not.be.null; // Not recommended
+ *
+ * A custom error message can be given as the second argument to `expect`.
+ *
+ * expect(42, 'nooo why fail??').to.be.null;
*
* @name null
* @namespace BDD
@@ -618,10 +1111,20 @@ module.exports = function (chai, _) {
/**
* ### .undefined
*
- * Asserts that the target is `undefined`.
+ * Asserts that the target is strictly (`===`) equal to `undefined`.
*
* expect(undefined).to.be.undefined;
- * expect(null).to.not.be.undefined;
+ *
+ * Add `.not` earlier in the chain to negate `.undefined`. However, it's often
+ * best to assert that the target is equal to its expected value, rather than
+ * not equal to `undefined`.
+ *
+ * expect(1).to.equal(1); // Recommended
+ * expect(1).to.not.be.undefined; // Not recommended
+ *
+ * A custom error message can be given as the second argument to `expect`.
+ *
+ * expect(42, 'nooo why fail??').to.be.undefined;
*
* @name undefined
* @namespace BDD
@@ -638,10 +1141,21 @@ module.exports = function (chai, _) {
/**
* ### .NaN
- * Asserts that the target is `NaN`.
*
- * expect('foo').to.be.NaN;
- * expect(4).not.to.be.NaN;
+ * Asserts that the target is exactly `NaN`.
+ *
+ * expect(NaN).to.be.NaN;
+ *
+ * Add `.not` earlier in the chain to negate `.NaN`. However, it's often best
+ * to assert that the target is equal to its expected value, rather than not
+ * equal to `NaN`.
+ *
+ * expect('foo').to.equal('foo'); // Recommended
+ * expect('foo').to.not.be.NaN; // Not recommended
+ *
+ * A custom error message can be given as the second argument to `expect`.
+ *
+ * expect(42, 'nooo why fail??').to.be.NaN;
*
* @name NaN
* @namespace BDD
@@ -650,7 +1164,7 @@ module.exports = function (chai, _) {
Assertion.addProperty('NaN', function () {
this.assert(
- isNaN(flag(this, 'object'))
+ _.isNaN(flag(this, 'object'))
, 'expected #{this} to be NaN'
, 'expected #{this} not to be NaN'
);
@@ -659,58 +1173,137 @@ module.exports = function (chai, _) {
/**
* ### .exist
*
- * Asserts that the target is neither `null` nor `undefined`.
+ * Asserts that the target is not strictly (`===`) equal to either `null` or
+ * `undefined`. However, it's often best to assert that the target is equal to
+ * its expected value.
*
- * var foo = 'hi'
- * , bar = null
- * , baz;
+ * expect(1).to.equal(1); // Recommended
+ * expect(1).to.exist; // Not recommended
+ *
+ * expect(0).to.equal(0); // Recommended
+ * expect(0).to.exist; // Not recommended
+ *
+ * Add `.not` earlier in the chain to negate `.exist`.
+ *
+ * expect(null).to.be.null; // Recommended
+ * expect(null).to.not.exist; // Not recommended
*
- * expect(foo).to.exist;
- * expect(bar).to.not.exist;
- * expect(baz).to.not.exist;
+ * expect(undefined).to.be.undefined; // Recommended
+ * expect(undefined).to.not.exist; // Not recommended
+ *
+ * A custom error message can be given as the second argument to `expect`.
+ *
+ * expect(null, 'nooo why fail??').to.exist;
+ *
+ * The alias `.exists` can be used interchangeably with `.exist`.
*
* @name exist
+ * @alias exists
* @namespace BDD
* @api public
*/
- Assertion.addProperty('exist', function () {
+ function assertExist () {
+ var val = flag(this, 'object');
this.assert(
- null != flag(this, 'object')
+ val !== null && val !== undefined
, 'expected #{this} to exist'
, 'expected #{this} to not exist'
);
- });
+ }
+ Assertion.addProperty('exist', assertExist);
+ Assertion.addProperty('exists', assertExist);
/**
* ### .empty
*
- * Asserts that the target's length is `0`. For arrays and strings, it checks
- * the `length` property. For objects, it gets the count of
- * enumerable keys.
+ * When the target is a string or array, `.empty` asserts that the target's
+ * `length` property is strictly (`===`) equal to `0`.
*
* expect([]).to.be.empty;
* expect('').to.be.empty;
+ *
+ * When the target is a map or set, `.empty` asserts that the target's `size`
+ * property is strictly equal to `0`.
+ *
+ * expect(new Set()).to.be.empty;
+ * expect(new Map()).to.be.empty;
+ *
+ * When the target is a non-function object, `.empty` asserts that the target
+ * doesn't have any own enumerable properties. Properties with Symbol-based
+ * keys are excluded from the count.
+ *
* expect({}).to.be.empty;
*
+ * Because `.empty` does different things based on the target's type, it's
+ * important to check the target's type before using `.empty`. See the `.a`
+ * doc for info on testing a target's type.
+ *
+ * expect([]).to.be.an('array').that.is.empty;
+ *
+ * Add `.not` earlier in the chain to negate `.empty`. However, it's often
+ * best to assert that the target contains its expected number of values,
+ * rather than asserting that it's not empty.
+ *
+ * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended
+ * expect([1, 2, 3]).to.not.be.empty; // Not recommended
+ *
+ * expect(new Set([1, 2, 3])).to.have.property('size', 3); // Recommended
+ * expect(new Set([1, 2, 3])).to.not.be.empty; // Not recommended
+ *
+ * expect(Object.keys({a: 1})).to.have.lengthOf(1); // Recommended
+ * expect({a: 1}).to.not.be.empty; // Not recommended
+ *
+ * A custom error message can be given as the second argument to `expect`.
+ *
+ * expect([1, 2, 3], 'nooo why fail??').to.be.empty;
+ *
* @name empty
* @namespace BDD
* @api public
*/
Assertion.addProperty('empty', function () {
- var obj = flag(this, 'object')
- , expected = obj;
+ var val = flag(this, 'object')
+ , ssfi = flag(this, 'ssfi')
+ , flagMsg = flag(this, 'message')
+ , itemsCount;
- if (Array.isArray(obj) || 'string' === typeof object) {
- expected = obj.length;
- } else if (typeof obj === 'object') {
- expected = Object.keys(obj).length;
+ flagMsg = flagMsg ? flagMsg + ': ' : '';
+
+ switch (_.type(val).toLowerCase()) {
+ case 'array':
+ case 'string':
+ itemsCount = val.length;
+ break;
+ case 'map':
+ case 'set':
+ itemsCount = val.size;
+ break;
+ case 'weakmap':
+ case 'weakset':
+ throw new AssertionError(
+ flagMsg + '.empty was passed a weak collection',
+ undefined,
+ ssfi
+ );
+ case 'function':
+ var msg = flagMsg + '.empty was passed a function ' + _.getName(val);
+ throw new AssertionError(msg.trim(), undefined, ssfi);
+ default:
+ if (val !== Object(val)) {
+ throw new AssertionError(
+ flagMsg + '.empty was passed non-string primitive ' + _.inspect(val),
+ undefined,
+ ssfi
+ );
+ }
+ itemsCount = Object.keys(val).length;
}
this.assert(
- !expected
+ 0 === itemsCount
, 'expected #{this} to be empty'
, 'expected #{this} not to be empty'
);
@@ -719,12 +1312,27 @@ module.exports = function (chai, _) {
/**
* ### .arguments
*
- * Asserts that the target is an arguments object.
+ * Asserts that the target is an `arguments` object.
*
* function test () {
* expect(arguments).to.be.arguments;
* }
*
+ * test();
+ *
+ * Add `.not` earlier in the chain to negate `.arguments`. However, it's often
+ * best to assert which type the target is expected to be, rather than
+ * asserting that it’s not an `arguments` object.
+ *
+ * expect('foo').to.be.a('string'); // Recommended
+ * expect('foo').to.not.be.arguments; // Not recommended
+ *
+ * A custom error message can be given as the second argument to `expect`.
+ *
+ * expect({}, 'nooo why fail??').to.be.arguments;
+ *
+ * The alias `.Arguments` can be used interchangeably with `.arguments`.
+ *
* @name arguments
* @alias Arguments
* @namespace BDD
@@ -733,9 +1341,9 @@ module.exports = function (chai, _) {
function checkArguments () {
var obj = flag(this, 'object')
- , type = Object.prototype.toString.call(obj);
+ , type = _.type(obj);
this.assert(
- '[object Arguments]' === type
+ 'Arguments' === type
, 'expected #{this} to be arguments but got ' + type
, 'expected #{this} to not be arguments'
);
@@ -745,24 +1353,46 @@ module.exports = function (chai, _) {
Assertion.addProperty('Arguments', checkArguments);
/**
- * ### .equal(value)
+ * ### .equal(val[, msg])
+ *
+ * Asserts that the target is strictly (`===`) equal to the given `val`.
+ *
+ * expect(1).to.equal(1);
+ * expect('foo').to.equal('foo');
+ *
+ * Add `.deep` earlier in the chain to use deep equality instead. See the
+ * `deep-eql` project page for info on the deep equality algorithm:
+ * https://github.com/chaijs/deep-eql.
+ *
+ * // Target object deeply (but not strictly) equals `{a: 1}`
+ * expect({a: 1}).to.deep.equal({a: 1});
+ * expect({a: 1}).to.not.equal({a: 1});
+ *
+ * // Target array deeply (but not strictly) equals `[1, 2]`
+ * expect([1, 2]).to.deep.equal([1, 2]);
+ * expect([1, 2]).to.not.equal([1, 2]);
+ *
+ * Add `.not` earlier in the chain to negate `.equal`. However, it's often
+ * best to assert that the target is equal to its expected value, rather than
+ * not equal to one of countless unexpected values.
*
- * Asserts that the target is strictly equal (`===`) to `value`.
- * Alternately, if the `deep` flag is set, asserts that
- * the target is deeply equal to `value`.
+ * expect(1).to.equal(1); // Recommended
+ * expect(1).to.not.equal(2); // Not recommended
*
- * expect('hello').to.equal('hello');
- * expect(42).to.equal(42);
- * expect(1).to.not.equal(true);
- * expect({ foo: 'bar' }).to.not.equal({ foo: 'bar' });
- * expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' });
+ * `.equal` accepts an optional `msg` argument which is a custom error message
+ * to show when the assertion fails. The message can also be given as the
+ * second argument to `expect`.
+ *
+ * expect(1).to.equal(2, 'nooo why fail??');
+ * expect(1, 'nooo why fail??').to.equal(2);
+ *
+ * The aliases `.equals` and `eq` can be used interchangeably with `.equal`.
*
* @name equal
* @alias equals
* @alias eq
- * @alias deep.equal
- * @param {Mixed} value
- * @param {String} message _optional_
+ * @param {Mixed} val
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
@@ -771,7 +1401,10 @@ module.exports = function (chai, _) {
if (msg) flag(this, 'message', msg);
var obj = flag(this, 'object');
if (flag(this, 'deep')) {
- return this.eql(val);
+ var prevLockSsfi = flag(this, 'lockSsfi');
+ flag(this, 'lockSsfi', true);
+ this.eql(val);
+ flag(this, 'lockSsfi', prevLockSsfi);
} else {
this.assert(
val === obj
@@ -789,17 +1422,42 @@ module.exports = function (chai, _) {
Assertion.addMethod('eq', assertEqual);
/**
- * ### .eql(value)
+ * ### .eql(obj[, msg])
+ *
+ * Asserts that the target is deeply equal to the given `obj`. See the
+ * `deep-eql` project page for info on the deep equality algorithm:
+ * https://github.com/chaijs/deep-eql.
+ *
+ * // Target object is deeply (but not strictly) equal to {a: 1}
+ * expect({a: 1}).to.eql({a: 1}).but.not.equal({a: 1});
+ *
+ * // Target array is deeply (but not strictly) equal to [1, 2]
+ * expect([1, 2]).to.eql([1, 2]).but.not.equal([1, 2]);
+ *
+ * Add `.not` earlier in the chain to negate `.eql`. However, it's often best
+ * to assert that the target is deeply equal to its expected value, rather
+ * than not deeply equal to one of countless unexpected values.
*
- * Asserts that the target is deeply equal to `value`.
+ * expect({a: 1}).to.eql({a: 1}); // Recommended
+ * expect({a: 1}).to.not.eql({b: 2}); // Not recommended
*
- * expect({ foo: 'bar' }).to.eql({ foo: 'bar' });
- * expect([ 1, 2, 3 ]).to.eql([ 1, 2, 3 ]);
+ * `.eql` accepts an optional `msg` argument which is a custom error message
+ * to show when the assertion fails. The message can also be given as the
+ * second argument to `expect`.
+ *
+ * expect({a: 1}).to.eql({b: 2}, 'nooo why fail??');
+ * expect({a: 1}, 'nooo why fail??').to.eql({b: 2});
+ *
+ * The alias `.eqls` can be used interchangeably with `.eql`.
+ *
+ * The `.deep.equal` assertion is almost identical to `.eql` but with one
+ * difference: `.deep.equal` causes deep equality comparisons to also be used
+ * for any other assertions that follow in the chain.
*
* @name eql
* @alias eqls
- * @param {Mixed} value
- * @param {String} message _optional_
+ * @param {Mixed} obj
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
@@ -820,47 +1478,101 @@ module.exports = function (chai, _) {
Assertion.addMethod('eqls', assertEql);
/**
- * ### .above(value)
+ * ### .above(n[, msg])
+ *
+ * Asserts that the target is a number or a date greater than the given number or date `n` respectively.
+ * However, it's often best to assert that the target is equal to its expected
+ * value.
+ *
+ * expect(2).to.equal(2); // Recommended
+ * expect(2).to.be.above(1); // Not recommended
+ *
+ * Add `.lengthOf` earlier in the chain to assert that the target's `length`
+ * or `size` is greater than the given number `n`.
*
- * Asserts that the target is greater than `value`.
+ * expect('foo').to.have.lengthOf(3); // Recommended
+ * expect('foo').to.have.lengthOf.above(2); // Not recommended
*
- * expect(10).to.be.above(5);
+ * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended
+ * expect([1, 2, 3]).to.have.lengthOf.above(2); // Not recommended
*
- * Can also be used in conjunction with `length` to
- * assert a minimum length. The benefit being a
- * more informative error message than if the length
- * was supplied directly.
+ * Add `.not` earlier in the chain to negate `.above`.
*
- * expect('foo').to.have.length.above(2);
- * expect([ 1, 2, 3 ]).to.have.length.above(2);
+ * expect(2).to.equal(2); // Recommended
+ * expect(1).to.not.be.above(2); // Not recommended
+ *
+ * `.above` accepts an optional `msg` argument which is a custom error message
+ * to show when the assertion fails. The message can also be given as the
+ * second argument to `expect`.
+ *
+ * expect(1).to.be.above(2, 'nooo why fail??');
+ * expect(1, 'nooo why fail??').to.be.above(2);
+ *
+ * The aliases `.gt` and `.greaterThan` can be used interchangeably with
+ * `.above`.
*
* @name above
* @alias gt
* @alias greaterThan
- * @param {Number} value
- * @param {String} message _optional_
+ * @param {Number} n
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
function assertAbove (n, msg) {
if (msg) flag(this, 'message', msg);
- var obj = flag(this, 'object');
- if (flag(this, 'doLength')) {
- new Assertion(obj, msg).to.have.property('length');
- var len = obj.length;
- this.assert(
- len > n
- , 'expected #{this} to have a length above #{exp} but got #{act}'
- , 'expected #{this} to not have a length above #{exp}'
- , n
- , len
+ var obj = flag(this, 'object')
+ , doLength = flag(this, 'doLength')
+ , flagMsg = flag(this, 'message')
+ , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '')
+ , ssfi = flag(this, 'ssfi')
+ , objType = _.type(obj).toLowerCase()
+ , nType = _.type(n).toLowerCase()
+ , errorMessage
+ , shouldThrow = true;
+
+ if (doLength && objType !== 'map' && objType !== 'set') {
+ new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');
+ }
+
+ if (!doLength && (objType === 'date' && nType !== 'date')) {
+ errorMessage = msgPrefix + 'the argument to above must be a date';
+ } else if (nType !== 'number' && (doLength || objType === 'number')) {
+ errorMessage = msgPrefix + 'the argument to above must be a number';
+ } else if (!doLength && (objType !== 'date' && objType !== 'number')) {
+ var printObj = (objType === 'string') ? "'" + obj + "'" : obj;
+ errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';
+ } else {
+ shouldThrow = false;
+ }
+
+ if (shouldThrow) {
+ throw new AssertionError(errorMessage, undefined, ssfi);
+ }
+
+ if (doLength) {
+ var descriptor = 'length'
+ , itemsCount;
+ if (objType === 'map' || objType === 'set') {
+ descriptor = 'size';
+ itemsCount = obj.size;
+ } else {
+ itemsCount = obj.length;
+ }
+ this.assert(
+ itemsCount > n
+ , 'expected #{this} to have a ' + descriptor + ' above #{exp} but got #{act}'
+ , 'expected #{this} to not have a ' + descriptor + ' above #{exp}'
+ , n
+ , itemsCount
);
} else {
this.assert(
obj > n
- , 'expected #{this} to be above ' + n
- , 'expected #{this} to be at most ' + n
+ , 'expected #{this} to be above #{exp}'
+ , 'expected #{this} to be at most #{exp}'
+ , n
);
}
}
@@ -870,95 +1582,206 @@ module.exports = function (chai, _) {
Assertion.addMethod('greaterThan', assertAbove);
/**
- * ### .least(value)
+ * ### .least(n[, msg])
+ *
+ * Asserts that the target is a number or a date greater than or equal to the given
+ * number or date `n` respectively. However, it's often best to assert that the target is equal to
+ * its expected value.
+ *
+ * expect(2).to.equal(2); // Recommended
+ * expect(2).to.be.at.least(1); // Not recommended
+ * expect(2).to.be.at.least(2); // Not recommended
+ *
+ * Add `.lengthOf` earlier in the chain to assert that the target's `length`
+ * or `size` is greater than or equal to the given number `n`.
*
- * Asserts that the target is greater than or equal to `value`.
+ * expect('foo').to.have.lengthOf(3); // Recommended
+ * expect('foo').to.have.lengthOf.at.least(2); // Not recommended
*
- * expect(10).to.be.at.least(10);
+ * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended
+ * expect([1, 2, 3]).to.have.lengthOf.at.least(2); // Not recommended
*
- * Can also be used in conjunction with `length` to
- * assert a minimum length. The benefit being a
- * more informative error message than if the length
- * was supplied directly.
+ * Add `.not` earlier in the chain to negate `.least`.
*
- * expect('foo').to.have.length.of.at.least(2);
- * expect([ 1, 2, 3 ]).to.have.length.of.at.least(3);
+ * expect(1).to.equal(1); // Recommended
+ * expect(1).to.not.be.at.least(2); // Not recommended
+ *
+ * `.least` accepts an optional `msg` argument which is a custom error message
+ * to show when the assertion fails. The message can also be given as the
+ * second argument to `expect`.
+ *
+ * expect(1).to.be.at.least(2, 'nooo why fail??');
+ * expect(1, 'nooo why fail??').to.be.at.least(2);
+ *
+ * The aliases `.gte` and `.greaterThanOrEqual` can be used interchangeably with
+ * `.least`.
*
* @name least
* @alias gte
- * @param {Number} value
- * @param {String} message _optional_
+ * @alias greaterThanOrEqual
+ * @param {Number} n
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
function assertLeast (n, msg) {
if (msg) flag(this, 'message', msg);
- var obj = flag(this, 'object');
- if (flag(this, 'doLength')) {
- new Assertion(obj, msg).to.have.property('length');
- var len = obj.length;
+ var obj = flag(this, 'object')
+ , doLength = flag(this, 'doLength')
+ , flagMsg = flag(this, 'message')
+ , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '')
+ , ssfi = flag(this, 'ssfi')
+ , objType = _.type(obj).toLowerCase()
+ , nType = _.type(n).toLowerCase()
+ , errorMessage
+ , shouldThrow = true;
+
+ if (doLength && objType !== 'map' && objType !== 'set') {
+ new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');
+ }
+
+ if (!doLength && (objType === 'date' && nType !== 'date')) {
+ errorMessage = msgPrefix + 'the argument to least must be a date';
+ } else if (nType !== 'number' && (doLength || objType === 'number')) {
+ errorMessage = msgPrefix + 'the argument to least must be a number';
+ } else if (!doLength && (objType !== 'date' && objType !== 'number')) {
+ var printObj = (objType === 'string') ? "'" + obj + "'" : obj;
+ errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';
+ } else {
+ shouldThrow = false;
+ }
+
+ if (shouldThrow) {
+ throw new AssertionError(errorMessage, undefined, ssfi);
+ }
+
+ if (doLength) {
+ var descriptor = 'length'
+ , itemsCount;
+ if (objType === 'map' || objType === 'set') {
+ descriptor = 'size';
+ itemsCount = obj.size;
+ } else {
+ itemsCount = obj.length;
+ }
this.assert(
- len >= n
- , 'expected #{this} to have a length at least #{exp} but got #{act}'
- , 'expected #{this} to have a length below #{exp}'
+ itemsCount >= n
+ , 'expected #{this} to have a ' + descriptor + ' at least #{exp} but got #{act}'
+ , 'expected #{this} to have a ' + descriptor + ' below #{exp}'
, n
- , len
+ , itemsCount
);
} else {
this.assert(
obj >= n
- , 'expected #{this} to be at least ' + n
- , 'expected #{this} to be below ' + n
+ , 'expected #{this} to be at least #{exp}'
+ , 'expected #{this} to be below #{exp}'
+ , n
);
}
}
Assertion.addMethod('least', assertLeast);
Assertion.addMethod('gte', assertLeast);
+ Assertion.addMethod('greaterThanOrEqual', assertLeast);
/**
- * ### .below(value)
+ * ### .below(n[, msg])
+ *
+ * Asserts that the target is a number or a date less than the given number or date `n` respectively.
+ * However, it's often best to assert that the target is equal to its expected
+ * value.
+ *
+ * expect(1).to.equal(1); // Recommended
+ * expect(1).to.be.below(2); // Not recommended
+ *
+ * Add `.lengthOf` earlier in the chain to assert that the target's `length`
+ * or `size` is less than the given number `n`.
*
- * Asserts that the target is less than `value`.
+ * expect('foo').to.have.lengthOf(3); // Recommended
+ * expect('foo').to.have.lengthOf.below(4); // Not recommended
*
- * expect(5).to.be.below(10);
+ * expect([1, 2, 3]).to.have.length(3); // Recommended
+ * expect([1, 2, 3]).to.have.lengthOf.below(4); // Not recommended
*
- * Can also be used in conjunction with `length` to
- * assert a maximum length. The benefit being a
- * more informative error message than if the length
- * was supplied directly.
+ * Add `.not` earlier in the chain to negate `.below`.
*
- * expect('foo').to.have.length.below(4);
- * expect([ 1, 2, 3 ]).to.have.length.below(4);
+ * expect(2).to.equal(2); // Recommended
+ * expect(2).to.not.be.below(1); // Not recommended
+ *
+ * `.below` accepts an optional `msg` argument which is a custom error message
+ * to show when the assertion fails. The message can also be given as the
+ * second argument to `expect`.
+ *
+ * expect(2).to.be.below(1, 'nooo why fail??');
+ * expect(2, 'nooo why fail??').to.be.below(1);
+ *
+ * The aliases `.lt` and `.lessThan` can be used interchangeably with
+ * `.below`.
*
* @name below
* @alias lt
* @alias lessThan
- * @param {Number} value
- * @param {String} message _optional_
+ * @param {Number} n
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
function assertBelow (n, msg) {
if (msg) flag(this, 'message', msg);
- var obj = flag(this, 'object');
- if (flag(this, 'doLength')) {
- new Assertion(obj, msg).to.have.property('length');
- var len = obj.length;
+ var obj = flag(this, 'object')
+ , doLength = flag(this, 'doLength')
+ , flagMsg = flag(this, 'message')
+ , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '')
+ , ssfi = flag(this, 'ssfi')
+ , objType = _.type(obj).toLowerCase()
+ , nType = _.type(n).toLowerCase()
+ , errorMessage
+ , shouldThrow = true;
+
+ if (doLength && objType !== 'map' && objType !== 'set') {
+ new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');
+ }
+
+ if (!doLength && (objType === 'date' && nType !== 'date')) {
+ errorMessage = msgPrefix + 'the argument to below must be a date';
+ } else if (nType !== 'number' && (doLength || objType === 'number')) {
+ errorMessage = msgPrefix + 'the argument to below must be a number';
+ } else if (!doLength && (objType !== 'date' && objType !== 'number')) {
+ var printObj = (objType === 'string') ? "'" + obj + "'" : obj;
+ errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';
+ } else {
+ shouldThrow = false;
+ }
+
+ if (shouldThrow) {
+ throw new AssertionError(errorMessage, undefined, ssfi);
+ }
+
+ if (doLength) {
+ var descriptor = 'length'
+ , itemsCount;
+ if (objType === 'map' || objType === 'set') {
+ descriptor = 'size';
+ itemsCount = obj.size;
+ } else {
+ itemsCount = obj.length;
+ }
this.assert(
- len < n
- , 'expected #{this} to have a length below #{exp} but got #{act}'
- , 'expected #{this} to not have a length below #{exp}'
+ itemsCount < n
+ , 'expected #{this} to have a ' + descriptor + ' below #{exp} but got #{act}'
+ , 'expected #{this} to not have a ' + descriptor + ' below #{exp}'
, n
- , len
+ , itemsCount
);
} else {
this.assert(
obj < n
- , 'expected #{this} to be below ' + n
- , 'expected #{this} to be at least ' + n
+ , 'expected #{this} to be below #{exp}'
+ , 'expected #{this} to be at least #{exp}'
+ , n
);
}
}
@@ -968,72 +1791,149 @@ module.exports = function (chai, _) {
Assertion.addMethod('lessThan', assertBelow);
/**
- * ### .most(value)
+ * ### .most(n[, msg])
+ *
+ * Asserts that the target is a number or a date less than or equal to the given number
+ * or date `n` respectively. However, it's often best to assert that the target is equal to its
+ * expected value.
+ *
+ * expect(1).to.equal(1); // Recommended
+ * expect(1).to.be.at.most(2); // Not recommended
+ * expect(1).to.be.at.most(1); // Not recommended
+ *
+ * Add `.lengthOf` earlier in the chain to assert that the target's `length`
+ * or `size` is less than or equal to the given number `n`.
*
- * Asserts that the target is less than or equal to `value`.
+ * expect('foo').to.have.lengthOf(3); // Recommended
+ * expect('foo').to.have.lengthOf.at.most(4); // Not recommended
*
- * expect(5).to.be.at.most(5);
+ * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended
+ * expect([1, 2, 3]).to.have.lengthOf.at.most(4); // Not recommended
*
- * Can also be used in conjunction with `length` to
- * assert a maximum length. The benefit being a
- * more informative error message than if the length
- * was supplied directly.
+ * Add `.not` earlier in the chain to negate `.most`.
*
- * expect('foo').to.have.length.of.at.most(4);
- * expect([ 1, 2, 3 ]).to.have.length.of.at.most(3);
+ * expect(2).to.equal(2); // Recommended
+ * expect(2).to.not.be.at.most(1); // Not recommended
+ *
+ * `.most` accepts an optional `msg` argument which is a custom error message
+ * to show when the assertion fails. The message can also be given as the
+ * second argument to `expect`.
+ *
+ * expect(2).to.be.at.most(1, 'nooo why fail??');
+ * expect(2, 'nooo why fail??').to.be.at.most(1);
+ *
+ * The aliases `.lte` and `.lessThanOrEqual` can be used interchangeably with
+ * `.most`.
*
* @name most
* @alias lte
- * @param {Number} value
- * @param {String} message _optional_
+ * @alias lessThanOrEqual
+ * @param {Number} n
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
function assertMost (n, msg) {
if (msg) flag(this, 'message', msg);
- var obj = flag(this, 'object');
- if (flag(this, 'doLength')) {
- new Assertion(obj, msg).to.have.property('length');
- var len = obj.length;
+ var obj = flag(this, 'object')
+ , doLength = flag(this, 'doLength')
+ , flagMsg = flag(this, 'message')
+ , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '')
+ , ssfi = flag(this, 'ssfi')
+ , objType = _.type(obj).toLowerCase()
+ , nType = _.type(n).toLowerCase()
+ , errorMessage
+ , shouldThrow = true;
+
+ if (doLength && objType !== 'map' && objType !== 'set') {
+ new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');
+ }
+
+ if (!doLength && (objType === 'date' && nType !== 'date')) {
+ errorMessage = msgPrefix + 'the argument to most must be a date';
+ } else if (nType !== 'number' && (doLength || objType === 'number')) {
+ errorMessage = msgPrefix + 'the argument to most must be a number';
+ } else if (!doLength && (objType !== 'date' && objType !== 'number')) {
+ var printObj = (objType === 'string') ? "'" + obj + "'" : obj;
+ errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';
+ } else {
+ shouldThrow = false;
+ }
+
+ if (shouldThrow) {
+ throw new AssertionError(errorMessage, undefined, ssfi);
+ }
+
+ if (doLength) {
+ var descriptor = 'length'
+ , itemsCount;
+ if (objType === 'map' || objType === 'set') {
+ descriptor = 'size';
+ itemsCount = obj.size;
+ } else {
+ itemsCount = obj.length;
+ }
this.assert(
- len <= n
- , 'expected #{this} to have a length at most #{exp} but got #{act}'
- , 'expected #{this} to have a length above #{exp}'
+ itemsCount <= n
+ , 'expected #{this} to have a ' + descriptor + ' at most #{exp} but got #{act}'
+ , 'expected #{this} to have a ' + descriptor + ' above #{exp}'
, n
- , len
+ , itemsCount
);
} else {
this.assert(
obj <= n
- , 'expected #{this} to be at most ' + n
- , 'expected #{this} to be above ' + n
+ , 'expected #{this} to be at most #{exp}'
+ , 'expected #{this} to be above #{exp}'
+ , n
);
}
}
Assertion.addMethod('most', assertMost);
Assertion.addMethod('lte', assertMost);
+ Assertion.addMethod('lessThanOrEqual', assertMost);
/**
- * ### .within(start, finish)
+ * ### .within(start, finish[, msg])
+ *
+ * Asserts that the target is a number or a date greater than or equal to the given
+ * number or date `start`, and less than or equal to the given number or date `finish` respectively.
+ * However, it's often best to assert that the target is equal to its expected
+ * value.
+ *
+ * expect(2).to.equal(2); // Recommended
+ * expect(2).to.be.within(1, 3); // Not recommended
+ * expect(2).to.be.within(2, 3); // Not recommended
+ * expect(2).to.be.within(1, 2); // Not recommended
+ *
+ * Add `.lengthOf` earlier in the chain to assert that the target's `length`
+ * or `size` is greater than or equal to the given number `start`, and less
+ * than or equal to the given number `finish`.
*
- * Asserts that the target is within a range.
+ * expect('foo').to.have.lengthOf(3); // Recommended
+ * expect('foo').to.have.lengthOf.within(2, 4); // Not recommended
*
- * expect(7).to.be.within(5,10);
+ * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended
+ * expect([1, 2, 3]).to.have.lengthOf.within(2, 4); // Not recommended
*
- * Can also be used in conjunction with `length` to
- * assert a length range. The benefit being a
- * more informative error message than if the length
- * was supplied directly.
+ * Add `.not` earlier in the chain to negate `.within`.
*
- * expect('foo').to.have.length.within(2,4);
- * expect([ 1, 2, 3 ]).to.have.length.within(2,4);
+ * expect(1).to.equal(1); // Recommended
+ * expect(1).to.not.be.within(2, 4); // Not recommended
+ *
+ * `.within` accepts an optional `msg` argument which is a custom error
+ * message to show when the assertion fails. The message can also be given as
+ * the second argument to `expect`.
+ *
+ * expect(4).to.be.within(1, 3, 'nooo why fail??');
+ * expect(4, 'nooo why fail??').to.be.within(1, 3);
*
* @name within
- * @param {Number} start lowerbound inclusive
- * @param {Number} finish upperbound inclusive
- * @param {String} message _optional_
+ * @param {Number} start lower bound inclusive
+ * @param {Number} finish upper bound inclusive
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
@@ -1041,14 +1941,51 @@ module.exports = function (chai, _) {
Assertion.addMethod('within', function (start, finish, msg) {
if (msg) flag(this, 'message', msg);
var obj = flag(this, 'object')
- , range = start + '..' + finish;
- if (flag(this, 'doLength')) {
- new Assertion(obj, msg).to.have.property('length');
- var len = obj.length;
+ , doLength = flag(this, 'doLength')
+ , flagMsg = flag(this, 'message')
+ , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '')
+ , ssfi = flag(this, 'ssfi')
+ , objType = _.type(obj).toLowerCase()
+ , startType = _.type(start).toLowerCase()
+ , finishType = _.type(finish).toLowerCase()
+ , errorMessage
+ , shouldThrow = true
+ , range = (startType === 'date' && finishType === 'date')
+ ? start.toUTCString() + '..' + finish.toUTCString()
+ : start + '..' + finish;
+
+ if (doLength && objType !== 'map' && objType !== 'set') {
+ new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');
+ }
+
+ if (!doLength && (objType === 'date' && (startType !== 'date' || finishType !== 'date'))) {
+ errorMessage = msgPrefix + 'the arguments to within must be dates';
+ } else if ((startType !== 'number' || finishType !== 'number') && (doLength || objType === 'number')) {
+ errorMessage = msgPrefix + 'the arguments to within must be numbers';
+ } else if (!doLength && (objType !== 'date' && objType !== 'number')) {
+ var printObj = (objType === 'string') ? "'" + obj + "'" : obj;
+ errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';
+ } else {
+ shouldThrow = false;
+ }
+
+ if (shouldThrow) {
+ throw new AssertionError(errorMessage, undefined, ssfi);
+ }
+
+ if (doLength) {
+ var descriptor = 'length'
+ , itemsCount;
+ if (objType === 'map' || objType === 'set') {
+ descriptor = 'size';
+ itemsCount = obj.size;
+ } else {
+ itemsCount = obj.length;
+ }
this.assert(
- len >= start && len <= finish
- , 'expected #{this} to have a length within ' + range
- , 'expected #{this} to not have a length within ' + range
+ itemsCount >= start && itemsCount <= finish
+ , 'expected #{this} to have a ' + descriptor + ' within ' + range
+ , 'expected #{this} to not have a ' + descriptor + ' within ' + range
);
} else {
this.assert(
@@ -1060,19 +1997,39 @@ module.exports = function (chai, _) {
});
/**
- * ### .instanceof(constructor)
+ * ### .instanceof(constructor[, msg])
*
- * Asserts that the target is an instance of `constructor`.
+ * Asserts that the target is an instance of the given `constructor`.
*
- * var Tea = function (name) { this.name = name; }
- * , Chai = new Tea('chai');
+ * function Cat () { }
+ *
+ * expect(new Cat()).to.be.an.instanceof(Cat);
+ * expect([1, 2]).to.be.an.instanceof(Array);
+ *
+ * Add `.not` earlier in the chain to negate `.instanceof`.
+ *
+ * expect({a: 1}).to.not.be.an.instanceof(Array);
+ *
+ * `.instanceof` accepts an optional `msg` argument which is a custom error
+ * message to show when the assertion fails. The message can also be given as
+ * the second argument to `expect`.
+ *
+ * expect(1).to.be.an.instanceof(Array, 'nooo why fail??');
+ * expect(1, 'nooo why fail??').to.be.an.instanceof(Array);
+ *
+ * Due to limitations in ES5, `.instanceof` may not always work as expected
+ * when using a transpiler such as Babel or TypeScript. In particular, it may
+ * produce unexpected results when subclassing built-in object such as
+ * `Array`, `Error`, and `Map`. See your transpiler's docs for details:
+ *
+ * - ([Babel](https://babeljs.io/docs/usage/caveats/#classes))
+ * - ([TypeScript](https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work))
*
- * expect(Chai).to.be.an.instanceof(Tea);
- * expect([ 1, 2, 3 ]).to.be.instanceof(Array);
+ * The alias `.instanceOf` can be used interchangeably with `.instanceof`.
*
* @name instanceof
* @param {Constructor} constructor
- * @param {String} message _optional_
+ * @param {String} msg _optional_
* @alias instanceOf
* @namespace BDD
* @api public
@@ -1080,9 +2037,33 @@ module.exports = function (chai, _) {
function assertInstanceOf (constructor, msg) {
if (msg) flag(this, 'message', msg);
+
+ var target = flag(this, 'object')
+ var ssfi = flag(this, 'ssfi');
+ var flagMsg = flag(this, 'message');
+
+ try {
+ var isInstanceOf = target instanceof constructor;
+ } catch (err) {
+ if (err instanceof TypeError) {
+ flagMsg = flagMsg ? flagMsg + ': ' : '';
+ throw new AssertionError(
+ flagMsg + 'The instanceof assertion needs a constructor but '
+ + _.type(constructor) + ' was given.',
+ undefined,
+ ssfi
+ );
+ }
+ throw err;
+ }
+
var name = _.getName(constructor);
+ if (name === null) {
+ name = 'an unnamed constructor';
+ }
+
this.assert(
- flag(this, 'object') instanceof constructor
+ isInstanceOf
, 'expected #{this} to be an instance of ' + name
, 'expected #{this} to not be an instance of ' + name
);
@@ -1092,162 +2073,329 @@ module.exports = function (chai, _) {
Assertion.addMethod('instanceOf', assertInstanceOf);
/**
- * ### .property(name, [value])
+ * ### .property(name[, val[, msg]])
*
- * Asserts that the target has a property `name`, optionally asserting that
- * the value of that property is strictly equal to `value`.
- * If the `deep` flag is set, you can use dot- and bracket-notation for deep
- * references into objects and arrays.
+ * Asserts that the target has a property with the given key `name`.
*
- * // simple referencing
- * var obj = { foo: 'bar' };
- * expect(obj).to.have.property('foo');
- * expect(obj).to.have.property('foo', 'bar');
+ * expect({a: 1}).to.have.property('a');
*
- * // deep referencing
- * var deepObj = {
- * green: { tea: 'matcha' }
- * , teas: [ 'chai', 'matcha', { tea: 'konacha' } ]
- * };
+ * When `val` is provided, `.property` also asserts that the property's value
+ * is equal to the given `val`.
+ *
+ * expect({a: 1}).to.have.property('a', 1);
+ *
+ * By default, strict (`===`) equality is used. Add `.deep` earlier in the
+ * chain to use deep equality instead. See the `deep-eql` project page for
+ * info on the deep equality algorithm: https://github.com/chaijs/deep-eql.
+ *
+ * // Target object deeply (but not strictly) has property `x: {a: 1}`
+ * expect({x: {a: 1}}).to.have.deep.property('x', {a: 1});
+ * expect({x: {a: 1}}).to.not.have.property('x', {a: 1});
+ *
+ * The target's enumerable and non-enumerable properties are always included
+ * in the search. By default, both own and inherited properties are included.
+ * Add `.own` earlier in the chain to exclude inherited properties from the
+ * search.
+ *
+ * Object.prototype.b = 2;
+ *
+ * expect({a: 1}).to.have.own.property('a');
+ * expect({a: 1}).to.have.own.property('a', 1);
+ * expect({a: 1}).to.have.property('b');
+ * expect({a: 1}).to.not.have.own.property('b');
+ *
+ * `.deep` and `.own` can be combined.
+ *
+ * expect({x: {a: 1}}).to.have.deep.own.property('x', {a: 1});
+ *
+ * Add `.nested` earlier in the chain to enable dot- and bracket-notation when
+ * referencing nested properties.
+ *
+ * expect({a: {b: ['x', 'y']}}).to.have.nested.property('a.b[1]');
+ * expect({a: {b: ['x', 'y']}}).to.have.nested.property('a.b[1]', 'y');
+ *
+ * If `.` or `[]` are part of an actual property name, they can be escaped by
+ * adding two backslashes before them.
+ *
+ * expect({'.a': {'[b]': 'x'}}).to.have.nested.property('\\.a.\\[b\\]');
+ *
+ * `.deep` and `.nested` can be combined.
+ *
+ * expect({a: {b: [{c: 3}]}})
+ * .to.have.deep.nested.property('a.b[0]', {c: 3});
+ *
+ * `.own` and `.nested` cannot be combined.
+ *
+ * Add `.not` earlier in the chain to negate `.property`.
+ *
+ * expect({a: 1}).to.not.have.property('b');
+ *
+ * However, it's dangerous to negate `.property` when providing `val`. The
+ * problem is that it creates uncertain expectations by asserting that the
+ * target either doesn't have a property with the given key `name`, or that it
+ * does have a property with the given key `name` but its value isn't equal to
+ * the given `val`. It's often best to identify the exact output that's
+ * expected, and then write an assertion that only accepts that exact output.
+ *
+ * When the target isn't expected to have a property with the given key
+ * `name`, it's often best to assert exactly that.
+ *
+ * expect({b: 2}).to.not.have.property('a'); // Recommended
+ * expect({b: 2}).to.not.have.property('a', 1); // Not recommended
*
- * expect(deepObj).to.have.deep.property('green.tea', 'matcha');
- * expect(deepObj).to.have.deep.property('teas[1]', 'matcha');
- * expect(deepObj).to.have.deep.property('teas[2].tea', 'konacha');
- *
- * You can also use an array as the starting point of a `deep.property`
- * assertion, or traverse nested arrays.
- *
- * var arr = [
- * [ 'chai', 'matcha', 'konacha' ]
- * , [ { tea: 'chai' }
- * , { tea: 'matcha' }
- * , { tea: 'konacha' } ]
- * ];
- *
- * expect(arr).to.have.deep.property('[0][1]', 'matcha');
- * expect(arr).to.have.deep.property('[1][2].tea', 'konacha');
- *
- * Furthermore, `property` changes the subject of the assertion
- * to be the value of that property from the original object. This
- * permits for further chainable assertions on that property.
- *
- * expect(obj).to.have.property('foo')
- * .that.is.a('string');
- * expect(deepObj).to.have.property('green')
- * .that.is.an('object')
- * .that.deep.equals({ tea: 'matcha' });
- * expect(deepObj).to.have.property('teas')
- * .that.is.an('array')
- * .with.deep.property('[2]')
- * .that.deep.equals({ tea: 'konacha' });
- *
- * Note that dots and bracket in `name` must be backslash-escaped when
- * the `deep` flag is set, while they must NOT be escaped when the `deep`
- * flag is not set.
- *
- * // simple referencing
- * var css = { '.link[target]': 42 };
- * expect(css).to.have.property('.link[target]', 42);
- *
- * // deep referencing
- * var deepCss = { '.link': { '[target]': 42 }};
- * expect(deepCss).to.have.deep.property('\\.link.\\[target\\]', 42);
+ * When the target is expected to have a property with the given key `name`,
+ * it's often best to assert that the property has its expected value, rather
+ * than asserting that it doesn't have one of many unexpected values.
+ *
+ * expect({a: 3}).to.have.property('a', 3); // Recommended
+ * expect({a: 3}).to.not.have.property('a', 1); // Not recommended
+ *
+ * `.property` changes the target of any assertions that follow in the chain
+ * to be the value of the property from the original target object.
+ *
+ * expect({a: 1}).to.have.property('a').that.is.a('number');
+ *
+ * `.property` accepts an optional `msg` argument which is a custom error
+ * message to show when the assertion fails. The message can also be given as
+ * the second argument to `expect`. When not providing `val`, only use the
+ * second form.
+ *
+ * // Recommended
+ * expect({a: 1}).to.have.property('a', 2, 'nooo why fail??');
+ * expect({a: 1}, 'nooo why fail??').to.have.property('a', 2);
+ * expect({a: 1}, 'nooo why fail??').to.have.property('b');
+ *
+ * // Not recommended
+ * expect({a: 1}).to.have.property('b', undefined, 'nooo why fail??');
+ *
+ * The above assertion isn't the same thing as not providing `val`. Instead,
+ * it's asserting that the target object has a `b` property that's equal to
+ * `undefined`.
+ *
+ * The assertions `.ownProperty` and `.haveOwnProperty` can be used
+ * interchangeably with `.own.property`.
*
* @name property
- * @alias deep.property
* @param {String} name
- * @param {Mixed} value (optional)
- * @param {String} message _optional_
+ * @param {Mixed} val (optional)
+ * @param {String} msg _optional_
* @returns value of property for chaining
* @namespace BDD
* @api public
*/
- Assertion.addMethod('property', function (name, val, msg) {
+ function assertProperty (name, val, msg) {
if (msg) flag(this, 'message', msg);
- var isDeep = !!flag(this, 'deep')
- , descriptor = isDeep ? 'deep property ' : 'property '
- , negate = flag(this, 'negate')
+ var isNested = flag(this, 'nested')
+ , isOwn = flag(this, 'own')
+ , flagMsg = flag(this, 'message')
, obj = flag(this, 'object')
- , pathInfo = isDeep ? _.getPathInfo(name, obj) : null
- , hasProperty = isDeep
- ? pathInfo.exists
- : _.hasProperty(name, obj)
- , value = isDeep
- ? pathInfo.value
- : obj[name];
-
- if (negate && arguments.length > 1) {
- if (undefined === value) {
- msg = (msg != null) ? msg + ': ' : '';
- throw new Error(msg + _.inspect(obj) + ' has no ' + descriptor + _.inspect(name));
+ , ssfi = flag(this, 'ssfi')
+ , nameType = typeof name;
+
+ flagMsg = flagMsg ? flagMsg + ': ' : '';
+
+ if (isNested) {
+ if (nameType !== 'string') {
+ throw new AssertionError(
+ flagMsg + 'the argument to property must be a string when using nested syntax',
+ undefined,
+ ssfi
+ );
}
} else {
+ if (nameType !== 'string' && nameType !== 'number' && nameType !== 'symbol') {
+ throw new AssertionError(
+ flagMsg + 'the argument to property must be a string, number, or symbol',
+ undefined,
+ ssfi
+ );
+ }
+ }
+
+ if (isNested && isOwn) {
+ throw new AssertionError(
+ flagMsg + 'The "nested" and "own" flags cannot be combined.',
+ undefined,
+ ssfi
+ );
+ }
+
+ if (obj === null || obj === undefined) {
+ throw new AssertionError(
+ flagMsg + 'Target cannot be null or undefined.',
+ undefined,
+ ssfi
+ );
+ }
+
+ var isDeep = flag(this, 'deep')
+ , negate = flag(this, 'negate')
+ , pathInfo = isNested ? _.getPathInfo(obj, name) : null
+ , value = isNested ? pathInfo.value : obj[name];
+
+ var descriptor = '';
+ if (isDeep) descriptor += 'deep ';
+ if (isOwn) descriptor += 'own ';
+ if (isNested) descriptor += 'nested ';
+ descriptor += 'property ';
+
+ var hasProperty;
+ if (isOwn) hasProperty = Object.prototype.hasOwnProperty.call(obj, name);
+ else if (isNested) hasProperty = pathInfo.exists;
+ else hasProperty = _.hasProperty(obj, name);
+
+ // When performing a negated assertion for both name and val, merely having
+ // a property with the given name isn't enough to cause the assertion to
+ // fail. It must both have a property with the given name, and the value of
+ // that property must equal the given val. Therefore, skip this assertion in
+ // favor of the next.
+ if (!negate || arguments.length === 1) {
this.assert(
hasProperty
- , 'expected #{this} to have a ' + descriptor + _.inspect(name)
+ , 'expected #{this} to have ' + descriptor + _.inspect(name)
, 'expected #{this} to not have ' + descriptor + _.inspect(name));
}
if (arguments.length > 1) {
this.assert(
- val === value
- , 'expected #{this} to have a ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}'
- , 'expected #{this} to not have a ' + descriptor + _.inspect(name) + ' of #{act}'
+ hasProperty && (isDeep ? _.eql(val, value) : val === value)
+ , 'expected #{this} to have ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}'
+ , 'expected #{this} to not have ' + descriptor + _.inspect(name) + ' of #{act}'
, val
, value
);
}
flag(this, 'object', value);
- });
-
+ }
- /**
- * ### .ownProperty(name)
- *
- * Asserts that the target has an own property `name`.
- *
- * expect('test').to.have.ownProperty('length');
- *
- * @name ownProperty
- * @alias haveOwnProperty
- * @param {String} name
- * @param {String} message _optional_
- * @namespace BDD
- * @api public
- */
+ Assertion.addMethod('property', assertProperty);
- function assertOwnProperty (name, msg) {
- if (msg) flag(this, 'message', msg);
- var obj = flag(this, 'object');
- this.assert(
- obj.hasOwnProperty(name)
- , 'expected #{this} to have own property ' + _.inspect(name)
- , 'expected #{this} to not have own property ' + _.inspect(name)
- );
+ function assertOwnProperty (name, value, msg) {
+ flag(this, 'own', true);
+ assertProperty.apply(this, arguments);
}
Assertion.addMethod('ownProperty', assertOwnProperty);
Assertion.addMethod('haveOwnProperty', assertOwnProperty);
/**
- * ### .ownPropertyDescriptor(name[, descriptor[, message]])
- *
- * Asserts that the target has an own property descriptor `name`, that optionally matches `descriptor`.
- *
- * expect('test').to.have.ownPropertyDescriptor('length');
- * expect('test').to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 4 });
- * expect('test').not.to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 3 });
- * expect('test').ownPropertyDescriptor('length').to.have.property('enumerable', false);
- * expect('test').ownPropertyDescriptor('length').to.have.keys('value');
+ * ### .ownPropertyDescriptor(name[, descriptor[, msg]])
+ *
+ * Asserts that the target has its own property descriptor with the given key
+ * `name`. Enumerable and non-enumerable properties are included in the
+ * search.
+ *
+ * expect({a: 1}).to.have.ownPropertyDescriptor('a');
+ *
+ * When `descriptor` is provided, `.ownPropertyDescriptor` also asserts that
+ * the property's descriptor is deeply equal to the given `descriptor`. See
+ * the `deep-eql` project page for info on the deep equality algorithm:
+ * https://github.com/chaijs/deep-eql.
+ *
+ * expect({a: 1}).to.have.ownPropertyDescriptor('a', {
+ * configurable: true,
+ * enumerable: true,
+ * writable: true,
+ * value: 1,
+ * });
+ *
+ * Add `.not` earlier in the chain to negate `.ownPropertyDescriptor`.
+ *
+ * expect({a: 1}).to.not.have.ownPropertyDescriptor('b');
+ *
+ * However, it's dangerous to negate `.ownPropertyDescriptor` when providing
+ * a `descriptor`. The problem is that it creates uncertain expectations by
+ * asserting that the target either doesn't have a property descriptor with
+ * the given key `name`, or that it does have a property descriptor with the
+ * given key `name` but it’s not deeply equal to the given `descriptor`. It's
+ * often best to identify the exact output that's expected, and then write an
+ * assertion that only accepts that exact output.
+ *
+ * When the target isn't expected to have a property descriptor with the given
+ * key `name`, it's often best to assert exactly that.
+ *
+ * // Recommended
+ * expect({b: 2}).to.not.have.ownPropertyDescriptor('a');
+ *
+ * // Not recommended
+ * expect({b: 2}).to.not.have.ownPropertyDescriptor('a', {
+ * configurable: true,
+ * enumerable: true,
+ * writable: true,
+ * value: 1,
+ * });
+ *
+ * When the target is expected to have a property descriptor with the given
+ * key `name`, it's often best to assert that the property has its expected
+ * descriptor, rather than asserting that it doesn't have one of many
+ * unexpected descriptors.
+ *
+ * // Recommended
+ * expect({a: 3}).to.have.ownPropertyDescriptor('a', {
+ * configurable: true,
+ * enumerable: true,
+ * writable: true,
+ * value: 3,
+ * });
+ *
+ * // Not recommended
+ * expect({a: 3}).to.not.have.ownPropertyDescriptor('a', {
+ * configurable: true,
+ * enumerable: true,
+ * writable: true,
+ * value: 1,
+ * });
+ *
+ * `.ownPropertyDescriptor` changes the target of any assertions that follow
+ * in the chain to be the value of the property descriptor from the original
+ * target object.
+ *
+ * expect({a: 1}).to.have.ownPropertyDescriptor('a')
+ * .that.has.property('enumerable', true);
+ *
+ * `.ownPropertyDescriptor` accepts an optional `msg` argument which is a
+ * custom error message to show when the assertion fails. The message can also
+ * be given as the second argument to `expect`. When not providing
+ * `descriptor`, only use the second form.
+ *
+ * // Recommended
+ * expect({a: 1}).to.have.ownPropertyDescriptor('a', {
+ * configurable: true,
+ * enumerable: true,
+ * writable: true,
+ * value: 2,
+ * }, 'nooo why fail??');
+ *
+ * // Recommended
+ * expect({a: 1}, 'nooo why fail??').to.have.ownPropertyDescriptor('a', {
+ * configurable: true,
+ * enumerable: true,
+ * writable: true,
+ * value: 2,
+ * });
+ *
+ * // Recommended
+ * expect({a: 1}, 'nooo why fail??').to.have.ownPropertyDescriptor('b');
+ *
+ * // Not recommended
+ * expect({a: 1})
+ * .to.have.ownPropertyDescriptor('b', undefined, 'nooo why fail??');
+ *
+ * The above assertion isn't the same thing as not providing `descriptor`.
+ * Instead, it's asserting that the target object has a `b` property
+ * descriptor that's deeply equal to `undefined`.
+ *
+ * The alias `.haveOwnPropertyDescriptor` can be used interchangeably with
+ * `.ownPropertyDescriptor`.
*
* @name ownPropertyDescriptor
* @alias haveOwnPropertyDescriptor
* @param {String} name
* @param {Object} descriptor _optional_
- * @param {String} message _optional_
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
@@ -1283,40 +2431,59 @@ module.exports = function (chai, _) {
Assertion.addMethod('haveOwnPropertyDescriptor', assertOwnPropertyDescriptor);
/**
- * ### .length
+ * ### .lengthOf(n[, msg])
*
- * Sets the `doLength` flag later used as a chain precursor to a value
- * comparison for the `length` property.
+ * Asserts that the target's `length` or `size` is equal to the given number
+ * `n`.
*
- * expect('foo').to.have.length.above(2);
- * expect([ 1, 2, 3 ]).to.have.length.above(2);
- * expect('foo').to.have.length.below(4);
- * expect([ 1, 2, 3 ]).to.have.length.below(4);
- * expect('foo').to.have.length.within(2,4);
- * expect([ 1, 2, 3 ]).to.have.length.within(2,4);
+ * expect([1, 2, 3]).to.have.lengthOf(3);
+ * expect('foo').to.have.lengthOf(3);
+ * expect(new Set([1, 2, 3])).to.have.lengthOf(3);
+ * expect(new Map([['a', 1], ['b', 2], ['c', 3]])).to.have.lengthOf(3);
*
- * *Deprecation notice:* Using `length` as an assertion will be deprecated
- * in version 2.4.0 and removed in 3.0.0. Code using the old style of
- * asserting for `length` property value using `length(value)` should be
- * switched to use `lengthOf(value)` instead.
+ * Add `.not` earlier in the chain to negate `.lengthOf`. However, it's often
+ * best to assert that the target's `length` property is equal to its expected
+ * value, rather than not equal to one of many unexpected values.
*
- * @name length
- * @namespace BDD
- * @api public
- */
-
- /**
- * ### .lengthOf(value[, message])
+ * expect('foo').to.have.lengthOf(3); // Recommended
+ * expect('foo').to.not.have.lengthOf(4); // Not recommended
+ *
+ * `.lengthOf` accepts an optional `msg` argument which is a custom error
+ * message to show when the assertion fails. The message can also be given as
+ * the second argument to `expect`.
+ *
+ * expect([1, 2, 3]).to.have.lengthOf(2, 'nooo why fail??');
+ * expect([1, 2, 3], 'nooo why fail??').to.have.lengthOf(2);
+ *
+ * `.lengthOf` can also be used as a language chain, causing all `.above`,
+ * `.below`, `.least`, `.most`, and `.within` assertions that follow in the
+ * chain to use the target's `length` property as the target. However, it's
+ * often best to assert that the target's `length` property is equal to its
+ * expected length, rather than asserting that its `length` property falls
+ * within some range of values.
*
- * Asserts that the target's `length` property has
- * the expected value.
+ * // Recommended
+ * expect([1, 2, 3]).to.have.lengthOf(3);
*
- * expect([ 1, 2, 3]).to.have.lengthOf(3);
- * expect('foobar').to.have.lengthOf(6);
+ * // Not recommended
+ * expect([1, 2, 3]).to.have.lengthOf.above(2);
+ * expect([1, 2, 3]).to.have.lengthOf.below(4);
+ * expect([1, 2, 3]).to.have.lengthOf.at.least(3);
+ * expect([1, 2, 3]).to.have.lengthOf.at.most(3);
+ * expect([1, 2, 3]).to.have.lengthOf.within(2,4);
+ *
+ * Due to a compatibility issue, the alias `.length` can't be chained directly
+ * off of an uninvoked method such as `.a`. Therefore, `.length` can't be used
+ * interchangeably with `.lengthOf` in every situation. It's recommended to
+ * always use `.lengthOf` instead of `.length`.
+ *
+ * expect([1, 2, 3]).to.have.a.length(3); // incompatible; throws error
+ * expect([1, 2, 3]).to.have.a.lengthOf(3); // passes as expected
*
* @name lengthOf
- * @param {Number} length
- * @param {String} message _optional_
+ * @alias length
+ * @param {Number} n
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
@@ -1327,33 +2494,60 @@ module.exports = function (chai, _) {
function assertLength (n, msg) {
if (msg) flag(this, 'message', msg);
- var obj = flag(this, 'object');
- new Assertion(obj, msg).to.have.property('length');
- var len = obj.length;
+ var obj = flag(this, 'object')
+ , objType = _.type(obj).toLowerCase()
+ , flagMsg = flag(this, 'message')
+ , ssfi = flag(this, 'ssfi')
+ , descriptor = 'length'
+ , itemsCount;
+
+ switch (objType) {
+ case 'map':
+ case 'set':
+ descriptor = 'size';
+ itemsCount = obj.size;
+ break;
+ default:
+ new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');
+ itemsCount = obj.length;
+ }
this.assert(
- len == n
- , 'expected #{this} to have a length of #{exp} but got #{act}'
- , 'expected #{this} to not have a length of #{act}'
+ itemsCount == n
+ , 'expected #{this} to have a ' + descriptor + ' of #{exp} but got #{act}'
+ , 'expected #{this} to not have a ' + descriptor + ' of #{act}'
, n
- , len
+ , itemsCount
);
}
Assertion.addChainableMethod('length', assertLength, assertLengthChain);
- Assertion.addMethod('lengthOf', assertLength);
+ Assertion.addChainableMethod('lengthOf', assertLength, assertLengthChain);
/**
- * ### .match(regexp)
+ * ### .match(re[, msg])
*
- * Asserts that the target matches a regular expression.
+ * Asserts that the target matches the given regular expression `re`.
*
* expect('foobar').to.match(/^foo/);
*
+ * Add `.not` earlier in the chain to negate `.match`.
+ *
+ * expect('foobar').to.not.match(/taco/);
+ *
+ * `.match` accepts an optional `msg` argument which is a custom error message
+ * to show when the assertion fails. The message can also be given as the
+ * second argument to `expect`.
+ *
+ * expect('foobar').to.match(/taco/, 'nooo why fail??');
+ * expect('foobar', 'nooo why fail??').to.match(/taco/);
+ *
+ * The alias `.matches` can be used interchangeably with `.match`.
+ *
* @name match
* @alias matches
- * @param {RegExp} RegularExpression
- * @param {String} message _optional_
+ * @param {RegExp} re
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
@@ -1371,23 +2565,36 @@ module.exports = function (chai, _) {
Assertion.addMethod('matches', assertMatch);
/**
- * ### .string(string)
+ * ### .string(str[, msg])
*
- * Asserts that the string target contains another string.
+ * Asserts that the target string contains the given substring `str`.
*
* expect('foobar').to.have.string('bar');
*
+ * Add `.not` earlier in the chain to negate `.string`.
+ *
+ * expect('foobar').to.not.have.string('taco');
+ *
+ * `.string` accepts an optional `msg` argument which is a custom error
+ * message to show when the assertion fails. The message can also be given as
+ * the second argument to `expect`.
+ *
+ * expect('foobar').to.have.string('taco', 'nooo why fail??');
+ * expect('foobar', 'nooo why fail??').to.have.string('taco');
+ *
* @name string
- * @param {String} string
- * @param {String} message _optional_
+ * @param {String} str
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
Assertion.addMethod('string', function (str, msg) {
if (msg) flag(this, 'message', msg);
- var obj = flag(this, 'object');
- new Assertion(obj, msg).is.a('string');
+ var obj = flag(this, 'object')
+ , flagMsg = flag(this, 'message')
+ , ssfi = flag(this, 'ssfi');
+ new Assertion(obj, flagMsg, ssfi, true).is.a('string');
this.assert(
~obj.indexOf(str)
@@ -1396,38 +2603,102 @@ module.exports = function (chai, _) {
);
});
-
/**
- * ### .keys(key1, [key2], [...])
+ * ### .keys(key1[, key2[, ...]])
+ *
+ * Asserts that the target object, array, map, or set has the given keys. Only
+ * the target's own inherited properties are included in the search.
+ *
+ * When the target is an object or array, keys can be provided as one or more
+ * string arguments, a single array argument, or a single object argument. In
+ * the latter case, only the keys in the given object matter; the values are
+ * ignored.
+ *
+ * expect({a: 1, b: 2}).to.have.all.keys('a', 'b');
+ * expect(['x', 'y']).to.have.all.keys(0, 1);
+ *
+ * expect({a: 1, b: 2}).to.have.all.keys(['a', 'b']);
+ * expect(['x', 'y']).to.have.all.keys([0, 1]);
+ *
+ * expect({a: 1, b: 2}).to.have.all.keys({a: 4, b: 5}); // ignore 4 and 5
+ * expect(['x', 'y']).to.have.all.keys({0: 4, 1: 5}); // ignore 4 and 5
+ *
+ * When the target is a map or set, each key must be provided as a separate
+ * argument.
+ *
+ * expect(new Map([['a', 1], ['b', 2]])).to.have.all.keys('a', 'b');
+ * expect(new Set(['a', 'b'])).to.have.all.keys('a', 'b');
+ *
+ * Because `.keys` does different things based on the target's type, it's
+ * important to check the target's type before using `.keys`. See the `.a` doc
+ * for info on testing a target's type.
+ *
+ * expect({a: 1, b: 2}).to.be.an('object').that.has.all.keys('a', 'b');
+ *
+ * By default, strict (`===`) equality is used to compare keys of maps and
+ * sets. Add `.deep` earlier in the chain to use deep equality instead. See
+ * the `deep-eql` project page for info on the deep equality algorithm:
+ * https://github.com/chaijs/deep-eql.
+ *
+ * // Target set deeply (but not strictly) has key `{a: 1}`
+ * expect(new Set([{a: 1}])).to.have.all.deep.keys([{a: 1}]);
+ * expect(new Set([{a: 1}])).to.not.have.all.keys([{a: 1}]);
+ *
+ * By default, the target must have all of the given keys and no more. Add
+ * `.any` earlier in the chain to only require that the target have at least
+ * one of the given keys. Also, add `.not` earlier in the chain to negate
+ * `.keys`. It's often best to add `.any` when negating `.keys`, and to use
+ * `.all` when asserting `.keys` without negation.
+ *
+ * When negating `.keys`, `.any` is preferred because `.not.any.keys` asserts
+ * exactly what's expected of the output, whereas `.not.all.keys` creates
+ * uncertain expectations.
+ *
+ * // Recommended; asserts that target doesn't have any of the given keys
+ * expect({a: 1, b: 2}).to.not.have.any.keys('c', 'd');
+ *
+ * // Not recommended; asserts that target doesn't have all of the given
+ * // keys but may or may not have some of them
+ * expect({a: 1, b: 2}).to.not.have.all.keys('c', 'd');
+ *
+ * When asserting `.keys` without negation, `.all` is preferred because
+ * `.all.keys` asserts exactly what's expected of the output, whereas
+ * `.any.keys` creates uncertain expectations.
+ *
+ * // Recommended; asserts that target has all the given keys
+ * expect({a: 1, b: 2}).to.have.all.keys('a', 'b');
+ *
+ * // Not recommended; asserts that target has at least one of the given
+ * // keys but may or may not have more of them
+ * expect({a: 1, b: 2}).to.have.any.keys('a', 'b');
+ *
+ * Note that `.all` is used by default when neither `.all` nor `.any` appear
+ * earlier in the chain. However, it's often best to add `.all` anyway because
+ * it improves readability.
+ *
+ * // Both assertions are identical
+ * expect({a: 1, b: 2}).to.have.all.keys('a', 'b'); // Recommended
+ * expect({a: 1, b: 2}).to.have.keys('a', 'b'); // Not recommended
+ *
+ * Add `.include` earlier in the chain to require that the target's keys be a
+ * superset of the expected keys, rather than identical sets.
*
- * Asserts that the target contains any or all of the passed-in keys.
- * Use in combination with `any`, `all`, `contains`, or `have` will affect
- * what will pass.
+ * // Target object's keys are a superset of ['a', 'b'] but not identical
+ * expect({a: 1, b: 2, c: 3}).to.include.all.keys('a', 'b');
+ * expect({a: 1, b: 2, c: 3}).to.not.have.all.keys('a', 'b');
*
- * When used in conjunction with `any`, at least one key that is passed
- * in must exist in the target object. This is regardless whether or not
- * the `have` or `contain` qualifiers are used. Note, either `any` or `all`
- * should be used in the assertion. If neither are used, the assertion is
- * defaulted to `all`.
+ * However, if `.any` and `.include` are combined, only the `.any` takes
+ * effect. The `.include` is ignored in this case.
*
- * When both `all` and `contain` are used, the target object must have at
- * least all of the passed-in keys but may have more keys not listed.
+ * // Both assertions are identical
+ * expect({a: 1}).to.have.any.keys('a', 'b');
+ * expect({a: 1}).to.include.any.keys('a', 'b');
*
- * When both `all` and `have` are used, the target object must both contain
- * all of the passed-in keys AND the number of keys in the target object must
- * match the number of keys passed in (in other words, a target object must
- * have all and only all of the passed-in keys).
+ * A custom error message can be given as the second argument to `expect`.
*
- * expect({ foo: 1, bar: 2 }).to.have.any.keys('foo', 'baz');
- * expect({ foo: 1, bar: 2 }).to.have.any.keys('foo');
- * expect({ foo: 1, bar: 2 }).to.contain.any.keys('bar', 'baz');
- * expect({ foo: 1, bar: 2 }).to.contain.any.keys(['foo']);
- * expect({ foo: 1, bar: 2 }).to.contain.any.keys({'foo': 6});
- * expect({ foo: 1, bar: 2 }).to.have.all.keys(['bar', 'foo']);
- * expect({ foo: 1, bar: 2 }).to.have.all.keys({'bar': 6, 'foo': 7});
- * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.all.keys(['bar', 'foo']);
- * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.all.keys({'bar': 6});
+ * expect({a: 1}, 'nooo why fail??').to.have.key('b');
*
+ * The alias `.key` can be used interchangeably with `.keys`.
*
* @name keys
* @alias key
@@ -1438,29 +2709,62 @@ module.exports = function (chai, _) {
function assertKeys (keys) {
var obj = flag(this, 'object')
+ , objType = _.type(obj)
+ , keysType = _.type(keys)
+ , ssfi = flag(this, 'ssfi')
+ , isDeep = flag(this, 'deep')
, str
+ , deepStr = ''
+ , actual
, ok = true
- , mixedArgsMsg = 'keys must be given single argument of Array|Object|String, or multiple String arguments';
+ , flagMsg = flag(this, 'message');
- switch (_.type(keys)) {
- case "array":
- if (arguments.length > 1) throw (new Error(mixedArgsMsg));
- break;
- case "object":
- if (arguments.length > 1) throw (new Error(mixedArgsMsg));
- keys = Object.keys(keys);
- break;
- default:
+ flagMsg = flagMsg ? flagMsg + ': ' : '';
+ var mixedArgsMsg = flagMsg + 'when testing keys against an object or an array you must give a single Array|Object|String argument or multiple String arguments';
+
+ if (objType === 'Map' || objType === 'Set') {
+ deepStr = isDeep ? 'deeply ' : '';
+ actual = [];
+
+ // Map and Set '.keys' aren't supported in IE 11. Therefore, use .forEach.
+ obj.forEach(function (val, key) { actual.push(key) });
+
+ if (keysType !== 'Array') {
keys = Array.prototype.slice.call(arguments);
+ }
+ } else {
+ actual = _.getOwnEnumerableProperties(obj);
+
+ switch (keysType) {
+ case 'Array':
+ if (arguments.length > 1) {
+ throw new AssertionError(mixedArgsMsg, undefined, ssfi);
+ }
+ break;
+ case 'Object':
+ if (arguments.length > 1) {
+ throw new AssertionError(mixedArgsMsg, undefined, ssfi);
+ }
+ keys = Object.keys(keys);
+ break;
+ default:
+ keys = Array.prototype.slice.call(arguments);
+ }
+
+ // Only stringify non-Symbols because Symbols would become "Symbol()"
+ keys = keys.map(function (val) {
+ return typeof val === 'symbol' ? val : String(val);
+ });
}
- if (!keys.length) throw new Error('keys required');
+ if (!keys.length) {
+ throw new AssertionError(flagMsg + 'keys required', undefined, ssfi);
+ }
- var actual = Object.keys(obj)
- , expected = keys
- , len = keys.length
+ var len = keys.length
, any = flag(this, 'any')
- , all = flag(this, 'all');
+ , all = flag(this, 'all')
+ , expected = keys;
if (!any && !all) {
all = true;
@@ -1468,25 +2772,37 @@ module.exports = function (chai, _) {
// Has any
if (any) {
- var intersection = expected.filter(function(key) {
- return ~actual.indexOf(key);
+ ok = expected.some(function(expectedKey) {
+ return actual.some(function(actualKey) {
+ if (isDeep) {
+ return _.eql(expectedKey, actualKey);
+ } else {
+ return expectedKey === actualKey;
+ }
+ });
});
- ok = intersection.length > 0;
}
// Has all
if (all) {
- ok = keys.every(function(key){
- return ~actual.indexOf(key);
+ ok = expected.every(function(expectedKey) {
+ return actual.some(function(actualKey) {
+ if (isDeep) {
+ return _.eql(expectedKey, actualKey);
+ } else {
+ return expectedKey === actualKey;
+ }
+ });
});
- if (!flag(this, 'negate') && !flag(this, 'contains')) {
+
+ if (!flag(this, 'contains')) {
ok = ok && keys.length == actual.length;
}
}
// Key string
if (len > 1) {
- keys = keys.map(function(key){
+ keys = keys.map(function(key) {
return _.inspect(key);
});
var last = keys.pop();
@@ -1509,10 +2825,10 @@ module.exports = function (chai, _) {
// Assertion
this.assert(
ok
- , 'expected #{this} to ' + str
- , 'expected #{this} to not ' + str
- , expected.slice(0).sort()
- , actual.sort()
+ , 'expected #{this} to ' + deepStr + str
+ , 'expected #{this} to not ' + deepStr + str
+ , expected.slice(0).sort(_.compareByInspect)
+ , actual.sort(_.compareByInspect)
, true
);
}
@@ -1521,156 +2837,294 @@ module.exports = function (chai, _) {
Assertion.addMethod('key', assertKeys);
/**
- * ### .throw(constructor)
+ * ### .throw([errorLike], [errMsgMatcher], [msg])
*
- * Asserts that the function target will throw a specific error, or specific type of error
- * (as determined using `instanceof`), optionally with a RegExp or string inclusion test
- * for the error's message.
+ * When no arguments are provided, `.throw` invokes the target function and
+ * asserts that an error is thrown.
*
- * var err = new ReferenceError('This is a bad function.');
- * var fn = function () { throw err; }
- * expect(fn).to.throw(ReferenceError);
- * expect(fn).to.throw(Error);
- * expect(fn).to.throw(/bad function/);
- * expect(fn).to.not.throw('good function');
- * expect(fn).to.throw(ReferenceError, /bad function/);
- * expect(fn).to.throw(err);
+ * var badFn = function () { throw new TypeError('Illegal salmon!'); };
*
- * Please note that when a throw expectation is negated, it will check each
- * parameter independently, starting with error constructor type. The appropriate way
- * to check for the existence of a type of error but for a message that does not match
- * is to use `and`.
+ * expect(badFn).to.throw();
*
- * expect(fn).to.throw(ReferenceError)
- * .and.not.throw(/good function/);
+ * When one argument is provided, and it's an error constructor, `.throw`
+ * invokes the target function and asserts that an error is thrown that's an
+ * instance of that error constructor.
*
- * @name throw
- * @alias throws
- * @alias Throw
- * @param {ErrorConstructor} constructor
- * @param {String|RegExp} expected error message
- * @param {String} message _optional_
- * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
- * @returns error for chaining (null if no error)
- * @namespace BDD
- * @api public
- */
-
- function assertThrows (constructor, errMsg, msg) {
- if (msg) flag(this, 'message', msg);
- var obj = flag(this, 'object');
- new Assertion(obj, msg).is.a('function');
-
- var thrown = false
- , desiredError = null
- , name = null
- , thrownError = null;
-
- if (arguments.length === 0) {
- errMsg = null;
- constructor = null;
- } else if (constructor && (constructor instanceof RegExp || 'string' === typeof constructor)) {
- errMsg = constructor;
- constructor = null;
- } else if (constructor && constructor instanceof Error) {
- desiredError = constructor;
- constructor = null;
- errMsg = null;
- } else if (typeof constructor === 'function') {
- name = constructor.prototype.name;
- if (!name || (name === 'Error' && constructor !== Error)) {
- name = constructor.name || (new constructor()).name;
- }
- } else {
- constructor = null;
- }
-
+ * var badFn = function () { throw new TypeError('Illegal salmon!'); };
+ *
+ * expect(badFn).to.throw(TypeError);
+ *
+ * When one argument is provided, and it's an error instance, `.throw` invokes
+ * the target function and asserts that an error is thrown that's strictly
+ * (`===`) equal to that error instance.
+ *
+ * var err = new TypeError('Illegal salmon!');
+ * var badFn = function () { throw err; };
+ *
+ * expect(badFn).to.throw(err);
+ *
+ * When one argument is provided, and it's a string, `.throw` invokes the
+ * target function and asserts that an error is thrown with a message that
+ * contains that string.
+ *
+ * var badFn = function () { throw new TypeError('Illegal salmon!'); };
+ *
+ * expect(badFn).to.throw('salmon');
+ *
+ * When one argument is provided, and it's a regular expression, `.throw`
+ * invokes the target function and asserts that an error is thrown with a
+ * message that matches that regular expression.
+ *
+ * var badFn = function () { throw new TypeError('Illegal salmon!'); };
+ *
+ * expect(badFn).to.throw(/salmon/);
+ *
+ * When two arguments are provided, and the first is an error instance or
+ * constructor, and the second is a string or regular expression, `.throw`
+ * invokes the function and asserts that an error is thrown that fulfills both
+ * conditions as described above.
+ *
+ * var err = new TypeError('Illegal salmon!');
+ * var badFn = function () { throw err; };
+ *
+ * expect(badFn).to.throw(TypeError, 'salmon');
+ * expect(badFn).to.throw(TypeError, /salmon/);
+ * expect(badFn).to.throw(err, 'salmon');
+ * expect(badFn).to.throw(err, /salmon/);
+ *
+ * Add `.not` earlier in the chain to negate `.throw`.
+ *
+ * var goodFn = function () {};
+ *
+ * expect(goodFn).to.not.throw();
+ *
+ * However, it's dangerous to negate `.throw` when providing any arguments.
+ * The problem is that it creates uncertain expectations by asserting that the
+ * target either doesn't throw an error, or that it throws an error but of a
+ * different type than the given type, or that it throws an error of the given
+ * type but with a message that doesn't include the given string. It's often
+ * best to identify the exact output that's expected, and then write an
+ * assertion that only accepts that exact output.
+ *
+ * When the target isn't expected to throw an error, it's often best to assert
+ * exactly that.
+ *
+ * var goodFn = function () {};
+ *
+ * expect(goodFn).to.not.throw(); // Recommended
+ * expect(goodFn).to.not.throw(ReferenceError, 'x'); // Not recommended
+ *
+ * When the target is expected to throw an error, it's often best to assert
+ * that the error is of its expected type, and has a message that includes an
+ * expected string, rather than asserting that it doesn't have one of many
+ * unexpected types, and doesn't have a message that includes some string.
+ *
+ * var badFn = function () { throw new TypeError('Illegal salmon!'); };
+ *
+ * expect(badFn).to.throw(TypeError, 'salmon'); // Recommended
+ * expect(badFn).to.not.throw(ReferenceError, 'x'); // Not recommended
+ *
+ * `.throw` changes the target of any assertions that follow in the chain to
+ * be the error object that's thrown.
+ *
+ * var err = new TypeError('Illegal salmon!');
+ * err.code = 42;
+ * var badFn = function () { throw err; };
+ *
+ * expect(badFn).to.throw(TypeError).with.property('code', 42);
+ *
+ * `.throw` accepts an optional `msg` argument which is a custom error message
+ * to show when the assertion fails. The message can also be given as the
+ * second argument to `expect`. When not providing two arguments, always use
+ * the second form.
+ *
+ * var goodFn = function () {};
+ *
+ * expect(goodFn).to.throw(TypeError, 'x', 'nooo why fail??');
+ * expect(goodFn, 'nooo why fail??').to.throw();
+ *
+ * Due to limitations in ES5, `.throw` may not always work as expected when
+ * using a transpiler such as Babel or TypeScript. In particular, it may
+ * produce unexpected results when subclassing the built-in `Error` object and
+ * then passing the subclassed constructor to `.throw`. See your transpiler's
+ * docs for details:
+ *
+ * - ([Babel](https://babeljs.io/docs/usage/caveats/#classes))
+ * - ([TypeScript](https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work))
+ *
+ * Beware of some common mistakes when using the `throw` assertion. One common
+ * mistake is to accidentally invoke the function yourself instead of letting
+ * the `throw` assertion invoke the function for you. For example, when
+ * testing if a function named `fn` throws, provide `fn` instead of `fn()` as
+ * the target for the assertion.
+ *
+ * expect(fn).to.throw(); // Good! Tests `fn` as desired
+ * expect(fn()).to.throw(); // Bad! Tests result of `fn()`, not `fn`
+ *
+ * If you need to assert that your function `fn` throws when passed certain
+ * arguments, then wrap a call to `fn` inside of another function.
+ *
+ * expect(function () { fn(42); }).to.throw(); // Function expression
+ * expect(() => fn(42)).to.throw(); // ES6 arrow function
+ *
+ * Another common mistake is to provide an object method (or any stand-alone
+ * function that relies on `this`) as the target of the assertion. Doing so is
+ * problematic because the `this` context will be lost when the function is
+ * invoked by `.throw`; there's no way for it to know what `this` is supposed
+ * to be. There are two ways around this problem. One solution is to wrap the
+ * method or function call inside of another function. Another solution is to
+ * use `bind`.
+ *
+ * expect(function () { cat.meow(); }).to.throw(); // Function expression
+ * expect(() => cat.meow()).to.throw(); // ES6 arrow function
+ * expect(cat.meow.bind(cat)).to.throw(); // Bind
+ *
+ * Finally, it's worth mentioning that it's a best practice in JavaScript to
+ * only throw `Error` and derivatives of `Error` such as `ReferenceError`,
+ * `TypeError`, and user-defined objects that extend `Error`. No other type of
+ * value will generate a stack trace when initialized. With that said, the
+ * `throw` assertion does technically support any type of value being thrown,
+ * not just `Error` and its derivatives.
+ *
+ * The aliases `.throws` and `.Throw` can be used interchangeably with
+ * `.throw`.
+ *
+ * @name throw
+ * @alias throws
+ * @alias Throw
+ * @param {Error|ErrorConstructor} errorLike
+ * @param {String|RegExp} errMsgMatcher error message
+ * @param {String} msg _optional_
+ * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
+ * @returns error for chaining (null if no error)
+ * @namespace BDD
+ * @api public
+ */
+
+ function assertThrows (errorLike, errMsgMatcher, msg) {
+ if (msg) flag(this, 'message', msg);
+ var obj = flag(this, 'object')
+ , ssfi = flag(this, 'ssfi')
+ , flagMsg = flag(this, 'message')
+ , negate = flag(this, 'negate') || false;
+ new Assertion(obj, flagMsg, ssfi, true).is.a('function');
+
+ if (errorLike instanceof RegExp || typeof errorLike === 'string') {
+ errMsgMatcher = errorLike;
+ errorLike = null;
+ }
+
+ var caughtErr;
try {
obj();
} catch (err) {
- // first, check desired error
- if (desiredError) {
- this.assert(
- err === desiredError
- , 'expected #{this} to throw #{exp} but #{act} was thrown'
- , 'expected #{this} to not throw #{exp}'
- , (desiredError instanceof Error ? desiredError.toString() : desiredError)
- , (err instanceof Error ? err.toString() : err)
- );
+ caughtErr = err;
+ }
- flag(this, 'object', err);
- return this;
+ // If we have the negate flag enabled and at least one valid argument it means we do expect an error
+ // but we want it to match a given set of criteria
+ var everyArgIsUndefined = errorLike === undefined && errMsgMatcher === undefined;
+
+ // If we've got the negate flag enabled and both args, we should only fail if both aren't compatible
+ // See Issue #551 and PR #683@GitHub
+ var everyArgIsDefined = Boolean(errorLike && errMsgMatcher);
+ var errorLikeFail = false;
+ var errMsgMatcherFail = false;
+
+ // Checking if error was thrown
+ if (everyArgIsUndefined || !everyArgIsUndefined && !negate) {
+ // We need this to display results correctly according to their types
+ var errorLikeString = 'an error';
+ if (errorLike instanceof Error) {
+ errorLikeString = '#{exp}';
+ } else if (errorLike) {
+ errorLikeString = _.checkError.getConstructorName(errorLike);
}
- // next, check constructor
- if (constructor) {
- this.assert(
- err instanceof constructor
- , 'expected #{this} to throw #{exp} but #{act} was thrown'
- , 'expected #{this} to not throw #{exp} but #{act} was thrown'
- , name
- , (err instanceof Error ? err.toString() : err)
- );
+ this.assert(
+ caughtErr
+ , 'expected #{this} to throw ' + errorLikeString
+ , 'expected #{this} to not throw an error but #{act} was thrown'
+ , errorLike && errorLike.toString()
+ , (caughtErr instanceof Error ?
+ caughtErr.toString() : (typeof caughtErr === 'string' ? caughtErr : caughtErr &&
+ _.checkError.getConstructorName(caughtErr)))
+ );
+ }
- if (!errMsg) {
- flag(this, 'object', err);
- return this;
+ if (errorLike && caughtErr) {
+ // We should compare instances only if `errorLike` is an instance of `Error`
+ if (errorLike instanceof Error) {
+ var isCompatibleInstance = _.checkError.compatibleInstance(caughtErr, errorLike);
+
+ if (isCompatibleInstance === negate) {
+ // These checks were created to ensure we won't fail too soon when we've got both args and a negate
+ // See Issue #551 and PR #683@GitHub
+ if (everyArgIsDefined && negate) {
+ errorLikeFail = true;
+ } else {
+ this.assert(
+ negate
+ , 'expected #{this} to throw #{exp} but #{act} was thrown'
+ , 'expected #{this} to not throw #{exp}' + (caughtErr && !negate ? ' but #{act} was thrown' : '')
+ , errorLike.toString()
+ , caughtErr.toString()
+ );
+ }
}
}
- // next, check message
- var message = 'error' === _.type(err) && "message" in err
- ? err.message
- : '' + err;
-
- if ((message != null) && errMsg && errMsg instanceof RegExp) {
- this.assert(
- errMsg.exec(message)
- , 'expected #{this} to throw error matching #{exp} but got #{act}'
- , 'expected #{this} to throw error not matching #{exp}'
- , errMsg
- , message
- );
-
- flag(this, 'object', err);
- return this;
- } else if ((message != null) && errMsg && 'string' === typeof errMsg) {
- this.assert(
- ~message.indexOf(errMsg)
- , 'expected #{this} to throw error including #{exp} but got #{act}'
- , 'expected #{this} to throw error not including #{act}'
- , errMsg
- , message
- );
-
- flag(this, 'object', err);
- return this;
- } else {
- thrown = true;
- thrownError = err;
+ var isCompatibleConstructor = _.checkError.compatibleConstructor(caughtErr, errorLike);
+ if (isCompatibleConstructor === negate) {
+ if (everyArgIsDefined && negate) {
+ errorLikeFail = true;
+ } else {
+ this.assert(
+ negate
+ , 'expected #{this} to throw #{exp} but #{act} was thrown'
+ , 'expected #{this} to not throw #{exp}' + (caughtErr ? ' but #{act} was thrown' : '')
+ , (errorLike instanceof Error ? errorLike.toString() : errorLike && _.checkError.getConstructorName(errorLike))
+ , (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr))
+ );
+ }
}
}
- var actuallyGot = ''
- , expectedThrown = name !== null
- ? name
- : desiredError
- ? '#{exp}' //_.inspect(desiredError)
- : 'an error';
+ if (caughtErr && errMsgMatcher !== undefined && errMsgMatcher !== null) {
+ // Here we check compatible messages
+ var placeholder = 'including';
+ if (errMsgMatcher instanceof RegExp) {
+ placeholder = 'matching'
+ }
- if (thrown) {
- actuallyGot = ' but #{act} was thrown'
+ var isCompatibleMessage = _.checkError.compatibleMessage(caughtErr, errMsgMatcher);
+ if (isCompatibleMessage === negate) {
+ if (everyArgIsDefined && negate) {
+ errMsgMatcherFail = true;
+ } else {
+ this.assert(
+ negate
+ , 'expected #{this} to throw error ' + placeholder + ' #{exp} but got #{act}'
+ , 'expected #{this} to throw error not ' + placeholder + ' #{exp}'
+ , errMsgMatcher
+ , _.checkError.getMessage(caughtErr)
+ );
+ }
+ }
}
- this.assert(
- thrown === true
- , 'expected #{this} to throw ' + expectedThrown + actuallyGot
- , 'expected #{this} to not throw ' + expectedThrown + actuallyGot
- , (desiredError instanceof Error ? desiredError.toString() : desiredError)
- , (thrownError instanceof Error ? thrownError.toString() : thrownError)
- );
+ // If both assertions failed and both should've matched we throw an error
+ if (errorLikeFail && errMsgMatcherFail) {
+ this.assert(
+ negate
+ , 'expected #{this} to throw #{exp} but #{act} was thrown'
+ , 'expected #{this} to not throw #{exp}' + (caughtErr ? ' but #{act} was thrown' : '')
+ , (errorLike instanceof Error ? errorLike.toString() : errorLike && _.checkError.getConstructorName(errorLike))
+ , (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr))
+ );
+ }
- flag(this, 'object', thrownError);
+ flag(this, 'object', caughtErr);
};
Assertion.addMethod('throw', assertThrows);
@@ -1678,24 +3132,66 @@ module.exports = function (chai, _) {
Assertion.addMethod('Throw', assertThrows);
/**
- * ### .respondTo(method)
+ * ### .respondTo(method[, msg])
*
- * Asserts that the object or class target will respond to a method.
+ * When the target is a non-function object, `.respondTo` asserts that the
+ * target has a method with the given name `method`. The method can be own or
+ * inherited, and it can be enumerable or non-enumerable.
*
- * Klass.prototype.bar = function(){};
- * expect(Klass).to.respondTo('bar');
- * expect(obj).to.respondTo('bar');
+ * function Cat () {}
+ * Cat.prototype.meow = function () {};
*
- * To check if a constructor will respond to a static function,
- * set the `itself` flag.
+ * expect(new Cat()).to.respondTo('meow');
*
- * Klass.baz = function(){};
- * expect(Klass).itself.to.respondTo('baz');
+ * When the target is a function, `.respondTo` asserts that the target's
+ * `prototype` property has a method with the given name `method`. Again, the
+ * method can be own or inherited, and it can be enumerable or non-enumerable.
+ *
+ * function Cat () {}
+ * Cat.prototype.meow = function () {};
+ *
+ * expect(Cat).to.respondTo('meow');
+ *
+ * Add `.itself` earlier in the chain to force `.respondTo` to treat the
+ * target as a non-function object, even if it's a function. Thus, it asserts
+ * that the target has a method with the given name `method`, rather than
+ * asserting that the target's `prototype` property has a method with the
+ * given name `method`.
+ *
+ * function Cat () {}
+ * Cat.prototype.meow = function () {};
+ * Cat.hiss = function () {};
+ *
+ * expect(Cat).itself.to.respondTo('hiss').but.not.respondTo('meow');
+ *
+ * When not adding `.itself`, it's important to check the target's type before
+ * using `.respondTo`. See the `.a` doc for info on checking a target's type.
+ *
+ * function Cat () {}
+ * Cat.prototype.meow = function () {};
+ *
+ * expect(new Cat()).to.be.an('object').that.respondsTo('meow');
+ *
+ * Add `.not` earlier in the chain to negate `.respondTo`.
+ *
+ * function Dog () {}
+ * Dog.prototype.bark = function () {};
+ *
+ * expect(new Dog()).to.not.respondTo('meow');
+ *
+ * `.respondTo` accepts an optional `msg` argument which is a custom error
+ * message to show when the assertion fails. The message can also be given as
+ * the second argument to `expect`.
+ *
+ * expect({}).to.respondTo('meow', 'nooo why fail??');
+ * expect({}, 'nooo why fail??').to.respondTo('meow');
+ *
+ * The alias `.respondsTo` can be used interchangeably with `.respondTo`.
*
* @name respondTo
* @alias respondsTo
* @param {String} method
- * @param {String} message _optional_
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
@@ -1704,7 +3200,7 @@ module.exports = function (chai, _) {
if (msg) flag(this, 'message', msg);
var obj = flag(this, 'object')
, itself = flag(this, 'itself')
- , context = ('function' === _.type(obj) && !itself)
+ , context = ('function' === typeof obj && !itself)
? obj.prototype[method]
: obj[method];
@@ -1721,14 +3217,17 @@ module.exports = function (chai, _) {
/**
* ### .itself
*
- * Sets the `itself` flag, later used by the `respondTo` assertion.
+ * Forces all `.respondTo` assertions that follow in the chain to behave as if
+ * the target is a non-function object, even if it's a function. Thus, it
+ * causes `.respondTo` to assert that the target has a method with the given
+ * name, rather than asserting that the target's `prototype` property has a
+ * method with the given name.
*
- * function Foo() {}
- * Foo.bar = function() {}
- * Foo.prototype.baz = function() {}
+ * function Cat () {}
+ * Cat.prototype.meow = function () {};
+ * Cat.hiss = function () {};
*
- * expect(Foo).itself.to.respondTo('bar');
- * expect(Foo).itself.not.to.respondTo('baz');
+ * expect(Cat).itself.to.respondTo('hiss').but.not.respondTo('meow');
*
* @name itself
* @namespace BDD
@@ -1740,16 +3239,39 @@ module.exports = function (chai, _) {
});
/**
- * ### .satisfy(method)
+ * ### .satisfy(matcher[, msg])
+ *
+ * Invokes the given `matcher` function with the target being passed as the
+ * first argument, and asserts that the value returned is truthy.
*
- * Asserts that the target passes a given truth test.
+ * expect(1).to.satisfy(function(num) {
+ * return num > 0;
+ * });
*
- * expect(1).to.satisfy(function(num) { return num > 0; });
+ * Add `.not` earlier in the chain to negate `.satisfy`.
+ *
+ * expect(1).to.not.satisfy(function(num) {
+ * return num > 2;
+ * });
+ *
+ * `.satisfy` accepts an optional `msg` argument which is a custom error
+ * message to show when the assertion fails. The message can also be given as
+ * the second argument to `expect`.
+ *
+ * expect(1).to.satisfy(function(num) {
+ * return num > 2;
+ * }, 'nooo why fail??');
+ *
+ * expect(1, 'nooo why fail??').to.satisfy(function(num) {
+ * return num > 2;
+ * });
+ *
+ * The alias `.satisfies` can be used interchangeably with `.satisfy`.
*
* @name satisfy
* @alias satisfies
* @param {Function} matcher
- * @param {String} message _optional_
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
@@ -1762,7 +3284,7 @@ module.exports = function (chai, _) {
result
, 'expected #{this} to satisfy ' + _.objDisplay(matcher)
, 'expected #{this} to not satisfy' + _.objDisplay(matcher)
- , this.negate ? false : true
+ , flag(this, 'negate') ? false : true
, result
);
}
@@ -1771,28 +3293,58 @@ module.exports = function (chai, _) {
Assertion.addMethod('satisfies', satisfy);
/**
- * ### .closeTo(expected, delta)
+ * ### .closeTo(expected, delta[, msg])
*
- * Asserts that the target is equal `expected`, to within a +/- `delta` range.
+ * Asserts that the target is a number that's within a given +/- `delta` range
+ * of the given number `expected`. However, it's often best to assert that the
+ * target is equal to its expected value.
+ *
+ * // Recommended
+ * expect(1.5).to.equal(1.5);
*
+ * // Not recommended
* expect(1.5).to.be.closeTo(1, 0.5);
+ * expect(1.5).to.be.closeTo(2, 0.5);
+ * expect(1.5).to.be.closeTo(1, 1);
+ *
+ * Add `.not` earlier in the chain to negate `.closeTo`.
+ *
+ * expect(1.5).to.equal(1.5); // Recommended
+ * expect(1.5).to.not.be.closeTo(3, 1); // Not recommended
+ *
+ * `.closeTo` accepts an optional `msg` argument which is a custom error
+ * message to show when the assertion fails. The message can also be given as
+ * the second argument to `expect`.
+ *
+ * expect(1.5).to.be.closeTo(3, 1, 'nooo why fail??');
+ * expect(1.5, 'nooo why fail??').to.be.closeTo(3, 1);
+ *
+ * The alias `.approximately` can be used interchangeably with `.closeTo`.
*
* @name closeTo
* @alias approximately
* @param {Number} expected
* @param {Number} delta
- * @param {String} message _optional_
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
function closeTo(expected, delta, msg) {
if (msg) flag(this, 'message', msg);
- var obj = flag(this, 'object');
-
- new Assertion(obj, msg).is.a('number');
- if (_.type(expected) !== 'number' || _.type(delta) !== 'number') {
- throw new Error('the arguments to closeTo or approximately must be numbers');
+ var obj = flag(this, 'object')
+ , flagMsg = flag(this, 'message')
+ , ssfi = flag(this, 'ssfi');
+
+ new Assertion(obj, flagMsg, ssfi, true).is.a('number');
+ if (typeof expected !== 'number' || typeof delta !== 'number') {
+ flagMsg = flagMsg ? flagMsg + ': ' : '';
+ var deltaMessage = delta === undefined ? ", and a delta is required" : "";
+ throw new AssertionError(
+ flagMsg + 'the arguments to closeTo or approximately must be numbers' + deltaMessage,
+ undefined,
+ ssfi
+ );
}
this.assert(
@@ -1805,258 +3357,717 @@ module.exports = function (chai, _) {
Assertion.addMethod('closeTo', closeTo);
Assertion.addMethod('approximately', closeTo);
- function isSubsetOf(subset, superset, cmp) {
- return subset.every(function(elem) {
- if (!cmp) return superset.indexOf(elem) !== -1;
+ // Note: Duplicates are ignored if testing for inclusion instead of sameness.
+ function isSubsetOf(subset, superset, cmp, contains, ordered) {
+ if (!contains) {
+ if (subset.length !== superset.length) return false;
+ superset = superset.slice();
+ }
+
+ return subset.every(function(elem, idx) {
+ if (ordered) return cmp ? cmp(elem, superset[idx]) : elem === superset[idx];
+
+ if (!cmp) {
+ var matchIdx = superset.indexOf(elem);
+ if (matchIdx === -1) return false;
+
+ // Remove match from superset so not counted twice if duplicate in subset.
+ if (!contains) superset.splice(matchIdx, 1);
+ return true;
+ }
+
+ return superset.some(function(elem2, matchIdx) {
+ if (!cmp(elem, elem2)) return false;
- return superset.some(function(elem2) {
- return cmp(elem, elem2);
+ // Remove match from superset so not counted twice if duplicate in subset.
+ if (!contains) superset.splice(matchIdx, 1);
+ return true;
});
- })
+ });
}
/**
- * ### .members(set)
+ * ### .members(set[, msg])
+ *
+ * Asserts that the target array has the same members as the given array
+ * `set`.
+ *
+ * expect([1, 2, 3]).to.have.members([2, 1, 3]);
+ * expect([1, 2, 2]).to.have.members([2, 1, 2]);
+ *
+ * By default, members are compared using strict (`===`) equality. Add `.deep`
+ * earlier in the chain to use deep equality instead. See the `deep-eql`
+ * project page for info on the deep equality algorithm:
+ * https://github.com/chaijs/deep-eql.
+ *
+ * // Target array deeply (but not strictly) has member `{a: 1}`
+ * expect([{a: 1}]).to.have.deep.members([{a: 1}]);
+ * expect([{a: 1}]).to.not.have.members([{a: 1}]);
+ *
+ * By default, order doesn't matter. Add `.ordered` earlier in the chain to
+ * require that members appear in the same order.
*
- * Asserts that the target is a superset of `set`,
- * or that the target and `set` have the same strictly-equal (===) members.
- * Alternately, if the `deep` flag is set, set members are compared for deep
- * equality.
+ * expect([1, 2, 3]).to.have.ordered.members([1, 2, 3]);
+ * expect([1, 2, 3]).to.have.members([2, 1, 3])
+ * .but.not.ordered.members([2, 1, 3]);
*
- * expect([1, 2, 3]).to.include.members([3, 2]);
- * expect([1, 2, 3]).to.not.include.members([3, 2, 8]);
+ * By default, both arrays must be the same size. Add `.include` earlier in
+ * the chain to require that the target's members be a superset of the
+ * expected members. Note that duplicates are ignored in the subset when
+ * `.include` is added.
*
- * expect([4, 2]).to.have.members([2, 4]);
- * expect([5, 2]).to.not.have.members([5, 2, 1]);
+ * // Target array is a superset of [1, 2] but not identical
+ * expect([1, 2, 3]).to.include.members([1, 2]);
+ * expect([1, 2, 3]).to.not.have.members([1, 2]);
*
- * expect([{ id: 1 }]).to.deep.include.members([{ id: 1 }]);
+ * // Duplicates in the subset are ignored
+ * expect([1, 2, 3]).to.include.members([1, 2, 2, 2]);
+ *
+ * `.deep`, `.ordered`, and `.include` can all be combined. However, if
+ * `.include` and `.ordered` are combined, the ordering begins at the start of
+ * both arrays.
+ *
+ * expect([{a: 1}, {b: 2}, {c: 3}])
+ * .to.include.deep.ordered.members([{a: 1}, {b: 2}])
+ * .but.not.include.deep.ordered.members([{b: 2}, {c: 3}]);
+ *
+ * Add `.not` earlier in the chain to negate `.members`. However, it's
+ * dangerous to do so. The problem is that it creates uncertain expectations
+ * by asserting that the target array doesn't have all of the same members as
+ * the given array `set` but may or may not have some of them. It's often best
+ * to identify the exact output that's expected, and then write an assertion
+ * that only accepts that exact output.
+ *
+ * expect([1, 2]).to.not.include(3).and.not.include(4); // Recommended
+ * expect([1, 2]).to.not.have.members([3, 4]); // Not recommended
+ *
+ * `.members` accepts an optional `msg` argument which is a custom error
+ * message to show when the assertion fails. The message can also be given as
+ * the second argument to `expect`.
+ *
+ * expect([1, 2]).to.have.members([1, 2, 3], 'nooo why fail??');
+ * expect([1, 2], 'nooo why fail??').to.have.members([1, 2, 3]);
*
* @name members
* @param {Array} set
- * @param {String} message _optional_
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
Assertion.addMethod('members', function (subset, msg) {
if (msg) flag(this, 'message', msg);
- var obj = flag(this, 'object');
+ var obj = flag(this, 'object')
+ , flagMsg = flag(this, 'message')
+ , ssfi = flag(this, 'ssfi');
- new Assertion(obj).to.be.an('array');
- new Assertion(subset).to.be.an('array');
+ new Assertion(obj, flagMsg, ssfi, true).to.be.an('array');
+ new Assertion(subset, flagMsg, ssfi, true).to.be.an('array');
- var cmp = flag(this, 'deep') ? _.eql : undefined;
+ var contains = flag(this, 'contains');
+ var ordered = flag(this, 'ordered');
- if (flag(this, 'contains')) {
- return this.assert(
- isSubsetOf(subset, obj, cmp)
- , 'expected #{this} to be a superset of #{act}'
- , 'expected #{this} to not be a superset of #{act}'
- , obj
- , subset
- );
+ var subject, failMsg, failNegateMsg;
+
+ if (contains) {
+ subject = ordered ? 'an ordered superset' : 'a superset';
+ failMsg = 'expected #{this} to be ' + subject + ' of #{exp}';
+ failNegateMsg = 'expected #{this} to not be ' + subject + ' of #{exp}';
+ } else {
+ subject = ordered ? 'ordered members' : 'members';
+ failMsg = 'expected #{this} to have the same ' + subject + ' as #{exp}';
+ failNegateMsg = 'expected #{this} to not have the same ' + subject + ' as #{exp}';
}
+ var cmp = flag(this, 'deep') ? _.eql : undefined;
+
this.assert(
- isSubsetOf(obj, subset, cmp) && isSubsetOf(subset, obj, cmp)
- , 'expected #{this} to have the same members as #{act}'
- , 'expected #{this} to not have the same members as #{act}'
- , obj
- , subset
+ isSubsetOf(subset, obj, cmp, contains, ordered)
+ , failMsg
+ , failNegateMsg
+ , subset
+ , obj
+ , true
);
});
/**
- * ### .oneOf(list)
+ * ### .oneOf(list[, msg])
+ *
+ * Asserts that the target is a member of the given array `list`. However,
+ * it's often best to assert that the target is equal to its expected value.
+ *
+ * expect(1).to.equal(1); // Recommended
+ * expect(1).to.be.oneOf([1, 2, 3]); // Not recommended
+ *
+ * Comparisons are performed using strict (`===`) equality.
*
- * Assert that a value appears somewhere in the top level of array `list`.
+ * Add `.not` earlier in the chain to negate `.oneOf`.
*
- * expect('a').to.be.oneOf(['a', 'b', 'c']);
- * expect(9).to.not.be.oneOf(['z']);
- * expect([3]).to.not.be.oneOf([1, 2, [3]]);
+ * expect(1).to.equal(1); // Recommended
+ * expect(1).to.not.be.oneOf([2, 3, 4]); // Not recommended
*
- * var three = [3];
- * // for object-types, contents are not compared
- * expect(three).to.not.be.oneOf([1, 2, [3]]);
- * // comparing references works
- * expect(three).to.be.oneOf([1, 2, three]);
+ * It can also be chained with `.contain` or `.include`, which will work with
+ * both arrays and strings:
+ *
+ * expect('Today is sunny').to.contain.oneOf(['sunny', 'cloudy'])
+ * expect('Today is rainy').to.not.contain.oneOf(['sunny', 'cloudy'])
+ * expect([1,2,3]).to.contain.oneOf([3,4,5])
+ * expect([1,2,3]).to.not.contain.oneOf([4,5,6])
+ *
+ * `.oneOf` accepts an optional `msg` argument which is a custom error message
+ * to show when the assertion fails. The message can also be given as the
+ * second argument to `expect`.
+ *
+ * expect(1).to.be.oneOf([2, 3, 4], 'nooo why fail??');
+ * expect(1, 'nooo why fail??').to.be.oneOf([2, 3, 4]);
*
* @name oneOf
* @param {Array<*>} list
- * @param {String} message _optional_
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
function oneOf (list, msg) {
if (msg) flag(this, 'message', msg);
- var expected = flag(this, 'object');
- new Assertion(list).to.be.an('array');
-
- this.assert(
- list.indexOf(expected) > -1
- , 'expected #{this} to be one of #{exp}'
- , 'expected #{this} to not be one of #{exp}'
- , list
- , expected
- );
+ var expected = flag(this, 'object')
+ , flagMsg = flag(this, 'message')
+ , ssfi = flag(this, 'ssfi')
+ , contains = flag(this, 'contains')
+ , isDeep = flag(this, 'deep');
+ new Assertion(list, flagMsg, ssfi, true).to.be.an('array');
+
+ if (contains) {
+ this.assert(
+ list.some(function(possibility) { return expected.indexOf(possibility) > -1 })
+ , 'expected #{this} to contain one of #{exp}'
+ , 'expected #{this} to not contain one of #{exp}'
+ , list
+ , expected
+ );
+ } else {
+ if (isDeep) {
+ this.assert(
+ list.some(function(possibility) { return _.eql(expected, possibility) })
+ , 'expected #{this} to deeply equal one of #{exp}'
+ , 'expected #{this} to deeply equal one of #{exp}'
+ , list
+ , expected
+ );
+ } else {
+ this.assert(
+ list.indexOf(expected) > -1
+ , 'expected #{this} to be one of #{exp}'
+ , 'expected #{this} to not be one of #{exp}'
+ , list
+ , expected
+ );
+ }
+ }
}
Assertion.addMethod('oneOf', oneOf);
-
/**
- * ### .change(function)
+ * ### .change(subject[, prop[, msg]])
*
- * Asserts that a function changes an object property
+ * When one argument is provided, `.change` asserts that the given function
+ * `subject` returns a different value when it's invoked before the target
+ * function compared to when it's invoked afterward. However, it's often best
+ * to assert that `subject` is equal to its expected value.
*
- * var obj = { val: 10 };
- * var fn = function() { obj.val += 3 };
- * var noChangeFn = function() { return 'foo' + 'bar'; }
- * expect(fn).to.change(obj, 'val');
- * expect(noChangeFn).to.not.change(obj, 'val')
+ * var dots = ''
+ * , addDot = function () { dots += '.'; }
+ * , getDots = function () { return dots; };
+ *
+ * // Recommended
+ * expect(getDots()).to.equal('');
+ * addDot();
+ * expect(getDots()).to.equal('.');
+ *
+ * // Not recommended
+ * expect(addDot).to.change(getDots);
+ *
+ * When two arguments are provided, `.change` asserts that the value of the
+ * given object `subject`'s `prop` property is different before invoking the
+ * target function compared to afterward.
+ *
+ * var myObj = {dots: ''}
+ * , addDot = function () { myObj.dots += '.'; };
+ *
+ * // Recommended
+ * expect(myObj).to.have.property('dots', '');
+ * addDot();
+ * expect(myObj).to.have.property('dots', '.');
+ *
+ * // Not recommended
+ * expect(addDot).to.change(myObj, 'dots');
+ *
+ * Strict (`===`) equality is used to compare before and after values.
+ *
+ * Add `.not` earlier in the chain to negate `.change`.
+ *
+ * var dots = ''
+ * , noop = function () {}
+ * , getDots = function () { return dots; };
+ *
+ * expect(noop).to.not.change(getDots);
+ *
+ * var myObj = {dots: ''}
+ * , noop = function () {};
+ *
+ * expect(noop).to.not.change(myObj, 'dots');
+ *
+ * `.change` accepts an optional `msg` argument which is a custom error
+ * message to show when the assertion fails. The message can also be given as
+ * the second argument to `expect`. When not providing two arguments, always
+ * use the second form.
+ *
+ * var myObj = {dots: ''}
+ * , addDot = function () { myObj.dots += '.'; };
+ *
+ * expect(addDot).to.not.change(myObj, 'dots', 'nooo why fail??');
+ *
+ * var dots = ''
+ * , addDot = function () { dots += '.'; }
+ * , getDots = function () { return dots; };
+ *
+ * expect(addDot, 'nooo why fail??').to.not.change(getDots);
+ *
+ * `.change` also causes all `.by` assertions that follow in the chain to
+ * assert how much a numeric subject was increased or decreased by. However,
+ * it's dangerous to use `.change.by`. The problem is that it creates
+ * uncertain expectations by asserting that the subject either increases by
+ * the given delta, or that it decreases by the given delta. It's often best
+ * to identify the exact output that's expected, and then write an assertion
+ * that only accepts that exact output.
+ *
+ * var myObj = {val: 1}
+ * , addTwo = function () { myObj.val += 2; }
+ * , subtractTwo = function () { myObj.val -= 2; };
+ *
+ * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended
+ * expect(addTwo).to.change(myObj, 'val').by(2); // Not recommended
+ *
+ * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended
+ * expect(subtractTwo).to.change(myObj, 'val').by(2); // Not recommended
+ *
+ * The alias `.changes` can be used interchangeably with `.change`.
*
* @name change
* @alias changes
- * @alias Change
- * @param {String} object
- * @param {String} property name
- * @param {String} message _optional_
+ * @param {String} subject
+ * @param {String} prop name _optional_
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
- function assertChanges (object, prop, msg) {
+ function assertChanges (subject, prop, msg) {
if (msg) flag(this, 'message', msg);
- var fn = flag(this, 'object');
- new Assertion(object, msg).to.have.property(prop);
- new Assertion(fn).is.a('function');
+ var fn = flag(this, 'object')
+ , flagMsg = flag(this, 'message')
+ , ssfi = flag(this, 'ssfi');
+ new Assertion(fn, flagMsg, ssfi, true).is.a('function');
+
+ var initial;
+ if (!prop) {
+ new Assertion(subject, flagMsg, ssfi, true).is.a('function');
+ initial = subject();
+ } else {
+ new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
+ initial = subject[prop];
+ }
- var initial = object[prop];
fn();
+ var final = prop === undefined || prop === null ? subject() : subject[prop];
+ var msgObj = prop === undefined || prop === null ? initial : '.' + prop;
+
+ // This gets flagged because of the .by(delta) assertion
+ flag(this, 'deltaMsgObj', msgObj);
+ flag(this, 'initialDeltaValue', initial);
+ flag(this, 'finalDeltaValue', final);
+ flag(this, 'deltaBehavior', 'change');
+ flag(this, 'realDelta', final !== initial);
+
this.assert(
- initial !== object[prop]
- , 'expected .' + prop + ' to change'
- , 'expected .' + prop + ' to not change'
+ initial !== final
+ , 'expected ' + msgObj + ' to change'
+ , 'expected ' + msgObj + ' to not change'
);
}
- Assertion.addChainableMethod('change', assertChanges);
- Assertion.addChainableMethod('changes', assertChanges);
+ Assertion.addMethod('change', assertChanges);
+ Assertion.addMethod('changes', assertChanges);
/**
- * ### .increase(function)
+ * ### .increase(subject[, prop[, msg]])
*
- * Asserts that a function increases an object property
+ * When one argument is provided, `.increase` asserts that the given function
+ * `subject` returns a greater number when it's invoked after invoking the
+ * target function compared to when it's invoked beforehand. `.increase` also
+ * causes all `.by` assertions that follow in the chain to assert how much
+ * greater of a number is returned. It's often best to assert that the return
+ * value increased by the expected amount, rather than asserting it increased
+ * by any amount.
*
- * var obj = { val: 10 };
- * var fn = function() { obj.val = 15 };
- * expect(fn).to.increase(obj, 'val');
+ * var val = 1
+ * , addTwo = function () { val += 2; }
+ * , getVal = function () { return val; };
+ *
+ * expect(addTwo).to.increase(getVal).by(2); // Recommended
+ * expect(addTwo).to.increase(getVal); // Not recommended
+ *
+ * When two arguments are provided, `.increase` asserts that the value of the
+ * given object `subject`'s `prop` property is greater after invoking the
+ * target function compared to beforehand.
+ *
+ * var myObj = {val: 1}
+ * , addTwo = function () { myObj.val += 2; };
+ *
+ * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended
+ * expect(addTwo).to.increase(myObj, 'val'); // Not recommended
+ *
+ * Add `.not` earlier in the chain to negate `.increase`. However, it's
+ * dangerous to do so. The problem is that it creates uncertain expectations
+ * by asserting that the subject either decreases, or that it stays the same.
+ * It's often best to identify the exact output that's expected, and then
+ * write an assertion that only accepts that exact output.
+ *
+ * When the subject is expected to decrease, it's often best to assert that it
+ * decreased by the expected amount.
+ *
+ * var myObj = {val: 1}
+ * , subtractTwo = function () { myObj.val -= 2; };
+ *
+ * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended
+ * expect(subtractTwo).to.not.increase(myObj, 'val'); // Not recommended
+ *
+ * When the subject is expected to stay the same, it's often best to assert
+ * exactly that.
+ *
+ * var myObj = {val: 1}
+ * , noop = function () {};
+ *
+ * expect(noop).to.not.change(myObj, 'val'); // Recommended
+ * expect(noop).to.not.increase(myObj, 'val'); // Not recommended
+ *
+ * `.increase` accepts an optional `msg` argument which is a custom error
+ * message to show when the assertion fails. The message can also be given as
+ * the second argument to `expect`. When not providing two arguments, always
+ * use the second form.
+ *
+ * var myObj = {val: 1}
+ * , noop = function () {};
+ *
+ * expect(noop).to.increase(myObj, 'val', 'nooo why fail??');
+ *
+ * var val = 1
+ * , noop = function () {}
+ * , getVal = function () { return val; };
+ *
+ * expect(noop, 'nooo why fail??').to.increase(getVal);
+ *
+ * The alias `.increases` can be used interchangeably with `.increase`.
*
* @name increase
* @alias increases
- * @alias Increase
- * @param {String} object
- * @param {String} property name
- * @param {String} message _optional_
+ * @param {String|Function} subject
+ * @param {String} prop name _optional_
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
- function assertIncreases (object, prop, msg) {
+ function assertIncreases (subject, prop, msg) {
if (msg) flag(this, 'message', msg);
- var fn = flag(this, 'object');
- new Assertion(object, msg).to.have.property(prop);
- new Assertion(fn).is.a('function');
+ var fn = flag(this, 'object')
+ , flagMsg = flag(this, 'message')
+ , ssfi = flag(this, 'ssfi');
+ new Assertion(fn, flagMsg, ssfi, true).is.a('function');
+
+ var initial;
+ if (!prop) {
+ new Assertion(subject, flagMsg, ssfi, true).is.a('function');
+ initial = subject();
+ } else {
+ new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
+ initial = subject[prop];
+ }
+
+ // Make sure that the target is a number
+ new Assertion(initial, flagMsg, ssfi, true).is.a('number');
- var initial = object[prop];
fn();
+ var final = prop === undefined || prop === null ? subject() : subject[prop];
+ var msgObj = prop === undefined || prop === null ? initial : '.' + prop;
+
+ flag(this, 'deltaMsgObj', msgObj);
+ flag(this, 'initialDeltaValue', initial);
+ flag(this, 'finalDeltaValue', final);
+ flag(this, 'deltaBehavior', 'increase');
+ flag(this, 'realDelta', final - initial);
+
this.assert(
- object[prop] - initial > 0
- , 'expected .' + prop + ' to increase'
- , 'expected .' + prop + ' to not increase'
+ final - initial > 0
+ , 'expected ' + msgObj + ' to increase'
+ , 'expected ' + msgObj + ' to not increase'
);
}
- Assertion.addChainableMethod('increase', assertIncreases);
- Assertion.addChainableMethod('increases', assertIncreases);
+ Assertion.addMethod('increase', assertIncreases);
+ Assertion.addMethod('increases', assertIncreases);
/**
- * ### .decrease(function)
+ * ### .decrease(subject[, prop[, msg]])
*
- * Asserts that a function decreases an object property
+ * When one argument is provided, `.decrease` asserts that the given function
+ * `subject` returns a lesser number when it's invoked after invoking the
+ * target function compared to when it's invoked beforehand. `.decrease` also
+ * causes all `.by` assertions that follow in the chain to assert how much
+ * lesser of a number is returned. It's often best to assert that the return
+ * value decreased by the expected amount, rather than asserting it decreased
+ * by any amount.
*
- * var obj = { val: 10 };
- * var fn = function() { obj.val = 5 };
- * expect(fn).to.decrease(obj, 'val');
+ * var val = 1
+ * , subtractTwo = function () { val -= 2; }
+ * , getVal = function () { return val; };
+ *
+ * expect(subtractTwo).to.decrease(getVal).by(2); // Recommended
+ * expect(subtractTwo).to.decrease(getVal); // Not recommended
+ *
+ * When two arguments are provided, `.decrease` asserts that the value of the
+ * given object `subject`'s `prop` property is lesser after invoking the
+ * target function compared to beforehand.
+ *
+ * var myObj = {val: 1}
+ * , subtractTwo = function () { myObj.val -= 2; };
+ *
+ * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended
+ * expect(subtractTwo).to.decrease(myObj, 'val'); // Not recommended
+ *
+ * Add `.not` earlier in the chain to negate `.decrease`. However, it's
+ * dangerous to do so. The problem is that it creates uncertain expectations
+ * by asserting that the subject either increases, or that it stays the same.
+ * It's often best to identify the exact output that's expected, and then
+ * write an assertion that only accepts that exact output.
+ *
+ * When the subject is expected to increase, it's often best to assert that it
+ * increased by the expected amount.
+ *
+ * var myObj = {val: 1}
+ * , addTwo = function () { myObj.val += 2; };
+ *
+ * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended
+ * expect(addTwo).to.not.decrease(myObj, 'val'); // Not recommended
+ *
+ * When the subject is expected to stay the same, it's often best to assert
+ * exactly that.
+ *
+ * var myObj = {val: 1}
+ * , noop = function () {};
+ *
+ * expect(noop).to.not.change(myObj, 'val'); // Recommended
+ * expect(noop).to.not.decrease(myObj, 'val'); // Not recommended
+ *
+ * `.decrease` accepts an optional `msg` argument which is a custom error
+ * message to show when the assertion fails. The message can also be given as
+ * the second argument to `expect`. When not providing two arguments, always
+ * use the second form.
+ *
+ * var myObj = {val: 1}
+ * , noop = function () {};
+ *
+ * expect(noop).to.decrease(myObj, 'val', 'nooo why fail??');
+ *
+ * var val = 1
+ * , noop = function () {}
+ * , getVal = function () { return val; };
+ *
+ * expect(noop, 'nooo why fail??').to.decrease(getVal);
+ *
+ * The alias `.decreases` can be used interchangeably with `.decrease`.
*
* @name decrease
* @alias decreases
- * @alias Decrease
- * @param {String} object
- * @param {String} property name
- * @param {String} message _optional_
+ * @param {String|Function} subject
+ * @param {String} prop name _optional_
+ * @param {String} msg _optional_
* @namespace BDD
* @api public
*/
- function assertDecreases (object, prop, msg) {
+ function assertDecreases (subject, prop, msg) {
if (msg) flag(this, 'message', msg);
- var fn = flag(this, 'object');
- new Assertion(object, msg).to.have.property(prop);
- new Assertion(fn).is.a('function');
+ var fn = flag(this, 'object')
+ , flagMsg = flag(this, 'message')
+ , ssfi = flag(this, 'ssfi');
+ new Assertion(fn, flagMsg, ssfi, true).is.a('function');
+
+ var initial;
+ if (!prop) {
+ new Assertion(subject, flagMsg, ssfi, true).is.a('function');
+ initial = subject();
+ } else {
+ new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
+ initial = subject[prop];
+ }
+
+ // Make sure that the target is a number
+ new Assertion(initial, flagMsg, ssfi, true).is.a('number');
- var initial = object[prop];
fn();
+ var final = prop === undefined || prop === null ? subject() : subject[prop];
+ var msgObj = prop === undefined || prop === null ? initial : '.' + prop;
+
+ flag(this, 'deltaMsgObj', msgObj);
+ flag(this, 'initialDeltaValue', initial);
+ flag(this, 'finalDeltaValue', final);
+ flag(this, 'deltaBehavior', 'decrease');
+ flag(this, 'realDelta', initial - final);
+
this.assert(
- object[prop] - initial < 0
- , 'expected .' + prop + ' to decrease'
- , 'expected .' + prop + ' to not decrease'
+ final - initial < 0
+ , 'expected ' + msgObj + ' to decrease'
+ , 'expected ' + msgObj + ' to not decrease'
);
}
- Assertion.addChainableMethod('decrease', assertDecreases);
- Assertion.addChainableMethod('decreases', assertDecreases);
+ Assertion.addMethod('decrease', assertDecreases);
+ Assertion.addMethod('decreases', assertDecreases);
/**
- * ### .extensible
+ * ### .by(delta[, msg])
*
- * Asserts that the target is extensible (can have new properties added to
- * it).
+ * When following an `.increase` assertion in the chain, `.by` asserts that
+ * the subject of the `.increase` assertion increased by the given `delta`.
*
- * var nonExtensibleObject = Object.preventExtensions({});
- * var sealedObject = Object.seal({});
- * var frozenObject = Object.freeze({});
+ * var myObj = {val: 1}
+ * , addTwo = function () { myObj.val += 2; };
*
- * expect({}).to.be.extensible;
- * expect(nonExtensibleObject).to.not.be.extensible;
- * expect(sealedObject).to.not.be.extensible;
- * expect(frozenObject).to.not.be.extensible;
+ * expect(addTwo).to.increase(myObj, 'val').by(2);
*
- * @name extensible
- * @namespace BDD
- * @api public
- */
-
+ * When following a `.decrease` assertion in the chain, `.by` asserts that the
+ * subject of the `.decrease` assertion decreased by the given `delta`.
+ *
+ * var myObj = {val: 1}
+ * , subtractTwo = function () { myObj.val -= 2; };
+ *
+ * expect(subtractTwo).to.decrease(myObj, 'val').by(2);
+ *
+ * When following a `.change` assertion in the chain, `.by` asserts that the
+ * subject of the `.change` assertion either increased or decreased by the
+ * given `delta`. However, it's dangerous to use `.change.by`. The problem is
+ * that it creates uncertain expectations. It's often best to identify the
+ * exact output that's expected, and then write an assertion that only accepts
+ * that exact output.
+ *
+ * var myObj = {val: 1}
+ * , addTwo = function () { myObj.val += 2; }
+ * , subtractTwo = function () { myObj.val -= 2; };
+ *
+ * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended
+ * expect(addTwo).to.change(myObj, 'val').by(2); // Not recommended
+ *
+ * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended
+ * expect(subtractTwo).to.change(myObj, 'val').by(2); // Not recommended
+ *
+ * Add `.not` earlier in the chain to negate `.by`. However, it's often best
+ * to assert that the subject changed by its expected delta, rather than
+ * asserting that it didn't change by one of countless unexpected deltas.
+ *
+ * var myObj = {val: 1}
+ * , addTwo = function () { myObj.val += 2; };
+ *
+ * // Recommended
+ * expect(addTwo).to.increase(myObj, 'val').by(2);
+ *
+ * // Not recommended
+ * expect(addTwo).to.increase(myObj, 'val').but.not.by(3);
+ *
+ * `.by` accepts an optional `msg` argument which is a custom error message to
+ * show when the assertion fails. The message can also be given as the second
+ * argument to `expect`.
+ *
+ * var myObj = {val: 1}
+ * , addTwo = function () { myObj.val += 2; };
+ *
+ * expect(addTwo).to.increase(myObj, 'val').by(3, 'nooo why fail??');
+ * expect(addTwo, 'nooo why fail??').to.increase(myObj, 'val').by(3);
+ *
+ * @name by
+ * @param {Number} delta
+ * @param {String} msg _optional_
+ * @namespace BDD
+ * @api public
+ */
+
+ function assertDelta(delta, msg) {
+ if (msg) flag(this, 'message', msg);
+
+ var msgObj = flag(this, 'deltaMsgObj');
+ var initial = flag(this, 'initialDeltaValue');
+ var final = flag(this, 'finalDeltaValue');
+ var behavior = flag(this, 'deltaBehavior');
+ var realDelta = flag(this, 'realDelta');
+
+ var expression;
+ if (behavior === 'change') {
+ expression = Math.abs(final - initial) === Math.abs(delta);
+ } else {
+ expression = realDelta === Math.abs(delta);
+ }
+
+ this.assert(
+ expression
+ , 'expected ' + msgObj + ' to ' + behavior + ' by ' + delta
+ , 'expected ' + msgObj + ' to not ' + behavior + ' by ' + delta
+ );
+ }
+
+ Assertion.addMethod('by', assertDelta);
+
+ /**
+ * ### .extensible
+ *
+ * Asserts that the target is extensible, which means that new properties can
+ * be added to it. Primitives are never extensible.
+ *
+ * expect({a: 1}).to.be.extensible;
+ *
+ * Add `.not` earlier in the chain to negate `.extensible`.
+ *
+ * var nonExtensibleObject = Object.preventExtensions({})
+ * , sealedObject = Object.seal({})
+ * , frozenObject = Object.freeze({});
+ *
+ * expect(nonExtensibleObject).to.not.be.extensible;
+ * expect(sealedObject).to.not.be.extensible;
+ * expect(frozenObject).to.not.be.extensible;
+ * expect(1).to.not.be.extensible;
+ *
+ * A custom error message can be given as the second argument to `expect`.
+ *
+ * expect(1, 'nooo why fail??').to.be.extensible;
+ *
+ * @name extensible
+ * @namespace BDD
+ * @api public
+ */
+
Assertion.addProperty('extensible', function() {
var obj = flag(this, 'object');
- // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.
+ // In ES5, if the argument to this method is a primitive, then it will cause a TypeError.
// In ES6, a non-object argument will be treated as if it was a non-extensible ordinary object, simply return false.
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible
- // The following provides ES6 behavior when a TypeError is thrown under ES5.
+ // The following provides ES6 behavior for ES5 environments.
- var isExtensible;
-
- try {
- isExtensible = Object.isExtensible(obj);
- } catch (err) {
- if (err instanceof TypeError) isExtensible = false;
- else throw err;
- }
+ var isExtensible = obj === Object(obj) && Object.isExtensible(obj);
this.assert(
isExtensible
@@ -2068,15 +4079,25 @@ module.exports = function (chai, _) {
/**
* ### .sealed
*
- * Asserts that the target is sealed (cannot have new properties added to it
- * and its existing properties cannot be removed).
+ * Asserts that the target is sealed, which means that new properties can't be
+ * added to it, and its existing properties can't be reconfigured or deleted.
+ * However, it's possible that its existing properties can still be reassigned
+ * to different values. Primitives are always sealed.
*
* var sealedObject = Object.seal({});
* var frozenObject = Object.freeze({});
*
* expect(sealedObject).to.be.sealed;
* expect(frozenObject).to.be.sealed;
- * expect({}).to.not.be.sealed;
+ * expect(1).to.be.sealed;
+ *
+ * Add `.not` earlier in the chain to negate `.sealed`.
+ *
+ * expect({a: 1}).to.not.be.sealed;
+ *
+ * A custom error message can be given as the second argument to `expect`.
+ *
+ * expect({a: 1}, 'nooo why fail??').to.be.sealed;
*
* @name sealed
* @namespace BDD
@@ -2086,19 +4107,12 @@ module.exports = function (chai, _) {
Assertion.addProperty('sealed', function() {
var obj = flag(this, 'object');
- // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.
+ // In ES5, if the argument to this method is a primitive, then it will cause a TypeError.
// In ES6, a non-object argument will be treated as if it was a sealed ordinary object, simply return true.
// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed
- // The following provides ES6 behavior when a TypeError is thrown under ES5.
-
- var isSealed;
+ // The following provides ES6 behavior for ES5 environments.
- try {
- isSealed = Object.isSealed(obj);
- } catch (err) {
- if (err instanceof TypeError) isSealed = true;
- else throw err;
- }
+ var isSealed = obj === Object(obj) ? Object.isSealed(obj) : true;
this.assert(
isSealed
@@ -2110,13 +4124,22 @@ module.exports = function (chai, _) {
/**
* ### .frozen
*
- * Asserts that the target is frozen (cannot have new properties added to it
- * and its existing properties cannot be modified).
+ * Asserts that the target is frozen, which means that new properties can't be
+ * added to it, and its existing properties can't be reassigned to different
+ * values, reconfigured, or deleted. Primitives are always frozen.
*
* var frozenObject = Object.freeze({});
*
* expect(frozenObject).to.be.frozen;
- * expect({}).to.not.be.frozen;
+ * expect(1).to.be.frozen;
+ *
+ * Add `.not` earlier in the chain to negate `.frozen`.
+ *
+ * expect({a: 1}).to.not.be.frozen;
+ *
+ * A custom error message can be given as the second argument to `expect`.
+ *
+ * expect({a: 1}, 'nooo why fail??').to.be.frozen;
*
* @name frozen
* @namespace BDD
@@ -2126,19 +4149,12 @@ module.exports = function (chai, _) {
Assertion.addProperty('frozen', function() {
var obj = flag(this, 'object');
- // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.
+ // In ES5, if the argument to this method is a primitive, then it will cause a TypeError.
// In ES6, a non-object argument will be treated as if it was a frozen ordinary object, simply return true.
// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen
- // The following provides ES6 behavior when a TypeError is thrown under ES5.
+ // The following provides ES6 behavior for ES5 environments.
- var isFrozen;
-
- try {
- isFrozen = Object.isFrozen(obj);
- } catch (err) {
- if (err instanceof TypeError) isFrozen = true;
- else throw err;
- }
+ var isFrozen = obj === Object(obj) ? Object.isFrozen(obj) : true;
this.assert(
isFrozen
@@ -2146,6 +4162,65 @@ module.exports = function (chai, _) {
, 'expected #{this} to not be frozen'
);
});
+
+ /**
+ * ### .finite
+ *
+ * Asserts that the target is a number, and isn't `NaN` or positive/negative
+ * `Infinity`.
+ *
+ * expect(1).to.be.finite;
+ *
+ * Add `.not` earlier in the chain to negate `.finite`. However, it's
+ * dangerous to do so. The problem is that it creates uncertain expectations
+ * by asserting that the subject either isn't a number, or that it's `NaN`, or
+ * that it's positive `Infinity`, or that it's negative `Infinity`. It's often
+ * best to identify the exact output that's expected, and then write an
+ * assertion that only accepts that exact output.
+ *
+ * When the target isn't expected to be a number, it's often best to assert
+ * that it's the expected type, rather than asserting that it isn't one of
+ * many unexpected types.
+ *
+ * expect('foo').to.be.a('string'); // Recommended
+ * expect('foo').to.not.be.finite; // Not recommended
+ *
+ * When the target is expected to be `NaN`, it's often best to assert exactly
+ * that.
+ *
+ * expect(NaN).to.be.NaN; // Recommended
+ * expect(NaN).to.not.be.finite; // Not recommended
+ *
+ * When the target is expected to be positive infinity, it's often best to
+ * assert exactly that.
+ *
+ * expect(Infinity).to.equal(Infinity); // Recommended
+ * expect(Infinity).to.not.be.finite; // Not recommended
+ *
+ * When the target is expected to be negative infinity, it's often best to
+ * assert exactly that.
+ *
+ * expect(-Infinity).to.equal(-Infinity); // Recommended
+ * expect(-Infinity).to.not.be.finite; // Not recommended
+ *
+ * A custom error message can be given as the second argument to `expect`.
+ *
+ * expect('foo', 'nooo why fail??').to.be.finite;
+ *
+ * @name finite
+ * @namespace BDD
+ * @api public
+ */
+
+ Assertion.addProperty('finite', function(msg) {
+ var obj = flag(this, 'object');
+
+ this.assert(
+ typeof obj === 'number' && isFinite(obj)
+ , 'expected #{this} to be a finite number'
+ , 'expected #{this} to not be a finite number'
+ );
+ });
};
},{}],6:[function(require,module,exports){
@@ -2155,9 +4230,7 @@ module.exports = function (chai, _) {
* MIT Licensed
*/
-
module.exports = function (chai, util) {
-
/*!
* Chai dependencies.
*/
@@ -2185,7 +4258,7 @@ module.exports = function (chai, util) {
*/
var assert = chai.assert = function (express, errmsg) {
- var test = new Assertion(null, null, chai.assert);
+ var test = new Assertion(null, null, chai.assert, true);
test.assert(
express
, errmsg
@@ -2194,10 +4267,18 @@ module.exports = function (chai, util) {
};
/**
+ * ### .fail([message])
* ### .fail(actual, expected, [message], [operator])
*
* Throw a failure. Node.js `assert` module-compatible.
*
+ * assert.fail();
+ * assert.fail("custom error message");
+ * assert.fail(1, 2);
+ * assert.fail(1, 2, "custom error message");
+ * assert.fail(1, 2, "custom error message", ">");
+ * assert.fail(1, 2, undefined, ">");
+ *
* @name fail
* @param {Mixed} actual
* @param {Mixed} expected
@@ -2208,6 +4289,13 @@ module.exports = function (chai, util) {
*/
assert.fail = function (actual, expected, message, operator) {
+ if (arguments.length < 2) {
+ // Comply with Node's fail([message]) interface
+
+ message = actual;
+ actual = undefined;
+ }
+
message = message || 'assert.fail()';
throw new chai.AssertionError(message, {
actual: actual
@@ -2233,7 +4321,7 @@ module.exports = function (chai, util) {
*/
assert.isOk = function (val, msg) {
- new Assertion(val, msg).is.ok;
+ new Assertion(val, msg, assert.isOk, true).is.ok;
};
/**
@@ -2253,7 +4341,7 @@ module.exports = function (chai, util) {
*/
assert.isNotOk = function (val, msg) {
- new Assertion(val, msg).is.not.ok;
+ new Assertion(val, msg, assert.isNotOk, true).is.not.ok;
};
/**
@@ -2272,7 +4360,7 @@ module.exports = function (chai, util) {
*/
assert.equal = function (act, exp, msg) {
- var test = new Assertion(act, msg, assert.equal);
+ var test = new Assertion(act, msg, assert.equal, true);
test.assert(
exp == flag(test, 'object')
@@ -2280,6 +4368,7 @@ module.exports = function (chai, util) {
, 'expected #{this} to not equal #{act}'
, exp
, act
+ , true
);
};
@@ -2299,7 +4388,7 @@ module.exports = function (chai, util) {
*/
assert.notEqual = function (act, exp, msg) {
- var test = new Assertion(act, msg, assert.notEqual);
+ var test = new Assertion(act, msg, assert.notEqual, true);
test.assert(
exp != flag(test, 'object')
@@ -2307,6 +4396,7 @@ module.exports = function (chai, util) {
, 'expected #{this} to equal #{act}'
, exp
, act
+ , true
);
};
@@ -2326,7 +4416,7 @@ module.exports = function (chai, util) {
*/
assert.strictEqual = function (act, exp, msg) {
- new Assertion(act, msg).to.equal(exp);
+ new Assertion(act, msg, assert.strictEqual, true).to.equal(exp);
};
/**
@@ -2345,7 +4435,7 @@ module.exports = function (chai, util) {
*/
assert.notStrictEqual = function (act, exp, msg) {
- new Assertion(act, msg).to.not.equal(exp);
+ new Assertion(act, msg, assert.notStrictEqual, true).to.not.equal(exp);
};
/**
@@ -2359,12 +4449,13 @@ module.exports = function (chai, util) {
* @param {Mixed} actual
* @param {Mixed} expected
* @param {String} message
+ * @alias deepStrictEqual
* @namespace Assert
* @api public
*/
- assert.deepEqual = function (act, exp, msg) {
- new Assertion(act, msg).to.eql(exp);
+ assert.deepEqual = assert.deepStrictEqual = function (act, exp, msg) {
+ new Assertion(act, msg, assert.deepEqual, true).to.eql(exp);
};
/**
@@ -2383,13 +4474,13 @@ module.exports = function (chai, util) {
*/
assert.notDeepEqual = function (act, exp, msg) {
- new Assertion(act, msg).to.not.eql(exp);
+ new Assertion(act, msg, assert.notDeepEqual, true).to.not.eql(exp);
};
/**
* ### .isAbove(valueToCheck, valueToBeAbove, [message])
*
- * Asserts `valueToCheck` is strictly greater than (>) `valueToBeAbove`
+ * Asserts `valueToCheck` is strictly greater than (>) `valueToBeAbove`.
*
* assert.isAbove(5, 2, '5 is strictly greater than 2');
*
@@ -2402,13 +4493,13 @@ module.exports = function (chai, util) {
*/
assert.isAbove = function (val, abv, msg) {
- new Assertion(val, msg).to.be.above(abv);
+ new Assertion(val, msg, assert.isAbove, true).to.be.above(abv);
};
/**
* ### .isAtLeast(valueToCheck, valueToBeAtLeast, [message])
*
- * Asserts `valueToCheck` is greater than or equal to (>=) `valueToBeAtLeast`
+ * Asserts `valueToCheck` is greater than or equal to (>=) `valueToBeAtLeast`.
*
* assert.isAtLeast(5, 2, '5 is greater or equal to 2');
* assert.isAtLeast(3, 3, '3 is greater or equal to 3');
@@ -2422,13 +4513,13 @@ module.exports = function (chai, util) {
*/
assert.isAtLeast = function (val, atlst, msg) {
- new Assertion(val, msg).to.be.least(atlst);
+ new Assertion(val, msg, assert.isAtLeast, true).to.be.least(atlst);
};
/**
* ### .isBelow(valueToCheck, valueToBeBelow, [message])
*
- * Asserts `valueToCheck` is strictly less than (<) `valueToBeBelow`
+ * Asserts `valueToCheck` is strictly less than (<) `valueToBeBelow`.
*
* assert.isBelow(3, 6, '3 is strictly less than 6');
*
@@ -2441,13 +4532,13 @@ module.exports = function (chai, util) {
*/
assert.isBelow = function (val, blw, msg) {
- new Assertion(val, msg).to.be.below(blw);
+ new Assertion(val, msg, assert.isBelow, true).to.be.below(blw);
};
/**
* ### .isAtMost(valueToCheck, valueToBeAtMost, [message])
*
- * Asserts `valueToCheck` is less than or equal to (<=) `valueToBeAtMost`
+ * Asserts `valueToCheck` is less than or equal to (<=) `valueToBeAtMost`.
*
* assert.isAtMost(3, 6, '3 is less than or equal to 6');
* assert.isAtMost(4, 4, '4 is less than or equal to 4');
@@ -2461,7 +4552,7 @@ module.exports = function (chai, util) {
*/
assert.isAtMost = function (val, atmst, msg) {
- new Assertion(val, msg).to.be.most(atmst);
+ new Assertion(val, msg, assert.isAtMost, true).to.be.most(atmst);
};
/**
@@ -2480,7 +4571,7 @@ module.exports = function (chai, util) {
*/
assert.isTrue = function (val, msg) {
- new Assertion(val, msg).is['true'];
+ new Assertion(val, msg, assert.isTrue, true).is['true'];
};
/**
@@ -2499,7 +4590,7 @@ module.exports = function (chai, util) {
*/
assert.isNotTrue = function (val, msg) {
- new Assertion(val, msg).to.not.equal(true);
+ new Assertion(val, msg, assert.isNotTrue, true).to.not.equal(true);
};
/**
@@ -2518,7 +4609,7 @@ module.exports = function (chai, util) {
*/
assert.isFalse = function (val, msg) {
- new Assertion(val, msg).is['false'];
+ new Assertion(val, msg, assert.isFalse, true).is['false'];
};
/**
@@ -2537,7 +4628,7 @@ module.exports = function (chai, util) {
*/
assert.isNotFalse = function (val, msg) {
- new Assertion(val, msg).to.not.equal(false);
+ new Assertion(val, msg, assert.isNotFalse, true).to.not.equal(false);
};
/**
@@ -2555,7 +4646,7 @@ module.exports = function (chai, util) {
*/
assert.isNull = function (val, msg) {
- new Assertion(val, msg).to.equal(null);
+ new Assertion(val, msg, assert.isNull, true).to.equal(null);
};
/**
@@ -2574,14 +4665,15 @@ module.exports = function (chai, util) {
*/
assert.isNotNull = function (val, msg) {
- new Assertion(val, msg).to.not.equal(null);
+ new Assertion(val, msg, assert.isNotNull, true).to.not.equal(null);
};
/**
* ### .isNaN
- * Asserts that value is NaN
*
- * assert.isNaN('foo', 'foo is NaN');
+ * Asserts that value is NaN.
+ *
+ * assert.isNaN(NaN, 'NaN is NaN');
*
* @name isNaN
* @param {Mixed} value
@@ -2591,14 +4683,15 @@ module.exports = function (chai, util) {
*/
assert.isNaN = function (val, msg) {
- new Assertion(val, msg).to.be.NaN;
+ new Assertion(val, msg, assert.isNaN, true).to.be.NaN;
};
/**
* ### .isNotNaN
- * Asserts that value is not NaN
*
- * assert.isNotNaN(4, '4 is not NaN');
+ * Asserts that value is not NaN.
+ *
+ * assert.isNotNaN(4, '4 is not NaN');
*
* @name isNotNaN
* @param {Mixed} value
@@ -2607,7 +4700,49 @@ module.exports = function (chai, util) {
* @api public
*/
assert.isNotNaN = function (val, msg) {
- new Assertion(val, msg).not.to.be.NaN;
+ new Assertion(val, msg, assert.isNotNaN, true).not.to.be.NaN;
+ };
+
+ /**
+ * ### .exists
+ *
+ * Asserts that the target is neither `null` nor `undefined`.
+ *
+ * var foo = 'hi';
+ *
+ * assert.exists(foo, 'foo is neither `null` nor `undefined`');
+ *
+ * @name exists
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.exists = function (val, msg) {
+ new Assertion(val, msg, assert.exists, true).to.exist;
+ };
+
+ /**
+ * ### .notExists
+ *
+ * Asserts that the target is either `null` or `undefined`.
+ *
+ * var bar = null
+ * , baz;
+ *
+ * assert.notExists(bar);
+ * assert.notExists(baz, 'baz is either null or undefined');
+ *
+ * @name notExists
+ * @param {Mixed} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.notExists = function (val, msg) {
+ new Assertion(val, msg, assert.notExists, true).to.not.exist;
};
/**
@@ -2626,7 +4761,7 @@ module.exports = function (chai, util) {
*/
assert.isUndefined = function (val, msg) {
- new Assertion(val, msg).to.equal(undefined);
+ new Assertion(val, msg, assert.isUndefined, true).to.equal(undefined);
};
/**
@@ -2645,7 +4780,7 @@ module.exports = function (chai, util) {
*/
assert.isDefined = function (val, msg) {
- new Assertion(val, msg).to.not.equal(undefined);
+ new Assertion(val, msg, assert.isDefined, true).to.not.equal(undefined);
};
/**
@@ -2664,7 +4799,7 @@ module.exports = function (chai, util) {
*/
assert.isFunction = function (val, msg) {
- new Assertion(val, msg).to.be.a('function');
+ new Assertion(val, msg, assert.isFunction, true).to.be.a('function');
};
/**
@@ -2683,7 +4818,7 @@ module.exports = function (chai, util) {
*/
assert.isNotFunction = function (val, msg) {
- new Assertion(val, msg).to.not.be.a('function');
+ new Assertion(val, msg, assert.isNotFunction, true).to.not.be.a('function');
};
/**
@@ -2703,7 +4838,7 @@ module.exports = function (chai, util) {
*/
assert.isObject = function (val, msg) {
- new Assertion(val, msg).to.be.a('object');
+ new Assertion(val, msg, assert.isObject, true).to.be.a('object');
};
/**
@@ -2723,7 +4858,7 @@ module.exports = function (chai, util) {
*/
assert.isNotObject = function (val, msg) {
- new Assertion(val, msg).to.not.be.a('object');
+ new Assertion(val, msg, assert.isNotObject, true).to.not.be.a('object');
};
/**
@@ -2742,7 +4877,7 @@ module.exports = function (chai, util) {
*/
assert.isArray = function (val, msg) {
- new Assertion(val, msg).to.be.an('array');
+ new Assertion(val, msg, assert.isArray, true).to.be.an('array');
};
/**
@@ -2761,7 +4896,7 @@ module.exports = function (chai, util) {
*/
assert.isNotArray = function (val, msg) {
- new Assertion(val, msg).to.not.be.an('array');
+ new Assertion(val, msg, assert.isNotArray, true).to.not.be.an('array');
};
/**
@@ -2780,7 +4915,7 @@ module.exports = function (chai, util) {
*/
assert.isString = function (val, msg) {
- new Assertion(val, msg).to.be.a('string');
+ new Assertion(val, msg, assert.isString, true).to.be.a('string');
};
/**
@@ -2799,7 +4934,7 @@ module.exports = function (chai, util) {
*/
assert.isNotString = function (val, msg) {
- new Assertion(val, msg).to.not.be.a('string');
+ new Assertion(val, msg, assert.isNotString, true).to.not.be.a('string');
};
/**
@@ -2818,7 +4953,7 @@ module.exports = function (chai, util) {
*/
assert.isNumber = function (val, msg) {
- new Assertion(val, msg).to.be.a('number');
+ new Assertion(val, msg, assert.isNumber, true).to.be.a('number');
};
/**
@@ -2837,7 +4972,28 @@ module.exports = function (chai, util) {
*/
assert.isNotNumber = function (val, msg) {
- new Assertion(val, msg).to.not.be.a('number');
+ new Assertion(val, msg, assert.isNotNumber, true).to.not.be.a('number');
+ };
+
+ /**
+ * ### .isFinite(value, [message])
+ *
+ * Asserts that `value` is a finite number. Unlike `.isNumber`, this will fail for `NaN` and `Infinity`.
+ *
+ * var cups = 2;
+ * assert.isFinite(cups, 'how many cups');
+ *
+ * assert.isFinite(NaN); // throws
+ *
+ * @name isFinite
+ * @param {Number} value
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isFinite = function (val, msg) {
+ new Assertion(val, msg, assert.isFinite, true).to.be.finite;
};
/**
@@ -2859,7 +5015,7 @@ module.exports = function (chai, util) {
*/
assert.isBoolean = function (val, msg) {
- new Assertion(val, msg).to.be.a('boolean');
+ new Assertion(val, msg, assert.isBoolean, true).to.be.a('boolean');
};
/**
@@ -2881,7 +5037,7 @@ module.exports = function (chai, util) {
*/
assert.isNotBoolean = function (val, msg) {
- new Assertion(val, msg).to.not.be.a('boolean');
+ new Assertion(val, msg, assert.isNotBoolean, true).to.not.be.a('boolean');
};
/**
@@ -2906,7 +5062,7 @@ module.exports = function (chai, util) {
*/
assert.typeOf = function (val, type, msg) {
- new Assertion(val, msg).to.be.a(type);
+ new Assertion(val, msg, assert.typeOf, true).to.be.a(type);
};
/**
@@ -2926,7 +5082,7 @@ module.exports = function (chai, util) {
*/
assert.notTypeOf = function (val, type, msg) {
- new Assertion(val, msg).to.not.be.a(type);
+ new Assertion(val, msg, assert.notTypeOf, true).to.not.be.a(type);
};
/**
@@ -2948,7 +5104,7 @@ module.exports = function (chai, util) {
*/
assert.instanceOf = function (val, type, msg) {
- new Assertion(val, msg).to.be.instanceOf(type);
+ new Assertion(val, msg, assert.instanceOf, true).to.be.instanceOf(type);
};
/**
@@ -2970,17 +5126,32 @@ module.exports = function (chai, util) {
*/
assert.notInstanceOf = function (val, type, msg) {
- new Assertion(val, msg).to.not.be.instanceOf(type);
+ new Assertion(val, msg, assert.notInstanceOf, true)
+ .to.not.be.instanceOf(type);
};
/**
* ### .include(haystack, needle, [message])
*
- * Asserts that `haystack` includes `needle`. Works
- * for strings and arrays.
+ * Asserts that `haystack` includes `needle`. Can be used to assert the
+ * inclusion of a value in an array, a substring in a string, or a subset of
+ * properties in an object.
+ *
+ * assert.include([1,2,3], 2, 'array contains value');
+ * assert.include('foobar', 'foo', 'string contains substring');
+ * assert.include({ foo: 'bar', hello: 'universe' }, { foo: 'bar' }, 'object contains property');
*
- * assert.include('foobar', 'bar', 'foobar contains string "bar"');
- * assert.include([ 1, 2, 3 ], 3, 'array contains value');
+ * Strict equality (===) is used. When asserting the inclusion of a value in
+ * an array, the array is searched for an element that's strictly equal to the
+ * given value. When asserting a subset of properties in an object, the object
+ * is searched for the given property keys, checking that each one is present
+ * and strictly equal to the given property value. For instance:
+ *
+ * var obj1 = {a: 1}
+ * , obj2 = {b: 2};
+ * assert.include([obj1, obj2], obj1);
+ * assert.include({foo: obj1, bar: obj2}, {foo: obj1});
+ * assert.include({foo: obj1, bar: obj2}, {foo: obj1, bar: obj2});
*
* @name include
* @param {Array|String} haystack
@@ -2991,17 +5162,32 @@ module.exports = function (chai, util) {
*/
assert.include = function (exp, inc, msg) {
- new Assertion(exp, msg, assert.include).include(inc);
+ new Assertion(exp, msg, assert.include, true).include(inc);
};
/**
* ### .notInclude(haystack, needle, [message])
*
- * Asserts that `haystack` does not include `needle`. Works
- * for strings and arrays.
+ * Asserts that `haystack` does not include `needle`. Can be used to assert
+ * the absence of a value in an array, a substring in a string, or a subset of
+ * properties in an object.
+ *
+ * assert.notInclude([1,2,3], 4, "array doesn't contain value");
+ * assert.notInclude('foobar', 'baz', "string doesn't contain substring");
+ * assert.notInclude({ foo: 'bar', hello: 'universe' }, { foo: 'baz' }, 'object doesn't contain property');
*
- * assert.notInclude('foobar', 'baz', 'string not include substring');
- * assert.notInclude([ 1, 2, 3 ], 4, 'array not include contain value');
+ * Strict equality (===) is used. When asserting the absence of a value in an
+ * array, the array is searched to confirm the absence of an element that's
+ * strictly equal to the given value. When asserting a subset of properties in
+ * an object, the object is searched to confirm that at least one of the given
+ * property keys is either not present or not strictly equal to the given
+ * property value. For instance:
+ *
+ * var obj1 = {a: 1}
+ * , obj2 = {b: 2};
+ * assert.notInclude([obj1, obj2], {a: 1});
+ * assert.notInclude({foo: obj1, bar: obj2}, {foo: {a: 1}});
+ * assert.notInclude({foo: obj1, bar: obj2}, {foo: obj1, bar: {b: 2}});
*
* @name notInclude
* @param {Array|String} haystack
@@ -3012,694 +5198,1997 @@ module.exports = function (chai, util) {
*/
assert.notInclude = function (exp, inc, msg) {
- new Assertion(exp, msg, assert.notInclude).not.include(inc);
+ new Assertion(exp, msg, assert.notInclude, true).not.include(inc);
};
/**
- * ### .match(value, regexp, [message])
+ * ### .deepInclude(haystack, needle, [message])
*
- * Asserts that `value` matches the regular expression `regexp`.
+ * Asserts that `haystack` includes `needle`. Can be used to assert the
+ * inclusion of a value in an array or a subset of properties in an object.
+ * Deep equality is used.
*
- * assert.match('foobar', /^foo/, 'regexp matches');
+ * var obj1 = {a: 1}
+ * , obj2 = {b: 2};
+ * assert.deepInclude([obj1, obj2], {a: 1});
+ * assert.deepInclude({foo: obj1, bar: obj2}, {foo: {a: 1}});
+ * assert.deepInclude({foo: obj1, bar: obj2}, {foo: {a: 1}, bar: {b: 2}});
*
- * @name match
- * @param {Mixed} value
- * @param {RegExp} regexp
+ * @name deepInclude
+ * @param {Array|String} haystack
+ * @param {Mixed} needle
* @param {String} message
* @namespace Assert
* @api public
*/
- assert.match = function (exp, re, msg) {
- new Assertion(exp, msg).to.match(re);
+ assert.deepInclude = function (exp, inc, msg) {
+ new Assertion(exp, msg, assert.deepInclude, true).deep.include(inc);
};
/**
- * ### .notMatch(value, regexp, [message])
+ * ### .notDeepInclude(haystack, needle, [message])
*
- * Asserts that `value` does not match the regular expression `regexp`.
+ * Asserts that `haystack` does not include `needle`. Can be used to assert
+ * the absence of a value in an array or a subset of properties in an object.
+ * Deep equality is used.
*
- * assert.notMatch('foobar', /^foo/, 'regexp does not match');
+ * var obj1 = {a: 1}
+ * , obj2 = {b: 2};
+ * assert.notDeepInclude([obj1, obj2], {a: 9});
+ * assert.notDeepInclude({foo: obj1, bar: obj2}, {foo: {a: 9}});
+ * assert.notDeepInclude({foo: obj1, bar: obj2}, {foo: {a: 1}, bar: {b: 9}});
*
- * @name notMatch
- * @param {Mixed} value
- * @param {RegExp} regexp
+ * @name notDeepInclude
+ * @param {Array|String} haystack
+ * @param {Mixed} needle
* @param {String} message
* @namespace Assert
* @api public
*/
- assert.notMatch = function (exp, re, msg) {
- new Assertion(exp, msg).to.not.match(re);
+ assert.notDeepInclude = function (exp, inc, msg) {
+ new Assertion(exp, msg, assert.notDeepInclude, true).not.deep.include(inc);
};
/**
- * ### .property(object, property, [message])
+ * ### .nestedInclude(haystack, needle, [message])
*
- * Asserts that `object` has a property named by `property`.
+ * Asserts that 'haystack' includes 'needle'.
+ * Can be used to assert the inclusion of a subset of properties in an
+ * object.
+ * Enables the use of dot- and bracket-notation for referencing nested
+ * properties.
+ * '[]' and '.' in property names can be escaped using double backslashes.
*
- * assert.property({ tea: { green: 'matcha' }}, 'tea');
+ * assert.nestedInclude({'.a': {'b': 'x'}}, {'\\.a.[b]': 'x'});
+ * assert.nestedInclude({'a': {'[b]': 'x'}}, {'a.\\[b\\]': 'x'});
*
- * @name property
- * @param {Object} object
- * @param {String} property
+ * @name nestedInclude
+ * @param {Object} haystack
+ * @param {Object} needle
* @param {String} message
* @namespace Assert
* @api public
*/
- assert.property = function (obj, prop, msg) {
- new Assertion(obj, msg).to.have.property(prop);
+ assert.nestedInclude = function (exp, inc, msg) {
+ new Assertion(exp, msg, assert.nestedInclude, true).nested.include(inc);
};
/**
- * ### .notProperty(object, property, [message])
+ * ### .notNestedInclude(haystack, needle, [message])
*
- * Asserts that `object` does _not_ have a property named by `property`.
+ * Asserts that 'haystack' does not include 'needle'.
+ * Can be used to assert the absence of a subset of properties in an
+ * object.
+ * Enables the use of dot- and bracket-notation for referencing nested
+ * properties.
+ * '[]' and '.' in property names can be escaped using double backslashes.
*
- * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee');
+ * assert.notNestedInclude({'.a': {'b': 'x'}}, {'\\.a.b': 'y'});
+ * assert.notNestedInclude({'a': {'[b]': 'x'}}, {'a.\\[b\\]': 'y'});
*
- * @name notProperty
- * @param {Object} object
- * @param {String} property
+ * @name notNestedInclude
+ * @param {Object} haystack
+ * @param {Object} needle
* @param {String} message
* @namespace Assert
* @api public
*/
- assert.notProperty = function (obj, prop, msg) {
- new Assertion(obj, msg).to.not.have.property(prop);
+ assert.notNestedInclude = function (exp, inc, msg) {
+ new Assertion(exp, msg, assert.notNestedInclude, true)
+ .not.nested.include(inc);
};
/**
- * ### .deepProperty(object, property, [message])
+ * ### .deepNestedInclude(haystack, needle, [message])
*
- * Asserts that `object` has a property named by `property`, which can be a
- * string using dot- and bracket-notation for deep reference.
+ * Asserts that 'haystack' includes 'needle'.
+ * Can be used to assert the inclusion of a subset of properties in an
+ * object while checking for deep equality.
+ * Enables the use of dot- and bracket-notation for referencing nested
+ * properties.
+ * '[]' and '.' in property names can be escaped using double backslashes.
*
- * assert.deepProperty({ tea: { green: 'matcha' }}, 'tea.green');
+ * assert.deepNestedInclude({a: {b: [{x: 1}]}}, {'a.b[0]': {x: 1}});
+ * assert.deepNestedInclude({'.a': {'[b]': {x: 1}}}, {'\\.a.\\[b\\]': {x: 1}});
*
- * @name deepProperty
- * @param {Object} object
- * @param {String} property
+ * @name deepNestedInclude
+ * @param {Object} haystack
+ * @param {Object} needle
* @param {String} message
* @namespace Assert
* @api public
*/
- assert.deepProperty = function (obj, prop, msg) {
- new Assertion(obj, msg).to.have.deep.property(prop);
+ assert.deepNestedInclude = function(exp, inc, msg) {
+ new Assertion(exp, msg, assert.deepNestedInclude, true)
+ .deep.nested.include(inc);
};
/**
- * ### .notDeepProperty(object, property, [message])
+ * ### .notDeepNestedInclude(haystack, needle, [message])
*
- * Asserts that `object` does _not_ have a property named by `property`, which
- * can be a string using dot- and bracket-notation for deep reference.
+ * Asserts that 'haystack' does not include 'needle'.
+ * Can be used to assert the absence of a subset of properties in an
+ * object while checking for deep equality.
+ * Enables the use of dot- and bracket-notation for referencing nested
+ * properties.
+ * '[]' and '.' in property names can be escaped using double backslashes.
*
- * assert.notDeepProperty({ tea: { green: 'matcha' }}, 'tea.oolong');
+ * assert.notDeepNestedInclude({a: {b: [{x: 1}]}}, {'a.b[0]': {y: 1}})
+ * assert.notDeepNestedInclude({'.a': {'[b]': {x: 1}}}, {'\\.a.\\[b\\]': {y: 2}});
*
- * @name notDeepProperty
- * @param {Object} object
- * @param {String} property
+ * @name notDeepNestedInclude
+ * @param {Object} haystack
+ * @param {Object} needle
* @param {String} message
* @namespace Assert
* @api public
*/
- assert.notDeepProperty = function (obj, prop, msg) {
- new Assertion(obj, msg).to.not.have.deep.property(prop);
+ assert.notDeepNestedInclude = function(exp, inc, msg) {
+ new Assertion(exp, msg, assert.notDeepNestedInclude, true)
+ .not.deep.nested.include(inc);
};
/**
- * ### .propertyVal(object, property, value, [message])
+ * ### .ownInclude(haystack, needle, [message])
*
- * Asserts that `object` has a property named by `property` with value given
- * by `value`.
+ * Asserts that 'haystack' includes 'needle'.
+ * Can be used to assert the inclusion of a subset of properties in an
+ * object while ignoring inherited properties.
*
- * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good');
+ * assert.ownInclude({ a: 1 }, { a: 1 });
*
- * @name propertyVal
- * @param {Object} object
- * @param {String} property
- * @param {Mixed} value
+ * @name ownInclude
+ * @param {Object} haystack
+ * @param {Object} needle
* @param {String} message
* @namespace Assert
* @api public
*/
- assert.propertyVal = function (obj, prop, val, msg) {
- new Assertion(obj, msg).to.have.property(prop, val);
+ assert.ownInclude = function(exp, inc, msg) {
+ new Assertion(exp, msg, assert.ownInclude, true).own.include(inc);
};
/**
- * ### .propertyNotVal(object, property, value, [message])
+ * ### .notOwnInclude(haystack, needle, [message])
*
- * Asserts that `object` has a property named by `property`, but with a value
- * different from that given by `value`.
+ * Asserts that 'haystack' includes 'needle'.
+ * Can be used to assert the absence of a subset of properties in an
+ * object while ignoring inherited properties.
*
- * assert.propertyNotVal({ tea: 'is good' }, 'tea', 'is bad');
+ * Object.prototype.b = 2;
*
- * @name propertyNotVal
- * @param {Object} object
- * @param {String} property
- * @param {Mixed} value
+ * assert.notOwnInclude({ a: 1 }, { b: 2 });
+ *
+ * @name notOwnInclude
+ * @param {Object} haystack
+ * @param {Object} needle
* @param {String} message
* @namespace Assert
* @api public
*/
- assert.propertyNotVal = function (obj, prop, val, msg) {
- new Assertion(obj, msg).to.not.have.property(prop, val);
+ assert.notOwnInclude = function(exp, inc, msg) {
+ new Assertion(exp, msg, assert.notOwnInclude, true).not.own.include(inc);
};
/**
- * ### .deepPropertyVal(object, property, value, [message])
+ * ### .deepOwnInclude(haystack, needle, [message])
*
- * Asserts that `object` has a property named by `property` with value given
- * by `value`. `property` can use dot- and bracket-notation for deep
- * reference.
+ * Asserts that 'haystack' includes 'needle'.
+ * Can be used to assert the inclusion of a subset of properties in an
+ * object while ignoring inherited properties and checking for deep equality.
*
- * assert.deepPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha');
+ * assert.deepOwnInclude({a: {b: 2}}, {a: {b: 2}});
*
- * @name deepPropertyVal
- * @param {Object} object
- * @param {String} property
- * @param {Mixed} value
+ * @name deepOwnInclude
+ * @param {Object} haystack
+ * @param {Object} needle
* @param {String} message
* @namespace Assert
* @api public
*/
- assert.deepPropertyVal = function (obj, prop, val, msg) {
- new Assertion(obj, msg).to.have.deep.property(prop, val);
+ assert.deepOwnInclude = function(exp, inc, msg) {
+ new Assertion(exp, msg, assert.deepOwnInclude, true)
+ .deep.own.include(inc);
};
- /**
- * ### .deepPropertyNotVal(object, property, value, [message])
+ /**
+ * ### .notDeepOwnInclude(haystack, needle, [message])
*
- * Asserts that `object` has a property named by `property`, but with a value
- * different from that given by `value`. `property` can use dot- and
- * bracket-notation for deep reference.
+ * Asserts that 'haystack' includes 'needle'.
+ * Can be used to assert the absence of a subset of properties in an
+ * object while ignoring inherited properties and checking for deep equality.
*
- * assert.deepPropertyNotVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha');
+ * assert.notDeepOwnInclude({a: {b: 2}}, {a: {c: 3}});
*
- * @name deepPropertyNotVal
- * @param {Object} object
- * @param {String} property
- * @param {Mixed} value
+ * @name notDeepOwnInclude
+ * @param {Object} haystack
+ * @param {Object} needle
* @param {String} message
* @namespace Assert
* @api public
*/
- assert.deepPropertyNotVal = function (obj, prop, val, msg) {
- new Assertion(obj, msg).to.not.have.deep.property(prop, val);
+ assert.notDeepOwnInclude = function(exp, inc, msg) {
+ new Assertion(exp, msg, assert.notDeepOwnInclude, true)
+ .not.deep.own.include(inc);
};
/**
- * ### .lengthOf(object, length, [message])
+ * ### .match(value, regexp, [message])
*
- * Asserts that `object` has a `length` property with the expected value.
+ * Asserts that `value` matches the regular expression `regexp`.
*
- * assert.lengthOf([1,2,3], 3, 'array has length of 3');
- * assert.lengthOf('foobar', 6, 'string has length of 6');
+ * assert.match('foobar', /^foo/, 'regexp matches');
*
- * @name lengthOf
- * @param {Mixed} object
- * @param {Number} length
+ * @name match
+ * @param {Mixed} value
+ * @param {RegExp} regexp
* @param {String} message
* @namespace Assert
* @api public
*/
- assert.lengthOf = function (exp, len, msg) {
- new Assertion(exp, msg).to.have.length(len);
+ assert.match = function (exp, re, msg) {
+ new Assertion(exp, msg, assert.match, true).to.match(re);
};
/**
- * ### .throws(function, [constructor/string/regexp], [string/regexp], [message])
+ * ### .notMatch(value, regexp, [message])
*
- * Asserts that `function` will throw an error that is an instance of
- * `constructor`, or alternately that it will throw an error with message
- * matching `regexp`.
+ * Asserts that `value` does not match the regular expression `regexp`.
*
- * assert.throws(fn, 'function throws a reference error');
- * assert.throws(fn, /function throws a reference error/);
- * assert.throws(fn, ReferenceError);
- * assert.throws(fn, ReferenceError, 'function throws a reference error');
- * assert.throws(fn, ReferenceError, /function throws a reference error/);
+ * assert.notMatch('foobar', /^foo/, 'regexp does not match');
*
- * @name throws
- * @alias throw
- * @alias Throw
- * @param {Function} function
- * @param {ErrorConstructor} constructor
+ * @name notMatch
+ * @param {Mixed} value
* @param {RegExp} regexp
* @param {String} message
- * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
* @namespace Assert
* @api public
*/
- assert.throws = function (fn, errt, errs, msg) {
- if ('string' === typeof errt || errt instanceof RegExp) {
- errs = errt;
- errt = null;
- }
-
- var assertErr = new Assertion(fn, msg).to.throw(errt, errs);
- return flag(assertErr, 'object');
+ assert.notMatch = function (exp, re, msg) {
+ new Assertion(exp, msg, assert.notMatch, true).to.not.match(re);
};
/**
- * ### .doesNotThrow(function, [constructor/regexp], [message])
+ * ### .property(object, property, [message])
*
- * Asserts that `function` will _not_ throw an error that is an instance of
- * `constructor`, or alternately that it will not throw an error with message
- * matching `regexp`.
+ * Asserts that `object` has a direct or inherited property named by
+ * `property`.
*
- * assert.doesNotThrow(fn, Error, 'function does not throw');
+ * assert.property({ tea: { green: 'matcha' }}, 'tea');
+ * assert.property({ tea: { green: 'matcha' }}, 'toString');
*
- * @name doesNotThrow
- * @param {Function} function
- * @param {ErrorConstructor} constructor
- * @param {RegExp} regexp
+ * @name property
+ * @param {Object} object
+ * @param {String} property
* @param {String} message
- * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
* @namespace Assert
* @api public
*/
- assert.doesNotThrow = function (fn, type, msg) {
- if ('string' === typeof type) {
- msg = type;
- type = null;
- }
-
- new Assertion(fn, msg).to.not.Throw(type);
+ assert.property = function (obj, prop, msg) {
+ new Assertion(obj, msg, assert.property, true).to.have.property(prop);
};
/**
- * ### .operator(val1, operator, val2, [message])
+ * ### .notProperty(object, property, [message])
*
- * Compares two values using `operator`.
+ * Asserts that `object` does _not_ have a direct or inherited property named
+ * by `property`.
*
- * assert.operator(1, '<', 2, 'everything is ok');
- * assert.operator(1, '>', 2, 'this will fail');
+ * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee');
*
- * @name operator
- * @param {Mixed} val1
- * @param {String} operator
- * @param {Mixed} val2
+ * @name notProperty
+ * @param {Object} object
+ * @param {String} property
* @param {String} message
* @namespace Assert
* @api public
*/
- assert.operator = function (val, operator, val2, msg) {
- var ok;
- switch(operator) {
- case '==':
- ok = val == val2;
- break;
- case '===':
- ok = val === val2;
- break;
- case '>':
- ok = val > val2;
- break;
- case '>=':
- ok = val >= val2;
- break;
- case '<':
- ok = val < val2;
- break;
- case '<=':
- ok = val <= val2;
- break;
- case '!=':
- ok = val != val2;
- break;
- case '!==':
- ok = val !== val2;
- break;
- default:
- throw new Error('Invalid operator "' + operator + '"');
- }
- var test = new Assertion(ok, msg);
- test.assert(
- true === flag(test, 'object')
- , 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2)
- , 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2) );
+ assert.notProperty = function (obj, prop, msg) {
+ new Assertion(obj, msg, assert.notProperty, true)
+ .to.not.have.property(prop);
};
/**
- * ### .closeTo(actual, expected, delta, [message])
+ * ### .propertyVal(object, property, value, [message])
*
- * Asserts that the target is equal `expected`, to within a +/- `delta` range.
+ * Asserts that `object` has a direct or inherited property named by
+ * `property` with a value given by `value`. Uses a strict equality check
+ * (===).
*
- * assert.closeTo(1.5, 1, 0.5, 'numbers are close');
+ * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good');
*
- * @name closeTo
- * @param {Number} actual
- * @param {Number} expected
- * @param {Number} delta
+ * @name propertyVal
+ * @param {Object} object
+ * @param {String} property
+ * @param {Mixed} value
* @param {String} message
* @namespace Assert
* @api public
*/
- assert.closeTo = function (act, exp, delta, msg) {
- new Assertion(act, msg).to.be.closeTo(exp, delta);
+ assert.propertyVal = function (obj, prop, val, msg) {
+ new Assertion(obj, msg, assert.propertyVal, true)
+ .to.have.property(prop, val);
};
/**
- * ### .approximately(actual, expected, delta, [message])
+ * ### .notPropertyVal(object, property, value, [message])
*
- * Asserts that the target is equal `expected`, to within a +/- `delta` range.
+ * Asserts that `object` does _not_ have a direct or inherited property named
+ * by `property` with value given by `value`. Uses a strict equality check
+ * (===).
*
- * assert.approximately(1.5, 1, 0.5, 'numbers are close');
+ * assert.notPropertyVal({ tea: 'is good' }, 'tea', 'is bad');
+ * assert.notPropertyVal({ tea: 'is good' }, 'coffee', 'is good');
*
- * @name approximately
- * @param {Number} actual
- * @param {Number} expected
- * @param {Number} delta
+ * @name notPropertyVal
+ * @param {Object} object
+ * @param {String} property
+ * @param {Mixed} value
* @param {String} message
* @namespace Assert
* @api public
*/
- assert.approximately = function (act, exp, delta, msg) {
- new Assertion(act, msg).to.be.approximately(exp, delta);
+ assert.notPropertyVal = function (obj, prop, val, msg) {
+ new Assertion(obj, msg, assert.notPropertyVal, true)
+ .to.not.have.property(prop, val);
};
/**
- * ### .sameMembers(set1, set2, [message])
+ * ### .deepPropertyVal(object, property, value, [message])
*
- * Asserts that `set1` and `set2` have the same members.
- * Order is not taken into account.
+ * Asserts that `object` has a direct or inherited property named by
+ * `property` with a value given by `value`. Uses a deep equality check.
*
- * assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members');
+ * assert.deepPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'matcha' });
*
- * @name sameMembers
- * @param {Array} set1
- * @param {Array} set2
+ * @name deepPropertyVal
+ * @param {Object} object
+ * @param {String} property
+ * @param {Mixed} value
* @param {String} message
* @namespace Assert
* @api public
*/
- assert.sameMembers = function (set1, set2, msg) {
- new Assertion(set1, msg).to.have.same.members(set2);
- }
+ assert.deepPropertyVal = function (obj, prop, val, msg) {
+ new Assertion(obj, msg, assert.deepPropertyVal, true)
+ .to.have.deep.property(prop, val);
+ };
/**
- * ### .sameDeepMembers(set1, set2, [message])
+ * ### .notDeepPropertyVal(object, property, value, [message])
*
- * Asserts that `set1` and `set2` have the same members - using a deep equality checking.
- * Order is not taken into account.
+ * Asserts that `object` does _not_ have a direct or inherited property named
+ * by `property` with value given by `value`. Uses a deep equality check.
*
- * assert.sameDeepMembers([ {b: 3}, {a: 2}, {c: 5} ], [ {c: 5}, {b: 3}, {a: 2} ], 'same deep members');
+ * assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'tea', { black: 'matcha' });
+ * assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'oolong' });
+ * assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'coffee', { green: 'matcha' });
*
- * @name sameDeepMembers
- * @param {Array} set1
- * @param {Array} set2
+ * @name notDeepPropertyVal
+ * @param {Object} object
+ * @param {String} property
+ * @param {Mixed} value
* @param {String} message
* @namespace Assert
* @api public
*/
- assert.sameDeepMembers = function (set1, set2, msg) {
- new Assertion(set1, msg).to.have.same.deep.members(set2);
- }
+ assert.notDeepPropertyVal = function (obj, prop, val, msg) {
+ new Assertion(obj, msg, assert.notDeepPropertyVal, true)
+ .to.not.have.deep.property(prop, val);
+ };
/**
- * ### .includeMembers(superset, subset, [message])
+ * ### .ownProperty(object, property, [message])
*
- * Asserts that `subset` is included in `superset`.
- * Order is not taken into account.
+ * Asserts that `object` has a direct property named by `property`. Inherited
+ * properties aren't checked.
*
- * assert.includeMembers([ 1, 2, 3 ], [ 2, 1 ], 'include members');
+ * assert.ownProperty({ tea: { green: 'matcha' }}, 'tea');
*
- * @name includeMembers
- * @param {Array} superset
- * @param {Array} subset
+ * @name ownProperty
+ * @param {Object} object
+ * @param {String} property
* @param {String} message
- * @namespace Assert
* @api public
*/
- assert.includeMembers = function (superset, subset, msg) {
- new Assertion(superset, msg).to.include.members(subset);
- }
+ assert.ownProperty = function (obj, prop, msg) {
+ new Assertion(obj, msg, assert.ownProperty, true)
+ .to.have.own.property(prop);
+ };
/**
- * ### .includeDeepMembers(superset, subset, [message])
+ * ### .notOwnProperty(object, property, [message])
*
- * Asserts that `subset` is included in `superset` - using deep equality checking.
- * Order is not taken into account.
- * Duplicates are ignored.
+ * Asserts that `object` does _not_ have a direct property named by
+ * `property`. Inherited properties aren't checked.
*
- * assert.includeDeepMembers([ {a: 1}, {b: 2}, {c: 3} ], [ {b: 2}, {a: 1}, {b: 2} ], 'include deep members');
+ * assert.notOwnProperty({ tea: { green: 'matcha' }}, 'coffee');
+ * assert.notOwnProperty({}, 'toString');
*
- * @name includeDeepMembers
- * @param {Array} superset
- * @param {Array} subset
+ * @name notOwnProperty
+ * @param {Object} object
+ * @param {String} property
* @param {String} message
- * @namespace Assert
* @api public
*/
- assert.includeDeepMembers = function (superset, subset, msg) {
- new Assertion(superset, msg).to.include.deep.members(subset);
- }
+ assert.notOwnProperty = function (obj, prop, msg) {
+ new Assertion(obj, msg, assert.notOwnProperty, true)
+ .to.not.have.own.property(prop);
+ };
/**
- * ### .oneOf(inList, list, [message])
+ * ### .ownPropertyVal(object, property, value, [message])
*
- * Asserts that non-object, non-array value `inList` appears in the flat array `list`.
+ * Asserts that `object` has a direct property named by `property` and a value
+ * equal to the provided `value`. Uses a strict equality check (===).
+ * Inherited properties aren't checked.
*
- * assert.oneOf(1, [ 2, 1 ], 'Not found in list');
+ * assert.ownPropertyVal({ coffee: 'is good'}, 'coffee', 'is good');
*
- * @name oneOf
- * @param {*} inList
- * @param {Array<*>} list
+ * @name ownPropertyVal
+ * @param {Object} object
+ * @param {String} property
+ * @param {Mixed} value
* @param {String} message
- * @namespace Assert
* @api public
*/
- assert.oneOf = function (inList, list, msg) {
- new Assertion(inList, msg).to.be.oneOf(list);
- }
+ assert.ownPropertyVal = function (obj, prop, value, msg) {
+ new Assertion(obj, msg, assert.ownPropertyVal, true)
+ .to.have.own.property(prop, value);
+ };
- /**
- * ### .changes(function, object, property)
+ /**
+ * ### .notOwnPropertyVal(object, property, value, [message])
*
- * Asserts that a function changes the value of a property
+ * Asserts that `object` does _not_ have a direct property named by `property`
+ * with a value equal to the provided `value`. Uses a strict equality check
+ * (===). Inherited properties aren't checked.
*
- * var obj = { val: 10 };
- * var fn = function() { obj.val = 22 };
- * assert.changes(fn, obj, 'val');
+ * assert.notOwnPropertyVal({ tea: 'is better'}, 'tea', 'is worse');
+ * assert.notOwnPropertyVal({}, 'toString', Object.prototype.toString);
*
- * @name changes
- * @param {Function} modifier function
+ * @name notOwnPropertyVal
* @param {Object} object
- * @param {String} property name
- * @param {String} message _optional_
- * @namespace Assert
+ * @param {String} property
+ * @param {Mixed} value
+ * @param {String} message
* @api public
*/
- assert.changes = function (fn, obj, prop) {
- new Assertion(fn).to.change(obj, prop);
- }
+ assert.notOwnPropertyVal = function (obj, prop, value, msg) {
+ new Assertion(obj, msg, assert.notOwnPropertyVal, true)
+ .to.not.have.own.property(prop, value);
+ };
- /**
- * ### .doesNotChange(function, object, property)
+ /**
+ * ### .deepOwnPropertyVal(object, property, value, [message])
*
- * Asserts that a function does not changes the value of a property
+ * Asserts that `object` has a direct property named by `property` and a value
+ * equal to the provided `value`. Uses a deep equality check. Inherited
+ * properties aren't checked.
*
- * var obj = { val: 10 };
- * var fn = function() { console.log('foo'); };
- * assert.doesNotChange(fn, obj, 'val');
+ * assert.deepOwnPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'matcha' });
*
- * @name doesNotChange
- * @param {Function} modifier function
+ * @name deepOwnPropertyVal
* @param {Object} object
- * @param {String} property name
- * @param {String} message _optional_
- * @namespace Assert
+ * @param {String} property
+ * @param {Mixed} value
+ * @param {String} message
* @api public
*/
- assert.doesNotChange = function (fn, obj, prop) {
- new Assertion(fn).to.not.change(obj, prop);
- }
+ assert.deepOwnPropertyVal = function (obj, prop, value, msg) {
+ new Assertion(obj, msg, assert.deepOwnPropertyVal, true)
+ .to.have.deep.own.property(prop, value);
+ };
- /**
- * ### .increases(function, object, property)
+ /**
+ * ### .notDeepOwnPropertyVal(object, property, value, [message])
*
- * Asserts that a function increases an object property
+ * Asserts that `object` does _not_ have a direct property named by `property`
+ * with a value equal to the provided `value`. Uses a deep equality check.
+ * Inherited properties aren't checked.
*
- * var obj = { val: 10 };
- * var fn = function() { obj.val = 13 };
- * assert.increases(fn, obj, 'val');
+ * assert.notDeepOwnPropertyVal({ tea: { green: 'matcha' } }, 'tea', { black: 'matcha' });
+ * assert.notDeepOwnPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'oolong' });
+ * assert.notDeepOwnPropertyVal({ tea: { green: 'matcha' } }, 'coffee', { green: 'matcha' });
+ * assert.notDeepOwnPropertyVal({}, 'toString', Object.prototype.toString);
*
- * @name increases
- * @param {Function} modifier function
+ * @name notDeepOwnPropertyVal
* @param {Object} object
- * @param {String} property name
- * @param {String} message _optional_
- * @namespace Assert
+ * @param {String} property
+ * @param {Mixed} value
+ * @param {String} message
* @api public
*/
- assert.increases = function (fn, obj, prop) {
- new Assertion(fn).to.increase(obj, prop);
- }
+ assert.notDeepOwnPropertyVal = function (obj, prop, value, msg) {
+ new Assertion(obj, msg, assert.notDeepOwnPropertyVal, true)
+ .to.not.have.deep.own.property(prop, value);
+ };
- /**
- * ### .doesNotIncrease(function, object, property)
+ /**
+ * ### .nestedProperty(object, property, [message])
*
- * Asserts that a function does not increase object property
+ * Asserts that `object` has a direct or inherited property named by
+ * `property`, which can be a string using dot- and bracket-notation for
+ * nested reference.
*
- * var obj = { val: 10 };
- * var fn = function() { obj.val = 8 };
- * assert.doesNotIncrease(fn, obj, 'val');
+ * assert.nestedProperty({ tea: { green: 'matcha' }}, 'tea.green');
*
- * @name doesNotIncrease
- * @param {Function} modifier function
+ * @name nestedProperty
* @param {Object} object
- * @param {String} property name
- * @param {String} message _optional_
+ * @param {String} property
+ * @param {String} message
* @namespace Assert
* @api public
*/
- assert.doesNotIncrease = function (fn, obj, prop) {
- new Assertion(fn).to.not.increase(obj, prop);
- }
+ assert.nestedProperty = function (obj, prop, msg) {
+ new Assertion(obj, msg, assert.nestedProperty, true)
+ .to.have.nested.property(prop);
+ };
- /**
- * ### .decreases(function, object, property)
+ /**
+ * ### .notNestedProperty(object, property, [message])
*
- * Asserts that a function decreases an object property
+ * Asserts that `object` does _not_ have a property named by `property`, which
+ * can be a string using dot- and bracket-notation for nested reference. The
+ * property cannot exist on the object nor anywhere in its prototype chain.
*
- * var obj = { val: 10 };
- * var fn = function() { obj.val = 5 };
- * assert.decreases(fn, obj, 'val');
+ * assert.notNestedProperty({ tea: { green: 'matcha' }}, 'tea.oolong');
*
- * @name decreases
- * @param {Function} modifier function
+ * @name notNestedProperty
* @param {Object} object
- * @param {String} property name
- * @param {String} message _optional_
+ * @param {String} property
+ * @param {String} message
* @namespace Assert
* @api public
*/
- assert.decreases = function (fn, obj, prop) {
- new Assertion(fn).to.decrease(obj, prop);
- }
+ assert.notNestedProperty = function (obj, prop, msg) {
+ new Assertion(obj, msg, assert.notNestedProperty, true)
+ .to.not.have.nested.property(prop);
+ };
- /**
- * ### .doesNotDecrease(function, object, property)
+ /**
+ * ### .nestedPropertyVal(object, property, value, [message])
*
- * Asserts that a function does not decreases an object property
+ * Asserts that `object` has a property named by `property` with value given
+ * by `value`. `property` can use dot- and bracket-notation for nested
+ * reference. Uses a strict equality check (===).
*
- * var obj = { val: 10 };
- * var fn = function() { obj.val = 15 };
- * assert.doesNotDecrease(fn, obj, 'val');
+ * assert.nestedPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha');
*
- * @name doesNotDecrease
- * @param {Function} modifier function
+ * @name nestedPropertyVal
* @param {Object} object
- * @param {String} property name
- * @param {String} message _optional_
+ * @param {String} property
+ * @param {Mixed} value
+ * @param {String} message
* @namespace Assert
* @api public
*/
- assert.doesNotDecrease = function (fn, obj, prop) {
- new Assertion(fn).to.not.decrease(obj, prop);
- }
+ assert.nestedPropertyVal = function (obj, prop, val, msg) {
+ new Assertion(obj, msg, assert.nestedPropertyVal, true)
+ .to.have.nested.property(prop, val);
+ };
- /*!
- * ### .ifError(object)
+ /**
+ * ### .notNestedPropertyVal(object, property, value, [message])
*
- * Asserts if value is not a false value, and throws if it is a true value.
- * This is added to allow for chai to be a drop-in replacement for Node's
- * assert class.
+ * Asserts that `object` does _not_ have a property named by `property` with
+ * value given by `value`. `property` can use dot- and bracket-notation for
+ * nested reference. Uses a strict equality check (===).
*
- * var err = new Error('I am a custom error');
- * assert.ifError(err); // Rethrows err!
+ * assert.notNestedPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha');
+ * assert.notNestedPropertyVal({ tea: { green: 'matcha' }}, 'coffee.green', 'matcha');
*
- * @name ifError
+ * @name notNestedPropertyVal
* @param {Object} object
+ * @param {String} property
+ * @param {Mixed} value
+ * @param {String} message
* @namespace Assert
* @api public
*/
- assert.ifError = function (val) {
- if (val) {
- throw(val);
- }
+ assert.notNestedPropertyVal = function (obj, prop, val, msg) {
+ new Assertion(obj, msg, assert.notNestedPropertyVal, true)
+ .to.not.have.nested.property(prop, val);
};
/**
- * ### .isExtensible(object)
+ * ### .deepNestedPropertyVal(object, property, value, [message])
*
- * Asserts that `object` is extensible (can have new properties added to it).
+ * Asserts that `object` has a property named by `property` with a value given
+ * by `value`. `property` can use dot- and bracket-notation for nested
+ * reference. Uses a deep equality check.
*
- * assert.isExtensible({});
+ * assert.deepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.green', { matcha: 'yum' });
*
- * @name isExtensible
- * @alias extensible
+ * @name deepNestedPropertyVal
* @param {Object} object
- * @param {String} message _optional_
+ * @param {String} property
+ * @param {Mixed} value
+ * @param {String} message
* @namespace Assert
* @api public
*/
- assert.isExtensible = function (obj, msg) {
- new Assertion(obj, msg).to.be.extensible;
+ assert.deepNestedPropertyVal = function (obj, prop, val, msg) {
+ new Assertion(obj, msg, assert.deepNestedPropertyVal, true)
+ .to.have.deep.nested.property(prop, val);
};
/**
- * ### .isNotExtensible(object)
+ * ### .notDeepNestedPropertyVal(object, property, value, [message])
*
- * Asserts that `object` is _not_ extensible.
- *
- * var nonExtensibleObject = Object.preventExtensions({});
- * var sealedObject = Object.seal({});
- * var frozenObject = Object.freese({});
+ * Asserts that `object` does _not_ have a property named by `property` with
+ * value given by `value`. `property` can use dot- and bracket-notation for
+ * nested reference. Uses a deep equality check.
*
- * assert.isNotExtensible(nonExtensibleObject);
- * assert.isNotExtensible(sealedObject);
- * assert.isNotExtensible(frozenObject);
+ * assert.notDeepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.green', { oolong: 'yum' });
+ * assert.notDeepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.green', { matcha: 'yuck' });
+ * assert.notDeepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.black', { matcha: 'yum' });
*
- * @name isNotExtensible
- * @alias notExtensible
+ * @name notDeepNestedPropertyVal
* @param {Object} object
- * @param {String} message _optional_
+ * @param {String} property
+ * @param {Mixed} value
+ * @param {String} message
* @namespace Assert
* @api public
*/
- assert.isNotExtensible = function (obj, msg) {
- new Assertion(obj, msg).to.not.be.extensible;
- };
+ assert.notDeepNestedPropertyVal = function (obj, prop, val, msg) {
+ new Assertion(obj, msg, assert.notDeepNestedPropertyVal, true)
+ .to.not.have.deep.nested.property(prop, val);
+ }
/**
- * ### .isSealed(object)
+ * ### .lengthOf(object, length, [message])
*
- * Asserts that `object` is sealed (cannot have new properties added to it
- * and its existing properties cannot be removed).
+ * Asserts that `object` has a `length` or `size` with the expected value.
*
- * var sealedObject = Object.seal({});
- * var frozenObject = Object.seal({});
+ * assert.lengthOf([1,2,3], 3, 'array has length of 3');
+ * assert.lengthOf('foobar', 6, 'string has length of 6');
+ * assert.lengthOf(new Set([1,2,3]), 3, 'set has size of 3');
+ * assert.lengthOf(new Map([['a',1],['b',2],['c',3]]), 3, 'map has size of 3');
+ *
+ * @name lengthOf
+ * @param {Mixed} object
+ * @param {Number} length
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.lengthOf = function (exp, len, msg) {
+ new Assertion(exp, msg, assert.lengthOf, true).to.have.lengthOf(len);
+ };
+
+ /**
+ * ### .hasAnyKeys(object, [keys], [message])
+ *
+ * Asserts that `object` has at least one of the `keys` provided.
+ * You can also provide a single object instead of a `keys` array and its keys
+ * will be used as the expected set of keys.
+ *
+ * assert.hasAnyKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'iDontExist', 'baz']);
+ * assert.hasAnyKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, iDontExist: 99, baz: 1337});
+ * assert.hasAnyKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}, 'key']);
+ * assert.hasAnyKeys(new Set([{foo: 'bar'}, 'anotherKey']), [{foo: 'bar'}, 'anotherKey']);
+ *
+ * @name hasAnyKeys
+ * @param {Mixed} object
+ * @param {Array|Object} keys
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.hasAnyKeys = function (obj, keys, msg) {
+ new Assertion(obj, msg, assert.hasAnyKeys, true).to.have.any.keys(keys);
+ }
+
+ /**
+ * ### .hasAllKeys(object, [keys], [message])
+ *
+ * Asserts that `object` has all and only all of the `keys` provided.
+ * You can also provide a single object instead of a `keys` array and its keys
+ * will be used as the expected set of keys.
+ *
+ * assert.hasAllKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'bar', 'baz']);
+ * assert.hasAllKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, bar: 99, baz: 1337]);
+ * assert.hasAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}, 'key']);
+ * assert.hasAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{foo: 'bar'}, 'anotherKey']);
+ *
+ * @name hasAllKeys
+ * @param {Mixed} object
+ * @param {String[]} keys
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.hasAllKeys = function (obj, keys, msg) {
+ new Assertion(obj, msg, assert.hasAllKeys, true).to.have.all.keys(keys);
+ }
+
+ /**
+ * ### .containsAllKeys(object, [keys], [message])
+ *
+ * Asserts that `object` has all of the `keys` provided but may have more keys not listed.
+ * You can also provide a single object instead of a `keys` array and its keys
+ * will be used as the expected set of keys.
+ *
+ * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'baz']);
+ * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'bar', 'baz']);
+ * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, baz: 1337});
+ * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, bar: 99, baz: 1337});
+ * assert.containsAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}]);
+ * assert.containsAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}, 'key']);
+ * assert.containsAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{foo: 'bar'}]);
+ * assert.containsAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{foo: 'bar'}, 'anotherKey']);
+ *
+ * @name containsAllKeys
+ * @param {Mixed} object
+ * @param {String[]} keys
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.containsAllKeys = function (obj, keys, msg) {
+ new Assertion(obj, msg, assert.containsAllKeys, true)
+ .to.contain.all.keys(keys);
+ }
+
+ /**
+ * ### .doesNotHaveAnyKeys(object, [keys], [message])
+ *
+ * Asserts that `object` has none of the `keys` provided.
+ * You can also provide a single object instead of a `keys` array and its keys
+ * will be used as the expected set of keys.
+ *
+ * assert.doesNotHaveAnyKeys({foo: 1, bar: 2, baz: 3}, ['one', 'two', 'example']);
+ * assert.doesNotHaveAnyKeys({foo: 1, bar: 2, baz: 3}, {one: 1, two: 2, example: 'foo'});
+ * assert.doesNotHaveAnyKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{one: 'two'}, 'example']);
+ * assert.doesNotHaveAnyKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{one: 'two'}, 'example']);
+ *
+ * @name doesNotHaveAnyKeys
+ * @param {Mixed} object
+ * @param {String[]} keys
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.doesNotHaveAnyKeys = function (obj, keys, msg) {
+ new Assertion(obj, msg, assert.doesNotHaveAnyKeys, true)
+ .to.not.have.any.keys(keys);
+ }
+
+ /**
+ * ### .doesNotHaveAllKeys(object, [keys], [message])
+ *
+ * Asserts that `object` does not have at least one of the `keys` provided.
+ * You can also provide a single object instead of a `keys` array and its keys
+ * will be used as the expected set of keys.
+ *
+ * assert.doesNotHaveAllKeys({foo: 1, bar: 2, baz: 3}, ['one', 'two', 'example']);
+ * assert.doesNotHaveAllKeys({foo: 1, bar: 2, baz: 3}, {one: 1, two: 2, example: 'foo'});
+ * assert.doesNotHaveAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{one: 'two'}, 'example']);
+ * assert.doesNotHaveAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{one: 'two'}, 'example']);
+ *
+ * @name doesNotHaveAllKeys
+ * @param {Mixed} object
+ * @param {String[]} keys
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.doesNotHaveAllKeys = function (obj, keys, msg) {
+ new Assertion(obj, msg, assert.doesNotHaveAllKeys, true)
+ .to.not.have.all.keys(keys);
+ }
+
+ /**
+ * ### .hasAnyDeepKeys(object, [keys], [message])
+ *
+ * Asserts that `object` has at least one of the `keys` provided.
+ * Since Sets and Maps can have objects as keys you can use this assertion to perform
+ * a deep comparison.
+ * You can also provide a single object instead of a `keys` array and its keys
+ * will be used as the expected set of keys.
+ *
+ * assert.hasAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {one: 'one'});
+ * assert.hasAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), [{one: 'one'}, {two: 'two'}]);
+ * assert.hasAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{one: 'one'}, {two: 'two'}]);
+ * assert.hasAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {one: 'one'});
+ * assert.hasAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {three: 'three'}]);
+ * assert.hasAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {two: 'two'}]);
+ *
+ * @name hasAnyDeepKeys
+ * @param {Mixed} object
+ * @param {Array|Object} keys
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.hasAnyDeepKeys = function (obj, keys, msg) {
+ new Assertion(obj, msg, assert.hasAnyDeepKeys, true)
+ .to.have.any.deep.keys(keys);
+ }
+
+ /**
+ * ### .hasAllDeepKeys(object, [keys], [message])
+ *
+ * Asserts that `object` has all and only all of the `keys` provided.
+ * Since Sets and Maps can have objects as keys you can use this assertion to perform
+ * a deep comparison.
+ * You can also provide a single object instead of a `keys` array and its keys
+ * will be used as the expected set of keys.
+ *
+ * assert.hasAllDeepKeys(new Map([[{one: 'one'}, 'valueOne']]), {one: 'one'});
+ * assert.hasAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{one: 'one'}, {two: 'two'}]);
+ * assert.hasAllDeepKeys(new Set([{one: 'one'}]), {one: 'one'});
+ * assert.hasAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {two: 'two'}]);
+ *
+ * @name hasAllDeepKeys
+ * @param {Mixed} object
+ * @param {Array|Object} keys
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.hasAllDeepKeys = function (obj, keys, msg) {
+ new Assertion(obj, msg, assert.hasAllDeepKeys, true)
+ .to.have.all.deep.keys(keys);
+ }
+
+ /**
+ * ### .containsAllDeepKeys(object, [keys], [message])
+ *
+ * Asserts that `object` contains all of the `keys` provided.
+ * Since Sets and Maps can have objects as keys you can use this assertion to perform
+ * a deep comparison.
+ * You can also provide a single object instead of a `keys` array and its keys
+ * will be used as the expected set of keys.
+ *
+ * assert.containsAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {one: 'one'});
+ * assert.containsAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{one: 'one'}, {two: 'two'}]);
+ * assert.containsAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {one: 'one'});
+ * assert.containsAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {two: 'two'}]);
+ *
+ * @name containsAllDeepKeys
+ * @param {Mixed} object
+ * @param {Array|Object} keys
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.containsAllDeepKeys = function (obj, keys, msg) {
+ new Assertion(obj, msg, assert.containsAllDeepKeys, true)
+ .to.contain.all.deep.keys(keys);
+ }
+
+ /**
+ * ### .doesNotHaveAnyDeepKeys(object, [keys], [message])
+ *
+ * Asserts that `object` has none of the `keys` provided.
+ * Since Sets and Maps can have objects as keys you can use this assertion to perform
+ * a deep comparison.
+ * You can also provide a single object instead of a `keys` array and its keys
+ * will be used as the expected set of keys.
+ *
+ * assert.doesNotHaveAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {thisDoesNot: 'exist'});
+ * assert.doesNotHaveAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{twenty: 'twenty'}, {fifty: 'fifty'}]);
+ * assert.doesNotHaveAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {twenty: 'twenty'});
+ * assert.doesNotHaveAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{twenty: 'twenty'}, {fifty: 'fifty'}]);
+ *
+ * @name doesNotHaveAnyDeepKeys
+ * @param {Mixed} object
+ * @param {Array|Object} keys
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.doesNotHaveAnyDeepKeys = function (obj, keys, msg) {
+ new Assertion(obj, msg, assert.doesNotHaveAnyDeepKeys, true)
+ .to.not.have.any.deep.keys(keys);
+ }
+
+ /**
+ * ### .doesNotHaveAllDeepKeys(object, [keys], [message])
+ *
+ * Asserts that `object` does not have at least one of the `keys` provided.
+ * Since Sets and Maps can have objects as keys you can use this assertion to perform
+ * a deep comparison.
+ * You can also provide a single object instead of a `keys` array and its keys
+ * will be used as the expected set of keys.
+ *
+ * assert.doesNotHaveAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {thisDoesNot: 'exist'});
+ * assert.doesNotHaveAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{twenty: 'twenty'}, {one: 'one'}]);
+ * assert.doesNotHaveAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {twenty: 'twenty'});
+ * assert.doesNotHaveAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {fifty: 'fifty'}]);
+ *
+ * @name doesNotHaveAllDeepKeys
+ * @param {Mixed} object
+ * @param {Array|Object} keys
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.doesNotHaveAllDeepKeys = function (obj, keys, msg) {
+ new Assertion(obj, msg, assert.doesNotHaveAllDeepKeys, true)
+ .to.not.have.all.deep.keys(keys);
+ }
+
+ /**
+ * ### .throws(fn, [errorLike/string/regexp], [string/regexp], [message])
+ *
+ * If `errorLike` is an `Error` constructor, asserts that `fn` will throw an error that is an
+ * instance of `errorLike`.
+ * If `errorLike` is an `Error` instance, asserts that the error thrown is the same
+ * instance as `errorLike`.
+ * If `errMsgMatcher` is provided, it also asserts that the error thrown will have a
+ * message matching `errMsgMatcher`.
+ *
+ * assert.throws(fn, 'Error thrown must have this msg');
+ * assert.throws(fn, /Error thrown must have a msg that matches this/);
+ * assert.throws(fn, ReferenceError);
+ * assert.throws(fn, errorInstance);
+ * assert.throws(fn, ReferenceError, 'Error thrown must be a ReferenceError and have this msg');
+ * assert.throws(fn, errorInstance, 'Error thrown must be the same errorInstance and have this msg');
+ * assert.throws(fn, ReferenceError, /Error thrown must be a ReferenceError and match this/);
+ * assert.throws(fn, errorInstance, /Error thrown must be the same errorInstance and match this/);
+ *
+ * @name throws
+ * @alias throw
+ * @alias Throw
+ * @param {Function} fn
+ * @param {ErrorConstructor|Error} errorLike
+ * @param {RegExp|String} errMsgMatcher
+ * @param {String} message
+ * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.throws = function (fn, errorLike, errMsgMatcher, msg) {
+ if ('string' === typeof errorLike || errorLike instanceof RegExp) {
+ errMsgMatcher = errorLike;
+ errorLike = null;
+ }
+
+ var assertErr = new Assertion(fn, msg, assert.throws, true)
+ .to.throw(errorLike, errMsgMatcher);
+ return flag(assertErr, 'object');
+ };
+
+ /**
+ * ### .doesNotThrow(fn, [errorLike/string/regexp], [string/regexp], [message])
+ *
+ * If `errorLike` is an `Error` constructor, asserts that `fn` will _not_ throw an error that is an
+ * instance of `errorLike`.
+ * If `errorLike` is an `Error` instance, asserts that the error thrown is _not_ the same
+ * instance as `errorLike`.
+ * If `errMsgMatcher` is provided, it also asserts that the error thrown will _not_ have a
+ * message matching `errMsgMatcher`.
+ *
+ * assert.doesNotThrow(fn, 'Any Error thrown must not have this message');
+ * assert.doesNotThrow(fn, /Any Error thrown must not match this/);
+ * assert.doesNotThrow(fn, Error);
+ * assert.doesNotThrow(fn, errorInstance);
+ * assert.doesNotThrow(fn, Error, 'Error must not have this message');
+ * assert.doesNotThrow(fn, errorInstance, 'Error must not have this message');
+ * assert.doesNotThrow(fn, Error, /Error must not match this/);
+ * assert.doesNotThrow(fn, errorInstance, /Error must not match this/);
+ *
+ * @name doesNotThrow
+ * @param {Function} fn
+ * @param {ErrorConstructor} errorLike
+ * @param {RegExp|String} errMsgMatcher
+ * @param {String} message
+ * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.doesNotThrow = function (fn, errorLike, errMsgMatcher, msg) {
+ if ('string' === typeof errorLike || errorLike instanceof RegExp) {
+ errMsgMatcher = errorLike;
+ errorLike = null;
+ }
+
+ new Assertion(fn, msg, assert.doesNotThrow, true)
+ .to.not.throw(errorLike, errMsgMatcher);
+ };
+
+ /**
+ * ### .operator(val1, operator, val2, [message])
+ *
+ * Compares two values using `operator`.
+ *
+ * assert.operator(1, '<', 2, 'everything is ok');
+ * assert.operator(1, '>', 2, 'this will fail');
+ *
+ * @name operator
+ * @param {Mixed} val1
+ * @param {String} operator
+ * @param {Mixed} val2
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.operator = function (val, operator, val2, msg) {
+ var ok;
+ switch(operator) {
+ case '==':
+ ok = val == val2;
+ break;
+ case '===':
+ ok = val === val2;
+ break;
+ case '>':
+ ok = val > val2;
+ break;
+ case '>=':
+ ok = val >= val2;
+ break;
+ case '<':
+ ok = val < val2;
+ break;
+ case '<=':
+ ok = val <= val2;
+ break;
+ case '!=':
+ ok = val != val2;
+ break;
+ case '!==':
+ ok = val !== val2;
+ break;
+ default:
+ msg = msg ? msg + ': ' : msg;
+ throw new chai.AssertionError(
+ msg + 'Invalid operator "' + operator + '"',
+ undefined,
+ assert.operator
+ );
+ }
+ var test = new Assertion(ok, msg, assert.operator, true);
+ test.assert(
+ true === flag(test, 'object')
+ , 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2)
+ , 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2) );
+ };
+
+ /**
+ * ### .closeTo(actual, expected, delta, [message])
+ *
+ * Asserts that the target is equal `expected`, to within a +/- `delta` range.
+ *
+ * assert.closeTo(1.5, 1, 0.5, 'numbers are close');
+ *
+ * @name closeTo
+ * @param {Number} actual
+ * @param {Number} expected
+ * @param {Number} delta
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.closeTo = function (act, exp, delta, msg) {
+ new Assertion(act, msg, assert.closeTo, true).to.be.closeTo(exp, delta);
+ };
+
+ /**
+ * ### .approximately(actual, expected, delta, [message])
+ *
+ * Asserts that the target is equal `expected`, to within a +/- `delta` range.
+ *
+ * assert.approximately(1.5, 1, 0.5, 'numbers are close');
+ *
+ * @name approximately
+ * @param {Number} actual
+ * @param {Number} expected
+ * @param {Number} delta
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.approximately = function (act, exp, delta, msg) {
+ new Assertion(act, msg, assert.approximately, true)
+ .to.be.approximately(exp, delta);
+ };
+
+ /**
+ * ### .sameMembers(set1, set2, [message])
+ *
+ * Asserts that `set1` and `set2` have the same members in any order. Uses a
+ * strict equality check (===).
+ *
+ * assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members');
+ *
+ * @name sameMembers
+ * @param {Array} set1
+ * @param {Array} set2
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.sameMembers = function (set1, set2, msg) {
+ new Assertion(set1, msg, assert.sameMembers, true)
+ .to.have.same.members(set2);
+ }
+
+ /**
+ * ### .notSameMembers(set1, set2, [message])
+ *
+ * Asserts that `set1` and `set2` don't have the same members in any order.
+ * Uses a strict equality check (===).
+ *
+ * assert.notSameMembers([ 1, 2, 3 ], [ 5, 1, 3 ], 'not same members');
+ *
+ * @name notSameMembers
+ * @param {Array} set1
+ * @param {Array} set2
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.notSameMembers = function (set1, set2, msg) {
+ new Assertion(set1, msg, assert.notSameMembers, true)
+ .to.not.have.same.members(set2);
+ }
+
+ /**
+ * ### .sameDeepMembers(set1, set2, [message])
+ *
+ * Asserts that `set1` and `set2` have the same members in any order. Uses a
+ * deep equality check.
+ *
+ * assert.sameDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [{ b: 2 }, { a: 1 }, { c: 3 }], 'same deep members');
+ *
+ * @name sameDeepMembers
+ * @param {Array} set1
+ * @param {Array} set2
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.sameDeepMembers = function (set1, set2, msg) {
+ new Assertion(set1, msg, assert.sameDeepMembers, true)
+ .to.have.same.deep.members(set2);
+ }
+
+ /**
+ * ### .notSameDeepMembers(set1, set2, [message])
+ *
+ * Asserts that `set1` and `set2` don't have the same members in any order.
+ * Uses a deep equality check.
+ *
+ * assert.notSameDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [{ b: 2 }, { a: 1 }, { f: 5 }], 'not same deep members');
+ *
+ * @name notSameDeepMembers
+ * @param {Array} set1
+ * @param {Array} set2
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.notSameDeepMembers = function (set1, set2, msg) {
+ new Assertion(set1, msg, assert.notSameDeepMembers, true)
+ .to.not.have.same.deep.members(set2);
+ }
+
+ /**
+ * ### .sameOrderedMembers(set1, set2, [message])
+ *
+ * Asserts that `set1` and `set2` have the same members in the same order.
+ * Uses a strict equality check (===).
+ *
+ * assert.sameOrderedMembers([ 1, 2, 3 ], [ 1, 2, 3 ], 'same ordered members');
+ *
+ * @name sameOrderedMembers
+ * @param {Array} set1
+ * @param {Array} set2
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.sameOrderedMembers = function (set1, set2, msg) {
+ new Assertion(set1, msg, assert.sameOrderedMembers, true)
+ .to.have.same.ordered.members(set2);
+ }
+
+ /**
+ * ### .notSameOrderedMembers(set1, set2, [message])
+ *
+ * Asserts that `set1` and `set2` don't have the same members in the same
+ * order. Uses a strict equality check (===).
+ *
+ * assert.notSameOrderedMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'not same ordered members');
+ *
+ * @name notSameOrderedMembers
+ * @param {Array} set1
+ * @param {Array} set2
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.notSameOrderedMembers = function (set1, set2, msg) {
+ new Assertion(set1, msg, assert.notSameOrderedMembers, true)
+ .to.not.have.same.ordered.members(set2);
+ }
+
+ /**
+ * ### .sameDeepOrderedMembers(set1, set2, [message])
+ *
+ * Asserts that `set1` and `set2` have the same members in the same order.
+ * Uses a deep equality check.
+ *
+ * assert.sameDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { b: 2 }, { c: 3 } ], 'same deep ordered members');
+ *
+ * @name sameDeepOrderedMembers
+ * @param {Array} set1
+ * @param {Array} set2
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.sameDeepOrderedMembers = function (set1, set2, msg) {
+ new Assertion(set1, msg, assert.sameDeepOrderedMembers, true)
+ .to.have.same.deep.ordered.members(set2);
+ }
+
+ /**
+ * ### .notSameDeepOrderedMembers(set1, set2, [message])
+ *
+ * Asserts that `set1` and `set2` don't have the same members in the same
+ * order. Uses a deep equality check.
+ *
+ * assert.notSameDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { b: 2 }, { z: 5 } ], 'not same deep ordered members');
+ * assert.notSameDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { a: 1 }, { c: 3 } ], 'not same deep ordered members');
+ *
+ * @name notSameDeepOrderedMembers
+ * @param {Array} set1
+ * @param {Array} set2
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.notSameDeepOrderedMembers = function (set1, set2, msg) {
+ new Assertion(set1, msg, assert.notSameDeepOrderedMembers, true)
+ .to.not.have.same.deep.ordered.members(set2);
+ }
+
+ /**
+ * ### .includeMembers(superset, subset, [message])
+ *
+ * Asserts that `subset` is included in `superset` in any order. Uses a
+ * strict equality check (===). Duplicates are ignored.
+ *
+ * assert.includeMembers([ 1, 2, 3 ], [ 2, 1, 2 ], 'include members');
+ *
+ * @name includeMembers
+ * @param {Array} superset
+ * @param {Array} subset
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.includeMembers = function (superset, subset, msg) {
+ new Assertion(superset, msg, assert.includeMembers, true)
+ .to.include.members(subset);
+ }
+
+ /**
+ * ### .notIncludeMembers(superset, subset, [message])
+ *
+ * Asserts that `subset` isn't included in `superset` in any order. Uses a
+ * strict equality check (===). Duplicates are ignored.
+ *
+ * assert.notIncludeMembers([ 1, 2, 3 ], [ 5, 1 ], 'not include members');
+ *
+ * @name notIncludeMembers
+ * @param {Array} superset
+ * @param {Array} subset
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.notIncludeMembers = function (superset, subset, msg) {
+ new Assertion(superset, msg, assert.notIncludeMembers, true)
+ .to.not.include.members(subset);
+ }
+
+ /**
+ * ### .includeDeepMembers(superset, subset, [message])
+ *
+ * Asserts that `subset` is included in `superset` in any order. Uses a deep
+ * equality check. Duplicates are ignored.
+ *
+ * assert.includeDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { a: 1 }, { b: 2 } ], 'include deep members');
+ *
+ * @name includeDeepMembers
+ * @param {Array} superset
+ * @param {Array} subset
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.includeDeepMembers = function (superset, subset, msg) {
+ new Assertion(superset, msg, assert.includeDeepMembers, true)
+ .to.include.deep.members(subset);
+ }
+
+ /**
+ * ### .notIncludeDeepMembers(superset, subset, [message])
+ *
+ * Asserts that `subset` isn't included in `superset` in any order. Uses a
+ * deep equality check. Duplicates are ignored.
+ *
+ * assert.notIncludeDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { f: 5 } ], 'not include deep members');
+ *
+ * @name notIncludeDeepMembers
+ * @param {Array} superset
+ * @param {Array} subset
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.notIncludeDeepMembers = function (superset, subset, msg) {
+ new Assertion(superset, msg, assert.notIncludeDeepMembers, true)
+ .to.not.include.deep.members(subset);
+ }
+
+ /**
+ * ### .includeOrderedMembers(superset, subset, [message])
+ *
+ * Asserts that `subset` is included in `superset` in the same order
+ * beginning with the first element in `superset`. Uses a strict equality
+ * check (===).
+ *
+ * assert.includeOrderedMembers([ 1, 2, 3 ], [ 1, 2 ], 'include ordered members');
+ *
+ * @name includeOrderedMembers
+ * @param {Array} superset
+ * @param {Array} subset
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.includeOrderedMembers = function (superset, subset, msg) {
+ new Assertion(superset, msg, assert.includeOrderedMembers, true)
+ .to.include.ordered.members(subset);
+ }
+
+ /**
+ * ### .notIncludeOrderedMembers(superset, subset, [message])
+ *
+ * Asserts that `subset` isn't included in `superset` in the same order
+ * beginning with the first element in `superset`. Uses a strict equality
+ * check (===).
+ *
+ * assert.notIncludeOrderedMembers([ 1, 2, 3 ], [ 2, 1 ], 'not include ordered members');
+ * assert.notIncludeOrderedMembers([ 1, 2, 3 ], [ 2, 3 ], 'not include ordered members');
+ *
+ * @name notIncludeOrderedMembers
+ * @param {Array} superset
+ * @param {Array} subset
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.notIncludeOrderedMembers = function (superset, subset, msg) {
+ new Assertion(superset, msg, assert.notIncludeOrderedMembers, true)
+ .to.not.include.ordered.members(subset);
+ }
+
+ /**
+ * ### .includeDeepOrderedMembers(superset, subset, [message])
+ *
+ * Asserts that `subset` is included in `superset` in the same order
+ * beginning with the first element in `superset`. Uses a deep equality
+ * check.
+ *
+ * assert.includeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { b: 2 } ], 'include deep ordered members');
+ *
+ * @name includeDeepOrderedMembers
+ * @param {Array} superset
+ * @param {Array} subset
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.includeDeepOrderedMembers = function (superset, subset, msg) {
+ new Assertion(superset, msg, assert.includeDeepOrderedMembers, true)
+ .to.include.deep.ordered.members(subset);
+ }
+
+ /**
+ * ### .notIncludeDeepOrderedMembers(superset, subset, [message])
+ *
+ * Asserts that `subset` isn't included in `superset` in the same order
+ * beginning with the first element in `superset`. Uses a deep equality
+ * check.
+ *
+ * assert.notIncludeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { f: 5 } ], 'not include deep ordered members');
+ * assert.notIncludeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { a: 1 } ], 'not include deep ordered members');
+ * assert.notIncludeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { c: 3 } ], 'not include deep ordered members');
+ *
+ * @name notIncludeDeepOrderedMembers
+ * @param {Array} superset
+ * @param {Array} subset
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.notIncludeDeepOrderedMembers = function (superset, subset, msg) {
+ new Assertion(superset, msg, assert.notIncludeDeepOrderedMembers, true)
+ .to.not.include.deep.ordered.members(subset);
+ }
+
+ /**
+ * ### .oneOf(inList, list, [message])
+ *
+ * Asserts that non-object, non-array value `inList` appears in the flat array `list`.
+ *
+ * assert.oneOf(1, [ 2, 1 ], 'Not found in list');
+ *
+ * @name oneOf
+ * @param {*} inList
+ * @param {Array<*>} list
+ * @param {String} message
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.oneOf = function (inList, list, msg) {
+ new Assertion(inList, msg, assert.oneOf, true).to.be.oneOf(list);
+ }
+
+ /**
+ * ### .changes(function, object, property, [message])
+ *
+ * Asserts that a function changes the value of a property.
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val = 22 };
+ * assert.changes(fn, obj, 'val');
+ *
+ * @name changes
+ * @param {Function} modifier function
+ * @param {Object} object or getter function
+ * @param {String} property name _optional_
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.changes = function (fn, obj, prop, msg) {
+ if (arguments.length === 3 && typeof obj === 'function') {
+ msg = prop;
+ prop = null;
+ }
+
+ new Assertion(fn, msg, assert.changes, true).to.change(obj, prop);
+ }
+
+ /**
+ * ### .changesBy(function, object, property, delta, [message])
+ *
+ * Asserts that a function changes the value of a property by an amount (delta).
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val += 2 };
+ * assert.changesBy(fn, obj, 'val', 2);
+ *
+ * @name changesBy
+ * @param {Function} modifier function
+ * @param {Object} object or getter function
+ * @param {String} property name _optional_
+ * @param {Number} change amount (delta)
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.changesBy = function (fn, obj, prop, delta, msg) {
+ if (arguments.length === 4 && typeof obj === 'function') {
+ var tmpMsg = delta;
+ delta = prop;
+ msg = tmpMsg;
+ } else if (arguments.length === 3) {
+ delta = prop;
+ prop = null;
+ }
+
+ new Assertion(fn, msg, assert.changesBy, true)
+ .to.change(obj, prop).by(delta);
+ }
+
+ /**
+ * ### .doesNotChange(function, object, property, [message])
+ *
+ * Asserts that a function does not change the value of a property.
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { console.log('foo'); };
+ * assert.doesNotChange(fn, obj, 'val');
+ *
+ * @name doesNotChange
+ * @param {Function} modifier function
+ * @param {Object} object or getter function
+ * @param {String} property name _optional_
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.doesNotChange = function (fn, obj, prop, msg) {
+ if (arguments.length === 3 && typeof obj === 'function') {
+ msg = prop;
+ prop = null;
+ }
+
+ return new Assertion(fn, msg, assert.doesNotChange, true)
+ .to.not.change(obj, prop);
+ }
+
+ /**
+ * ### .changesButNotBy(function, object, property, delta, [message])
+ *
+ * Asserts that a function does not change the value of a property or of a function's return value by an amount (delta)
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val += 10 };
+ * assert.changesButNotBy(fn, obj, 'val', 5);
+ *
+ * @name changesButNotBy
+ * @param {Function} modifier function
+ * @param {Object} object or getter function
+ * @param {String} property name _optional_
+ * @param {Number} change amount (delta)
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.changesButNotBy = function (fn, obj, prop, delta, msg) {
+ if (arguments.length === 4 && typeof obj === 'function') {
+ var tmpMsg = delta;
+ delta = prop;
+ msg = tmpMsg;
+ } else if (arguments.length === 3) {
+ delta = prop;
+ prop = null;
+ }
+
+ new Assertion(fn, msg, assert.changesButNotBy, true)
+ .to.change(obj, prop).but.not.by(delta);
+ }
+
+ /**
+ * ### .increases(function, object, property, [message])
+ *
+ * Asserts that a function increases a numeric object property.
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val = 13 };
+ * assert.increases(fn, obj, 'val');
+ *
+ * @name increases
+ * @param {Function} modifier function
+ * @param {Object} object or getter function
+ * @param {String} property name _optional_
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.increases = function (fn, obj, prop, msg) {
+ if (arguments.length === 3 && typeof obj === 'function') {
+ msg = prop;
+ prop = null;
+ }
+
+ return new Assertion(fn, msg, assert.increases, true)
+ .to.increase(obj, prop);
+ }
+
+ /**
+ * ### .increasesBy(function, object, property, delta, [message])
+ *
+ * Asserts that a function increases a numeric object property or a function's return value by an amount (delta).
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val += 10 };
+ * assert.increasesBy(fn, obj, 'val', 10);
+ *
+ * @name increasesBy
+ * @param {Function} modifier function
+ * @param {Object} object or getter function
+ * @param {String} property name _optional_
+ * @param {Number} change amount (delta)
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.increasesBy = function (fn, obj, prop, delta, msg) {
+ if (arguments.length === 4 && typeof obj === 'function') {
+ var tmpMsg = delta;
+ delta = prop;
+ msg = tmpMsg;
+ } else if (arguments.length === 3) {
+ delta = prop;
+ prop = null;
+ }
+
+ new Assertion(fn, msg, assert.increasesBy, true)
+ .to.increase(obj, prop).by(delta);
+ }
+
+ /**
+ * ### .doesNotIncrease(function, object, property, [message])
+ *
+ * Asserts that a function does not increase a numeric object property.
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val = 8 };
+ * assert.doesNotIncrease(fn, obj, 'val');
+ *
+ * @name doesNotIncrease
+ * @param {Function} modifier function
+ * @param {Object} object or getter function
+ * @param {String} property name _optional_
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.doesNotIncrease = function (fn, obj, prop, msg) {
+ if (arguments.length === 3 && typeof obj === 'function') {
+ msg = prop;
+ prop = null;
+ }
+
+ return new Assertion(fn, msg, assert.doesNotIncrease, true)
+ .to.not.increase(obj, prop);
+ }
+
+ /**
+ * ### .increasesButNotBy(function, object, property, delta, [message])
+ *
+ * Asserts that a function does not increase a numeric object property or function's return value by an amount (delta).
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val = 15 };
+ * assert.increasesButNotBy(fn, obj, 'val', 10);
+ *
+ * @name increasesButNotBy
+ * @param {Function} modifier function
+ * @param {Object} object or getter function
+ * @param {String} property name _optional_
+ * @param {Number} change amount (delta)
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.increasesButNotBy = function (fn, obj, prop, delta, msg) {
+ if (arguments.length === 4 && typeof obj === 'function') {
+ var tmpMsg = delta;
+ delta = prop;
+ msg = tmpMsg;
+ } else if (arguments.length === 3) {
+ delta = prop;
+ prop = null;
+ }
+
+ new Assertion(fn, msg, assert.increasesButNotBy, true)
+ .to.increase(obj, prop).but.not.by(delta);
+ }
+
+ /**
+ * ### .decreases(function, object, property, [message])
+ *
+ * Asserts that a function decreases a numeric object property.
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val = 5 };
+ * assert.decreases(fn, obj, 'val');
+ *
+ * @name decreases
+ * @param {Function} modifier function
+ * @param {Object} object or getter function
+ * @param {String} property name _optional_
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.decreases = function (fn, obj, prop, msg) {
+ if (arguments.length === 3 && typeof obj === 'function') {
+ msg = prop;
+ prop = null;
+ }
+
+ return new Assertion(fn, msg, assert.decreases, true)
+ .to.decrease(obj, prop);
+ }
+
+ /**
+ * ### .decreasesBy(function, object, property, delta, [message])
+ *
+ * Asserts that a function decreases a numeric object property or a function's return value by an amount (delta)
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val -= 5 };
+ * assert.decreasesBy(fn, obj, 'val', 5);
+ *
+ * @name decreasesBy
+ * @param {Function} modifier function
+ * @param {Object} object or getter function
+ * @param {String} property name _optional_
+ * @param {Number} change amount (delta)
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.decreasesBy = function (fn, obj, prop, delta, msg) {
+ if (arguments.length === 4 && typeof obj === 'function') {
+ var tmpMsg = delta;
+ delta = prop;
+ msg = tmpMsg;
+ } else if (arguments.length === 3) {
+ delta = prop;
+ prop = null;
+ }
+
+ new Assertion(fn, msg, assert.decreasesBy, true)
+ .to.decrease(obj, prop).by(delta);
+ }
+
+ /**
+ * ### .doesNotDecrease(function, object, property, [message])
+ *
+ * Asserts that a function does not decreases a numeric object property.
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val = 15 };
+ * assert.doesNotDecrease(fn, obj, 'val');
+ *
+ * @name doesNotDecrease
+ * @param {Function} modifier function
+ * @param {Object} object or getter function
+ * @param {String} property name _optional_
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.doesNotDecrease = function (fn, obj, prop, msg) {
+ if (arguments.length === 3 && typeof obj === 'function') {
+ msg = prop;
+ prop = null;
+ }
+
+ return new Assertion(fn, msg, assert.doesNotDecrease, true)
+ .to.not.decrease(obj, prop);
+ }
+
+ /**
+ * ### .doesNotDecreaseBy(function, object, property, delta, [message])
+ *
+ * Asserts that a function does not decreases a numeric object property or a function's return value by an amount (delta)
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val = 5 };
+ * assert.doesNotDecreaseBy(fn, obj, 'val', 1);
+ *
+ * @name doesNotDecreaseBy
+ * @param {Function} modifier function
+ * @param {Object} object or getter function
+ * @param {String} property name _optional_
+ * @param {Number} change amount (delta)
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.doesNotDecreaseBy = function (fn, obj, prop, delta, msg) {
+ if (arguments.length === 4 && typeof obj === 'function') {
+ var tmpMsg = delta;
+ delta = prop;
+ msg = tmpMsg;
+ } else if (arguments.length === 3) {
+ delta = prop;
+ prop = null;
+ }
+
+ return new Assertion(fn, msg, assert.doesNotDecreaseBy, true)
+ .to.not.decrease(obj, prop).by(delta);
+ }
+
+ /**
+ * ### .decreasesButNotBy(function, object, property, delta, [message])
+ *
+ * Asserts that a function does not decreases a numeric object property or a function's return value by an amount (delta)
+ *
+ * var obj = { val: 10 };
+ * var fn = function() { obj.val = 5 };
+ * assert.decreasesButNotBy(fn, obj, 'val', 1);
+ *
+ * @name decreasesButNotBy
+ * @param {Function} modifier function
+ * @param {Object} object or getter function
+ * @param {String} property name _optional_
+ * @param {Number} change amount (delta)
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.decreasesButNotBy = function (fn, obj, prop, delta, msg) {
+ if (arguments.length === 4 && typeof obj === 'function') {
+ var tmpMsg = delta;
+ delta = prop;
+ msg = tmpMsg;
+ } else if (arguments.length === 3) {
+ delta = prop;
+ prop = null;
+ }
+
+ new Assertion(fn, msg, assert.decreasesButNotBy, true)
+ .to.decrease(obj, prop).but.not.by(delta);
+ }
+
+ /*!
+ * ### .ifError(object)
+ *
+ * Asserts if value is not a false value, and throws if it is a true value.
+ * This is added to allow for chai to be a drop-in replacement for Node's
+ * assert class.
+ *
+ * var err = new Error('I am a custom error');
+ * assert.ifError(err); // Rethrows err!
+ *
+ * @name ifError
+ * @param {Object} object
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.ifError = function (val) {
+ if (val) {
+ throw(val);
+ }
+ };
+
+ /**
+ * ### .isExtensible(object)
+ *
+ * Asserts that `object` is extensible (can have new properties added to it).
+ *
+ * assert.isExtensible({});
+ *
+ * @name isExtensible
+ * @alias extensible
+ * @param {Object} object
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isExtensible = function (obj, msg) {
+ new Assertion(obj, msg, assert.isExtensible, true).to.be.extensible;
+ };
+
+ /**
+ * ### .isNotExtensible(object)
+ *
+ * Asserts that `object` is _not_ extensible.
+ *
+ * var nonExtensibleObject = Object.preventExtensions({});
+ * var sealedObject = Object.seal({});
+ * var frozenObject = Object.freeze({});
+ *
+ * assert.isNotExtensible(nonExtensibleObject);
+ * assert.isNotExtensible(sealedObject);
+ * assert.isNotExtensible(frozenObject);
+ *
+ * @name isNotExtensible
+ * @alias notExtensible
+ * @param {Object} object
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isNotExtensible = function (obj, msg) {
+ new Assertion(obj, msg, assert.isNotExtensible, true).to.not.be.extensible;
+ };
+
+ /**
+ * ### .isSealed(object)
+ *
+ * Asserts that `object` is sealed (cannot have new properties added to it
+ * and its existing properties cannot be removed).
+ *
+ * var sealedObject = Object.seal({});
+ * var frozenObject = Object.seal({});
*
* assert.isSealed(sealedObject);
* assert.isSealed(frozenObject);
@@ -3713,7 +7202,7 @@ module.exports = function (chai, util) {
*/
assert.isSealed = function (obj, msg) {
- new Assertion(obj, msg).to.be.sealed;
+ new Assertion(obj, msg, assert.isSealed, true).to.be.sealed;
};
/**
@@ -3732,7 +7221,7 @@ module.exports = function (chai, util) {
*/
assert.isNotSealed = function (obj, msg) {
- new Assertion(obj, msg).to.not.be.sealed;
+ new Assertion(obj, msg, assert.isNotSealed, true).to.not.be.sealed;
};
/**
@@ -3753,7 +7242,7 @@ module.exports = function (chai, util) {
*/
assert.isFrozen = function (obj, msg) {
- new Assertion(obj, msg).to.be.frozen;
+ new Assertion(obj, msg, assert.isFrozen, true).to.be.frozen;
};
/**
@@ -3772,7 +7261,59 @@ module.exports = function (chai, util) {
*/
assert.isNotFrozen = function (obj, msg) {
- new Assertion(obj, msg).to.not.be.frozen;
+ new Assertion(obj, msg, assert.isNotFrozen, true).to.not.be.frozen;
+ };
+
+ /**
+ * ### .isEmpty(target)
+ *
+ * Asserts that the target does not contain any values.
+ * For arrays and strings, it checks the `length` property.
+ * For `Map` and `Set` instances, it checks the `size` property.
+ * For non-function objects, it gets the count of own
+ * enumerable string keys.
+ *
+ * assert.isEmpty([]);
+ * assert.isEmpty('');
+ * assert.isEmpty(new Map);
+ * assert.isEmpty({});
+ *
+ * @name isEmpty
+ * @alias empty
+ * @param {Object|Array|String|Map|Set} target
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isEmpty = function(val, msg) {
+ new Assertion(val, msg, assert.isEmpty, true).to.be.empty;
+ };
+
+ /**
+ * ### .isNotEmpty(target)
+ *
+ * Asserts that the target contains values.
+ * For arrays and strings, it checks the `length` property.
+ * For `Map` and `Set` instances, it checks the `size` property.
+ * For non-function objects, it gets the count of own
+ * enumerable string keys.
+ *
+ * assert.isNotEmpty([1, 2]);
+ * assert.isNotEmpty('34');
+ * assert.isNotEmpty(new Set([5, 6]));
+ * assert.isNotEmpty({ key: 7 });
+ *
+ * @name isNotEmpty
+ * @alias notEmpty
+ * @param {Object|Array|String|Map|Set} target
+ * @param {String} message _optional_
+ * @namespace Assert
+ * @api public
+ */
+
+ assert.isNotEmpty = function(val, msg) {
+ new Assertion(val, msg, assert.isNotEmpty, true).to.not.be.empty;
};
/*!
@@ -3792,7 +7333,9 @@ module.exports = function (chai, util) {
('isSealed', 'sealed')
('isNotSealed', 'notSealed')
('isFrozen', 'frozen')
- ('isNotFrozen', 'notFrozen');
+ ('isNotFrozen', 'notFrozen')
+ ('isEmpty', 'empty')
+ ('isNotEmpty', 'notEmpty');
};
},{}],7:[function(require,module,exports){
@@ -3808,20 +7351,33 @@ module.exports = function (chai, util) {
};
/**
+ * ### .fail([message])
* ### .fail(actual, expected, [message], [operator])
*
* Throw a failure.
*
+ * expect.fail();
+ * expect.fail("custom error message");
+ * expect.fail(1, 2);
+ * expect.fail(1, 2, "custom error message");
+ * expect.fail(1, 2, "custom error message", ">");
+ * expect.fail(1, 2, undefined, ">");
+ *
* @name fail
* @param {Mixed} actual
* @param {Mixed} expected
* @param {String} message
* @param {String} operator
- * @namespace Expect
+ * @namespace BDD
* @api public
*/
chai.expect.fail = function (actual, expected, message, operator) {
+ if (arguments.length < 2) {
+ message = actual;
+ actual = undefined;
+ }
+
message = message || 'expect.fail()';
throw new chai.AssertionError(message, {
actual: actual
@@ -3844,7 +7400,11 @@ module.exports = function (chai, util) {
function loadShould () {
// explicitly define this method as function as to have it's name to include as `ssfi`
function shouldGetter() {
- if (this instanceof String || this instanceof Number || this instanceof Boolean ) {
+ if (this instanceof String
+ || this instanceof Number
+ || this instanceof Boolean
+ || typeof Symbol === 'function' && this instanceof Symbol
+ || typeof BigInt === 'function' && this instanceof BigInt) {
return new Assertion(this.valueOf(), null, shouldGetter);
}
return new Assertion(this, null, shouldGetter);
@@ -3873,20 +7433,34 @@ module.exports = function (chai, util) {
var should = {};
/**
+ * ### .fail([message])
* ### .fail(actual, expected, [message], [operator])
*
* Throw a failure.
*
+ * should.fail();
+ * should.fail("custom error message");
+ * should.fail(1, 2);
+ * should.fail(1, 2, "custom error message");
+ * should.fail(1, 2, "custom error message", ">");
+ * should.fail(1, 2, undefined, ">");
+ *
+ *
* @name fail
* @param {Mixed} actual
* @param {Mixed} expected
* @param {String} message
* @param {String} operator
- * @namespace Should
+ * @namespace BDD
* @api public
*/
should.fail = function (actual, expected, message, operator) {
+ if (arguments.length < 2) {
+ message = actual;
+ actual = undefined;
+ }
+
message = message || 'should.fail()';
throw new chai.AssertionError(message, {
actual: actual
@@ -4045,28 +7619,41 @@ module.exports = function (chai, util) {
* Module dependencies
*/
-var transferFlags = require('./transferFlags');
+var addLengthGuard = require('./addLengthGuard');
+var chai = require('../../chai');
var flag = require('./flag');
-var config = require('../config');
+var proxify = require('./proxify');
+var transferFlags = require('./transferFlags');
/*!
* Module variables
*/
-// Check whether `__proto__` is supported
-var hasProtoSupport = '__proto__' in Object;
+// Check whether `Object.setPrototypeOf` is supported
+var canSetPrototype = typeof Object.setPrototypeOf === 'function';
+
+// Without `Object.setPrototypeOf` support, this module will need to add properties to a function.
+// However, some of functions' own props are not configurable and should be skipped.
+var testFn = function() {};
+var excludeNames = Object.getOwnPropertyNames(testFn).filter(function(name) {
+ var propDesc = Object.getOwnPropertyDescriptor(testFn, name);
+
+ // Note: PhantomJS 1.x includes `callee` as one of `testFn`'s own properties,
+ // but then returns `undefined` as the property descriptor for `callee`. As a
+ // workaround, we perform an otherwise unnecessary type-check for `propDesc`,
+ // and then filter it out if it's not an object as it should be.
+ if (typeof propDesc !== 'object')
+ return true;
-// Without `__proto__` support, this module will need to add properties to a function.
-// However, some Function.prototype methods cannot be overwritten,
-// and there seems no easy cross-platform way to detect them (@see chaijs/chai/issues/69).
-var excludeNames = /^(?:length|name|arguments|caller)$/;
+ return !propDesc.configurable;
+});
// Cache `Function` properties
var call = Function.prototype.call,
apply = Function.prototype.apply;
/**
- * ### addChainableMethod (ctx, name, method, chainingBehavior)
+ * ### .addChainableMethod(ctx, name, method, chainingBehavior)
*
* Adds a method to an object, such that the method can also be chained.
*
@@ -4094,7 +7681,7 @@ var call = Function.prototype.call,
* @api public
*/
-module.exports = function (ctx, name, method, chainingBehavior) {
+module.exports = function addChainableMethod(ctx, name, method, chainingBehavior) {
if (typeof chainingBehavior !== 'function') {
chainingBehavior = function () { };
}
@@ -4111,54 +7698,147 @@ module.exports = function (ctx, name, method, chainingBehavior) {
ctx.__methods[name] = chainableBehavior;
Object.defineProperty(ctx, name,
- { get: function () {
+ { get: function chainableMethodGetter() {
chainableBehavior.chainingBehavior.call(this);
- var assert = function assert() {
- var old_ssfi = flag(this, 'ssfi');
- if (old_ssfi && config.includeStack === false)
- flag(this, 'ssfi', assert);
+ var chainableMethodWrapper = function () {
+ // Setting the `ssfi` flag to `chainableMethodWrapper` causes this
+ // function to be the starting point for removing implementation
+ // frames from the stack trace of a failed assertion.
+ //
+ // However, we only want to use this function as the starting point if
+ // the `lockSsfi` flag isn't set.
+ //
+ // If the `lockSsfi` flag is set, then this assertion is being
+ // invoked from inside of another assertion. In this case, the `ssfi`
+ // flag has already been set by the outer assertion.
+ //
+ // Note that overwriting a chainable method merely replaces the saved
+ // methods in `ctx.__methods` instead of completely replacing the
+ // overwritten assertion. Therefore, an overwriting assertion won't
+ // set the `ssfi` or `lockSsfi` flags.
+ if (!flag(this, 'lockSsfi')) {
+ flag(this, 'ssfi', chainableMethodWrapper);
+ }
+
var result = chainableBehavior.method.apply(this, arguments);
- return result === undefined ? this : result;
+ if (result !== undefined) {
+ return result;
+ }
+
+ var newAssertion = new chai.Assertion();
+ transferFlags(this, newAssertion);
+ return newAssertion;
};
- // Use `__proto__` if available
- if (hasProtoSupport) {
+ addLengthGuard(chainableMethodWrapper, name, true);
+
+ // Use `Object.setPrototypeOf` if available
+ if (canSetPrototype) {
// Inherit all properties from the object by replacing the `Function` prototype
- var prototype = assert.__proto__ = Object.create(this);
+ var prototype = Object.create(this);
// Restore the `call` and `apply` methods from `Function`
prototype.call = call;
prototype.apply = apply;
+ Object.setPrototypeOf(chainableMethodWrapper, prototype);
}
// Otherwise, redefine all properties (slow!)
else {
var asserterNames = Object.getOwnPropertyNames(ctx);
asserterNames.forEach(function (asserterName) {
- if (!excludeNames.test(asserterName)) {
- var pd = Object.getOwnPropertyDescriptor(ctx, asserterName);
- Object.defineProperty(assert, asserterName, pd);
+ if (excludeNames.indexOf(asserterName) !== -1) {
+ return;
}
+
+ var pd = Object.getOwnPropertyDescriptor(ctx, asserterName);
+ Object.defineProperty(chainableMethodWrapper, asserterName, pd);
});
}
- transferFlags(this, assert);
- return assert;
+ transferFlags(this, chainableMethodWrapper);
+ return proxify(chainableMethodWrapper);
}
, configurable: true
});
};
-},{"../config":4,"./flag":13,"./transferFlags":29}],10:[function(require,module,exports){
+},{"../../chai":2,"./addLengthGuard":10,"./flag":15,"./proxify":31,"./transferFlags":33}],10:[function(require,module,exports){
+var fnLengthDesc = Object.getOwnPropertyDescriptor(function () {}, 'length');
+
+/*!
+ * Chai - addLengthGuard utility
+ * Copyright(c) 2012-2014 Jake Luer
+ * MIT Licensed
+ */
+
+/**
+ * ### .addLengthGuard(fn, assertionName, isChainable)
+ *
+ * Define `length` as a getter on the given uninvoked method assertion. The
+ * getter acts as a guard against chaining `length` directly off of an uninvoked
+ * method assertion, which is a problem because it references `function`'s
+ * built-in `length` property instead of Chai's `length` assertion. When the
+ * getter catches the user making this mistake, it throws an error with a
+ * helpful message.
+ *
+ * There are two ways in which this mistake can be made. The first way is by
+ * chaining the `length` assertion directly off of an uninvoked chainable
+ * method. In this case, Chai suggests that the user use `lengthOf` instead. The
+ * second way is by chaining the `length` assertion directly off of an uninvoked
+ * non-chainable method. Non-chainable methods must be invoked prior to
+ * chaining. In this case, Chai suggests that the user consult the docs for the
+ * given assertion.
+ *
+ * If the `length` property of functions is unconfigurable, then return `fn`
+ * without modification.
+ *
+ * Note that in ES6, the function's `length` property is configurable, so once
+ * support for legacy environments is dropped, Chai's `length` property can
+ * replace the built-in function's `length` property, and this length guard will
+ * no longer be necessary. In the mean time, maintaining consistency across all
+ * environments is the priority.
+ *
+ * @param {Function} fn
+ * @param {String} assertionName
+ * @param {Boolean} isChainable
+ * @namespace Utils
+ * @name addLengthGuard
+ */
+
+module.exports = function addLengthGuard (fn, assertionName, isChainable) {
+ if (!fnLengthDesc.configurable) return fn;
+
+ Object.defineProperty(fn, 'length', {
+ get: function () {
+ if (isChainable) {
+ throw Error('Invalid Chai property: ' + assertionName + '.length. Due' +
+ ' to a compatibility issue, "length" cannot directly follow "' +
+ assertionName + '". Use "' + assertionName + '.lengthOf" instead.');
+ }
+
+ throw Error('Invalid Chai property: ' + assertionName + '.length. See' +
+ ' docs for proper usage of "' + assertionName + '".');
+ }
+ });
+
+ return fn;
+};
+
+},{}],11:[function(require,module,exports){
/*!
* Chai - addMethod utility
* Copyright(c) 2012-2014 Jake Luer
* MIT Licensed
*/
-var config = require('../config');
+var addLengthGuard = require('./addLengthGuard');
+var chai = require('../../chai');
+var flag = require('./flag');
+var proxify = require('./proxify');
+var transferFlags = require('./transferFlags');
/**
- * ### .addMethod (ctx, name, method)
+ * ### .addMethod(ctx, name, method)
*
* Adds a method to the prototype of an object.
*
@@ -4182,30 +7862,52 @@ var config = require('../config');
* @name addMethod
* @api public
*/
-var flag = require('./flag');
-module.exports = function (ctx, name, method) {
- ctx[name] = function () {
- var old_ssfi = flag(this, 'ssfi');
- if (old_ssfi && config.includeStack === false)
- flag(this, 'ssfi', ctx[name]);
+module.exports = function addMethod(ctx, name, method) {
+ var methodWrapper = function () {
+ // Setting the `ssfi` flag to `methodWrapper` causes this function to be the
+ // starting point for removing implementation frames from the stack trace of
+ // a failed assertion.
+ //
+ // However, we only want to use this function as the starting point if the
+ // `lockSsfi` flag isn't set.
+ //
+ // If the `lockSsfi` flag is set, then either this assertion has been
+ // overwritten by another assertion, or this assertion is being invoked from
+ // inside of another assertion. In the first case, the `ssfi` flag has
+ // already been set by the overwriting assertion. In the second case, the
+ // `ssfi` flag has already been set by the outer assertion.
+ if (!flag(this, 'lockSsfi')) {
+ flag(this, 'ssfi', methodWrapper);
+ }
+
var result = method.apply(this, arguments);
- return result === undefined ? this : result;
+ if (result !== undefined)
+ return result;
+
+ var newAssertion = new chai.Assertion();
+ transferFlags(this, newAssertion);
+ return newAssertion;
};
+
+ addLengthGuard(methodWrapper, name, false);
+ ctx[name] = proxify(methodWrapper, name);
};
-},{"../config":4,"./flag":13}],11:[function(require,module,exports){
+},{"../../chai":2,"./addLengthGuard":10,"./flag":15,"./proxify":31,"./transferFlags":33}],12:[function(require,module,exports){
/*!
* Chai - addProperty utility
* Copyright(c) 2012-2014 Jake Luer
* MIT Licensed
*/
-var config = require('../config');
+var chai = require('../../chai');
var flag = require('./flag');
+var isProxyEnabled = require('./isProxyEnabled');
+var transferFlags = require('./transferFlags');
/**
- * ### addProperty (ctx, name, getter)
+ * ### .addProperty(ctx, name, getter)
*
* Adds a property to the prototype of an object.
*
@@ -4230,21 +7932,76 @@ var flag = require('./flag');
* @api public
*/
-module.exports = function (ctx, name, getter) {
+module.exports = function addProperty(ctx, name, getter) {
+ getter = getter === undefined ? function () {} : getter;
+
Object.defineProperty(ctx, name,
- { get: function addProperty() {
- var old_ssfi = flag(this, 'ssfi');
- if (old_ssfi && config.includeStack === false)
- flag(this, 'ssfi', addProperty);
+ { get: function propertyGetter() {
+ // Setting the `ssfi` flag to `propertyGetter` causes this function to
+ // be the starting point for removing implementation frames from the
+ // stack trace of a failed assertion.
+ //
+ // However, we only want to use this function as the starting point if
+ // the `lockSsfi` flag isn't set and proxy protection is disabled.
+ //
+ // If the `lockSsfi` flag is set, then either this assertion has been
+ // overwritten by another assertion, or this assertion is being invoked
+ // from inside of another assertion. In the first case, the `ssfi` flag
+ // has already been set by the overwriting assertion. In the second
+ // case, the `ssfi` flag has already been set by the outer assertion.
+ //
+ // If proxy protection is enabled, then the `ssfi` flag has already been
+ // set by the proxy getter.
+ if (!isProxyEnabled() && !flag(this, 'lockSsfi')) {
+ flag(this, 'ssfi', propertyGetter);
+ }
var result = getter.call(this);
- return result === undefined ? this : result;
+ if (result !== undefined)
+ return result;
+
+ var newAssertion = new chai.Assertion();
+ transferFlags(this, newAssertion);
+ return newAssertion;
}
, configurable: true
});
};
-},{"../config":4,"./flag":13}],12:[function(require,module,exports){
+},{"../../chai":2,"./flag":15,"./isProxyEnabled":26,"./transferFlags":33}],13:[function(require,module,exports){
+/*!
+ * Chai - compareByInspect utility
+ * Copyright(c) 2011-2016 Jake Luer
+ * MIT Licensed
+ */
+
+/*!
+ * Module dependencies
+ */
+
+var inspect = require('./inspect');
+
+/**
+ * ### .compareByInspect(mixed, mixed)
+ *
+ * To be used as a compareFunction with Array.prototype.sort. Compares elements
+ * using inspect instead of default behavior of using toString so that Symbols
+ * and objects with irregular/missing toString can still be sorted without a
+ * TypeError.
+ *
+ * @param {Mixed} first element to compare
+ * @param {Mixed} second element to compare
+ * @returns {Number} -1 if 'a' should come before 'b'; otherwise 1
+ * @name compareByInspect
+ * @namespace Utils
+ * @api public
+ */
+
+module.exports = function compareByInspect(a, b) {
+ return inspect(a) < inspect(b) ? -1 : 1;
+};
+
+},{"./inspect":24}],14:[function(require,module,exports){
/*!
* Chai - expectTypes utility
* Copyright(c) 2012-2014 Jake Luer
@@ -4252,7 +8009,7 @@ module.exports = function (ctx, name, getter) {
*/
/**
- * ### expectTypes(obj, types)
+ * ### .expectTypes(obj, types)
*
* Ensures that the object being tested against is of a valid type.
*
@@ -4269,26 +8026,35 @@ var AssertionError = require('assertion-error');
var flag = require('./flag');
var type = require('type-detect');
-module.exports = function (obj, types) {
- var obj = flag(obj, 'object');
+module.exports = function expectTypes(obj, types) {
+ var flagMsg = flag(obj, 'message');
+ var ssfi = flag(obj, 'ssfi');
+
+ flagMsg = flagMsg ? flagMsg + ': ' : '';
+
+ obj = flag(obj, 'object');
types = types.map(function (t) { return t.toLowerCase(); });
types.sort();
- // Transforms ['lorem', 'ipsum'] into 'a lirum, or an ipsum'
+ // Transforms ['lorem', 'ipsum'] into 'a lorem, or an ipsum'
var str = types.map(function (t, index) {
var art = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(t.charAt(0)) ? 'an' : 'a';
var or = types.length > 1 && index === types.length - 1 ? 'or ' : '';
return or + art + ' ' + t;
}).join(', ');
- if (!types.some(function (expected) { return type(obj) === expected; })) {
+ var objType = type(obj).toLowerCase();
+
+ if (!types.some(function (expected) { return objType === expected; })) {
throw new AssertionError(
- 'object tested must be ' + str + ', but ' + type(obj) + ' given'
+ flagMsg + 'object tested must be ' + str + ', but ' + objType + ' given',
+ undefined,
+ ssfi
);
}
};
-},{"./flag":13,"assertion-error":30,"type-detect":35}],13:[function(require,module,exports){
+},{"./flag":15,"assertion-error":34,"type-detect":39}],15:[function(require,module,exports){
/*!
* Chai - flag utility
* Copyright(c) 2012-2014 Jake Luer
@@ -4296,7 +8062,7 @@ module.exports = function (obj, types) {
*/
/**
- * ### flag(object, key, [value])
+ * ### .flag(object, key, [value])
*
* Get or set a flag value on an object. If a
* value is provided it will be set, else it will
@@ -4314,7 +8080,7 @@ module.exports = function (obj, types) {
* @api private
*/
-module.exports = function (obj, key, value) {
+module.exports = function flag(obj, key, value) {
var flags = obj.__flags || (obj.__flags = Object.create(null));
if (arguments.length === 3) {
flags[key] = value;
@@ -4323,7 +8089,7 @@ module.exports = function (obj, key, value) {
}
};
-},{}],14:[function(require,module,exports){
+},{}],16:[function(require,module,exports){
/*!
* Chai - getActual utility
* Copyright(c) 2012-2014 Jake Luer
@@ -4331,9 +8097,9 @@ module.exports = function (obj, key, value) {
*/
/**
- * # getActual(object, [actual])
+ * ### .getActual(object, [actual])
*
- * Returns the `actual` value for an Assertion
+ * Returns the `actual` value for an Assertion.
*
* @param {Object} object (constructed Assertion)
* @param {Arguments} chai.Assertion.prototype.assert arguments
@@ -4341,11 +8107,11 @@ module.exports = function (obj, key, value) {
* @name getActual
*/
-module.exports = function (obj, args) {
+module.exports = function getActual(obj, args) {
return args.length > 4 ? args[4] : obj._obj;
};
-},{}],15:[function(require,module,exports){
+},{}],17:[function(require,module,exports){
/*!
* Chai - getEnumerableProperties utility
* Copyright(c) 2012-2014 Jake Luer
@@ -4373,7 +8139,7 @@ module.exports = function getEnumerableProperties(object) {
return result;
};
-},{}],16:[function(require,module,exports){
+},{}],18:[function(require,module,exports){
/*!
* Chai - message composition utility
* Copyright(c) 2012-2014 Jake Luer
@@ -4381,12 +8147,11 @@ module.exports = function getEnumerableProperties(object) {
*/
/*!
- * Module dependancies
+ * Module dependencies
*/
var flag = require('./flag')
, getActual = require('./getActual')
- , inspect = require('./inspect')
, objDisplay = require('./objDisplay');
/**
@@ -4408,7 +8173,7 @@ var flag = require('./flag')
* @api public
*/
-module.exports = function (obj, args) {
+module.exports = function getMessage(obj, args) {
var negate = flag(obj, 'negate')
, val = flag(obj, 'object')
, expected = args[3]
@@ -4423,192 +8188,127 @@ module.exports = function (obj, args) {
.replace(/#\{act\}/g, function () { return objDisplay(actual); })
.replace(/#\{exp\}/g, function () { return objDisplay(expected); });
- return flagMsg ? flagMsg + ': ' + msg : msg;
-};
-
-},{"./flag":13,"./getActual":14,"./inspect":23,"./objDisplay":24}],17:[function(require,module,exports){
-/*!
- * Chai - getName utility
- * Copyright(c) 2012-2014 Jake Luer
- * MIT Licensed
- */
-
-/**
- * # getName(func)
- *
- * Gets the name of a function, in a cross-browser way.
- *
- * @param {Function} a function (usually a constructor)
- * @namespace Utils
- * @name getName
- */
+ return flagMsg ? flagMsg + ': ' + msg : msg;
+};
-module.exports = function (func) {
- if (func.name) return func.name;
+},{"./flag":15,"./getActual":16,"./objDisplay":27}],19:[function(require,module,exports){
+var type = require('type-detect');
- var match = /^\s?function ([^(]*)\(/.exec(func);
- return match && match[1] ? match[1] : "";
-};
+var flag = require('./flag');
-},{}],18:[function(require,module,exports){
-/*!
- * Chai - getPathInfo utility
- * Copyright(c) 2012-2014 Jake Luer
- * MIT Licensed
- */
+function isObjectType(obj) {
+ var objectType = type(obj);
+ var objectTypes = ['Array', 'Object', 'function'];
-var hasProperty = require('./hasProperty');
+ return objectTypes.indexOf(objectType) !== -1;
+}
/**
- * ### .getPathInfo(path, object)
+ * ### .getOperator(message)
*
- * This allows the retrieval of property info in an
- * object given a string path.
- *
- * The path info consists of an object with the
- * following properties:
+ * Extract the operator from error message.
+ * Operator defined is based on below link
+ * https://nodejs.org/api/assert.html#assert_assert.
*
- * * parent - The parent object of the property referenced by `path`
- * * name - The name of the final property, a number if it was an array indexer
- * * value - The value of the property, if it exists, otherwise `undefined`
- * * exists - Whether the property exists or not
+ * Returns the `operator` or `undefined` value for an Assertion.
*
- * @param {String} path
- * @param {Object} object
- * @returns {Object} info
+ * @param {Object} object (constructed Assertion)
+ * @param {Arguments} chai.Assertion.prototype.assert arguments
* @namespace Utils
- * @name getPathInfo
+ * @name getOperator
* @api public
*/
-module.exports = function getPathInfo(path, obj) {
- var parsed = parsePath(path),
- last = parsed[parsed.length - 1];
+module.exports = function getOperator(obj, args) {
+ var operator = flag(obj, 'operator');
+ var negate = flag(obj, 'negate');
+ var expected = args[3];
+ var msg = negate ? args[2] : args[1];
- var info = {
- parent: parsed.length > 1 ? _getPathValue(parsed, obj, parsed.length - 1) : obj,
- name: last.p || last.i,
- value: _getPathValue(parsed, obj)
- };
- info.exists = hasProperty(info.name, info.parent);
+ if (operator) {
+ return operator;
+ }
- return info;
-};
+ if (typeof msg === 'function') msg = msg();
+
+ msg = msg || '';
+ if (!msg) {
+ return undefined;
+ }
+ if (/\shave\s/.test(msg)) {
+ return undefined;
+ }
+
+ var isObject = isObjectType(expected);
+ if (/\snot\s/.test(msg)) {
+ return isObject ? 'notDeepStrictEqual' : 'notStrictEqual';
+ }
+
+ return isObject ? 'deepStrictEqual' : 'strictEqual';
+};
+},{"./flag":15,"type-detect":39}],20:[function(require,module,exports){
/*!
- * ## parsePath(path)
- *
- * Helper function used to parse string object
- * paths. Use in conjunction with `_getPathValue`.
- *
- * var parsed = parsePath('myobject.property.subprop');
- *
- * ### Paths:
- *
- * * Can be as near infinitely deep and nested
- * * Arrays are also valid using the formal `myobject.document[3].property`.
- * * Literal dots and brackets (not delimiter) must be backslash-escaped.
- *
- * @param {String} path
- * @returns {Object} parsed
- * @api private
+ * Chai - getOwnEnumerableProperties utility
+ * Copyright(c) 2011-2016 Jake Luer
+ * MIT Licensed
*/
-function parsePath (path) {
- var str = path.replace(/([^\\])\[/g, '$1.[')
- , parts = str.match(/(\\\.|[^.]+?)+/g);
- return parts.map(function (value) {
- var re = /^\[(\d+)\]$/
- , mArr = re.exec(value);
- if (mArr) return { i: parseFloat(mArr[1]) };
- else return { p: value.replace(/\\([.\[\]])/g, '$1') };
- });
-}
+/*!
+ * Module dependencies
+ */
+var getOwnEnumerablePropertySymbols = require('./getOwnEnumerablePropertySymbols');
-/*!
- * ## _getPathValue(parsed, obj)
- *
- * Helper companion function for `.parsePath` that returns
- * the value located at the parsed address.
+/**
+ * ### .getOwnEnumerableProperties(object)
*
- * var value = getPathValue(parsed, obj);
+ * This allows the retrieval of directly-owned enumerable property names and
+ * symbols of an object. This function is necessary because Object.keys only
+ * returns enumerable property names, not enumerable property symbols.
*
- * @param {Object} parsed definition from `parsePath`.
- * @param {Object} object to search against
- * @param {Number} object to search against
- * @returns {Object|Undefined} value
- * @api private
+ * @param {Object} object
+ * @returns {Array}
+ * @namespace Utils
+ * @name getOwnEnumerableProperties
+ * @api public
*/
-function _getPathValue (parsed, obj, index) {
- var tmp = obj
- , res;
-
- index = (index === undefined ? parsed.length : index);
-
- for (var i = 0, l = index; i < l; i++) {
- var part = parsed[i];
- if (tmp) {
- if ('undefined' !== typeof part.p)
- tmp = tmp[part.p];
- else if ('undefined' !== typeof part.i)
- tmp = tmp[part.i];
- if (i == (l - 1)) res = tmp;
- } else {
- res = undefined;
- }
- }
- return res;
-}
+module.exports = function getOwnEnumerableProperties(obj) {
+ return Object.keys(obj).concat(getOwnEnumerablePropertySymbols(obj));
+};
-},{"./hasProperty":21}],19:[function(require,module,exports){
+},{"./getOwnEnumerablePropertySymbols":21}],21:[function(require,module,exports){
/*!
- * Chai - getPathValue utility
- * Copyright(c) 2012-2014 Jake Luer
- * @see https://github.com/logicalparadox/filtr
+ * Chai - getOwnEnumerablePropertySymbols utility
+ * Copyright(c) 2011-2016 Jake Luer
* MIT Licensed
*/
-var getPathInfo = require('./getPathInfo');
-
/**
- * ### .getPathValue(path, object)
- *
- * This allows the retrieval of values in an
- * object given a string path.
- *
- * var obj = {
- * prop1: {
- * arr: ['a', 'b', 'c']
- * , str: 'Hello'
- * }
- * , prop2: {
- * arr: [ { nested: 'Universe' } ]
- * , str: 'Hello again!'
- * }
- * }
+ * ### .getOwnEnumerablePropertySymbols(object)
*
- * The following would be the results.
- *
- * getPathValue('prop1.str', obj); // Hello
- * getPathValue('prop1.att[2]', obj); // b
- * getPathValue('prop2.arr[0].nested', obj); // Universe
+ * This allows the retrieval of directly-owned enumerable property symbols of an
+ * object. This function is necessary because Object.getOwnPropertySymbols
+ * returns both enumerable and non-enumerable property symbols.
*
- * @param {String} path
* @param {Object} object
- * @returns {Object} value or `undefined`
+ * @returns {Array}
* @namespace Utils
- * @name getPathValue
+ * @name getOwnEnumerablePropertySymbols
* @api public
*/
-module.exports = function(path, obj) {
- var info = getPathInfo(path, obj);
- return info.value;
+
+module.exports = function getOwnEnumerablePropertySymbols(obj) {
+ if (typeof Object.getOwnPropertySymbols !== 'function') return [];
+
+ return Object.getOwnPropertySymbols(obj).filter(function (sym) {
+ return Object.getOwnPropertyDescriptor(obj, sym).enumerable;
+ });
};
-},{"./getPathInfo":18}],20:[function(require,module,exports){
+},{}],22:[function(require,module,exports){
/*!
* Chai - getProperties utility
* Copyright(c) 2012-2014 Jake Luer
@@ -4646,73 +8346,7 @@ module.exports = function getProperties(object) {
return result;
};
-},{}],21:[function(require,module,exports){
-/*!
- * Chai - hasProperty utility
- * Copyright(c) 2012-2014 Jake Luer
- * MIT Licensed
- */
-
-var type = require('type-detect');
-
-/**
- * ### .hasProperty(object, name)
- *
- * This allows checking whether an object has
- * named property or numeric array index.
- *
- * Basically does the same thing as the `in`
- * operator but works properly with natives
- * and null/undefined values.
- *
- * var obj = {
- * arr: ['a', 'b', 'c']
- * , str: 'Hello'
- * }
- *
- * The following would be the results.
- *
- * hasProperty('str', obj); // true
- * hasProperty('constructor', obj); // true
- * hasProperty('bar', obj); // false
- *
- * hasProperty('length', obj.str); // true
- * hasProperty(1, obj.str); // true
- * hasProperty(5, obj.str); // false
- *
- * hasProperty('length', obj.arr); // true
- * hasProperty(2, obj.arr); // true
- * hasProperty(3, obj.arr); // false
- *
- * @param {Objuect} object
- * @param {String|Number} name
- * @returns {Boolean} whether it exists
- * @namespace Utils
- * @name getPathInfo
- * @api public
- */
-
-var literals = {
- 'number': Number
- , 'string': String
-};
-
-module.exports = function hasProperty(name, obj) {
- var ot = type(obj);
-
- // Bad Object, obviously no props at all
- if(ot === 'null' || ot === 'undefined')
- return false;
-
- // The `in` operator does not work with certain literals
- // box these before the check
- if(literals[ot] && typeof obj !== 'object')
- obj = new literals[ot](obj);
-
- return name in obj;
-};
-
-},{"type-detect":35}],22:[function(require,module,exports){
+},{}],23:[function(require,module,exports){
/*!
* chai
* Copyright(c) 2011 Jake Luer
@@ -4720,10 +8354,10 @@ module.exports = function hasProperty(name, obj) {
*/
/*!
- * Main exports
+ * Dependencies that are used for multiple exports are required here only once
*/
-var exports = module.exports = {};
+var pathval = require('pathval');
/*!
* test utility
@@ -4784,29 +8418,23 @@ exports.transferFlags = require('./transferFlags');
exports.eql = require('deep-eql');
-/*!
- * Deep path value
- */
-
-exports.getPathValue = require('./getPathValue');
-
/*!
* Deep path info
*/
-exports.getPathInfo = require('./getPathInfo');
+exports.getPathInfo = pathval.getPathInfo;
/*!
* Check if a property exists
*/
-exports.hasProperty = require('./hasProperty');
+exports.hasProperty = pathval.hasProperty;
/*!
* Function name
*/
-exports.getName = require('./getName');
+exports.getName = require('get-func-name');
/*!
* add Property
@@ -4844,23 +8472,79 @@ exports.addChainableMethod = require('./addChainableMethod');
exports.overwriteChainableMethod = require('./overwriteChainableMethod');
-},{"./addChainableMethod":9,"./addMethod":10,"./addProperty":11,"./expectTypes":12,"./flag":13,"./getActual":14,"./getMessage":16,"./getName":17,"./getPathInfo":18,"./getPathValue":19,"./hasProperty":21,"./inspect":23,"./objDisplay":24,"./overwriteChainableMethod":25,"./overwriteMethod":26,"./overwriteProperty":27,"./test":28,"./transferFlags":29,"deep-eql":31,"type-detect":35}],23:[function(require,module,exports){
+/*!
+ * Compare by inspect method
+ */
+
+exports.compareByInspect = require('./compareByInspect');
+
+/*!
+ * Get own enumerable property symbols method
+ */
+
+exports.getOwnEnumerablePropertySymbols = require('./getOwnEnumerablePropertySymbols');
+
+/*!
+ * Get own enumerable properties method
+ */
+
+exports.getOwnEnumerableProperties = require('./getOwnEnumerableProperties');
+
+/*!
+ * Checks error against a given set of criteria
+ */
+
+exports.checkError = require('check-error');
+
+/*!
+ * Proxify util
+ */
+
+exports.proxify = require('./proxify');
+
+/*!
+ * addLengthGuard util
+ */
+
+exports.addLengthGuard = require('./addLengthGuard');
+
+/*!
+ * isProxyEnabled helper
+ */
+
+exports.isProxyEnabled = require('./isProxyEnabled');
+
+/*!
+ * isNaN method
+ */
+
+exports.isNaN = require('./isNaN');
+
+/*!
+ * getOperator method
+ */
+
+exports.getOperator = require('./getOperator');
+},{"./addChainableMethod":9,"./addLengthGuard":10,"./addMethod":11,"./addProperty":12,"./compareByInspect":13,"./expectTypes":14,"./flag":15,"./getActual":16,"./getMessage":18,"./getOperator":19,"./getOwnEnumerableProperties":20,"./getOwnEnumerablePropertySymbols":21,"./inspect":24,"./isNaN":25,"./isProxyEnabled":26,"./objDisplay":27,"./overwriteChainableMethod":28,"./overwriteMethod":29,"./overwriteProperty":30,"./proxify":31,"./test":32,"./transferFlags":33,"check-error":35,"deep-eql":36,"get-func-name":37,"pathval":38,"type-detect":39}],24:[function(require,module,exports){
// This is (almost) directly from Node.js utils
// https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/util.js
-var getName = require('./getName');
+var getName = require('get-func-name');
var getProperties = require('./getProperties');
var getEnumerableProperties = require('./getEnumerableProperties');
+var config = require('../config');
module.exports = inspect;
/**
- * Echos the value of a value. Trys to print the value out
+ * ### .inspect(obj, [showHidden], [depth], [colors])
+ *
+ * Echoes the value of a value. Tries to print the value out
* in the best way possible given the different types.
*
* @param {Object} obj The object to print out.
* @param {Boolean} showHidden Flag that shows hidden (not enumerable)
- * properties of objects.
+ * properties of objects. Default is false.
* @param {Number} depth Depth in which to descend in object. Default is 2.
* @param {Boolean} colors Flag to turn on ANSI escape codes to color the
* output. Default is false (no coloring).
@@ -4883,6 +8567,7 @@ var isDOMElement = function (object) {
} else {
return object &&
typeof object === 'object' &&
+ 'nodeType' in object &&
object.nodeType === 1 &&
typeof object.nodeName === 'string';
}
@@ -4896,7 +8581,7 @@ function formatValue(ctx, value, recurseTimes) {
value.inspect !== exports.inspect &&
// Also filter out any prototype objects using the circular check.
!(value.constructor && value.constructor.prototype === value)) {
- var ret = value.inspect(recurseTimes);
+ var ret = value.inspect(recurseTimes, ctx);
if (typeof ret !== 'string') {
ret = formatValue(ctx, ret, recurseTimes);
}
@@ -4929,7 +8614,7 @@ function formatValue(ctx, value, recurseTimes) {
var container = document.createElementNS(ns, '_');
container.appendChild(value.cloneNode(false));
- html = container.innerHTML
+ var html = container.innerHTML
.replace('><', '>' + value.innerHTML + '<');
container.innerHTML = '';
return html;
@@ -4946,7 +8631,9 @@ function formatValue(ctx, value, recurseTimes) {
var visibleKeys = getEnumerableProperties(value);
var keys = ctx.showHidden ? getProperties(value) : visibleKeys;
- // Some type of object without properties can be shortcutted.
+ var name, nameSuffix;
+
+ // Some type of object without properties can be shortcut.
// In IE, errors have a single `stack` property, or if they are vanilla `Error`,
// a `stack` plus `description` property; ignore those for consistency.
if (keys.length === 0 || (isError(value) && (
@@ -4954,8 +8641,8 @@ function formatValue(ctx, value, recurseTimes) {
(keys.length === 2 && keys[0] === 'description' && keys[1] === 'stack')
))) {
if (typeof value === 'function') {
- var name = getName(value);
- var nameSuffix = name ? ': ' + name : '';
+ name = getName(value);
+ nameSuffix = name ? ': ' + name : '';
return ctx.stylize('[Function' + nameSuffix + ']', 'special');
}
if (isRegExp(value)) {
@@ -4969,7 +8656,15 @@ function formatValue(ctx, value, recurseTimes) {
}
}
- var base = '', array = false, braces = ['{', '}'];
+ var base = ''
+ , array = false
+ , typedArray = false
+ , braces = ['{', '}'];
+
+ if (isTypedArray(value)) {
+ typedArray = true;
+ braces = ['[', ']'];
+ }
// Make Array say that they are Array
if (isArray(value)) {
@@ -4979,8 +8674,8 @@ function formatValue(ctx, value, recurseTimes) {
// Make functions say that they are functions
if (typeof value === 'function') {
- var name = getName(value);
- var nameSuffix = name ? ': ' + name : '';
+ name = getName(value);
+ nameSuffix = name ? ': ' + name : '';
base = ' [Function' + nameSuffix + ']';
}
@@ -5016,6 +8711,8 @@ function formatValue(ctx, value, recurseTimes) {
var output;
if (array) {
output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
+ } else if (typedArray) {
+ return formatTypedArray(value);
} else {
output = keys.map(function(key) {
return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
@@ -5027,7 +8724,6 @@ function formatValue(ctx, value, recurseTimes) {
return reduceToSingleString(output, base, braces);
}
-
function formatPrimitive(ctx, value) {
switch (typeof value) {
case 'undefined':
@@ -5047,6 +8743,12 @@ function formatPrimitive(ctx, value) {
case 'boolean':
return ctx.stylize('' + value, 'boolean');
+
+ case 'symbol':
+ return ctx.stylize(value.toString(), 'symbol');
+
+ case 'bigint':
+ return ctx.stylize(value.toString() + 'n', 'bigint');
}
// For some reason typeof null is "object", so special case here.
if (value === null) {
@@ -5054,12 +8756,10 @@ function formatPrimitive(ctx, value) {
}
}
-
function formatError(value) {
return '[' + Error.prototype.toString.call(value) + ']';
}
-
function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
var output = [];
for (var i = 0, l = value.length; i < l; ++i) {
@@ -5070,6 +8770,7 @@ function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
output.push('');
}
}
+
keys.forEach(function(key) {
if (!key.match(/^\d+$/)) {
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
@@ -5079,18 +8780,40 @@ function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
return output;
}
+function formatTypedArray(value) {
+ var str = '[ ';
+
+ for (var i = 0; i < value.length; ++i) {
+ if (str.length >= config.truncateThreshold - 7) {
+ str += '...';
+ break;
+ }
+ str += value[i] + ', ';
+ }
+ str += ' ]';
+
+ // Removing trailing `, ` if the array was not truncated
+ if (str.indexOf(', ]') !== -1) {
+ str = str.replace(', ]', ' ]');
+ }
+
+ return str;
+}
function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
- var name, str;
- if (value.__lookupGetter__) {
- if (value.__lookupGetter__(key)) {
- if (value.__lookupSetter__(key)) {
+ var name;
+ var propDescriptor = Object.getOwnPropertyDescriptor(value, key);
+ var str;
+
+ if (propDescriptor) {
+ if (propDescriptor.get) {
+ if (propDescriptor.set) {
str = ctx.stylize('[Getter/Setter]', 'special');
} else {
str = ctx.stylize('[Getter]', 'special');
}
} else {
- if (value.__lookupSetter__(key)) {
+ if (propDescriptor.set) {
str = ctx.stylize('[Setter]', 'special');
}
}
@@ -5139,12 +8862,8 @@ function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
return name + ': ' + str;
}
-
function reduceToSingleString(output, base, braces) {
- var numLinesEst = 0;
var length = output.reduce(function(prev, cur) {
- numLinesEst++;
- if (cur.indexOf('\n') >= 0) numLinesEst++;
return prev + cur.length + 1;
}, 0);
@@ -5160,6 +8879,12 @@ function reduceToSingleString(output, base, braces) {
return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
}
+function isTypedArray(ar) {
+ // Unfortunately there's no way to check if an object is a TypedArray
+ // We have to check if it's one of these types
+ return (typeof ar === 'object' && /\w+Array]$/.test(objectToString(ar)));
+}
+
function isArray(ar) {
return Array.isArray(ar) ||
(typeof ar === 'object' && objectToString(ar) === '[object Array]');
@@ -5181,7 +8906,61 @@ function objectToString(o) {
return Object.prototype.toString.call(o);
}
-},{"./getEnumerableProperties":15,"./getName":17,"./getProperties":20}],24:[function(require,module,exports){
+},{"../config":4,"./getEnumerableProperties":17,"./getProperties":22,"get-func-name":37}],25:[function(require,module,exports){
+/*!
+ * Chai - isNaN utility
+ * Copyright(c) 2012-2015 Sakthipriyan Vairamani
+ * MIT Licensed
+ */
+
+/**
+ * ### .isNaN(value)
+ *
+ * Checks if the given value is NaN or not.
+ *
+ * utils.isNaN(NaN); // true
+ *
+ * @param {Value} The value which has to be checked if it is NaN
+ * @name isNaN
+ * @api private
+ */
+
+function isNaN(value) {
+ // Refer http://www.ecma-international.org/ecma-262/6.0/#sec-isnan-number
+ // section's NOTE.
+ return value !== value;
+}
+
+// If ECMAScript 6's Number.isNaN is present, prefer that.
+module.exports = Number.isNaN || isNaN;
+
+},{}],26:[function(require,module,exports){
+var config = require('../config');
+
+/*!
+ * Chai - isProxyEnabled helper
+ * Copyright(c) 2012-2014 Jake Luer
+ * MIT Licensed
+ */
+
+/**
+ * ### .isProxyEnabled()
+ *
+ * Helper function to check if Chai's proxy protection feature is enabled. If
+ * proxies are unsupported or disabled via the user's Chai config, then return
+ * false. Otherwise, return true.
+ *
+ * @namespace Utils
+ * @name isProxyEnabled
+ */
+
+module.exports = function isProxyEnabled() {
+ return config.useProxy &&
+ typeof Proxy !== 'undefined' &&
+ typeof Reflect !== 'undefined';
+};
+
+},{"../config":4}],27:[function(require,module,exports){
/*!
* Chai - flag utility
* Copyright(c) 2012-2014 Jake Luer
@@ -5189,14 +8968,14 @@ function objectToString(o) {
*/
/*!
- * Module dependancies
+ * Module dependencies
*/
var inspect = require('./inspect');
var config = require('../config');
/**
- * ### .objDisplay (object)
+ * ### .objDisplay(object)
*
* Determines if an object or an array matches
* criteria to be inspected in-line for error
@@ -5208,7 +8987,7 @@ var config = require('../config');
* @api public
*/
-module.exports = function (obj) {
+module.exports = function objDisplay(obj) {
var str = inspect(obj)
, type = Object.prototype.toString.call(obj);
@@ -5233,22 +9012,25 @@ module.exports = function (obj) {
}
};
-},{"../config":4,"./inspect":23}],25:[function(require,module,exports){
+},{"../config":4,"./inspect":24}],28:[function(require,module,exports){
/*!
* Chai - overwriteChainableMethod utility
* Copyright(c) 2012-2014 Jake Luer
* MIT Licensed
*/
+var chai = require('../../chai');
+var transferFlags = require('./transferFlags');
+
/**
- * ### overwriteChainableMethod (ctx, name, method, chainingBehavior)
+ * ### .overwriteChainableMethod(ctx, name, method, chainingBehavior)
*
- * Overwites an already existing chainable method
+ * Overwrites an already existing chainable method
* and provides access to the previous function or
* property. Must return functions to be used for
* name.
*
- * utils.overwriteChainableMethod(chai.Assertion.prototype, 'length',
+ * utils.overwriteChainableMethod(chai.Assertion.prototype, 'lengthOf',
* function (_super) {
* }
* , function (_super) {
@@ -5261,8 +9043,8 @@ module.exports = function (obj) {
*
* Then can be used as any other assertion.
*
- * expect(myFoo).to.have.length(3);
- * expect(myFoo).to.have.length.above(3);
+ * expect(myFoo).to.have.lengthOf(3);
+ * expect(myFoo).to.have.lengthOf.above(3);
*
* @param {Object} ctx object whose method / property is to be overwritten
* @param {String} name of method / property to overwrite
@@ -5273,33 +9055,51 @@ module.exports = function (obj) {
* @api public
*/
-module.exports = function (ctx, name, method, chainingBehavior) {
+module.exports = function overwriteChainableMethod(ctx, name, method, chainingBehavior) {
var chainableBehavior = ctx.__methods[name];
var _chainingBehavior = chainableBehavior.chainingBehavior;
- chainableBehavior.chainingBehavior = function () {
+ chainableBehavior.chainingBehavior = function overwritingChainableMethodGetter() {
var result = chainingBehavior(_chainingBehavior).call(this);
- return result === undefined ? this : result;
+ if (result !== undefined) {
+ return result;
+ }
+
+ var newAssertion = new chai.Assertion();
+ transferFlags(this, newAssertion);
+ return newAssertion;
};
var _method = chainableBehavior.method;
- chainableBehavior.method = function () {
+ chainableBehavior.method = function overwritingChainableMethodWrapper() {
var result = method(_method).apply(this, arguments);
- return result === undefined ? this : result;
+ if (result !== undefined) {
+ return result;
+ }
+
+ var newAssertion = new chai.Assertion();
+ transferFlags(this, newAssertion);
+ return newAssertion;
};
};
-},{}],26:[function(require,module,exports){
+},{"../../chai":2,"./transferFlags":33}],29:[function(require,module,exports){
/*!
* Chai - overwriteMethod utility
* Copyright(c) 2012-2014 Jake Luer
* MIT Licensed
*/
+var addLengthGuard = require('./addLengthGuard');
+var chai = require('../../chai');
+var flag = require('./flag');
+var proxify = require('./proxify');
+var transferFlags = require('./transferFlags');
+
/**
- * ### overwriteMethod (ctx, name, fn)
+ * ### .overwriteMethod(ctx, name, fn)
*
- * Overwites an already existing method and provides
+ * Overwrites an already existing method and provides
* access to previous function. Must return function
* to be used for name.
*
@@ -5330,30 +9130,69 @@ module.exports = function (ctx, name, method, chainingBehavior) {
* @api public
*/
-module.exports = function (ctx, name, method) {
+module.exports = function overwriteMethod(ctx, name, method) {
var _method = ctx[name]
- , _super = function () { return this; };
+ , _super = function () {
+ throw new Error(name + ' is not a function');
+ };
if (_method && 'function' === typeof _method)
_super = _method;
- ctx[name] = function () {
+ var overwritingMethodWrapper = function () {
+ // Setting the `ssfi` flag to `overwritingMethodWrapper` causes this
+ // function to be the starting point for removing implementation frames from
+ // the stack trace of a failed assertion.
+ //
+ // However, we only want to use this function as the starting point if the
+ // `lockSsfi` flag isn't set.
+ //
+ // If the `lockSsfi` flag is set, then either this assertion has been
+ // overwritten by another assertion, or this assertion is being invoked from
+ // inside of another assertion. In the first case, the `ssfi` flag has
+ // already been set by the overwriting assertion. In the second case, the
+ // `ssfi` flag has already been set by the outer assertion.
+ if (!flag(this, 'lockSsfi')) {
+ flag(this, 'ssfi', overwritingMethodWrapper);
+ }
+
+ // Setting the `lockSsfi` flag to `true` prevents the overwritten assertion
+ // from changing the `ssfi` flag. By this point, the `ssfi` flag is already
+ // set to the correct starting point for this assertion.
+ var origLockSsfi = flag(this, 'lockSsfi');
+ flag(this, 'lockSsfi', true);
var result = method(_super).apply(this, arguments);
- return result === undefined ? this : result;
+ flag(this, 'lockSsfi', origLockSsfi);
+
+ if (result !== undefined) {
+ return result;
+ }
+
+ var newAssertion = new chai.Assertion();
+ transferFlags(this, newAssertion);
+ return newAssertion;
}
+
+ addLengthGuard(overwritingMethodWrapper, name, false);
+ ctx[name] = proxify(overwritingMethodWrapper, name);
};
-},{}],27:[function(require,module,exports){
+},{"../../chai":2,"./addLengthGuard":10,"./flag":15,"./proxify":31,"./transferFlags":33}],30:[function(require,module,exports){
/*!
* Chai - overwriteProperty utility
* Copyright(c) 2012-2014 Jake Luer
* MIT Licensed
*/
+var chai = require('../../chai');
+var flag = require('./flag');
+var isProxyEnabled = require('./isProxyEnabled');
+var transferFlags = require('./transferFlags');
+
/**
- * ### overwriteProperty (ctx, name, fn)
+ * ### .overwriteProperty(ctx, name, fn)
*
- * Overwites an already existing property getter and provides
+ * Overwrites an already existing property getter and provides
* access to previous value. Must return function to use as getter.
*
* utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super) {
@@ -5384,7 +9223,7 @@ module.exports = function (ctx, name, method) {
* @api public
*/
-module.exports = function (ctx, name, getter) {
+module.exports = function overwriteProperty(ctx, name, getter) {
var _get = Object.getOwnPropertyDescriptor(ctx, name)
, _super = function () {};
@@ -5392,15 +9231,196 @@ module.exports = function (ctx, name, getter) {
_super = _get.get
Object.defineProperty(ctx, name,
- { get: function () {
+ { get: function overwritingPropertyGetter() {
+ // Setting the `ssfi` flag to `overwritingPropertyGetter` causes this
+ // function to be the starting point for removing implementation frames
+ // from the stack trace of a failed assertion.
+ //
+ // However, we only want to use this function as the starting point if
+ // the `lockSsfi` flag isn't set and proxy protection is disabled.
+ //
+ // If the `lockSsfi` flag is set, then either this assertion has been
+ // overwritten by another assertion, or this assertion is being invoked
+ // from inside of another assertion. In the first case, the `ssfi` flag
+ // has already been set by the overwriting assertion. In the second
+ // case, the `ssfi` flag has already been set by the outer assertion.
+ //
+ // If proxy protection is enabled, then the `ssfi` flag has already been
+ // set by the proxy getter.
+ if (!isProxyEnabled() && !flag(this, 'lockSsfi')) {
+ flag(this, 'ssfi', overwritingPropertyGetter);
+ }
+
+ // Setting the `lockSsfi` flag to `true` prevents the overwritten
+ // assertion from changing the `ssfi` flag. By this point, the `ssfi`
+ // flag is already set to the correct starting point for this assertion.
+ var origLockSsfi = flag(this, 'lockSsfi');
+ flag(this, 'lockSsfi', true);
var result = getter(_super).call(this);
- return result === undefined ? this : result;
+ flag(this, 'lockSsfi', origLockSsfi);
+
+ if (result !== undefined) {
+ return result;
+ }
+
+ var newAssertion = new chai.Assertion();
+ transferFlags(this, newAssertion);
+ return newAssertion;
}
, configurable: true
});
};
-},{}],28:[function(require,module,exports){
+},{"../../chai":2,"./flag":15,"./isProxyEnabled":26,"./transferFlags":33}],31:[function(require,module,exports){
+var config = require('../config');
+var flag = require('./flag');
+var getProperties = require('./getProperties');
+var isProxyEnabled = require('./isProxyEnabled');
+
+/*!
+ * Chai - proxify utility
+ * Copyright(c) 2012-2014 Jake Luer
+ * MIT Licensed
+ */
+
+/**
+ * ### .proxify(object)
+ *
+ * Return a proxy of given object that throws an error when a non-existent
+ * property is read. By default, the root cause is assumed to be a misspelled
+ * property, and thus an attempt is made to offer a reasonable suggestion from
+ * the list of existing properties. However, if a nonChainableMethodName is
+ * provided, then the root cause is instead a failure to invoke a non-chainable
+ * method prior to reading the non-existent property.
+ *
+ * If proxies are unsupported or disabled via the user's Chai config, then
+ * return object without modification.
+ *
+ * @param {Object} obj
+ * @param {String} nonChainableMethodName
+ * @namespace Utils
+ * @name proxify
+ */
+
+var builtins = ['__flags', '__methods', '_obj', 'assert'];
+
+module.exports = function proxify(obj, nonChainableMethodName) {
+ if (!isProxyEnabled()) return obj;
+
+ return new Proxy(obj, {
+ get: function proxyGetter(target, property) {
+ // This check is here because we should not throw errors on Symbol properties
+ // such as `Symbol.toStringTag`.
+ // The values for which an error should be thrown can be configured using
+ // the `config.proxyExcludedKeys` setting.
+ if (typeof property === 'string' &&
+ config.proxyExcludedKeys.indexOf(property) === -1 &&
+ !Reflect.has(target, property)) {
+ // Special message for invalid property access of non-chainable methods.
+ if (nonChainableMethodName) {
+ throw Error('Invalid Chai property: ' + nonChainableMethodName + '.' +
+ property + '. See docs for proper usage of "' +
+ nonChainableMethodName + '".');
+ }
+
+ // If the property is reasonably close to an existing Chai property,
+ // suggest that property to the user. Only suggest properties with a
+ // distance less than 4.
+ var suggestion = null;
+ var suggestionDistance = 4;
+ getProperties(target).forEach(function(prop) {
+ if (
+ !Object.prototype.hasOwnProperty(prop) &&
+ builtins.indexOf(prop) === -1
+ ) {
+ var dist = stringDistanceCapped(
+ property,
+ prop,
+ suggestionDistance
+ );
+ if (dist < suggestionDistance) {
+ suggestion = prop;
+ suggestionDistance = dist;
+ }
+ }
+ });
+
+ if (suggestion !== null) {
+ throw Error('Invalid Chai property: ' + property +
+ '. Did you mean "' + suggestion + '"?');
+ } else {
+ throw Error('Invalid Chai property: ' + property);
+ }
+ }
+
+ // Use this proxy getter as the starting point for removing implementation
+ // frames from the stack trace of a failed assertion. For property
+ // assertions, this prevents the proxy getter from showing up in the stack
+ // trace since it's invoked before the property getter. For method and
+ // chainable method assertions, this flag will end up getting changed to
+ // the method wrapper, which is good since this frame will no longer be in
+ // the stack once the method is invoked. Note that Chai builtin assertion
+ // properties such as `__flags` are skipped since this is only meant to
+ // capture the starting point of an assertion. This step is also skipped
+ // if the `lockSsfi` flag is set, thus indicating that this assertion is
+ // being called from within another assertion. In that case, the `ssfi`
+ // flag is already set to the outer assertion's starting point.
+ if (builtins.indexOf(property) === -1 && !flag(target, 'lockSsfi')) {
+ flag(target, 'ssfi', proxyGetter);
+ }
+
+ return Reflect.get(target, property);
+ }
+ });
+};
+
+/**
+ * # stringDistanceCapped(strA, strB, cap)
+ * Return the Levenshtein distance between two strings, but no more than cap.
+ * @param {string} strA
+ * @param {string} strB
+ * @param {number} number
+ * @return {number} min(string distance between strA and strB, cap)
+ * @api private
+ */
+
+function stringDistanceCapped(strA, strB, cap) {
+ if (Math.abs(strA.length - strB.length) >= cap) {
+ return cap;
+ }
+
+ var memo = [];
+ // `memo` is a two-dimensional array containing distances.
+ // memo[i][j] is the distance between strA.slice(0, i) and
+ // strB.slice(0, j).
+ for (var i = 0; i <= strA.length; i++) {
+ memo[i] = Array(strB.length + 1).fill(0);
+ memo[i][0] = i;
+ }
+ for (var j = 0; j < strB.length; j++) {
+ memo[0][j] = j;
+ }
+
+ for (var i = 1; i <= strA.length; i++) {
+ var ch = strA.charCodeAt(i - 1);
+ for (var j = 1; j <= strB.length; j++) {
+ if (Math.abs(i - j) >= cap) {
+ memo[i][j] = cap;
+ continue;
+ }
+ memo[i][j] = Math.min(
+ memo[i - 1][j] + 1,
+ memo[i][j - 1] + 1,
+ memo[i - 1][j - 1] +
+ (ch === strB.charCodeAt(j - 1) ? 0 : 1)
+ );
+ }
+ }
+
+ return memo[strA.length][strB.length];
+}
+
+},{"../config":4,"./flag":15,"./getProperties":22,"./isProxyEnabled":26}],32:[function(require,module,exports){
/*!
* Chai - test utility
* Copyright(c) 2012-2014 Jake Luer
@@ -5408,13 +9428,13 @@ module.exports = function (ctx, name, getter) {
*/
/*!
- * Module dependancies
+ * Module dependencies
*/
var flag = require('./flag');
/**
- * # test(object, expression)
+ * ### .test(object, expression)
*
* Test and object for expression.
*
@@ -5424,13 +9444,13 @@ var flag = require('./flag');
* @name test
*/
-module.exports = function (obj, args) {
+module.exports = function test(obj, args) {
var negate = flag(obj, 'negate')
, expr = args[0];
return negate ? !expr : expr;
};
-},{"./flag":13}],29:[function(require,module,exports){
+},{"./flag":15}],33:[function(require,module,exports){
/*!
* Chai - transferFlags utility
* Copyright(c) 2012-2014 Jake Luer
@@ -5438,18 +9458,18 @@ module.exports = function (obj, args) {
*/
/**
- * ### transferFlags(assertion, object, includeAll = true)
+ * ### .transferFlags(assertion, object, includeAll = true)
*
* Transfer all the flags for `assertion` to `object`. If
* `includeAll` is set to `false`, then the base Chai
- * assertion flags (namely `object`, `ssfi`, and `message`)
- * will not be transferred.
+ * assertion flags (namely `object`, `ssfi`, `lockSsfi`,
+ * and `message`) will not be transferred.
*
*
* var newAssertion = new Assertion();
* utils.transferFlags(assertion, newAssertion);
*
- * var anotherAsseriton = new Assertion(myObj);
+ * var anotherAssertion = new Assertion(myObj);
* utils.transferFlags(assertion, anotherAssertion, false);
*
* @param {Assertion} assertion the assertion to transfer the flags from
@@ -5460,7 +9480,7 @@ module.exports = function (obj, args) {
* @api private
*/
-module.exports = function (assertion, object, includeAll) {
+module.exports = function transferFlags(assertion, object, includeAll) {
var flags = assertion.__flags || (assertion.__flags = Object.create(null));
if (!object.__flags) {
@@ -5471,13 +9491,13 @@ module.exports = function (assertion, object, includeAll) {
for (var flag in flags) {
if (includeAll ||
- (flag !== 'object' && flag !== 'ssfi' && flag != 'message')) {
+ (flag !== 'object' && flag !== 'ssfi' && flag !== 'lockSsfi' && flag != 'message')) {
object.__flags[flag] = flags[flag];
}
}
};
-},{}],30:[function(require,module,exports){
+},{}],34:[function(require,module,exports){
/*!
* assertion-error
* Copyright(c) 2013 Jake Luer
@@ -5546,11 +9566,15 @@ function AssertionError (message, _props, ssf) {
}
// capture stack trace
- ssf = ssf || arguments.callee;
- if (ssf && Error.captureStackTrace) {
+ ssf = ssf || AssertionError;
+ if (Error.captureStackTrace) {
Error.captureStackTrace(this, ssf);
} else {
- this.stack = new Error().stack;
+ try {
+ throw new Error();
+ } catch(e) {
+ this.stack = e.stack;
+ }
}
}
@@ -5591,31 +9615,253 @@ AssertionError.prototype.toJSON = function (stack) {
return props;
};
-},{}],31:[function(require,module,exports){
-module.exports = require('./lib/eql');
+},{}],35:[function(require,module,exports){
+'use strict';
-},{"./lib/eql":32}],32:[function(require,module,exports){
-/*!
- * deep-eql
- * Copyright(c) 2013 Jake Luer
+/* !
+ * Chai - checkError utility
+ * Copyright(c) 2012-2016 Jake Luer
* MIT Licensed
*/
+/**
+ * ### .checkError
+ *
+ * Checks that an error conforms to a given set of criteria and/or retrieves information about it.
+ *
+ * @api public
+ */
+
+/**
+ * ### .compatibleInstance(thrown, errorLike)
+ *
+ * Checks if two instances are compatible (strict equal).
+ * Returns false if errorLike is not an instance of Error, because instances
+ * can only be compatible if they're both error instances.
+ *
+ * @name compatibleInstance
+ * @param {Error} thrown error
+ * @param {Error|ErrorConstructor} errorLike object to compare against
+ * @namespace Utils
+ * @api public
+ */
+
+function compatibleInstance(thrown, errorLike) {
+ return errorLike instanceof Error && thrown === errorLike;
+}
+
+/**
+ * ### .compatibleConstructor(thrown, errorLike)
+ *
+ * Checks if two constructors are compatible.
+ * This function can receive either an error constructor or
+ * an error instance as the `errorLike` argument.
+ * Constructors are compatible if they're the same or if one is
+ * an instance of another.
+ *
+ * @name compatibleConstructor
+ * @param {Error} thrown error
+ * @param {Error|ErrorConstructor} errorLike object to compare against
+ * @namespace Utils
+ * @api public
+ */
+
+function compatibleConstructor(thrown, errorLike) {
+ if (errorLike instanceof Error) {
+ // If `errorLike` is an instance of any error we compare their constructors
+ return thrown.constructor === errorLike.constructor || thrown instanceof errorLike.constructor;
+ } else if (errorLike.prototype instanceof Error || errorLike === Error) {
+ // If `errorLike` is a constructor that inherits from Error, we compare `thrown` to `errorLike` directly
+ return thrown.constructor === errorLike || thrown instanceof errorLike;
+ }
+
+ return false;
+}
+
+/**
+ * ### .compatibleMessage(thrown, errMatcher)
+ *
+ * Checks if an error's message is compatible with a matcher (String or RegExp).
+ * If the message contains the String or passes the RegExp test,
+ * it is considered compatible.
+ *
+ * @name compatibleMessage
+ * @param {Error} thrown error
+ * @param {String|RegExp} errMatcher to look for into the message
+ * @namespace Utils
+ * @api public
+ */
+
+function compatibleMessage(thrown, errMatcher) {
+ var comparisonString = typeof thrown === 'string' ? thrown : thrown.message;
+ if (errMatcher instanceof RegExp) {
+ return errMatcher.test(comparisonString);
+ } else if (typeof errMatcher === 'string') {
+ return comparisonString.indexOf(errMatcher) !== -1; // eslint-disable-line no-magic-numbers
+ }
+
+ return false;
+}
+
+/**
+ * ### .getFunctionName(constructorFn)
+ *
+ * Returns the name of a function.
+ * This also includes a polyfill function if `constructorFn.name` is not defined.
+ *
+ * @name getFunctionName
+ * @param {Function} constructorFn
+ * @namespace Utils
+ * @api private
+ */
+
+var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\(\/]+)/;
+function getFunctionName(constructorFn) {
+ var name = '';
+ if (typeof constructorFn.name === 'undefined') {
+ // Here we run a polyfill if constructorFn.name is not defined
+ var match = String(constructorFn).match(functionNameMatch);
+ if (match) {
+ name = match[1];
+ }
+ } else {
+ name = constructorFn.name;
+ }
+
+ return name;
+}
+
+/**
+ * ### .getConstructorName(errorLike)
+ *
+ * Gets the constructor name for an Error instance or constructor itself.
+ *
+ * @name getConstructorName
+ * @param {Error|ErrorConstructor} errorLike
+ * @namespace Utils
+ * @api public
+ */
+
+function getConstructorName(errorLike) {
+ var constructorName = errorLike;
+ if (errorLike instanceof Error) {
+ constructorName = getFunctionName(errorLike.constructor);
+ } else if (typeof errorLike === 'function') {
+ // If `err` is not an instance of Error it is an error constructor itself or another function.
+ // If we've got a common function we get its name, otherwise we may need to create a new instance
+ // of the error just in case it's a poorly-constructed error. Please see chaijs/chai/issues/45 to know more.
+ constructorName = getFunctionName(errorLike).trim() ||
+ getFunctionName(new errorLike()); // eslint-disable-line new-cap
+ }
+
+ return constructorName;
+}
+
+/**
+ * ### .getMessage(errorLike)
+ *
+ * Gets the error message from an error.
+ * If `err` is a String itself, we return it.
+ * If the error has no message, we return an empty string.
+ *
+ * @name getMessage
+ * @param {Error|String} errorLike
+ * @namespace Utils
+ * @api public
+ */
+
+function getMessage(errorLike) {
+ var msg = '';
+ if (errorLike && errorLike.message) {
+ msg = errorLike.message;
+ } else if (typeof errorLike === 'string') {
+ msg = errorLike;
+ }
+
+ return msg;
+}
+
+module.exports = {
+ compatibleInstance: compatibleInstance,
+ compatibleConstructor: compatibleConstructor,
+ compatibleMessage: compatibleMessage,
+ getMessage: getMessage,
+ getConstructorName: getConstructorName,
+};
+
+},{}],36:[function(require,module,exports){
+'use strict';
+/* globals Symbol: false, Uint8Array: false, WeakMap: false */
/*!
- * Module dependencies
+ * deep-eql
+ * Copyright(c) 2013 Jake Luer
+ * MIT Licensed
*/
var type = require('type-detect');
+function FakeMap() {
+ this._key = 'chai/deep-eql__' + Math.random() + Date.now();
+}
+
+FakeMap.prototype = {
+ get: function getMap(key) {
+ return key[this._key];
+ },
+ set: function setMap(key, value) {
+ if (Object.isExtensible(key)) {
+ Object.defineProperty(key, this._key, {
+ value: value,
+ configurable: true,
+ });
+ }
+ },
+};
+var MemoizeMap = typeof WeakMap === 'function' ? WeakMap : FakeMap;
/*!
- * Buffer.isBuffer browser shim
- */
+ * Check to see if the MemoizeMap has recorded a result of the two operands
+ *
+ * @param {Mixed} leftHandOperand
+ * @param {Mixed} rightHandOperand
+ * @param {MemoizeMap} memoizeMap
+ * @returns {Boolean|null} result
+*/
+function memoizeCompare(leftHandOperand, rightHandOperand, memoizeMap) {
+ // Technically, WeakMap keys can *only* be objects, not primitives.
+ if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) {
+ return null;
+ }
+ var leftHandMap = memoizeMap.get(leftHandOperand);
+ if (leftHandMap) {
+ var result = leftHandMap.get(rightHandOperand);
+ if (typeof result === 'boolean') {
+ return result;
+ }
+ }
+ return null;
+}
-var Buffer;
-try { Buffer = require('buffer').Buffer; }
-catch(ex) {
- Buffer = {};
- Buffer.isBuffer = function() { return false; }
+/*!
+ * Set the result of the equality into the MemoizeMap
+ *
+ * @param {Mixed} leftHandOperand
+ * @param {Mixed} rightHandOperand
+ * @param {MemoizeMap} memoizeMap
+ * @param {Boolean} result
+*/
+function memoizeSet(leftHandOperand, rightHandOperand, memoizeMap, result) {
+ // Technically, WeakMap keys can *only* be objects, not primitives.
+ if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) {
+ return;
+ }
+ var leftHandMap = memoizeMap.get(leftHandOperand);
+ if (leftHandMap) {
+ leftHandMap.set(rightHandOperand, result);
+ } else {
+ leftHandMap = new MemoizeMap();
+ leftHandMap.set(rightHandOperand, result);
+ memoizeMap.set(leftHandOperand, leftHandMap);
+ }
}
/*!
@@ -5623,520 +9869,1121 @@ catch(ex) {
*/
module.exports = deepEqual;
+module.exports.MemoizeMap = MemoizeMap;
/**
- * Assert super-strict (egal) equality between
- * two objects of any type.
- *
- * @param {Mixed} a
- * @param {Mixed} b
- * @param {Array} memoised (optional)
+ * Assert deeply nested sameValue equality between two objects of any type.
+ *
+ * @param {Mixed} leftHandOperand
+ * @param {Mixed} rightHandOperand
+ * @param {Object} [options] (optional) Additional options
+ * @param {Array} [options.comparator] (optional) Override default algorithm, determining custom equality.
+ * @param {Array} [options.memoize] (optional) Provide a custom memoization object which will cache the results of
+ complex objects for a speed boost. By passing `false` you can disable memoization, but this will cause circular
+ references to blow the stack.
* @return {Boolean} equal match
*/
+function deepEqual(leftHandOperand, rightHandOperand, options) {
+ // If we have a comparator, we can't assume anything; so bail to its check first.
+ if (options && options.comparator) {
+ return extensiveDeepEqual(leftHandOperand, rightHandOperand, options);
+ }
+
+ var simpleResult = simpleEqual(leftHandOperand, rightHandOperand);
+ if (simpleResult !== null) {
+ return simpleResult;
+ }
+
+ // Deeper comparisons are pushed through to a larger function
+ return extensiveDeepEqual(leftHandOperand, rightHandOperand, options);
+}
+
+/**
+ * Many comparisons can be canceled out early via simple equality or primitive checks.
+ * @param {Mixed} leftHandOperand
+ * @param {Mixed} rightHandOperand
+ * @return {Boolean|null} equal match
+ */
+function simpleEqual(leftHandOperand, rightHandOperand) {
+ // Equal references (except for Numbers) can be returned early
+ if (leftHandOperand === rightHandOperand) {
+ // Handle +-0 cases
+ return leftHandOperand !== 0 || 1 / leftHandOperand === 1 / rightHandOperand;
+ }
-function deepEqual(a, b, m) {
- if (sameValue(a, b)) {
+ // handle NaN cases
+ if (
+ leftHandOperand !== leftHandOperand && // eslint-disable-line no-self-compare
+ rightHandOperand !== rightHandOperand // eslint-disable-line no-self-compare
+ ) {
return true;
- } else if ('date' === type(a)) {
- return dateEqual(a, b);
- } else if ('regexp' === type(a)) {
- return regexpEqual(a, b);
- } else if (Buffer.isBuffer(a)) {
- return bufferEqual(a, b);
- } else if ('arguments' === type(a)) {
- return argumentsEqual(a, b, m);
- } else if (!typeEqual(a, b)) {
+ }
+
+ // Anything that is not an 'object', i.e. symbols, functions, booleans, numbers,
+ // strings, and undefined, can be compared by reference.
+ if (isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) {
+ // Easy out b/c it would have passed the first equality check
return false;
- } else if (('object' !== type(a) && 'object' !== type(b))
- && ('array' !== type(a) && 'array' !== type(b))) {
- return sameValue(a, b);
- } else {
- return objectEqual(a, b, m);
}
+ return null;
}
/*!
- * Strict (egal) equality test. Ensures that NaN always
- * equals NaN and `-0` does not equal `+0`.
- *
- * @param {Mixed} a
- * @param {Mixed} b
+ * The main logic of the `deepEqual` function.
+ *
+ * @param {Mixed} leftHandOperand
+ * @param {Mixed} rightHandOperand
+ * @param {Object} [options] (optional) Additional options
+ * @param {Array} [options.comparator] (optional) Override default algorithm, determining custom equality.
+ * @param {Array} [options.memoize] (optional) Provide a custom memoization object which will cache the results of
+ complex objects for a speed boost. By passing `false` you can disable memoization, but this will cause circular
+ references to blow the stack.
* @return {Boolean} equal match
- */
+*/
+function extensiveDeepEqual(leftHandOperand, rightHandOperand, options) {
+ options = options || {};
+ options.memoize = options.memoize === false ? false : options.memoize || new MemoizeMap();
+ var comparator = options && options.comparator;
+
+ // Check if a memoized result exists.
+ var memoizeResultLeft = memoizeCompare(leftHandOperand, rightHandOperand, options.memoize);
+ if (memoizeResultLeft !== null) {
+ return memoizeResultLeft;
+ }
+ var memoizeResultRight = memoizeCompare(rightHandOperand, leftHandOperand, options.memoize);
+ if (memoizeResultRight !== null) {
+ return memoizeResultRight;
+ }
+
+ // If a comparator is present, use it.
+ if (comparator) {
+ var comparatorResult = comparator(leftHandOperand, rightHandOperand);
+ // Comparators may return null, in which case we want to go back to default behavior.
+ if (comparatorResult === false || comparatorResult === true) {
+ memoizeSet(leftHandOperand, rightHandOperand, options.memoize, comparatorResult);
+ return comparatorResult;
+ }
+ // To allow comparators to override *any* behavior, we ran them first. Since it didn't decide
+ // what to do, we need to make sure to return the basic tests first before we move on.
+ var simpleResult = simpleEqual(leftHandOperand, rightHandOperand);
+ if (simpleResult !== null) {
+ // Don't memoize this, it takes longer to set/retrieve than to just compare.
+ return simpleResult;
+ }
+ }
+
+ var leftHandType = type(leftHandOperand);
+ if (leftHandType !== type(rightHandOperand)) {
+ memoizeSet(leftHandOperand, rightHandOperand, options.memoize, false);
+ return false;
+ }
+
+ // Temporarily set the operands in the memoize object to prevent blowing the stack
+ memoizeSet(leftHandOperand, rightHandOperand, options.memoize, true);
+
+ var result = extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options);
+ memoizeSet(leftHandOperand, rightHandOperand, options.memoize, result);
+ return result;
+}
-function sameValue(a, b) {
- if (a === b) return a !== 0 || 1 / a === 1 / b;
- return a !== a && b !== b;
+function extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options) {
+ switch (leftHandType) {
+ case 'String':
+ case 'Number':
+ case 'Boolean':
+ case 'Date':
+ // If these types are their instance types (e.g. `new Number`) then re-deepEqual against their values
+ return deepEqual(leftHandOperand.valueOf(), rightHandOperand.valueOf());
+ case 'Promise':
+ case 'Symbol':
+ case 'function':
+ case 'WeakMap':
+ case 'WeakSet':
+ case 'Error':
+ return leftHandOperand === rightHandOperand;
+ case 'Arguments':
+ case 'Int8Array':
+ case 'Uint8Array':
+ case 'Uint8ClampedArray':
+ case 'Int16Array':
+ case 'Uint16Array':
+ case 'Int32Array':
+ case 'Uint32Array':
+ case 'Float32Array':
+ case 'Float64Array':
+ case 'Array':
+ return iterableEqual(leftHandOperand, rightHandOperand, options);
+ case 'RegExp':
+ return regexpEqual(leftHandOperand, rightHandOperand);
+ case 'Generator':
+ return generatorEqual(leftHandOperand, rightHandOperand, options);
+ case 'DataView':
+ return iterableEqual(new Uint8Array(leftHandOperand.buffer), new Uint8Array(rightHandOperand.buffer), options);
+ case 'ArrayBuffer':
+ return iterableEqual(new Uint8Array(leftHandOperand), new Uint8Array(rightHandOperand), options);
+ case 'Set':
+ return entriesEqual(leftHandOperand, rightHandOperand, options);
+ case 'Map':
+ return entriesEqual(leftHandOperand, rightHandOperand, options);
+ default:
+ return objectEqual(leftHandOperand, rightHandOperand, options);
+ }
}
/*!
- * Compare the types of two given objects and
- * return if they are equal. Note that an Array
- * has a type of `array` (not `object`) and arguments
- * have a type of `arguments` (not `array`/`object`).
+ * Compare two Regular Expressions for equality.
*
- * @param {Mixed} a
- * @param {Mixed} b
+ * @param {RegExp} leftHandOperand
+ * @param {RegExp} rightHandOperand
* @return {Boolean} result
*/
-function typeEqual(a, b) {
- return type(a) === type(b);
+function regexpEqual(leftHandOperand, rightHandOperand) {
+ return leftHandOperand.toString() === rightHandOperand.toString();
}
/*!
- * Compare two Date objects by asserting that
- * the time values are equal using `saveValue`.
+ * Compare two Sets/Maps for equality. Faster than other equality functions.
*
- * @param {Date} a
- * @param {Date} b
+ * @param {Set} leftHandOperand
+ * @param {Set} rightHandOperand
+ * @param {Object} [options] (Optional)
* @return {Boolean} result
*/
-function dateEqual(a, b) {
- if ('date' !== type(b)) return false;
- return sameValue(a.getTime(), b.getTime());
+function entriesEqual(leftHandOperand, rightHandOperand, options) {
+ // IE11 doesn't support Set#entries or Set#@@iterator, so we need manually populate using Set#forEach
+ if (leftHandOperand.size !== rightHandOperand.size) {
+ return false;
+ }
+ if (leftHandOperand.size === 0) {
+ return true;
+ }
+ var leftHandItems = [];
+ var rightHandItems = [];
+ leftHandOperand.forEach(function gatherEntries(key, value) {
+ leftHandItems.push([ key, value ]);
+ });
+ rightHandOperand.forEach(function gatherEntries(key, value) {
+ rightHandItems.push([ key, value ]);
+ });
+ return iterableEqual(leftHandItems.sort(), rightHandItems.sort(), options);
}
/*!
- * Compare two regular expressions by converting them
- * to string and checking for `sameValue`.
+ * Simple equality for flat iterable objects such as Arrays, TypedArrays or Node.js buffers.
*
- * @param {RegExp} a
- * @param {RegExp} b
+ * @param {Iterable} leftHandOperand
+ * @param {Iterable} rightHandOperand
+ * @param {Object} [options] (Optional)
* @return {Boolean} result
*/
-function regexpEqual(a, b) {
- if ('regexp' !== type(b)) return false;
- return sameValue(a.toString(), b.toString());
+function iterableEqual(leftHandOperand, rightHandOperand, options) {
+ var length = leftHandOperand.length;
+ if (length !== rightHandOperand.length) {
+ return false;
+ }
+ if (length === 0) {
+ return true;
+ }
+ var index = -1;
+ while (++index < length) {
+ if (deepEqual(leftHandOperand[index], rightHandOperand[index], options) === false) {
+ return false;
+ }
+ }
+ return true;
}
/*!
- * Assert deep equality of two `arguments` objects.
- * Unfortunately, these must be sliced to arrays
- * prior to test to ensure no bad behavior.
+ * Simple equality for generator objects such as those returned by generator functions.
*
- * @param {Arguments} a
- * @param {Arguments} b
- * @param {Array} memoize (optional)
+ * @param {Iterable} leftHandOperand
+ * @param {Iterable} rightHandOperand
+ * @param {Object} [options] (Optional)
* @return {Boolean} result
*/
-function argumentsEqual(a, b, m) {
- if ('arguments' !== type(b)) return false;
- a = [].slice.call(a);
- b = [].slice.call(b);
- return deepEqual(a, b, m);
+function generatorEqual(leftHandOperand, rightHandOperand, options) {
+ return iterableEqual(getGeneratorEntries(leftHandOperand), getGeneratorEntries(rightHandOperand), options);
}
/*!
- * Get enumerable properties of a given object.
+ * Determine if the given object has an @@iterator function.
*
- * @param {Object} a
- * @return {Array} property names
+ * @param {Object} target
+ * @return {Boolean} `true` if the object has an @@iterator function.
*/
-
-function enumerable(a) {
- var res = [];
- for (var key in a) res.push(key);
- return res;
+function hasIteratorFunction(target) {
+ return typeof Symbol !== 'undefined' &&
+ typeof target === 'object' &&
+ typeof Symbol.iterator !== 'undefined' &&
+ typeof target[Symbol.iterator] === 'function';
}
/*!
- * Simple equality for flat iterable objects
- * such as Arrays or Node.js buffers.
+ * Gets all iterator entries from the given Object. If the Object has no @@iterator function, returns an empty array.
+ * This will consume the iterator - which could have side effects depending on the @@iterator implementation.
*
- * @param {Iterable} a
- * @param {Iterable} b
- * @return {Boolean} result
+ * @param {Object} target
+ * @returns {Array} an array of entries from the @@iterator function
*/
-
-function iterableEqual(a, b) {
- if (a.length !== b.length) return false;
-
- var i = 0;
- var match = true;
-
- for (; i < a.length; i++) {
- if (a[i] !== b[i]) {
- match = false;
- break;
+function getIteratorEntries(target) {
+ if (hasIteratorFunction(target)) {
+ try {
+ return getGeneratorEntries(target[Symbol.iterator]());
+ } catch (iteratorError) {
+ return [];
}
}
-
- return match;
+ return [];
}
/*!
- * Extension to `iterableEqual` specifically
- * for Node.js Buffers.
+ * Gets all entries from a Generator. This will consume the generator - which could have side effects.
*
- * @param {Buffer} a
- * @param {Mixed} b
- * @return {Boolean} result
+ * @param {Generator} target
+ * @returns {Array} an array of entries from the Generator.
*/
-
-function bufferEqual(a, b) {
- if (!Buffer.isBuffer(b)) return false;
- return iterableEqual(a, b);
+function getGeneratorEntries(generator) {
+ var generatorResult = generator.next();
+ var accumulator = [ generatorResult.value ];
+ while (generatorResult.done === false) {
+ generatorResult = generator.next();
+ accumulator.push(generatorResult.value);
+ }
+ return accumulator;
}
/*!
- * Block for `objectEqual` ensuring non-existing
- * values don't get in.
+ * Gets all own and inherited enumerable keys from a target.
*
- * @param {Mixed} object
- * @return {Boolean} result
+ * @param {Object} target
+ * @returns {Array} an array of own and inherited enumerable keys from the target.
*/
-
-function isValue(a) {
- return a !== null && a !== undefined;
+function getEnumerableKeys(target) {
+ var keys = [];
+ for (var key in target) {
+ keys.push(key);
+ }
+ return keys;
}
/*!
- * Recursively check the equality of two objects.
- * Once basic sameness has been established it will
- * defer to `deepEqual` for each enumerable key
- * in the object.
+ * Determines if two objects have matching values, given a set of keys. Defers to deepEqual for the equality check of
+ * each key. If any value of the given key is not equal, the function will return false (early).
*
- * @param {Mixed} a
- * @param {Mixed} b
+ * @param {Mixed} leftHandOperand
+ * @param {Mixed} rightHandOperand
+ * @param {Array} keys An array of keys to compare the values of leftHandOperand and rightHandOperand against
+ * @param {Object} [options] (Optional)
* @return {Boolean} result
*/
-
-function objectEqual(a, b, m) {
- if (!isValue(a) || !isValue(b)) {
- return false;
- }
-
- if (a.prototype !== b.prototype) {
- return false;
+function keysEqual(leftHandOperand, rightHandOperand, keys, options) {
+ var length = keys.length;
+ if (length === 0) {
+ return true;
}
-
- var i;
- if (m) {
- for (i = 0; i < m.length; i++) {
- if ((m[i][0] === a && m[i][1] === b)
- || (m[i][0] === b && m[i][1] === a)) {
- return true;
- }
+ for (var i = 0; i < length; i += 1) {
+ if (deepEqual(leftHandOperand[keys[i]], rightHandOperand[keys[i]], options) === false) {
+ return false;
}
- } else {
- m = [];
- }
-
- try {
- var ka = enumerable(a);
- var kb = enumerable(b);
- } catch (ex) {
- return false;
- }
-
- ka.sort();
- kb.sort();
-
- if (!iterableEqual(ka, kb)) {
- return false;
}
+ return true;
+}
- m.push([ a, b ]);
+/*!
+ * Recursively check the equality of two Objects. Once basic sameness has been established it will defer to `deepEqual`
+ * for each enumerable key in the object.
+ *
+ * @param {Mixed} leftHandOperand
+ * @param {Mixed} rightHandOperand
+ * @param {Object} [options] (Optional)
+ * @return {Boolean} result
+ */
- var key;
- for (i = ka.length - 1; i >= 0; i--) {
- key = ka[i];
- if (!deepEqual(a[key], b[key], m)) {
+function objectEqual(leftHandOperand, rightHandOperand, options) {
+ var leftHandKeys = getEnumerableKeys(leftHandOperand);
+ var rightHandKeys = getEnumerableKeys(rightHandOperand);
+ if (leftHandKeys.length && leftHandKeys.length === rightHandKeys.length) {
+ leftHandKeys.sort();
+ rightHandKeys.sort();
+ if (iterableEqual(leftHandKeys, rightHandKeys) === false) {
return false;
}
+ return keysEqual(leftHandOperand, rightHandOperand, leftHandKeys, options);
}
- return true;
-}
-
-},{"buffer":undefined,"type-detect":33}],33:[function(require,module,exports){
-module.exports = require('./lib/type');
+ var leftHandEntries = getIteratorEntries(leftHandOperand);
+ var rightHandEntries = getIteratorEntries(rightHandOperand);
+ if (leftHandEntries.length && leftHandEntries.length === rightHandEntries.length) {
+ leftHandEntries.sort();
+ rightHandEntries.sort();
+ return iterableEqual(leftHandEntries, rightHandEntries, options);
+ }
-},{"./lib/type":34}],34:[function(require,module,exports){
-/*!
- * type-detect
- * Copyright(c) 2013 jake luer
- * MIT Licensed
- */
+ if (leftHandKeys.length === 0 &&
+ leftHandEntries.length === 0 &&
+ rightHandKeys.length === 0 &&
+ rightHandEntries.length === 0) {
+ return true;
+ }
+
+ return false;
+}
/*!
- * Primary Exports
+ * Returns true if the argument is a primitive.
+ *
+ * This intentionally returns true for all objects that can be compared by reference,
+ * including functions and symbols.
+ *
+ * @param {Mixed} value
+ * @return {Boolean} result
*/
+function isPrimitive(value) {
+ return value === null || typeof value !== 'object';
+}
-var exports = module.exports = getType;
+},{"type-detect":39}],37:[function(require,module,exports){
+'use strict';
-/*!
- * Detectable javascript natives
+/* !
+ * Chai - getFuncName utility
+ * Copyright(c) 2012-2016 Jake Luer
+ * MIT Licensed
*/
-var natives = {
- '[object Array]': 'array'
- , '[object RegExp]': 'regexp'
- , '[object Function]': 'function'
- , '[object Arguments]': 'arguments'
- , '[object Date]': 'date'
-};
-
/**
- * ### typeOf (obj)
+ * ### .getFuncName(constructorFn)
*
- * Use several different techniques to determine
- * the type of object being tested.
+ * Returns the name of a function.
+ * When a non-function instance is passed, returns `null`.
+ * This also includes a polyfill function if `aFunc.name` is not defined.
*
- *
- * @param {Mixed} object
- * @return {String} object type
+ * @name getFuncName
+ * @param {Function} funct
+ * @namespace Utils
* @api public
*/
-function getType (obj) {
- var str = Object.prototype.toString.call(obj);
- if (natives[str]) return natives[str];
- if (obj === null) return 'null';
- if (obj === undefined) return 'undefined';
- if (obj === Object(obj)) return 'object';
- return typeof obj;
+var toString = Function.prototype.toString;
+var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\s\(\/]+)/;
+function getFuncName(aFunc) {
+ if (typeof aFunc !== 'function') {
+ return null;
+ }
+
+ var name = '';
+ if (typeof Function.prototype.name === 'undefined' && typeof aFunc.name === 'undefined') {
+ // Here we run a polyfill if Function does not support the `name` property and if aFunc.name is not defined
+ var match = toString.call(aFunc).match(functionNameMatch);
+ if (match) {
+ name = match[1];
+ }
+ } else {
+ // If we've got a `name` property we just use it
+ name = aFunc.name;
+ }
+
+ return name;
}
-exports.Library = Library;
+module.exports = getFuncName;
+
+},{}],38:[function(require,module,exports){
+'use strict';
+
+/* !
+ * Chai - pathval utility
+ * Copyright(c) 2012-2014 Jake Luer
+ * @see https://github.com/logicalparadox/filtr
+ * MIT Licensed
+ */
/**
- * ### Library
+ * ### .hasProperty(object, name)
*
- * Create a repository for custom type detection.
+ * This allows checking whether an object has own
+ * or inherited from prototype chain named property.
*
- * ```js
- * var lib = new type.Library;
- * ```
+ * Basically does the same thing as the `in`
+ * operator but works properly with null/undefined values
+ * and other primitives.
*
- */
-
-function Library () {
- this.tests = {};
-}
-
-/**
- * #### .of (obj)
+ * var obj = {
+ * arr: ['a', 'b', 'c']
+ * , str: 'Hello'
+ * }
+ *
+ * The following would be the results.
*
- * Expose replacement `typeof` detection to the library.
+ * hasProperty(obj, 'str'); // true
+ * hasProperty(obj, 'constructor'); // true
+ * hasProperty(obj, 'bar'); // false
*
- * ```js
- * if ('string' === lib.of('hello world')) {
- * // ...
- * }
- * ```
+ * hasProperty(obj.str, 'length'); // true
+ * hasProperty(obj.str, 1); // true
+ * hasProperty(obj.str, 5); // false
+ *
+ * hasProperty(obj.arr, 'length'); // true
+ * hasProperty(obj.arr, 2); // true
+ * hasProperty(obj.arr, 3); // false
*
- * @param {Mixed} object to test
- * @return {String} type
+ * @param {Object} object
+ * @param {String|Symbol} name
+ * @returns {Boolean} whether it exists
+ * @namespace Utils
+ * @name hasProperty
+ * @api public
*/
-Library.prototype.of = getType;
+function hasProperty(obj, name) {
+ if (typeof obj === 'undefined' || obj === null) {
+ return false;
+ }
-/**
- * #### .define (type, test)
- *
- * Add a test to for the `.test()` assertion.
+ // The `in` operator does not work with primitives.
+ return name in Object(obj);
+}
+
+/* !
+ * ## parsePath(path)
*
- * Can be defined as a regular expression:
+ * Helper function used to parse string object
+ * paths. Use in conjunction with `internalGetPathValue`.
*
- * ```js
- * lib.define('int', /^[0-9]+$/);
- * ```
+ * var parsed = parsePath('myobject.property.subprop');
*
- * ... or as a function:
+ * ### Paths:
*
- * ```js
- * lib.define('bln', function (obj) {
- * if ('boolean' === lib.of(obj)) return true;
- * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ];
- * if ('string' === lib.of(obj)) obj = obj.toLowerCase();
- * return !! ~blns.indexOf(obj);
- * });
- * ```
+ * * Can be infinitely deep and nested.
+ * * Arrays are also valid using the formal `myobject.document[3].property`.
+ * * Literal dots and brackets (not delimiter) must be backslash-escaped.
*
- * @param {String} type
- * @param {RegExp|Function} test
- * @api public
+ * @param {String} path
+ * @returns {Object} parsed
+ * @api private
*/
-Library.prototype.define = function (type, test) {
- if (arguments.length === 1) return this.tests[type];
- this.tests[type] = test;
- return this;
-};
+function parsePath(path) {
+ var str = path.replace(/([^\\])\[/g, '$1.[');
+ var parts = str.match(/(\\\.|[^.]+?)+/g);
+ return parts.map(function mapMatches(value) {
+ if (
+ value === 'constructor' ||
+ value === '__proto__' ||
+ value === 'prototype'
+ ) {
+ return {};
+ }
+ var regexp = /^\[(\d+)\]$/;
+ var mArr = regexp.exec(value);
+ var parsed = null;
+ if (mArr) {
+ parsed = { i: parseFloat(mArr[1]) };
+ } else {
+ parsed = { p: value.replace(/\\([.[\]])/g, '$1') };
+ }
-/**
- * #### .test (obj, test)
+ return parsed;
+ });
+}
+
+/* !
+ * ## internalGetPathValue(obj, parsed[, pathDepth])
*
- * Assert that an object is of type. Will first
- * check natives, and if that does not pass it will
- * use the user defined custom tests.
+ * Helper companion function for `.parsePath` that returns
+ * the value located at the parsed address.
*
- * ```js
- * assert(lib.test('1', 'int'));
- * assert(lib.test('yes', 'bln'));
- * ```
+ * var value = getPathValue(obj, parsed);
*
- * @param {Mixed} object
- * @param {String} type
- * @return {Boolean} result
- * @api public
+ * @param {Object} object to search against
+ * @param {Object} parsed definition from `parsePath`.
+ * @param {Number} depth (nesting level) of the property we want to retrieve
+ * @returns {Object|Undefined} value
+ * @api private
*/
-Library.prototype.test = function (obj, type) {
- if (type === getType(obj)) return true;
- var test = this.tests[type];
-
- if (test && 'regexp' === getType(test)) {
- return test.test(obj);
- } else if (test && 'function' === getType(test)) {
- return test(obj);
- } else {
- throw new ReferenceError('Type test "' + type + '" not defined or invalid.');
- }
-};
+function internalGetPathValue(obj, parsed, pathDepth) {
+ var temporaryValue = obj;
+ var res = null;
+ pathDepth = typeof pathDepth === 'undefined' ? parsed.length : pathDepth;
-},{}],35:[function(require,module,exports){
-arguments[4][33][0].apply(exports,arguments)
-},{"./lib/type":36,"dup":33}],36:[function(require,module,exports){
-/*!
- * type-detect
- * Copyright(c) 2013 jake luer
- * MIT Licensed
- */
+ for (var i = 0; i < pathDepth; i++) {
+ var part = parsed[i];
+ if (temporaryValue) {
+ if (typeof part.p === 'undefined') {
+ temporaryValue = temporaryValue[part.i];
+ } else {
+ temporaryValue = temporaryValue[part.p];
+ }
-/*!
- * Primary Exports
- */
+ if (i === pathDepth - 1) {
+ res = temporaryValue;
+ }
+ }
+ }
-var exports = module.exports = getType;
+ return res;
+}
-/**
- * ### typeOf (obj)
+/* !
+ * ## internalSetPathValue(obj, value, parsed)
*
- * Use several different techniques to determine
- * the type of object being tested.
+ * Companion function for `parsePath` that sets
+ * the value located at a parsed address.
*
+ * internalSetPathValue(obj, 'value', parsed);
*
- * @param {Mixed} object
- * @return {String} object type
- * @api public
+ * @param {Object} object to search and define on
+ * @param {*} value to use upon set
+ * @param {Object} parsed definition from `parsePath`
+ * @api private
*/
-var objectTypeRegexp = /^\[object (.*)\]$/;
-
-function getType(obj) {
- var type = Object.prototype.toString.call(obj).match(objectTypeRegexp)[1].toLowerCase();
- // Let "new String('')" return 'object'
- if (typeof Promise === 'function' && obj instanceof Promise) return 'promise';
- // PhantomJS has type "DOMWindow" for null
- if (obj === null) return 'null';
- // PhantomJS has type "DOMWindow" for undefined
- if (obj === undefined) return 'undefined';
- return type;
-}
-exports.Library = Library;
+function internalSetPathValue(obj, val, parsed) {
+ var tempObj = obj;
+ var pathDepth = parsed.length;
+ var part = null;
+ // Here we iterate through every part of the path
+ for (var i = 0; i < pathDepth; i++) {
+ var propName = null;
+ var propVal = null;
+ part = parsed[i];
+
+ // If it's the last part of the path, we set the 'propName' value with the property name
+ if (i === pathDepth - 1) {
+ propName = typeof part.p === 'undefined' ? part.i : part.p;
+ // Now we set the property with the name held by 'propName' on object with the desired val
+ tempObj[propName] = val;
+ } else if (typeof part.p !== 'undefined' && tempObj[part.p]) {
+ tempObj = tempObj[part.p];
+ } else if (typeof part.i !== 'undefined' && tempObj[part.i]) {
+ tempObj = tempObj[part.i];
+ } else {
+ // If the obj doesn't have the property we create one with that name to define it
+ var next = parsed[i + 1];
+ // Here we set the name of the property which will be defined
+ propName = typeof part.p === 'undefined' ? part.i : part.p;
+ // Here we decide if this property will be an array or a new object
+ propVal = typeof next.p === 'undefined' ? [] : {};
+ tempObj[propName] = propVal;
+ tempObj = tempObj[propName];
+ }
+ }
+}
/**
- * ### Library
+ * ### .getPathInfo(object, path)
*
- * Create a repository for custom type detection.
+ * This allows the retrieval of property info in an
+ * object given a string path.
*
- * ```js
- * var lib = new type.Library;
- * ```
+ * The path info consists of an object with the
+ * following properties:
+ *
+ * * parent - The parent object of the property referenced by `path`
+ * * name - The name of the final property, a number if it was an array indexer
+ * * value - The value of the property, if it exists, otherwise `undefined`
+ * * exists - Whether the property exists or not
*
+ * @param {Object} object
+ * @param {String} path
+ * @returns {Object} info
+ * @namespace Utils
+ * @name getPathInfo
+ * @api public
*/
-function Library() {
- if (!(this instanceof Library)) return new Library();
- this.tests = {};
+function getPathInfo(obj, path) {
+ var parsed = parsePath(path);
+ var last = parsed[parsed.length - 1];
+ var info = {
+ parent:
+ parsed.length > 1 ?
+ internalGetPathValue(obj, parsed, parsed.length - 1) :
+ obj,
+ name: last.p || last.i,
+ value: internalGetPathValue(obj, parsed),
+ };
+ info.exists = hasProperty(info.parent, info.name);
+
+ return info;
}
/**
- * #### .of (obj)
+ * ### .getPathValue(object, path)
*
- * Expose replacement `typeof` detection to the library.
+ * This allows the retrieval of values in an
+ * object given a string path.
*
- * ```js
- * if ('string' === lib.of('hello world')) {
- * // ...
- * }
- * ```
+ * var obj = {
+ * prop1: {
+ * arr: ['a', 'b', 'c']
+ * , str: 'Hello'
+ * }
+ * , prop2: {
+ * arr: [ { nested: 'Universe' } ]
+ * , str: 'Hello again!'
+ * }
+ * }
+ *
+ * The following would be the results.
+ *
+ * getPathValue(obj, 'prop1.str'); // Hello
+ * getPathValue(obj, 'prop1.att[2]'); // b
+ * getPathValue(obj, 'prop2.arr[0].nested'); // Universe
*
- * @param {Mixed} object to test
- * @return {String} type
+ * @param {Object} object
+ * @param {String} path
+ * @returns {Object} value or `undefined`
+ * @namespace Utils
+ * @name getPathValue
+ * @api public
*/
-Library.prototype.of = getType;
+function getPathValue(obj, path) {
+ var info = getPathInfo(obj, path);
+ return info.value;
+}
/**
- * #### .define (type, test)
+ * ### .setPathValue(object, path, value)
*
- * Add a test to for the `.test()` assertion.
- *
- * Can be defined as a regular expression:
+ * Define the value in an object at a given string path.
*
* ```js
- * lib.define('int', /^[0-9]+$/);
+ * var obj = {
+ * prop1: {
+ * arr: ['a', 'b', 'c']
+ * , str: 'Hello'
+ * }
+ * , prop2: {
+ * arr: [ { nested: 'Universe' } ]
+ * , str: 'Hello again!'
+ * }
+ * };
* ```
*
- * ... or as a function:
+ * The following would be acceptable.
*
* ```js
- * lib.define('bln', function (obj) {
- * if ('boolean' === lib.of(obj)) return true;
- * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ];
- * if ('string' === lib.of(obj)) obj = obj.toLowerCase();
- * return !! ~blns.indexOf(obj);
- * });
+ * var properties = require('tea-properties');
+ * properties.set(obj, 'prop1.str', 'Hello Universe!');
+ * properties.set(obj, 'prop1.arr[2]', 'B');
+ * properties.set(obj, 'prop2.arr[0].nested.value', { hello: 'universe' });
* ```
*
- * @param {String} type
- * @param {RegExp|Function} test
- * @api public
+ * @param {Object} object
+ * @param {String} path
+ * @param {Mixed} value
+ * @api private
*/
-Library.prototype.define = function(type, test) {
- if (arguments.length === 1) return this.tests[type];
- this.tests[type] = test;
- return this;
+function setPathValue(obj, path, val) {
+ var parsed = parsePath(path);
+ internalSetPathValue(obj, val, parsed);
+ return obj;
+}
+
+module.exports = {
+ hasProperty: hasProperty,
+ getPathInfo: getPathInfo,
+ getPathValue: getPathValue,
+ setPathValue: setPathValue,
};
+},{}],39:[function(require,module,exports){
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global.typeDetect = factory());
+}(this, (function () { 'use strict';
+
+/* !
+ * type-detect
+ * Copyright(c) 2013 jake luer
+ * MIT Licensed
+ */
+var promiseExists = typeof Promise === 'function';
+
+/* eslint-disable no-undef */
+var globalObject = typeof self === 'object' ? self : global; // eslint-disable-line id-blacklist
+
+var symbolExists = typeof Symbol !== 'undefined';
+var mapExists = typeof Map !== 'undefined';
+var setExists = typeof Set !== 'undefined';
+var weakMapExists = typeof WeakMap !== 'undefined';
+var weakSetExists = typeof WeakSet !== 'undefined';
+var dataViewExists = typeof DataView !== 'undefined';
+var symbolIteratorExists = symbolExists && typeof Symbol.iterator !== 'undefined';
+var symbolToStringTagExists = symbolExists && typeof Symbol.toStringTag !== 'undefined';
+var setEntriesExists = setExists && typeof Set.prototype.entries === 'function';
+var mapEntriesExists = mapExists && typeof Map.prototype.entries === 'function';
+var setIteratorPrototype = setEntriesExists && Object.getPrototypeOf(new Set().entries());
+var mapIteratorPrototype = mapEntriesExists && Object.getPrototypeOf(new Map().entries());
+var arrayIteratorExists = symbolIteratorExists && typeof Array.prototype[Symbol.iterator] === 'function';
+var arrayIteratorPrototype = arrayIteratorExists && Object.getPrototypeOf([][Symbol.iterator]());
+var stringIteratorExists = symbolIteratorExists && typeof String.prototype[Symbol.iterator] === 'function';
+var stringIteratorPrototype = stringIteratorExists && Object.getPrototypeOf(''[Symbol.iterator]());
+var toStringLeftSliceLength = 8;
+var toStringRightSliceLength = -1;
/**
- * #### .test (obj, test)
- *
- * Assert that an object is of type. Will first
- * check natives, and if that does not pass it will
- * use the user defined custom tests.
+ * ### typeOf (obj)
*
- * ```js
- * assert(lib.test('1', 'int'));
- * assert(lib.test('yes', 'bln'));
- * ```
+ * Uses `Object.prototype.toString` to determine the type of an object,
+ * normalising behaviour across engine versions & well optimised.
*
* @param {Mixed} object
- * @param {String} type
- * @return {Boolean} result
+ * @return {String} object type
* @api public
*/
+function typeDetect(obj) {
+ /* ! Speed optimisation
+ * Pre:
+ * string literal x 3,039,035 ops/sec ±1.62% (78 runs sampled)
+ * boolean literal x 1,424,138 ops/sec ±4.54% (75 runs sampled)
+ * number literal x 1,653,153 ops/sec ±1.91% (82 runs sampled)
+ * undefined x 9,978,660 ops/sec ±1.92% (75 runs sampled)
+ * function x 2,556,769 ops/sec ±1.73% (77 runs sampled)
+ * Post:
+ * string literal x 38,564,796 ops/sec ±1.15% (79 runs sampled)
+ * boolean literal x 31,148,940 ops/sec ±1.10% (79 runs sampled)
+ * number literal x 32,679,330 ops/sec ±1.90% (78 runs sampled)
+ * undefined x 32,363,368 ops/sec ±1.07% (82 runs sampled)
+ * function x 31,296,870 ops/sec ±0.96% (83 runs sampled)
+ */
+ var typeofObj = typeof obj;
+ if (typeofObj !== 'object') {
+ return typeofObj;
+ }
+
+ /* ! Speed optimisation
+ * Pre:
+ * null x 28,645,765 ops/sec ±1.17% (82 runs sampled)
+ * Post:
+ * null x 36,428,962 ops/sec ±1.37% (84 runs sampled)
+ */
+ if (obj === null) {
+ return 'null';
+ }
-Library.prototype.test = function(obj, type) {
- if (type === getType(obj)) return true;
- var test = this.tests[type];
+ /* ! Spec Conformance
+ * Test: `Object.prototype.toString.call(window)``
+ * - Node === "[object global]"
+ * - Chrome === "[object global]"
+ * - Firefox === "[object Window]"
+ * - PhantomJS === "[object Window]"
+ * - Safari === "[object Window]"
+ * - IE 11 === "[object Window]"
+ * - IE Edge === "[object Window]"
+ * Test: `Object.prototype.toString.call(this)``
+ * - Chrome Worker === "[object global]"
+ * - Firefox Worker === "[object DedicatedWorkerGlobalScope]"
+ * - Safari Worker === "[object DedicatedWorkerGlobalScope]"
+ * - IE 11 Worker === "[object WorkerGlobalScope]"
+ * - IE Edge Worker === "[object WorkerGlobalScope]"
+ */
+ if (obj === globalObject) {
+ return 'global';
+ }
- if (test && 'regexp' === getType(test)) {
- return test.test(obj);
- } else if (test && 'function' === getType(test)) {
- return test(obj);
- } else {
- throw new ReferenceError('Type test "' + type + '" not defined or invalid.');
+ /* ! Speed optimisation
+ * Pre:
+ * array literal x 2,888,352 ops/sec ±0.67% (82 runs sampled)
+ * Post:
+ * array literal x 22,479,650 ops/sec ±0.96% (81 runs sampled)
+ */
+ if (
+ Array.isArray(obj) &&
+ (symbolToStringTagExists === false || !(Symbol.toStringTag in obj))
+ ) {
+ return 'Array';
}
-};
+
+ // Not caching existence of `window` and related properties due to potential
+ // for `window` to be unset before tests in quasi-browser environments.
+ if (typeof window === 'object' && window !== null) {
+ /* ! Spec Conformance
+ * (https://html.spec.whatwg.org/multipage/browsers.html#location)
+ * WhatWG HTML$7.7.3 - The `Location` interface
+ * Test: `Object.prototype.toString.call(window.location)``
+ * - IE <=11 === "[object Object]"
+ * - IE Edge <=13 === "[object Object]"
+ */
+ if (typeof window.location === 'object' && obj === window.location) {
+ return 'Location';
+ }
+
+ /* ! Spec Conformance
+ * (https://html.spec.whatwg.org/#document)
+ * WhatWG HTML$3.1.1 - The `Document` object
+ * Note: Most browsers currently adher to the W3C DOM Level 2 spec
+ * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26809268)
+ * which suggests that browsers should use HTMLTableCellElement for
+ * both TD and TH elements. WhatWG separates these.
+ * WhatWG HTML states:
+ * > For historical reasons, Window objects must also have a
+ * > writable, configurable, non-enumerable property named
+ * > HTMLDocument whose value is the Document interface object.
+ * Test: `Object.prototype.toString.call(document)``
+ * - Chrome === "[object HTMLDocument]"
+ * - Firefox === "[object HTMLDocument]"
+ * - Safari === "[object HTMLDocument]"
+ * - IE <=10 === "[object Document]"
+ * - IE 11 === "[object HTMLDocument]"
+ * - IE Edge <=13 === "[object HTMLDocument]"
+ */
+ if (typeof window.document === 'object' && obj === window.document) {
+ return 'Document';
+ }
+
+ if (typeof window.navigator === 'object') {
+ /* ! Spec Conformance
+ * (https://html.spec.whatwg.org/multipage/webappapis.html#mimetypearray)
+ * WhatWG HTML$8.6.1.5 - Plugins - Interface MimeTypeArray
+ * Test: `Object.prototype.toString.call(navigator.mimeTypes)``
+ * - IE <=10 === "[object MSMimeTypesCollection]"
+ */
+ if (typeof window.navigator.mimeTypes === 'object' &&
+ obj === window.navigator.mimeTypes) {
+ return 'MimeTypeArray';
+ }
+
+ /* ! Spec Conformance
+ * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray)
+ * WhatWG HTML$8.6.1.5 - Plugins - Interface PluginArray
+ * Test: `Object.prototype.toString.call(navigator.plugins)``
+ * - IE <=10 === "[object MSPluginsCollection]"
+ */
+ if (typeof window.navigator.plugins === 'object' &&
+ obj === window.navigator.plugins) {
+ return 'PluginArray';
+ }
+ }
+
+ if ((typeof window.HTMLElement === 'function' ||
+ typeof window.HTMLElement === 'object') &&
+ obj instanceof window.HTMLElement) {
+ /* ! Spec Conformance
+ * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray)
+ * WhatWG HTML$4.4.4 - The `blockquote` element - Interface `HTMLQuoteElement`
+ * Test: `Object.prototype.toString.call(document.createElement('blockquote'))``
+ * - IE <=10 === "[object HTMLBlockElement]"
+ */
+ if (obj.tagName === 'BLOCKQUOTE') {
+ return 'HTMLQuoteElement';
+ }
+
+ /* ! Spec Conformance
+ * (https://html.spec.whatwg.org/#htmltabledatacellelement)
+ * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableDataCellElement`
+ * Note: Most browsers currently adher to the W3C DOM Level 2 spec
+ * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075)
+ * which suggests that browsers should use HTMLTableCellElement for
+ * both TD and TH elements. WhatWG separates these.
+ * Test: Object.prototype.toString.call(document.createElement('td'))
+ * - Chrome === "[object HTMLTableCellElement]"
+ * - Firefox === "[object HTMLTableCellElement]"
+ * - Safari === "[object HTMLTableCellElement]"
+ */
+ if (obj.tagName === 'TD') {
+ return 'HTMLTableDataCellElement';
+ }
+
+ /* ! Spec Conformance
+ * (https://html.spec.whatwg.org/#htmltableheadercellelement)
+ * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableHeaderCellElement`
+ * Note: Most browsers currently adher to the W3C DOM Level 2 spec
+ * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075)
+ * which suggests that browsers should use HTMLTableCellElement for
+ * both TD and TH elements. WhatWG separates these.
+ * Test: Object.prototype.toString.call(document.createElement('th'))
+ * - Chrome === "[object HTMLTableCellElement]"
+ * - Firefox === "[object HTMLTableCellElement]"
+ * - Safari === "[object HTMLTableCellElement]"
+ */
+ if (obj.tagName === 'TH') {
+ return 'HTMLTableHeaderCellElement';
+ }
+ }
+ }
+
+ /* ! Speed optimisation
+ * Pre:
+ * Float64Array x 625,644 ops/sec ±1.58% (80 runs sampled)
+ * Float32Array x 1,279,852 ops/sec ±2.91% (77 runs sampled)
+ * Uint32Array x 1,178,185 ops/sec ±1.95% (83 runs sampled)
+ * Uint16Array x 1,008,380 ops/sec ±2.25% (80 runs sampled)
+ * Uint8Array x 1,128,040 ops/sec ±2.11% (81 runs sampled)
+ * Int32Array x 1,170,119 ops/sec ±2.88% (80 runs sampled)
+ * Int16Array x 1,176,348 ops/sec ±5.79% (86 runs sampled)
+ * Int8Array x 1,058,707 ops/sec ±4.94% (77 runs sampled)
+ * Uint8ClampedArray x 1,110,633 ops/sec ±4.20% (80 runs sampled)
+ * Post:
+ * Float64Array x 7,105,671 ops/sec ±13.47% (64 runs sampled)
+ * Float32Array x 5,887,912 ops/sec ±1.46% (82 runs sampled)
+ * Uint32Array x 6,491,661 ops/sec ±1.76% (79 runs sampled)
+ * Uint16Array x 6,559,795 ops/sec ±1.67% (82 runs sampled)
+ * Uint8Array x 6,463,966 ops/sec ±1.43% (85 runs sampled)
+ * Int32Array x 5,641,841 ops/sec ±3.49% (81 runs sampled)
+ * Int16Array x 6,583,511 ops/sec ±1.98% (80 runs sampled)
+ * Int8Array x 6,606,078 ops/sec ±1.74% (81 runs sampled)
+ * Uint8ClampedArray x 6,602,224 ops/sec ±1.77% (83 runs sampled)
+ */
+ var stringTag = (symbolToStringTagExists && obj[Symbol.toStringTag]);
+ if (typeof stringTag === 'string') {
+ return stringTag;
+ }
+
+ var objPrototype = Object.getPrototypeOf(obj);
+ /* ! Speed optimisation
+ * Pre:
+ * regex literal x 1,772,385 ops/sec ±1.85% (77 runs sampled)
+ * regex constructor x 2,143,634 ops/sec ±2.46% (78 runs sampled)
+ * Post:
+ * regex literal x 3,928,009 ops/sec ±0.65% (78 runs sampled)
+ * regex constructor x 3,931,108 ops/sec ±0.58% (84 runs sampled)
+ */
+ if (objPrototype === RegExp.prototype) {
+ return 'RegExp';
+ }
+
+ /* ! Speed optimisation
+ * Pre:
+ * date x 2,130,074 ops/sec ±4.42% (68 runs sampled)
+ * Post:
+ * date x 3,953,779 ops/sec ±1.35% (77 runs sampled)
+ */
+ if (objPrototype === Date.prototype) {
+ return 'Date';
+ }
+
+ /* ! Spec Conformance
+ * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise.prototype-@@tostringtag)
+ * ES6$25.4.5.4 - Promise.prototype[@@toStringTag] should be "Promise":
+ * Test: `Object.prototype.toString.call(Promise.resolve())``
+ * - Chrome <=47 === "[object Object]"
+ * - Edge <=20 === "[object Object]"
+ * - Firefox 29-Latest === "[object Promise]"
+ * - Safari 7.1-Latest === "[object Promise]"
+ */
+ if (promiseExists && objPrototype === Promise.prototype) {
+ return 'Promise';
+ }
+
+ /* ! Speed optimisation
+ * Pre:
+ * set x 2,222,186 ops/sec ±1.31% (82 runs sampled)
+ * Post:
+ * set x 4,545,879 ops/sec ±1.13% (83 runs sampled)
+ */
+ if (setExists && objPrototype === Set.prototype) {
+ return 'Set';
+ }
+
+ /* ! Speed optimisation
+ * Pre:
+ * map x 2,396,842 ops/sec ±1.59% (81 runs sampled)
+ * Post:
+ * map x 4,183,945 ops/sec ±6.59% (82 runs sampled)
+ */
+ if (mapExists && objPrototype === Map.prototype) {
+ return 'Map';
+ }
+
+ /* ! Speed optimisation
+ * Pre:
+ * weakset x 1,323,220 ops/sec ±2.17% (76 runs sampled)
+ * Post:
+ * weakset x 4,237,510 ops/sec ±2.01% (77 runs sampled)
+ */
+ if (weakSetExists && objPrototype === WeakSet.prototype) {
+ return 'WeakSet';
+ }
+
+ /* ! Speed optimisation
+ * Pre:
+ * weakmap x 1,500,260 ops/sec ±2.02% (78 runs sampled)
+ * Post:
+ * weakmap x 3,881,384 ops/sec ±1.45% (82 runs sampled)
+ */
+ if (weakMapExists && objPrototype === WeakMap.prototype) {
+ return 'WeakMap';
+ }
+
+ /* ! Spec Conformance
+ * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-dataview.prototype-@@tostringtag)
+ * ES6$24.2.4.21 - DataView.prototype[@@toStringTag] should be "DataView":
+ * Test: `Object.prototype.toString.call(new DataView(new ArrayBuffer(1)))``
+ * - Edge <=13 === "[object Object]"
+ */
+ if (dataViewExists && objPrototype === DataView.prototype) {
+ return 'DataView';
+ }
+
+ /* ! Spec Conformance
+ * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%mapiteratorprototype%-@@tostringtag)
+ * ES6$23.1.5.2.2 - %MapIteratorPrototype%[@@toStringTag] should be "Map Iterator":
+ * Test: `Object.prototype.toString.call(new Map().entries())``
+ * - Edge <=13 === "[object Object]"
+ */
+ if (mapExists && objPrototype === mapIteratorPrototype) {
+ return 'Map Iterator';
+ }
+
+ /* ! Spec Conformance
+ * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%setiteratorprototype%-@@tostringtag)
+ * ES6$23.2.5.2.2 - %SetIteratorPrototype%[@@toStringTag] should be "Set Iterator":
+ * Test: `Object.prototype.toString.call(new Set().entries())``
+ * - Edge <=13 === "[object Object]"
+ */
+ if (setExists && objPrototype === setIteratorPrototype) {
+ return 'Set Iterator';
+ }
+
+ /* ! Spec Conformance
+ * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%arrayiteratorprototype%-@@tostringtag)
+ * ES6$22.1.5.2.2 - %ArrayIteratorPrototype%[@@toStringTag] should be "Array Iterator":
+ * Test: `Object.prototype.toString.call([][Symbol.iterator]())``
+ * - Edge <=13 === "[object Object]"
+ */
+ if (arrayIteratorExists && objPrototype === arrayIteratorPrototype) {
+ return 'Array Iterator';
+ }
+
+ /* ! Spec Conformance
+ * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%stringiteratorprototype%-@@tostringtag)
+ * ES6$21.1.5.2.2 - %StringIteratorPrototype%[@@toStringTag] should be "String Iterator":
+ * Test: `Object.prototype.toString.call(''[Symbol.iterator]())``
+ * - Edge <=13 === "[object Object]"
+ */
+ if (stringIteratorExists && objPrototype === stringIteratorPrototype) {
+ return 'String Iterator';
+ }
+
+ /* ! Speed optimisation
+ * Pre:
+ * object from null x 2,424,320 ops/sec ±1.67% (76 runs sampled)
+ * Post:
+ * object from null x 5,838,000 ops/sec ±0.99% (84 runs sampled)
+ */
+ if (objPrototype === null) {
+ return 'Object';
+ }
+
+ return Object
+ .prototype
+ .toString
+ .call(obj)
+ .slice(toStringLeftSliceLength, toStringRightSliceLength);
+}
+
+return typeDetect;
+
+})));
},{}]},{},[1])(1)
});
diff --git a/test/vendor/mocha.css b/test/vendor/mocha.css
index ec96b00..4ca8fcb 100644
--- a/test/vendor/mocha.css
+++ b/test/vendor/mocha.css
@@ -139,7 +139,6 @@ body {
#mocha .test .html-error {
overflow: auto;
color: black;
- line-height: 1.5;
display: block;
float: left;
clear: left;
diff --git a/test/vendor/mocha.js b/test/vendor/mocha.js
index a1ec48f..2c8a9c3 100644
--- a/test/vendor/mocha.js
+++ b/test/vendor/mocha.js
@@ -1,15466 +1,30844 @@
-(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 1) {
- suites.shift();
- }
- return common.suite.create({
- title: title,
- file: file,
- fn: false
- });
- };
-
- /**
- * Exclusive Suite.
- */
-
- context.suite.only = function(title) {
- if (suites.length > 1) {
- suites.shift();
- }
- return common.suite.only({
- title: title,
- file: file,
- fn: false
- });
- };
-
- /**
- * Describe a specification or test-case
- * with the given `title` and callback `fn`
- * acting as a thunk.
- */
-
- context.test = function(title, fn) {
- var test = new Test(title, fn);
- test.file = file;
- suites[0].addTest(test);
- return test;
- };
-
- /**
- * Exclusive test-case.
- */
-
- context.test.only = function(title, fn) {
- return common.test.only(mocha, context.test(title, fn));
- };
-
- context.test.skip = common.test.skip;
- context.test.retries = common.test.retries;
- });
-};
-
-},{"../test":36,"./common":9}],13:[function(require,module,exports){
-/**
- * Module dependencies.
- */
-
-var Test = require('../test');
-
-/**
- * TDD-style interface:
- *
- * suite('Array', function() {
- * suite('#indexOf()', function() {
- * suiteSetup(function() {
- *
- * });
- *
- * test('should return -1 when not present', function() {
- *
- * });
- *
- * test('should return the index when present', function() {
- *
- * });
- *
- * suiteTeardown(function() {
- *
- * });
- * });
- * });
- *
- * @param {Suite} suite Root suite.
- */
-module.exports = function(suite) {
- var suites = [suite];
-
- suite.on('pre-require', function(context, file, mocha) {
- var common = require('./common')(suites, context, mocha);
-
- context.setup = common.beforeEach;
- context.teardown = common.afterEach;
- context.suiteSetup = common.before;
- context.suiteTeardown = common.after;
- context.run = mocha.options.delay && common.runWithSuite(suite);
-
- /**
- * Describe a "suite" with the given `title` and callback `fn` containing
- * nested suites and/or tests.
- */
- context.suite = function(title, fn) {
- return common.suite.create({
- title: title,
- file: file,
- fn: fn
- });
- };
-
- /**
- * Pending suite.
- */
- context.suite.skip = function(title, fn) {
- return common.suite.skip({
- title: title,
- file: file,
- fn: fn
- });
- };
-
- /**
- * Exclusive test-case.
- */
- context.suite.only = function(title, fn) {
- return common.suite.only({
- title: title,
- file: file,
- fn: fn
- });
- };
-
- /**
- * Describe a specification or test-case with the given `title` and
- * callback `fn` acting as a thunk.
- */
- context.test = function(title, fn) {
- var suite = suites[0];
- if (suite.isPending()) {
- fn = null;
- }
- var test = new Test(title, fn);
- test.file = file;
- suite.addTest(test);
- return test;
- };
-
- /**
- * Exclusive test-case.
- */
-
- context.test.only = function(title, fn) {
- return common.test.only(mocha, context.test(title, fn));
- };
-
- context.test.skip = common.test.skip;
- context.test.retries = common.test.retries;
- });
-};
-
-},{"../test":36,"./common":9}],14:[function(require,module,exports){
-(function (process,global,__dirname){
-/*!
- * mocha
- * Copyright(c) 2011 TJ Holowaychuk
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var escapeRe = require('escape-string-regexp');
-var path = require('path');
-var reporters = require('./reporters');
-var utils = require('./utils');
-
-/**
- * Expose `Mocha`.
- */
-
-exports = module.exports = Mocha;
-
-/**
- * To require local UIs and reporters when running in node.
- */
-
-if (!process.browser) {
- var cwd = process.cwd();
- module.paths.push(cwd, path.join(cwd, 'node_modules'));
-}
-
-/**
- * Expose internals.
- */
-
-exports.utils = utils;
-exports.interfaces = require('./interfaces');
-exports.reporters = reporters;
-exports.Runnable = require('./runnable');
-exports.Context = require('./context');
-exports.Runner = require('./runner');
-exports.Suite = require('./suite');
-exports.Hook = require('./hook');
-exports.Test = require('./test');
-
-/**
- * Return image `name` path.
- *
- * @api private
- * @param {string} name
- * @return {string}
- */
-function image(name) {
- return path.join(__dirname, '../images', name + '.png');
-}
-
-/**
- * Set up mocha with `options`.
- *
- * Options:
- *
- * - `ui` name "bdd", "tdd", "exports" etc
- * - `reporter` reporter instance, defaults to `mocha.reporters.spec`
- * - `globals` array of accepted globals
- * - `timeout` timeout in milliseconds
- * - `retries` number of times to retry failed tests
- * - `bail` bail on the first test failure
- * - `slow` milliseconds to wait before considering a test slow
- * - `ignoreLeaks` ignore global leaks
- * - `fullTrace` display the full stack-trace on failing
- * - `grep` string or regexp to filter tests with
- *
- * @param {Object} options
- * @api public
- */
-function Mocha(options) {
- options = options || {};
- this.files = [];
- this.options = options;
- if (options.grep) {
- this.grep(new RegExp(options.grep));
- }
- if (options.fgrep) {
- this.fgrep(options.fgrep);
- }
- this.suite = new exports.Suite('', new exports.Context());
- this.ui(options.ui);
- this.bail(options.bail);
- this.reporter(options.reporter, options.reporterOptions);
- if (typeof options.timeout !== 'undefined' && options.timeout !== null) {
- this.timeout(options.timeout);
- }
- if (typeof options.retries !== 'undefined' && options.retries !== null) {
- this.retries(options.retries);
- }
- this.useColors(options.useColors);
- if (options.enableTimeouts !== null) {
- this.enableTimeouts(options.enableTimeouts);
- }
- if (options.slow) {
- this.slow(options.slow);
- }
-}
-
-/**
- * Enable or disable bailing on the first failure.
- *
- * @api public
- * @param {boolean} [bail]
- */
-Mocha.prototype.bail = function(bail) {
- if (!arguments.length) {
- bail = true;
- }
- this.suite.bail(bail);
- return this;
-};
-
-/**
- * Add test `file`.
- *
- * @api public
- * @param {string} file
- */
-Mocha.prototype.addFile = function(file) {
- this.files.push(file);
- return this;
-};
-
-/**
- * Set reporter to `reporter`, defaults to "spec".
- *
- * @param {String|Function} reporter name or constructor
- * @param {Object} reporterOptions optional options
- * @api public
- * @param {string|Function} reporter name or constructor
- * @param {Object} reporterOptions optional options
- */
-Mocha.prototype.reporter = function(reporter, reporterOptions) {
- if (typeof reporter === 'function') {
- this._reporter = reporter;
- } else {
- reporter = reporter || 'spec';
- var _reporter;
- // Try to load a built-in reporter.
- if (reporters[reporter]) {
- _reporter = reporters[reporter];
- }
- // Try to load reporters from process.cwd() and node_modules
- if (!_reporter) {
- try {
- _reporter = require(reporter);
- } catch (err) {
- err.message.indexOf('Cannot find module') !== -1
- ? console.warn('"' + reporter + '" reporter not found')
- : console.warn('"' + reporter + '" reporter blew up with error:\n' + err.stack);
- }
- }
- if (!_reporter && reporter === 'teamcity') {
- console.warn('The Teamcity reporter was moved to a package named '
- + 'mocha-teamcity-reporter '
- + '(https://npmjs.org/package/mocha-teamcity-reporter).');
- }
- if (!_reporter) {
- throw new Error('invalid reporter "' + reporter + '"');
- }
- this._reporter = _reporter;
- }
- this.options.reporterOptions = reporterOptions;
- return this;
-};
-
-/**
- * Set test UI `name`, defaults to "bdd".
- *
- * @api public
- * @param {string} bdd
- */
-Mocha.prototype.ui = function(name) {
- name = name || 'bdd';
- this._ui = exports.interfaces[name];
- if (!this._ui) {
- try {
- this._ui = require(name);
- } catch (err) {
- throw new Error('invalid interface "' + name + '"');
- }
- }
- this._ui = this._ui(this.suite);
-
- this.suite.on('pre-require', function(context) {
- exports.afterEach = context.afterEach || context.teardown;
- exports.after = context.after || context.suiteTeardown;
- exports.beforeEach = context.beforeEach || context.setup;
- exports.before = context.before || context.suiteSetup;
- exports.describe = context.describe || context.suite;
- exports.it = context.it || context.test;
- exports.setup = context.setup || context.beforeEach;
- exports.suiteSetup = context.suiteSetup || context.before;
- exports.suiteTeardown = context.suiteTeardown || context.after;
- exports.suite = context.suite || context.describe;
- exports.teardown = context.teardown || context.afterEach;
- exports.test = context.test || context.it;
- exports.run = context.run;
- });
-
- return this;
-};
-
-/**
- * Load registered files.
- *
- * @api private
- */
-Mocha.prototype.loadFiles = function(fn) {
- var self = this;
- var suite = this.suite;
- this.files.forEach(function(file) {
- file = path.resolve(file);
- suite.emit('pre-require', global, file, self);
- suite.emit('require', require(file), file, self);
- suite.emit('post-require', global, file, self);
- });
- fn && fn();
-};
-
-/**
- * Enable growl support.
- *
- * @api private
- */
-Mocha.prototype._growl = function(runner, reporter) {
- var notify = require('growl');
-
- runner.on('end', function() {
- var stats = reporter.stats;
- if (stats.failures) {
- var msg = stats.failures + ' of ' + runner.total + ' tests failed';
- notify(msg, { name: 'mocha', title: 'Failed', image: image('error') });
- } else {
- notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', {
- name: 'mocha',
- title: 'Passed',
- image: image('ok')
- });
- }
- });
-};
-
-/**
- * Escape string and add it to grep as a regexp.
- *
- * @api public
- * @param str
- * @returns {Mocha}
- */
-Mocha.prototype.fgrep = function(str) {
- return this.grep(new RegExp(escapeRe(str)));
-};
-
-/**
- * Add regexp to grep, if `re` is a string it is escaped.
- *
- * @param {RegExp|String} re
- * @return {Mocha}
- * @api public
- * @param {RegExp|string} re
- * @return {Mocha}
- */
-Mocha.prototype.grep = function(re) {
- if (utils.isString(re)) {
- // extract args if it's regex-like, i.e: [string, pattern, flag]
- var arg = re.match(/^\/(.*)\/(g|i|)$|.*/);
- this.options.grep = new RegExp(arg[1] || arg[0], arg[2]);
- } else {
- this.options.grep = re;
- }
- return this;
-};
-/**
- * Invert `.grep()` matches.
- *
- * @return {Mocha}
- * @api public
- */
-Mocha.prototype.invert = function() {
- this.options.invert = true;
- return this;
-};
-
-/**
- * Ignore global leaks.
- *
- * @param {Boolean} ignore
- * @return {Mocha}
- * @api public
- * @param {boolean} ignore
- * @return {Mocha}
- */
-Mocha.prototype.ignoreLeaks = function(ignore) {
- this.options.ignoreLeaks = Boolean(ignore);
- return this;
-};
-
-/**
- * Enable global leak checking.
- *
- * @return {Mocha}
- * @api public
- */
-Mocha.prototype.checkLeaks = function() {
- this.options.ignoreLeaks = false;
- return this;
-};
-
-/**
- * Display long stack-trace on failing
- *
- * @return {Mocha}
- * @api public
- */
-Mocha.prototype.fullTrace = function() {
- this.options.fullStackTrace = true;
- return this;
-};
-
-/**
- * Enable growl support.
- *
- * @return {Mocha}
- * @api public
- */
-Mocha.prototype.growl = function() {
- this.options.growl = true;
- return this;
-};
-
-/**
- * Ignore `globals` array or string.
- *
- * @param {Array|String} globals
- * @return {Mocha}
- * @api public
- * @param {Array|string} globals
- * @return {Mocha}
- */
-Mocha.prototype.globals = function(globals) {
- this.options.globals = (this.options.globals || []).concat(globals);
- return this;
-};
-
-/**
- * Emit color output.
- *
- * @param {Boolean} colors
- * @return {Mocha}
- * @api public
- * @param {boolean} colors
- * @return {Mocha}
- */
-Mocha.prototype.useColors = function(colors) {
- if (colors !== undefined) {
- this.options.useColors = colors;
- }
- return this;
-};
-
-/**
- * Use inline diffs rather than +/-.
- *
- * @param {Boolean} inlineDiffs
- * @return {Mocha}
- * @api public
- * @param {boolean} inlineDiffs
- * @return {Mocha}
- */
-Mocha.prototype.useInlineDiffs = function(inlineDiffs) {
- this.options.useInlineDiffs = inlineDiffs !== undefined && inlineDiffs;
- return this;
-};
-
-/**
- * Set the timeout in milliseconds.
- *
- * @param {Number} timeout
- * @return {Mocha}
- * @api public
- * @param {number} timeout
- * @return {Mocha}
- */
-Mocha.prototype.timeout = function(timeout) {
- this.suite.timeout(timeout);
- return this;
-};
-
-/**
- * Set the number of times to retry failed tests.
- *
- * @param {Number} retry times
- * @return {Mocha}
- * @api public
- */
-Mocha.prototype.retries = function(n) {
- this.suite.retries(n);
- return this;
-};
-
-/**
- * Set slowness threshold in milliseconds.
- *
- * @param {Number} slow
- * @return {Mocha}
- * @api public
- * @param {number} slow
- * @return {Mocha}
- */
-Mocha.prototype.slow = function(slow) {
- this.suite.slow(slow);
- return this;
-};
-
-/**
- * Enable timeouts.
- *
- * @param {Boolean} enabled
- * @return {Mocha}
- * @api public
- * @param {boolean} enabled
- * @return {Mocha}
- */
-Mocha.prototype.enableTimeouts = function(enabled) {
- this.suite.enableTimeouts(arguments.length && enabled !== undefined ? enabled : true);
- return this;
-};
-
-/**
- * Makes all tests async (accepting a callback)
- *
- * @return {Mocha}
- * @api public
- */
-Mocha.prototype.asyncOnly = function() {
- this.options.asyncOnly = true;
- return this;
-};
-
-/**
- * Disable syntax highlighting (in browser).
- *
- * @api public
- */
-Mocha.prototype.noHighlighting = function() {
- this.options.noHighlighting = true;
- return this;
-};
-
-/**
- * Enable uncaught errors to propagate (in browser).
- *
- * @return {Mocha}
- * @api public
- */
-Mocha.prototype.allowUncaught = function() {
- this.options.allowUncaught = true;
- return this;
-};
-
-/**
- * Delay root suite execution.
- * @returns {Mocha}
- */
-Mocha.prototype.delay = function delay() {
- this.options.delay = true;
- return this;
-};
-
-/**
- * Run tests and invoke `fn()` when complete.
- *
- * @api public
- * @param {Function} fn
- * @return {Runner}
- */
-Mocha.prototype.run = function(fn) {
- if (this.files.length) {
- this.loadFiles();
- }
- var suite = this.suite;
- var options = this.options;
- options.files = this.files;
- var runner = new exports.Runner(suite, options.delay);
- var reporter = new this._reporter(runner, options);
- runner.ignoreLeaks = options.ignoreLeaks !== false;
- runner.fullStackTrace = options.fullStackTrace;
- runner.hasOnly = options.hasOnly;
- runner.asyncOnly = options.asyncOnly;
- runner.allowUncaught = options.allowUncaught;
- if (options.grep) {
- runner.grep(options.grep, options.invert);
- }
- if (options.globals) {
- runner.globals(options.globals);
- }
- if (options.growl) {
- this._growl(runner, reporter);
- }
- if (options.useColors !== undefined) {
- exports.reporters.Base.useColors = options.useColors;
- }
- exports.reporters.Base.inlineDiffs = options.useInlineDiffs;
-
- function done(failures) {
- if (reporter.done) {
- reporter.done(failures, fn);
- } else {
- fn && fn(failures);
- }
- }
-
- return runner.run(done);
-};
-
-}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},"/lib")
-},{"./context":6,"./hook":7,"./interfaces":11,"./reporters":21,"./runnable":33,"./runner":34,"./suite":35,"./test":36,"./utils":38,"_process":67,"escape-string-regexp":47,"growl":49,"path":42}],15:[function(require,module,exports){
-/**
- * Helpers.
- */
-
-var s = 1000;
-var m = s * 60;
-var h = m * 60;
-var d = h * 24;
-var y = d * 365.25;
-
-/**
- * Parse or format the given `val`.
- *
- * Options:
- *
- * - `long` verbose formatting [false]
- *
- * @api public
- * @param {string|number} val
- * @param {Object} options
- * @return {string|number}
- */
-module.exports = function(val, options) {
- options = options || {};
- if (typeof val === 'string') {
- return parse(val);
- }
- // https://github.com/mochajs/mocha/pull/1035
- return options['long'] ? longFormat(val) : shortFormat(val);
-};
-
-/**
- * Parse the given `str` and return milliseconds.
- *
- * @api private
- * @param {string} str
- * @return {number}
- */
-function parse(str) {
- var match = (/^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i).exec(str);
- if (!match) {
- return;
- }
- var n = parseFloat(match[1]);
- var type = (match[2] || 'ms').toLowerCase();
- switch (type) {
- case 'years':
- case 'year':
- case 'y':
- return n * y;
- case 'days':
- case 'day':
- case 'd':
- return n * d;
- case 'hours':
- case 'hour':
- case 'h':
- return n * h;
- case 'minutes':
- case 'minute':
- case 'm':
- return n * m;
- case 'seconds':
- case 'second':
- case 's':
- return n * s;
- case 'ms':
- return n;
- default:
- // No default case
- }
-}
-
-/**
- * Short format for `ms`.
- *
- * @api private
- * @param {number} ms
- * @return {string}
- */
-function shortFormat(ms) {
- if (ms >= d) {
- return Math.round(ms / d) + 'd';
- }
- if (ms >= h) {
- return Math.round(ms / h) + 'h';
- }
- if (ms >= m) {
- return Math.round(ms / m) + 'm';
- }
- if (ms >= s) {
- return Math.round(ms / s) + 's';
- }
- return ms + 'ms';
-}
-
-/**
- * Long format for `ms`.
- *
- * @api private
- * @param {number} ms
- * @return {string}
- */
-function longFormat(ms) {
- return plural(ms, d, 'day')
- || plural(ms, h, 'hour')
- || plural(ms, m, 'minute')
- || plural(ms, s, 'second')
- || ms + ' ms';
-}
-
-/**
- * Pluralization helper.
- *
- * @api private
- * @param {number} ms
- * @param {number} n
- * @param {string} name
- */
-function plural(ms, n, name) {
- if (ms < n) {
- return;
- }
- if (ms < n * 1.5) {
- return Math.floor(ms / n) + ' ' + name;
- }
- return Math.ceil(ms / n) + ' ' + name + 's';
-}
-
-},{}],16:[function(require,module,exports){
-
-/**
- * Expose `Pending`.
- */
-
-module.exports = Pending;
-
-/**
- * Initialize a new `Pending` error with the given message.
- *
- * @param {string} message
- */
-function Pending(message) {
- this.message = message;
-}
-
-},{}],17:[function(require,module,exports){
-(function (process,global){
-/**
- * Module dependencies.
- */
-
-var tty = require('tty');
-var diff = require('diff');
-var ms = require('../ms');
-var utils = require('../utils');
-var supportsColor = process.browser ? null : require('supports-color');
-
-/**
- * Expose `Base`.
- */
-
-exports = module.exports = Base;
-
-/**
- * Save timer references to avoid Sinon interfering.
- * See: https://github.com/mochajs/mocha/issues/237
- */
-
-/* eslint-disable no-unused-vars, no-native-reassign */
-var Date = global.Date;
-var setTimeout = global.setTimeout;
-var setInterval = global.setInterval;
-var clearTimeout = global.clearTimeout;
-var clearInterval = global.clearInterval;
-/* eslint-enable no-unused-vars, no-native-reassign */
-
-/**
- * Check if both stdio streams are associated with a tty.
- */
-
-var isatty = tty.isatty(1) && tty.isatty(2);
-
-/**
- * Enable coloring by default, except in the browser interface.
- */
-
-exports.useColors = !process.browser && (supportsColor || (process.env.MOCHA_COLORS !== undefined));
-
-/**
- * Inline diffs instead of +/-
- */
-
-exports.inlineDiffs = false;
-
-/**
- * Default color map.
- */
-
-exports.colors = {
- pass: 90,
- fail: 31,
- 'bright pass': 92,
- 'bright fail': 91,
- 'bright yellow': 93,
- pending: 36,
- suite: 0,
- 'error title': 0,
- 'error message': 31,
- 'error stack': 90,
- checkmark: 32,
- fast: 90,
- medium: 33,
- slow: 31,
- green: 32,
- light: 90,
- 'diff gutter': 90,
- 'diff added': 32,
- 'diff removed': 31
-};
-
-/**
- * Default symbol map.
- */
-
-exports.symbols = {
- ok: '✓',
- err: '✖',
- dot: '․',
- comma: ',',
- bang: '!'
-};
-
-// With node.js on Windows: use symbols available in terminal default fonts
-if (process.platform === 'win32') {
- exports.symbols.ok = '\u221A';
- exports.symbols.err = '\u00D7';
- exports.symbols.dot = '.';
-}
-
-/**
- * Color `str` with the given `type`,
- * allowing colors to be disabled,
- * as well as user-defined color
- * schemes.
- *
- * @param {string} type
- * @param {string} str
- * @return {string}
- * @api private
- */
-var color = exports.color = function(type, str) {
- if (!exports.useColors) {
- return String(str);
- }
- return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m';
-};
-
-/**
- * Expose term window size, with some defaults for when stderr is not a tty.
- */
-
-exports.window = {
- width: 75
-};
-
-if (isatty) {
- exports.window.width = process.stdout.getWindowSize
- ? process.stdout.getWindowSize(1)[0]
- : tty.getWindowSize()[1];
-}
-
-/**
- * Expose some basic cursor interactions that are common among reporters.
- */
-
-exports.cursor = {
- hide: function() {
- isatty && process.stdout.write('\u001b[?25l');
- },
-
- show: function() {
- isatty && process.stdout.write('\u001b[?25h');
- },
-
- deleteLine: function() {
- isatty && process.stdout.write('\u001b[2K');
- },
-
- beginningOfLine: function() {
- isatty && process.stdout.write('\u001b[0G');
- },
-
- CR: function() {
- if (isatty) {
- exports.cursor.deleteLine();
- exports.cursor.beginningOfLine();
- } else {
- process.stdout.write('\r');
- }
- }
-};
-
-/**
- * Outut the given `failures` as a list.
- *
- * @param {Array} failures
- * @api public
- */
-
-exports.list = function(failures) {
- console.log();
- failures.forEach(function(test, i) {
- // format
- var fmt = color('error title', ' %s) %s:\n')
- + color('error message', ' %s')
- + color('error stack', '\n%s\n');
-
- // msg
- var msg;
- var err = test.err;
- var message;
- if (err.message && typeof err.message.toString === 'function') {
- message = err.message + '';
- } else if (typeof err.inspect === 'function') {
- message = err.inspect() + '';
- } else {
- message = '';
- }
- var stack = err.stack || message;
- var index = message ? stack.indexOf(message) : -1;
- var actual = err.actual;
- var expected = err.expected;
- var escape = true;
-
- if (index === -1) {
- msg = message;
- } else {
- index += message.length;
- msg = stack.slice(0, index);
- // remove msg from stack
- stack = stack.slice(index + 1);
- }
-
- // uncaught
- if (err.uncaught) {
- msg = 'Uncaught ' + msg;
- }
- // explicitly show diff
- if (err.showDiff !== false && sameType(actual, expected) && expected !== undefined) {
- escape = false;
- if (!(utils.isString(actual) && utils.isString(expected))) {
- err.actual = actual = utils.stringify(actual);
- err.expected = expected = utils.stringify(expected);
- }
-
- fmt = color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n');
- var match = message.match(/^([^:]+): expected/);
- msg = '\n ' + color('error message', match ? match[1] : msg);
-
- if (exports.inlineDiffs) {
- msg += inlineDiff(err, escape);
- } else {
- msg += unifiedDiff(err, escape);
- }
- }
-
- // indent stack trace
- stack = stack.replace(/^/gm, ' ');
-
- console.log(fmt, (i + 1), test.fullTitle(), msg, stack);
- });
-};
-
-/**
- * Initialize a new `Base` reporter.
- *
- * All other reporters generally
- * inherit from this reporter, providing
- * stats such as test duration, number
- * of tests passed / failed etc.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function Base(runner) {
- var stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 };
- var failures = this.failures = [];
-
- if (!runner) {
- return;
- }
- this.runner = runner;
-
- runner.stats = stats;
-
- runner.on('start', function() {
- stats.start = new Date();
- });
-
- runner.on('suite', function(suite) {
- stats.suites = stats.suites || 0;
- suite.root || stats.suites++;
- });
-
- runner.on('test end', function() {
- stats.tests = stats.tests || 0;
- stats.tests++;
- });
-
- runner.on('pass', function(test) {
- stats.passes = stats.passes || 0;
-
- if (test.duration > test.slow()) {
- test.speed = 'slow';
- } else if (test.duration > test.slow() / 2) {
- test.speed = 'medium';
- } else {
- test.speed = 'fast';
- }
-
- stats.passes++;
- });
-
- runner.on('fail', function(test, err) {
- stats.failures = stats.failures || 0;
- stats.failures++;
- test.err = err;
- failures.push(test);
- });
-
- runner.on('end', function() {
- stats.end = new Date();
- stats.duration = new Date() - stats.start;
- });
-
- runner.on('pending', function() {
- stats.pending++;
- });
-}
-
-/**
- * Output common epilogue used by many of
- * the bundled reporters.
- *
- * @api public
- */
-Base.prototype.epilogue = function() {
- var stats = this.stats;
- var fmt;
-
- console.log();
-
- // passes
- fmt = color('bright pass', ' ')
- + color('green', ' %d passing')
- + color('light', ' (%s)');
-
- console.log(fmt,
- stats.passes || 0,
- ms(stats.duration));
-
- // pending
- if (stats.pending) {
- fmt = color('pending', ' ')
- + color('pending', ' %d pending');
-
- console.log(fmt, stats.pending);
- }
-
- // failures
- if (stats.failures) {
- fmt = color('fail', ' %d failing');
-
- console.log(fmt, stats.failures);
-
- Base.list(this.failures);
- console.log();
- }
-
- console.log();
-};
-
-/**
- * Pad the given `str` to `len`.
- *
- * @api private
- * @param {string} str
- * @param {string} len
- * @return {string}
- */
-function pad(str, len) {
- str = String(str);
- return Array(len - str.length + 1).join(' ') + str;
-}
-
-/**
- * Returns an inline diff between 2 strings with coloured ANSI output
- *
- * @api private
- * @param {Error} err with actual/expected
- * @param {boolean} escape
- * @return {string} Diff
- */
-function inlineDiff(err, escape) {
- var msg = errorDiff(err, 'WordsWithSpace', escape);
-
- // linenos
- var lines = msg.split('\n');
- if (lines.length > 4) {
- var width = String(lines.length).length;
- msg = lines.map(function(str, i) {
- return pad(++i, width) + ' |' + ' ' + str;
- }).join('\n');
- }
-
- // legend
- msg = '\n'
- + color('diff removed', 'actual')
- + ' '
- + color('diff added', 'expected')
- + '\n\n'
- + msg
- + '\n';
-
- // indent
- msg = msg.replace(/^/gm, ' ');
- return msg;
-}
-
-/**
- * Returns a unified diff between two strings.
- *
- * @api private
- * @param {Error} err with actual/expected
- * @param {boolean} escape
- * @return {string} The diff.
- */
-function unifiedDiff(err, escape) {
- var indent = ' ';
- function cleanUp(line) {
- if (escape) {
- line = escapeInvisibles(line);
- }
- if (line[0] === '+') {
- return indent + colorLines('diff added', line);
- }
- if (line[0] === '-') {
- return indent + colorLines('diff removed', line);
- }
- if (line.match(/\@\@/)) {
- return null;
- }
- if (line.match(/\\ No newline/)) {
- return null;
- }
- return indent + line;
- }
- function notBlank(line) {
- return typeof line !== 'undefined' && line !== null;
- }
- var msg = diff.createPatch('string', err.actual, err.expected);
- var lines = msg.split('\n').splice(4);
- return '\n '
- + colorLines('diff added', '+ expected') + ' '
- + colorLines('diff removed', '- actual')
- + '\n\n'
- + lines.map(cleanUp).filter(notBlank).join('\n');
-}
-
-/**
- * Return a character diff for `err`.
- *
- * @api private
- * @param {Error} err
- * @param {string} type
- * @param {boolean} escape
- * @return {string}
- */
-function errorDiff(err, type, escape) {
- var actual = escape ? escapeInvisibles(err.actual) : err.actual;
- var expected = escape ? escapeInvisibles(err.expected) : err.expected;
- return diff['diff' + type](actual, expected).map(function(str) {
- if (str.added) {
- return colorLines('diff added', str.value);
- }
- if (str.removed) {
- return colorLines('diff removed', str.value);
- }
- return str.value;
- }).join('');
-}
-
-/**
- * Returns a string with all invisible characters in plain text
- *
- * @api private
- * @param {string} line
- * @return {string}
- */
-function escapeInvisibles(line) {
- return line.replace(/\t/g, '')
- .replace(/\r/g, '')
- .replace(/\n/g, '\n');
-}
-
-/**
- * Color lines for `str`, using the color `name`.
- *
- * @api private
- * @param {string} name
- * @param {string} str
- * @return {string}
- */
-function colorLines(name, str) {
- return str.split('\n').map(function(str) {
- return color(name, str);
- }).join('\n');
-}
-
-/**
- * Object#toString reference.
- */
-var objToString = Object.prototype.toString;
-
-/**
- * Check that a / b have the same type.
- *
- * @api private
- * @param {Object} a
- * @param {Object} b
- * @return {boolean}
- */
-function sameType(a, b) {
- return objToString.call(a) === objToString.call(b);
-}
-
-}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"../ms":15,"../utils":38,"_process":67,"diff":46,"supports-color":42,"tty":5}],18:[function(require,module,exports){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base');
-var utils = require('../utils');
-
-/**
- * Expose `Doc`.
- */
-
-exports = module.exports = Doc;
-
-/**
- * Initialize a new `Doc` reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-function Doc(runner) {
- Base.call(this, runner);
-
- var indents = 2;
-
- function indent() {
- return Array(indents).join(' ');
- }
-
- runner.on('suite', function(suite) {
- if (suite.root) {
- return;
- }
- ++indents;
- console.log('%s', indent());
- ++indents;
- console.log('%s%s ', indent(), utils.escape(suite.title));
- console.log('%s', indent());
- });
-
- runner.on('suite end', function(suite) {
- if (suite.root) {
- return;
- }
- console.log('%s ', indent());
- --indents;
- console.log('%s ', indent());
- --indents;
- });
-
- runner.on('pass', function(test) {
- console.log('%s %s ', indent(), utils.escape(test.title));
- var code = utils.escape(utils.clean(test.body));
- console.log('%s %s
', indent(), code);
- });
-
- runner.on('fail', function(test, err) {
- console.log('%s %s ', indent(), utils.escape(test.title));
- var code = utils.escape(utils.clean(test.body));
- console.log('%s %s
', indent(), code);
- console.log('%s %s ', indent(), utils.escape(err));
- });
-}
-
-},{"../utils":38,"./base":17}],19:[function(require,module,exports){
-(function (process){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base');
-var inherits = require('../utils').inherits;
-var color = Base.color;
-
-/**
- * Expose `Dot`.
- */
-
-exports = module.exports = Dot;
-
-/**
- * Initialize a new `Dot` matrix test reporter.
- *
- * @api public
- * @param {Runner} runner
- */
-function Dot(runner) {
- Base.call(this, runner);
-
- var self = this;
- var width = Base.window.width * .75 | 0;
- var n = -1;
-
- runner.on('start', function() {
- process.stdout.write('\n');
- });
-
- runner.on('pending', function() {
- if (++n % width === 0) {
- process.stdout.write('\n ');
- }
- process.stdout.write(color('pending', Base.symbols.comma));
- });
-
- runner.on('pass', function(test) {
- if (++n % width === 0) {
- process.stdout.write('\n ');
- }
- if (test.speed === 'slow') {
- process.stdout.write(color('bright yellow', Base.symbols.dot));
- } else {
- process.stdout.write(color(test.speed, Base.symbols.dot));
- }
- });
-
- runner.on('fail', function() {
- if (++n % width === 0) {
- process.stdout.write('\n ');
- }
- process.stdout.write(color('fail', Base.symbols.bang));
- });
-
- runner.on('end', function() {
- console.log();
- self.epilogue();
- });
-}
-
-/**
- * Inherit from `Base.prototype`.
- */
-inherits(Dot, Base);
-
-}).call(this,require('_process'))
-},{"../utils":38,"./base":17,"_process":67}],20:[function(require,module,exports){
-(function (global){
-/* eslint-env browser */
-
-/**
- * Module dependencies.
- */
-
-var Base = require('./base');
-var utils = require('../utils');
-var Progress = require('../browser/progress');
-var escapeRe = require('escape-string-regexp');
-var escape = utils.escape;
-
-/**
- * Save timer references to avoid Sinon interfering (see GH-237).
- */
-
-/* eslint-disable no-unused-vars, no-native-reassign */
-var Date = global.Date;
-var setTimeout = global.setTimeout;
-var setInterval = global.setInterval;
-var clearTimeout = global.clearTimeout;
-var clearInterval = global.clearInterval;
-/* eslint-enable no-unused-vars, no-native-reassign */
-
-/**
- * Expose `HTML`.
- */
-
-exports = module.exports = HTML;
-
-/**
- * Stats template.
- */
-
-var statsTemplate = '';
-
-/**
- * Initialize a new `HTML` reporter.
- *
- * @api public
- * @param {Runner} runner
- */
-function HTML(runner) {
- Base.call(this, runner);
-
- var self = this;
- var stats = this.stats;
- var stat = fragment(statsTemplate);
- var items = stat.getElementsByTagName('li');
- var passes = items[1].getElementsByTagName('em')[0];
- var passesLink = items[1].getElementsByTagName('a')[0];
- var failures = items[2].getElementsByTagName('em')[0];
- var failuresLink = items[2].getElementsByTagName('a')[0];
- var duration = items[3].getElementsByTagName('em')[0];
- var canvas = stat.getElementsByTagName('canvas')[0];
- var report = fragment('');
- var stack = [report];
- var progress;
- var ctx;
- var root = document.getElementById('mocha');
-
- if (canvas.getContext) {
- var ratio = window.devicePixelRatio || 1;
- canvas.style.width = canvas.width;
- canvas.style.height = canvas.height;
- canvas.width *= ratio;
- canvas.height *= ratio;
- ctx = canvas.getContext('2d');
- ctx.scale(ratio, ratio);
- progress = new Progress();
- }
-
- if (!root) {
- return error('#mocha div missing, add it to your document');
- }
-
- // pass toggle
- on(passesLink, 'click', function(evt) {
- evt.preventDefault();
- unhide();
- var name = (/pass/).test(report.className) ? '' : ' pass';
- report.className = report.className.replace(/fail|pass/g, '') + name;
- if (report.className.trim()) {
- hideSuitesWithout('test pass');
- }
- });
-
- // failure toggle
- on(failuresLink, 'click', function(evt) {
- evt.preventDefault();
- unhide();
- var name = (/fail/).test(report.className) ? '' : ' fail';
- report.className = report.className.replace(/fail|pass/g, '') + name;
- if (report.className.trim()) {
- hideSuitesWithout('test fail');
- }
- });
-
- root.appendChild(stat);
- root.appendChild(report);
-
- if (progress) {
- progress.size(40);
- }
-
- runner.on('suite', function(suite) {
- if (suite.root) {
- return;
- }
-
- // suite
- var url = self.suiteURL(suite);
- var el = fragment(' ', url, escape(suite.title));
-
- // container
- stack[0].appendChild(el);
- stack.unshift(document.createElement('ul'));
- el.appendChild(stack[0]);
- });
-
- runner.on('suite end', function(suite) {
- if (suite.root) {
- updateStats();
- return;
- }
- stack.shift();
- });
-
- runner.on('pass', function(test) {
- var url = self.testURL(test);
- var markup = '%e%ems '
- + '‣ ';
- var el = fragment(markup, test.speed, test.title, test.duration, url);
- self.addCodeToggle(el, test.body);
- appendToStack(el);
- updateStats();
- });
-
- runner.on('fail', function(test) {
- var el = fragment('%e ‣ ',
- test.title, self.testURL(test));
- var stackString; // Note: Includes leading newline
- var message = test.err.toString();
-
- // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we
- // check for the result of the stringifying.
- if (message === '[object Error]') {
- message = test.err.message;
- }
-
- if (test.err.stack) {
- var indexOfMessage = test.err.stack.indexOf(test.err.message);
- if (indexOfMessage === -1) {
- stackString = test.err.stack;
- } else {
- stackString = test.err.stack.substr(test.err.message.length + indexOfMessage);
- }
- } else if (test.err.sourceURL && test.err.line !== undefined) {
- // Safari doesn't give you a stack. Let's at least provide a source line.
- stackString = '\n(' + test.err.sourceURL + ':' + test.err.line + ')';
- }
-
- stackString = stackString || '';
-
- if (test.err.htmlMessage && stackString) {
- el.appendChild(fragment('',
- test.err.htmlMessage, stackString));
- } else if (test.err.htmlMessage) {
- el.appendChild(fragment('%s
', test.err.htmlMessage));
- } else {
- el.appendChild(fragment('%e%e ', message, stackString));
- }
-
- self.addCodeToggle(el, test.body);
- appendToStack(el);
- updateStats();
- });
-
- runner.on('pending', function(test) {
- var el = fragment('%e ', test.title);
- appendToStack(el);
- updateStats();
- });
-
- function appendToStack(el) {
- // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack.
- if (stack[0]) {
- stack[0].appendChild(el);
- }
- }
-
- function updateStats() {
- // TODO: add to stats
- var percent = stats.tests / runner.total * 100 | 0;
- if (progress) {
- progress.update(percent).draw(ctx);
- }
-
- // update stats
- var ms = new Date() - stats.start;
- text(passes, stats.passes);
- text(failures, stats.failures);
- text(duration, (ms / 1000).toFixed(2));
- }
-}
-
-/**
- * Makes a URL, preserving querystring ("search") parameters.
- *
- * @param {string} s
- * @return {string} A new URL.
- */
-function makeUrl(s) {
- var search = window.location.search;
-
- // Remove previous grep query parameter if present
- if (search) {
- search = search.replace(/[?&]grep=[^&\s]*/g, '').replace(/^&/, '?');
- }
-
- return window.location.pathname + (search ? search + '&' : '?') + 'grep=' + encodeURIComponent(escapeRe(s));
-}
-
-/**
- * Provide suite URL.
- *
- * @param {Object} [suite]
- */
-HTML.prototype.suiteURL = function(suite) {
- return makeUrl(suite.fullTitle());
-};
-
-/**
- * Provide test URL.
- *
- * @param {Object} [test]
- */
-HTML.prototype.testURL = function(test) {
- return makeUrl(test.fullTitle());
-};
-
-/**
- * Adds code toggle functionality for the provided test's list element.
- *
- * @param {HTMLLIElement} el
- * @param {string} contents
- */
-HTML.prototype.addCodeToggle = function(el, contents) {
- var h2 = el.getElementsByTagName('h2')[0];
-
- on(h2, 'click', function() {
- pre.style.display = pre.style.display === 'none' ? 'block' : 'none';
- });
-
- var pre = fragment('%e
', utils.clean(contents));
- el.appendChild(pre);
- pre.style.display = 'none';
-};
-
-/**
- * Display error `msg`.
- *
- * @param {string} msg
- */
-function error(msg) {
- document.body.appendChild(fragment('%s
', msg));
-}
-
-/**
- * Return a DOM fragment from `html`.
- *
- * @param {string} html
- */
-function fragment(html) {
- var args = arguments;
- var div = document.createElement('div');
- var i = 1;
-
- div.innerHTML = html.replace(/%([se])/g, function(_, type) {
- switch (type) {
- case 's': return String(args[i++]);
- case 'e': return escape(args[i++]);
- // no default
- }
- });
-
- return div.firstChild;
-}
-
-/**
- * Check for suites that do not have elements
- * with `classname`, and hide them.
- *
- * @param {text} classname
- */
-function hideSuitesWithout(classname) {
- var suites = document.getElementsByClassName('suite');
- for (var i = 0; i < suites.length; i++) {
- var els = suites[i].getElementsByClassName(classname);
- if (!els.length) {
- suites[i].className += ' hidden';
- }
- }
-}
-
-/**
- * Unhide .hidden suites.
- */
-function unhide() {
- var els = document.getElementsByClassName('suite hidden');
- for (var i = 0; i < els.length; ++i) {
- els[i].className = els[i].className.replace('suite hidden', 'suite');
- }
-}
-
-/**
- * Set an element's text contents.
- *
- * @param {HTMLElement} el
- * @param {string} contents
- */
-function text(el, contents) {
- if (el.textContent) {
- el.textContent = contents;
- } else {
- el.innerText = contents;
- }
-}
-
-/**
- * Listen on `event` with callback `fn`.
- */
-function on(el, event, fn) {
- if (el.addEventListener) {
- el.addEventListener(event, fn, false);
- } else {
- el.attachEvent('on' + event, fn);
- }
-}
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"../browser/progress":4,"../utils":38,"./base":17,"escape-string-regexp":47}],21:[function(require,module,exports){
-// Alias exports to a their normalized format Mocha#reporter to prevent a need
-// for dynamic (try/catch) requires, which Browserify doesn't handle.
-exports.Base = exports.base = require('./base');
-exports.Dot = exports.dot = require('./dot');
-exports.Doc = exports.doc = require('./doc');
-exports.TAP = exports.tap = require('./tap');
-exports.JSON = exports.json = require('./json');
-exports.HTML = exports.html = require('./html');
-exports.List = exports.list = require('./list');
-exports.Min = exports.min = require('./min');
-exports.Spec = exports.spec = require('./spec');
-exports.Nyan = exports.nyan = require('./nyan');
-exports.XUnit = exports.xunit = require('./xunit');
-exports.Markdown = exports.markdown = require('./markdown');
-exports.Progress = exports.progress = require('./progress');
-exports.Landing = exports.landing = require('./landing');
-exports.JSONStream = exports['json-stream'] = require('./json-stream');
-
-},{"./base":17,"./doc":18,"./dot":19,"./html":20,"./json":23,"./json-stream":22,"./landing":24,"./list":25,"./markdown":26,"./min":27,"./nyan":28,"./progress":29,"./spec":30,"./tap":31,"./xunit":32}],22:[function(require,module,exports){
-(function (process){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base');
-var JSON = require('json3');
-
-/**
- * Expose `List`.
- */
-
-exports = module.exports = List;
-
-/**
- * Initialize a new `List` test reporter.
- *
- * @api public
- * @param {Runner} runner
- */
-function List(runner) {
- Base.call(this, runner);
-
- var self = this;
- var total = runner.total;
-
- runner.on('start', function() {
- console.log(JSON.stringify(['start', { total: total }]));
- });
-
- runner.on('pass', function(test) {
- console.log(JSON.stringify(['pass', clean(test)]));
- });
-
- runner.on('fail', function(test, err) {
- test = clean(test);
- test.err = err.message;
- test.stack = err.stack || null;
- console.log(JSON.stringify(['fail', test]));
- });
-
- runner.on('end', function() {
- process.stdout.write(JSON.stringify(['end', self.stats]));
- });
-}
-
-/**
- * Return a plain-object representation of `test`
- * free of cyclic properties etc.
- *
- * @api private
- * @param {Object} test
- * @return {Object}
- */
-function clean(test) {
- return {
- title: test.title,
- fullTitle: test.fullTitle(),
- duration: test.duration,
- currentRetry: test.currentRetry()
- };
-}
-
-}).call(this,require('_process'))
-},{"./base":17,"_process":67,"json3":54}],23:[function(require,module,exports){
-(function (process){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base');
-
-/**
- * Expose `JSON`.
- */
-
-exports = module.exports = JSONReporter;
-
-/**
- * Initialize a new `JSON` reporter.
- *
- * @api public
- * @param {Runner} runner
- */
-function JSONReporter(runner) {
- Base.call(this, runner);
-
- var self = this;
- var tests = [];
- var pending = [];
- var failures = [];
- var passes = [];
-
- runner.on('test end', function(test) {
- tests.push(test);
- });
-
- runner.on('pass', function(test) {
- passes.push(test);
- });
-
- runner.on('fail', function(test) {
- failures.push(test);
- });
-
- runner.on('pending', function(test) {
- pending.push(test);
- });
-
- runner.on('end', function() {
- var obj = {
- stats: self.stats,
- tests: tests.map(clean),
- pending: pending.map(clean),
- failures: failures.map(clean),
- passes: passes.map(clean)
- };
-
- runner.testResults = obj;
-
- process.stdout.write(JSON.stringify(obj, null, 2));
- });
-}
-
-/**
- * Return a plain-object representation of `test`
- * free of cyclic properties etc.
- *
- * @api private
- * @param {Object} test
- * @return {Object}
- */
-function clean(test) {
- return {
- title: test.title,
- fullTitle: test.fullTitle(),
- duration: test.duration,
- currentRetry: test.currentRetry(),
- err: errorJSON(test.err || {})
- };
-}
-
-/**
- * Transform `error` into a JSON object.
- *
- * @api private
- * @param {Error} err
- * @return {Object}
- */
-function errorJSON(err) {
- var res = {};
- Object.getOwnPropertyNames(err).forEach(function(key) {
- res[key] = err[key];
- }, err);
- return res;
-}
-
-}).call(this,require('_process'))
-},{"./base":17,"_process":67}],24:[function(require,module,exports){
-(function (process){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base');
-var inherits = require('../utils').inherits;
-var cursor = Base.cursor;
-var color = Base.color;
-
-/**
- * Expose `Landing`.
- */
-
-exports = module.exports = Landing;
-
-/**
- * Airplane color.
- */
-
-Base.colors.plane = 0;
-
-/**
- * Airplane crash color.
- */
-
-Base.colors['plane crash'] = 31;
-
-/**
- * Runway color.
- */
-
-Base.colors.runway = 90;
-
-/**
- * Initialize a new `Landing` reporter.
- *
- * @api public
- * @param {Runner} runner
- */
-function Landing(runner) {
- Base.call(this, runner);
-
- var self = this;
- var width = Base.window.width * .75 | 0;
- var total = runner.total;
- var stream = process.stdout;
- var plane = color('plane', '✈');
- var crashed = -1;
- var n = 0;
-
- function runway() {
- var buf = Array(width).join('-');
- return ' ' + color('runway', buf);
- }
-
- runner.on('start', function() {
- stream.write('\n\n\n ');
- cursor.hide();
- });
-
- runner.on('test end', function(test) {
- // check if the plane crashed
- var col = crashed === -1 ? width * ++n / total | 0 : crashed;
-
- // show the crash
- if (test.state === 'failed') {
- plane = color('plane crash', '✈');
- crashed = col;
- }
-
- // render landing strip
- stream.write('\u001b[' + (width + 1) + 'D\u001b[2A');
- stream.write(runway());
- stream.write('\n ');
- stream.write(color('runway', Array(col).join('⋅')));
- stream.write(plane);
- stream.write(color('runway', Array(width - col).join('⋅') + '\n'));
- stream.write(runway());
- stream.write('\u001b[0m');
- });
-
- runner.on('end', function() {
- cursor.show();
- console.log();
- self.epilogue();
- });
-}
-
-/**
- * Inherit from `Base.prototype`.
- */
-inherits(Landing, Base);
-
-}).call(this,require('_process'))
-},{"../utils":38,"./base":17,"_process":67}],25:[function(require,module,exports){
-(function (process){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base');
-var inherits = require('../utils').inherits;
-var color = Base.color;
-var cursor = Base.cursor;
-
-/**
- * Expose `List`.
- */
-
-exports = module.exports = List;
-
-/**
- * Initialize a new `List` test reporter.
- *
- * @api public
- * @param {Runner} runner
- */
-function List(runner) {
- Base.call(this, runner);
-
- var self = this;
- var n = 0;
-
- runner.on('start', function() {
- console.log();
- });
-
- runner.on('test', function(test) {
- process.stdout.write(color('pass', ' ' + test.fullTitle() + ': '));
- });
-
- runner.on('pending', function(test) {
- var fmt = color('checkmark', ' -')
- + color('pending', ' %s');
- console.log(fmt, test.fullTitle());
- });
-
- runner.on('pass', function(test) {
- var fmt = color('checkmark', ' ' + Base.symbols.dot)
- + color('pass', ' %s: ')
- + color(test.speed, '%dms');
- cursor.CR();
- console.log(fmt, test.fullTitle(), test.duration);
- });
-
- runner.on('fail', function(test) {
- cursor.CR();
- console.log(color('fail', ' %d) %s'), ++n, test.fullTitle());
- });
-
- runner.on('end', self.epilogue.bind(self));
-}
-
-/**
- * Inherit from `Base.prototype`.
- */
-inherits(List, Base);
-
-}).call(this,require('_process'))
-},{"../utils":38,"./base":17,"_process":67}],26:[function(require,module,exports){
-(function (process){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base');
-var utils = require('../utils');
-
-/**
- * Constants
- */
-
-var SUITE_PREFIX = '$';
-
-/**
- * Expose `Markdown`.
- */
-
-exports = module.exports = Markdown;
-
-/**
- * Initialize a new `Markdown` reporter.
- *
- * @api public
- * @param {Runner} runner
- */
-function Markdown(runner) {
- Base.call(this, runner);
-
- var level = 0;
- var buf = '';
-
- function title(str) {
- return Array(level).join('#') + ' ' + str;
- }
-
- function mapTOC(suite, obj) {
- var ret = obj;
- var key = SUITE_PREFIX + suite.title;
-
- obj = obj[key] = obj[key] || { suite: suite };
- suite.suites.forEach(function(suite) {
- mapTOC(suite, obj);
- });
-
- return ret;
- }
-
- function stringifyTOC(obj, level) {
- ++level;
- var buf = '';
- var link;
- for (var key in obj) {
- if (key === 'suite') {
- continue;
- }
- if (key !== SUITE_PREFIX) {
- link = ' - [' + key.substring(1) + ']';
- link += '(#' + utils.slug(obj[key].suite.fullTitle()) + ')\n';
- buf += Array(level).join(' ') + link;
- }
- buf += stringifyTOC(obj[key], level);
- }
- return buf;
- }
-
- function generateTOC(suite) {
- var obj = mapTOC(suite, {});
- return stringifyTOC(obj, 0);
- }
-
- generateTOC(runner.suite);
-
- runner.on('suite', function(suite) {
- ++level;
- var slug = utils.slug(suite.fullTitle());
- buf += ' ' + '\n';
- buf += title(suite.title) + '\n';
- });
-
- runner.on('suite end', function() {
- --level;
- });
-
- runner.on('pass', function(test) {
- var code = utils.clean(test.body);
- buf += test.title + '.\n';
- buf += '\n```js\n';
- buf += code + '\n';
- buf += '```\n\n';
- });
-
- runner.on('end', function() {
- process.stdout.write('# TOC\n');
- process.stdout.write(generateTOC(runner.suite));
- process.stdout.write(buf);
- });
-}
-
-}).call(this,require('_process'))
-},{"../utils":38,"./base":17,"_process":67}],27:[function(require,module,exports){
-(function (process){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base');
-var inherits = require('../utils').inherits;
-
-/**
- * Expose `Min`.
- */
-
-exports = module.exports = Min;
-
-/**
- * Initialize a new `Min` minimal test reporter (best used with --watch).
- *
- * @api public
- * @param {Runner} runner
- */
-function Min(runner) {
- Base.call(this, runner);
-
- runner.on('start', function() {
- // clear screen
- process.stdout.write('\u001b[2J');
- // set cursor position
- process.stdout.write('\u001b[1;3H');
- });
-
- runner.on('end', this.epilogue.bind(this));
-}
-
-/**
- * Inherit from `Base.prototype`.
- */
-inherits(Min, Base);
-
-}).call(this,require('_process'))
-},{"../utils":38,"./base":17,"_process":67}],28:[function(require,module,exports){
-(function (process){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base');
-var inherits = require('../utils').inherits;
-
-/**
- * Expose `Dot`.
- */
-
-exports = module.exports = NyanCat;
-
-/**
- * Initialize a new `Dot` matrix test reporter.
- *
- * @param {Runner} runner
- * @api public
- */
-
-function NyanCat(runner) {
- Base.call(this, runner);
-
- var self = this;
- var width = Base.window.width * .75 | 0;
- var nyanCatWidth = this.nyanCatWidth = 11;
-
- this.colorIndex = 0;
- this.numberOfLines = 4;
- this.rainbowColors = self.generateColors();
- this.scoreboardWidth = 5;
- this.tick = 0;
- this.trajectories = [[], [], [], []];
- this.trajectoryWidthMax = (width - nyanCatWidth);
-
- runner.on('start', function() {
- Base.cursor.hide();
- self.draw();
- });
-
- runner.on('pending', function() {
- self.draw();
- });
-
- runner.on('pass', function() {
- self.draw();
- });
-
- runner.on('fail', function() {
- self.draw();
- });
-
- runner.on('end', function() {
- Base.cursor.show();
- for (var i = 0; i < self.numberOfLines; i++) {
- write('\n');
- }
- self.epilogue();
- });
-}
-
-/**
- * Inherit from `Base.prototype`.
- */
-inherits(NyanCat, Base);
-
-/**
- * Draw the nyan cat
- *
- * @api private
- */
-
-NyanCat.prototype.draw = function() {
- this.appendRainbow();
- this.drawScoreboard();
- this.drawRainbow();
- this.drawNyanCat();
- this.tick = !this.tick;
-};
-
-/**
- * Draw the "scoreboard" showing the number
- * of passes, failures and pending tests.
- *
- * @api private
- */
-
-NyanCat.prototype.drawScoreboard = function() {
- var stats = this.stats;
-
- function draw(type, n) {
- write(' ');
- write(Base.color(type, n));
- write('\n');
- }
-
- draw('green', stats.passes);
- draw('fail', stats.failures);
- draw('pending', stats.pending);
- write('\n');
-
- this.cursorUp(this.numberOfLines);
-};
-
-/**
- * Append the rainbow.
- *
- * @api private
- */
-
-NyanCat.prototype.appendRainbow = function() {
- var segment = this.tick ? '_' : '-';
- var rainbowified = this.rainbowify(segment);
-
- for (var index = 0; index < this.numberOfLines; index++) {
- var trajectory = this.trajectories[index];
- if (trajectory.length >= this.trajectoryWidthMax) {
- trajectory.shift();
- }
- trajectory.push(rainbowified);
- }
-};
-
-/**
- * Draw the rainbow.
- *
- * @api private
- */
-
-NyanCat.prototype.drawRainbow = function() {
- var self = this;
-
- this.trajectories.forEach(function(line) {
- write('\u001b[' + self.scoreboardWidth + 'C');
- write(line.join(''));
- write('\n');
- });
-
- this.cursorUp(this.numberOfLines);
-};
-
-/**
- * Draw the nyan cat
- *
- * @api private
- */
-NyanCat.prototype.drawNyanCat = function() {
- var self = this;
- var startWidth = this.scoreboardWidth + this.trajectories[0].length;
- var dist = '\u001b[' + startWidth + 'C';
- var padding = '';
-
- write(dist);
- write('_,------,');
- write('\n');
-
- write(dist);
- padding = self.tick ? ' ' : ' ';
- write('_|' + padding + '/\\_/\\ ');
- write('\n');
-
- write(dist);
- padding = self.tick ? '_' : '__';
- var tail = self.tick ? '~' : '^';
- write(tail + '|' + padding + this.face() + ' ');
- write('\n');
-
- write(dist);
- padding = self.tick ? ' ' : ' ';
- write(padding + '"" "" ');
- write('\n');
-
- this.cursorUp(this.numberOfLines);
-};
-
-/**
- * Draw nyan cat face.
- *
- * @api private
- * @return {string}
- */
-
-NyanCat.prototype.face = function() {
- var stats = this.stats;
- if (stats.failures) {
- return '( x .x)';
- } else if (stats.pending) {
- return '( o .o)';
- } else if (stats.passes) {
- return '( ^ .^)';
- }
- return '( - .-)';
-};
-
-/**
- * Move cursor up `n`.
- *
- * @api private
- * @param {number} n
- */
-
-NyanCat.prototype.cursorUp = function(n) {
- write('\u001b[' + n + 'A');
-};
-
-/**
- * Move cursor down `n`.
- *
- * @api private
- * @param {number} n
- */
-
-NyanCat.prototype.cursorDown = function(n) {
- write('\u001b[' + n + 'B');
-};
-
-/**
- * Generate rainbow colors.
- *
- * @api private
- * @return {Array}
- */
-NyanCat.prototype.generateColors = function() {
- var colors = [];
-
- for (var i = 0; i < (6 * 7); i++) {
- var pi3 = Math.floor(Math.PI / 3);
- var n = (i * (1.0 / 6));
- var r = Math.floor(3 * Math.sin(n) + 3);
- var g = Math.floor(3 * Math.sin(n + 2 * pi3) + 3);
- var b = Math.floor(3 * Math.sin(n + 4 * pi3) + 3);
- colors.push(36 * r + 6 * g + b + 16);
- }
-
- return colors;
-};
-
-/**
- * Apply rainbow to the given `str`.
- *
- * @api private
- * @param {string} str
- * @return {string}
- */
-NyanCat.prototype.rainbowify = function(str) {
- if (!Base.useColors) {
- return str;
- }
- var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length];
- this.colorIndex += 1;
- return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m';
-};
-
-/**
- * Stdout helper.
- *
- * @param {string} string A message to write to stdout.
- */
-function write(string) {
- process.stdout.write(string);
-}
-
-}).call(this,require('_process'))
-},{"../utils":38,"./base":17,"_process":67}],29:[function(require,module,exports){
-(function (process){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base');
-var inherits = require('../utils').inherits;
-var color = Base.color;
-var cursor = Base.cursor;
-
-/**
- * Expose `Progress`.
- */
-
-exports = module.exports = Progress;
-
-/**
- * General progress bar color.
- */
-
-Base.colors.progress = 90;
-
-/**
- * Initialize a new `Progress` bar test reporter.
- *
- * @api public
- * @param {Runner} runner
- * @param {Object} options
- */
-function Progress(runner, options) {
- Base.call(this, runner);
-
- var self = this;
- var width = Base.window.width * .50 | 0;
- var total = runner.total;
- var complete = 0;
- var lastN = -1;
-
- // default chars
- options = options || {};
- options.open = options.open || '[';
- options.complete = options.complete || '▬';
- options.incomplete = options.incomplete || Base.symbols.dot;
- options.close = options.close || ']';
- options.verbose = false;
-
- // tests started
- runner.on('start', function() {
- console.log();
- cursor.hide();
- });
-
- // tests complete
- runner.on('test end', function() {
- complete++;
-
- var percent = complete / total;
- var n = width * percent | 0;
- var i = width - n;
-
- if (n === lastN && !options.verbose) {
- // Don't re-render the line if it hasn't changed
- return;
- }
- lastN = n;
-
- cursor.CR();
- process.stdout.write('\u001b[J');
- process.stdout.write(color('progress', ' ' + options.open));
- process.stdout.write(Array(n).join(options.complete));
- process.stdout.write(Array(i).join(options.incomplete));
- process.stdout.write(color('progress', options.close));
- if (options.verbose) {
- process.stdout.write(color('progress', ' ' + complete + ' of ' + total));
- }
- });
-
- // tests are complete, output some stats
- // and the failures if any
- runner.on('end', function() {
- cursor.show();
- console.log();
- self.epilogue();
- });
-}
-
-/**
- * Inherit from `Base.prototype`.
- */
-inherits(Progress, Base);
-
-}).call(this,require('_process'))
-},{"../utils":38,"./base":17,"_process":67}],30:[function(require,module,exports){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base');
-var inherits = require('../utils').inherits;
-var color = Base.color;
-
-/**
- * Expose `Spec`.
- */
-
-exports = module.exports = Spec;
-
-/**
- * Initialize a new `Spec` test reporter.
- *
- * @api public
- * @param {Runner} runner
- */
-function Spec(runner) {
- Base.call(this, runner);
-
- var self = this;
- var indents = 0;
- var n = 0;
-
- function indent() {
- return Array(indents).join(' ');
- }
-
- runner.on('start', function() {
- console.log();
- });
-
- runner.on('suite', function(suite) {
- ++indents;
- console.log(color('suite', '%s%s'), indent(), suite.title);
- });
-
- runner.on('suite end', function() {
- --indents;
- if (indents === 1) {
- console.log();
- }
- });
-
- runner.on('pending', function(test) {
- var fmt = indent() + color('pending', ' - %s');
- console.log(fmt, test.title);
- });
-
- runner.on('pass', function(test) {
- var fmt;
- if (test.speed === 'fast') {
- fmt = indent()
- + color('checkmark', ' ' + Base.symbols.ok)
- + color('pass', ' %s');
- console.log(fmt, test.title);
- } else {
- fmt = indent()
- + color('checkmark', ' ' + Base.symbols.ok)
- + color('pass', ' %s')
- + color(test.speed, ' (%dms)');
- console.log(fmt, test.title, test.duration);
- }
- });
-
- runner.on('fail', function(test) {
- console.log(indent() + color('fail', ' %d) %s'), ++n, test.title);
- });
-
- runner.on('end', self.epilogue.bind(self));
-}
-
-/**
- * Inherit from `Base.prototype`.
- */
-inherits(Spec, Base);
-
-},{"../utils":38,"./base":17}],31:[function(require,module,exports){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base');
-
-/**
- * Expose `TAP`.
- */
-
-exports = module.exports = TAP;
-
-/**
- * Initialize a new `TAP` reporter.
- *
- * @api public
- * @param {Runner} runner
- */
-function TAP(runner) {
- Base.call(this, runner);
-
- var n = 1;
- var passes = 0;
- var failures = 0;
-
- runner.on('start', function() {
- var total = runner.grepTotal(runner.suite);
- console.log('%d..%d', 1, total);
- });
-
- runner.on('test end', function() {
- ++n;
- });
-
- runner.on('pending', function(test) {
- console.log('ok %d %s # SKIP -', n, title(test));
- });
-
- runner.on('pass', function(test) {
- passes++;
- console.log('ok %d %s', n, title(test));
- });
-
- runner.on('fail', function(test, err) {
- failures++;
- console.log('not ok %d %s', n, title(test));
- if (err.stack) {
- console.log(err.stack.replace(/^/gm, ' '));
- }
- });
-
- runner.on('end', function() {
- console.log('# tests ' + (passes + failures));
- console.log('# pass ' + passes);
- console.log('# fail ' + failures);
- });
-}
-
-/**
- * Return a TAP-safe title of `test`
- *
- * @api private
- * @param {Object} test
- * @return {String}
- */
-function title(test) {
- return test.fullTitle().replace(/#/g, '');
-}
-
-},{"./base":17}],32:[function(require,module,exports){
-(function (process,global){
-/**
- * Module dependencies.
- */
-
-var Base = require('./base');
-var utils = require('../utils');
-var inherits = utils.inherits;
-var fs = require('fs');
-var escape = utils.escape;
-var mkdirp = require('mkdirp');
-var path = require('path');
-
-/**
- * Save timer references to avoid Sinon interfering (see GH-237).
- */
-
-/* eslint-disable no-unused-vars, no-native-reassign */
-var Date = global.Date;
-var setTimeout = global.setTimeout;
-var setInterval = global.setInterval;
-var clearTimeout = global.clearTimeout;
-var clearInterval = global.clearInterval;
-/* eslint-enable no-unused-vars, no-native-reassign */
-
-/**
- * Expose `XUnit`.
- */
-
-exports = module.exports = XUnit;
-
-/**
- * Initialize a new `XUnit` reporter.
- *
- * @api public
- * @param {Runner} runner
- */
-function XUnit(runner, options) {
- Base.call(this, runner);
-
- var stats = this.stats;
- var tests = [];
- var self = this;
-
- if (options.reporterOptions && options.reporterOptions.output) {
- if (!fs.createWriteStream) {
- throw new Error('file output not supported in browser');
- }
- mkdirp.sync(path.dirname(options.reporterOptions.output));
- self.fileStream = fs.createWriteStream(options.reporterOptions.output);
- }
-
- runner.on('pending', function(test) {
- tests.push(test);
- });
-
- runner.on('pass', function(test) {
- tests.push(test);
- });
-
- runner.on('fail', function(test) {
- tests.push(test);
- });
-
- runner.on('end', function() {
- self.write(tag('testsuite', {
- name: 'Mocha Tests',
- tests: stats.tests,
- failures: stats.failures,
- errors: stats.failures,
- skipped: stats.tests - stats.failures - stats.passes,
- timestamp: (new Date()).toUTCString(),
- time: (stats.duration / 1000) || 0
- }, false));
-
- tests.forEach(function(t) {
- self.test(t);
- });
-
- self.write('');
- });
-}
-
-/**
- * Inherit from `Base.prototype`.
- */
-inherits(XUnit, Base);
-
-/**
- * Override done to close the stream (if it's a file).
- *
- * @param failures
- * @param {Function} fn
- */
-XUnit.prototype.done = function(failures, fn) {
- if (this.fileStream) {
- this.fileStream.end(function() {
- fn(failures);
- });
- } else {
- fn(failures);
- }
-};
-
-/**
- * Write out the given line.
- *
- * @param {string} line
- */
-XUnit.prototype.write = function(line) {
- if (this.fileStream) {
- this.fileStream.write(line + '\n');
- } else if (typeof process === 'object' && process.stdout) {
- process.stdout.write(line + '\n');
- } else {
- console.log(line);
- }
-};
-
-/**
- * Output tag for the given `test.`
- *
- * @param {Test} test
- */
-XUnit.prototype.test = function(test) {
- var attrs = {
- classname: test.parent.fullTitle(),
- name: test.title,
- time: (test.duration / 1000) || 0
- };
-
- if (test.state === 'failed') {
- var err = test.err;
- this.write(tag('testcase', attrs, false, tag('failure', {}, false, escape(err.message) + '\n' + escape(err.stack))));
- } else if (test.isPending()) {
- this.write(tag('testcase', attrs, false, tag('skipped', {}, true)));
- } else {
- this.write(tag('testcase', attrs, true));
- }
-};
-
-/**
- * HTML tag helper.
- *
- * @param name
- * @param attrs
- * @param close
- * @param content
- * @return {string}
- */
-function tag(name, attrs, close, content) {
- var end = close ? '/>' : '>';
- var pairs = [];
- var tag;
-
- for (var key in attrs) {
- if (Object.prototype.hasOwnProperty.call(attrs, key)) {
- pairs.push(key + '="' + escape(attrs[key]) + '"');
- }
- }
-
- tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end;
- if (content) {
- tag += content + '' + name + end;
- }
- return tag;
-}
-
-}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"../utils":38,"./base":17,"_process":67,"fs":42,"mkdirp":64,"path":42}],33:[function(require,module,exports){
-(function (global){
-/**
- * Module dependencies.
- */
-
-var EventEmitter = require('events').EventEmitter;
-var JSON = require('json3');
-var Pending = require('./pending');
-var debug = require('debug')('mocha:runnable');
-var milliseconds = require('./ms');
-var utils = require('./utils');
-var create = require('lodash.create');
-
-/**
- * Save timer references to avoid Sinon interfering (see GH-237).
- */
-
-/* eslint-disable no-unused-vars, no-native-reassign */
-var Date = global.Date;
-var setTimeout = global.setTimeout;
-var setInterval = global.setInterval;
-var clearTimeout = global.clearTimeout;
-var clearInterval = global.clearInterval;
-/* eslint-enable no-unused-vars, no-native-reassign */
-
-/**
- * Object#toString().
- */
-
-var toString = Object.prototype.toString;
-
-/**
- * Expose `Runnable`.
- */
-
-module.exports = Runnable;
-
-/**
- * Initialize a new `Runnable` with the given `title` and callback `fn`.
- *
- * @param {String} title
- * @param {Function} fn
- * @api private
- * @param {string} title
- * @param {Function} fn
- */
-function Runnable(title, fn) {
- this.title = title;
- this.fn = fn;
- this.body = (fn || '').toString();
- this.async = fn && fn.length;
- this.sync = !this.async;
- this._timeout = 2000;
- this._slow = 75;
- this._enableTimeouts = true;
- this.timedOut = false;
- this._trace = new Error('done() called multiple times');
- this._retries = -1;
- this._currentRetry = 0;
- this.pending = false;
-}
-
-/**
- * Inherit from `EventEmitter.prototype`.
- */
-Runnable.prototype = create(EventEmitter.prototype, {
- constructor: Runnable
-});
-
-/**
- * Set & get timeout `ms`.
- *
- * @api private
- * @param {number|string} ms
- * @return {Runnable|number} ms or Runnable instance.
- */
-Runnable.prototype.timeout = function(ms) {
- if (!arguments.length) {
- return this._timeout;
- }
- // see #1652 for reasoning
- if (ms === 0 || ms > Math.pow(2, 31)) {
- this._enableTimeouts = false;
- }
- if (typeof ms === 'string') {
- ms = milliseconds(ms);
- }
- debug('timeout %d', ms);
- this._timeout = ms;
- if (this.timer) {
- this.resetTimeout();
- }
- return this;
-};
-
-/**
- * Set & get slow `ms`.
- *
- * @api private
- * @param {number|string} ms
- * @return {Runnable|number} ms or Runnable instance.
- */
-Runnable.prototype.slow = function(ms) {
- if (typeof ms === 'undefined') {
- return this._slow;
- }
- if (typeof ms === 'string') {
- ms = milliseconds(ms);
- }
- debug('timeout %d', ms);
- this._slow = ms;
- return this;
-};
-
-/**
- * Set and get whether timeout is `enabled`.
- *
- * @api private
- * @param {boolean} enabled
- * @return {Runnable|boolean} enabled or Runnable instance.
- */
-Runnable.prototype.enableTimeouts = function(enabled) {
- if (!arguments.length) {
- return this._enableTimeouts;
- }
- debug('enableTimeouts %s', enabled);
- this._enableTimeouts = enabled;
- return this;
-};
-
-/**
- * Halt and mark as pending.
- *
- * @api public
- */
-Runnable.prototype.skip = function() {
- throw new Pending('sync skip');
-};
-
-/**
- * Check if this runnable or its parent suite is marked as pending.
- *
- * @api private
- */
-Runnable.prototype.isPending = function() {
- return this.pending || (this.parent && this.parent.isPending());
-};
-
-/**
- * Set number of retries.
- *
- * @api private
- */
-Runnable.prototype.retries = function(n) {
- if (!arguments.length) {
- return this._retries;
- }
- this._retries = n;
-};
-
-/**
- * Get current retry
- *
- * @api private
- */
-Runnable.prototype.currentRetry = function(n) {
- if (!arguments.length) {
- return this._currentRetry;
- }
- this._currentRetry = n;
-};
-
-/**
- * Return the full title generated by recursively concatenating the parent's
- * full title.
- *
- * @api public
- * @return {string}
- */
-Runnable.prototype.fullTitle = function() {
- return this.parent.fullTitle() + ' ' + this.title;
-};
-
-/**
- * Clear the timeout.
- *
- * @api private
- */
-Runnable.prototype.clearTimeout = function() {
- clearTimeout(this.timer);
-};
-
-/**
- * Inspect the runnable void of private properties.
- *
- * @api private
- * @return {string}
- */
-Runnable.prototype.inspect = function() {
- return JSON.stringify(this, function(key, val) {
- if (key[0] === '_') {
- return;
- }
- if (key === 'parent') {
- return '#';
- }
- if (key === 'ctx') {
- return '#';
- }
- return val;
- }, 2);
-};
-
-/**
- * Reset the timeout.
- *
- * @api private
- */
-Runnable.prototype.resetTimeout = function() {
- var self = this;
- var ms = this.timeout() || 1e9;
-
- if (!this._enableTimeouts) {
- return;
- }
- this.clearTimeout();
- this.timer = setTimeout(function() {
- if (!self._enableTimeouts) {
- return;
- }
- self.callback(new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.'));
- self.timedOut = true;
- }, ms);
-};
-
-/**
- * Whitelist a list of globals for this test run.
- *
- * @api private
- * @param {string[]} globals
- */
-Runnable.prototype.globals = function(globals) {
- if (!arguments.length) {
- return this._allowedGlobals;
- }
- this._allowedGlobals = globals;
-};
-
-/**
- * Run the test and invoke `fn(err)`.
- *
- * @param {Function} fn
- * @api private
- */
-Runnable.prototype.run = function(fn) {
- var self = this;
- var start = new Date();
- var ctx = this.ctx;
- var finished;
- var emitted;
-
- // Sometimes the ctx exists, but it is not runnable
- if (ctx && ctx.runnable) {
- ctx.runnable(this);
- }
-
- // called multiple times
- function multiple(err) {
- if (emitted) {
- return;
- }
- emitted = true;
- self.emit('error', err || new Error('done() called multiple times; stacktrace may be inaccurate'));
- }
-
- // finished
- function done(err) {
- var ms = self.timeout();
- if (self.timedOut) {
- return;
- }
- if (finished) {
- return multiple(err || self._trace);
- }
-
- self.clearTimeout();
- self.duration = new Date() - start;
- finished = true;
- if (!err && self.duration > ms && self._enableTimeouts) {
- err = new Error('timeout of ' + ms + 'ms exceeded. Ensure the done() callback is being called in this test.');
- }
- fn(err);
- }
-
- // for .resetTimeout()
- this.callback = done;
-
- // explicit async with `done` argument
- if (this.async) {
- this.resetTimeout();
-
- // allows skip() to be used in an explicit async context
- this.skip = function asyncSkip() {
- done(new Pending('async skip call'));
- // halt execution. the Runnable will be marked pending
- // by the previous call, and the uncaught handler will ignore
- // the failure.
- throw new Pending('async skip; aborting execution');
- };
-
- if (this.allowUncaught) {
- return callFnAsync(this.fn);
- }
- try {
- callFnAsync(this.fn);
- } catch (err) {
- done(utils.getError(err));
- }
- return;
- }
-
- if (this.allowUncaught) {
- callFn(this.fn);
- done();
- return;
- }
-
- // sync or promise-returning
- try {
- if (this.isPending()) {
- done();
- } else {
- callFn(this.fn);
- }
- } catch (err) {
- done(utils.getError(err));
- }
-
- function callFn(fn) {
- var result = fn.call(ctx);
- if (result && typeof result.then === 'function') {
- self.resetTimeout();
- result
- .then(function() {
- done();
- // Return null so libraries like bluebird do not warn about
- // subsequently constructed Promises.
- return null;
- },
- function(reason) {
- done(reason || new Error('Promise rejected with no or falsy reason'));
- });
- } else {
- if (self.asyncOnly) {
- return done(new Error('--async-only option in use without declaring `done()` or returning a promise'));
- }
-
- done();
- }
- }
-
- function callFnAsync(fn) {
- var result = fn.call(ctx, function(err) {
- if (err instanceof Error || toString.call(err) === '[object Error]') {
- return done(err);
- }
- if (err) {
- if (Object.prototype.toString.call(err) === '[object Object]') {
- return done(new Error('done() invoked with non-Error: '
- + JSON.stringify(err)));
- }
- return done(new Error('done() invoked with non-Error: ' + err));
- }
- if (result && utils.isPromise(result)) {
- return done(new Error('Resolution method is overspecified. Specify a callback *or* return a Promise; not both.'));
- }
-
- done();
- });
- }
-};
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"./ms":15,"./pending":16,"./utils":38,"debug":2,"events":3,"json3":54,"lodash.create":60}],34:[function(require,module,exports){
-(function (process,global){
-/**
- * Module dependencies.
- */
-
-var EventEmitter = require('events').EventEmitter;
-var Pending = require('./pending');
-var utils = require('./utils');
-var inherits = utils.inherits;
-var debug = require('debug')('mocha:runner');
-var Runnable = require('./runnable');
-var filter = utils.filter;
-var indexOf = utils.indexOf;
-var some = utils.some;
-var keys = utils.keys;
-var stackFilter = utils.stackTraceFilter();
-var stringify = utils.stringify;
-var type = utils.type;
-var undefinedError = utils.undefinedError;
-var isArray = utils.isArray;
-
-/**
- * Non-enumerable globals.
- */
-
-var globals = [
- 'setTimeout',
- 'clearTimeout',
- 'setInterval',
- 'clearInterval',
- 'XMLHttpRequest',
- 'Date',
- 'setImmediate',
- 'clearImmediate'
-];
-
-/**
- * Expose `Runner`.
- */
-
-module.exports = Runner;
-
-/**
- * Initialize a `Runner` for the given `suite`.
- *
- * Events:
- *
- * - `start` execution started
- * - `end` execution complete
- * - `suite` (suite) test suite execution started
- * - `suite end` (suite) all tests (and sub-suites) have finished
- * - `test` (test) test execution started
- * - `test end` (test) test completed
- * - `hook` (hook) hook execution started
- * - `hook end` (hook) hook complete
- * - `pass` (test) test passed
- * - `fail` (test, err) test failed
- * - `pending` (test) test pending
- *
- * @api public
- * @param {Suite} suite Root suite
- * @param {boolean} [delay] Whether or not to delay execution of root suite
- * until ready.
- */
-function Runner(suite, delay) {
- var self = this;
- this._globals = [];
- this._abort = false;
- this._delay = delay;
- this.suite = suite;
- this.started = false;
- this.total = suite.total();
- this.failures = 0;
- this.on('test end', function(test) {
- self.checkGlobals(test);
- });
- this.on('hook end', function(hook) {
- self.checkGlobals(hook);
- });
- this._defaultGrep = /.*/;
- this.grep(this._defaultGrep);
- this.globals(this.globalProps().concat(extraGlobals()));
-}
-
-/**
- * Wrapper for setImmediate, process.nextTick, or browser polyfill.
- *
- * @param {Function} fn
- * @api private
- */
-Runner.immediately = global.setImmediate || process.nextTick;
-
-/**
- * Inherit from `EventEmitter.prototype`.
- */
-inherits(Runner, EventEmitter);
-
-/**
- * Run tests with full titles matching `re`. Updates runner.total
- * with number of tests matched.
- *
- * @param {RegExp} re
- * @param {Boolean} invert
- * @return {Runner} for chaining
- * @api public
- * @param {RegExp} re
- * @param {boolean} invert
- * @return {Runner} Runner instance.
- */
-Runner.prototype.grep = function(re, invert) {
- debug('grep %s', re);
- this._grep = re;
- this._invert = invert;
- this.total = this.grepTotal(this.suite);
- return this;
-};
-
-/**
- * Returns the number of tests matching the grep search for the
- * given suite.
- *
- * @param {Suite} suite
- * @return {Number}
- * @api public
- * @param {Suite} suite
- * @return {number}
- */
-Runner.prototype.grepTotal = function(suite) {
- var self = this;
- var total = 0;
-
- suite.eachTest(function(test) {
- var match = self._grep.test(test.fullTitle());
- if (self._invert) {
- match = !match;
- }
- if (match) {
- total++;
- }
- });
-
- return total;
-};
-
-/**
- * Return a list of global properties.
- *
- * @return {Array}
- * @api private
- */
-Runner.prototype.globalProps = function() {
- var props = keys(global);
-
- // non-enumerables
- for (var i = 0; i < globals.length; ++i) {
- if (~indexOf(props, globals[i])) {
- continue;
- }
- props.push(globals[i]);
- }
-
- return props;
-};
-
-/**
- * Allow the given `arr` of globals.
- *
- * @param {Array} arr
- * @return {Runner} for chaining
- * @api public
- * @param {Array} arr
- * @return {Runner} Runner instance.
- */
-Runner.prototype.globals = function(arr) {
- if (!arguments.length) {
- return this._globals;
- }
- debug('globals %j', arr);
- this._globals = this._globals.concat(arr);
- return this;
-};
-
-/**
- * Check for global variable leaks.
- *
- * @api private
- */
-Runner.prototype.checkGlobals = function(test) {
- if (this.ignoreLeaks) {
- return;
- }
- var ok = this._globals;
-
- var globals = this.globalProps();
- var leaks;
-
- if (test) {
- ok = ok.concat(test._allowedGlobals || []);
- }
-
- if (this.prevGlobalsLength === globals.length) {
- return;
- }
- this.prevGlobalsLength = globals.length;
-
- leaks = filterLeaks(ok, globals);
- this._globals = this._globals.concat(leaks);
-
- if (leaks.length > 1) {
- this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + ''));
- } else if (leaks.length) {
- this.fail(test, new Error('global leak detected: ' + leaks[0]));
- }
-};
-
-/**
- * Fail the given `test`.
- *
- * @api private
- * @param {Test} test
- * @param {Error} err
- */
-Runner.prototype.fail = function(test, err) {
- if (test.isPending()) {
- return;
- }
-
- ++this.failures;
- test.state = 'failed';
-
- if (!(err instanceof Error || err && typeof err.message === 'string')) {
- err = new Error('the ' + type(err) + ' ' + stringify(err) + ' was thrown, throw an Error :)');
- }
-
- err.stack = (this.fullStackTrace || !err.stack)
- ? err.stack
- : stackFilter(err.stack);
-
- this.emit('fail', test, err);
-};
-
-/**
- * Fail the given `hook` with `err`.
- *
- * Hook failures work in the following pattern:
- * - If bail, then exit
- * - Failed `before` hook skips all tests in a suite and subsuites,
- * but jumps to corresponding `after` hook
- * - Failed `before each` hook skips remaining tests in a
- * suite and jumps to corresponding `after each` hook,
- * which is run only once
- * - Failed `after` hook does not alter
- * execution order
- * - Failed `after each` hook skips remaining tests in a
- * suite and subsuites, but executes other `after each`
- * hooks
- *
- * @api private
- * @param {Hook} hook
- * @param {Error} err
- */
-Runner.prototype.failHook = function(hook, err) {
- if (hook.ctx && hook.ctx.currentTest) {
- hook.originalTitle = hook.originalTitle || hook.title;
- hook.title = hook.originalTitle + ' for "' + hook.ctx.currentTest.title + '"';
- }
-
- this.fail(hook, err);
- if (this.suite.bail()) {
- this.emit('end');
- }
-};
-
-/**
- * Run hook `name` callbacks and then invoke `fn()`.
- *
- * @api private
- * @param {string} name
- * @param {Function} fn
- */
-
-Runner.prototype.hook = function(name, fn) {
- var suite = this.suite;
- var hooks = suite['_' + name];
- var self = this;
-
- function next(i) {
- var hook = hooks[i];
- if (!hook) {
- return fn();
- }
- self.currentRunnable = hook;
-
- hook.ctx.currentTest = self.test;
-
- self.emit('hook', hook);
-
- if (!hook.listeners('error').length) {
- hook.on('error', function(err) {
- self.failHook(hook, err);
- });
- }
-
- hook.run(function(err) {
- var testError = hook.error();
- if (testError) {
- self.fail(self.test, testError);
- }
- if (err) {
- if (err instanceof Pending) {
- if (name === 'beforeEach' || name === 'afterEach') {
- self.test.pending = true;
- } else {
- utils.forEach(suite.tests, function(test) {
- test.pending = true;
- });
- // a pending hook won't be executed twice.
- hook.pending = true;
- }
- } else {
- self.failHook(hook, err);
-
- // stop executing hooks, notify callee of hook err
- return fn(err);
- }
- }
- self.emit('hook end', hook);
- delete hook.ctx.currentTest;
- next(++i);
- });
- }
-
- Runner.immediately(function() {
- next(0);
- });
-};
-
-/**
- * Run hook `name` for the given array of `suites`
- * in order, and callback `fn(err, errSuite)`.
- *
- * @api private
- * @param {string} name
- * @param {Array} suites
- * @param {Function} fn
- */
-Runner.prototype.hooks = function(name, suites, fn) {
- var self = this;
- var orig = this.suite;
-
- function next(suite) {
- self.suite = suite;
-
- if (!suite) {
- self.suite = orig;
- return fn();
- }
-
- self.hook(name, function(err) {
- if (err) {
- var errSuite = self.suite;
- self.suite = orig;
- return fn(err, errSuite);
- }
-
- next(suites.pop());
- });
- }
-
- next(suites.pop());
-};
-
-/**
- * Run hooks from the top level down.
- *
- * @param {String} name
- * @param {Function} fn
- * @api private
- */
-Runner.prototype.hookUp = function(name, fn) {
- var suites = [this.suite].concat(this.parents()).reverse();
- this.hooks(name, suites, fn);
-};
-
-/**
- * Run hooks from the bottom up.
- *
- * @param {String} name
- * @param {Function} fn
- * @api private
- */
-Runner.prototype.hookDown = function(name, fn) {
- var suites = [this.suite].concat(this.parents());
- this.hooks(name, suites, fn);
-};
-
-/**
- * Return an array of parent Suites from
- * closest to furthest.
- *
- * @return {Array}
- * @api private
- */
-Runner.prototype.parents = function() {
- var suite = this.suite;
- var suites = [];
- while (suite.parent) {
- suite = suite.parent;
- suites.push(suite);
- }
- return suites;
-};
-
-/**
- * Run the current test and callback `fn(err)`.
- *
- * @param {Function} fn
- * @api private
- */
-Runner.prototype.runTest = function(fn) {
- var self = this;
- var test = this.test;
-
- if (!test) {
- return;
- }
- if (this.asyncOnly) {
- test.asyncOnly = true;
- }
-
- if (this.allowUncaught) {
- test.allowUncaught = true;
- return test.run(fn);
- }
- try {
- test.on('error', function(err) {
- self.fail(test, err);
- });
- test.run(fn);
- } catch (err) {
- fn(err);
- }
-};
-
-/**
- * Run tests in the given `suite` and invoke the callback `fn()` when complete.
- *
- * @api private
- * @param {Suite} suite
- * @param {Function} fn
- */
-Runner.prototype.runTests = function(suite, fn) {
- var self = this;
- var tests = suite.tests.slice();
- var test;
-
- function hookErr(_, errSuite, after) {
- // before/after Each hook for errSuite failed:
- var orig = self.suite;
-
- // for failed 'after each' hook start from errSuite parent,
- // otherwise start from errSuite itself
- self.suite = after ? errSuite.parent : errSuite;
-
- if (self.suite) {
- // call hookUp afterEach
- self.hookUp('afterEach', function(err2, errSuite2) {
- self.suite = orig;
- // some hooks may fail even now
- if (err2) {
- return hookErr(err2, errSuite2, true);
- }
- // report error suite
- fn(errSuite);
- });
- } else {
- // there is no need calling other 'after each' hooks
- self.suite = orig;
- fn(errSuite);
- }
- }
-
- function next(err, errSuite) {
- // if we bail after first err
- if (self.failures && suite._bail) {
- return fn();
- }
-
- if (self._abort) {
- return fn();
- }
-
- if (err) {
- return hookErr(err, errSuite, true);
- }
-
- // next test
- test = tests.shift();
-
- // all done
- if (!test) {
- return fn();
- }
-
- // grep
- var match = self._grep.test(test.fullTitle());
- if (self._invert) {
- match = !match;
- }
- if (!match) {
- // Run immediately only if we have defined a grep. When we
- // define a grep — It can cause maximum callstack error if
- // the grep is doing a large recursive loop by neglecting
- // all tests. The run immediately function also comes with
- // a performance cost. So we don't want to run immediately
- // if we run the whole test suite, because running the whole
- // test suite don't do any immediate recursive loops. Thus,
- // allowing a JS runtime to breathe.
- if (self._grep !== self._defaultGrep) {
- Runner.immediately(next);
- } else {
- next();
- }
- return;
- }
-
- if (test.isPending()) {
- self.emit('pending', test);
- self.emit('test end', test);
- return next();
- }
-
- // execute test and hook(s)
- self.emit('test', self.test = test);
- self.hookDown('beforeEach', function(err, errSuite) {
- if (test.isPending()) {
- self.emit('pending', test);
- self.emit('test end', test);
- return next();
- }
- if (err) {
- return hookErr(err, errSuite, false);
- }
- self.currentRunnable = self.test;
- self.runTest(function(err) {
- test = self.test;
- if (err) {
- var retry = test.currentRetry();
- if (err instanceof Pending) {
- test.pending = true;
- self.emit('pending', test);
- } else if (retry < test.retries()) {
- var clonedTest = test.clone();
- clonedTest.currentRetry(retry + 1);
- tests.unshift(clonedTest);
-
- // Early return + hook trigger so that it doesn't
- // increment the count wrong
- return self.hookUp('afterEach', next);
- } else {
- self.fail(test, err);
- }
- self.emit('test end', test);
-
- if (err instanceof Pending) {
- return next();
- }
-
- return self.hookUp('afterEach', next);
- }
-
- test.state = 'passed';
- self.emit('pass', test);
- self.emit('test end', test);
- self.hookUp('afterEach', next);
- });
- });
- }
-
- this.next = next;
- this.hookErr = hookErr;
- next();
-};
-
-/**
- * Run the given `suite` and invoke the callback `fn()` when complete.
- *
- * @api private
- * @param {Suite} suite
- * @param {Function} fn
- */
-Runner.prototype.runSuite = function(suite, fn) {
- var i = 0;
- var self = this;
- var total = this.grepTotal(suite);
- var afterAllHookCalled = false;
-
- debug('run suite %s', suite.fullTitle());
-
- if (!total || (self.failures && suite._bail)) {
- return fn();
- }
-
- this.emit('suite', this.suite = suite);
-
- function next(errSuite) {
- if (errSuite) {
- // current suite failed on a hook from errSuite
- if (errSuite === suite) {
- // if errSuite is current suite
- // continue to the next sibling suite
- return done();
- }
- // errSuite is among the parents of current suite
- // stop execution of errSuite and all sub-suites
- return done(errSuite);
- }
-
- if (self._abort) {
- return done();
- }
-
- var curr = suite.suites[i++];
- if (!curr) {
- return done();
- }
-
- // Avoid grep neglecting large number of tests causing a
- // huge recursive loop and thus a maximum call stack error.
- // See comment in `this.runTests()` for more information.
- if (self._grep !== self._defaultGrep) {
- Runner.immediately(function() {
- self.runSuite(curr, next);
- });
- } else {
- self.runSuite(curr, next);
- }
- }
-
- function done(errSuite) {
- self.suite = suite;
- self.nextSuite = next;
-
- if (afterAllHookCalled) {
- fn(errSuite);
- } else {
- // mark that the afterAll block has been called once
- // and so can be skipped if there is an error in it.
- afterAllHookCalled = true;
-
- // remove reference to test
- delete self.test;
-
- self.hook('afterAll', function() {
- self.emit('suite end', suite);
- fn(errSuite);
- });
- }
- }
-
- this.nextSuite = next;
-
- this.hook('beforeAll', function(err) {
- if (err) {
- return done();
- }
- self.runTests(suite, next);
- });
-};
-
-/**
- * Handle uncaught exceptions.
- *
- * @param {Error} err
- * @api private
- */
-Runner.prototype.uncaught = function(err) {
- if (err) {
- debug('uncaught exception %s', err !== function() {
- return this;
- }.call(err) ? err : (err.message || err));
- } else {
- debug('uncaught undefined exception');
- err = undefinedError();
- }
- err.uncaught = true;
-
- var runnable = this.currentRunnable;
-
- if (!runnable) {
- runnable = new Runnable('Uncaught error outside test suite');
- runnable.parent = this.suite;
-
- if (this.started) {
- this.fail(runnable, err);
- } else {
- // Can't recover from this failure
- this.emit('start');
- this.fail(runnable, err);
- this.emit('end');
- }
-
- return;
- }
-
- runnable.clearTimeout();
-
- // Ignore errors if complete or pending
- if (runnable.state || runnable.isPending()) {
- return;
- }
- this.fail(runnable, err);
-
- // recover from test
- if (runnable.type === 'test') {
- this.emit('test end', runnable);
- this.hookUp('afterEach', this.next);
- return;
- }
-
- // recover from hooks
- if (runnable.type === 'hook') {
- var errSuite = this.suite;
- // if hook failure is in afterEach block
- if (runnable.fullTitle().indexOf('after each') > -1) {
- return this.hookErr(err, errSuite, true);
- }
- // if hook failure is in beforeEach block
- if (runnable.fullTitle().indexOf('before each') > -1) {
- return this.hookErr(err, errSuite, false);
- }
- // if hook failure is in after or before blocks
- return this.nextSuite(errSuite);
- }
-
- // bail
- this.emit('end');
-};
-
-/**
- * Cleans up the references to all the deferred functions
- * (before/after/beforeEach/afterEach) and tests of a Suite.
- * These must be deleted otherwise a memory leak can happen,
- * as those functions may reference variables from closures,
- * thus those variables can never be garbage collected as long
- * as the deferred functions exist.
- *
- * @param {Suite} suite
- */
-function cleanSuiteReferences(suite) {
- function cleanArrReferences(arr) {
- for (var i = 0; i < arr.length; i++) {
- delete arr[i].fn;
- }
- }
-
- if (isArray(suite._beforeAll)) {
- cleanArrReferences(suite._beforeAll);
- }
-
- if (isArray(suite._beforeEach)) {
- cleanArrReferences(suite._beforeEach);
- }
-
- if (isArray(suite._afterAll)) {
- cleanArrReferences(suite._afterAll);
- }
-
- if (isArray(suite._afterEach)) {
- cleanArrReferences(suite._afterEach);
- }
-
- for (var i = 0; i < suite.tests.length; i++) {
- delete suite.tests[i].fn;
- }
-}
-
-/**
- * Run the root suite and invoke `fn(failures)`
- * on completion.
- *
- * @param {Function} fn
- * @return {Runner} for chaining
- * @api public
- * @param {Function} fn
- * @return {Runner} Runner instance.
- */
-Runner.prototype.run = function(fn) {
- var self = this;
- var rootSuite = this.suite;
-
- // If there is an `only` filter
- if (this.hasOnly) {
- filterOnly(rootSuite);
- }
-
- fn = fn || function() {};
-
- function uncaught(err) {
- self.uncaught(err);
- }
-
- function start() {
- self.started = true;
- self.emit('start');
- self.runSuite(rootSuite, function() {
- debug('finished running');
- self.emit('end');
- });
- }
-
- debug('start');
-
- // references cleanup to avoid memory leaks
- this.on('suite end', cleanSuiteReferences);
-
- // callback
- this.on('end', function() {
- debug('end');
- process.removeListener('uncaughtException', uncaught);
- fn(self.failures);
- });
-
- // uncaught exception
- process.on('uncaughtException', uncaught);
-
- if (this._delay) {
- // for reporters, I guess.
- // might be nice to debounce some dots while we wait.
- this.emit('waiting', rootSuite);
- rootSuite.once('run', start);
- } else {
- start();
- }
-
- return this;
-};
-
-/**
- * Cleanly abort execution.
- *
- * @api public
- * @return {Runner} Runner instance.
- */
-Runner.prototype.abort = function() {
- debug('aborting');
- this._abort = true;
-
- return this;
-};
-
-/**
- * Filter suites based on `isOnly` logic.
- *
- * @param {Array} suite
- * @returns {Boolean}
- * @api private
- */
-function filterOnly(suite) {
- if (suite._onlyTests.length) {
- // If the suite contains `only` tests, run those and ignore any nested suites.
- suite.tests = suite._onlyTests;
- suite.suites = [];
- } else {
- // Otherwise, do not run any of the tests in this suite.
- suite.tests = [];
- utils.forEach(suite._onlySuites, function(onlySuite) {
- // If there are other `only` tests/suites nested in the current `only` suite, then filter that `only` suite.
- // Otherwise, all of the tests on this `only` suite should be run, so don't filter it.
- if (hasOnly(onlySuite)) {
- filterOnly(onlySuite);
- }
- });
- // Run the `only` suites, as well as any other suites that have `only` tests/suites as descendants.
- suite.suites = filter(suite.suites, function(childSuite) {
- return indexOf(suite._onlySuites, childSuite) !== -1 || filterOnly(childSuite);
- });
- }
- // Keep the suite only if there is something to run
- return suite.tests.length || suite.suites.length;
-}
-
-/**
- * Determines whether a suite has an `only` test or suite as a descendant.
- *
- * @param {Array} suite
- * @returns {Boolean}
- * @api private
- */
-function hasOnly(suite) {
- return suite._onlyTests.length || suite._onlySuites.length || some(suite.suites, hasOnly);
-}
-
-/**
- * Filter leaks with the given globals flagged as `ok`.
- *
- * @api private
- * @param {Array} ok
- * @param {Array} globals
- * @return {Array}
- */
-function filterLeaks(ok, globals) {
- return filter(globals, function(key) {
- // Firefox and Chrome exposes iframes as index inside the window object
- if (/^\d+/.test(key)) {
- return false;
- }
-
- // in firefox
- // if runner runs in an iframe, this iframe's window.getInterface method
- // not init at first it is assigned in some seconds
- if (global.navigator && (/^getInterface/).test(key)) {
- return false;
- }
-
- // an iframe could be approached by window[iframeIndex]
- // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak
- if (global.navigator && (/^\d+/).test(key)) {
- return false;
- }
-
- // Opera and IE expose global variables for HTML element IDs (issue #243)
- if (/^mocha-/.test(key)) {
- return false;
- }
-
- var matched = filter(ok, function(ok) {
- if (~ok.indexOf('*')) {
- return key.indexOf(ok.split('*')[0]) === 0;
- }
- return key === ok;
- });
- return !matched.length && (!global.navigator || key !== 'onerror');
- });
-}
-
-/**
- * Array of globals dependent on the environment.
- *
- * @return {Array}
- * @api private
- */
-function extraGlobals() {
- if (typeof process === 'object' && typeof process.version === 'string') {
- var parts = process.version.split('.');
- var nodeVersion = utils.reduce(parts, function(a, v) {
- return a << 8 | v;
- });
-
- // 'errno' was renamed to process._errno in v0.9.11.
-
- if (nodeVersion < 0x00090B) {
- return ['errno'];
- }
- }
-
- return [];
-}
-
-}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"./pending":16,"./runnable":33,"./utils":38,"_process":67,"debug":2,"events":3}],35:[function(require,module,exports){
-/**
- * Module dependencies.
- */
-
-var EventEmitter = require('events').EventEmitter;
-var Hook = require('./hook');
-var utils = require('./utils');
-var inherits = utils.inherits;
-var debug = require('debug')('mocha:suite');
-var milliseconds = require('./ms');
-
-/**
- * Expose `Suite`.
- */
-
-exports = module.exports = Suite;
-
-/**
- * Create a new `Suite` with the given `title` and parent `Suite`. When a suite
- * with the same title is already present, that suite is returned to provide
- * nicer reporter and more flexible meta-testing.
- *
- * @api public
- * @param {Suite} parent
- * @param {string} title
- * @return {Suite}
- */
-exports.create = function(parent, title) {
- var suite = new Suite(title, parent.ctx);
- suite.parent = parent;
- title = suite.fullTitle();
- parent.addSuite(suite);
- return suite;
-};
-
-/**
- * Initialize a new `Suite` with the given `title` and `ctx`.
- *
- * @api private
- * @param {string} title
- * @param {Context} parentContext
- */
-function Suite(title, parentContext) {
- if (!utils.isString(title)) {
- throw new Error('Suite `title` should be a "string" but "' + typeof title + '" was given instead.');
- }
- this.title = title;
- function Context() {}
- Context.prototype = parentContext;
- this.ctx = new Context();
- this.suites = [];
- this.tests = [];
- this.pending = false;
- this._beforeEach = [];
- this._beforeAll = [];
- this._afterEach = [];
- this._afterAll = [];
- this.root = !title;
- this._timeout = 2000;
- this._enableTimeouts = true;
- this._slow = 75;
- this._bail = false;
- this._retries = -1;
- this._onlyTests = [];
- this._onlySuites = [];
- this.delayed = false;
-}
-
-/**
- * Inherit from `EventEmitter.prototype`.
- */
-inherits(Suite, EventEmitter);
-
-/**
- * Return a clone of this `Suite`.
- *
- * @api private
- * @return {Suite}
- */
-Suite.prototype.clone = function() {
- var suite = new Suite(this.title);
- debug('clone');
- suite.ctx = this.ctx;
- suite.timeout(this.timeout());
- suite.retries(this.retries());
- suite.enableTimeouts(this.enableTimeouts());
- suite.slow(this.slow());
- suite.bail(this.bail());
- return suite;
-};
-
-/**
- * Set timeout `ms` or short-hand such as "2s".
- *
- * @api private
- * @param {number|string} ms
- * @return {Suite|number} for chaining
- */
-Suite.prototype.timeout = function(ms) {
- if (!arguments.length) {
- return this._timeout;
- }
- if (ms.toString() === '0') {
- this._enableTimeouts = false;
- }
- if (typeof ms === 'string') {
- ms = milliseconds(ms);
- }
- debug('timeout %d', ms);
- this._timeout = parseInt(ms, 10);
- return this;
-};
-
-/**
- * Set number of times to retry a failed test.
- *
- * @api private
- * @param {number|string} n
- * @return {Suite|number} for chaining
- */
-Suite.prototype.retries = function(n) {
- if (!arguments.length) {
- return this._retries;
- }
- debug('retries %d', n);
- this._retries = parseInt(n, 10) || 0;
- return this;
-};
-
-/**
- * Set timeout to `enabled`.
- *
- * @api private
- * @param {boolean} enabled
- * @return {Suite|boolean} self or enabled
- */
-Suite.prototype.enableTimeouts = function(enabled) {
- if (!arguments.length) {
- return this._enableTimeouts;
- }
- debug('enableTimeouts %s', enabled);
- this._enableTimeouts = enabled;
- return this;
-};
-
-/**
- * Set slow `ms` or short-hand such as "2s".
- *
- * @api private
- * @param {number|string} ms
- * @return {Suite|number} for chaining
- */
-Suite.prototype.slow = function(ms) {
- if (!arguments.length) {
- return this._slow;
- }
- if (typeof ms === 'string') {
- ms = milliseconds(ms);
- }
- debug('slow %d', ms);
- this._slow = ms;
- return this;
-};
-
-/**
- * Sets whether to bail after first error.
- *
- * @api private
- * @param {boolean} bail
- * @return {Suite|number} for chaining
- */
-Suite.prototype.bail = function(bail) {
- if (!arguments.length) {
- return this._bail;
- }
- debug('bail %s', bail);
- this._bail = bail;
- return this;
-};
-
-/**
- * Check if this suite or its parent suite is marked as pending.
- *
- * @api private
- */
-Suite.prototype.isPending = function() {
- return this.pending || (this.parent && this.parent.isPending());
-};
-
-/**
- * Run `fn(test[, done])` before running tests.
- *
- * @api private
- * @param {string} title
- * @param {Function} fn
- * @return {Suite} for chaining
- */
-Suite.prototype.beforeAll = function(title, fn) {
- if (this.isPending()) {
- return this;
- }
- if (typeof title === 'function') {
- fn = title;
- title = fn.name;
- }
- title = '"before all" hook' + (title ? ': ' + title : '');
-
- var hook = new Hook(title, fn);
- hook.parent = this;
- hook.timeout(this.timeout());
- hook.retries(this.retries());
- hook.enableTimeouts(this.enableTimeouts());
- hook.slow(this.slow());
- hook.ctx = this.ctx;
- this._beforeAll.push(hook);
- this.emit('beforeAll', hook);
- return this;
-};
-
-/**
- * Run `fn(test[, done])` after running tests.
- *
- * @api private
- * @param {string} title
- * @param {Function} fn
- * @return {Suite} for chaining
- */
-Suite.prototype.afterAll = function(title, fn) {
- if (this.isPending()) {
- return this;
- }
- if (typeof title === 'function') {
- fn = title;
- title = fn.name;
- }
- title = '"after all" hook' + (title ? ': ' + title : '');
-
- var hook = new Hook(title, fn);
- hook.parent = this;
- hook.timeout(this.timeout());
- hook.retries(this.retries());
- hook.enableTimeouts(this.enableTimeouts());
- hook.slow(this.slow());
- hook.ctx = this.ctx;
- this._afterAll.push(hook);
- this.emit('afterAll', hook);
- return this;
-};
-
-/**
- * Run `fn(test[, done])` before each test case.
- *
- * @api private
- * @param {string} title
- * @param {Function} fn
- * @return {Suite} for chaining
- */
-Suite.prototype.beforeEach = function(title, fn) {
- if (this.isPending()) {
- return this;
- }
- if (typeof title === 'function') {
- fn = title;
- title = fn.name;
- }
- title = '"before each" hook' + (title ? ': ' + title : '');
-
- var hook = new Hook(title, fn);
- hook.parent = this;
- hook.timeout(this.timeout());
- hook.retries(this.retries());
- hook.enableTimeouts(this.enableTimeouts());
- hook.slow(this.slow());
- hook.ctx = this.ctx;
- this._beforeEach.push(hook);
- this.emit('beforeEach', hook);
- return this;
-};
-
-/**
- * Run `fn(test[, done])` after each test case.
- *
- * @api private
- * @param {string} title
- * @param {Function} fn
- * @return {Suite} for chaining
- */
-Suite.prototype.afterEach = function(title, fn) {
- if (this.isPending()) {
- return this;
- }
- if (typeof title === 'function') {
- fn = title;
- title = fn.name;
- }
- title = '"after each" hook' + (title ? ': ' + title : '');
-
- var hook = new Hook(title, fn);
- hook.parent = this;
- hook.timeout(this.timeout());
- hook.retries(this.retries());
- hook.enableTimeouts(this.enableTimeouts());
- hook.slow(this.slow());
- hook.ctx = this.ctx;
- this._afterEach.push(hook);
- this.emit('afterEach', hook);
- return this;
-};
-
-/**
- * Add a test `suite`.
- *
- * @api private
- * @param {Suite} suite
- * @return {Suite} for chaining
- */
-Suite.prototype.addSuite = function(suite) {
- suite.parent = this;
- suite.timeout(this.timeout());
- suite.retries(this.retries());
- suite.enableTimeouts(this.enableTimeouts());
- suite.slow(this.slow());
- suite.bail(this.bail());
- this.suites.push(suite);
- this.emit('suite', suite);
- return this;
-};
-
-/**
- * Add a `test` to this suite.
- *
- * @api private
- * @param {Test} test
- * @return {Suite} for chaining
- */
-Suite.prototype.addTest = function(test) {
- test.parent = this;
- test.timeout(this.timeout());
- test.retries(this.retries());
- test.enableTimeouts(this.enableTimeouts());
- test.slow(this.slow());
- test.ctx = this.ctx;
- this.tests.push(test);
- this.emit('test', test);
- return this;
-};
-
-/**
- * Return the full title generated by recursively concatenating the parent's
- * full title.
- *
- * @api public
- * @return {string}
- */
-Suite.prototype.fullTitle = function() {
- if (this.parent) {
- var full = this.parent.fullTitle();
- if (full) {
- return full + ' ' + this.title;
- }
- }
- return this.title;
-};
-
-/**
- * Return the total number of tests.
- *
- * @api public
- * @return {number}
- */
-Suite.prototype.total = function() {
- return utils.reduce(this.suites, function(sum, suite) {
- return sum + suite.total();
- }, 0) + this.tests.length;
-};
-
-/**
- * Iterates through each suite recursively to find all tests. Applies a
- * function in the format `fn(test)`.
- *
- * @api private
- * @param {Function} fn
- * @return {Suite}
- */
-Suite.prototype.eachTest = function(fn) {
- utils.forEach(this.tests, fn);
- utils.forEach(this.suites, function(suite) {
- suite.eachTest(fn);
- });
- return this;
-};
-
-/**
- * This will run the root suite if we happen to be running in delayed mode.
- */
-Suite.prototype.run = function run() {
- if (this.root) {
- this.emit('run');
- }
-};
-
-},{"./hook":7,"./ms":15,"./utils":38,"debug":2,"events":3}],36:[function(require,module,exports){
-/**
- * Module dependencies.
- */
-
-var Runnable = require('./runnable');
-var create = require('lodash.create');
-var isString = require('./utils').isString;
-
-/**
- * Expose `Test`.
- */
-
-module.exports = Test;
-
-/**
- * Initialize a new `Test` with the given `title` and callback `fn`.
- *
- * @api private
- * @param {String} title
- * @param {Function} fn
- */
-function Test(title, fn) {
- if (!isString(title)) {
- throw new Error('Test `title` should be a "string" but "' + typeof title + '" was given instead.');
- }
- Runnable.call(this, title, fn);
- this.pending = !fn;
- this.type = 'test';
-}
-
-/**
- * Inherit from `Runnable.prototype`.
- */
-Test.prototype = create(Runnable.prototype, {
- constructor: Test
-});
-
-Test.prototype.clone = function() {
- var test = new Test(this.title, this.fn);
- test.timeout(this.timeout());
- test.slow(this.slow());
- test.enableTimeouts(this.enableTimeouts());
- test.retries(this.retries());
- test.currentRetry(this.currentRetry());
- test.globals(this.globals());
- test.parent = this.parent;
- test.file = this.file;
- test.ctx = this.ctx;
- return test;
-};
-
-},{"./runnable":33,"./utils":38,"lodash.create":60}],37:[function(require,module,exports){
-'use strict';
-
-/**
- * Pad a `number` with a ten's place zero.
- *
- * @param {number} number
- * @return {string}
- */
-function pad(number) {
- var n = number.toString();
- return n.length === 1 ? '0' + n : n;
-}
-
-/**
- * Turn a `date` into an ISO string.
- *
- * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
- *
- * @param {Date} date
- * @return {string}
- */
-function toISOString(date) {
- return date.getUTCFullYear()
- + '-' + pad(date.getUTCMonth() + 1)
- + '-' + pad(date.getUTCDate())
- + 'T' + pad(date.getUTCHours())
- + ':' + pad(date.getUTCMinutes())
- + ':' + pad(date.getUTCSeconds())
- + '.' + String((date.getUTCMilliseconds()/1000).toFixed(3)).slice(2, 5)
- + 'Z';
-}
-
-/*
- * Exports.
- */
-
-module.exports = toISOString;
-
-},{}],38:[function(require,module,exports){
-(function (process,Buffer){
-/* eslint-env browser */
-
-/**
- * Module dependencies.
- */
-
-var JSON = require('json3');
-var basename = require('path').basename;
-var debug = require('debug')('mocha:watch');
-var exists = require('fs').existsSync || require('path').existsSync;
-var glob = require('glob');
-var path = require('path');
-var join = path.join;
-var readdirSync = require('fs').readdirSync;
-var statSync = require('fs').statSync;
-var watchFile = require('fs').watchFile;
-var toISOString = require('./to-iso-string');
-
-/**
- * Ignored directories.
- */
-
-var ignore = ['node_modules', '.git'];
-
-exports.inherits = require('util').inherits;
-
-/**
- * Escape special characters in the given string of html.
- *
- * @api private
- * @param {string} html
- * @return {string}
- */
-exports.escape = function(html) {
- return String(html)
- .replace(/&/g, '&')
- .replace(/"/g, '"')
- .replace(//g, '>');
-};
-
-/**
- * Array#forEach (<=IE8)
- *
- * @api private
- * @param {Array} arr
- * @param {Function} fn
- * @param {Object} scope
- */
-exports.forEach = function(arr, fn, scope) {
- for (var i = 0, l = arr.length; i < l; i++) {
- fn.call(scope, arr[i], i);
- }
-};
-
-/**
- * Test if the given obj is type of string.
- *
- * @api private
- * @param {Object} obj
- * @return {boolean}
- */
-exports.isString = function(obj) {
- return typeof obj === 'string';
-};
-
-/**
- * Array#map (<=IE8)
- *
- * @api private
- * @param {Array} arr
- * @param {Function} fn
- * @param {Object} scope
- * @return {Array}
- */
-exports.map = function(arr, fn, scope) {
- var result = [];
- for (var i = 0, l = arr.length; i < l; i++) {
- result.push(fn.call(scope, arr[i], i, arr));
- }
- return result;
-};
-
-/**
- * Array#indexOf (<=IE8)
- *
- * @api private
- * @param {Array} arr
- * @param {Object} obj to find index of
- * @param {number} start
- * @return {number}
- */
-var indexOf = exports.indexOf = function(arr, obj, start) {
- for (var i = start || 0, l = arr.length; i < l; i++) {
- if (arr[i] === obj) {
- return i;
- }
- }
- return -1;
-};
-
-/**
- * Array#reduce (<=IE8)
- *
- * @api private
- * @param {Array} arr
- * @param {Function} fn
- * @param {Object} val Initial value.
- * @return {*}
- */
-var reduce = exports.reduce = function(arr, fn, val) {
- var rval = val;
-
- for (var i = 0, l = arr.length; i < l; i++) {
- rval = fn(rval, arr[i], i, arr);
- }
-
- return rval;
-};
-
-/**
- * Array#filter (<=IE8)
- *
- * @api private
- * @param {Array} arr
- * @param {Function} fn
- * @return {Array}
- */
-exports.filter = function(arr, fn) {
- var ret = [];
-
- for (var i = 0, l = arr.length; i < l; i++) {
- var val = arr[i];
- if (fn(val, i, arr)) {
- ret.push(val);
- }
- }
-
- return ret;
-};
-
-/**
- * Array#some (<=IE8)
- *
- * @api private
- * @param {Array} arr
- * @param {Function} fn
- * @return {Array}
- */
-exports.some = function(arr, fn) {
- for (var i = 0, l = arr.length; i < l; i++) {
- if (fn(arr[i])) {
- return true;
- }
- }
- return false;
-};
-
-/**
- * Object.keys (<=IE8)
- *
- * @api private
- * @param {Object} obj
- * @return {Array} keys
- */
-exports.keys = typeof Object.keys === 'function' ? Object.keys : function(obj) {
- var keys = [];
- var has = Object.prototype.hasOwnProperty; // for `window` on <=IE8
-
- for (var key in obj) {
- if (has.call(obj, key)) {
- keys.push(key);
- }
- }
-
- return keys;
-};
-
-/**
- * Watch the given `files` for changes
- * and invoke `fn(file)` on modification.
- *
- * @api private
- * @param {Array} files
- * @param {Function} fn
- */
-exports.watch = function(files, fn) {
- var options = { interval: 100 };
- files.forEach(function(file) {
- debug('file %s', file);
- watchFile(file, options, function(curr, prev) {
- if (prev.mtime < curr.mtime) {
- fn(file);
- }
- });
- });
-};
-
-/**
- * Array.isArray (<=IE8)
- *
- * @api private
- * @param {Object} obj
- * @return {Boolean}
- */
-var isArray = typeof Array.isArray === 'function' ? Array.isArray : function(obj) {
- return Object.prototype.toString.call(obj) === '[object Array]';
-};
-
-exports.isArray = isArray;
-
-/**
- * Buffer.prototype.toJSON polyfill.
- *
- * @type {Function}
- */
-if (typeof Buffer !== 'undefined' && Buffer.prototype) {
- Buffer.prototype.toJSON = Buffer.prototype.toJSON || function() {
- return Array.prototype.slice.call(this, 0);
- };
-}
-
-/**
- * Ignored files.
- *
- * @api private
- * @param {string} path
- * @return {boolean}
- */
-function ignored(path) {
- return !~ignore.indexOf(path);
-}
-
-/**
- * Lookup files in the given `dir`.
- *
- * @api private
- * @param {string} dir
- * @param {string[]} [ext=['.js']]
- * @param {Array} [ret=[]]
- * @return {Array}
- */
-exports.files = function(dir, ext, ret) {
- ret = ret || [];
- ext = ext || ['js'];
-
- var re = new RegExp('\\.(' + ext.join('|') + ')$');
-
- readdirSync(dir)
- .filter(ignored)
- .forEach(function(path) {
- path = join(dir, path);
- if (statSync(path).isDirectory()) {
- exports.files(path, ext, ret);
- } else if (path.match(re)) {
- ret.push(path);
- }
- });
-
- return ret;
-};
-
-/**
- * Compute a slug from the given `str`.
- *
- * @api private
- * @param {string} str
- * @return {string}
- */
-exports.slug = function(str) {
- return str
- .toLowerCase()
- .replace(/ +/g, '-')
- .replace(/[^-\w]/g, '');
-};
-
-/**
- * Strip the function definition from `str`, and re-indent for pre whitespace.
- *
- * @param {string} str
- * @return {string}
- */
-exports.clean = function(str) {
- str = str
- .replace(/\r\n?|[\n\u2028\u2029]/g, '\n').replace(/^\uFEFF/, '')
- // (traditional)-> space/name parameters body (lambda)-> parameters body multi-statement/single keep body content
- .replace(/^function(?:\s*|\s+[^(]*)\([^)]*\)\s*\{((?:.|\n)*?)\s*\}$|^\([^)]*\)\s*=>\s*(?:\{((?:.|\n)*?)\s*\}|((?:.|\n)*))$/, '$1$2$3');
-
- var spaces = str.match(/^\n?( *)/)[1].length;
- var tabs = str.match(/^\n?(\t*)/)[1].length;
- var re = new RegExp('^\n?' + (tabs ? '\t' : ' ') + '{' + (tabs ? tabs : spaces) + '}', 'gm');
-
- str = str.replace(re, '');
-
- return exports.trim(str);
-};
-
-/**
- * Trim the given `str`.
- *
- * @api private
- * @param {string} str
- * @return {string}
- */
-exports.trim = function(str) {
- return str.replace(/^\s+|\s+$/g, '');
-};
-
-/**
- * Parse the given `qs`.
- *
- * @api private
- * @param {string} qs
- * @return {Object}
- */
-exports.parseQuery = function(qs) {
- return reduce(qs.replace('?', '').split('&'), function(obj, pair) {
- var i = pair.indexOf('=');
- var key = pair.slice(0, i);
- var val = pair.slice(++i);
-
- obj[key] = decodeURIComponent(val);
- return obj;
- }, {});
-};
-
-/**
- * Highlight the given string of `js`.
- *
- * @api private
- * @param {string} js
- * @return {string}
- */
-function highlight(js) {
- return js
- .replace(//g, '>')
- .replace(/\/\/(.*)/gm, '')
- .replace(/('.*?')/gm, '$1 ')
- .replace(/(\d+\.\d+)/gm, '$1 ')
- .replace(/(\d+)/gm, '$1 ')
- .replace(/\bnew[ \t]+(\w+)/gm, 'new $1 ')
- .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '$1 ');
-}
-
-/**
- * Highlight the contents of tag `name`.
- *
- * @api private
- * @param {string} name
- */
-exports.highlightTags = function(name) {
- var code = document.getElementById('mocha').getElementsByTagName(name);
- for (var i = 0, len = code.length; i < len; ++i) {
- code[i].innerHTML = highlight(code[i].innerHTML);
- }
-};
-
-/**
- * If a value could have properties, and has none, this function is called,
- * which returns a string representation of the empty value.
- *
- * Functions w/ no properties return `'[Function]'`
- * Arrays w/ length === 0 return `'[]'`
- * Objects w/ no properties return `'{}'`
- * All else: return result of `value.toString()`
- *
- * @api private
- * @param {*} value The value to inspect.
- * @param {string} typeHint The type of the value
- * @returns {string}
- */
-function emptyRepresentation(value, typeHint) {
- switch (typeHint) {
- case 'function':
- return '[Function]';
- case 'object':
- return '{}';
- case 'array':
- return '[]';
- default:
- return value.toString();
- }
-}
-
-/**
- * Takes some variable and asks `Object.prototype.toString()` what it thinks it
- * is.
- *
- * @api private
- * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
- * @param {*} value The value to test.
- * @returns {string} Computed type
- * @example
- * type({}) // 'object'
- * type([]) // 'array'
- * type(1) // 'number'
- * type(false) // 'boolean'
- * type(Infinity) // 'number'
- * type(null) // 'null'
- * type(new Date()) // 'date'
- * type(/foo/) // 'regexp'
- * type('type') // 'string'
- * type(global) // 'global'
- * type(new String('foo') // 'object'
- */
-var type = exports.type = function type(value) {
- if (value === undefined) {
- return 'undefined';
- } else if (value === null) {
- return 'null';
- } else if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {
- return 'buffer';
- }
- return Object.prototype.toString.call(value)
- .replace(/^\[.+\s(.+?)\]$/, '$1')
- .toLowerCase();
-};
-
-/**
- * Stringify `value`. Different behavior depending on type of value:
- *
- * - If `value` is undefined or null, return `'[undefined]'` or `'[null]'`, respectively.
- * - If `value` is not an object, function or array, return result of `value.toString()` wrapped in double-quotes.
- * - If `value` is an *empty* object, function, or array, return result of function
- * {@link emptyRepresentation}.
- * - If `value` has properties, call {@link exports.canonicalize} on it, then return result of
- * JSON.stringify().
- *
- * @api private
- * @see exports.type
- * @param {*} value
- * @return {string}
- */
-exports.stringify = function(value) {
- var typeHint = type(value);
-
- if (!~indexOf(['object', 'array', 'function'], typeHint)) {
- if (typeHint === 'buffer') {
- var json = value.toJSON();
- // Based on the toJSON result
- return jsonStringify(json.data && json.type ? json.data : json, 2)
- .replace(/,(\n|$)/g, '$1');
- }
-
- // IE7/IE8 has a bizarre String constructor; needs to be coerced
- // into an array and back to obj.
- if (typeHint === 'string' && typeof value === 'object') {
- value = reduce(value.split(''), function(acc, char, idx) {
- acc[idx] = char;
- return acc;
- }, {});
- typeHint = 'object';
- } else {
- return jsonStringify(value);
- }
- }
-
- for (var prop in value) {
- if (Object.prototype.hasOwnProperty.call(value, prop)) {
- return jsonStringify(exports.canonicalize(value, null, typeHint), 2).replace(/,(\n|$)/g, '$1');
- }
- }
-
- return emptyRepresentation(value, typeHint);
-};
-
-/**
- * like JSON.stringify but more sense.
- *
- * @api private
- * @param {Object} object
- * @param {number=} spaces
- * @param {number=} depth
- * @returns {*}
- */
-function jsonStringify(object, spaces, depth) {
- if (typeof spaces === 'undefined') {
- // primitive types
- return _stringify(object);
- }
-
- depth = depth || 1;
- var space = spaces * depth;
- var str = isArray(object) ? '[' : '{';
- var end = isArray(object) ? ']' : '}';
- var length = typeof object.length === 'number' ? object.length : exports.keys(object).length;
- // `.repeat()` polyfill
- function repeat(s, n) {
- return new Array(n).join(s);
- }
-
- function _stringify(val) {
- switch (type(val)) {
- case 'null':
- case 'undefined':
- val = '[' + val + ']';
- break;
- case 'array':
- case 'object':
- val = jsonStringify(val, spaces, depth + 1);
- break;
- case 'boolean':
- case 'regexp':
- case 'symbol':
- case 'number':
- val = val === 0 && (1 / val) === -Infinity // `-0`
- ? '-0'
- : val.toString();
- break;
- case 'date':
- var sDate;
- if (isNaN(val.getTime())) { // Invalid date
- sDate = val.toString();
- } else {
- sDate = val.toISOString ? val.toISOString() : toISOString(val);
- }
- val = '[Date: ' + sDate + ']';
- break;
- case 'buffer':
- var json = val.toJSON();
- // Based on the toJSON result
- json = json.data && json.type ? json.data : json;
- val = '[Buffer: ' + jsonStringify(json, 2, depth + 1) + ']';
- break;
- default:
- val = (val === '[Function]' || val === '[Circular]')
- ? val
- : JSON.stringify(val); // string
- }
- return val;
- }
-
- for (var i in object) {
- if (!Object.prototype.hasOwnProperty.call(object, i)) {
- continue; // not my business
- }
- --length;
- str += '\n ' + repeat(' ', space)
- + (isArray(object) ? '' : '"' + i + '": ') // key
- + _stringify(object[i]) // value
- + (length ? ',' : ''); // comma
- }
-
- return str
- // [], {}
- + (str.length !== 1 ? '\n' + repeat(' ', --space) + end : end);
-}
-
-/**
- * Test if a value is a buffer.
- *
- * @api private
- * @param {*} value The value to test.
- * @return {boolean} True if `value` is a buffer, otherwise false
- */
-exports.isBuffer = function(value) {
- return typeof Buffer !== 'undefined' && Buffer.isBuffer(value);
-};
-
-/**
- * Return a new Thing that has the keys in sorted order. Recursive.
- *
- * If the Thing...
- * - has already been seen, return string `'[Circular]'`
- * - is `undefined`, return string `'[undefined]'`
- * - is `null`, return value `null`
- * - is some other primitive, return the value
- * - is not a primitive or an `Array`, `Object`, or `Function`, return the value of the Thing's `toString()` method
- * - is a non-empty `Array`, `Object`, or `Function`, return the result of calling this function again.
- * - is an empty `Array`, `Object`, or `Function`, return the result of calling `emptyRepresentation()`
- *
- * @api private
- * @see {@link exports.stringify}
- * @param {*} value Thing to inspect. May or may not have properties.
- * @param {Array} [stack=[]] Stack of seen values
- * @param {string} [typeHint] Type hint
- * @return {(Object|Array|Function|string|undefined)}
- */
-exports.canonicalize = function canonicalize(value, stack, typeHint) {
- var canonicalizedObj;
- /* eslint-disable no-unused-vars */
- var prop;
- /* eslint-enable no-unused-vars */
- typeHint = typeHint || type(value);
- function withStack(value, fn) {
- stack.push(value);
- fn();
- stack.pop();
- }
-
- stack = stack || [];
-
- if (indexOf(stack, value) !== -1) {
- return '[Circular]';
- }
-
- switch (typeHint) {
- case 'undefined':
- case 'buffer':
- case 'null':
- canonicalizedObj = value;
- break;
- case 'array':
- withStack(value, function() {
- canonicalizedObj = exports.map(value, function(item) {
- return exports.canonicalize(item, stack);
- });
- });
- break;
- case 'function':
- /* eslint-disable guard-for-in */
- for (prop in value) {
- canonicalizedObj = {};
- break;
- }
- /* eslint-enable guard-for-in */
- if (!canonicalizedObj) {
- canonicalizedObj = emptyRepresentation(value, typeHint);
- break;
- }
- /* falls through */
- case 'object':
- canonicalizedObj = canonicalizedObj || {};
- withStack(value, function() {
- exports.forEach(exports.keys(value).sort(), function(key) {
- canonicalizedObj[key] = exports.canonicalize(value[key], stack);
- });
- });
- break;
- case 'date':
- case 'number':
- case 'regexp':
- case 'boolean':
- case 'symbol':
- canonicalizedObj = value;
- break;
- default:
- canonicalizedObj = value + '';
- }
-
- return canonicalizedObj;
-};
-
-/**
- * Lookup file names at the given `path`.
- *
- * @api public
- * @param {string} path Base path to start searching from.
- * @param {string[]} extensions File extensions to look for.
- * @param {boolean} recursive Whether or not to recurse into subdirectories.
- * @return {string[]} An array of paths.
- */
-exports.lookupFiles = function lookupFiles(path, extensions, recursive) {
- var files = [];
- var re = new RegExp('\\.(' + extensions.join('|') + ')$');
-
- if (!exists(path)) {
- if (exists(path + '.js')) {
- path += '.js';
- } else {
- files = glob.sync(path);
- if (!files.length) {
- throw new Error("cannot resolve path (or pattern) '" + path + "'");
- }
- return files;
- }
- }
-
- try {
- var stat = statSync(path);
- if (stat.isFile()) {
- return path;
- }
- } catch (err) {
- // ignore error
- return;
- }
-
- readdirSync(path).forEach(function(file) {
- file = join(path, file);
- try {
- var stat = statSync(file);
- if (stat.isDirectory()) {
- if (recursive) {
- files = files.concat(lookupFiles(file, extensions, recursive));
- }
- return;
- }
- } catch (err) {
- // ignore error
- return;
- }
- if (!stat.isFile() || !re.test(file) || basename(file)[0] === '.') {
- return;
- }
- files.push(file);
- });
-
- return files;
-};
-
-/**
- * Generate an undefined error with a message warning the user.
- *
- * @return {Error}
- */
-
-exports.undefinedError = function() {
- return new Error('Caught undefined error, did you throw without specifying what?');
-};
-
-/**
- * Generate an undefined error if `err` is not defined.
- *
- * @param {Error} err
- * @return {Error}
- */
-
-exports.getError = function(err) {
- return err || exports.undefinedError();
-};
-
-/**
- * @summary
- * This Filter based on `mocha-clean` module.(see: `github.com/rstacruz/mocha-clean`)
- * @description
- * When invoking this function you get a filter function that get the Error.stack as an input,
- * and return a prettify output.
- * (i.e: strip Mocha and internal node functions from stack trace).
- * @returns {Function}
- */
-exports.stackTraceFilter = function() {
- // TODO: Replace with `process.browser`
- var is = typeof document === 'undefined' ? { node: true } : { browser: true };
- var slash = path.sep;
- var cwd;
- if (is.node) {
- cwd = process.cwd() + slash;
- } else {
- cwd = (typeof location === 'undefined' ? window.location : location).href.replace(/\/[^\/]*$/, '/');
- slash = '/';
- }
-
- function isMochaInternal(line) {
- return (~line.indexOf('node_modules' + slash + 'mocha' + slash))
- || (~line.indexOf('node_modules' + slash + 'mocha.js'))
- || (~line.indexOf('bower_components' + slash + 'mocha.js'))
- || (~line.indexOf(slash + 'mocha.js'));
- }
-
- function isNodeInternal(line) {
- return (~line.indexOf('(timers.js:'))
- || (~line.indexOf('(events.js:'))
- || (~line.indexOf('(node.js:'))
- || (~line.indexOf('(module.js:'))
- || (~line.indexOf('GeneratorFunctionPrototype.next (native)'))
- || false;
- }
-
- return function(stack) {
- stack = stack.split('\n');
-
- stack = reduce(stack, function(list, line) {
- if (isMochaInternal(line)) {
- return list;
- }
-
- if (is.node && isNodeInternal(line)) {
- return list;
- }
-
- // Clean up cwd(absolute)
- if (/\(?.+:\d+:\d+\)?$/.test(line)) {
- line = line.replace(cwd, '');
- }
-
- list.push(line);
- return list;
- }, []);
-
- return stack.join('\n');
- };
-};
-
-/**
- * Crude, but effective.
- * @api
- * @param {*} value
- * @returns {boolean} Whether or not `value` is a Promise
- */
-exports.isPromise = function isPromise(value) {
- return typeof value === 'object' && typeof value.then === 'function';
-};
-
-}).call(this,require('_process'),require("buffer").Buffer)
-},{"./to-iso-string":37,"_process":67,"buffer":44,"debug":2,"fs":42,"glob":42,"json3":54,"path":42,"util":84}],39:[function(require,module,exports){
-'use strict'
-
-exports.toByteArray = toByteArray
-exports.fromByteArray = fromByteArray
-
-var lookup = []
-var revLookup = []
-var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
-
-function init () {
- var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
- for (var i = 0, len = code.length; i < len; ++i) {
- lookup[i] = code[i]
- revLookup[code.charCodeAt(i)] = i
- }
-
- revLookup['-'.charCodeAt(0)] = 62
- revLookup['_'.charCodeAt(0)] = 63
-}
-
-init()
-
-function toByteArray (b64) {
- var i, j, l, tmp, placeHolders, arr
- var len = b64.length
-
- if (len % 4 > 0) {
- throw new Error('Invalid string. Length must be a multiple of 4')
- }
-
- // the number of equal signs (place holders)
- // if there are two placeholders, than the two characters before it
- // represent one byte
- // if there is only one, then the three characters before it represent 2 bytes
- // this is just a cheap hack to not do indexOf twice
- placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
-
- // base64 is 4/3 + up to two characters of the original data
- arr = new Arr(len * 3 / 4 - placeHolders)
-
- // if there are placeholders, only get up to the last complete 4 chars
- l = placeHolders > 0 ? len - 4 : len
-
- var L = 0
-
- for (i = 0, j = 0; i < l; i += 4, j += 3) {
- tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
- arr[L++] = (tmp >> 16) & 0xFF
- arr[L++] = (tmp >> 8) & 0xFF
- arr[L++] = tmp & 0xFF
- }
-
- if (placeHolders === 2) {
- tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
- arr[L++] = tmp & 0xFF
- } else if (placeHolders === 1) {
- tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
- arr[L++] = (tmp >> 8) & 0xFF
- arr[L++] = tmp & 0xFF
- }
-
- return arr
-}
-
-function tripletToBase64 (num) {
- return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
-}
-
-function encodeChunk (uint8, start, end) {
- var tmp
- var output = []
- for (var i = start; i < end; i += 3) {
- tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
- output.push(tripletToBase64(tmp))
- }
- return output.join('')
-}
-
-function fromByteArray (uint8) {
- var tmp
- var len = uint8.length
- var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
- var output = ''
- var parts = []
- var maxChunkLength = 16383 // must be multiple of 3
-
- // go through the array every three bytes, we'll deal with trailing stuff later
- for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
- parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
- }
-
- // pad the end with zeros, but make sure to not forget the extra bytes
- if (extraBytes === 1) {
- tmp = uint8[len - 1]
- output += lookup[tmp >> 2]
- output += lookup[(tmp << 4) & 0x3F]
- output += '=='
- } else if (extraBytes === 2) {
- tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
- output += lookup[tmp >> 10]
- output += lookup[(tmp >> 4) & 0x3F]
- output += lookup[(tmp << 2) & 0x3F]
- output += '='
- }
-
- parts.push(output)
-
- return parts.join('')
-}
-
-},{}],40:[function(require,module,exports){
-
-},{}],41:[function(require,module,exports){
-(function (process){
-var WritableStream = require('stream').Writable
-var inherits = require('util').inherits
-
-module.exports = BrowserStdout
-
-
-inherits(BrowserStdout, WritableStream)
-
-function BrowserStdout(opts) {
- if (!(this instanceof BrowserStdout)) return new BrowserStdout(opts)
-
- opts = opts || {}
- WritableStream.call(this, opts)
- this.label = (opts.label !== undefined) ? opts.label : 'stdout'
-}
-
-BrowserStdout.prototype._write = function(chunks, encoding, cb) {
- var output = chunks.toString ? chunks.toString() : chunks
- if (this.label === false) {
- console.log(output)
- } else {
- console.log(this.label+':', output)
- }
- process.nextTick(cb)
-}
-
-}).call(this,require('_process'))
-},{"_process":67,"stream":79,"util":84}],42:[function(require,module,exports){
-arguments[4][40][0].apply(exports,arguments)
-},{"dup":40}],43:[function(require,module,exports){
-(function (global){
-'use strict';
-
-var buffer = require('buffer');
-var Buffer = buffer.Buffer;
-var SlowBuffer = buffer.SlowBuffer;
-var MAX_LEN = buffer.kMaxLength || 2147483647;
-exports.alloc = function alloc(size, fill, encoding) {
- if (typeof Buffer.alloc === 'function') {
- return Buffer.alloc(size, fill, encoding);
- }
- if (typeof encoding === 'number') {
- throw new TypeError('encoding must not be number');
- }
- if (typeof size !== 'number') {
- throw new TypeError('size must be a number');
- }
- if (size > MAX_LEN) {
- throw new RangeError('size is too large');
- }
- var enc = encoding;
- var _fill = fill;
- if (_fill === undefined) {
- enc = undefined;
- _fill = 0;
- }
- var buf = new Buffer(size);
- if (typeof _fill === 'string') {
- var fillBuf = new Buffer(_fill, enc);
- var flen = fillBuf.length;
- var i = -1;
- while (++i < size) {
- buf[i] = fillBuf[i % flen];
- }
- } else {
- buf.fill(_fill);
- }
- return buf;
-}
-exports.allocUnsafe = function allocUnsafe(size) {
- if (typeof Buffer.allocUnsafe === 'function') {
- return Buffer.allocUnsafe(size);
- }
- if (typeof size !== 'number') {
- throw new TypeError('size must be a number');
- }
- if (size > MAX_LEN) {
- throw new RangeError('size is too large');
- }
- return new Buffer(size);
-}
-exports.from = function from(value, encodingOrOffset, length) {
- if (typeof Buffer.from === 'function' && (!global.Uint8Array || Uint8Array.from !== Buffer.from)) {
- return Buffer.from(value, encodingOrOffset, length);
- }
- if (typeof value === 'number') {
- throw new TypeError('"value" argument must not be a number');
- }
- if (typeof value === 'string') {
- return new Buffer(value, encodingOrOffset);
- }
- if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
- var offset = encodingOrOffset;
- if (arguments.length === 1) {
- return new Buffer(value);
- }
- if (typeof offset === 'undefined') {
- offset = 0;
- }
- var len = length;
- if (typeof len === 'undefined') {
- len = value.byteLength - offset;
- }
- if (offset >= value.byteLength) {
- throw new RangeError('\'offset\' is out of bounds');
- }
- if (len > value.byteLength - offset) {
- throw new RangeError('\'length\' is out of bounds');
- }
- return new Buffer(value.slice(offset, offset + len));
- }
- if (Buffer.isBuffer(value)) {
- var out = new Buffer(value.length);
- value.copy(out, 0, 0, value.length);
- return out;
- }
- if (value) {
- if (Array.isArray(value) || (typeof ArrayBuffer !== 'undefined' && value.buffer instanceof ArrayBuffer) || 'length' in value) {
- return new Buffer(value);
- }
- if (value.type === 'Buffer' && Array.isArray(value.data)) {
- return new Buffer(value.data);
- }
- }
-
- throw new TypeError('First argument must be a string, Buffer, ' + 'ArrayBuffer, Array, or array-like object.');
-}
-exports.allocUnsafeSlow = function allocUnsafeSlow(size) {
- if (typeof Buffer.allocUnsafeSlow === 'function') {
- return Buffer.allocUnsafeSlow(size);
- }
- if (typeof size !== 'number') {
- throw new TypeError('size must be a number');
- }
- if (size >= MAX_LEN) {
- throw new RangeError('size is too large');
- }
- return new SlowBuffer(size);
-}
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"buffer":44}],44:[function(require,module,exports){
-(function (global){
-/*!
- * The buffer module from node.js, for the browser.
- *
- * @author Feross Aboukhadijeh
- * @license MIT
- */
-/* eslint-disable no-proto */
-
-'use strict'
-
-var base64 = require('base64-js')
-var ieee754 = require('ieee754')
-var isArray = require('isarray')
-
-exports.Buffer = Buffer
-exports.SlowBuffer = SlowBuffer
-exports.INSPECT_MAX_BYTES = 50
-
-/**
- * If `Buffer.TYPED_ARRAY_SUPPORT`:
- * === true Use Uint8Array implementation (fastest)
- * === false Use Object implementation (most compatible, even IE6)
- *
- * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
- * Opera 11.6+, iOS 4.2+.
- *
- * Due to various browser bugs, sometimes the Object implementation will be used even
- * when the browser supports typed arrays.
- *
- * Note:
- *
- * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
- * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
- *
- * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
- *
- * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
- * incorrect length in some situations.
-
- * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
- * get the Object implementation, which is slower but behaves correctly.
- */
-Buffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined
- ? global.TYPED_ARRAY_SUPPORT
- : typedArraySupport()
-
-/*
- * Export kMaxLength after typed array support is determined.
- */
-exports.kMaxLength = kMaxLength()
-
-function typedArraySupport () {
- try {
- var arr = new Uint8Array(1)
- arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
- return arr.foo() === 42 && // typed array instances can be augmented
- typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
- arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
- } catch (e) {
- return false
- }
-}
-
-function kMaxLength () {
- return Buffer.TYPED_ARRAY_SUPPORT
- ? 0x7fffffff
- : 0x3fffffff
-}
-
-function createBuffer (that, length) {
- if (kMaxLength() < length) {
- throw new RangeError('Invalid typed array length')
- }
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- // Return an augmented `Uint8Array` instance, for best performance
- that = new Uint8Array(length)
- that.__proto__ = Buffer.prototype
- } else {
- // Fallback: Return an object instance of the Buffer class
- if (that === null) {
- that = new Buffer(length)
- }
- that.length = length
- }
-
- return that
-}
-
-/**
- * The Buffer constructor returns instances of `Uint8Array` that have their
- * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
- * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
- * and the `Uint8Array` methods. Square bracket notation works as expected -- it
- * returns a single octet.
- *
- * The `Uint8Array` prototype remains unmodified.
- */
-
-function Buffer (arg, encodingOrOffset, length) {
- if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
- return new Buffer(arg, encodingOrOffset, length)
- }
-
- // Common case.
- if (typeof arg === 'number') {
- if (typeof encodingOrOffset === 'string') {
- throw new Error(
- 'If encoding is specified then the first argument must be a string'
- )
- }
- return allocUnsafe(this, arg)
- }
- return from(this, arg, encodingOrOffset, length)
-}
-
-Buffer.poolSize = 8192 // not used by this implementation
-
-// TODO: Legacy, not needed anymore. Remove in next major version.
-Buffer._augment = function (arr) {
- arr.__proto__ = Buffer.prototype
- return arr
-}
-
-function from (that, value, encodingOrOffset, length) {
- if (typeof value === 'number') {
- throw new TypeError('"value" argument must not be a number')
- }
-
- if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
- return fromArrayBuffer(that, value, encodingOrOffset, length)
- }
-
- if (typeof value === 'string') {
- return fromString(that, value, encodingOrOffset)
- }
-
- return fromObject(that, value)
-}
-
-/**
- * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
- * if value is a number.
- * Buffer.from(str[, encoding])
- * Buffer.from(array)
- * Buffer.from(buffer)
- * Buffer.from(arrayBuffer[, byteOffset[, length]])
- **/
-Buffer.from = function (value, encodingOrOffset, length) {
- return from(null, value, encodingOrOffset, length)
-}
-
-if (Buffer.TYPED_ARRAY_SUPPORT) {
- Buffer.prototype.__proto__ = Uint8Array.prototype
- Buffer.__proto__ = Uint8Array
- if (typeof Symbol !== 'undefined' && Symbol.species &&
- Buffer[Symbol.species] === Buffer) {
- // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
- Object.defineProperty(Buffer, Symbol.species, {
- value: null,
- configurable: true
- })
- }
-}
-
-function assertSize (size) {
- if (typeof size !== 'number') {
- throw new TypeError('"size" argument must be a number')
- } else if (size < 0) {
- throw new RangeError('"size" argument must not be negative')
- }
-}
-
-function alloc (that, size, fill, encoding) {
- assertSize(size)
- if (size <= 0) {
- return createBuffer(that, size)
- }
- if (fill !== undefined) {
- // Only pay attention to encoding if it's a string. This
- // prevents accidentally sending in a number that would
- // be interpretted as a start offset.
- return typeof encoding === 'string'
- ? createBuffer(that, size).fill(fill, encoding)
- : createBuffer(that, size).fill(fill)
- }
- return createBuffer(that, size)
-}
-
-/**
- * Creates a new filled Buffer instance.
- * alloc(size[, fill[, encoding]])
- **/
-Buffer.alloc = function (size, fill, encoding) {
- return alloc(null, size, fill, encoding)
-}
-
-function allocUnsafe (that, size) {
- assertSize(size)
- that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)
- if (!Buffer.TYPED_ARRAY_SUPPORT) {
- for (var i = 0; i < size; ++i) {
- that[i] = 0
- }
- }
- return that
-}
-
-/**
- * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
- * */
-Buffer.allocUnsafe = function (size) {
- return allocUnsafe(null, size)
-}
-/**
- * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
- */
-Buffer.allocUnsafeSlow = function (size) {
- return allocUnsafe(null, size)
-}
-
-function fromString (that, string, encoding) {
- if (typeof encoding !== 'string' || encoding === '') {
- encoding = 'utf8'
- }
-
- if (!Buffer.isEncoding(encoding)) {
- throw new TypeError('"encoding" must be a valid string encoding')
- }
-
- var length = byteLength(string, encoding) | 0
- that = createBuffer(that, length)
-
- var actual = that.write(string, encoding)
-
- if (actual !== length) {
- // Writing a hex string, for example, that contains invalid characters will
- // cause everything after the first invalid character to be ignored. (e.g.
- // 'abxxcd' will be treated as 'ab')
- that = that.slice(0, actual)
- }
-
- return that
-}
-
-function fromArrayLike (that, array) {
- var length = array.length < 0 ? 0 : checked(array.length) | 0
- that = createBuffer(that, length)
- for (var i = 0; i < length; i += 1) {
- that[i] = array[i] & 255
- }
- return that
-}
-
-function fromArrayBuffer (that, array, byteOffset, length) {
- array.byteLength // this throws if `array` is not a valid ArrayBuffer
-
- if (byteOffset < 0 || array.byteLength < byteOffset) {
- throw new RangeError('\'offset\' is out of bounds')
- }
-
- if (array.byteLength < byteOffset + (length || 0)) {
- throw new RangeError('\'length\' is out of bounds')
- }
-
- if (byteOffset === undefined && length === undefined) {
- array = new Uint8Array(array)
- } else if (length === undefined) {
- array = new Uint8Array(array, byteOffset)
- } else {
- array = new Uint8Array(array, byteOffset, length)
- }
-
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- // Return an augmented `Uint8Array` instance, for best performance
- that = array
- that.__proto__ = Buffer.prototype
- } else {
- // Fallback: Return an object instance of the Buffer class
- that = fromArrayLike(that, array)
- }
- return that
-}
-
-function fromObject (that, obj) {
- if (Buffer.isBuffer(obj)) {
- var len = checked(obj.length) | 0
- that = createBuffer(that, len)
-
- if (that.length === 0) {
- return that
- }
-
- obj.copy(that, 0, 0, len)
- return that
- }
-
- if (obj) {
- if ((typeof ArrayBuffer !== 'undefined' &&
- obj.buffer instanceof ArrayBuffer) || 'length' in obj) {
- if (typeof obj.length !== 'number' || isnan(obj.length)) {
- return createBuffer(that, 0)
- }
- return fromArrayLike(that, obj)
- }
-
- if (obj.type === 'Buffer' && isArray(obj.data)) {
- return fromArrayLike(that, obj.data)
- }
- }
-
- throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
-}
-
-function checked (length) {
- // Note: cannot use `length < kMaxLength()` here because that fails when
- // length is NaN (which is otherwise coerced to zero.)
- if (length >= kMaxLength()) {
- throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
- 'size: 0x' + kMaxLength().toString(16) + ' bytes')
- }
- return length | 0
-}
-
-function SlowBuffer (length) {
- if (+length != length) { // eslint-disable-line eqeqeq
- length = 0
- }
- return Buffer.alloc(+length)
-}
-
-Buffer.isBuffer = function isBuffer (b) {
- return !!(b != null && b._isBuffer)
-}
-
-Buffer.compare = function compare (a, b) {
- if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
- throw new TypeError('Arguments must be Buffers')
- }
-
- if (a === b) return 0
-
- var x = a.length
- var y = b.length
-
- for (var i = 0, len = Math.min(x, y); i < len; ++i) {
- if (a[i] !== b[i]) {
- x = a[i]
- y = b[i]
- break
- }
- }
-
- if (x < y) return -1
- if (y < x) return 1
- return 0
-}
-
-Buffer.isEncoding = function isEncoding (encoding) {
- switch (String(encoding).toLowerCase()) {
- case 'hex':
- case 'utf8':
- case 'utf-8':
- case 'ascii':
- case 'latin1':
- case 'binary':
- case 'base64':
- case 'ucs2':
- case 'ucs-2':
- case 'utf16le':
- case 'utf-16le':
- return true
- default:
- return false
- }
-}
-
-Buffer.concat = function concat (list, length) {
- if (!isArray(list)) {
- throw new TypeError('"list" argument must be an Array of Buffers')
- }
-
- if (list.length === 0) {
- return Buffer.alloc(0)
- }
-
- var i
- if (length === undefined) {
- length = 0
- for (i = 0; i < list.length; ++i) {
- length += list[i].length
- }
- }
-
- var buffer = Buffer.allocUnsafe(length)
- var pos = 0
- for (i = 0; i < list.length; ++i) {
- var buf = list[i]
- if (!Buffer.isBuffer(buf)) {
- throw new TypeError('"list" argument must be an Array of Buffers')
- }
- buf.copy(buffer, pos)
- pos += buf.length
- }
- return buffer
-}
-
-function byteLength (string, encoding) {
- if (Buffer.isBuffer(string)) {
- return string.length
- }
- if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&
- (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
- return string.byteLength
- }
- if (typeof string !== 'string') {
- string = '' + string
- }
-
- var len = string.length
- if (len === 0) return 0
-
- // Use a for loop to avoid recursion
- var loweredCase = false
- for (;;) {
- switch (encoding) {
- case 'ascii':
- case 'latin1':
- case 'binary':
- return len
- case 'utf8':
- case 'utf-8':
- case undefined:
- return utf8ToBytes(string).length
- case 'ucs2':
- case 'ucs-2':
- case 'utf16le':
- case 'utf-16le':
- return len * 2
- case 'hex':
- return len >>> 1
- case 'base64':
- return base64ToBytes(string).length
- default:
- if (loweredCase) return utf8ToBytes(string).length // assume utf8
- encoding = ('' + encoding).toLowerCase()
- loweredCase = true
- }
- }
-}
-Buffer.byteLength = byteLength
-
-function slowToString (encoding, start, end) {
- var loweredCase = false
-
- // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
- // property of a typed array.
-
- // This behaves neither like String nor Uint8Array in that we set start/end
- // to their upper/lower bounds if the value passed is out of range.
- // undefined is handled specially as per ECMA-262 6th Edition,
- // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
- if (start === undefined || start < 0) {
- start = 0
- }
- // Return early if start > this.length. Done here to prevent potential uint32
- // coercion fail below.
- if (start > this.length) {
- return ''
- }
-
- if (end === undefined || end > this.length) {
- end = this.length
- }
-
- if (end <= 0) {
- return ''
- }
-
- // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
- end >>>= 0
- start >>>= 0
-
- if (end <= start) {
- return ''
- }
-
- if (!encoding) encoding = 'utf8'
-
- while (true) {
- switch (encoding) {
- case 'hex':
- return hexSlice(this, start, end)
-
- case 'utf8':
- case 'utf-8':
- return utf8Slice(this, start, end)
-
- case 'ascii':
- return asciiSlice(this, start, end)
-
- case 'latin1':
- case 'binary':
- return latin1Slice(this, start, end)
-
- case 'base64':
- return base64Slice(this, start, end)
-
- case 'ucs2':
- case 'ucs-2':
- case 'utf16le':
- case 'utf-16le':
- return utf16leSlice(this, start, end)
-
- default:
- if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
- encoding = (encoding + '').toLowerCase()
- loweredCase = true
- }
- }
-}
-
-// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
-// Buffer instances.
-Buffer.prototype._isBuffer = true
-
-function swap (b, n, m) {
- var i = b[n]
- b[n] = b[m]
- b[m] = i
-}
-
-Buffer.prototype.swap16 = function swap16 () {
- var len = this.length
- if (len % 2 !== 0) {
- throw new RangeError('Buffer size must be a multiple of 16-bits')
- }
- for (var i = 0; i < len; i += 2) {
- swap(this, i, i + 1)
- }
- return this
-}
-
-Buffer.prototype.swap32 = function swap32 () {
- var len = this.length
- if (len % 4 !== 0) {
- throw new RangeError('Buffer size must be a multiple of 32-bits')
- }
- for (var i = 0; i < len; i += 4) {
- swap(this, i, i + 3)
- swap(this, i + 1, i + 2)
- }
- return this
-}
-
-Buffer.prototype.swap64 = function swap64 () {
- var len = this.length
- if (len % 8 !== 0) {
- throw new RangeError('Buffer size must be a multiple of 64-bits')
- }
- for (var i = 0; i < len; i += 8) {
- swap(this, i, i + 7)
- swap(this, i + 1, i + 6)
- swap(this, i + 2, i + 5)
- swap(this, i + 3, i + 4)
- }
- return this
-}
-
-Buffer.prototype.toString = function toString () {
- var length = this.length | 0
- if (length === 0) return ''
- if (arguments.length === 0) return utf8Slice(this, 0, length)
- return slowToString.apply(this, arguments)
-}
-
-Buffer.prototype.equals = function equals (b) {
- if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
- if (this === b) return true
- return Buffer.compare(this, b) === 0
-}
-
-Buffer.prototype.inspect = function inspect () {
- var str = ''
- var max = exports.INSPECT_MAX_BYTES
- if (this.length > 0) {
- str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
- if (this.length > max) str += ' ... '
- }
- return ''
-}
-
-Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
- if (!Buffer.isBuffer(target)) {
- throw new TypeError('Argument must be a Buffer')
- }
-
- if (start === undefined) {
- start = 0
- }
- if (end === undefined) {
- end = target ? target.length : 0
- }
- if (thisStart === undefined) {
- thisStart = 0
- }
- if (thisEnd === undefined) {
- thisEnd = this.length
- }
-
- if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
- throw new RangeError('out of range index')
- }
-
- if (thisStart >= thisEnd && start >= end) {
- return 0
- }
- if (thisStart >= thisEnd) {
- return -1
- }
- if (start >= end) {
- return 1
- }
-
- start >>>= 0
- end >>>= 0
- thisStart >>>= 0
- thisEnd >>>= 0
-
- if (this === target) return 0
-
- var x = thisEnd - thisStart
- var y = end - start
- var len = Math.min(x, y)
-
- var thisCopy = this.slice(thisStart, thisEnd)
- var targetCopy = target.slice(start, end)
-
- for (var i = 0; i < len; ++i) {
- if (thisCopy[i] !== targetCopy[i]) {
- x = thisCopy[i]
- y = targetCopy[i]
- break
- }
- }
-
- if (x < y) return -1
- if (y < x) return 1
- return 0
-}
-
-// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
-// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
-//
-// Arguments:
-// - buffer - a Buffer to search
-// - val - a string, Buffer, or number
-// - byteOffset - an index into `buffer`; will be clamped to an int32
-// - encoding - an optional encoding, relevant is val is a string
-// - dir - true for indexOf, false for lastIndexOf
-function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
- // Empty buffer means no match
- if (buffer.length === 0) return -1
-
- // Normalize byteOffset
- if (typeof byteOffset === 'string') {
- encoding = byteOffset
- byteOffset = 0
- } else if (byteOffset > 0x7fffffff) {
- byteOffset = 0x7fffffff
- } else if (byteOffset < -0x80000000) {
- byteOffset = -0x80000000
- }
- byteOffset = +byteOffset // Coerce to Number.
- if (isNaN(byteOffset)) {
- // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
- byteOffset = dir ? 0 : (buffer.length - 1)
- }
-
- // Normalize byteOffset: negative offsets start from the end of the buffer
- if (byteOffset < 0) byteOffset = buffer.length + byteOffset
- if (byteOffset >= buffer.length) {
- if (dir) return -1
- else byteOffset = buffer.length - 1
- } else if (byteOffset < 0) {
- if (dir) byteOffset = 0
- else return -1
- }
-
- // Normalize val
- if (typeof val === 'string') {
- val = Buffer.from(val, encoding)
- }
-
- // Finally, search either indexOf (if dir is true) or lastIndexOf
- if (Buffer.isBuffer(val)) {
- // Special case: looking for empty string/buffer always fails
- if (val.length === 0) {
- return -1
- }
- return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
- } else if (typeof val === 'number') {
- val = val & 0xFF // Search for a byte value [0-255]
- if (Buffer.TYPED_ARRAY_SUPPORT &&
- typeof Uint8Array.prototype.indexOf === 'function') {
- if (dir) {
- return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
- } else {
- return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
- }
- }
- return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
- }
-
- throw new TypeError('val must be string, number or Buffer')
-}
-
-function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
- var indexSize = 1
- var arrLength = arr.length
- var valLength = val.length
-
- if (encoding !== undefined) {
- encoding = String(encoding).toLowerCase()
- if (encoding === 'ucs2' || encoding === 'ucs-2' ||
- encoding === 'utf16le' || encoding === 'utf-16le') {
- if (arr.length < 2 || val.length < 2) {
- return -1
- }
- indexSize = 2
- arrLength /= 2
- valLength /= 2
- byteOffset /= 2
- }
- }
-
- function read (buf, i) {
- if (indexSize === 1) {
- return buf[i]
- } else {
- return buf.readUInt16BE(i * indexSize)
- }
- }
-
- var i
- if (dir) {
- var foundIndex = -1
- for (i = byteOffset; i < arrLength; i++) {
- if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
- if (foundIndex === -1) foundIndex = i
- if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
- } else {
- if (foundIndex !== -1) i -= i - foundIndex
- foundIndex = -1
- }
- }
- } else {
- if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
- for (i = byteOffset; i >= 0; i--) {
- var found = true
- for (var j = 0; j < valLength; j++) {
- if (read(arr, i + j) !== read(val, j)) {
- found = false
- break
- }
- }
- if (found) return i
- }
- }
-
- return -1
-}
-
-Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
- return this.indexOf(val, byteOffset, encoding) !== -1
-}
-
-Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
- return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
-}
-
-Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
- return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
-}
-
-function hexWrite (buf, string, offset, length) {
- offset = Number(offset) || 0
- var remaining = buf.length - offset
- if (!length) {
- length = remaining
- } else {
- length = Number(length)
- if (length > remaining) {
- length = remaining
- }
- }
-
- // must be an even number of digits
- var strLen = string.length
- if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')
-
- if (length > strLen / 2) {
- length = strLen / 2
- }
- for (var i = 0; i < length; ++i) {
- var parsed = parseInt(string.substr(i * 2, 2), 16)
- if (isNaN(parsed)) return i
- buf[offset + i] = parsed
- }
- return i
-}
-
-function utf8Write (buf, string, offset, length) {
- return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
-}
-
-function asciiWrite (buf, string, offset, length) {
- return blitBuffer(asciiToBytes(string), buf, offset, length)
-}
-
-function latin1Write (buf, string, offset, length) {
- return asciiWrite(buf, string, offset, length)
-}
-
-function base64Write (buf, string, offset, length) {
- return blitBuffer(base64ToBytes(string), buf, offset, length)
-}
-
-function ucs2Write (buf, string, offset, length) {
- return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
-}
-
-Buffer.prototype.write = function write (string, offset, length, encoding) {
- // Buffer#write(string)
- if (offset === undefined) {
- encoding = 'utf8'
- length = this.length
- offset = 0
- // Buffer#write(string, encoding)
- } else if (length === undefined && typeof offset === 'string') {
- encoding = offset
- length = this.length
- offset = 0
- // Buffer#write(string, offset[, length][, encoding])
- } else if (isFinite(offset)) {
- offset = offset | 0
- if (isFinite(length)) {
- length = length | 0
- if (encoding === undefined) encoding = 'utf8'
- } else {
- encoding = length
- length = undefined
- }
- // legacy write(string, encoding, offset, length) - remove in v0.13
- } else {
- throw new Error(
- 'Buffer.write(string, encoding, offset[, length]) is no longer supported'
- )
- }
-
- var remaining = this.length - offset
- if (length === undefined || length > remaining) length = remaining
-
- if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
- throw new RangeError('Attempt to write outside buffer bounds')
- }
-
- if (!encoding) encoding = 'utf8'
-
- var loweredCase = false
- for (;;) {
- switch (encoding) {
- case 'hex':
- return hexWrite(this, string, offset, length)
-
- case 'utf8':
- case 'utf-8':
- return utf8Write(this, string, offset, length)
-
- case 'ascii':
- return asciiWrite(this, string, offset, length)
-
- case 'latin1':
- case 'binary':
- return latin1Write(this, string, offset, length)
-
- case 'base64':
- // Warning: maxLength not taken into account in base64Write
- return base64Write(this, string, offset, length)
-
- case 'ucs2':
- case 'ucs-2':
- case 'utf16le':
- case 'utf-16le':
- return ucs2Write(this, string, offset, length)
-
- default:
- if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
- encoding = ('' + encoding).toLowerCase()
- loweredCase = true
- }
- }
-}
-
-Buffer.prototype.toJSON = function toJSON () {
- return {
- type: 'Buffer',
- data: Array.prototype.slice.call(this._arr || this, 0)
- }
-}
-
-function base64Slice (buf, start, end) {
- if (start === 0 && end === buf.length) {
- return base64.fromByteArray(buf)
- } else {
- return base64.fromByteArray(buf.slice(start, end))
- }
-}
-
-function utf8Slice (buf, start, end) {
- end = Math.min(buf.length, end)
- var res = []
-
- var i = start
- while (i < end) {
- var firstByte = buf[i]
- var codePoint = null
- var bytesPerSequence = (firstByte > 0xEF) ? 4
- : (firstByte > 0xDF) ? 3
- : (firstByte > 0xBF) ? 2
- : 1
-
- if (i + bytesPerSequence <= end) {
- var secondByte, thirdByte, fourthByte, tempCodePoint
-
- switch (bytesPerSequence) {
- case 1:
- if (firstByte < 0x80) {
- codePoint = firstByte
- }
- break
- case 2:
- secondByte = buf[i + 1]
- if ((secondByte & 0xC0) === 0x80) {
- tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
- if (tempCodePoint > 0x7F) {
- codePoint = tempCodePoint
- }
- }
- break
- case 3:
- secondByte = buf[i + 1]
- thirdByte = buf[i + 2]
- if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
- tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
- if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
- codePoint = tempCodePoint
- }
- }
- break
- case 4:
- secondByte = buf[i + 1]
- thirdByte = buf[i + 2]
- fourthByte = buf[i + 3]
- if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
- tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
- if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
- codePoint = tempCodePoint
- }
- }
- }
- }
-
- if (codePoint === null) {
- // we did not generate a valid codePoint so insert a
- // replacement char (U+FFFD) and advance only 1 byte
- codePoint = 0xFFFD
- bytesPerSequence = 1
- } else if (codePoint > 0xFFFF) {
- // encode to utf16 (surrogate pair dance)
- codePoint -= 0x10000
- res.push(codePoint >>> 10 & 0x3FF | 0xD800)
- codePoint = 0xDC00 | codePoint & 0x3FF
- }
-
- res.push(codePoint)
- i += bytesPerSequence
- }
-
- return decodeCodePointsArray(res)
-}
-
-// Based on http://stackoverflow.com/a/22747272/680742, the browser with
-// the lowest limit is Chrome, with 0x10000 args.
-// We go 1 magnitude less, for safety
-var MAX_ARGUMENTS_LENGTH = 0x1000
-
-function decodeCodePointsArray (codePoints) {
- var len = codePoints.length
- if (len <= MAX_ARGUMENTS_LENGTH) {
- return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
- }
-
- // Decode in chunks to avoid "call stack size exceeded".
- var res = ''
- var i = 0
- while (i < len) {
- res += String.fromCharCode.apply(
- String,
- codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
- )
- }
- return res
-}
-
-function asciiSlice (buf, start, end) {
- var ret = ''
- end = Math.min(buf.length, end)
-
- for (var i = start; i < end; ++i) {
- ret += String.fromCharCode(buf[i] & 0x7F)
- }
- return ret
-}
-
-function latin1Slice (buf, start, end) {
- var ret = ''
- end = Math.min(buf.length, end)
-
- for (var i = start; i < end; ++i) {
- ret += String.fromCharCode(buf[i])
- }
- return ret
-}
-
-function hexSlice (buf, start, end) {
- var len = buf.length
-
- if (!start || start < 0) start = 0
- if (!end || end < 0 || end > len) end = len
-
- var out = ''
- for (var i = start; i < end; ++i) {
- out += toHex(buf[i])
- }
- return out
-}
-
-function utf16leSlice (buf, start, end) {
- var bytes = buf.slice(start, end)
- var res = ''
- for (var i = 0; i < bytes.length; i += 2) {
- res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
- }
- return res
-}
-
-Buffer.prototype.slice = function slice (start, end) {
- var len = this.length
- start = ~~start
- end = end === undefined ? len : ~~end
-
- if (start < 0) {
- start += len
- if (start < 0) start = 0
- } else if (start > len) {
- start = len
- }
-
- if (end < 0) {
- end += len
- if (end < 0) end = 0
- } else if (end > len) {
- end = len
- }
-
- if (end < start) end = start
-
- var newBuf
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- newBuf = this.subarray(start, end)
- newBuf.__proto__ = Buffer.prototype
- } else {
- var sliceLen = end - start
- newBuf = new Buffer(sliceLen, undefined)
- for (var i = 0; i < sliceLen; ++i) {
- newBuf[i] = this[i + start]
- }
- }
-
- return newBuf
-}
-
-/*
- * Need to make sure that buffer isn't trying to write out of bounds.
- */
-function checkOffset (offset, ext, length) {
- if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
- if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
-}
-
-Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
- offset = offset | 0
- byteLength = byteLength | 0
- if (!noAssert) checkOffset(offset, byteLength, this.length)
-
- var val = this[offset]
- var mul = 1
- var i = 0
- while (++i < byteLength && (mul *= 0x100)) {
- val += this[offset + i] * mul
- }
-
- return val
-}
-
-Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
- offset = offset | 0
- byteLength = byteLength | 0
- if (!noAssert) {
- checkOffset(offset, byteLength, this.length)
- }
-
- var val = this[offset + --byteLength]
- var mul = 1
- while (byteLength > 0 && (mul *= 0x100)) {
- val += this[offset + --byteLength] * mul
- }
-
- return val
-}
-
-Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 1, this.length)
- return this[offset]
-}
-
-Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 2, this.length)
- return this[offset] | (this[offset + 1] << 8)
-}
-
-Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 2, this.length)
- return (this[offset] << 8) | this[offset + 1]
-}
-
-Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 4, this.length)
-
- return ((this[offset]) |
- (this[offset + 1] << 8) |
- (this[offset + 2] << 16)) +
- (this[offset + 3] * 0x1000000)
-}
-
-Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 4, this.length)
-
- return (this[offset] * 0x1000000) +
- ((this[offset + 1] << 16) |
- (this[offset + 2] << 8) |
- this[offset + 3])
-}
-
-Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
- offset = offset | 0
- byteLength = byteLength | 0
- if (!noAssert) checkOffset(offset, byteLength, this.length)
-
- var val = this[offset]
- var mul = 1
- var i = 0
- while (++i < byteLength && (mul *= 0x100)) {
- val += this[offset + i] * mul
- }
- mul *= 0x80
-
- if (val >= mul) val -= Math.pow(2, 8 * byteLength)
-
- return val
-}
-
-Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
- offset = offset | 0
- byteLength = byteLength | 0
- if (!noAssert) checkOffset(offset, byteLength, this.length)
-
- var i = byteLength
- var mul = 1
- var val = this[offset + --i]
- while (i > 0 && (mul *= 0x100)) {
- val += this[offset + --i] * mul
- }
- mul *= 0x80
-
- if (val >= mul) val -= Math.pow(2, 8 * byteLength)
-
- return val
-}
-
-Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 1, this.length)
- if (!(this[offset] & 0x80)) return (this[offset])
- return ((0xff - this[offset] + 1) * -1)
-}
-
-Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 2, this.length)
- var val = this[offset] | (this[offset + 1] << 8)
- return (val & 0x8000) ? val | 0xFFFF0000 : val
-}
-
-Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 2, this.length)
- var val = this[offset + 1] | (this[offset] << 8)
- return (val & 0x8000) ? val | 0xFFFF0000 : val
-}
-
-Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 4, this.length)
-
- return (this[offset]) |
- (this[offset + 1] << 8) |
- (this[offset + 2] << 16) |
- (this[offset + 3] << 24)
-}
-
-Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 4, this.length)
-
- return (this[offset] << 24) |
- (this[offset + 1] << 16) |
- (this[offset + 2] << 8) |
- (this[offset + 3])
-}
-
-Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 4, this.length)
- return ieee754.read(this, offset, true, 23, 4)
-}
-
-Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 4, this.length)
- return ieee754.read(this, offset, false, 23, 4)
-}
-
-Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 8, this.length)
- return ieee754.read(this, offset, true, 52, 8)
-}
-
-Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
- if (!noAssert) checkOffset(offset, 8, this.length)
- return ieee754.read(this, offset, false, 52, 8)
-}
-
-function checkInt (buf, value, offset, ext, max, min) {
- if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
- if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
- if (offset + ext > buf.length) throw new RangeError('Index out of range')
-}
-
-Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
- value = +value
- offset = offset | 0
- byteLength = byteLength | 0
- if (!noAssert) {
- var maxBytes = Math.pow(2, 8 * byteLength) - 1
- checkInt(this, value, offset, byteLength, maxBytes, 0)
- }
-
- var mul = 1
- var i = 0
- this[offset] = value & 0xFF
- while (++i < byteLength && (mul *= 0x100)) {
- this[offset + i] = (value / mul) & 0xFF
- }
-
- return offset + byteLength
-}
-
-Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
- value = +value
- offset = offset | 0
- byteLength = byteLength | 0
- if (!noAssert) {
- var maxBytes = Math.pow(2, 8 * byteLength) - 1
- checkInt(this, value, offset, byteLength, maxBytes, 0)
- }
-
- var i = byteLength - 1
- var mul = 1
- this[offset + i] = value & 0xFF
- while (--i >= 0 && (mul *= 0x100)) {
- this[offset + i] = (value / mul) & 0xFF
- }
-
- return offset + byteLength
-}
-
-Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
- if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
- this[offset] = (value & 0xff)
- return offset + 1
-}
-
-function objectWriteUInt16 (buf, value, offset, littleEndian) {
- if (value < 0) value = 0xffff + value + 1
- for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
- buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
- (littleEndian ? i : 1 - i) * 8
- }
-}
-
-Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- this[offset] = (value & 0xff)
- this[offset + 1] = (value >>> 8)
- } else {
- objectWriteUInt16(this, value, offset, true)
- }
- return offset + 2
-}
-
-Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- this[offset] = (value >>> 8)
- this[offset + 1] = (value & 0xff)
- } else {
- objectWriteUInt16(this, value, offset, false)
- }
- return offset + 2
-}
-
-function objectWriteUInt32 (buf, value, offset, littleEndian) {
- if (value < 0) value = 0xffffffff + value + 1
- for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
- buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
- }
-}
-
-Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- this[offset + 3] = (value >>> 24)
- this[offset + 2] = (value >>> 16)
- this[offset + 1] = (value >>> 8)
- this[offset] = (value & 0xff)
- } else {
- objectWriteUInt32(this, value, offset, true)
- }
- return offset + 4
-}
-
-Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- this[offset] = (value >>> 24)
- this[offset + 1] = (value >>> 16)
- this[offset + 2] = (value >>> 8)
- this[offset + 3] = (value & 0xff)
- } else {
- objectWriteUInt32(this, value, offset, false)
- }
- return offset + 4
-}
-
-Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) {
- var limit = Math.pow(2, 8 * byteLength - 1)
-
- checkInt(this, value, offset, byteLength, limit - 1, -limit)
- }
-
- var i = 0
- var mul = 1
- var sub = 0
- this[offset] = value & 0xFF
- while (++i < byteLength && (mul *= 0x100)) {
- if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
- sub = 1
- }
- this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
- }
-
- return offset + byteLength
-}
-
-Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) {
- var limit = Math.pow(2, 8 * byteLength - 1)
-
- checkInt(this, value, offset, byteLength, limit - 1, -limit)
- }
-
- var i = byteLength - 1
- var mul = 1
- var sub = 0
- this[offset + i] = value & 0xFF
- while (--i >= 0 && (mul *= 0x100)) {
- if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
- sub = 1
- }
- this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
- }
-
- return offset + byteLength
-}
-
-Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
- if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
- if (value < 0) value = 0xff + value + 1
- this[offset] = (value & 0xff)
- return offset + 1
-}
-
-Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- this[offset] = (value & 0xff)
- this[offset + 1] = (value >>> 8)
- } else {
- objectWriteUInt16(this, value, offset, true)
- }
- return offset + 2
-}
-
-Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- this[offset] = (value >>> 8)
- this[offset + 1] = (value & 0xff)
- } else {
- objectWriteUInt16(this, value, offset, false)
- }
- return offset + 2
-}
-
-Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- this[offset] = (value & 0xff)
- this[offset + 1] = (value >>> 8)
- this[offset + 2] = (value >>> 16)
- this[offset + 3] = (value >>> 24)
- } else {
- objectWriteUInt32(this, value, offset, true)
- }
- return offset + 4
-}
-
-Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
- value = +value
- offset = offset | 0
- if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
- if (value < 0) value = 0xffffffff + value + 1
- if (Buffer.TYPED_ARRAY_SUPPORT) {
- this[offset] = (value >>> 24)
- this[offset + 1] = (value >>> 16)
- this[offset + 2] = (value >>> 8)
- this[offset + 3] = (value & 0xff)
- } else {
- objectWriteUInt32(this, value, offset, false)
- }
- return offset + 4
-}
-
-function checkIEEE754 (buf, value, offset, ext, max, min) {
- if (offset + ext > buf.length) throw new RangeError('Index out of range')
- if (offset < 0) throw new RangeError('Index out of range')
-}
-
-function writeFloat (buf, value, offset, littleEndian, noAssert) {
- if (!noAssert) {
- checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
- }
- ieee754.write(buf, value, offset, littleEndian, 23, 4)
- return offset + 4
-}
-
-Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
- return writeFloat(this, value, offset, true, noAssert)
-}
-
-Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
- return writeFloat(this, value, offset, false, noAssert)
-}
-
-function writeDouble (buf, value, offset, littleEndian, noAssert) {
- if (!noAssert) {
- checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
- }
- ieee754.write(buf, value, offset, littleEndian, 52, 8)
- return offset + 8
-}
-
-Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
- return writeDouble(this, value, offset, true, noAssert)
-}
-
-Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
- return writeDouble(this, value, offset, false, noAssert)
-}
-
-// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
-Buffer.prototype.copy = function copy (target, targetStart, start, end) {
- if (!start) start = 0
- if (!end && end !== 0) end = this.length
- if (targetStart >= target.length) targetStart = target.length
- if (!targetStart) targetStart = 0
- if (end > 0 && end < start) end = start
-
- // Copy 0 bytes; we're done
- if (end === start) return 0
- if (target.length === 0 || this.length === 0) return 0
-
- // Fatal error conditions
- if (targetStart < 0) {
- throw new RangeError('targetStart out of bounds')
- }
- if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
- if (end < 0) throw new RangeError('sourceEnd out of bounds')
-
- // Are we oob?
- if (end > this.length) end = this.length
- if (target.length - targetStart < end - start) {
- end = target.length - targetStart + start
- }
-
- var len = end - start
- var i
-
- if (this === target && start < targetStart && targetStart < end) {
- // descending copy from end
- for (i = len - 1; i >= 0; --i) {
- target[i + targetStart] = this[i + start]
- }
- } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
- // ascending copy from start
- for (i = 0; i < len; ++i) {
- target[i + targetStart] = this[i + start]
- }
- } else {
- Uint8Array.prototype.set.call(
- target,
- this.subarray(start, start + len),
- targetStart
- )
- }
-
- return len
-}
-
-// Usage:
-// buffer.fill(number[, offset[, end]])
-// buffer.fill(buffer[, offset[, end]])
-// buffer.fill(string[, offset[, end]][, encoding])
-Buffer.prototype.fill = function fill (val, start, end, encoding) {
- // Handle string cases:
- if (typeof val === 'string') {
- if (typeof start === 'string') {
- encoding = start
- start = 0
- end = this.length
- } else if (typeof end === 'string') {
- encoding = end
- end = this.length
- }
- if (val.length === 1) {
- var code = val.charCodeAt(0)
- if (code < 256) {
- val = code
- }
- }
- if (encoding !== undefined && typeof encoding !== 'string') {
- throw new TypeError('encoding must be a string')
- }
- if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
- throw new TypeError('Unknown encoding: ' + encoding)
- }
- } else if (typeof val === 'number') {
- val = val & 255
- }
-
- // Invalid ranges are not set to a default, so can range check early.
- if (start < 0 || this.length < start || this.length < end) {
- throw new RangeError('Out of range index')
- }
-
- if (end <= start) {
- return this
- }
-
- start = start >>> 0
- end = end === undefined ? this.length : end >>> 0
-
- if (!val) val = 0
-
- var i
- if (typeof val === 'number') {
- for (i = start; i < end; ++i) {
- this[i] = val
- }
- } else {
- var bytes = Buffer.isBuffer(val)
- ? val
- : utf8ToBytes(new Buffer(val, encoding).toString())
- var len = bytes.length
- for (i = 0; i < end - start; ++i) {
- this[i + start] = bytes[i % len]
- }
- }
-
- return this
-}
-
-// HELPER FUNCTIONS
-// ================
-
-var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g
-
-function base64clean (str) {
- // Node strips out invalid characters like \n and \t from the string, base64-js does not
- str = stringtrim(str).replace(INVALID_BASE64_RE, '')
- // Node converts strings with length < 2 to ''
- if (str.length < 2) return ''
- // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
- while (str.length % 4 !== 0) {
- str = str + '='
- }
- return str
-}
-
-function stringtrim (str) {
- if (str.trim) return str.trim()
- return str.replace(/^\s+|\s+$/g, '')
-}
-
-function toHex (n) {
- if (n < 16) return '0' + n.toString(16)
- return n.toString(16)
-}
-
-function utf8ToBytes (string, units) {
- units = units || Infinity
- var codePoint
- var length = string.length
- var leadSurrogate = null
- var bytes = []
-
- for (var i = 0; i < length; ++i) {
- codePoint = string.charCodeAt(i)
-
- // is surrogate component
- if (codePoint > 0xD7FF && codePoint < 0xE000) {
- // last char was a lead
- if (!leadSurrogate) {
- // no lead yet
- if (codePoint > 0xDBFF) {
- // unexpected trail
- if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
- continue
- } else if (i + 1 === length) {
- // unpaired lead
- if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
- continue
- }
-
- // valid lead
- leadSurrogate = codePoint
-
- continue
- }
-
- // 2 leads in a row
- if (codePoint < 0xDC00) {
- if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
- leadSurrogate = codePoint
- continue
- }
-
- // valid surrogate pair
- codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
- } else if (leadSurrogate) {
- // valid bmp char, but last char was a lead
- if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
- }
-
- leadSurrogate = null
-
- // encode utf8
- if (codePoint < 0x80) {
- if ((units -= 1) < 0) break
- bytes.push(codePoint)
- } else if (codePoint < 0x800) {
- if ((units -= 2) < 0) break
- bytes.push(
- codePoint >> 0x6 | 0xC0,
- codePoint & 0x3F | 0x80
- )
- } else if (codePoint < 0x10000) {
- if ((units -= 3) < 0) break
- bytes.push(
- codePoint >> 0xC | 0xE0,
- codePoint >> 0x6 & 0x3F | 0x80,
- codePoint & 0x3F | 0x80
- )
- } else if (codePoint < 0x110000) {
- if ((units -= 4) < 0) break
- bytes.push(
- codePoint >> 0x12 | 0xF0,
- codePoint >> 0xC & 0x3F | 0x80,
- codePoint >> 0x6 & 0x3F | 0x80,
- codePoint & 0x3F | 0x80
- )
- } else {
- throw new Error('Invalid code point')
- }
- }
-
- return bytes
-}
-
-function asciiToBytes (str) {
- var byteArray = []
- for (var i = 0; i < str.length; ++i) {
- // Node's code seems to be doing this and not & 0x7F..
- byteArray.push(str.charCodeAt(i) & 0xFF)
- }
- return byteArray
-}
-
-function utf16leToBytes (str, units) {
- var c, hi, lo
- var byteArray = []
- for (var i = 0; i < str.length; ++i) {
- if ((units -= 2) < 0) break
-
- c = str.charCodeAt(i)
- hi = c >> 8
- lo = c % 256
- byteArray.push(lo)
- byteArray.push(hi)
- }
-
- return byteArray
-}
-
-function base64ToBytes (str) {
- return base64.toByteArray(base64clean(str))
-}
-
-function blitBuffer (src, dst, offset, length) {
- for (var i = 0; i < length; ++i) {
- if ((i + offset >= dst.length) || (i >= src.length)) break
- dst[i + offset] = src[i]
- }
- return i
-}
-
-function isnan (val) {
- return val !== val // eslint-disable-line no-self-compare
-}
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"base64-js":39,"ieee754":50,"isarray":53}],45:[function(require,module,exports){
-(function (Buffer){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// NOTE: These type checking functions intentionally don't use `instanceof`
-// because it is fragile and can be easily faked with `Object.create()`.
-
-function isArray(arg) {
- if (Array.isArray) {
- return Array.isArray(arg);
- }
- return objectToString(arg) === '[object Array]';
-}
-exports.isArray = isArray;
-
-function isBoolean(arg) {
- return typeof arg === 'boolean';
-}
-exports.isBoolean = isBoolean;
-
-function isNull(arg) {
- return arg === null;
-}
-exports.isNull = isNull;
-
-function isNullOrUndefined(arg) {
- return arg == null;
-}
-exports.isNullOrUndefined = isNullOrUndefined;
-
-function isNumber(arg) {
- return typeof arg === 'number';
-}
-exports.isNumber = isNumber;
-
-function isString(arg) {
- return typeof arg === 'string';
-}
-exports.isString = isString;
-
-function isSymbol(arg) {
- return typeof arg === 'symbol';
-}
-exports.isSymbol = isSymbol;
-
-function isUndefined(arg) {
- return arg === void 0;
-}
-exports.isUndefined = isUndefined;
-
-function isRegExp(re) {
- return objectToString(re) === '[object RegExp]';
-}
-exports.isRegExp = isRegExp;
-
-function isObject(arg) {
- return typeof arg === 'object' && arg !== null;
-}
-exports.isObject = isObject;
-
-function isDate(d) {
- return objectToString(d) === '[object Date]';
-}
-exports.isDate = isDate;
-
-function isError(e) {
- return (objectToString(e) === '[object Error]' || e instanceof Error);
-}
-exports.isError = isError;
-
-function isFunction(arg) {
- return typeof arg === 'function';
-}
-exports.isFunction = isFunction;
-
-function isPrimitive(arg) {
- return arg === null ||
- typeof arg === 'boolean' ||
- typeof arg === 'number' ||
- typeof arg === 'string' ||
- typeof arg === 'symbol' || // ES6 symbol
- typeof arg === 'undefined';
-}
-exports.isPrimitive = isPrimitive;
-
-exports.isBuffer = Buffer.isBuffer;
-
-function objectToString(o) {
- return Object.prototype.toString.call(o);
-}
-
-}).call(this,{"isBuffer":require("../../is-buffer/index.js")})
-},{"../../is-buffer/index.js":52}],46:[function(require,module,exports){
-/* See LICENSE file for terms of use */
-
-/*
- * Text diff implementation.
- *
- * This library supports the following APIS:
- * JsDiff.diffChars: Character by character diff
- * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace
- * JsDiff.diffLines: Line based diff
- *
- * JsDiff.diffCss: Diff targeted at CSS content
- *
- * These methods are based on the implementation proposed in
- * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986).
- * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927
- */
-(function(global, undefined) {
- var objectPrototypeToString = Object.prototype.toString;
-
- /*istanbul ignore next*/
- function map(arr, mapper, that) {
- if (Array.prototype.map) {
- return Array.prototype.map.call(arr, mapper, that);
- }
-
- var other = new Array(arr.length);
-
- for (var i = 0, n = arr.length; i < n; i++) {
- other[i] = mapper.call(that, arr[i], i, arr);
- }
- return other;
- }
- function clonePath(path) {
- return { newPos: path.newPos, components: path.components.slice(0) };
- }
- function removeEmpty(array) {
- var ret = [];
- for (var i = 0; i < array.length; i++) {
- if (array[i]) {
- ret.push(array[i]);
- }
- }
- return ret;
- }
- function escapeHTML(s) {
- var n = s;
- n = n.replace(/&/g, '&');
- n = n.replace(//g, '>');
- n = n.replace(/"/g, '"');
-
- return n;
- }
-
- // This function handles the presence of circular references by bailing out when encountering an
- // object that is already on the "stack" of items being processed.
- function canonicalize(obj, stack, replacementStack) {
- stack = stack || [];
- replacementStack = replacementStack || [];
-
- var i;
-
- for (i = 0; i < stack.length; i += 1) {
- if (stack[i] === obj) {
- return replacementStack[i];
- }
- }
-
- var canonicalizedObj;
-
- if ('[object Array]' === objectPrototypeToString.call(obj)) {
- stack.push(obj);
- canonicalizedObj = new Array(obj.length);
- replacementStack.push(canonicalizedObj);
- for (i = 0; i < obj.length; i += 1) {
- canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack);
- }
- stack.pop();
- replacementStack.pop();
- } else if (typeof obj === 'object' && obj !== null) {
- stack.push(obj);
- canonicalizedObj = {};
- replacementStack.push(canonicalizedObj);
- var sortedKeys = [],
- key;
- for (key in obj) {
- sortedKeys.push(key);
- }
- sortedKeys.sort();
- for (i = 0; i < sortedKeys.length; i += 1) {
- key = sortedKeys[i];
- canonicalizedObj[key] = canonicalize(obj[key], stack, replacementStack);
- }
- stack.pop();
- replacementStack.pop();
- } else {
- canonicalizedObj = obj;
- }
- return canonicalizedObj;
- }
-
- function buildValues(components, newString, oldString, useLongestToken) {
- var componentPos = 0,
- componentLen = components.length,
- newPos = 0,
- oldPos = 0;
-
- for (; componentPos < componentLen; componentPos++) {
- var component = components[componentPos];
- if (!component.removed) {
- if (!component.added && useLongestToken) {
- var value = newString.slice(newPos, newPos + component.count);
- value = map(value, function(value, i) {
- var oldValue = oldString[oldPos + i];
- return oldValue.length > value.length ? oldValue : value;
- });
-
- component.value = value.join('');
- } else {
- component.value = newString.slice(newPos, newPos + component.count).join('');
- }
- newPos += component.count;
-
- // Common case
- if (!component.added) {
- oldPos += component.count;
- }
- } else {
- component.value = oldString.slice(oldPos, oldPos + component.count).join('');
- oldPos += component.count;
-
- // Reverse add and remove so removes are output first to match common convention
- // The diffing algorithm is tied to add then remove output and this is the simplest
- // route to get the desired output with minimal overhead.
- if (componentPos && components[componentPos - 1].added) {
- var tmp = components[componentPos - 1];
- components[componentPos - 1] = components[componentPos];
- components[componentPos] = tmp;
- }
- }
- }
-
- return components;
- }
-
- function Diff(ignoreWhitespace) {
- this.ignoreWhitespace = ignoreWhitespace;
- }
- Diff.prototype = {
- diff: function(oldString, newString, callback) {
- var self = this;
-
- function done(value) {
- if (callback) {
- setTimeout(function() { callback(undefined, value); }, 0);
- return true;
- } else {
- return value;
- }
- }
-
- // Handle the identity case (this is due to unrolling editLength == 0
- if (newString === oldString) {
- return done([{ value: newString }]);
- }
- if (!newString) {
- return done([{ value: oldString, removed: true }]);
- }
- if (!oldString) {
- return done([{ value: newString, added: true }]);
- }
-
- newString = this.tokenize(newString);
- oldString = this.tokenize(oldString);
-
- var newLen = newString.length, oldLen = oldString.length;
- var editLength = 1;
- var maxEditLength = newLen + oldLen;
- var bestPath = [{ newPos: -1, components: [] }];
-
- // Seed editLength = 0, i.e. the content starts with the same values
- var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);
- if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) {
- // Identity per the equality and tokenizer
- return done([{value: newString.join('')}]);
- }
-
- // Main worker method. checks all permutations of a given edit length for acceptance.
- function execEditLength() {
- for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) {
- var basePath;
- var addPath = bestPath[diagonalPath - 1],
- removePath = bestPath[diagonalPath + 1],
- oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;
- if (addPath) {
- // No one else is going to attempt to use this value, clear it
- bestPath[diagonalPath - 1] = undefined;
- }
-
- var canAdd = addPath && addPath.newPos + 1 < newLen,
- canRemove = removePath && 0 <= oldPos && oldPos < oldLen;
- if (!canAdd && !canRemove) {
- // If this path is a terminal then prune
- bestPath[diagonalPath] = undefined;
- continue;
- }
-
- // Select the diagonal that we want to branch from. We select the prior
- // path whose position in the new string is the farthest from the origin
- // and does not pass the bounds of the diff graph
- if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) {
- basePath = clonePath(removePath);
- self.pushComponent(basePath.components, undefined, true);
- } else {
- basePath = addPath; // No need to clone, we've pulled it from the list
- basePath.newPos++;
- self.pushComponent(basePath.components, true, undefined);
- }
-
- oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath);
-
- // If we have hit the end of both strings, then we are done
- if (basePath.newPos + 1 >= newLen && oldPos + 1 >= oldLen) {
- return done(buildValues(basePath.components, newString, oldString, self.useLongestToken));
- } else {
- // Otherwise track this path as a potential candidate and continue.
- bestPath[diagonalPath] = basePath;
- }
- }
-
- editLength++;
- }
-
- // Performs the length of edit iteration. Is a bit fugly as this has to support the
- // sync and async mode which is never fun. Loops over execEditLength until a value
- // is produced.
- if (callback) {
- (function exec() {
- setTimeout(function() {
- // This should not happen, but we want to be safe.
- /*istanbul ignore next */
- if (editLength > maxEditLength) {
- return callback();
- }
-
- if (!execEditLength()) {
- exec();
- }
- }, 0);
- }());
- } else {
- while (editLength <= maxEditLength) {
- var ret = execEditLength();
- if (ret) {
- return ret;
- }
- }
- }
- },
-
- pushComponent: function(components, added, removed) {
- var last = components[components.length - 1];
- if (last && last.added === added && last.removed === removed) {
- // We need to clone here as the component clone operation is just
- // as shallow array clone
- components[components.length - 1] = {count: last.count + 1, added: added, removed: removed };
- } else {
- components.push({count: 1, added: added, removed: removed });
- }
- },
- extractCommon: function(basePath, newString, oldString, diagonalPath) {
- var newLen = newString.length,
- oldLen = oldString.length,
- newPos = basePath.newPos,
- oldPos = newPos - diagonalPath,
-
- commonCount = 0;
- while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) {
- newPos++;
- oldPos++;
- commonCount++;
- }
-
- if (commonCount) {
- basePath.components.push({count: commonCount});
- }
-
- basePath.newPos = newPos;
- return oldPos;
- },
-
- equals: function(left, right) {
- var reWhitespace = /\S/;
- return left === right || (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right));
- },
- tokenize: function(value) {
- return value.split('');
- }
- };
-
- var CharDiff = new Diff();
-
- var WordDiff = new Diff(true);
- var WordWithSpaceDiff = new Diff();
- WordDiff.tokenize = WordWithSpaceDiff.tokenize = function(value) {
- return removeEmpty(value.split(/(\s+|\b)/));
- };
-
- var CssDiff = new Diff(true);
- CssDiff.tokenize = function(value) {
- return removeEmpty(value.split(/([{}:;,]|\s+)/));
- };
-
- var LineDiff = new Diff();
-
- var TrimmedLineDiff = new Diff();
- TrimmedLineDiff.ignoreTrim = true;
-
- LineDiff.tokenize = TrimmedLineDiff.tokenize = function(value) {
- var retLines = [],
- lines = value.split(/^/m);
- for (var i = 0; i < lines.length; i++) {
- var line = lines[i],
- lastLine = lines[i - 1],
- lastLineLastChar = lastLine && lastLine[lastLine.length - 1];
-
- // Merge lines that may contain windows new lines
- if (line === '\n' && lastLineLastChar === '\r') {
- retLines[retLines.length - 1] = retLines[retLines.length - 1].slice(0, -1) + '\r\n';
- } else {
- if (this.ignoreTrim) {
- line = line.trim();
- // add a newline unless this is the last line.
- if (i < lines.length - 1) {
- line += '\n';
- }
- }
- retLines.push(line);
- }
- }
-
- return retLines;
- };
-
- var PatchDiff = new Diff();
- PatchDiff.tokenize = function(value) {
- var ret = [],
- linesAndNewlines = value.split(/(\n|\r\n)/);
-
- // Ignore the final empty token that occurs if the string ends with a new line
- if (!linesAndNewlines[linesAndNewlines.length - 1]) {
- linesAndNewlines.pop();
- }
-
- // Merge the content and line separators into single tokens
- for (var i = 0; i < linesAndNewlines.length; i++) {
- var line = linesAndNewlines[i];
-
- if (i % 2) {
- ret[ret.length - 1] += line;
- } else {
- ret.push(line);
- }
- }
- return ret;
- };
-
- var SentenceDiff = new Diff();
- SentenceDiff.tokenize = function(value) {
- return removeEmpty(value.split(/(\S.+?[.!?])(?=\s+|$)/));
- };
-
- var JsonDiff = new Diff();
- // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a
- // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:
- JsonDiff.useLongestToken = true;
- JsonDiff.tokenize = LineDiff.tokenize;
- JsonDiff.equals = function(left, right) {
- return LineDiff.equals(left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1'));
- };
-
- var JsDiff = {
- Diff: Diff,
-
- diffChars: function(oldStr, newStr, callback) { return CharDiff.diff(oldStr, newStr, callback); },
- diffWords: function(oldStr, newStr, callback) { return WordDiff.diff(oldStr, newStr, callback); },
- diffWordsWithSpace: function(oldStr, newStr, callback) { return WordWithSpaceDiff.diff(oldStr, newStr, callback); },
- diffLines: function(oldStr, newStr, callback) { return LineDiff.diff(oldStr, newStr, callback); },
- diffTrimmedLines: function(oldStr, newStr, callback) { return TrimmedLineDiff.diff(oldStr, newStr, callback); },
-
- diffSentences: function(oldStr, newStr, callback) { return SentenceDiff.diff(oldStr, newStr, callback); },
-
- diffCss: function(oldStr, newStr, callback) { return CssDiff.diff(oldStr, newStr, callback); },
- diffJson: function(oldObj, newObj, callback) {
- return JsonDiff.diff(
- typeof oldObj === 'string' ? oldObj : JSON.stringify(canonicalize(oldObj), undefined, ' '),
- typeof newObj === 'string' ? newObj : JSON.stringify(canonicalize(newObj), undefined, ' '),
- callback
- );
- },
-
- createTwoFilesPatch: function(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader) {
- var ret = [];
-
- if (oldFileName == newFileName) {
- ret.push('Index: ' + oldFileName);
- }
- ret.push('===================================================================');
- ret.push('--- ' + oldFileName + (typeof oldHeader === 'undefined' ? '' : '\t' + oldHeader));
- ret.push('+++ ' + newFileName + (typeof newHeader === 'undefined' ? '' : '\t' + newHeader));
-
- var diff = PatchDiff.diff(oldStr, newStr);
- diff.push({value: '', lines: []}); // Append an empty value to make cleanup easier
-
- // Formats a given set of lines for printing as context lines in a patch
- function contextLines(lines) {
- return map(lines, function(entry) { return ' ' + entry; });
- }
-
- // Outputs the no newline at end of file warning if needed
- function eofNL(curRange, i, current) {
- var last = diff[diff.length - 2],
- isLast = i === diff.length - 2,
- isLastOfType = i === diff.length - 3 && current.added !== last.added;
-
- // Figure out if this is the last line for the given file and missing NL
- if (!(/\n$/.test(current.value)) && (isLast || isLastOfType)) {
- curRange.push('\\ No newline at end of file');
- }
- }
-
- var oldRangeStart = 0, newRangeStart = 0, curRange = [],
- oldLine = 1, newLine = 1;
- for (var i = 0; i < diff.length; i++) {
- var current = diff[i],
- lines = current.lines || current.value.replace(/\n$/, '').split('\n');
- current.lines = lines;
-
- if (current.added || current.removed) {
- // If we have previous context, start with that
- if (!oldRangeStart) {
- var prev = diff[i - 1];
- oldRangeStart = oldLine;
- newRangeStart = newLine;
-
- if (prev) {
- curRange = contextLines(prev.lines.slice(-4));
- oldRangeStart -= curRange.length;
- newRangeStart -= curRange.length;
- }
- }
-
- // Output our changes
- curRange.push.apply(curRange, map(lines, function(entry) {
- return (current.added ? '+' : '-') + entry;
- }));
- eofNL(curRange, i, current);
-
- // Track the updated file position
- if (current.added) {
- newLine += lines.length;
- } else {
- oldLine += lines.length;
- }
- } else {
- // Identical context lines. Track line changes
- if (oldRangeStart) {
- // Close out any changes that have been output (or join overlapping)
- if (lines.length <= 8 && i < diff.length - 2) {
- // Overlapping
- curRange.push.apply(curRange, contextLines(lines));
- } else {
- // end the range and output
- var contextSize = Math.min(lines.length, 4);
- ret.push(
- '@@ -' + oldRangeStart + ',' + (oldLine - oldRangeStart + contextSize)
- + ' +' + newRangeStart + ',' + (newLine - newRangeStart + contextSize)
- + ' @@');
- ret.push.apply(ret, curRange);
- ret.push.apply(ret, contextLines(lines.slice(0, contextSize)));
- if (lines.length <= 4) {
- eofNL(ret, i, current);
- }
-
- oldRangeStart = 0;
- newRangeStart = 0;
- curRange = [];
- }
- }
- oldLine += lines.length;
- newLine += lines.length;
- }
- }
-
- return ret.join('\n') + '\n';
- },
-
- createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) {
- return JsDiff.createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader);
- },
-
- applyPatch: function(oldStr, uniDiff) {
- var diffstr = uniDiff.split('\n'),
- hunks = [],
- i = 0,
- remEOFNL = false,
- addEOFNL = false;
-
- // Skip to the first change hunk
- while (i < diffstr.length && !(/^@@/.test(diffstr[i]))) {
- i++;
- }
-
- // Parse the unified diff
- for (; i < diffstr.length; i++) {
- if (diffstr[i][0] === '@') {
- var chnukHeader = diffstr[i].split(/@@ -(\d+),(\d+) \+(\d+),(\d+) @@/);
- hunks.unshift({
- start: chnukHeader[3],
- oldlength: +chnukHeader[2],
- removed: [],
- newlength: chnukHeader[4],
- added: []
- });
- } else if (diffstr[i][0] === '+') {
- hunks[0].added.push(diffstr[i].substr(1));
- } else if (diffstr[i][0] === '-') {
- hunks[0].removed.push(diffstr[i].substr(1));
- } else if (diffstr[i][0] === ' ') {
- hunks[0].added.push(diffstr[i].substr(1));
- hunks[0].removed.push(diffstr[i].substr(1));
- } else if (diffstr[i][0] === '\\') {
- if (diffstr[i - 1][0] === '+') {
- remEOFNL = true;
- } else if (diffstr[i - 1][0] === '-') {
- addEOFNL = true;
- }
- }
- }
-
- // Apply the diff to the input
- var lines = oldStr.split('\n');
- for (i = hunks.length - 1; i >= 0; i--) {
- var hunk = hunks[i];
- // Sanity check the input string. Bail if we don't match.
- for (var j = 0; j < hunk.oldlength; j++) {
- if (lines[hunk.start - 1 + j] !== hunk.removed[j]) {
- return false;
- }
- }
- Array.prototype.splice.apply(lines, [hunk.start - 1, hunk.oldlength].concat(hunk.added));
- }
-
- // Handle EOFNL insertion/removal
- if (remEOFNL) {
- while (!lines[lines.length - 1]) {
- lines.pop();
- }
- } else if (addEOFNL) {
- lines.push('');
- }
- return lines.join('\n');
- },
-
- convertChangesToXML: function(changes) {
- var ret = [];
- for (var i = 0; i < changes.length; i++) {
- var change = changes[i];
- if (change.added) {
- ret.push('');
- } else if (change.removed) {
- ret.push('');
- }
-
- ret.push(escapeHTML(change.value));
-
- if (change.added) {
- ret.push(' ');
- } else if (change.removed) {
- ret.push('');
- }
- }
- return ret.join('');
- },
-
- // See: http://code.google.com/p/google-diff-match-patch/wiki/API
- convertChangesToDMP: function(changes) {
- var ret = [],
- change,
- operation;
- for (var i = 0; i < changes.length; i++) {
- change = changes[i];
- if (change.added) {
- operation = 1;
- } else if (change.removed) {
- operation = -1;
- } else {
- operation = 0;
- }
-
- ret.push([operation, change.value]);
- }
- return ret;
- },
-
- canonicalize: canonicalize
- };
-
- /*istanbul ignore next */
- /*global module */
- if (typeof module !== 'undefined' && module.exports) {
- module.exports = JsDiff;
- } else if (false) {
- /*global define */
- define([], function() { return JsDiff; });
- } else if (typeof global.JsDiff === 'undefined') {
- global.JsDiff = JsDiff;
- }
-}(this));
-
-},{}],47:[function(require,module,exports){
-'use strict';
-
-var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
-
-module.exports = function (str) {
- if (typeof str !== 'string') {
- throw new TypeError('Expected a string');
- }
-
- return str.replace(matchOperatorsRe, '\\$&');
-};
-
-},{}],48:[function(require,module,exports){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-function EventEmitter() {
- this._events = this._events || {};
- this._maxListeners = this._maxListeners || undefined;
-}
-module.exports = EventEmitter;
-
-// Backwards-compat with node 0.10.x
-EventEmitter.EventEmitter = EventEmitter;
-
-EventEmitter.prototype._events = undefined;
-EventEmitter.prototype._maxListeners = undefined;
-
-// By default EventEmitters will print a warning if more than 10 listeners are
-// added to it. This is a useful default which helps finding memory leaks.
-EventEmitter.defaultMaxListeners = 10;
-
-// Obviously not all Emitters should be limited to 10. This function allows
-// that to be increased. Set to zero for unlimited.
-EventEmitter.prototype.setMaxListeners = function(n) {
- if (!isNumber(n) || n < 0 || isNaN(n))
- throw TypeError('n must be a positive number');
- this._maxListeners = n;
- return this;
-};
-
-EventEmitter.prototype.emit = function(type) {
- var er, handler, len, args, i, listeners;
-
- if (!this._events)
- this._events = {};
-
- // If there is no 'error' event listener then throw.
- if (type === 'error') {
- if (!this._events.error ||
- (isObject(this._events.error) && !this._events.error.length)) {
- er = arguments[1];
- if (er instanceof Error) {
- throw er; // Unhandled 'error' event
- } else {
- // At least give some kind of context to the user
- var err = new Error('Uncaught, unspecified "error" event. (' + er + ')');
- err.context = er;
- throw err;
- }
- }
- }
-
- handler = this._events[type];
-
- if (isUndefined(handler))
- return false;
-
- if (isFunction(handler)) {
- switch (arguments.length) {
- // fast cases
- case 1:
- handler.call(this);
- break;
- case 2:
- handler.call(this, arguments[1]);
- break;
- case 3:
- handler.call(this, arguments[1], arguments[2]);
- break;
- // slower
- default:
- args = Array.prototype.slice.call(arguments, 1);
- handler.apply(this, args);
- }
- } else if (isObject(handler)) {
- args = Array.prototype.slice.call(arguments, 1);
- listeners = handler.slice();
- len = listeners.length;
- for (i = 0; i < len; i++)
- listeners[i].apply(this, args);
- }
-
- return true;
-};
-
-EventEmitter.prototype.addListener = function(type, listener) {
- var m;
-
- if (!isFunction(listener))
- throw TypeError('listener must be a function');
-
- if (!this._events)
- this._events = {};
-
- // To avoid recursion in the case that type === "newListener"! Before
- // adding it to the listeners, first emit "newListener".
- if (this._events.newListener)
- this.emit('newListener', type,
- isFunction(listener.listener) ?
- listener.listener : listener);
-
- if (!this._events[type])
- // Optimize the case of one listener. Don't need the extra array object.
- this._events[type] = listener;
- else if (isObject(this._events[type]))
- // If we've already got an array, just append.
- this._events[type].push(listener);
- else
- // Adding the second element, need to change to array.
- this._events[type] = [this._events[type], listener];
-
- // Check for listener leak
- if (isObject(this._events[type]) && !this._events[type].warned) {
- if (!isUndefined(this._maxListeners)) {
- m = this._maxListeners;
- } else {
- m = EventEmitter.defaultMaxListeners;
- }
-
- if (m && m > 0 && this._events[type].length > m) {
- this._events[type].warned = true;
- console.error('(node) warning: possible EventEmitter memory ' +
- 'leak detected. %d listeners added. ' +
- 'Use emitter.setMaxListeners() to increase limit.',
- this._events[type].length);
- if (typeof console.trace === 'function') {
- // not supported in IE 10
- console.trace();
- }
- }
- }
-
- return this;
-};
-
-EventEmitter.prototype.on = EventEmitter.prototype.addListener;
-
-EventEmitter.prototype.once = function(type, listener) {
- if (!isFunction(listener))
- throw TypeError('listener must be a function');
-
- var fired = false;
-
- function g() {
- this.removeListener(type, g);
-
- if (!fired) {
- fired = true;
- listener.apply(this, arguments);
- }
- }
-
- g.listener = listener;
- this.on(type, g);
-
- return this;
-};
-
-// emits a 'removeListener' event iff the listener was removed
-EventEmitter.prototype.removeListener = function(type, listener) {
- var list, position, length, i;
-
- if (!isFunction(listener))
- throw TypeError('listener must be a function');
-
- if (!this._events || !this._events[type])
- return this;
-
- list = this._events[type];
- length = list.length;
- position = -1;
-
- if (list === listener ||
- (isFunction(list.listener) && list.listener === listener)) {
- delete this._events[type];
- if (this._events.removeListener)
- this.emit('removeListener', type, listener);
-
- } else if (isObject(list)) {
- for (i = length; i-- > 0;) {
- if (list[i] === listener ||
- (list[i].listener && list[i].listener === listener)) {
- position = i;
- break;
- }
- }
-
- if (position < 0)
- return this;
-
- if (list.length === 1) {
- list.length = 0;
- delete this._events[type];
- } else {
- list.splice(position, 1);
- }
-
- if (this._events.removeListener)
- this.emit('removeListener', type, listener);
- }
-
- return this;
-};
-
-EventEmitter.prototype.removeAllListeners = function(type) {
- var key, listeners;
-
- if (!this._events)
- return this;
-
- // not listening for removeListener, no need to emit
- if (!this._events.removeListener) {
- if (arguments.length === 0)
- this._events = {};
- else if (this._events[type])
- delete this._events[type];
- return this;
- }
-
- // emit removeListener for all listeners on all events
- if (arguments.length === 0) {
- for (key in this._events) {
- if (key === 'removeListener') continue;
- this.removeAllListeners(key);
- }
- this.removeAllListeners('removeListener');
- this._events = {};
- return this;
- }
-
- listeners = this._events[type];
-
- if (isFunction(listeners)) {
- this.removeListener(type, listeners);
- } else if (listeners) {
- // LIFO order
- while (listeners.length)
- this.removeListener(type, listeners[listeners.length - 1]);
- }
- delete this._events[type];
-
- return this;
-};
-
-EventEmitter.prototype.listeners = function(type) {
- var ret;
- if (!this._events || !this._events[type])
- ret = [];
- else if (isFunction(this._events[type]))
- ret = [this._events[type]];
- else
- ret = this._events[type].slice();
- return ret;
-};
-
-EventEmitter.prototype.listenerCount = function(type) {
- if (this._events) {
- var evlistener = this._events[type];
-
- if (isFunction(evlistener))
- return 1;
- else if (evlistener)
- return evlistener.length;
- }
- return 0;
-};
-
-EventEmitter.listenerCount = function(emitter, type) {
- return emitter.listenerCount(type);
-};
-
-function isFunction(arg) {
- return typeof arg === 'function';
-}
-
-function isNumber(arg) {
- return typeof arg === 'number';
-}
-
-function isObject(arg) {
- return typeof arg === 'object' && arg !== null;
-}
-
-function isUndefined(arg) {
- return arg === void 0;
-}
-
-},{}],49:[function(require,module,exports){
-(function (process){
-// Growl - Copyright TJ Holowaychuk (MIT Licensed)
-
-/**
- * Module dependencies.
- */
-
-var exec = require('child_process').exec
- , fs = require('fs')
- , path = require('path')
- , exists = fs.existsSync || path.existsSync
- , os = require('os')
- , quote = JSON.stringify
- , cmd;
-
-function which(name) {
- var paths = process.env.PATH.split(':');
- var loc;
-
- for (var i = 0, len = paths.length; i < len; ++i) {
- loc = path.join(paths[i], name);
- if (exists(loc)) return loc;
- }
-}
-
-switch(os.type()) {
- case 'Darwin':
- if (which('terminal-notifier')) {
- cmd = {
- type: "Darwin-NotificationCenter"
- , pkg: "terminal-notifier"
- , msg: '-message'
- , title: '-title'
- , subtitle: '-subtitle'
- , icon: '-appIcon'
- , sound: '-sound'
- , url: '-open'
- , priority: {
- cmd: '-execute'
- , range: []
- }
- };
- } else {
- cmd = {
- type: "Darwin-Growl"
- , pkg: "growlnotify"
- , msg: '-m'
- , sticky: '--sticky'
- , priority: {
- cmd: '--priority'
- , range: [
- -2
- , -1
- , 0
- , 1
- , 2
- , "Very Low"
- , "Moderate"
- , "Normal"
- , "High"
- , "Emergency"
- ]
- }
- };
- }
- break;
- case 'Linux':
- if (which('growl')) {
- cmd = {
- type: "Linux-Growl"
- , pkg: "growl"
- , msg: '-m'
- , title: '-title'
- , subtitle: '-subtitle'
- , host: {
- cmd: '-H'
- , hostname: '192.168.33.1'
- }
- };
- } else {
- cmd = {
- type: "Linux"
- , pkg: "notify-send"
- , msg: ''
- , sticky: '-t 0'
- , icon: '-i'
- , priority: {
- cmd: '-u'
- , range: [
- "low"
- , "normal"
- , "critical"
- ]
- }
- };
- }
- break;
- case 'Windows_NT':
- cmd = {
- type: "Windows"
- , pkg: "growlnotify"
- , msg: ''
- , sticky: '/s:true'
- , title: '/t:'
- , icon: '/i:'
- , url: '/cu:'
- , priority: {
- cmd: '/p:'
- , range: [
- -2
- , -1
- , 0
- , 1
- , 2
- ]
- }
- };
- break;
-}
-
-/**
- * Expose `growl`.
- */
-
-exports = module.exports = growl;
-
-/**
- * Node-growl version.
- */
-
-exports.version = '1.4.1'
-
-/**
- * Send growl notification _msg_ with _options_.
- *
- * Options:
- *
- * - title Notification title
- * - sticky Make the notification stick (defaults to false)
- * - priority Specify an int or named key (default is 0)
- * - name Application name (defaults to growlnotify)
- * - sound Sound efect ( in OSx defined in preferences -> sound -> effects) * works only in OSX > 10.8x
- * - image
- * - path to an icon sets --iconpath
- * - path to an image sets --image
- * - capitalized word sets --appIcon
- * - filename uses extname as --icon
- * - otherwise treated as --icon
- *
- * Examples:
- *
- * growl('New email')
- * growl('5 new emails', { title: 'Thunderbird' })
- * growl('5 new emails', { title: 'Thunderbird', sound: 'Purr' })
- * growl('Email sent', function(){
- * // ... notification sent
- * })
- *
- * @param {string} msg
- * @param {object} options
- * @param {function} fn
- * @api public
- */
-
-function growl(msg, options, fn) {
- var image
- , args
- , options = options || {}
- , fn = fn || function(){};
-
- if (options.exec) {
- cmd = {
- type: "Custom"
- , pkg: options.exec
- , range: []
- };
- }
-
- // noop
- if (!cmd) return fn(new Error('growl not supported on this platform'));
- args = [cmd.pkg];
-
- // image
- if (image = options.image) {
- switch(cmd.type) {
- case 'Darwin-Growl':
- var flag, ext = path.extname(image).substr(1)
- flag = flag || ext == 'icns' && 'iconpath'
- flag = flag || /^[A-Z]/.test(image) && 'appIcon'
- flag = flag || /^png|gif|jpe?g$/.test(ext) && 'image'
- flag = flag || ext && (image = ext) && 'icon'
- flag = flag || 'icon'
- args.push('--' + flag, quote(image))
- break;
- case 'Darwin-NotificationCenter':
- args.push(cmd.icon, quote(image));
- break;
- case 'Linux':
- args.push(cmd.icon, quote(image));
- // libnotify defaults to sticky, set a hint for transient notifications
- if (!options.sticky) args.push('--hint=int:transient:1');
- break;
- case 'Windows':
- args.push(cmd.icon + quote(image));
- break;
- }
- }
-
- // sticky
- if (options.sticky) args.push(cmd.sticky);
-
- // priority
- if (options.priority) {
- var priority = options.priority + '';
- var checkindexOf = cmd.priority.range.indexOf(priority);
- if (~cmd.priority.range.indexOf(priority)) {
- args.push(cmd.priority, options.priority);
- }
- }
-
- //sound
- if(options.sound && cmd.type === 'Darwin-NotificationCenter'){
- args.push(cmd.sound, options.sound)
- }
-
- // name
- if (options.name && cmd.type === "Darwin-Growl") {
- args.push('--name', options.name);
- }
-
- switch(cmd.type) {
- case 'Darwin-Growl':
- args.push(cmd.msg);
- args.push(quote(msg).replace(/\\n/g, '\n'));
- if (options.title) args.push(quote(options.title));
- break;
- case 'Darwin-NotificationCenter':
- args.push(cmd.msg);
- var stringifiedMsg = quote(msg);
- var escapedMsg = stringifiedMsg.replace(/\\n/g, '\n');
- args.push(escapedMsg);
- if (options.title) {
- args.push(cmd.title);
- args.push(quote(options.title));
- }
- if (options.subtitle) {
- args.push(cmd.subtitle);
- args.push(quote(options.subtitle));
- }
- if (options.url) {
- args.push(cmd.url);
- args.push(quote(options.url));
- }
- break;
- case 'Linux-Growl':
- args.push(cmd.msg);
- args.push(quote(msg).replace(/\\n/g, '\n'));
- if (options.title) args.push(quote(options.title));
- if (cmd.host) {
- args.push(cmd.host.cmd, cmd.host.hostname)
- }
- break;
- case 'Linux':
- if (options.title) {
- args.push(quote(options.title));
- args.push(cmd.msg);
- args.push(quote(msg).replace(/\\n/g, '\n'));
- } else {
- args.push(quote(msg).replace(/\\n/g, '\n'));
- }
- break;
- case 'Windows':
- args.push(quote(msg).replace(/\\n/g, '\n'));
- if (options.title) args.push(cmd.title + quote(options.title));
- if (options.url) args.push(cmd.url + quote(options.url));
- break;
- case 'Custom':
- args[0] = (function(origCommand) {
- var message = options.title
- ? options.title + ': ' + msg
- : msg;
- var command = origCommand.replace(/(^|[^%])%s/g, '$1' + quote(message));
- if (command === origCommand) args.push(quote(message));
- return command;
- })(args[0]);
- break;
- }
-
- // execute
- exec(args.join(' '), fn);
-};
-
-}).call(this,require('_process'))
-},{"_process":67,"child_process":42,"fs":42,"os":65,"path":42}],50:[function(require,module,exports){
-exports.read = function (buffer, offset, isLE, mLen, nBytes) {
- var e, m
- var eLen = nBytes * 8 - mLen - 1
- var eMax = (1 << eLen) - 1
- var eBias = eMax >> 1
- var nBits = -7
- var i = isLE ? (nBytes - 1) : 0
- var d = isLE ? -1 : 1
- var s = buffer[offset + i]
-
- i += d
-
- e = s & ((1 << (-nBits)) - 1)
- s >>= (-nBits)
- nBits += eLen
- for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
-
- m = e & ((1 << (-nBits)) - 1)
- e >>= (-nBits)
- nBits += mLen
- for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
-
- if (e === 0) {
- e = 1 - eBias
- } else if (e === eMax) {
- return m ? NaN : ((s ? -1 : 1) * Infinity)
- } else {
- m = m + Math.pow(2, mLen)
- e = e - eBias
- }
- return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
-}
-
-exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
- var e, m, c
- var eLen = nBytes * 8 - mLen - 1
- var eMax = (1 << eLen) - 1
- var eBias = eMax >> 1
- var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
- var i = isLE ? 0 : (nBytes - 1)
- var d = isLE ? 1 : -1
- var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
-
- value = Math.abs(value)
-
- if (isNaN(value) || value === Infinity) {
- m = isNaN(value) ? 1 : 0
- e = eMax
- } else {
- e = Math.floor(Math.log(value) / Math.LN2)
- if (value * (c = Math.pow(2, -e)) < 1) {
- e--
- c *= 2
- }
- if (e + eBias >= 1) {
- value += rt / c
- } else {
- value += rt * Math.pow(2, 1 - eBias)
- }
- if (value * c >= 2) {
- e++
- c /= 2
- }
-
- if (e + eBias >= eMax) {
- m = 0
- e = eMax
- } else if (e + eBias >= 1) {
- m = (value * c - 1) * Math.pow(2, mLen)
- e = e + eBias
- } else {
- m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
- e = 0
- }
- }
-
- for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
-
- e = (e << mLen) | m
- eLen += mLen
- for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
-
- buffer[offset + i - d] |= s * 128
-}
-
-},{}],51:[function(require,module,exports){
-if (typeof Object.create === 'function') {
- // implementation from standard node.js 'util' module
- module.exports = function inherits(ctor, superCtor) {
- ctor.super_ = superCtor
- ctor.prototype = Object.create(superCtor.prototype, {
- constructor: {
- value: ctor,
- enumerable: false,
- writable: true,
- configurable: true
- }
- });
- };
-} else {
- // old school shim for old browsers
- module.exports = function inherits(ctor, superCtor) {
- ctor.super_ = superCtor
- var TempCtor = function () {}
- TempCtor.prototype = superCtor.prototype
- ctor.prototype = new TempCtor()
- ctor.prototype.constructor = ctor
- }
-}
-
-},{}],52:[function(require,module,exports){
-/*!
- * Determine if an object is a Buffer
- *
- * @author Feross Aboukhadijeh
- * @license MIT
- */
-
-// The _isBuffer check is for Safari 5-7 support, because it's missing
-// Object.prototype.constructor. Remove this eventually
-module.exports = function (obj) {
- return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
-}
-
-function isBuffer (obj) {
- return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
-}
-
-// For Node v0.10 support. Remove this eventually.
-function isSlowBuffer (obj) {
- return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
-}
-
-},{}],53:[function(require,module,exports){
-var toString = {}.toString;
-
-module.exports = Array.isArray || function (arr) {
- return toString.call(arr) == '[object Array]';
-};
-
-},{}],54:[function(require,module,exports){
-(function (global){
-/*! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */
-;(function () {
- // Detect the `define` function exposed by asynchronous module loaders. The
- // strict `define` check is necessary for compatibility with `r.js`.
- var isLoader = false;
-
- // A set of types used to distinguish objects from primitives.
- var objectTypes = {
- "function": true,
- "object": true
- };
-
- // Detect the `exports` object exposed by CommonJS implementations.
- var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;
-
- // Use the `global` object exposed by Node (including Browserify via
- // `insert-module-globals`), Narwhal, and Ringo as the default context,
- // and the `window` object in browsers. Rhino exports a `global` function
- // instead.
- var root = objectTypes[typeof window] && window || this,
- freeGlobal = freeExports && objectTypes[typeof module] && module && !module.nodeType && typeof global == "object" && global;
-
- if (freeGlobal && (freeGlobal["global"] === freeGlobal || freeGlobal["window"] === freeGlobal || freeGlobal["self"] === freeGlobal)) {
- root = freeGlobal;
- }
-
- // Public: Initializes JSON 3 using the given `context` object, attaching the
- // `stringify` and `parse` functions to the specified `exports` object.
- function runInContext(context, exports) {
- context || (context = root["Object"]());
- exports || (exports = root["Object"]());
-
- // Native constructor aliases.
- var Number = context["Number"] || root["Number"],
- String = context["String"] || root["String"],
- Object = context["Object"] || root["Object"],
- Date = context["Date"] || root["Date"],
- SyntaxError = context["SyntaxError"] || root["SyntaxError"],
- TypeError = context["TypeError"] || root["TypeError"],
- Math = context["Math"] || root["Math"],
- nativeJSON = context["JSON"] || root["JSON"];
-
- // Delegate to the native `stringify` and `parse` implementations.
- if (typeof nativeJSON == "object" && nativeJSON) {
- exports.stringify = nativeJSON.stringify;
- exports.parse = nativeJSON.parse;
- }
-
- // Convenience aliases.
- var objectProto = Object.prototype,
- getClass = objectProto.toString,
- isProperty, forEach, undef;
-
- // Test the `Date#getUTC*` methods. Based on work by @Yaffle.
- var isExtended = new Date(-3509827334573292);
- try {
- // The `getUTCFullYear`, `Month`, and `Date` methods return nonsensical
- // results for certain dates in Opera >= 10.53.
- isExtended = isExtended.getUTCFullYear() == -109252 && isExtended.getUTCMonth() === 0 && isExtended.getUTCDate() === 1 &&
- // Safari < 2.0.2 stores the internal millisecond time value correctly,
- // but clips the values returned by the date methods to the range of
- // signed 32-bit integers ([-2 ** 31, 2 ** 31 - 1]).
- isExtended.getUTCHours() == 10 && isExtended.getUTCMinutes() == 37 && isExtended.getUTCSeconds() == 6 && isExtended.getUTCMilliseconds() == 708;
- } catch (exception) {}
-
- // Internal: Determines whether the native `JSON.stringify` and `parse`
- // implementations are spec-compliant. Based on work by Ken Snyder.
- function has(name) {
- if (has[name] !== undef) {
- // Return cached feature test result.
- return has[name];
- }
- var isSupported;
- if (name == "bug-string-char-index") {
- // IE <= 7 doesn't support accessing string characters using square
- // bracket notation. IE 8 only supports this for primitives.
- isSupported = "a"[0] != "a";
- } else if (name == "json") {
- // Indicates whether both `JSON.stringify` and `JSON.parse` are
- // supported.
- isSupported = has("json-stringify") && has("json-parse");
- } else {
- var value, serialized = '{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';
- // Test `JSON.stringify`.
- if (name == "json-stringify") {
- var stringify = exports.stringify, stringifySupported = typeof stringify == "function" && isExtended;
- if (stringifySupported) {
- // A test function object with a custom `toJSON` method.
- (value = function () {
- return 1;
- }).toJSON = value;
- try {
- stringifySupported =
- // Firefox 3.1b1 and b2 serialize string, number, and boolean
- // primitives as object literals.
- stringify(0) === "0" &&
- // FF 3.1b1, b2, and JSON 2 serialize wrapped primitives as object
- // literals.
- stringify(new Number()) === "0" &&
- stringify(new String()) == '""' &&
- // FF 3.1b1, 2 throw an error if the value is `null`, `undefined`, or
- // does not define a canonical JSON representation (this applies to
- // objects with `toJSON` properties as well, *unless* they are nested
- // within an object or array).
- stringify(getClass) === undef &&
- // IE 8 serializes `undefined` as `"undefined"`. Safari <= 5.1.7 and
- // FF 3.1b3 pass this test.
- stringify(undef) === undef &&
- // Safari <= 5.1.7 and FF 3.1b3 throw `Error`s and `TypeError`s,
- // respectively, if the value is omitted entirely.
- stringify() === undef &&
- // FF 3.1b1, 2 throw an error if the given value is not a number,
- // string, array, object, Boolean, or `null` literal. This applies to
- // objects with custom `toJSON` methods as well, unless they are nested
- // inside object or array literals. YUI 3.0.0b1 ignores custom `toJSON`
- // methods entirely.
- stringify(value) === "1" &&
- stringify([value]) == "[1]" &&
- // Prototype <= 1.6.1 serializes `[undefined]` as `"[]"` instead of
- // `"[null]"`.
- stringify([undef]) == "[null]" &&
- // YUI 3.0.0b1 fails to serialize `null` literals.
- stringify(null) == "null" &&
- // FF 3.1b1, 2 halts serialization if an array contains a function:
- // `[1, true, getClass, 1]` serializes as "[1,true,],". FF 3.1b3
- // elides non-JSON values from objects and arrays, unless they
- // define custom `toJSON` methods.
- stringify([undef, getClass, null]) == "[null,null,null]" &&
- // Simple serialization test. FF 3.1b1 uses Unicode escape sequences
- // where character escape codes are expected (e.g., `\b` => `\u0008`).
- stringify({ "a": [value, true, false, null, "\x00\b\n\f\r\t"] }) == serialized &&
- // FF 3.1b1 and b2 ignore the `filter` and `width` arguments.
- stringify(null, value) === "1" &&
- stringify([1, 2], null, 1) == "[\n 1,\n 2\n]" &&
- // JSON 2, Prototype <= 1.7, and older WebKit builds incorrectly
- // serialize extended years.
- stringify(new Date(-8.64e15)) == '"-271821-04-20T00:00:00.000Z"' &&
- // The milliseconds are optional in ES 5, but required in 5.1.
- stringify(new Date(8.64e15)) == '"+275760-09-13T00:00:00.000Z"' &&
- // Firefox <= 11.0 incorrectly serializes years prior to 0 as negative
- // four-digit years instead of six-digit years. Credits: @Yaffle.
- stringify(new Date(-621987552e5)) == '"-000001-01-01T00:00:00.000Z"' &&
- // Safari <= 5.1.5 and Opera >= 10.53 incorrectly serialize millisecond
- // values less than 1000. Credits: @Yaffle.
- stringify(new Date(-1)) == '"1969-12-31T23:59:59.999Z"';
- } catch (exception) {
- stringifySupported = false;
- }
- }
- isSupported = stringifySupported;
- }
- // Test `JSON.parse`.
- if (name == "json-parse") {
- var parse = exports.parse;
- if (typeof parse == "function") {
- try {
- // FF 3.1b1, b2 will throw an exception if a bare literal is provided.
- // Conforming implementations should also coerce the initial argument to
- // a string prior to parsing.
- if (parse("0") === 0 && !parse(false)) {
- // Simple parsing test.
- value = parse(serialized);
- var parseSupported = value["a"].length == 5 && value["a"][0] === 1;
- if (parseSupported) {
- try {
- // Safari <= 5.1.2 and FF 3.1b1 allow unescaped tabs in strings.
- parseSupported = !parse('"\t"');
- } catch (exception) {}
- if (parseSupported) {
- try {
- // FF 4.0 and 4.0.1 allow leading `+` signs and leading
- // decimal points. FF 4.0, 4.0.1, and IE 9-10 also allow
- // certain octal literals.
- parseSupported = parse("01") !== 1;
- } catch (exception) {}
- }
- if (parseSupported) {
- try {
- // FF 4.0, 4.0.1, and Rhino 1.7R3-R4 allow trailing decimal
- // points. These environments, along with FF 3.1b1 and 2,
- // also allow trailing commas in JSON objects and arrays.
- parseSupported = parse("1.") !== 1;
- } catch (exception) {}
- }
- }
- }
- } catch (exception) {
- parseSupported = false;
- }
- }
- isSupported = parseSupported;
- }
- }
- return has[name] = !!isSupported;
- }
-
- if (!has("json")) {
- // Common `[[Class]]` name aliases.
- var functionClass = "[object Function]",
- dateClass = "[object Date]",
- numberClass = "[object Number]",
- stringClass = "[object String]",
- arrayClass = "[object Array]",
- booleanClass = "[object Boolean]";
-
- // Detect incomplete support for accessing string characters by index.
- var charIndexBuggy = has("bug-string-char-index");
-
- // Define additional utility methods if the `Date` methods are buggy.
- if (!isExtended) {
- var floor = Math.floor;
- // A mapping between the months of the year and the number of days between
- // January 1st and the first of the respective month.
- var Months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
- // Internal: Calculates the number of days between the Unix epoch and the
- // first day of the given month.
- var getDay = function (year, month) {
- return Months[month] + 365 * (year - 1970) + floor((year - 1969 + (month = +(month > 1))) / 4) - floor((year - 1901 + month) / 100) + floor((year - 1601 + month) / 400);
- };
- }
-
- // Internal: Determines if a property is a direct property of the given
- // object. Delegates to the native `Object#hasOwnProperty` method.
- if (!(isProperty = objectProto.hasOwnProperty)) {
- isProperty = function (property) {
- var members = {}, constructor;
- if ((members.__proto__ = null, members.__proto__ = {
- // The *proto* property cannot be set multiple times in recent
- // versions of Firefox and SeaMonkey.
- "toString": 1
- }, members).toString != getClass) {
- // Safari <= 2.0.3 doesn't implement `Object#hasOwnProperty`, but
- // supports the mutable *proto* property.
- isProperty = function (property) {
- // Capture and break the object's prototype chain (see section 8.6.2
- // of the ES 5.1 spec). The parenthesized expression prevents an
- // unsafe transformation by the Closure Compiler.
- var original = this.__proto__, result = property in (this.__proto__ = null, this);
- // Restore the original prototype chain.
- this.__proto__ = original;
- return result;
- };
- } else {
- // Capture a reference to the top-level `Object` constructor.
- constructor = members.constructor;
- // Use the `constructor` property to simulate `Object#hasOwnProperty` in
- // other environments.
- isProperty = function (property) {
- var parent = (this.constructor || constructor).prototype;
- return property in this && !(property in parent && this[property] === parent[property]);
- };
- }
- members = null;
- return isProperty.call(this, property);
- };
- }
-
- // Internal: Normalizes the `for...in` iteration algorithm across
- // environments. Each enumerated key is yielded to a `callback` function.
- forEach = function (object, callback) {
- var size = 0, Properties, members, property;
-
- // Tests for bugs in the current environment's `for...in` algorithm. The
- // `valueOf` property inherits the non-enumerable flag from
- // `Object.prototype` in older versions of IE, Netscape, and Mozilla.
- (Properties = function () {
- this.valueOf = 0;
- }).prototype.valueOf = 0;
-
- // Iterate over a new instance of the `Properties` class.
- members = new Properties();
- for (property in members) {
- // Ignore all properties inherited from `Object.prototype`.
- if (isProperty.call(members, property)) {
- size++;
- }
- }
- Properties = members = null;
-
- // Normalize the iteration algorithm.
- if (!size) {
- // A list of non-enumerable properties inherited from `Object.prototype`.
- members = ["valueOf", "toString", "toLocaleString", "propertyIsEnumerable", "isPrototypeOf", "hasOwnProperty", "constructor"];
- // IE <= 8, Mozilla 1.0, and Netscape 6.2 ignore shadowed non-enumerable
- // properties.
- forEach = function (object, callback) {
- var isFunction = getClass.call(object) == functionClass, property, length;
- var hasProperty = !isFunction && typeof object.constructor != "function" && objectTypes[typeof object.hasOwnProperty] && object.hasOwnProperty || isProperty;
- for (property in object) {
- // Gecko <= 1.0 enumerates the `prototype` property of functions under
- // certain conditions; IE does not.
- if (!(isFunction && property == "prototype") && hasProperty.call(object, property)) {
- callback(property);
- }
- }
- // Manually invoke the callback for each non-enumerable property.
- for (length = members.length; property = members[--length]; hasProperty.call(object, property) && callback(property));
- };
- } else if (size == 2) {
- // Safari <= 2.0.4 enumerates shadowed properties twice.
- forEach = function (object, callback) {
- // Create a set of iterated properties.
- var members = {}, isFunction = getClass.call(object) == functionClass, property;
- for (property in object) {
- // Store each property name to prevent double enumeration. The
- // `prototype` property of functions is not enumerated due to cross-
- // environment inconsistencies.
- if (!(isFunction && property == "prototype") && !isProperty.call(members, property) && (members[property] = 1) && isProperty.call(object, property)) {
- callback(property);
- }
- }
- };
- } else {
- // No bugs detected; use the standard `for...in` algorithm.
- forEach = function (object, callback) {
- var isFunction = getClass.call(object) == functionClass, property, isConstructor;
- for (property in object) {
- if (!(isFunction && property == "prototype") && isProperty.call(object, property) && !(isConstructor = property === "constructor")) {
- callback(property);
- }
- }
- // Manually invoke the callback for the `constructor` property due to
- // cross-environment inconsistencies.
- if (isConstructor || isProperty.call(object, (property = "constructor"))) {
- callback(property);
- }
- };
- }
- return forEach(object, callback);
- };
-
- // Public: Serializes a JavaScript `value` as a JSON string. The optional
- // `filter` argument may specify either a function that alters how object and
- // array members are serialized, or an array of strings and numbers that
- // indicates which properties should be serialized. The optional `width`
- // argument may be either a string or number that specifies the indentation
- // level of the output.
- if (!has("json-stringify")) {
- // Internal: A map of control characters and their escaped equivalents.
- var Escapes = {
- 92: "\\\\",
- 34: '\\"',
- 8: "\\b",
- 12: "\\f",
- 10: "\\n",
- 13: "\\r",
- 9: "\\t"
- };
-
- // Internal: Converts `value` into a zero-padded string such that its
- // length is at least equal to `width`. The `width` must be <= 6.
- var leadingZeroes = "000000";
- var toPaddedString = function (width, value) {
- // The `|| 0` expression is necessary to work around a bug in
- // Opera <= 7.54u2 where `0 == -0`, but `String(-0) !== "0"`.
- return (leadingZeroes + (value || 0)).slice(-width);
- };
-
- // Internal: Double-quotes a string `value`, replacing all ASCII control
- // characters (characters with code unit values between 0 and 31) with
- // their escaped equivalents. This is an implementation of the
- // `Quote(value)` operation defined in ES 5.1 section 15.12.3.
- var unicodePrefix = "\\u00";
- var quote = function (value) {
- var result = '"', index = 0, length = value.length, useCharIndex = !charIndexBuggy || length > 10;
- var symbols = useCharIndex && (charIndexBuggy ? value.split("") : value);
- for (; index < length; index++) {
- var charCode = value.charCodeAt(index);
- // If the character is a control character, append its Unicode or
- // shorthand escape sequence; otherwise, append the character as-is.
- switch (charCode) {
- case 8: case 9: case 10: case 12: case 13: case 34: case 92:
- result += Escapes[charCode];
- break;
- default:
- if (charCode < 32) {
- result += unicodePrefix + toPaddedString(2, charCode.toString(16));
- break;
- }
- result += useCharIndex ? symbols[index] : value.charAt(index);
- }
- }
- return result + '"';
- };
-
- // Internal: Recursively serializes an object. Implements the
- // `Str(key, holder)`, `JO(value)`, and `JA(value)` operations.
- var serialize = function (property, object, callback, properties, whitespace, indentation, stack) {
- var value, className, year, month, date, time, hours, minutes, seconds, milliseconds, results, element, index, length, prefix, result;
- try {
- // Necessary for host object support.
- value = object[property];
- } catch (exception) {}
- if (typeof value == "object" && value) {
- className = getClass.call(value);
- if (className == dateClass && !isProperty.call(value, "toJSON")) {
- if (value > -1 / 0 && value < 1 / 0) {
- // Dates are serialized according to the `Date#toJSON` method
- // specified in ES 5.1 section 15.9.5.44. See section 15.9.1.15
- // for the ISO 8601 date time string format.
- if (getDay) {
- // Manually compute the year, month, date, hours, minutes,
- // seconds, and milliseconds if the `getUTC*` methods are
- // buggy. Adapted from @Yaffle's `date-shim` project.
- date = floor(value / 864e5);
- for (year = floor(date / 365.2425) + 1970 - 1; getDay(year + 1, 0) <= date; year++);
- for (month = floor((date - getDay(year, 0)) / 30.42); getDay(year, month + 1) <= date; month++);
- date = 1 + date - getDay(year, month);
- // The `time` value specifies the time within the day (see ES
- // 5.1 section 15.9.1.2). The formula `(A % B + B) % B` is used
- // to compute `A modulo B`, as the `%` operator does not
- // correspond to the `modulo` operation for negative numbers.
- time = (value % 864e5 + 864e5) % 864e5;
- // The hours, minutes, seconds, and milliseconds are obtained by
- // decomposing the time within the day. See section 15.9.1.10.
- hours = floor(time / 36e5) % 24;
- minutes = floor(time / 6e4) % 60;
- seconds = floor(time / 1e3) % 60;
- milliseconds = time % 1e3;
- } else {
- year = value.getUTCFullYear();
- month = value.getUTCMonth();
- date = value.getUTCDate();
- hours = value.getUTCHours();
- minutes = value.getUTCMinutes();
- seconds = value.getUTCSeconds();
- milliseconds = value.getUTCMilliseconds();
- }
- // Serialize extended years correctly.
- value = (year <= 0 || year >= 1e4 ? (year < 0 ? "-" : "+") + toPaddedString(6, year < 0 ? -year : year) : toPaddedString(4, year)) +
- "-" + toPaddedString(2, month + 1) + "-" + toPaddedString(2, date) +
- // Months, dates, hours, minutes, and seconds should have two
- // digits; milliseconds should have three.
- "T" + toPaddedString(2, hours) + ":" + toPaddedString(2, minutes) + ":" + toPaddedString(2, seconds) +
- // Milliseconds are optional in ES 5.0, but required in 5.1.
- "." + toPaddedString(3, milliseconds) + "Z";
- } else {
- value = null;
- }
- } else if (typeof value.toJSON == "function" && ((className != numberClass && className != stringClass && className != arrayClass) || isProperty.call(value, "toJSON"))) {
- // Prototype <= 1.6.1 adds non-standard `toJSON` methods to the
- // `Number`, `String`, `Date`, and `Array` prototypes. JSON 3
- // ignores all `toJSON` methods on these objects unless they are
- // defined directly on an instance.
- value = value.toJSON(property);
- }
- }
- if (callback) {
- // If a replacement function was provided, call it to obtain the value
- // for serialization.
- value = callback.call(object, property, value);
- }
- if (value === null) {
- return "null";
- }
- className = getClass.call(value);
- if (className == booleanClass) {
- // Booleans are represented literally.
- return "" + value;
- } else if (className == numberClass) {
- // JSON numbers must be finite. `Infinity` and `NaN` are serialized as
- // `"null"`.
- return value > -1 / 0 && value < 1 / 0 ? "" + value : "null";
- } else if (className == stringClass) {
- // Strings are double-quoted and escaped.
- return quote("" + value);
- }
- // Recursively serialize objects and arrays.
- if (typeof value == "object") {
- // Check for cyclic structures. This is a linear search; performance
- // is inversely proportional to the number of unique nested objects.
- for (length = stack.length; length--;) {
- if (stack[length] === value) {
- // Cyclic structures cannot be serialized by `JSON.stringify`.
- throw TypeError();
- }
- }
- // Add the object to the stack of traversed objects.
- stack.push(value);
- results = [];
- // Save the current indentation level and indent one additional level.
- prefix = indentation;
- indentation += whitespace;
- if (className == arrayClass) {
- // Recursively serialize array elements.
- for (index = 0, length = value.length; index < length; index++) {
- element = serialize(index, value, callback, properties, whitespace, indentation, stack);
- results.push(element === undef ? "null" : element);
- }
- result = results.length ? (whitespace ? "[\n" + indentation + results.join(",\n" + indentation) + "\n" + prefix + "]" : ("[" + results.join(",") + "]")) : "[]";
- } else {
- // Recursively serialize object members. Members are selected from
- // either a user-specified list of property names, or the object
- // itself.
- forEach(properties || value, function (property) {
- var element = serialize(property, value, callback, properties, whitespace, indentation, stack);
- if (element !== undef) {
- // According to ES 5.1 section 15.12.3: "If `gap` {whitespace}
- // is not the empty string, let `member` {quote(property) + ":"}
- // be the concatenation of `member` and the `space` character."
- // The "`space` character" refers to the literal space
- // character, not the `space` {width} argument provided to
- // `JSON.stringify`.
- results.push(quote(property) + ":" + (whitespace ? " " : "") + element);
- }
- });
- result = results.length ? (whitespace ? "{\n" + indentation + results.join(",\n" + indentation) + "\n" + prefix + "}" : ("{" + results.join(",") + "}")) : "{}";
- }
- // Remove the object from the traversed object stack.
- stack.pop();
- return result;
- }
- };
-
- // Public: `JSON.stringify`. See ES 5.1 section 15.12.3.
- exports.stringify = function (source, filter, width) {
- var whitespace, callback, properties, className;
- if (objectTypes[typeof filter] && filter) {
- if ((className = getClass.call(filter)) == functionClass) {
- callback = filter;
- } else if (className == arrayClass) {
- // Convert the property names array into a makeshift set.
- properties = {};
- for (var index = 0, length = filter.length, value; index < length; value = filter[index++], ((className = getClass.call(value)), className == stringClass || className == numberClass) && (properties[value] = 1));
- }
- }
- if (width) {
- if ((className = getClass.call(width)) == numberClass) {
- // Convert the `width` to an integer and create a string containing
- // `width` number of space characters.
- if ((width -= width % 1) > 0) {
- for (whitespace = "", width > 10 && (width = 10); whitespace.length < width; whitespace += " ");
- }
- } else if (className == stringClass) {
- whitespace = width.length <= 10 ? width : width.slice(0, 10);
- }
- }
- // Opera <= 7.54u2 discards the values associated with empty string keys
- // (`""`) only if they are used directly within an object member list
- // (e.g., `!("" in { "": 1})`).
- return serialize("", (value = {}, value[""] = source, value), callback, properties, whitespace, "", []);
- };
- }
-
- // Public: Parses a JSON source string.
- if (!has("json-parse")) {
- var fromCharCode = String.fromCharCode;
-
- // Internal: A map of escaped control characters and their unescaped
- // equivalents.
- var Unescapes = {
- 92: "\\",
- 34: '"',
- 47: "/",
- 98: "\b",
- 116: "\t",
- 110: "\n",
- 102: "\f",
- 114: "\r"
- };
-
- // Internal: Stores the parser state.
- var Index, Source;
-
- // Internal: Resets the parser state and throws a `SyntaxError`.
- var abort = function () {
- Index = Source = null;
- throw SyntaxError();
- };
-
- // Internal: Returns the next token, or `"$"` if the parser has reached
- // the end of the source string. A token may be a string, number, `null`
- // literal, or Boolean literal.
- var lex = function () {
- var source = Source, length = source.length, value, begin, position, isSigned, charCode;
- while (Index < length) {
- charCode = source.charCodeAt(Index);
- switch (charCode) {
- case 9: case 10: case 13: case 32:
- // Skip whitespace tokens, including tabs, carriage returns, line
- // feeds, and space characters.
- Index++;
- break;
- case 123: case 125: case 91: case 93: case 58: case 44:
- // Parse a punctuator token (`{`, `}`, `[`, `]`, `:`, or `,`) at
- // the current position.
- value = charIndexBuggy ? source.charAt(Index) : source[Index];
- Index++;
- return value;
- case 34:
- // `"` delimits a JSON string; advance to the next character and
- // begin parsing the string. String tokens are prefixed with the
- // sentinel `@` character to distinguish them from punctuators and
- // end-of-string tokens.
- for (value = "@", Index++; Index < length;) {
- charCode = source.charCodeAt(Index);
- if (charCode < 32) {
- // Unescaped ASCII control characters (those with a code unit
- // less than the space character) are not permitted.
- abort();
- } else if (charCode == 92) {
- // A reverse solidus (`\`) marks the beginning of an escaped
- // control character (including `"`, `\`, and `/`) or Unicode
- // escape sequence.
- charCode = source.charCodeAt(++Index);
- switch (charCode) {
- case 92: case 34: case 47: case 98: case 116: case 110: case 102: case 114:
- // Revive escaped control characters.
- value += Unescapes[charCode];
- Index++;
- break;
- case 117:
- // `\u` marks the beginning of a Unicode escape sequence.
- // Advance to the first character and validate the
- // four-digit code point.
- begin = ++Index;
- for (position = Index + 4; Index < position; Index++) {
- charCode = source.charCodeAt(Index);
- // A valid sequence comprises four hexdigits (case-
- // insensitive) that form a single hexadecimal value.
- if (!(charCode >= 48 && charCode <= 57 || charCode >= 97 && charCode <= 102 || charCode >= 65 && charCode <= 70)) {
- // Invalid Unicode escape sequence.
- abort();
- }
- }
- // Revive the escaped character.
- value += fromCharCode("0x" + source.slice(begin, Index));
- break;
- default:
- // Invalid escape sequence.
- abort();
- }
- } else {
- if (charCode == 34) {
- // An unescaped double-quote character marks the end of the
- // string.
- break;
- }
- charCode = source.charCodeAt(Index);
- begin = Index;
- // Optimize for the common case where a string is valid.
- while (charCode >= 32 && charCode != 92 && charCode != 34) {
- charCode = source.charCodeAt(++Index);
- }
- // Append the string as-is.
- value += source.slice(begin, Index);
- }
- }
- if (source.charCodeAt(Index) == 34) {
- // Advance to the next character and return the revived string.
- Index++;
- return value;
- }
- // Unterminated string.
- abort();
- default:
- // Parse numbers and literals.
- begin = Index;
- // Advance past the negative sign, if one is specified.
- if (charCode == 45) {
- isSigned = true;
- charCode = source.charCodeAt(++Index);
- }
- // Parse an integer or floating-point value.
- if (charCode >= 48 && charCode <= 57) {
- // Leading zeroes are interpreted as octal literals.
- if (charCode == 48 && ((charCode = source.charCodeAt(Index + 1)), charCode >= 48 && charCode <= 57)) {
- // Illegal octal literal.
- abort();
- }
- isSigned = false;
- // Parse the integer component.
- for (; Index < length && ((charCode = source.charCodeAt(Index)), charCode >= 48 && charCode <= 57); Index++);
- // Floats cannot contain a leading decimal point; however, this
- // case is already accounted for by the parser.
- if (source.charCodeAt(Index) == 46) {
- position = ++Index;
- // Parse the decimal component.
- for (; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++);
- if (position == Index) {
- // Illegal trailing decimal.
- abort();
- }
- Index = position;
- }
- // Parse exponents. The `e` denoting the exponent is
- // case-insensitive.
- charCode = source.charCodeAt(Index);
- if (charCode == 101 || charCode == 69) {
- charCode = source.charCodeAt(++Index);
- // Skip past the sign following the exponent, if one is
- // specified.
- if (charCode == 43 || charCode == 45) {
- Index++;
- }
- // Parse the exponential component.
- for (position = Index; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++);
- if (position == Index) {
- // Illegal empty exponent.
- abort();
- }
- Index = position;
- }
- // Coerce the parsed value to a JavaScript number.
- return +source.slice(begin, Index);
- }
- // A negative sign may only precede numbers.
- if (isSigned) {
- abort();
- }
- // `true`, `false`, and `null` literals.
- if (source.slice(Index, Index + 4) == "true") {
- Index += 4;
- return true;
- } else if (source.slice(Index, Index + 5) == "false") {
- Index += 5;
- return false;
- } else if (source.slice(Index, Index + 4) == "null") {
- Index += 4;
- return null;
- }
- // Unrecognized token.
- abort();
- }
- }
- // Return the sentinel `$` character if the parser has reached the end
- // of the source string.
- return "$";
- };
-
- // Internal: Parses a JSON `value` token.
- var get = function (value) {
- var results, hasMembers;
- if (value == "$") {
- // Unexpected end of input.
- abort();
- }
- if (typeof value == "string") {
- if ((charIndexBuggy ? value.charAt(0) : value[0]) == "@") {
- // Remove the sentinel `@` character.
- return value.slice(1);
- }
- // Parse object and array literals.
- if (value == "[") {
- // Parses a JSON array, returning a new JavaScript array.
- results = [];
- for (;; hasMembers || (hasMembers = true)) {
- value = lex();
- // A closing square bracket marks the end of the array literal.
- if (value == "]") {
- break;
- }
- // If the array literal contains elements, the current token
- // should be a comma separating the previous element from the
- // next.
- if (hasMembers) {
- if (value == ",") {
- value = lex();
- if (value == "]") {
- // Unexpected trailing `,` in array literal.
- abort();
- }
- } else {
- // A `,` must separate each array element.
- abort();
- }
- }
- // Elisions and leading commas are not permitted.
- if (value == ",") {
- abort();
- }
- results.push(get(value));
- }
- return results;
- } else if (value == "{") {
- // Parses a JSON object, returning a new JavaScript object.
- results = {};
- for (;; hasMembers || (hasMembers = true)) {
- value = lex();
- // A closing curly brace marks the end of the object literal.
- if (value == "}") {
- break;
- }
- // If the object literal contains members, the current token
- // should be a comma separator.
- if (hasMembers) {
- if (value == ",") {
- value = lex();
- if (value == "}") {
- // Unexpected trailing `,` in object literal.
- abort();
- }
- } else {
- // A `,` must separate each object member.
- abort();
- }
- }
- // Leading commas are not permitted, object property names must be
- // double-quoted strings, and a `:` must separate each property
- // name and value.
- if (value == "," || typeof value != "string" || (charIndexBuggy ? value.charAt(0) : value[0]) != "@" || lex() != ":") {
- abort();
- }
- results[value.slice(1)] = get(lex());
- }
- return results;
- }
- // Unexpected token encountered.
- abort();
- }
- return value;
- };
-
- // Internal: Updates a traversed object member.
- var update = function (source, property, callback) {
- var element = walk(source, property, callback);
- if (element === undef) {
- delete source[property];
- } else {
- source[property] = element;
- }
- };
-
- // Internal: Recursively traverses a parsed JSON object, invoking the
- // `callback` function for each value. This is an implementation of the
- // `Walk(holder, name)` operation defined in ES 5.1 section 15.12.2.
- var walk = function (source, property, callback) {
- var value = source[property], length;
- if (typeof value == "object" && value) {
- // `forEach` can't be used to traverse an array in Opera <= 8.54
- // because its `Object#hasOwnProperty` implementation returns `false`
- // for array indices (e.g., `![1, 2, 3].hasOwnProperty("0")`).
- if (getClass.call(value) == arrayClass) {
- for (length = value.length; length--;) {
- update(value, length, callback);
- }
- } else {
- forEach(value, function (property) {
- update(value, property, callback);
- });
- }
- }
- return callback.call(source, property, value);
- };
-
- // Public: `JSON.parse`. See ES 5.1 section 15.12.2.
- exports.parse = function (source, callback) {
- var result, value;
- Index = 0;
- Source = "" + source;
- result = get(lex());
- // If a JSON string contains multiple tokens, it is invalid.
- if (lex() != "$") {
- abort();
- }
- // Reset the parser state.
- Index = Source = null;
- return callback && getClass.call(callback) == functionClass ? walk((value = {}, value[""] = result, value), "", callback) : result;
- };
- }
- }
-
- exports["runInContext"] = runInContext;
- return exports;
- }
-
- if (freeExports && !isLoader) {
- // Export for CommonJS environments.
- runInContext(root, freeExports);
- } else {
- // Export for web browsers and JavaScript engines.
- var nativeJSON = root.JSON,
- previousJSON = root["JSON3"],
- isRestored = false;
-
- var JSON3 = runInContext(root, (root["JSON3"] = {
- // Public: Restores the original value of the global `JSON` object and
- // returns a reference to the `JSON3` object.
- "noConflict": function () {
- if (!isRestored) {
- isRestored = true;
- root.JSON = nativeJSON;
- root["JSON3"] = previousJSON;
- nativeJSON = previousJSON = null;
- }
- return JSON3;
- }
- }));
-
- root.JSON = {
- "parse": JSON3.parse,
- "stringify": JSON3.stringify
- };
- }
-
- // Export for asynchronous module loaders.
- if (isLoader) {
- define(function () {
- return JSON3;
- });
- }
-}).call(this);
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{}],55:[function(require,module,exports){
-/**
- * lodash 3.2.0 (Custom Build)
- * Build: `lodash modern modularize exports="npm" -o ./`
- * Copyright 2012-2015 The Dojo Foundation
- * Based on Underscore.js 1.8.3
- * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- * Available under MIT license
- */
-var baseCopy = require('lodash._basecopy'),
- keys = require('lodash.keys');
-
-/**
- * The base implementation of `_.assign` without support for argument juggling,
- * multiple sources, and `customizer` functions.
- *
- * @private
- * @param {Object} object The destination object.
- * @param {Object} source The source object.
- * @returns {Object} Returns `object`.
- */
-function baseAssign(object, source) {
- return source == null
- ? object
- : baseCopy(source, keys(source), object);
-}
-
-module.exports = baseAssign;
-
-},{"lodash._basecopy":56,"lodash.keys":63}],56:[function(require,module,exports){
-/**
- * lodash 3.0.1 (Custom Build)
- * Build: `lodash modern modularize exports="npm" -o ./`
- * Copyright 2012-2015 The Dojo Foundation
- * Based on Underscore.js 1.8.3
- * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- * Available under MIT license
- */
-
-/**
- * Copies properties of `source` to `object`.
- *
- * @private
- * @param {Object} source The object to copy properties from.
- * @param {Array} props The property names to copy.
- * @param {Object} [object={}] The object to copy properties to.
- * @returns {Object} Returns `object`.
- */
-function baseCopy(source, props, object) {
- object || (object = {});
-
- var index = -1,
- length = props.length;
-
- while (++index < length) {
- var key = props[index];
- object[key] = source[key];
- }
- return object;
-}
-
-module.exports = baseCopy;
-
-},{}],57:[function(require,module,exports){
-/**
- * lodash 3.0.3 (Custom Build)
- * Build: `lodash modern modularize exports="npm" -o ./`
- * Copyright 2012-2015 The Dojo Foundation
- * Based on Underscore.js 1.8.3
- * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- * Available under MIT license
- */
-
-/**
- * The base implementation of `_.create` without support for assigning
- * properties to the created object.
- *
- * @private
- * @param {Object} prototype The object to inherit from.
- * @returns {Object} Returns the new object.
- */
-var baseCreate = (function() {
- function object() {}
- return function(prototype) {
- if (isObject(prototype)) {
- object.prototype = prototype;
- var result = new object;
- object.prototype = undefined;
- }
- return result || {};
- };
-}());
-
-/**
- * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
- * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(1);
- * // => false
- */
-function isObject(value) {
- // Avoid a V8 JIT bug in Chrome 19-20.
- // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
- var type = typeof value;
- return !!value && (type == 'object' || type == 'function');
-}
-
-module.exports = baseCreate;
-
-},{}],58:[function(require,module,exports){
-/**
- * lodash 3.9.1 (Custom Build)
- * Build: `lodash modern modularize exports="npm" -o ./`
- * Copyright 2012-2015 The Dojo Foundation
- * Based on Underscore.js 1.8.3
- * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- * Available under MIT license
- */
-
-/** `Object#toString` result references. */
-var funcTag = '[object Function]';
-
-/** Used to detect host constructors (Safari > 5). */
-var reIsHostCtor = /^\[object .+?Constructor\]$/;
-
-/**
- * Checks if `value` is object-like.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- */
-function isObjectLike(value) {
- return !!value && typeof value == 'object';
-}
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to resolve the decompiled source of functions. */
-var fnToString = Function.prototype.toString;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/** Used to detect if a method is native. */
-var reIsNative = RegExp('^' +
- fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
- .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
-);
-
-/**
- * Gets the native function at `key` of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {string} key The key of the method to get.
- * @returns {*} Returns the function if it's native, else `undefined`.
- */
-function getNative(object, key) {
- var value = object == null ? undefined : object[key];
- return isNative(value) ? value : undefined;
-}
-
-/**
- * Checks if `value` is classified as a `Function` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isFunction(_);
- * // => true
- *
- * _.isFunction(/abc/);
- * // => false
- */
-function isFunction(value) {
- // The use of `Object#toString` avoids issues with the `typeof` operator
- // in older versions of Chrome and Safari which return 'function' for regexes
- // and Safari 8 equivalents which return 'object' for typed array constructors.
- return isObject(value) && objToString.call(value) == funcTag;
-}
-
-/**
- * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
- * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(1);
- * // => false
- */
-function isObject(value) {
- // Avoid a V8 JIT bug in Chrome 19-20.
- // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
- var type = typeof value;
- return !!value && (type == 'object' || type == 'function');
-}
-
-/**
- * Checks if `value` is a native function.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
- * @example
- *
- * _.isNative(Array.prototype.push);
- * // => true
- *
- * _.isNative(_);
- * // => false
- */
-function isNative(value) {
- if (value == null) {
- return false;
- }
- if (isFunction(value)) {
- return reIsNative.test(fnToString.call(value));
- }
- return isObjectLike(value) && reIsHostCtor.test(value);
-}
-
-module.exports = getNative;
-
-},{}],59:[function(require,module,exports){
-/**
- * lodash 3.0.9 (Custom Build)
- * Build: `lodash modern modularize exports="npm" -o ./`
- * Copyright 2012-2015 The Dojo Foundation
- * Based on Underscore.js 1.8.3
- * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- * Available under MIT license
- */
-
-/** Used to detect unsigned integer values. */
-var reIsUint = /^\d+$/;
-
-/**
- * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)
- * of an array-like value.
- */
-var MAX_SAFE_INTEGER = 9007199254740991;
-
-/**
- * The base implementation of `_.property` without support for deep paths.
- *
- * @private
- * @param {string} key The key of the property to get.
- * @returns {Function} Returns the new function.
- */
-function baseProperty(key) {
- return function(object) {
- return object == null ? undefined : object[key];
- };
-}
-
-/**
- * Gets the "length" property value of `object`.
- *
- * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
- * that affects Safari on at least iOS 8.1-8.3 ARM64.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {*} Returns the "length" value.
- */
-var getLength = baseProperty('length');
-
-/**
- * Checks if `value` is array-like.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
- */
-function isArrayLike(value) {
- return value != null && isLength(getLength(value));
-}
-
-/**
- * Checks if `value` is a valid array-like index.
- *
- * @private
- * @param {*} value The value to check.
- * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
- * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
- */
-function isIndex(value, length) {
- value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
- length = length == null ? MAX_SAFE_INTEGER : length;
- return value > -1 && value % 1 == 0 && value < length;
-}
-
-/**
- * Checks if the provided arguments are from an iteratee call.
- *
- * @private
- * @param {*} value The potential iteratee value argument.
- * @param {*} index The potential iteratee index or key argument.
- * @param {*} object The potential iteratee object argument.
- * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.
- */
-function isIterateeCall(value, index, object) {
- if (!isObject(object)) {
- return false;
- }
- var type = typeof index;
- if (type == 'number'
- ? (isArrayLike(object) && isIndex(index, object.length))
- : (type == 'string' && index in object)) {
- var other = object[index];
- return value === value ? (value === other) : (other !== other);
- }
- return false;
-}
-
-/**
- * Checks if `value` is a valid array-like length.
- *
- * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength).
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
- */
-function isLength(value) {
- return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
-}
-
-/**
- * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
- * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(1);
- * // => false
- */
-function isObject(value) {
- // Avoid a V8 JIT bug in Chrome 19-20.
- // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
- var type = typeof value;
- return !!value && (type == 'object' || type == 'function');
-}
-
-module.exports = isIterateeCall;
-
-},{}],60:[function(require,module,exports){
-/**
- * lodash 3.1.1 (Custom Build)
- * Build: `lodash modern modularize exports="npm" -o ./`
- * Copyright 2012-2015 The Dojo Foundation
- * Based on Underscore.js 1.8.3
- * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- * Available under MIT license
- */
-var baseAssign = require('lodash._baseassign'),
- baseCreate = require('lodash._basecreate'),
- isIterateeCall = require('lodash._isiterateecall');
-
-/**
- * Creates an object that inherits from the given `prototype` object. If a
- * `properties` object is provided its own enumerable properties are assigned
- * to the created object.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} prototype The object to inherit from.
- * @param {Object} [properties] The properties to assign to the object.
- * @param- {Object} [guard] Enables use as a callback for functions like `_.map`.
- * @returns {Object} Returns the new object.
- * @example
- *
- * function Shape() {
- * this.x = 0;
- * this.y = 0;
- * }
- *
- * function Circle() {
- * Shape.call(this);
- * }
- *
- * Circle.prototype = _.create(Shape.prototype, {
- * 'constructor': Circle
- * });
- *
- * var circle = new Circle;
- * circle instanceof Circle;
- * // => true
- *
- * circle instanceof Shape;
- * // => true
- */
-function create(prototype, properties, guard) {
- var result = baseCreate(prototype);
- if (guard && isIterateeCall(prototype, properties, guard)) {
- properties = undefined;
- }
- return properties ? baseAssign(result, properties) : result;
-}
-
-module.exports = create;
-
-},{"lodash._baseassign":55,"lodash._basecreate":57,"lodash._isiterateecall":59}],61:[function(require,module,exports){
-/**
- * lodash (Custom Build)
- * Build: `lodash modularize exports="npm" -o ./`
- * Copyright jQuery Foundation and other contributors
- * Released under MIT license
- * Based on Underscore.js 1.8.3
- * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- */
-
-/** Used as references for various `Number` constants. */
-var MAX_SAFE_INTEGER = 9007199254740991;
-
-/** `Object#toString` result references. */
-var argsTag = '[object Arguments]',
- funcTag = '[object Function]',
- genTag = '[object GeneratorFunction]';
-
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objectToString = objectProto.toString;
-
-/** Built-in value references. */
-var propertyIsEnumerable = objectProto.propertyIsEnumerable;
-
-/**
- * Checks if `value` is likely an `arguments` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an `arguments` object,
- * else `false`.
- * @example
- *
- * _.isArguments(function() { return arguments; }());
- * // => true
- *
- * _.isArguments([1, 2, 3]);
- * // => false
- */
-function isArguments(value) {
- // Safari 8.1 makes `arguments.callee` enumerable in strict mode.
- return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&
- (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);
-}
-
-/**
- * Checks if `value` is array-like. A value is considered array-like if it's
- * not a function and has a `value.length` that's an integer greater than or
- * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
- * @example
- *
- * _.isArrayLike([1, 2, 3]);
- * // => true
- *
- * _.isArrayLike(document.body.children);
- * // => true
- *
- * _.isArrayLike('abc');
- * // => true
- *
- * _.isArrayLike(_.noop);
- * // => false
- */
-function isArrayLike(value) {
- return value != null && isLength(value.length) && !isFunction(value);
-}
-
-/**
- * This method is like `_.isArrayLike` except that it also checks if `value`
- * is an object.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an array-like object,
- * else `false`.
- * @example
- *
- * _.isArrayLikeObject([1, 2, 3]);
- * // => true
- *
- * _.isArrayLikeObject(document.body.children);
- * // => true
- *
- * _.isArrayLikeObject('abc');
- * // => false
- *
- * _.isArrayLikeObject(_.noop);
- * // => false
- */
-function isArrayLikeObject(value) {
- return isObjectLike(value) && isArrayLike(value);
-}
-
-/**
- * Checks if `value` is classified as a `Function` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a function, else `false`.
- * @example
- *
- * _.isFunction(_);
- * // => true
- *
- * _.isFunction(/abc/);
- * // => false
- */
-function isFunction(value) {
- // The use of `Object#toString` avoids issues with the `typeof` operator
- // in Safari 8-9 which returns 'object' for typed array and other constructors.
- var tag = isObject(value) ? objectToString.call(value) : '';
- return tag == funcTag || tag == genTag;
-}
-
-/**
- * Checks if `value` is a valid array-like length.
- *
- * **Note:** This method is loosely based on
- * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
- * @example
- *
- * _.isLength(3);
- * // => true
- *
- * _.isLength(Number.MIN_VALUE);
- * // => false
- *
- * _.isLength(Infinity);
- * // => false
- *
- * _.isLength('3');
- * // => false
- */
-function isLength(value) {
- return typeof value == 'number' &&
- value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
-}
-
-/**
- * Checks if `value` is the
- * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
- * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(_.noop);
- * // => true
- *
- * _.isObject(null);
- * // => false
- */
-function isObject(value) {
- var type = typeof value;
- return !!value && (type == 'object' || type == 'function');
-}
-
-/**
- * Checks if `value` is object-like. A value is object-like if it's not `null`
- * and has a `typeof` result of "object".
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- * @example
- *
- * _.isObjectLike({});
- * // => true
- *
- * _.isObjectLike([1, 2, 3]);
- * // => true
- *
- * _.isObjectLike(_.noop);
- * // => false
- *
- * _.isObjectLike(null);
- * // => false
- */
-function isObjectLike(value) {
- return !!value && typeof value == 'object';
-}
-
-module.exports = isArguments;
-
-},{}],62:[function(require,module,exports){
-/**
- * lodash 3.0.4 (Custom Build)
- * Build: `lodash modern modularize exports="npm" -o ./`
- * Copyright 2012-2015 The Dojo Foundation
- * Based on Underscore.js 1.8.3
- * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- * Available under MIT license
- */
-
-/** `Object#toString` result references. */
-var arrayTag = '[object Array]',
- funcTag = '[object Function]';
-
-/** Used to detect host constructors (Safari > 5). */
-var reIsHostCtor = /^\[object .+?Constructor\]$/;
-
-/**
- * Checks if `value` is object-like.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- */
-function isObjectLike(value) {
- return !!value && typeof value == 'object';
-}
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to resolve the decompiled source of functions. */
-var fnToString = Function.prototype.toString;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objToString = objectProto.toString;
-
-/** Used to detect if a method is native. */
-var reIsNative = RegExp('^' +
- fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
- .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
-);
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeIsArray = getNative(Array, 'isArray');
-
-/**
- * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
- * of an array-like value.
- */
-var MAX_SAFE_INTEGER = 9007199254740991;
-
-/**
- * Gets the native function at `key` of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {string} key The key of the method to get.
- * @returns {*} Returns the function if it's native, else `undefined`.
- */
-function getNative(object, key) {
- var value = object == null ? undefined : object[key];
- return isNative(value) ? value : undefined;
-}
-
-/**
- * Checks if `value` is a valid array-like length.
- *
- * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
- */
-function isLength(value) {
- return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
-}
-
-/**
- * Checks if `value` is classified as an `Array` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isArray([1, 2, 3]);
- * // => true
- *
- * _.isArray(function() { return arguments; }());
- * // => false
- */
-var isArray = nativeIsArray || function(value) {
- return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;
-};
-
-/**
- * Checks if `value` is classified as a `Function` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isFunction(_);
- * // => true
- *
- * _.isFunction(/abc/);
- * // => false
- */
-function isFunction(value) {
- // The use of `Object#toString` avoids issues with the `typeof` operator
- // in older versions of Chrome and Safari which return 'function' for regexes
- // and Safari 8 equivalents which return 'object' for typed array constructors.
- return isObject(value) && objToString.call(value) == funcTag;
-}
-
-/**
- * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
- * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(1);
- * // => false
- */
-function isObject(value) {
- // Avoid a V8 JIT bug in Chrome 19-20.
- // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
- var type = typeof value;
- return !!value && (type == 'object' || type == 'function');
-}
-
-/**
- * Checks if `value` is a native function.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
- * @example
- *
- * _.isNative(Array.prototype.push);
- * // => true
- *
- * _.isNative(_);
- * // => false
- */
-function isNative(value) {
- if (value == null) {
- return false;
- }
- if (isFunction(value)) {
- return reIsNative.test(fnToString.call(value));
- }
- return isObjectLike(value) && reIsHostCtor.test(value);
-}
-
-module.exports = isArray;
-
-},{}],63:[function(require,module,exports){
-/**
- * lodash 3.1.2 (Custom Build)
- * Build: `lodash modern modularize exports="npm" -o ./`
- * Copyright 2012-2015 The Dojo Foundation
- * Based on Underscore.js 1.8.3
- * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- * Available under MIT license
- */
-var getNative = require('lodash._getnative'),
- isArguments = require('lodash.isarguments'),
- isArray = require('lodash.isarray');
-
-/** Used to detect unsigned integer values. */
-var reIsUint = /^\d+$/;
-
-/** Used for native method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/* Native method references for those with the same name as other `lodash` methods. */
-var nativeKeys = getNative(Object, 'keys');
-
-/**
- * Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
- * of an array-like value.
- */
-var MAX_SAFE_INTEGER = 9007199254740991;
-
-/**
- * The base implementation of `_.property` without support for deep paths.
- *
- * @private
- * @param {string} key The key of the property to get.
- * @returns {Function} Returns the new function.
- */
-function baseProperty(key) {
- return function(object) {
- return object == null ? undefined : object[key];
- };
-}
-
-/**
- * Gets the "length" property value of `object`.
- *
- * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
- * that affects Safari on at least iOS 8.1-8.3 ARM64.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {*} Returns the "length" value.
- */
-var getLength = baseProperty('length');
-
-/**
- * Checks if `value` is array-like.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
- */
-function isArrayLike(value) {
- return value != null && isLength(getLength(value));
-}
-
-/**
- * Checks if `value` is a valid array-like index.
- *
- * @private
- * @param {*} value The value to check.
- * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
- * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
- */
-function isIndex(value, length) {
- value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
- length = length == null ? MAX_SAFE_INTEGER : length;
- return value > -1 && value % 1 == 0 && value < length;
-}
-
-/**
- * Checks if `value` is a valid array-like length.
- *
- * **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
- */
-function isLength(value) {
- return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
-}
-
-/**
- * A fallback implementation of `Object.keys` which creates an array of the
- * own enumerable property names of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- */
-function shimKeys(object) {
- var props = keysIn(object),
- propsLength = props.length,
- length = propsLength && object.length;
-
- var allowIndexes = !!length && isLength(length) &&
- (isArray(object) || isArguments(object));
-
- var index = -1,
- result = [];
-
- while (++index < propsLength) {
- var key = props[index];
- if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {
- result.push(key);
- }
- }
- return result;
-}
-
-/**
- * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
- * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(1);
- * // => false
- */
-function isObject(value) {
- // Avoid a V8 JIT bug in Chrome 19-20.
- // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
- var type = typeof value;
- return !!value && (type == 'object' || type == 'function');
-}
-
-/**
- * Creates an array of the own enumerable property names of `object`.
- *
- * **Note:** Non-object values are coerced to objects. See the
- * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)
- * for more details.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- * @example
- *
- * function Foo() {
- * this.a = 1;
- * this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.keys(new Foo);
- * // => ['a', 'b'] (iteration order is not guaranteed)
- *
- * _.keys('hi');
- * // => ['0', '1']
- */
-var keys = !nativeKeys ? shimKeys : function(object) {
- var Ctor = object == null ? undefined : object.constructor;
- if ((typeof Ctor == 'function' && Ctor.prototype === object) ||
- (typeof object != 'function' && isArrayLike(object))) {
- return shimKeys(object);
- }
- return isObject(object) ? nativeKeys(object) : [];
-};
-
-/**
- * Creates an array of the own and inherited enumerable property names of `object`.
- *
- * **Note:** Non-object values are coerced to objects.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- * @example
- *
- * function Foo() {
- * this.a = 1;
- * this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.keysIn(new Foo);
- * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
- */
-function keysIn(object) {
- if (object == null) {
- return [];
- }
- if (!isObject(object)) {
- object = Object(object);
- }
- var length = object.length;
- length = (length && isLength(length) &&
- (isArray(object) || isArguments(object)) && length) || 0;
-
- var Ctor = object.constructor,
- index = -1,
- isProto = typeof Ctor == 'function' && Ctor.prototype === object,
- result = Array(length),
- skipIndexes = length > 0;
-
- while (++index < length) {
- result[index] = (index + '');
- }
- for (var key in object) {
- if (!(skipIndexes && isIndex(key, length)) &&
- !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
- result.push(key);
- }
- }
- return result;
-}
-
-module.exports = keys;
-
-},{"lodash._getnative":58,"lodash.isarguments":61,"lodash.isarray":62}],64:[function(require,module,exports){
-(function (process){
-var path = require('path');
-var fs = require('fs');
-var _0777 = parseInt('0777', 8);
-
-module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP;
-
-function mkdirP (p, opts, f, made) {
- if (typeof opts === 'function') {
- f = opts;
- opts = {};
- }
- else if (!opts || typeof opts !== 'object') {
- opts = { mode: opts };
- }
-
- var mode = opts.mode;
- var xfs = opts.fs || fs;
-
- if (mode === undefined) {
- mode = _0777 & (~process.umask());
- }
- if (!made) made = null;
-
- var cb = f || function () {};
- p = path.resolve(p);
-
- xfs.mkdir(p, mode, function (er) {
- if (!er) {
- made = made || p;
- return cb(null, made);
- }
- switch (er.code) {
- case 'ENOENT':
- mkdirP(path.dirname(p), opts, function (er, made) {
- if (er) cb(er, made);
- else mkdirP(p, opts, cb, made);
- });
- break;
-
- // In the case of any other error, just see if there's a dir
- // there already. If so, then hooray! If not, then something
- // is borked.
- default:
- xfs.stat(p, function (er2, stat) {
- // if the stat fails, then that's super weird.
- // let the original error be the failure reason.
- if (er2 || !stat.isDirectory()) cb(er, made)
- else cb(null, made);
- });
- break;
- }
- });
-}
-
-mkdirP.sync = function sync (p, opts, made) {
- if (!opts || typeof opts !== 'object') {
- opts = { mode: opts };
- }
-
- var mode = opts.mode;
- var xfs = opts.fs || fs;
-
- if (mode === undefined) {
- mode = _0777 & (~process.umask());
- }
- if (!made) made = null;
-
- p = path.resolve(p);
-
- try {
- xfs.mkdirSync(p, mode);
- made = made || p;
- }
- catch (err0) {
- switch (err0.code) {
- case 'ENOENT' :
- made = sync(path.dirname(p), opts, made);
- sync(p, opts, made);
- break;
-
- // In the case of any other error, just see if there's a dir
- // there already. If so, then hooray! If not, then something
- // is borked.
- default:
- var stat;
- try {
- stat = xfs.statSync(p);
- }
- catch (err1) {
- throw err0;
- }
- if (!stat.isDirectory()) throw err0;
- break;
- }
- }
-
- return made;
-};
-
-}).call(this,require('_process'))
-},{"_process":67,"fs":42,"path":42}],65:[function(require,module,exports){
-exports.endianness = function () { return 'LE' };
-
-exports.hostname = function () {
- if (typeof location !== 'undefined') {
- return location.hostname
- }
- else return '';
-};
-
-exports.loadavg = function () { return [] };
-
-exports.uptime = function () { return 0 };
-
-exports.freemem = function () {
- return Number.MAX_VALUE;
-};
-
-exports.totalmem = function () {
- return Number.MAX_VALUE;
-};
-
-exports.cpus = function () { return [] };
-
-exports.type = function () { return 'Browser' };
-
-exports.release = function () {
- if (typeof navigator !== 'undefined') {
- return navigator.appVersion;
- }
- return '';
-};
-
-exports.networkInterfaces
-= exports.getNetworkInterfaces
-= function () { return {} };
-
-exports.arch = function () { return 'javascript' };
-
-exports.platform = function () { return 'browser' };
-
-exports.tmpdir = exports.tmpDir = function () {
- return '/tmp';
-};
-
-exports.EOL = '\n';
-
-},{}],66:[function(require,module,exports){
-(function (process){
-'use strict';
-
-if (!process.version ||
- process.version.indexOf('v0.') === 0 ||
- process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
- module.exports = nextTick;
-} else {
- module.exports = process.nextTick;
-}
-
-function nextTick(fn, arg1, arg2, arg3) {
- if (typeof fn !== 'function') {
- throw new TypeError('"callback" argument must be a function');
- }
- var len = arguments.length;
- var args, i;
- switch (len) {
- case 0:
- case 1:
- return process.nextTick(fn);
- case 2:
- return process.nextTick(function afterTickOne() {
- fn.call(null, arg1);
- });
- case 3:
- return process.nextTick(function afterTickTwo() {
- fn.call(null, arg1, arg2);
- });
- case 4:
- return process.nextTick(function afterTickThree() {
- fn.call(null, arg1, arg2, arg3);
- });
- default:
- args = new Array(len - 1);
- i = 0;
- while (i < args.length) {
- args[i++] = arguments[i];
- }
- return process.nextTick(function afterTick() {
- fn.apply(null, args);
- });
- }
-}
-
-}).call(this,require('_process'))
-},{"_process":67}],67:[function(require,module,exports){
-// shim for using process in browser
-var process = module.exports = {};
-
-// cached from whatever global is present so that test runners that stub it
-// don't break things. But we need to wrap it in a try catch in case it is
-// wrapped in strict mode code which doesn't define any globals. It's inside a
-// function because try/catches deoptimize in certain engines.
-
-var cachedSetTimeout;
-var cachedClearTimeout;
-
-function defaultSetTimout() {
- throw new Error('setTimeout has not been defined');
-}
-function defaultClearTimeout () {
- throw new Error('clearTimeout has not been defined');
-}
-(function () {
- try {
- if (typeof setTimeout === 'function') {
- cachedSetTimeout = setTimeout;
- } else {
- cachedSetTimeout = defaultSetTimout;
- }
- } catch (e) {
- cachedSetTimeout = defaultSetTimout;
- }
- try {
- if (typeof clearTimeout === 'function') {
- cachedClearTimeout = clearTimeout;
- } else {
- cachedClearTimeout = defaultClearTimeout;
- }
- } catch (e) {
- cachedClearTimeout = defaultClearTimeout;
- }
-} ())
-function runTimeout(fun) {
- if (cachedSetTimeout === setTimeout) {
- //normal enviroments in sane situations
- return setTimeout(fun, 0);
- }
- // if setTimeout wasn't available but was latter defined
- if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
- cachedSetTimeout = setTimeout;
- return setTimeout(fun, 0);
- }
- try {
- // when when somebody has screwed with setTimeout but no I.E. maddness
- return cachedSetTimeout(fun, 0);
- } catch(e){
- try {
- // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
- return cachedSetTimeout.call(null, fun, 0);
- } catch(e){
- // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
- return cachedSetTimeout.call(this, fun, 0);
- }
- }
-
-
-}
-function runClearTimeout(marker) {
- if (cachedClearTimeout === clearTimeout) {
- //normal enviroments in sane situations
- return clearTimeout(marker);
- }
- // if clearTimeout wasn't available but was latter defined
- if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
- cachedClearTimeout = clearTimeout;
- return clearTimeout(marker);
- }
- try {
- // when when somebody has screwed with setTimeout but no I.E. maddness
- return cachedClearTimeout(marker);
- } catch (e){
- try {
- // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
- return cachedClearTimeout.call(null, marker);
- } catch (e){
- // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
- // Some versions of I.E. have different rules for clearTimeout vs setTimeout
- return cachedClearTimeout.call(this, marker);
- }
- }
-
-
-
-}
-var queue = [];
-var draining = false;
-var currentQueue;
-var queueIndex = -1;
-
-function cleanUpNextTick() {
- if (!draining || !currentQueue) {
- return;
- }
- draining = false;
- if (currentQueue.length) {
- queue = currentQueue.concat(queue);
- } else {
- queueIndex = -1;
- }
- if (queue.length) {
- drainQueue();
- }
-}
-
-function drainQueue() {
- if (draining) {
- return;
- }
- var timeout = runTimeout(cleanUpNextTick);
- draining = true;
-
- var len = queue.length;
- while(len) {
- currentQueue = queue;
- queue = [];
- while (++queueIndex < len) {
- if (currentQueue) {
- currentQueue[queueIndex].run();
- }
- }
- queueIndex = -1;
- len = queue.length;
- }
- currentQueue = null;
- draining = false;
- runClearTimeout(timeout);
-}
-
-process.nextTick = function (fun) {
- var args = new Array(arguments.length - 1);
- if (arguments.length > 1) {
- for (var i = 1; i < arguments.length; i++) {
- args[i - 1] = arguments[i];
- }
- }
- queue.push(new Item(fun, args));
- if (queue.length === 1 && !draining) {
- runTimeout(drainQueue);
- }
-};
-
-// v8 likes predictible objects
-function Item(fun, array) {
- this.fun = fun;
- this.array = array;
-}
-Item.prototype.run = function () {
- this.fun.apply(null, this.array);
-};
-process.title = 'browser';
-process.browser = true;
-process.env = {};
-process.argv = [];
-process.version = ''; // empty string to avoid regexp issues
-process.versions = {};
-
-function noop() {}
-
-process.on = noop;
-process.addListener = noop;
-process.once = noop;
-process.off = noop;
-process.removeListener = noop;
-process.removeAllListeners = noop;
-process.emit = noop;
-
-process.binding = function (name) {
- throw new Error('process.binding is not supported');
-};
-
-process.cwd = function () { return '/' };
-process.chdir = function (dir) {
- throw new Error('process.chdir is not supported');
-};
-process.umask = function() { return 0; };
-
-},{}],68:[function(require,module,exports){
-module.exports = require("./lib/_stream_duplex.js")
-
-},{"./lib/_stream_duplex.js":69}],69:[function(require,module,exports){
-// a duplex stream is just a stream that is both readable and writable.
-// Since JS doesn't have multiple prototypal inheritance, this class
-// prototypally inherits from Readable, and then parasitically from
-// Writable.
-
-'use strict';
-
-/**/
-
-var objectKeys = Object.keys || function (obj) {
- var keys = [];
- for (var key in obj) {
- keys.push(key);
- }return keys;
-};
-/* */
-
-module.exports = Duplex;
-
-/**/
-var processNextTick = require('process-nextick-args');
-/* */
-
-/**/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/* */
-
-var Readable = require('./_stream_readable');
-var Writable = require('./_stream_writable');
-
-util.inherits(Duplex, Readable);
-
-var keys = objectKeys(Writable.prototype);
-for (var v = 0; v < keys.length; v++) {
- var method = keys[v];
- if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
-}
-
-function Duplex(options) {
- if (!(this instanceof Duplex)) return new Duplex(options);
-
- Readable.call(this, options);
- Writable.call(this, options);
-
- if (options && options.readable === false) this.readable = false;
-
- if (options && options.writable === false) this.writable = false;
-
- this.allowHalfOpen = true;
- if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
-
- this.once('end', onend);
-}
-
-// the no-half-open enforcer
-function onend() {
- // if we allow half-open state, or if the writable side ended,
- // then we're ok.
- if (this.allowHalfOpen || this._writableState.ended) return;
-
- // no more data can be written.
- // But allow more writes to happen in this tick.
- processNextTick(onEndNT, this);
-}
-
-function onEndNT(self) {
- self.end();
-}
-
-function forEach(xs, f) {
- for (var i = 0, l = xs.length; i < l; i++) {
- f(xs[i], i);
- }
-}
-},{"./_stream_readable":71,"./_stream_writable":73,"core-util-is":45,"inherits":51,"process-nextick-args":66}],70:[function(require,module,exports){
-// a passthrough stream.
-// basically just the most minimal sort of Transform stream.
-// Every written chunk gets output as-is.
-
-'use strict';
-
-module.exports = PassThrough;
-
-var Transform = require('./_stream_transform');
-
-/**/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/* */
-
-util.inherits(PassThrough, Transform);
-
-function PassThrough(options) {
- if (!(this instanceof PassThrough)) return new PassThrough(options);
-
- Transform.call(this, options);
-}
-
-PassThrough.prototype._transform = function (chunk, encoding, cb) {
- cb(null, chunk);
-};
-},{"./_stream_transform":72,"core-util-is":45,"inherits":51}],71:[function(require,module,exports){
-(function (process){
-'use strict';
-
-module.exports = Readable;
-
-/**/
-var processNextTick = require('process-nextick-args');
-/* */
-
-/**/
-var isArray = require('isarray');
-/* */
-
-Readable.ReadableState = ReadableState;
-
-/**/
-var EE = require('events').EventEmitter;
-
-var EElistenerCount = function (emitter, type) {
- return emitter.listeners(type).length;
-};
-/* */
-
-/**/
-var Stream;
-(function () {
- try {
- Stream = require('st' + 'ream');
- } catch (_) {} finally {
- if (!Stream) Stream = require('events').EventEmitter;
- }
-})();
-/* */
-
-var Buffer = require('buffer').Buffer;
-/**/
-var bufferShim = require('buffer-shims');
-/* */
-
-/**/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/* */
-
-/**/
-var debugUtil = require('util');
-var debug = void 0;
-if (debugUtil && debugUtil.debuglog) {
- debug = debugUtil.debuglog('stream');
-} else {
- debug = function () {};
-}
-/* */
-
-var BufferList = require('./internal/streams/BufferList');
-var StringDecoder;
-
-util.inherits(Readable, Stream);
-
-function prependListener(emitter, event, fn) {
- if (typeof emitter.prependListener === 'function') {
- return emitter.prependListener(event, fn);
- } else {
- // This is a hack to make sure that our error handler is attached before any
- // userland ones. NEVER DO THIS. This is here only because this code needs
- // to continue to work with older versions of Node.js that do not include
- // the prependListener() method. The goal is to eventually remove this hack.
- if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
- }
-}
-
-var Duplex;
-function ReadableState(options, stream) {
- Duplex = Duplex || require('./_stream_duplex');
-
- options = options || {};
-
- // object stream flag. Used to make read(n) ignore n and to
- // make all the buffer merging and length checks go away
- this.objectMode = !!options.objectMode;
-
- if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
-
- // the point at which it stops calling _read() to fill the buffer
- // Note: 0 is a valid value, means "don't call _read preemptively ever"
- var hwm = options.highWaterMark;
- var defaultHwm = this.objectMode ? 16 : 16 * 1024;
- this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;
-
- // cast to ints.
- this.highWaterMark = ~ ~this.highWaterMark;
-
- // A linked list is used to store data chunks instead of an array because the
- // linked list can remove elements from the beginning faster than
- // array.shift()
- this.buffer = new BufferList();
- this.length = 0;
- this.pipes = null;
- this.pipesCount = 0;
- this.flowing = null;
- this.ended = false;
- this.endEmitted = false;
- this.reading = false;
-
- // a flag to be able to tell if the onwrite cb is called immediately,
- // or on a later tick. We set this to true at first, because any
- // actions that shouldn't happen until "later" should generally also
- // not happen before the first write call.
- this.sync = true;
-
- // whenever we return null, then we set a flag to say
- // that we're awaiting a 'readable' event emission.
- this.needReadable = false;
- this.emittedReadable = false;
- this.readableListening = false;
- this.resumeScheduled = false;
-
- // Crypto is kind of old and crusty. Historically, its default string
- // encoding is 'binary' so we have to make this configurable.
- // Everything else in the universe uses 'utf8', though.
- this.defaultEncoding = options.defaultEncoding || 'utf8';
-
- // when piping, we only care about 'readable' events that happen
- // after read()ing all the bytes and not getting any pushback.
- this.ranOut = false;
-
- // the number of writers that are awaiting a drain event in .pipe()s
- this.awaitDrain = 0;
-
- // if true, a maybeReadMore has been scheduled
- this.readingMore = false;
-
- this.decoder = null;
- this.encoding = null;
- if (options.encoding) {
- if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
- this.decoder = new StringDecoder(options.encoding);
- this.encoding = options.encoding;
- }
-}
-
-var Duplex;
-function Readable(options) {
- Duplex = Duplex || require('./_stream_duplex');
-
- if (!(this instanceof Readable)) return new Readable(options);
-
- this._readableState = new ReadableState(options, this);
-
- // legacy
- this.readable = true;
-
- if (options && typeof options.read === 'function') this._read = options.read;
-
- Stream.call(this);
-}
-
-// Manually shove something into the read() buffer.
-// This returns true if the highWaterMark has not been hit yet,
-// similar to how Writable.write() returns true if you should
-// write() some more.
-Readable.prototype.push = function (chunk, encoding) {
- var state = this._readableState;
-
- if (!state.objectMode && typeof chunk === 'string') {
- encoding = encoding || state.defaultEncoding;
- if (encoding !== state.encoding) {
- chunk = bufferShim.from(chunk, encoding);
- encoding = '';
- }
- }
-
- return readableAddChunk(this, state, chunk, encoding, false);
-};
-
-// Unshift should *always* be something directly out of read()
-Readable.prototype.unshift = function (chunk) {
- var state = this._readableState;
- return readableAddChunk(this, state, chunk, '', true);
-};
-
-Readable.prototype.isPaused = function () {
- return this._readableState.flowing === false;
-};
-
-function readableAddChunk(stream, state, chunk, encoding, addToFront) {
- var er = chunkInvalid(state, chunk);
- if (er) {
- stream.emit('error', er);
- } else if (chunk === null) {
- state.reading = false;
- onEofChunk(stream, state);
- } else if (state.objectMode || chunk && chunk.length > 0) {
- if (state.ended && !addToFront) {
- var e = new Error('stream.push() after EOF');
- stream.emit('error', e);
- } else if (state.endEmitted && addToFront) {
- var _e = new Error('stream.unshift() after end event');
- stream.emit('error', _e);
- } else {
- var skipAdd;
- if (state.decoder && !addToFront && !encoding) {
- chunk = state.decoder.write(chunk);
- skipAdd = !state.objectMode && chunk.length === 0;
- }
-
- if (!addToFront) state.reading = false;
-
- // Don't add to the buffer if we've decoded to an empty string chunk and
- // we're not in object mode
- if (!skipAdd) {
- // if we want the data now, just emit it.
- if (state.flowing && state.length === 0 && !state.sync) {
- stream.emit('data', chunk);
- stream.read(0);
- } else {
- // update the buffer info.
- state.length += state.objectMode ? 1 : chunk.length;
- if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
-
- if (state.needReadable) emitReadable(stream);
- }
- }
-
- maybeReadMore(stream, state);
- }
- } else if (!addToFront) {
- state.reading = false;
- }
-
- return needMoreData(state);
-}
-
-// if it's past the high water mark, we can push in some more.
-// Also, if we have no data yet, we can stand some
-// more bytes. This is to work around cases where hwm=0,
-// such as the repl. Also, if the push() triggered a
-// readable event, and the user called read(largeNumber) such that
-// needReadable was set, then we ought to push more, so that another
-// 'readable' event will be triggered.
-function needMoreData(state) {
- return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
-}
-
-// backwards compatibility.
-Readable.prototype.setEncoding = function (enc) {
- if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
- this._readableState.decoder = new StringDecoder(enc);
- this._readableState.encoding = enc;
- return this;
-};
-
-// Don't raise the hwm > 8MB
-var MAX_HWM = 0x800000;
-function computeNewHighWaterMark(n) {
- if (n >= MAX_HWM) {
- n = MAX_HWM;
- } else {
- // Get the next highest power of 2 to prevent increasing hwm excessively in
- // tiny amounts
- n--;
- n |= n >>> 1;
- n |= n >>> 2;
- n |= n >>> 4;
- n |= n >>> 8;
- n |= n >>> 16;
- n++;
- }
- return n;
-}
-
-// This function is designed to be inlinable, so please take care when making
-// changes to the function body.
-function howMuchToRead(n, state) {
- if (n <= 0 || state.length === 0 && state.ended) return 0;
- if (state.objectMode) return 1;
- if (n !== n) {
- // Only flow one buffer at a time
- if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
- }
- // If we're asking for more than the current hwm, then raise the hwm.
- if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
- if (n <= state.length) return n;
- // Don't have enough
- if (!state.ended) {
- state.needReadable = true;
- return 0;
- }
- return state.length;
-}
-
-// you can override either this method, or the async _read(n) below.
-Readable.prototype.read = function (n) {
- debug('read', n);
- n = parseInt(n, 10);
- var state = this._readableState;
- var nOrig = n;
-
- if (n !== 0) state.emittedReadable = false;
-
- // if we're doing read(0) to trigger a readable event, but we
- // already have a bunch of data in the buffer, then just trigger
- // the 'readable' event and move on.
- if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
- debug('read: emitReadable', state.length, state.ended);
- if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
- return null;
- }
-
- n = howMuchToRead(n, state);
-
- // if we've ended, and we're now clear, then finish it up.
- if (n === 0 && state.ended) {
- if (state.length === 0) endReadable(this);
- return null;
- }
-
- // All the actual chunk generation logic needs to be
- // *below* the call to _read. The reason is that in certain
- // synthetic stream cases, such as passthrough streams, _read
- // may be a completely synchronous operation which may change
- // the state of the read buffer, providing enough data when
- // before there was *not* enough.
- //
- // So, the steps are:
- // 1. Figure out what the state of things will be after we do
- // a read from the buffer.
- //
- // 2. If that resulting state will trigger a _read, then call _read.
- // Note that this may be asynchronous, or synchronous. Yes, it is
- // deeply ugly to write APIs this way, but that still doesn't mean
- // that the Readable class should behave improperly, as streams are
- // designed to be sync/async agnostic.
- // Take note if the _read call is sync or async (ie, if the read call
- // has returned yet), so that we know whether or not it's safe to emit
- // 'readable' etc.
- //
- // 3. Actually pull the requested chunks out of the buffer and return.
-
- // if we need a readable event, then we need to do some reading.
- var doRead = state.needReadable;
- debug('need readable', doRead);
-
- // if we currently have less than the highWaterMark, then also read some
- if (state.length === 0 || state.length - n < state.highWaterMark) {
- doRead = true;
- debug('length less than watermark', doRead);
- }
-
- // however, if we've ended, then there's no point, and if we're already
- // reading, then it's unnecessary.
- if (state.ended || state.reading) {
- doRead = false;
- debug('reading or ended', doRead);
- } else if (doRead) {
- debug('do read');
- state.reading = true;
- state.sync = true;
- // if the length is currently zero, then we *need* a readable event.
- if (state.length === 0) state.needReadable = true;
- // call internal read method
- this._read(state.highWaterMark);
- state.sync = false;
- // If _read pushed data synchronously, then `reading` will be false,
- // and we need to re-evaluate how much data we can return to the user.
- if (!state.reading) n = howMuchToRead(nOrig, state);
- }
-
- var ret;
- if (n > 0) ret = fromList(n, state);else ret = null;
-
- if (ret === null) {
- state.needReadable = true;
- n = 0;
- } else {
- state.length -= n;
- }
-
- if (state.length === 0) {
- // If we have nothing in the buffer, then we want to know
- // as soon as we *do* get something into the buffer.
- if (!state.ended) state.needReadable = true;
-
- // If we tried to read() past the EOF, then emit end on the next tick.
- if (nOrig !== n && state.ended) endReadable(this);
- }
-
- if (ret !== null) this.emit('data', ret);
-
- return ret;
-};
-
-function chunkInvalid(state, chunk) {
- var er = null;
- if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) {
- er = new TypeError('Invalid non-string/buffer chunk');
- }
- return er;
-}
-
-function onEofChunk(stream, state) {
- if (state.ended) return;
- if (state.decoder) {
- var chunk = state.decoder.end();
- if (chunk && chunk.length) {
- state.buffer.push(chunk);
- state.length += state.objectMode ? 1 : chunk.length;
- }
- }
- state.ended = true;
-
- // emit 'readable' now to make sure it gets picked up.
- emitReadable(stream);
-}
-
-// Don't emit readable right away in sync mode, because this can trigger
-// another read() call => stack overflow. This way, it might trigger
-// a nextTick recursion warning, but that's not so bad.
-function emitReadable(stream) {
- var state = stream._readableState;
- state.needReadable = false;
- if (!state.emittedReadable) {
- debug('emitReadable', state.flowing);
- state.emittedReadable = true;
- if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream);
- }
-}
-
-function emitReadable_(stream) {
- debug('emit readable');
- stream.emit('readable');
- flow(stream);
-}
-
-// at this point, the user has presumably seen the 'readable' event,
-// and called read() to consume some data. that may have triggered
-// in turn another _read(n) call, in which case reading = true if
-// it's in progress.
-// However, if we're not ended, or reading, and the length < hwm,
-// then go ahead and try to read some more preemptively.
-function maybeReadMore(stream, state) {
- if (!state.readingMore) {
- state.readingMore = true;
- processNextTick(maybeReadMore_, stream, state);
- }
-}
-
-function maybeReadMore_(stream, state) {
- var len = state.length;
- while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
- debug('maybeReadMore read 0');
- stream.read(0);
- if (len === state.length)
- // didn't get any data, stop spinning.
- break;else len = state.length;
- }
- state.readingMore = false;
-}
-
-// abstract method. to be overridden in specific implementation classes.
-// call cb(er, data) where data is <= n in length.
-// for virtual (non-string, non-buffer) streams, "length" is somewhat
-// arbitrary, and perhaps not very meaningful.
-Readable.prototype._read = function (n) {
- this.emit('error', new Error('not implemented'));
-};
-
-Readable.prototype.pipe = function (dest, pipeOpts) {
- var src = this;
- var state = this._readableState;
-
- switch (state.pipesCount) {
- case 0:
- state.pipes = dest;
- break;
- case 1:
- state.pipes = [state.pipes, dest];
- break;
- default:
- state.pipes.push(dest);
- break;
- }
- state.pipesCount += 1;
- debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
-
- var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
-
- var endFn = doEnd ? onend : cleanup;
- if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn);
-
- dest.on('unpipe', onunpipe);
- function onunpipe(readable) {
- debug('onunpipe');
- if (readable === src) {
- cleanup();
- }
- }
-
- function onend() {
- debug('onend');
- dest.end();
- }
-
- // when the dest drains, it reduces the awaitDrain counter
- // on the source. This would be more elegant with a .once()
- // handler in flow(), but adding and removing repeatedly is
- // too slow.
- var ondrain = pipeOnDrain(src);
- dest.on('drain', ondrain);
-
- var cleanedUp = false;
- function cleanup() {
- debug('cleanup');
- // cleanup event handlers once the pipe is broken
- dest.removeListener('close', onclose);
- dest.removeListener('finish', onfinish);
- dest.removeListener('drain', ondrain);
- dest.removeListener('error', onerror);
- dest.removeListener('unpipe', onunpipe);
- src.removeListener('end', onend);
- src.removeListener('end', cleanup);
- src.removeListener('data', ondata);
-
- cleanedUp = true;
-
- // if the reader is waiting for a drain event from this
- // specific writer, then it would cause it to never start
- // flowing again.
- // So, if this is awaiting a drain, then we just call it now.
- // If we don't know, then assume that we are waiting for one.
- if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
- }
-
- // If the user pushes more data while we're writing to dest then we'll end up
- // in ondata again. However, we only want to increase awaitDrain once because
- // dest will only emit one 'drain' event for the multiple writes.
- // => Introduce a guard on increasing awaitDrain.
- var increasedAwaitDrain = false;
- src.on('data', ondata);
- function ondata(chunk) {
- debug('ondata');
- increasedAwaitDrain = false;
- var ret = dest.write(chunk);
- if (false === ret && !increasedAwaitDrain) {
- // If the user unpiped during `dest.write()`, it is possible
- // to get stuck in a permanently paused state if that write
- // also returned false.
- // => Check whether `dest` is still a piping destination.
- if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
- debug('false write response, pause', src._readableState.awaitDrain);
- src._readableState.awaitDrain++;
- increasedAwaitDrain = true;
- }
- src.pause();
- }
- }
-
- // if the dest has an error, then stop piping into it.
- // however, don't suppress the throwing behavior for this.
- function onerror(er) {
- debug('onerror', er);
- unpipe();
- dest.removeListener('error', onerror);
- if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
- }
-
- // Make sure our error handler is attached before userland ones.
- prependListener(dest, 'error', onerror);
-
- // Both close and finish should trigger unpipe, but only once.
- function onclose() {
- dest.removeListener('finish', onfinish);
- unpipe();
- }
- dest.once('close', onclose);
- function onfinish() {
- debug('onfinish');
- dest.removeListener('close', onclose);
- unpipe();
- }
- dest.once('finish', onfinish);
-
- function unpipe() {
- debug('unpipe');
- src.unpipe(dest);
- }
-
- // tell the dest that it's being piped to
- dest.emit('pipe', src);
-
- // start the flow if it hasn't been started already.
- if (!state.flowing) {
- debug('pipe resume');
- src.resume();
- }
-
- return dest;
-};
-
-function pipeOnDrain(src) {
- return function () {
- var state = src._readableState;
- debug('pipeOnDrain', state.awaitDrain);
- if (state.awaitDrain) state.awaitDrain--;
- if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
- state.flowing = true;
- flow(src);
- }
- };
-}
-
-Readable.prototype.unpipe = function (dest) {
- var state = this._readableState;
-
- // if we're not piping anywhere, then do nothing.
- if (state.pipesCount === 0) return this;
-
- // just one destination. most common case.
- if (state.pipesCount === 1) {
- // passed in one, but it's not the right one.
- if (dest && dest !== state.pipes) return this;
-
- if (!dest) dest = state.pipes;
-
- // got a match.
- state.pipes = null;
- state.pipesCount = 0;
- state.flowing = false;
- if (dest) dest.emit('unpipe', this);
- return this;
- }
-
- // slow case. multiple pipe destinations.
-
- if (!dest) {
- // remove all.
- var dests = state.pipes;
- var len = state.pipesCount;
- state.pipes = null;
- state.pipesCount = 0;
- state.flowing = false;
-
- for (var _i = 0; _i < len; _i++) {
- dests[_i].emit('unpipe', this);
- }return this;
- }
-
- // try to find the right one.
- var i = indexOf(state.pipes, dest);
- if (i === -1) return this;
-
- state.pipes.splice(i, 1);
- state.pipesCount -= 1;
- if (state.pipesCount === 1) state.pipes = state.pipes[0];
-
- dest.emit('unpipe', this);
-
- return this;
-};
-
-// set up data events if they are asked for
-// Ensure readable listeners eventually get something
-Readable.prototype.on = function (ev, fn) {
- var res = Stream.prototype.on.call(this, ev, fn);
-
- if (ev === 'data') {
- // Start flowing on next tick if stream isn't explicitly paused
- if (this._readableState.flowing !== false) this.resume();
- } else if (ev === 'readable') {
- var state = this._readableState;
- if (!state.endEmitted && !state.readableListening) {
- state.readableListening = state.needReadable = true;
- state.emittedReadable = false;
- if (!state.reading) {
- processNextTick(nReadingNextTick, this);
- } else if (state.length) {
- emitReadable(this, state);
- }
- }
- }
-
- return res;
-};
-Readable.prototype.addListener = Readable.prototype.on;
-
-function nReadingNextTick(self) {
- debug('readable nexttick read 0');
- self.read(0);
-}
-
-// pause() and resume() are remnants of the legacy readable stream API
-// If the user uses them, then switch into old mode.
-Readable.prototype.resume = function () {
- var state = this._readableState;
- if (!state.flowing) {
- debug('resume');
- state.flowing = true;
- resume(this, state);
- }
- return this;
-};
-
-function resume(stream, state) {
- if (!state.resumeScheduled) {
- state.resumeScheduled = true;
- processNextTick(resume_, stream, state);
- }
-}
-
-function resume_(stream, state) {
- if (!state.reading) {
- debug('resume read 0');
- stream.read(0);
- }
-
- state.resumeScheduled = false;
- state.awaitDrain = 0;
- stream.emit('resume');
- flow(stream);
- if (state.flowing && !state.reading) stream.read(0);
-}
-
-Readable.prototype.pause = function () {
- debug('call pause flowing=%j', this._readableState.flowing);
- if (false !== this._readableState.flowing) {
- debug('pause');
- this._readableState.flowing = false;
- this.emit('pause');
- }
- return this;
-};
-
-function flow(stream) {
- var state = stream._readableState;
- debug('flow', state.flowing);
- while (state.flowing && stream.read() !== null) {}
-}
-
-// wrap an old-style stream as the async data source.
-// This is *not* part of the readable stream interface.
-// It is an ugly unfortunate mess of history.
-Readable.prototype.wrap = function (stream) {
- var state = this._readableState;
- var paused = false;
-
- var self = this;
- stream.on('end', function () {
- debug('wrapped end');
- if (state.decoder && !state.ended) {
- var chunk = state.decoder.end();
- if (chunk && chunk.length) self.push(chunk);
- }
-
- self.push(null);
- });
-
- stream.on('data', function (chunk) {
- debug('wrapped data');
- if (state.decoder) chunk = state.decoder.write(chunk);
-
- // don't skip over falsy values in objectMode
- if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
-
- var ret = self.push(chunk);
- if (!ret) {
- paused = true;
- stream.pause();
- }
- });
-
- // proxy all the other methods.
- // important when wrapping filters and duplexes.
- for (var i in stream) {
- if (this[i] === undefined && typeof stream[i] === 'function') {
- this[i] = function (method) {
- return function () {
- return stream[method].apply(stream, arguments);
- };
- }(i);
- }
- }
-
- // proxy certain important events.
- var events = ['error', 'close', 'destroy', 'pause', 'resume'];
- forEach(events, function (ev) {
- stream.on(ev, self.emit.bind(self, ev));
- });
-
- // when we try to consume some more bytes, simply unpause the
- // underlying stream.
- self._read = function (n) {
- debug('wrapped _read', n);
- if (paused) {
- paused = false;
- stream.resume();
- }
- };
-
- return self;
-};
-
-// exposed for testing purposes only.
-Readable._fromList = fromList;
-
-// Pluck off n bytes from an array of buffers.
-// Length is the combined lengths of all the buffers in the list.
-// This function is designed to be inlinable, so please take care when making
-// changes to the function body.
-function fromList(n, state) {
- // nothing buffered
- if (state.length === 0) return null;
-
- var ret;
- if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
- // read it all, truncate the list
- if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
- state.buffer.clear();
- } else {
- // read part of list
- ret = fromListPartial(n, state.buffer, state.decoder);
- }
-
- return ret;
-}
-
-// Extracts only enough buffered data to satisfy the amount requested.
-// This function is designed to be inlinable, so please take care when making
-// changes to the function body.
-function fromListPartial(n, list, hasStrings) {
- var ret;
- if (n < list.head.data.length) {
- // slice is the same for buffers and strings
- ret = list.head.data.slice(0, n);
- list.head.data = list.head.data.slice(n);
- } else if (n === list.head.data.length) {
- // first chunk is a perfect match
- ret = list.shift();
- } else {
- // result spans more than one buffer
- ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
- }
- return ret;
-}
-
-// Copies a specified amount of characters from the list of buffered data
-// chunks.
-// This function is designed to be inlinable, so please take care when making
-// changes to the function body.
-function copyFromBufferString(n, list) {
- var p = list.head;
- var c = 1;
- var ret = p.data;
- n -= ret.length;
- while (p = p.next) {
- var str = p.data;
- var nb = n > str.length ? str.length : n;
- if (nb === str.length) ret += str;else ret += str.slice(0, n);
- n -= nb;
- if (n === 0) {
- if (nb === str.length) {
- ++c;
- if (p.next) list.head = p.next;else list.head = list.tail = null;
- } else {
- list.head = p;
- p.data = str.slice(nb);
- }
- break;
- }
- ++c;
- }
- list.length -= c;
- return ret;
-}
-
-// Copies a specified amount of bytes from the list of buffered data chunks.
-// This function is designed to be inlinable, so please take care when making
-// changes to the function body.
-function copyFromBuffer(n, list) {
- var ret = bufferShim.allocUnsafe(n);
- var p = list.head;
- var c = 1;
- p.data.copy(ret);
- n -= p.data.length;
- while (p = p.next) {
- var buf = p.data;
- var nb = n > buf.length ? buf.length : n;
- buf.copy(ret, ret.length - n, 0, nb);
- n -= nb;
- if (n === 0) {
- if (nb === buf.length) {
- ++c;
- if (p.next) list.head = p.next;else list.head = list.tail = null;
- } else {
- list.head = p;
- p.data = buf.slice(nb);
- }
- break;
- }
- ++c;
- }
- list.length -= c;
- return ret;
-}
-
-function endReadable(stream) {
- var state = stream._readableState;
-
- // If we get here before consuming all the bytes, then that is a
- // bug in node. Should never happen.
- if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
-
- if (!state.endEmitted) {
- state.ended = true;
- processNextTick(endReadableNT, state, stream);
- }
-}
-
-function endReadableNT(state, stream) {
- // Check that we didn't get one last unshift.
- if (!state.endEmitted && state.length === 0) {
- state.endEmitted = true;
- stream.readable = false;
- stream.emit('end');
- }
-}
-
-function forEach(xs, f) {
- for (var i = 0, l = xs.length; i < l; i++) {
- f(xs[i], i);
- }
-}
-
-function indexOf(xs, x) {
- for (var i = 0, l = xs.length; i < l; i++) {
- if (xs[i] === x) return i;
- }
- return -1;
-}
-}).call(this,require('_process'))
-},{"./_stream_duplex":69,"./internal/streams/BufferList":74,"_process":67,"buffer":44,"buffer-shims":43,"core-util-is":45,"events":48,"inherits":51,"isarray":53,"process-nextick-args":66,"string_decoder/":80,"util":40}],72:[function(require,module,exports){
-// a transform stream is a readable/writable stream where you do
-// something with the data. Sometimes it's called a "filter",
-// but that's not a great name for it, since that implies a thing where
-// some bits pass through, and others are simply ignored. (That would
-// be a valid example of a transform, of course.)
-//
-// While the output is causally related to the input, it's not a
-// necessarily symmetric or synchronous transformation. For example,
-// a zlib stream might take multiple plain-text writes(), and then
-// emit a single compressed chunk some time in the future.
-//
-// Here's how this works:
-//
-// The Transform stream has all the aspects of the readable and writable
-// stream classes. When you write(chunk), that calls _write(chunk,cb)
-// internally, and returns false if there's a lot of pending writes
-// buffered up. When you call read(), that calls _read(n) until
-// there's enough pending readable data buffered up.
-//
-// In a transform stream, the written data is placed in a buffer. When
-// _read(n) is called, it transforms the queued up data, calling the
-// buffered _write cb's as it consumes chunks. If consuming a single
-// written chunk would result in multiple output chunks, then the first
-// outputted bit calls the readcb, and subsequent chunks just go into
-// the read buffer, and will cause it to emit 'readable' if necessary.
-//
-// This way, back-pressure is actually determined by the reading side,
-// since _read has to be called to start processing a new chunk. However,
-// a pathological inflate type of transform can cause excessive buffering
-// here. For example, imagine a stream where every byte of input is
-// interpreted as an integer from 0-255, and then results in that many
-// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
-// 1kb of data being output. In this case, you could write a very small
-// amount of input, and end up with a very large amount of output. In
-// such a pathological inflating mechanism, there'd be no way to tell
-// the system to stop doing the transform. A single 4MB write could
-// cause the system to run out of memory.
-//
-// However, even in such a pathological case, only a single written chunk
-// would be consumed, and then the rest would wait (un-transformed) until
-// the results of the previous transformed chunk were consumed.
-
-'use strict';
-
-module.exports = Transform;
-
-var Duplex = require('./_stream_duplex');
-
-/**/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/* */
-
-util.inherits(Transform, Duplex);
-
-function TransformState(stream) {
- this.afterTransform = function (er, data) {
- return afterTransform(stream, er, data);
- };
-
- this.needTransform = false;
- this.transforming = false;
- this.writecb = null;
- this.writechunk = null;
- this.writeencoding = null;
-}
-
-function afterTransform(stream, er, data) {
- var ts = stream._transformState;
- ts.transforming = false;
-
- var cb = ts.writecb;
-
- if (!cb) return stream.emit('error', new Error('no writecb in Transform class'));
-
- ts.writechunk = null;
- ts.writecb = null;
-
- if (data !== null && data !== undefined) stream.push(data);
-
- cb(er);
-
- var rs = stream._readableState;
- rs.reading = false;
- if (rs.needReadable || rs.length < rs.highWaterMark) {
- stream._read(rs.highWaterMark);
- }
-}
-
-function Transform(options) {
- if (!(this instanceof Transform)) return new Transform(options);
-
- Duplex.call(this, options);
-
- this._transformState = new TransformState(this);
-
- // when the writable side finishes, then flush out anything remaining.
- var stream = this;
-
- // start out asking for a readable event once data is transformed.
- this._readableState.needReadable = true;
-
- // we have implemented the _read method, and done the other things
- // that Readable wants before the first _read call, so unset the
- // sync guard flag.
- this._readableState.sync = false;
-
- if (options) {
- if (typeof options.transform === 'function') this._transform = options.transform;
-
- if (typeof options.flush === 'function') this._flush = options.flush;
- }
-
- this.once('prefinish', function () {
- if (typeof this._flush === 'function') this._flush(function (er) {
- done(stream, er);
- });else done(stream);
- });
-}
-
-Transform.prototype.push = function (chunk, encoding) {
- this._transformState.needTransform = false;
- return Duplex.prototype.push.call(this, chunk, encoding);
-};
-
-// This is the part where you do stuff!
-// override this function in implementation classes.
-// 'chunk' is an input chunk.
-//
-// Call `push(newChunk)` to pass along transformed output
-// to the readable side. You may call 'push' zero or more times.
-//
-// Call `cb(err)` when you are done with this chunk. If you pass
-// an error, then that'll put the hurt on the whole operation. If you
-// never call cb(), then you'll never get another chunk.
-Transform.prototype._transform = function (chunk, encoding, cb) {
- throw new Error('Not implemented');
-};
-
-Transform.prototype._write = function (chunk, encoding, cb) {
- var ts = this._transformState;
- ts.writecb = cb;
- ts.writechunk = chunk;
- ts.writeencoding = encoding;
- if (!ts.transforming) {
- var rs = this._readableState;
- if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
- }
-};
-
-// Doesn't matter what the args are here.
-// _transform does all the work.
-// That we got here means that the readable side wants more data.
-Transform.prototype._read = function (n) {
- var ts = this._transformState;
-
- if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
- ts.transforming = true;
- this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
- } else {
- // mark that we need a transform, so that any data that comes in
- // will get processed, now that we've asked for it.
- ts.needTransform = true;
- }
-};
-
-function done(stream, er) {
- if (er) return stream.emit('error', er);
-
- // if there's nothing in the write buffer, then that means
- // that nothing more will ever be provided
- var ws = stream._writableState;
- var ts = stream._transformState;
-
- if (ws.length) throw new Error('Calling transform done when ws.length != 0');
-
- if (ts.transforming) throw new Error('Calling transform done when still transforming');
-
- return stream.push(null);
-}
-},{"./_stream_duplex":69,"core-util-is":45,"inherits":51}],73:[function(require,module,exports){
-(function (process){
-// A bit simpler than readable streams.
-// Implement an async ._write(chunk, encoding, cb), and it'll handle all
-// the drain event emission and buffering.
-
-'use strict';
-
-module.exports = Writable;
-
-/**/
-var processNextTick = require('process-nextick-args');
-/* */
-
-/**/
-var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick;
-/* */
-
-Writable.WritableState = WritableState;
-
-/**/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/* */
-
-/**/
-var internalUtil = {
- deprecate: require('util-deprecate')
-};
-/* */
-
-/**/
-var Stream;
-(function () {
- try {
- Stream = require('st' + 'ream');
- } catch (_) {} finally {
- if (!Stream) Stream = require('events').EventEmitter;
- }
-})();
-/* */
-
-var Buffer = require('buffer').Buffer;
-/**/
-var bufferShim = require('buffer-shims');
-/* */
-
-util.inherits(Writable, Stream);
-
-function nop() {}
-
-function WriteReq(chunk, encoding, cb) {
- this.chunk = chunk;
- this.encoding = encoding;
- this.callback = cb;
- this.next = null;
-}
-
-var Duplex;
-function WritableState(options, stream) {
- Duplex = Duplex || require('./_stream_duplex');
-
- options = options || {};
-
- // object stream flag to indicate whether or not this stream
- // contains buffers or objects.
- this.objectMode = !!options.objectMode;
-
- if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
-
- // the point at which write() starts returning false
- // Note: 0 is a valid value, means that we always return false if
- // the entire buffer is not flushed immediately on write()
- var hwm = options.highWaterMark;
- var defaultHwm = this.objectMode ? 16 : 16 * 1024;
- this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;
-
- // cast to ints.
- this.highWaterMark = ~ ~this.highWaterMark;
-
- this.needDrain = false;
- // at the start of calling end()
- this.ending = false;
- // when end() has been called, and returned
- this.ended = false;
- // when 'finish' is emitted
- this.finished = false;
-
- // should we decode strings into buffers before passing to _write?
- // this is here so that some node-core streams can optimize string
- // handling at a lower level.
- var noDecode = options.decodeStrings === false;
- this.decodeStrings = !noDecode;
-
- // Crypto is kind of old and crusty. Historically, its default string
- // encoding is 'binary' so we have to make this configurable.
- // Everything else in the universe uses 'utf8', though.
- this.defaultEncoding = options.defaultEncoding || 'utf8';
-
- // not an actual buffer we keep track of, but a measurement
- // of how much we're waiting to get pushed to some underlying
- // socket or file.
- this.length = 0;
-
- // a flag to see when we're in the middle of a write.
- this.writing = false;
-
- // when true all writes will be buffered until .uncork() call
- this.corked = 0;
-
- // a flag to be able to tell if the onwrite cb is called immediately,
- // or on a later tick. We set this to true at first, because any
- // actions that shouldn't happen until "later" should generally also
- // not happen before the first write call.
- this.sync = true;
-
- // a flag to know if we're processing previously buffered items, which
- // may call the _write() callback in the same tick, so that we don't
- // end up in an overlapped onwrite situation.
- this.bufferProcessing = false;
-
- // the callback that's passed to _write(chunk,cb)
- this.onwrite = function (er) {
- onwrite(stream, er);
- };
-
- // the callback that the user supplies to write(chunk,encoding,cb)
- this.writecb = null;
-
- // the amount that is being written when _write is called.
- this.writelen = 0;
-
- this.bufferedRequest = null;
- this.lastBufferedRequest = null;
-
- // number of pending user-supplied write callbacks
- // this must be 0 before 'finish' can be emitted
- this.pendingcb = 0;
-
- // emit prefinish if the only thing we're waiting for is _write cbs
- // This is relevant for synchronous Transform streams
- this.prefinished = false;
-
- // True if the error was already emitted and should not be thrown again
- this.errorEmitted = false;
-
- // count buffered requests
- this.bufferedRequestCount = 0;
-
- // allocate the first CorkedRequest, there is always
- // one allocated and free to use, and we maintain at most two
- this.corkedRequestsFree = new CorkedRequest(this);
-}
-
-WritableState.prototype.getBuffer = function writableStateGetBuffer() {
- var current = this.bufferedRequest;
- var out = [];
- while (current) {
- out.push(current);
- current = current.next;
- }
- return out;
-};
-
-(function () {
- try {
- Object.defineProperty(WritableState.prototype, 'buffer', {
- get: internalUtil.deprecate(function () {
- return this.getBuffer();
- }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.')
- });
- } catch (_) {}
-})();
-
-var Duplex;
-function Writable(options) {
- Duplex = Duplex || require('./_stream_duplex');
-
- // Writable ctor is applied to Duplexes, though they're not
- // instanceof Writable, they're instanceof Readable.
- if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options);
-
- this._writableState = new WritableState(options, this);
-
- // legacy.
- this.writable = true;
-
- if (options) {
- if (typeof options.write === 'function') this._write = options.write;
-
- if (typeof options.writev === 'function') this._writev = options.writev;
- }
-
- Stream.call(this);
-}
-
-// Otherwise people can pipe Writable streams, which is just wrong.
-Writable.prototype.pipe = function () {
- this.emit('error', new Error('Cannot pipe, not readable'));
-};
-
-function writeAfterEnd(stream, cb) {
- var er = new Error('write after end');
- // TODO: defer error events consistently everywhere, not just the cb
- stream.emit('error', er);
- processNextTick(cb, er);
-}
-
-// If we get something that is not a buffer, string, null, or undefined,
-// and we're not in objectMode, then that's an error.
-// Otherwise stream chunks are all considered to be of length=1, and the
-// watermarks determine how many objects to keep in the buffer, rather than
-// how many bytes or characters.
-function validChunk(stream, state, chunk, cb) {
- var valid = true;
- var er = false;
- // Always throw error if a null is written
- // if we are not in object mode then throw
- // if it is not a buffer, string, or undefined.
- if (chunk === null) {
- er = new TypeError('May not write null values to stream');
- } else if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
- er = new TypeError('Invalid non-string/buffer chunk');
- }
- if (er) {
- stream.emit('error', er);
- processNextTick(cb, er);
- valid = false;
- }
- return valid;
-}
-
-Writable.prototype.write = function (chunk, encoding, cb) {
- var state = this._writableState;
- var ret = false;
-
- if (typeof encoding === 'function') {
- cb = encoding;
- encoding = null;
- }
-
- if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
-
- if (typeof cb !== 'function') cb = nop;
-
- if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) {
- state.pendingcb++;
- ret = writeOrBuffer(this, state, chunk, encoding, cb);
- }
-
- return ret;
-};
-
-Writable.prototype.cork = function () {
- var state = this._writableState;
-
- state.corked++;
-};
-
-Writable.prototype.uncork = function () {
- var state = this._writableState;
-
- if (state.corked) {
- state.corked--;
-
- if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
- }
-};
-
-Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
- // node::ParseEncoding() requires lower case.
- if (typeof encoding === 'string') encoding = encoding.toLowerCase();
- if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
- this._writableState.defaultEncoding = encoding;
- return this;
-};
-
-function decodeChunk(state, chunk, encoding) {
- if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
- chunk = bufferShim.from(chunk, encoding);
- }
- return chunk;
-}
-
-// if we're already writing something, then just put this
-// in the queue, and wait our turn. Otherwise, call _write
-// If we return false, then we need a drain event, so set that flag.
-function writeOrBuffer(stream, state, chunk, encoding, cb) {
- chunk = decodeChunk(state, chunk, encoding);
-
- if (Buffer.isBuffer(chunk)) encoding = 'buffer';
- var len = state.objectMode ? 1 : chunk.length;
-
- state.length += len;
-
- var ret = state.length < state.highWaterMark;
- // we must ensure that previous needDrain will not be reset to false.
- if (!ret) state.needDrain = true;
-
- if (state.writing || state.corked) {
- var last = state.lastBufferedRequest;
- state.lastBufferedRequest = new WriteReq(chunk, encoding, cb);
- if (last) {
- last.next = state.lastBufferedRequest;
- } else {
- state.bufferedRequest = state.lastBufferedRequest;
- }
- state.bufferedRequestCount += 1;
- } else {
- doWrite(stream, state, false, len, chunk, encoding, cb);
- }
-
- return ret;
-}
-
-function doWrite(stream, state, writev, len, chunk, encoding, cb) {
- state.writelen = len;
- state.writecb = cb;
- state.writing = true;
- state.sync = true;
- if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
- state.sync = false;
-}
-
-function onwriteError(stream, state, sync, er, cb) {
- --state.pendingcb;
- if (sync) processNextTick(cb, er);else cb(er);
-
- stream._writableState.errorEmitted = true;
- stream.emit('error', er);
-}
-
-function onwriteStateUpdate(state) {
- state.writing = false;
- state.writecb = null;
- state.length -= state.writelen;
- state.writelen = 0;
-}
-
-function onwrite(stream, er) {
- var state = stream._writableState;
- var sync = state.sync;
- var cb = state.writecb;
-
- onwriteStateUpdate(state);
-
- if (er) onwriteError(stream, state, sync, er, cb);else {
- // Check if we're actually ready to finish, but don't emit yet
- var finished = needFinish(state);
-
- if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
- clearBuffer(stream, state);
- }
-
- if (sync) {
- /**/
- asyncWrite(afterWrite, stream, state, finished, cb);
- /* */
- } else {
- afterWrite(stream, state, finished, cb);
- }
- }
-}
-
-function afterWrite(stream, state, finished, cb) {
- if (!finished) onwriteDrain(stream, state);
- state.pendingcb--;
- cb();
- finishMaybe(stream, state);
-}
-
-// Must force callback to be called on nextTick, so that we don't
-// emit 'drain' before the write() consumer gets the 'false' return
-// value, and has a chance to attach a 'drain' listener.
-function onwriteDrain(stream, state) {
- if (state.length === 0 && state.needDrain) {
- state.needDrain = false;
- stream.emit('drain');
- }
-}
-
-// if there's something in the buffer waiting, then process it
-function clearBuffer(stream, state) {
- state.bufferProcessing = true;
- var entry = state.bufferedRequest;
-
- if (stream._writev && entry && entry.next) {
- // Fast case, write everything using _writev()
- var l = state.bufferedRequestCount;
- var buffer = new Array(l);
- var holder = state.corkedRequestsFree;
- holder.entry = entry;
-
- var count = 0;
- while (entry) {
- buffer[count] = entry;
- entry = entry.next;
- count += 1;
- }
-
- doWrite(stream, state, true, state.length, buffer, '', holder.finish);
-
- // doWrite is almost always async, defer these to save a bit of time
- // as the hot path ends with doWrite
- state.pendingcb++;
- state.lastBufferedRequest = null;
- if (holder.next) {
- state.corkedRequestsFree = holder.next;
- holder.next = null;
- } else {
- state.corkedRequestsFree = new CorkedRequest(state);
- }
- } else {
- // Slow case, write chunks one-by-one
- while (entry) {
- var chunk = entry.chunk;
- var encoding = entry.encoding;
- var cb = entry.callback;
- var len = state.objectMode ? 1 : chunk.length;
-
- doWrite(stream, state, false, len, chunk, encoding, cb);
- entry = entry.next;
- // if we didn't call the onwrite immediately, then
- // it means that we need to wait until it does.
- // also, that means that the chunk and cb are currently
- // being processed, so move the buffer counter past them.
- if (state.writing) {
- break;
- }
- }
-
- if (entry === null) state.lastBufferedRequest = null;
- }
-
- state.bufferedRequestCount = 0;
- state.bufferedRequest = entry;
- state.bufferProcessing = false;
-}
-
-Writable.prototype._write = function (chunk, encoding, cb) {
- cb(new Error('not implemented'));
-};
-
-Writable.prototype._writev = null;
-
-Writable.prototype.end = function (chunk, encoding, cb) {
- var state = this._writableState;
-
- if (typeof chunk === 'function') {
- cb = chunk;
- chunk = null;
- encoding = null;
- } else if (typeof encoding === 'function') {
- cb = encoding;
- encoding = null;
- }
-
- if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
-
- // .end() fully uncorks
- if (state.corked) {
- state.corked = 1;
- this.uncork();
- }
-
- // ignore unnecessary end() calls.
- if (!state.ending && !state.finished) endWritable(this, state, cb);
-};
-
-function needFinish(state) {
- return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
-}
-
-function prefinish(stream, state) {
- if (!state.prefinished) {
- state.prefinished = true;
- stream.emit('prefinish');
- }
-}
-
-function finishMaybe(stream, state) {
- var need = needFinish(state);
- if (need) {
- if (state.pendingcb === 0) {
- prefinish(stream, state);
- state.finished = true;
- stream.emit('finish');
- } else {
- prefinish(stream, state);
- }
- }
- return need;
-}
-
-function endWritable(stream, state, cb) {
- state.ending = true;
- finishMaybe(stream, state);
- if (cb) {
- if (state.finished) processNextTick(cb);else stream.once('finish', cb);
- }
- state.ended = true;
- stream.writable = false;
-}
-
-// It seems a linked list but it is not
-// there will be only 2 of these for each stream
-function CorkedRequest(state) {
- var _this = this;
-
- this.next = null;
- this.entry = null;
-
- this.finish = function (err) {
- var entry = _this.entry;
- _this.entry = null;
- while (entry) {
- var cb = entry.callback;
- state.pendingcb--;
- cb(err);
- entry = entry.next;
- }
- if (state.corkedRequestsFree) {
- state.corkedRequestsFree.next = _this;
- } else {
- state.corkedRequestsFree = _this;
- }
- };
-}
-}).call(this,require('_process'))
-},{"./_stream_duplex":69,"_process":67,"buffer":44,"buffer-shims":43,"core-util-is":45,"events":48,"inherits":51,"process-nextick-args":66,"util-deprecate":81}],74:[function(require,module,exports){
-'use strict';
-
-var Buffer = require('buffer').Buffer;
-/**/
-var bufferShim = require('buffer-shims');
-/* */
-
-module.exports = BufferList;
-
-function BufferList() {
- this.head = null;
- this.tail = null;
- this.length = 0;
-}
-
-BufferList.prototype.push = function (v) {
- var entry = { data: v, next: null };
- if (this.length > 0) this.tail.next = entry;else this.head = entry;
- this.tail = entry;
- ++this.length;
-};
-
-BufferList.prototype.unshift = function (v) {
- var entry = { data: v, next: this.head };
- if (this.length === 0) this.tail = entry;
- this.head = entry;
- ++this.length;
-};
-
-BufferList.prototype.shift = function () {
- if (this.length === 0) return;
- var ret = this.head.data;
- if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
- --this.length;
- return ret;
-};
-
-BufferList.prototype.clear = function () {
- this.head = this.tail = null;
- this.length = 0;
-};
-
-BufferList.prototype.join = function (s) {
- if (this.length === 0) return '';
- var p = this.head;
- var ret = '' + p.data;
- while (p = p.next) {
- ret += s + p.data;
- }return ret;
-};
-
-BufferList.prototype.concat = function (n) {
- if (this.length === 0) return bufferShim.alloc(0);
- if (this.length === 1) return this.head.data;
- var ret = bufferShim.allocUnsafe(n >>> 0);
- var p = this.head;
- var i = 0;
- while (p) {
- p.data.copy(ret, i);
- i += p.data.length;
- p = p.next;
- }
- return ret;
-};
-},{"buffer":44,"buffer-shims":43}],75:[function(require,module,exports){
-module.exports = require("./lib/_stream_passthrough.js")
-
-},{"./lib/_stream_passthrough.js":70}],76:[function(require,module,exports){
-(function (process){
-var Stream = (function (){
- try {
- return require('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify
- } catch(_){}
-}());
-exports = module.exports = require('./lib/_stream_readable.js');
-exports.Stream = Stream || exports;
-exports.Readable = exports;
-exports.Writable = require('./lib/_stream_writable.js');
-exports.Duplex = require('./lib/_stream_duplex.js');
-exports.Transform = require('./lib/_stream_transform.js');
-exports.PassThrough = require('./lib/_stream_passthrough.js');
-
-if (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) {
- module.exports = Stream;
-}
-
-}).call(this,require('_process'))
-},{"./lib/_stream_duplex.js":69,"./lib/_stream_passthrough.js":70,"./lib/_stream_readable.js":71,"./lib/_stream_transform.js":72,"./lib/_stream_writable.js":73,"_process":67}],77:[function(require,module,exports){
-module.exports = require("./lib/_stream_transform.js")
-
-},{"./lib/_stream_transform.js":72}],78:[function(require,module,exports){
-module.exports = require("./lib/_stream_writable.js")
-
-},{"./lib/_stream_writable.js":73}],79:[function(require,module,exports){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-module.exports = Stream;
-
-var EE = require('events').EventEmitter;
-var inherits = require('inherits');
-
-inherits(Stream, EE);
-Stream.Readable = require('readable-stream/readable.js');
-Stream.Writable = require('readable-stream/writable.js');
-Stream.Duplex = require('readable-stream/duplex.js');
-Stream.Transform = require('readable-stream/transform.js');
-Stream.PassThrough = require('readable-stream/passthrough.js');
-
-// Backwards-compat with node 0.4.x
-Stream.Stream = Stream;
-
-
-
-// old-style streams. Note that the pipe method (the only relevant
-// part of this class) is overridden in the Readable class.
-
-function Stream() {
- EE.call(this);
-}
-
-Stream.prototype.pipe = function(dest, options) {
- var source = this;
-
- function ondata(chunk) {
- if (dest.writable) {
- if (false === dest.write(chunk) && source.pause) {
- source.pause();
- }
- }
- }
-
- source.on('data', ondata);
-
- function ondrain() {
- if (source.readable && source.resume) {
- source.resume();
- }
- }
-
- dest.on('drain', ondrain);
-
- // If the 'end' option is not supplied, dest.end() will be called when
- // source gets the 'end' or 'close' events. Only dest.end() once.
- if (!dest._isStdio && (!options || options.end !== false)) {
- source.on('end', onend);
- source.on('close', onclose);
- }
-
- var didOnEnd = false;
- function onend() {
- if (didOnEnd) return;
- didOnEnd = true;
-
- dest.end();
- }
-
-
- function onclose() {
- if (didOnEnd) return;
- didOnEnd = true;
-
- if (typeof dest.destroy === 'function') dest.destroy();
- }
-
- // don't leave dangling pipes when there are errors.
- function onerror(er) {
- cleanup();
- if (EE.listenerCount(this, 'error') === 0) {
- throw er; // Unhandled stream error in pipe.
- }
- }
-
- source.on('error', onerror);
- dest.on('error', onerror);
-
- // remove all the event listeners that were added.
- function cleanup() {
- source.removeListener('data', ondata);
- dest.removeListener('drain', ondrain);
-
- source.removeListener('end', onend);
- source.removeListener('close', onclose);
-
- source.removeListener('error', onerror);
- dest.removeListener('error', onerror);
-
- source.removeListener('end', cleanup);
- source.removeListener('close', cleanup);
-
- dest.removeListener('close', cleanup);
- }
-
- source.on('end', cleanup);
- source.on('close', cleanup);
-
- dest.on('close', cleanup);
-
- dest.emit('pipe', source);
-
- // Allow for unix-like usage: A.pipe(B).pipe(C)
- return dest;
-};
-
-},{"events":48,"inherits":51,"readable-stream/duplex.js":68,"readable-stream/passthrough.js":75,"readable-stream/readable.js":76,"readable-stream/transform.js":77,"readable-stream/writable.js":78}],80:[function(require,module,exports){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var Buffer = require('buffer').Buffer;
-
-var isBufferEncoding = Buffer.isEncoding
- || function(encoding) {
- switch (encoding && encoding.toLowerCase()) {
- case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;
- default: return false;
- }
- }
-
-
-function assertEncoding(encoding) {
- if (encoding && !isBufferEncoding(encoding)) {
- throw new Error('Unknown encoding: ' + encoding);
- }
-}
-
-// StringDecoder provides an interface for efficiently splitting a series of
-// buffers into a series of JS strings without breaking apart multi-byte
-// characters. CESU-8 is handled as part of the UTF-8 encoding.
-//
-// @TODO Handling all encodings inside a single object makes it very difficult
-// to reason about this code, so it should be split up in the future.
-// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code
-// points as used by CESU-8.
-var StringDecoder = exports.StringDecoder = function(encoding) {
- this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');
- assertEncoding(encoding);
- switch (this.encoding) {
- case 'utf8':
- // CESU-8 represents each of Surrogate Pair by 3-bytes
- this.surrogateSize = 3;
- break;
- case 'ucs2':
- case 'utf16le':
- // UTF-16 represents each of Surrogate Pair by 2-bytes
- this.surrogateSize = 2;
- this.detectIncompleteChar = utf16DetectIncompleteChar;
- break;
- case 'base64':
- // Base-64 stores 3 bytes in 4 chars, and pads the remainder.
- this.surrogateSize = 3;
- this.detectIncompleteChar = base64DetectIncompleteChar;
- break;
- default:
- this.write = passThroughWrite;
- return;
- }
-
- // Enough space to store all bytes of a single character. UTF-8 needs 4
- // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).
- this.charBuffer = new Buffer(6);
- // Number of bytes received for the current incomplete multi-byte character.
- this.charReceived = 0;
- // Number of bytes expected for the current incomplete multi-byte character.
- this.charLength = 0;
-};
-
-
-// write decodes the given buffer and returns it as JS string that is
-// guaranteed to not contain any partial multi-byte characters. Any partial
-// character found at the end of the buffer is buffered up, and will be
-// returned when calling write again with the remaining bytes.
-//
-// Note: Converting a Buffer containing an orphan surrogate to a String
-// currently works, but converting a String to a Buffer (via `new Buffer`, or
-// Buffer#write) will replace incomplete surrogates with the unicode
-// replacement character. See https://codereview.chromium.org/121173009/ .
-StringDecoder.prototype.write = function(buffer) {
- var charStr = '';
- // if our last write ended with an incomplete multibyte character
- while (this.charLength) {
- // determine how many remaining bytes this buffer has to offer for this char
- var available = (buffer.length >= this.charLength - this.charReceived) ?
- this.charLength - this.charReceived :
- buffer.length;
-
- // add the new bytes to the char buffer
- buffer.copy(this.charBuffer, this.charReceived, 0, available);
- this.charReceived += available;
-
- if (this.charReceived < this.charLength) {
- // still not enough chars in this buffer? wait for more ...
- return '';
- }
-
- // remove bytes belonging to the current character from the buffer
- buffer = buffer.slice(available, buffer.length);
-
- // get the character that was split
- charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);
-
- // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
- var charCode = charStr.charCodeAt(charStr.length - 1);
- if (charCode >= 0xD800 && charCode <= 0xDBFF) {
- this.charLength += this.surrogateSize;
- charStr = '';
- continue;
- }
- this.charReceived = this.charLength = 0;
-
- // if there are no more bytes in this buffer, just emit our char
- if (buffer.length === 0) {
- return charStr;
- }
- break;
- }
-
- // determine and set charLength / charReceived
- this.detectIncompleteChar(buffer);
-
- var end = buffer.length;
- if (this.charLength) {
- // buffer the incomplete character bytes we got
- buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);
- end -= this.charReceived;
- }
-
- charStr += buffer.toString(this.encoding, 0, end);
-
- var end = charStr.length - 1;
- var charCode = charStr.charCodeAt(end);
- // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
- if (charCode >= 0xD800 && charCode <= 0xDBFF) {
- var size = this.surrogateSize;
- this.charLength += size;
- this.charReceived += size;
- this.charBuffer.copy(this.charBuffer, size, 0, size);
- buffer.copy(this.charBuffer, 0, 0, size);
- return charStr.substring(0, end);
- }
-
- // or just emit the charStr
- return charStr;
-};
-
-// detectIncompleteChar determines if there is an incomplete UTF-8 character at
-// the end of the given buffer. If so, it sets this.charLength to the byte
-// length that character, and sets this.charReceived to the number of bytes
-// that are available for this character.
-StringDecoder.prototype.detectIncompleteChar = function(buffer) {
- // determine how many bytes we have to check at the end of this buffer
- var i = (buffer.length >= 3) ? 3 : buffer.length;
-
- // Figure out if one of the last i bytes of our buffer announces an
- // incomplete char.
- for (; i > 0; i--) {
- var c = buffer[buffer.length - i];
-
- // See http://en.wikipedia.org/wiki/UTF-8#Description
-
- // 110XXXXX
- if (i == 1 && c >> 5 == 0x06) {
- this.charLength = 2;
- break;
- }
-
- // 1110XXXX
- if (i <= 2 && c >> 4 == 0x0E) {
- this.charLength = 3;
- break;
- }
-
- // 11110XXX
- if (i <= 3 && c >> 3 == 0x1E) {
- this.charLength = 4;
- break;
- }
- }
- this.charReceived = i;
-};
-
-StringDecoder.prototype.end = function(buffer) {
- var res = '';
- if (buffer && buffer.length)
- res = this.write(buffer);
-
- if (this.charReceived) {
- var cr = this.charReceived;
- var buf = this.charBuffer;
- var enc = this.encoding;
- res += buf.slice(0, cr).toString(enc);
- }
-
- return res;
-};
-
-function passThroughWrite(buffer) {
- return buffer.toString(this.encoding);
-}
-
-function utf16DetectIncompleteChar(buffer) {
- this.charReceived = buffer.length % 2;
- this.charLength = this.charReceived ? 2 : 0;
-}
-
-function base64DetectIncompleteChar(buffer) {
- this.charReceived = buffer.length % 3;
- this.charLength = this.charReceived ? 3 : 0;
-}
-
-},{"buffer":44}],81:[function(require,module,exports){
-(function (global){
-
-/**
- * Module exports.
- */
-
-module.exports = deprecate;
-
-/**
- * Mark that a method should not be used.
- * Returns a modified function which warns once by default.
- *
- * If `localStorage.noDeprecation = true` is set, then it is a no-op.
- *
- * If `localStorage.throwDeprecation = true` is set, then deprecated functions
- * will throw an Error when invoked.
- *
- * If `localStorage.traceDeprecation = true` is set, then deprecated functions
- * will invoke `console.trace()` instead of `console.error()`.
- *
- * @param {Function} fn - the function to deprecate
- * @param {String} msg - the string to print to the console when `fn` is invoked
- * @returns {Function} a new "deprecated" version of `fn`
- * @api public
- */
-
-function deprecate (fn, msg) {
- if (config('noDeprecation')) {
- return fn;
- }
-
- var warned = false;
- function deprecated() {
- if (!warned) {
- if (config('throwDeprecation')) {
- throw new Error(msg);
- } else if (config('traceDeprecation')) {
- console.trace(msg);
- } else {
- console.warn(msg);
- }
- warned = true;
- }
- return fn.apply(this, arguments);
- }
-
- return deprecated;
-}
-
-/**
- * Checks `localStorage` for boolean values for the given `name`.
- *
- * @param {String} name
- * @returns {Boolean}
- * @api private
- */
-
-function config (name) {
- // accessing global.localStorage can trigger a DOMException in sandboxed iframes
- try {
- if (!global.localStorage) return false;
- } catch (_) {
- return false;
- }
- var val = global.localStorage[name];
- if (null == val) return false;
- return String(val).toLowerCase() === 'true';
-}
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{}],82:[function(require,module,exports){
-arguments[4][51][0].apply(exports,arguments)
-},{"dup":51}],83:[function(require,module,exports){
-module.exports = function isBuffer(arg) {
- return arg && typeof arg === 'object'
- && typeof arg.copy === 'function'
- && typeof arg.fill === 'function'
- && typeof arg.readUInt8 === 'function';
-}
-},{}],84:[function(require,module,exports){
-(function (process,global){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var formatRegExp = /%[sdj%]/g;
-exports.format = function(f) {
- if (!isString(f)) {
- var objects = [];
- for (var i = 0; i < arguments.length; i++) {
- objects.push(inspect(arguments[i]));
- }
- return objects.join(' ');
- }
-
- var i = 1;
- var args = arguments;
- var len = args.length;
- var str = String(f).replace(formatRegExp, function(x) {
- if (x === '%%') return '%';
- if (i >= len) return x;
- switch (x) {
- case '%s': return String(args[i++]);
- case '%d': return Number(args[i++]);
- case '%j':
- try {
- return JSON.stringify(args[i++]);
- } catch (_) {
- return '[Circular]';
- }
- default:
- return x;
- }
- });
- for (var x = args[i]; i < len; x = args[++i]) {
- if (isNull(x) || !isObject(x)) {
- str += ' ' + x;
- } else {
- str += ' ' + inspect(x);
- }
- }
- return str;
-};
-
-
-// Mark that a method should not be used.
-// Returns a modified function which warns once by default.
-// If --no-deprecation is set, then it is a no-op.
-exports.deprecate = function(fn, msg) {
- // Allow for deprecating things in the process of starting up.
- if (isUndefined(global.process)) {
- return function() {
- return exports.deprecate(fn, msg).apply(this, arguments);
- };
- }
-
- if (process.noDeprecation === true) {
- return fn;
- }
-
- var warned = false;
- function deprecated() {
- if (!warned) {
- if (process.throwDeprecation) {
- throw new Error(msg);
- } else if (process.traceDeprecation) {
- console.trace(msg);
- } else {
- console.error(msg);
- }
- warned = true;
- }
- return fn.apply(this, arguments);
- }
-
- return deprecated;
-};
-
-
-var debugs = {};
-var debugEnviron;
-exports.debuglog = function(set) {
- if (isUndefined(debugEnviron))
- debugEnviron = process.env.NODE_DEBUG || '';
- set = set.toUpperCase();
- if (!debugs[set]) {
- if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
- var pid = process.pid;
- debugs[set] = function() {
- var msg = exports.format.apply(exports, arguments);
- console.error('%s %d: %s', set, pid, msg);
- };
- } else {
- debugs[set] = function() {};
- }
- }
- return debugs[set];
-};
-
-
-/**
- * Echos the value of a value. Trys to print the value out
- * in the best way possible given the different types.
- *
- * @param {Object} obj The object to print out.
- * @param {Object} opts Optional options object that alters the output.
- */
-/* legacy: obj, showHidden, depth, colors*/
-function inspect(obj, opts) {
- // default options
- var ctx = {
- seen: [],
- stylize: stylizeNoColor
- };
- // legacy...
- if (arguments.length >= 3) ctx.depth = arguments[2];
- if (arguments.length >= 4) ctx.colors = arguments[3];
- if (isBoolean(opts)) {
- // legacy...
- ctx.showHidden = opts;
- } else if (opts) {
- // got an "options" object
- exports._extend(ctx, opts);
- }
- // set default options
- if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
- if (isUndefined(ctx.depth)) ctx.depth = 2;
- if (isUndefined(ctx.colors)) ctx.colors = false;
- if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
- if (ctx.colors) ctx.stylize = stylizeWithColor;
- return formatValue(ctx, obj, ctx.depth);
-}
-exports.inspect = inspect;
-
-
-// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
-inspect.colors = {
- 'bold' : [1, 22],
- 'italic' : [3, 23],
- 'underline' : [4, 24],
- 'inverse' : [7, 27],
- 'white' : [37, 39],
- 'grey' : [90, 39],
- 'black' : [30, 39],
- 'blue' : [34, 39],
- 'cyan' : [36, 39],
- 'green' : [32, 39],
- 'magenta' : [35, 39],
- 'red' : [31, 39],
- 'yellow' : [33, 39]
-};
-
-// Don't use 'blue' not visible on cmd.exe
-inspect.styles = {
- 'special': 'cyan',
- 'number': 'yellow',
- 'boolean': 'yellow',
- 'undefined': 'grey',
- 'null': 'bold',
- 'string': 'green',
- 'date': 'magenta',
- // "name": intentionally not styling
- 'regexp': 'red'
-};
-
-
-function stylizeWithColor(str, styleType) {
- var style = inspect.styles[styleType];
-
- if (style) {
- return '\u001b[' + inspect.colors[style][0] + 'm' + str +
- '\u001b[' + inspect.colors[style][1] + 'm';
- } else {
- return str;
- }
-}
-
-
-function stylizeNoColor(str, styleType) {
- return str;
-}
-
-
-function arrayToHash(array) {
- var hash = {};
-
- array.forEach(function(val, idx) {
- hash[val] = true;
- });
-
- return hash;
-}
-
-
-function formatValue(ctx, value, recurseTimes) {
- // Provide a hook for user-specified inspect functions.
- // Check that value is an object with an inspect function on it
- if (ctx.customInspect &&
- value &&
- isFunction(value.inspect) &&
- // Filter out the util module, it's inspect function is special
- value.inspect !== exports.inspect &&
- // Also filter out any prototype objects using the circular check.
- !(value.constructor && value.constructor.prototype === value)) {
- var ret = value.inspect(recurseTimes, ctx);
- if (!isString(ret)) {
- ret = formatValue(ctx, ret, recurseTimes);
- }
- return ret;
- }
-
- // Primitive types cannot have properties
- var primitive = formatPrimitive(ctx, value);
- if (primitive) {
- return primitive;
- }
-
- // Look up the keys of the object.
- var keys = Object.keys(value);
- var visibleKeys = arrayToHash(keys);
-
- if (ctx.showHidden) {
- keys = Object.getOwnPropertyNames(value);
- }
-
- // IE doesn't make error fields non-enumerable
- // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
- if (isError(value)
- && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
- return formatError(value);
- }
-
- // Some type of object without properties can be shortcutted.
- if (keys.length === 0) {
- if (isFunction(value)) {
- var name = value.name ? ': ' + value.name : '';
- return ctx.stylize('[Function' + name + ']', 'special');
- }
- if (isRegExp(value)) {
- return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
- }
- if (isDate(value)) {
- return ctx.stylize(Date.prototype.toString.call(value), 'date');
- }
- if (isError(value)) {
- return formatError(value);
- }
- }
-
- var base = '', array = false, braces = ['{', '}'];
-
- // Make Array say that they are Array
- if (isArray(value)) {
- array = true;
- braces = ['[', ']'];
- }
-
- // Make functions say that they are functions
- if (isFunction(value)) {
- var n = value.name ? ': ' + value.name : '';
- base = ' [Function' + n + ']';
- }
-
- // Make RegExps say that they are RegExps
- if (isRegExp(value)) {
- base = ' ' + RegExp.prototype.toString.call(value);
- }
-
- // Make dates with properties first say the date
- if (isDate(value)) {
- base = ' ' + Date.prototype.toUTCString.call(value);
- }
-
- // Make error with message first say the error
- if (isError(value)) {
- base = ' ' + formatError(value);
- }
-
- if (keys.length === 0 && (!array || value.length == 0)) {
- return braces[0] + base + braces[1];
- }
-
- if (recurseTimes < 0) {
- if (isRegExp(value)) {
- return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
- } else {
- return ctx.stylize('[Object]', 'special');
- }
- }
-
- ctx.seen.push(value);
-
- var output;
- if (array) {
- output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
- } else {
- output = keys.map(function(key) {
- return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
- });
- }
-
- ctx.seen.pop();
-
- return reduceToSingleString(output, base, braces);
-}
-
-
-function formatPrimitive(ctx, value) {
- if (isUndefined(value))
- return ctx.stylize('undefined', 'undefined');
- if (isString(value)) {
- var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
- .replace(/'/g, "\\'")
- .replace(/\\"/g, '"') + '\'';
- return ctx.stylize(simple, 'string');
- }
- if (isNumber(value))
- return ctx.stylize('' + value, 'number');
- if (isBoolean(value))
- return ctx.stylize('' + value, 'boolean');
- // For some reason typeof null is "object", so special case here.
- if (isNull(value))
- return ctx.stylize('null', 'null');
-}
-
-
-function formatError(value) {
- return '[' + Error.prototype.toString.call(value) + ']';
-}
-
-
-function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
- var output = [];
- for (var i = 0, l = value.length; i < l; ++i) {
- if (hasOwnProperty(value, String(i))) {
- output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
- String(i), true));
- } else {
- output.push('');
- }
- }
- keys.forEach(function(key) {
- if (!key.match(/^\d+$/)) {
- output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
- key, true));
- }
- });
- return output;
-}
-
-
-function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
- var name, str, desc;
- desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
- if (desc.get) {
- if (desc.set) {
- str = ctx.stylize('[Getter/Setter]', 'special');
- } else {
- str = ctx.stylize('[Getter]', 'special');
- }
- } else {
- if (desc.set) {
- str = ctx.stylize('[Setter]', 'special');
- }
- }
- if (!hasOwnProperty(visibleKeys, key)) {
- name = '[' + key + ']';
- }
- if (!str) {
- if (ctx.seen.indexOf(desc.value) < 0) {
- if (isNull(recurseTimes)) {
- str = formatValue(ctx, desc.value, null);
- } else {
- str = formatValue(ctx, desc.value, recurseTimes - 1);
- }
- if (str.indexOf('\n') > -1) {
- if (array) {
- str = str.split('\n').map(function(line) {
- return ' ' + line;
- }).join('\n').substr(2);
- } else {
- str = '\n' + str.split('\n').map(function(line) {
- return ' ' + line;
- }).join('\n');
- }
- }
- } else {
- str = ctx.stylize('[Circular]', 'special');
- }
- }
- if (isUndefined(name)) {
- if (array && key.match(/^\d+$/)) {
- return str;
- }
- name = JSON.stringify('' + key);
- if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
- name = name.substr(1, name.length - 2);
- name = ctx.stylize(name, 'name');
- } else {
- name = name.replace(/'/g, "\\'")
- .replace(/\\"/g, '"')
- .replace(/(^"|"$)/g, "'");
- name = ctx.stylize(name, 'string');
- }
- }
-
- return name + ': ' + str;
-}
-
-
-function reduceToSingleString(output, base, braces) {
- var numLinesEst = 0;
- var length = output.reduce(function(prev, cur) {
- numLinesEst++;
- if (cur.indexOf('\n') >= 0) numLinesEst++;
- return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
- }, 0);
-
- if (length > 60) {
- return braces[0] +
- (base === '' ? '' : base + '\n ') +
- ' ' +
- output.join(',\n ') +
- ' ' +
- braces[1];
- }
-
- return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
-}
-
-
-// NOTE: These type checking functions intentionally don't use `instanceof`
-// because it is fragile and can be easily faked with `Object.create()`.
-function isArray(ar) {
- return Array.isArray(ar);
-}
-exports.isArray = isArray;
-
-function isBoolean(arg) {
- return typeof arg === 'boolean';
-}
-exports.isBoolean = isBoolean;
-
-function isNull(arg) {
- return arg === null;
-}
-exports.isNull = isNull;
-
-function isNullOrUndefined(arg) {
- return arg == null;
-}
-exports.isNullOrUndefined = isNullOrUndefined;
-
-function isNumber(arg) {
- return typeof arg === 'number';
-}
-exports.isNumber = isNumber;
-
-function isString(arg) {
- return typeof arg === 'string';
-}
-exports.isString = isString;
-
-function isSymbol(arg) {
- return typeof arg === 'symbol';
-}
-exports.isSymbol = isSymbol;
-
-function isUndefined(arg) {
- return arg === void 0;
-}
-exports.isUndefined = isUndefined;
-
-function isRegExp(re) {
- return isObject(re) && objectToString(re) === '[object RegExp]';
-}
-exports.isRegExp = isRegExp;
-
-function isObject(arg) {
- return typeof arg === 'object' && arg !== null;
-}
-exports.isObject = isObject;
-
-function isDate(d) {
- return isObject(d) && objectToString(d) === '[object Date]';
-}
-exports.isDate = isDate;
-
-function isError(e) {
- return isObject(e) &&
- (objectToString(e) === '[object Error]' || e instanceof Error);
-}
-exports.isError = isError;
-
-function isFunction(arg) {
- return typeof arg === 'function';
-}
-exports.isFunction = isFunction;
-
-function isPrimitive(arg) {
- return arg === null ||
- typeof arg === 'boolean' ||
- typeof arg === 'number' ||
- typeof arg === 'string' ||
- typeof arg === 'symbol' || // ES6 symbol
- typeof arg === 'undefined';
-}
-exports.isPrimitive = isPrimitive;
-
-exports.isBuffer = require('./support/isBuffer');
-
-function objectToString(o) {
- return Object.prototype.toString.call(o);
-}
-
-
-function pad(n) {
- return n < 10 ? '0' + n.toString(10) : n.toString(10);
-}
-
-
-var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
- 'Oct', 'Nov', 'Dec'];
-
-// 26 Feb 16:19:34
-function timestamp() {
- var d = new Date();
- var time = [pad(d.getHours()),
- pad(d.getMinutes()),
- pad(d.getSeconds())].join(':');
- return [d.getDate(), months[d.getMonth()], time].join(' ');
-}
-
-
-// log is just a thin wrapper to console.log that prepends a timestamp
-exports.log = function() {
- console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
-};
-
-
-/**
- * Inherit the prototype methods from one constructor into another.
- *
- * The Function.prototype.inherits from lang.js rewritten as a standalone
- * function (not on Function.prototype). NOTE: If this file is to be loaded
- * during bootstrapping this function needs to be rewritten using some native
- * functions as prototype setup using normal JavaScript does not work as
- * expected during bootstrapping (see mirror.js in r114903).
- *
- * @param {function} ctor Constructor function which needs to inherit the
- * prototype.
- * @param {function} superCtor Constructor function to inherit prototype from.
- */
-exports.inherits = require('inherits');
-
-exports._extend = function(origin, add) {
- // Don't do anything if add isn't an object
- if (!add || !isObject(add)) return origin;
-
- var keys = Object.keys(add);
- var i = keys.length;
- while (i--) {
- origin[keys[i]] = add[keys[i]];
- }
- return origin;
-};
-
-function hasOwnProperty(obj, prop) {
- return Object.prototype.hasOwnProperty.call(obj, prop);
-}
-
-}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"./support/isBuffer":83,"_process":67,"inherits":82}]},{},[1]);
+// mocha@9.1.2 transpiled to javascript ES5
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.mocha = factory());
+})(this, (function () { 'use strict';
+
+ var regeneratorRuntime;
+
+ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+ function createCommonjsModule(fn, basedir, module) {
+ return module = {
+ path: basedir,
+ exports: {},
+ require: function (path, base) {
+ return commonjsRequire(path, (base === undefined || base === null) ? module.path : base);
+ }
+ }, fn(module, module.exports), module.exports;
+ }
+
+ function getCjsExportFromNamespace (n) {
+ return n && n['default'] || n;
+ }
+
+ function commonjsRequire () {
+ throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs');
+ }
+
+ var check = function (it) {
+ return it && it.Math == Math && it;
+ };
+
+ // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+ var global_1 =
+ // eslint-disable-next-line es/no-global-this -- safe
+ check(typeof globalThis == 'object' && globalThis) ||
+ check(typeof window == 'object' && window) ||
+ // eslint-disable-next-line no-restricted-globals -- safe
+ check(typeof self == 'object' && self) ||
+ check(typeof commonjsGlobal == 'object' && commonjsGlobal) ||
+ // eslint-disable-next-line no-new-func -- fallback
+ (function () { return this; })() || Function('return this')();
+
+ var fails = function (exec) {
+ try {
+ return !!exec();
+ } catch (error) {
+ return true;
+ }
+ };
+
+ // Detect IE8's incomplete defineProperty implementation
+ var descriptors = !fails(function () {
+ // eslint-disable-next-line es/no-object-defineproperty -- required for testing
+ return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;
+ });
+
+ var $propertyIsEnumerable$1 = {}.propertyIsEnumerable;
+ // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+ var getOwnPropertyDescriptor$3 = Object.getOwnPropertyDescriptor;
+
+ // Nashorn ~ JDK8 bug
+ var NASHORN_BUG = getOwnPropertyDescriptor$3 && !$propertyIsEnumerable$1.call({ 1: 2 }, 1);
+
+ // `Object.prototype.propertyIsEnumerable` method implementation
+ // https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable
+ var f$7 = NASHORN_BUG ? function propertyIsEnumerable(V) {
+ var descriptor = getOwnPropertyDescriptor$3(this, V);
+ return !!descriptor && descriptor.enumerable;
+ } : $propertyIsEnumerable$1;
+
+ var objectPropertyIsEnumerable = {
+ f: f$7
+ };
+
+ var createPropertyDescriptor = function (bitmap, value) {
+ return {
+ enumerable: !(bitmap & 1),
+ configurable: !(bitmap & 2),
+ writable: !(bitmap & 4),
+ value: value
+ };
+ };
+
+ var toString$4 = {}.toString;
+
+ var classofRaw = function (it) {
+ return toString$4.call(it).slice(8, -1);
+ };
+
+ var split = ''.split;
+
+ // fallback for non-array-like ES3 and non-enumerable old V8 strings
+ var indexedObject = fails(function () {
+ // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346
+ // eslint-disable-next-line no-prototype-builtins -- safe
+ return !Object('z').propertyIsEnumerable(0);
+ }) ? function (it) {
+ return classofRaw(it) == 'String' ? split.call(it, '') : Object(it);
+ } : Object;
+
+ // `RequireObjectCoercible` abstract operation
+ // https://tc39.es/ecma262/#sec-requireobjectcoercible
+ var requireObjectCoercible = function (it) {
+ if (it == undefined) throw TypeError("Can't call method on " + it);
+ return it;
+ };
+
+ // toObject with fallback for non-array-like ES3 strings
+
+
+
+ var toIndexedObject = function (it) {
+ return indexedObject(requireObjectCoercible(it));
+ };
+
+ // `isCallable` abstract operation
+ // https://tc39.es/ecma262/#sec-iscallable
+ var isCallable = function (argument) {
+ return typeof argument === 'function';
+ };
+
+ var isObject$1 = function (it) {
+ return typeof it === 'object' ? it !== null : isCallable(it);
+ };
+
+ var aFunction = function (argument) {
+ return isCallable(argument) ? argument : undefined;
+ };
+
+ var getBuiltIn = function (namespace, method) {
+ return arguments.length < 2 ? aFunction(global_1[namespace]) : global_1[namespace] && global_1[namespace][method];
+ };
+
+ var engineUserAgent = getBuiltIn('navigator', 'userAgent') || '';
+
+ var process$5 = global_1.process;
+ var Deno = global_1.Deno;
+ var versions$2 = process$5 && process$5.versions || Deno && Deno.version;
+ var v8 = versions$2 && versions$2.v8;
+ var match, version$3;
+
+ if (v8) {
+ match = v8.split('.');
+ version$3 = match[0] < 4 ? 1 : match[0] + match[1];
+ } else if (engineUserAgent) {
+ match = engineUserAgent.match(/Edge\/(\d+)/);
+ if (!match || match[1] >= 74) {
+ match = engineUserAgent.match(/Chrome\/(\d+)/);
+ if (match) version$3 = match[1];
+ }
+ }
+
+ var engineV8Version = version$3 && +version$3;
+
+ /* eslint-disable es/no-symbol -- required for testing */
+
+
+
+ // eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing
+ var nativeSymbol$1 = !!Object.getOwnPropertySymbols && !fails(function () {
+ var symbol = Symbol();
+ // Chrome 38 Symbol has incorrect toString conversion
+ // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances
+ return !String(symbol) || !(Object(symbol) instanceof Symbol) ||
+ // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances
+ !Symbol.sham && engineV8Version && engineV8Version < 41;
+ });
+
+ /* eslint-disable es/no-symbol -- required for testing */
+
+
+ var useSymbolAsUid = nativeSymbol$1
+ && !Symbol.sham
+ && typeof Symbol.iterator == 'symbol';
+
+ var isSymbol$1 = useSymbolAsUid ? function (it) {
+ return typeof it == 'symbol';
+ } : function (it) {
+ var $Symbol = getBuiltIn('Symbol');
+ return isCallable($Symbol) && Object(it) instanceof $Symbol;
+ };
+
+ var tryToString = function (argument) {
+ try {
+ return String(argument);
+ } catch (error) {
+ return 'Object';
+ }
+ };
+
+ // `Assert: IsCallable(argument) is true`
+ var aCallable = function (argument) {
+ if (isCallable(argument)) return argument;
+ throw TypeError(tryToString(argument) + ' is not a function');
+ };
+
+ // `GetMethod` abstract operation
+ // https://tc39.es/ecma262/#sec-getmethod
+ var getMethod = function (V, P) {
+ var func = V[P];
+ return func == null ? undefined : aCallable(func);
+ };
+
+ // `OrdinaryToPrimitive` abstract operation
+ // https://tc39.es/ecma262/#sec-ordinarytoprimitive
+ var ordinaryToPrimitive = function (input, pref) {
+ var fn, val;
+ if (pref === 'string' && isCallable(fn = input.toString) && !isObject$1(val = fn.call(input))) return val;
+ if (isCallable(fn = input.valueOf) && !isObject$1(val = fn.call(input))) return val;
+ if (pref !== 'string' && isCallable(fn = input.toString) && !isObject$1(val = fn.call(input))) return val;
+ throw TypeError("Can't convert object to primitive value");
+ };
+
+ var setGlobal = function (key, value) {
+ try {
+ // eslint-disable-next-line es/no-object-defineproperty -- safe
+ Object.defineProperty(global_1, key, { value: value, configurable: true, writable: true });
+ } catch (error) {
+ global_1[key] = value;
+ } return value;
+ };
+
+ var SHARED = '__core-js_shared__';
+ var store$1 = global_1[SHARED] || setGlobal(SHARED, {});
+
+ var sharedStore = store$1;
+
+ var shared = createCommonjsModule(function (module) {
+ (module.exports = function (key, value) {
+ return sharedStore[key] || (sharedStore[key] = value !== undefined ? value : {});
+ })('versions', []).push({
+ version: '3.18.0',
+ mode: 'global',
+ copyright: '© 2021 Denis Pushkarev (zloirock.ru)'
+ });
+ });
+
+ // `ToObject` abstract operation
+ // https://tc39.es/ecma262/#sec-toobject
+ var toObject = function (argument) {
+ return Object(requireObjectCoercible(argument));
+ };
+
+ var hasOwnProperty$1 = {}.hasOwnProperty;
+
+ var has$1 = Object.hasOwn || function hasOwn(it, key) {
+ return hasOwnProperty$1.call(toObject(it), key);
+ };
+
+ var id = 0;
+ var postfix = Math.random();
+
+ var uid = function (key) {
+ return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);
+ };
+
+ var WellKnownSymbolsStore$1 = shared('wks');
+ var Symbol$1 = global_1.Symbol;
+ var createWellKnownSymbol = useSymbolAsUid ? Symbol$1 : Symbol$1 && Symbol$1.withoutSetter || uid;
+
+ var wellKnownSymbol = function (name) {
+ if (!has$1(WellKnownSymbolsStore$1, name) || !(nativeSymbol$1 || typeof WellKnownSymbolsStore$1[name] == 'string')) {
+ if (nativeSymbol$1 && has$1(Symbol$1, name)) {
+ WellKnownSymbolsStore$1[name] = Symbol$1[name];
+ } else {
+ WellKnownSymbolsStore$1[name] = createWellKnownSymbol('Symbol.' + name);
+ }
+ } return WellKnownSymbolsStore$1[name];
+ };
+
+ var TO_PRIMITIVE$1 = wellKnownSymbol('toPrimitive');
+
+ // `ToPrimitive` abstract operation
+ // https://tc39.es/ecma262/#sec-toprimitive
+ var toPrimitive = function (input, pref) {
+ if (!isObject$1(input) || isSymbol$1(input)) return input;
+ var exoticToPrim = getMethod(input, TO_PRIMITIVE$1);
+ var result;
+ if (exoticToPrim) {
+ if (pref === undefined) pref = 'default';
+ result = exoticToPrim.call(input, pref);
+ if (!isObject$1(result) || isSymbol$1(result)) return result;
+ throw TypeError("Can't convert object to primitive value");
+ }
+ if (pref === undefined) pref = 'number';
+ return ordinaryToPrimitive(input, pref);
+ };
+
+ // `ToPropertyKey` abstract operation
+ // https://tc39.es/ecma262/#sec-topropertykey
+ var toPropertyKey = function (argument) {
+ var key = toPrimitive(argument, 'string');
+ return isSymbol$1(key) ? key : String(key);
+ };
+
+ var document$3 = global_1.document;
+ // typeof document.createElement is 'object' in old IE
+ var EXISTS$1 = isObject$1(document$3) && isObject$1(document$3.createElement);
+
+ var documentCreateElement = function (it) {
+ return EXISTS$1 ? document$3.createElement(it) : {};
+ };
+
+ // Thank's IE8 for his funny defineProperty
+ var ie8DomDefine = !descriptors && !fails(function () {
+ // eslint-disable-next-line es/no-object-defineproperty -- requied for testing
+ return Object.defineProperty(documentCreateElement('div'), 'a', {
+ get: function () { return 7; }
+ }).a != 7;
+ });
+
+ // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+ var $getOwnPropertyDescriptor$1 = Object.getOwnPropertyDescriptor;
+
+ // `Object.getOwnPropertyDescriptor` method
+ // https://tc39.es/ecma262/#sec-object.getownpropertydescriptor
+ var f$6 = descriptors ? $getOwnPropertyDescriptor$1 : function getOwnPropertyDescriptor(O, P) {
+ O = toIndexedObject(O);
+ P = toPropertyKey(P);
+ if (ie8DomDefine) try {
+ return $getOwnPropertyDescriptor$1(O, P);
+ } catch (error) { /* empty */ }
+ if (has$1(O, P)) return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(O, P), O[P]);
+ };
+
+ var objectGetOwnPropertyDescriptor = {
+ f: f$6
+ };
+
+ // `Assert: Type(argument) is Object`
+ var anObject = function (argument) {
+ if (isObject$1(argument)) return argument;
+ throw TypeError(String(argument) + ' is not an object');
+ };
+
+ // eslint-disable-next-line es/no-object-defineproperty -- safe
+ var $defineProperty$1 = Object.defineProperty;
+
+ // `Object.defineProperty` method
+ // https://tc39.es/ecma262/#sec-object.defineproperty
+ var f$5 = descriptors ? $defineProperty$1 : function defineProperty(O, P, Attributes) {
+ anObject(O);
+ P = toPropertyKey(P);
+ anObject(Attributes);
+ if (ie8DomDefine) try {
+ return $defineProperty$1(O, P, Attributes);
+ } catch (error) { /* empty */ }
+ if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');
+ if ('value' in Attributes) O[P] = Attributes.value;
+ return O;
+ };
+
+ var objectDefineProperty = {
+ f: f$5
+ };
+
+ var createNonEnumerableProperty = descriptors ? function (object, key, value) {
+ return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value));
+ } : function (object, key, value) {
+ object[key] = value;
+ return object;
+ };
+
+ var functionToString = Function.toString;
+
+ // this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper
+ if (!isCallable(sharedStore.inspectSource)) {
+ sharedStore.inspectSource = function (it) {
+ return functionToString.call(it);
+ };
+ }
+
+ var inspectSource = sharedStore.inspectSource;
+
+ var WeakMap$1 = global_1.WeakMap;
+
+ var nativeWeakMap = isCallable(WeakMap$1) && /native code/.test(inspectSource(WeakMap$1));
+
+ var keys$4 = shared('keys');
+
+ var sharedKey = function (key) {
+ return keys$4[key] || (keys$4[key] = uid(key));
+ };
+
+ var hiddenKeys$1 = {};
+
+ var OBJECT_ALREADY_INITIALIZED = 'Object already initialized';
+ var WeakMap = global_1.WeakMap;
+ var set$2, get$1, has;
+
+ var enforce = function (it) {
+ return has(it) ? get$1(it) : set$2(it, {});
+ };
+
+ var getterFor = function (TYPE) {
+ return function (it) {
+ var state;
+ if (!isObject$1(it) || (state = get$1(it)).type !== TYPE) {
+ throw TypeError('Incompatible receiver, ' + TYPE + ' required');
+ } return state;
+ };
+ };
+
+ if (nativeWeakMap || sharedStore.state) {
+ var store = sharedStore.state || (sharedStore.state = new WeakMap());
+ var wmget = store.get;
+ var wmhas = store.has;
+ var wmset = store.set;
+ set$2 = function (it, metadata) {
+ if (wmhas.call(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);
+ metadata.facade = it;
+ wmset.call(store, it, metadata);
+ return metadata;
+ };
+ get$1 = function (it) {
+ return wmget.call(store, it) || {};
+ };
+ has = function (it) {
+ return wmhas.call(store, it);
+ };
+ } else {
+ var STATE = sharedKey('state');
+ hiddenKeys$1[STATE] = true;
+ set$2 = function (it, metadata) {
+ if (has$1(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);
+ metadata.facade = it;
+ createNonEnumerableProperty(it, STATE, metadata);
+ return metadata;
+ };
+ get$1 = function (it) {
+ return has$1(it, STATE) ? it[STATE] : {};
+ };
+ has = function (it) {
+ return has$1(it, STATE);
+ };
+ }
+
+ var internalState = {
+ set: set$2,
+ get: get$1,
+ has: has,
+ enforce: enforce,
+ getterFor: getterFor
+ };
+
+ var FunctionPrototype$1 = Function.prototype;
+ // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+ var getDescriptor = descriptors && Object.getOwnPropertyDescriptor;
+
+ var EXISTS = has$1(FunctionPrototype$1, 'name');
+ // additional protection from minified / mangled / dropped function names
+ var PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';
+ var CONFIGURABLE = EXISTS && (!descriptors || (descriptors && getDescriptor(FunctionPrototype$1, 'name').configurable));
+
+ var functionName = {
+ EXISTS: EXISTS,
+ PROPER: PROPER,
+ CONFIGURABLE: CONFIGURABLE
+ };
+
+ var redefine = createCommonjsModule(function (module) {
+ var CONFIGURABLE_FUNCTION_NAME = functionName.CONFIGURABLE;
+
+ var getInternalState = internalState.get;
+ var enforceInternalState = internalState.enforce;
+ var TEMPLATE = String(String).split('String');
+
+ (module.exports = function (O, key, value, options) {
+ var unsafe = options ? !!options.unsafe : false;
+ var simple = options ? !!options.enumerable : false;
+ var noTargetGet = options ? !!options.noTargetGet : false;
+ var name = options && options.name !== undefined ? options.name : key;
+ var state;
+ if (isCallable(value)) {
+ if (String(name).slice(0, 7) === 'Symbol(') {
+ name = '[' + String(name).replace(/^Symbol\(([^)]*)\)/, '$1') + ']';
+ }
+ if (!has$1(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {
+ createNonEnumerableProperty(value, 'name', name);
+ }
+ state = enforceInternalState(value);
+ if (!state.source) {
+ state.source = TEMPLATE.join(typeof name == 'string' ? name : '');
+ }
+ }
+ if (O === global_1) {
+ if (simple) O[key] = value;
+ else setGlobal(key, value);
+ return;
+ } else if (!unsafe) {
+ delete O[key];
+ } else if (!noTargetGet && O[key]) {
+ simple = true;
+ }
+ if (simple) O[key] = value;
+ else createNonEnumerableProperty(O, key, value);
+ // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
+ })(Function.prototype, 'toString', function toString() {
+ return isCallable(this) && getInternalState(this).source || inspectSource(this);
+ });
+ });
+
+ var ceil = Math.ceil;
+ var floor$6 = Math.floor;
+
+ // `ToInteger` abstract operation
+ // https://tc39.es/ecma262/#sec-tointeger
+ var toInteger = function (argument) {
+ return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor$6 : ceil)(argument);
+ };
+
+ var min$7 = Math.min;
+
+ // `ToLength` abstract operation
+ // https://tc39.es/ecma262/#sec-tolength
+ var toLength = function (argument) {
+ return argument > 0 ? min$7(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991
+ };
+
+ var max$3 = Math.max;
+ var min$6 = Math.min;
+
+ // Helper for a popular repeating case of the spec:
+ // Let integer be ? ToInteger(index).
+ // If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).
+ var toAbsoluteIndex = function (index, length) {
+ var integer = toInteger(index);
+ return integer < 0 ? max$3(integer + length, 0) : min$6(integer, length);
+ };
+
+ // `Array.prototype.{ indexOf, includes }` methods implementation
+ var createMethod$5 = function (IS_INCLUDES) {
+ return function ($this, el, fromIndex) {
+ var O = toIndexedObject($this);
+ var length = toLength(O.length);
+ var index = toAbsoluteIndex(fromIndex, length);
+ var value;
+ // Array#includes uses SameValueZero equality algorithm
+ // eslint-disable-next-line no-self-compare -- NaN check
+ if (IS_INCLUDES && el != el) while (length > index) {
+ value = O[index++];
+ // eslint-disable-next-line no-self-compare -- NaN check
+ if (value != value) return true;
+ // Array#indexOf ignores holes, Array#includes - not
+ } else for (;length > index; index++) {
+ if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;
+ } return !IS_INCLUDES && -1;
+ };
+ };
+
+ var arrayIncludes = {
+ // `Array.prototype.includes` method
+ // https://tc39.es/ecma262/#sec-array.prototype.includes
+ includes: createMethod$5(true),
+ // `Array.prototype.indexOf` method
+ // https://tc39.es/ecma262/#sec-array.prototype.indexof
+ indexOf: createMethod$5(false)
+ };
+
+ var indexOf$1 = arrayIncludes.indexOf;
+
+
+ var objectKeysInternal = function (object, names) {
+ var O = toIndexedObject(object);
+ var i = 0;
+ var result = [];
+ var key;
+ for (key in O) !has$1(hiddenKeys$1, key) && has$1(O, key) && result.push(key);
+ // Don't enum bug & hidden keys
+ while (names.length > i) if (has$1(O, key = names[i++])) {
+ ~indexOf$1(result, key) || result.push(key);
+ }
+ return result;
+ };
+
+ // IE8- don't enum bug keys
+ var enumBugKeys = [
+ 'constructor',
+ 'hasOwnProperty',
+ 'isPrototypeOf',
+ 'propertyIsEnumerable',
+ 'toLocaleString',
+ 'toString',
+ 'valueOf'
+ ];
+
+ var hiddenKeys = enumBugKeys.concat('length', 'prototype');
+
+ // `Object.getOwnPropertyNames` method
+ // https://tc39.es/ecma262/#sec-object.getownpropertynames
+ // eslint-disable-next-line es/no-object-getownpropertynames -- safe
+ var f$4 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+ return objectKeysInternal(O, hiddenKeys);
+ };
+
+ var objectGetOwnPropertyNames = {
+ f: f$4
+ };
+
+ // eslint-disable-next-line es/no-object-getownpropertysymbols -- safe
+ var f$3 = Object.getOwnPropertySymbols;
+
+ var objectGetOwnPropertySymbols = {
+ f: f$3
+ };
+
+ // all object keys, includes non-enumerable and symbols
+ var ownKeys$1 = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {
+ var keys = objectGetOwnPropertyNames.f(anObject(it));
+ var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;
+ return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;
+ };
+
+ var copyConstructorProperties = function (target, source) {
+ var keys = ownKeys$1(source);
+ var defineProperty = objectDefineProperty.f;
+ var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ if (!has$1(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));
+ }
+ };
+
+ var replacement = /#|\.prototype\./;
+
+ var isForced = function (feature, detection) {
+ var value = data[normalize$1(feature)];
+ return value == POLYFILL ? true
+ : value == NATIVE ? false
+ : isCallable(detection) ? fails(detection)
+ : !!detection;
+ };
+
+ var normalize$1 = isForced.normalize = function (string) {
+ return String(string).replace(replacement, '.').toLowerCase();
+ };
+
+ var data = isForced.data = {};
+ var NATIVE = isForced.NATIVE = 'N';
+ var POLYFILL = isForced.POLYFILL = 'P';
+
+ var isForced_1 = isForced;
+
+ var getOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;
+
+
+
+
+
+
+ /*
+ options.target - name of the target object
+ options.global - target is the global object
+ options.stat - export as static methods of target
+ options.proto - export as prototype methods of target
+ options.real - real prototype method for the `pure` version
+ options.forced - export even if the native feature is available
+ options.bind - bind methods to the target, required for the `pure` version
+ options.wrap - wrap constructors to preventing global pollution, required for the `pure` version
+ options.unsafe - use the simple assignment of property instead of delete + defineProperty
+ options.sham - add a flag to not completely full polyfills
+ options.enumerable - export as enumerable property
+ options.noTargetGet - prevent calling a getter on target
+ options.name - the .name of the function if it does not match the key
+ */
+ var _export = function (options, source) {
+ var TARGET = options.target;
+ var GLOBAL = options.global;
+ var STATIC = options.stat;
+ var FORCED, target, key, targetProperty, sourceProperty, descriptor;
+ if (GLOBAL) {
+ target = global_1;
+ } else if (STATIC) {
+ target = global_1[TARGET] || setGlobal(TARGET, {});
+ } else {
+ target = (global_1[TARGET] || {}).prototype;
+ }
+ if (target) for (key in source) {
+ sourceProperty = source[key];
+ if (options.noTargetGet) {
+ descriptor = getOwnPropertyDescriptor$2(target, key);
+ targetProperty = descriptor && descriptor.value;
+ } else targetProperty = target[key];
+ FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);
+ // contained in target
+ if (!FORCED && targetProperty !== undefined) {
+ if (typeof sourceProperty === typeof targetProperty) continue;
+ copyConstructorProperties(sourceProperty, targetProperty);
+ }
+ // add a flag to not completely full polyfills
+ if (options.sham || (targetProperty && targetProperty.sham)) {
+ createNonEnumerableProperty(sourceProperty, 'sham', true);
+ }
+ // extend global
+ redefine(target, key, sourceProperty, options);
+ }
+ };
+
+ // `IsArray` abstract operation
+ // https://tc39.es/ecma262/#sec-isarray
+ // eslint-disable-next-line es/no-array-isarray -- safe
+ var isArray$3 = Array.isArray || function isArray(argument) {
+ return classofRaw(argument) == 'Array';
+ };
+
+ var TO_STRING_TAG$4 = wellKnownSymbol('toStringTag');
+ var test$2 = {};
+
+ test$2[TO_STRING_TAG$4] = 'z';
+
+ var toStringTagSupport = String(test$2) === '[object z]';
+
+ var TO_STRING_TAG$3 = wellKnownSymbol('toStringTag');
+ // ES3 wrong here
+ var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';
+
+ // fallback for IE11 Script Access Denied error
+ var tryGet = function (it, key) {
+ try {
+ return it[key];
+ } catch (error) { /* empty */ }
+ };
+
+ // getting tag from ES6+ `Object.prototype.toString`
+ var classof = toStringTagSupport ? classofRaw : function (it) {
+ var O, tag, result;
+ return it === undefined ? 'Undefined' : it === null ? 'Null'
+ // @@toStringTag case
+ : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG$3)) == 'string' ? tag
+ // builtinTag case
+ : CORRECT_ARGUMENTS ? classofRaw(O)
+ // ES3 arguments fallback
+ : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result;
+ };
+
+ var empty = [];
+ var construct = getBuiltIn('Reflect', 'construct');
+ var constructorRegExp = /^\s*(?:class|function)\b/;
+ var exec = constructorRegExp.exec;
+ var INCORRECT_TO_STRING = !constructorRegExp.exec(function () { /* empty */ });
+
+ var isConstructorModern = function (argument) {
+ if (!isCallable(argument)) return false;
+ try {
+ construct(Object, empty, argument);
+ return true;
+ } catch (error) {
+ return false;
+ }
+ };
+
+ var isConstructorLegacy = function (argument) {
+ if (!isCallable(argument)) return false;
+ switch (classof(argument)) {
+ case 'AsyncFunction':
+ case 'GeneratorFunction':
+ case 'AsyncGeneratorFunction': return false;
+ // we can't check .prototype since constructors produced by .bind haven't it
+ } return INCORRECT_TO_STRING || !!exec.call(constructorRegExp, inspectSource(argument));
+ };
+
+ // `IsConstructor` abstract operation
+ // https://tc39.es/ecma262/#sec-isconstructor
+ var isConstructor = !construct || fails(function () {
+ var called;
+ return isConstructorModern(isConstructorModern.call)
+ || !isConstructorModern(Object)
+ || !isConstructorModern(function () { called = true; })
+ || called;
+ }) ? isConstructorLegacy : isConstructorModern;
+
+ var SPECIES$6 = wellKnownSymbol('species');
+
+ // a part of `ArraySpeciesCreate` abstract operation
+ // https://tc39.es/ecma262/#sec-arrayspeciescreate
+ var arraySpeciesConstructor = function (originalArray) {
+ var C;
+ if (isArray$3(originalArray)) {
+ C = originalArray.constructor;
+ // cross-realm fallback
+ if (isConstructor(C) && (C === Array || isArray$3(C.prototype))) C = undefined;
+ else if (isObject$1(C)) {
+ C = C[SPECIES$6];
+ if (C === null) C = undefined;
+ }
+ } return C === undefined ? Array : C;
+ };
+
+ // `ArraySpeciesCreate` abstract operation
+ // https://tc39.es/ecma262/#sec-arrayspeciescreate
+ var arraySpeciesCreate = function (originalArray, length) {
+ return new (arraySpeciesConstructor(originalArray))(length === 0 ? 0 : length);
+ };
+
+ var createProperty = function (object, key, value) {
+ var propertyKey = toPropertyKey(key);
+ if (propertyKey in object) objectDefineProperty.f(object, propertyKey, createPropertyDescriptor(0, value));
+ else object[propertyKey] = value;
+ };
+
+ var SPECIES$5 = wellKnownSymbol('species');
+
+ var arrayMethodHasSpeciesSupport = function (METHOD_NAME) {
+ // We can't use this feature detection in V8 since it causes
+ // deoptimization and serious performance degradation
+ // https://github.com/zloirock/core-js/issues/677
+ return engineV8Version >= 51 || !fails(function () {
+ var array = [];
+ var constructor = array.constructor = {};
+ constructor[SPECIES$5] = function () {
+ return { foo: 1 };
+ };
+ return array[METHOD_NAME](Boolean).foo !== 1;
+ });
+ };
+
+ var HAS_SPECIES_SUPPORT$3 = arrayMethodHasSpeciesSupport('splice');
+
+ var max$2 = Math.max;
+ var min$5 = Math.min;
+ var MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF;
+ var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';
+
+ // `Array.prototype.splice` method
+ // https://tc39.es/ecma262/#sec-array.prototype.splice
+ // with adding support of @@species
+ _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$3 }, {
+ splice: function splice(start, deleteCount /* , ...items */) {
+ var O = toObject(this);
+ var len = toLength(O.length);
+ var actualStart = toAbsoluteIndex(start, len);
+ var argumentsLength = arguments.length;
+ var insertCount, actualDeleteCount, A, k, from, to;
+ if (argumentsLength === 0) {
+ insertCount = actualDeleteCount = 0;
+ } else if (argumentsLength === 1) {
+ insertCount = 0;
+ actualDeleteCount = len - actualStart;
+ } else {
+ insertCount = argumentsLength - 2;
+ actualDeleteCount = min$5(max$2(toInteger(deleteCount), 0), len - actualStart);
+ }
+ if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER$1) {
+ throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);
+ }
+ A = arraySpeciesCreate(O, actualDeleteCount);
+ for (k = 0; k < actualDeleteCount; k++) {
+ from = actualStart + k;
+ if (from in O) createProperty(A, k, O[from]);
+ }
+ A.length = actualDeleteCount;
+ if (insertCount < actualDeleteCount) {
+ for (k = actualStart; k < len - actualDeleteCount; k++) {
+ from = k + actualDeleteCount;
+ to = k + insertCount;
+ if (from in O) O[to] = O[from];
+ else delete O[to];
+ }
+ for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];
+ } else if (insertCount > actualDeleteCount) {
+ for (k = len - actualDeleteCount; k > actualStart; k--) {
+ from = k + actualDeleteCount - 1;
+ to = k + insertCount - 1;
+ if (from in O) O[to] = O[from];
+ else delete O[to];
+ }
+ }
+ for (k = 0; k < insertCount; k++) {
+ O[k + actualStart] = arguments[k + 2];
+ }
+ O.length = len - actualDeleteCount + insertCount;
+ return A;
+ }
+ });
+
+ // iterable DOM collections
+ // flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods
+ var domIterables = {
+ CSSRuleList: 0,
+ CSSStyleDeclaration: 0,
+ CSSValueList: 0,
+ ClientRectList: 0,
+ DOMRectList: 0,
+ DOMStringList: 0,
+ DOMTokenList: 1,
+ DataTransferItemList: 0,
+ FileList: 0,
+ HTMLAllCollection: 0,
+ HTMLCollection: 0,
+ HTMLFormElement: 0,
+ HTMLSelectElement: 0,
+ MediaList: 0,
+ MimeTypeArray: 0,
+ NamedNodeMap: 0,
+ NodeList: 1,
+ PaintRequestList: 0,
+ Plugin: 0,
+ PluginArray: 0,
+ SVGLengthList: 0,
+ SVGNumberList: 0,
+ SVGPathSegList: 0,
+ SVGPointList: 0,
+ SVGStringList: 0,
+ SVGTransformList: 0,
+ SourceBufferList: 0,
+ StyleSheetList: 0,
+ TextTrackCueList: 0,
+ TextTrackList: 0,
+ TouchList: 0
+ };
+
+ // in old WebKit versions, `element.classList` is not an instance of global `DOMTokenList`
+
+
+ var classList = documentCreateElement('span').classList;
+ var DOMTokenListPrototype = classList && classList.constructor && classList.constructor.prototype;
+
+ var domTokenListPrototype = DOMTokenListPrototype === Object.prototype ? undefined : DOMTokenListPrototype;
+
+ // optional / simple context binding
+ var functionBindContext = function (fn, that, length) {
+ aCallable(fn);
+ if (that === undefined) return fn;
+ switch (length) {
+ case 0: return function () {
+ return fn.call(that);
+ };
+ case 1: return function (a) {
+ return fn.call(that, a);
+ };
+ case 2: return function (a, b) {
+ return fn.call(that, a, b);
+ };
+ case 3: return function (a, b, c) {
+ return fn.call(that, a, b, c);
+ };
+ }
+ return function (/* ...args */) {
+ return fn.apply(that, arguments);
+ };
+ };
+
+ var push = [].push;
+
+ // `Array.prototype.{ forEach, map, filter, some, every, find, findIndex, filterReject }` methods implementation
+ var createMethod$4 = function (TYPE) {
+ var IS_MAP = TYPE == 1;
+ var IS_FILTER = TYPE == 2;
+ var IS_SOME = TYPE == 3;
+ var IS_EVERY = TYPE == 4;
+ var IS_FIND_INDEX = TYPE == 6;
+ var IS_FILTER_REJECT = TYPE == 7;
+ var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
+ return function ($this, callbackfn, that, specificCreate) {
+ var O = toObject($this);
+ var self = indexedObject(O);
+ var boundFunction = functionBindContext(callbackfn, that, 3);
+ var length = toLength(self.length);
+ var index = 0;
+ var create = specificCreate || arraySpeciesCreate;
+ var target = IS_MAP ? create($this, length) : IS_FILTER || IS_FILTER_REJECT ? create($this, 0) : undefined;
+ var value, result;
+ for (;length > index; index++) if (NO_HOLES || index in self) {
+ value = self[index];
+ result = boundFunction(value, index, O);
+ if (TYPE) {
+ if (IS_MAP) target[index] = result; // map
+ else if (result) switch (TYPE) {
+ case 3: return true; // some
+ case 5: return value; // find
+ case 6: return index; // findIndex
+ case 2: push.call(target, value); // filter
+ } else switch (TYPE) {
+ case 4: return false; // every
+ case 7: push.call(target, value); // filterReject
+ }
+ }
+ }
+ return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;
+ };
+ };
+
+ var arrayIteration = {
+ // `Array.prototype.forEach` method
+ // https://tc39.es/ecma262/#sec-array.prototype.foreach
+ forEach: createMethod$4(0),
+ // `Array.prototype.map` method
+ // https://tc39.es/ecma262/#sec-array.prototype.map
+ map: createMethod$4(1),
+ // `Array.prototype.filter` method
+ // https://tc39.es/ecma262/#sec-array.prototype.filter
+ filter: createMethod$4(2),
+ // `Array.prototype.some` method
+ // https://tc39.es/ecma262/#sec-array.prototype.some
+ some: createMethod$4(3),
+ // `Array.prototype.every` method
+ // https://tc39.es/ecma262/#sec-array.prototype.every
+ every: createMethod$4(4),
+ // `Array.prototype.find` method
+ // https://tc39.es/ecma262/#sec-array.prototype.find
+ find: createMethod$4(5),
+ // `Array.prototype.findIndex` method
+ // https://tc39.es/ecma262/#sec-array.prototype.findIndex
+ findIndex: createMethod$4(6),
+ // `Array.prototype.filterReject` method
+ // https://github.com/tc39/proposal-array-filtering
+ filterReject: createMethod$4(7)
+ };
+
+ var arrayMethodIsStrict = function (METHOD_NAME, argument) {
+ var method = [][METHOD_NAME];
+ return !!method && fails(function () {
+ // eslint-disable-next-line no-useless-call,no-throw-literal -- required for testing
+ method.call(null, argument || function () { throw 1; }, 1);
+ });
+ };
+
+ var $forEach$2 = arrayIteration.forEach;
+
+
+ var STRICT_METHOD$3 = arrayMethodIsStrict('forEach');
+
+ // `Array.prototype.forEach` method implementation
+ // https://tc39.es/ecma262/#sec-array.prototype.foreach
+ var arrayForEach = !STRICT_METHOD$3 ? function forEach(callbackfn /* , thisArg */) {
+ return $forEach$2(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ // eslint-disable-next-line es/no-array-prototype-foreach -- safe
+ } : [].forEach;
+
+ var handlePrototype$1 = function (CollectionPrototype) {
+ // some Chrome versions have non-configurable methods on DOMTokenList
+ if (CollectionPrototype && CollectionPrototype.forEach !== arrayForEach) try {
+ createNonEnumerableProperty(CollectionPrototype, 'forEach', arrayForEach);
+ } catch (error) {
+ CollectionPrototype.forEach = arrayForEach;
+ }
+ };
+
+ for (var COLLECTION_NAME$1 in domIterables) {
+ handlePrototype$1(global_1[COLLECTION_NAME$1] && global_1[COLLECTION_NAME$1].prototype);
+ }
+
+ handlePrototype$1(domTokenListPrototype);
+
+ var $filter$1 = arrayIteration.filter;
+
+
+ var HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport('filter');
+
+ // `Array.prototype.filter` method
+ // https://tc39.es/ecma262/#sec-array.prototype.filter
+ // with adding support of @@species
+ _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$2 }, {
+ filter: function filter(callbackfn /* , thisArg */) {
+ return $filter$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ }
+ });
+
+ // `Object.keys` method
+ // https://tc39.es/ecma262/#sec-object.keys
+ // eslint-disable-next-line es/no-object-keys -- safe
+ var objectKeys = Object.keys || function keys(O) {
+ return objectKeysInternal(O, enumBugKeys);
+ };
+
+ var FAILS_ON_PRIMITIVES$4 = fails(function () { objectKeys(1); });
+
+ // `Object.keys` method
+ // https://tc39.es/ecma262/#sec-object.keys
+ _export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES$4 }, {
+ keys: function keys(it) {
+ return objectKeys(toObject(it));
+ }
+ });
+
+ var toString_1 = function (argument) {
+ if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string');
+ return String(argument);
+ };
+
+ // `RegExp.prototype.flags` getter implementation
+ // https://tc39.es/ecma262/#sec-get-regexp.prototype.flags
+ var regexpFlags = function () {
+ var that = anObject(this);
+ var result = '';
+ if (that.global) result += 'g';
+ if (that.ignoreCase) result += 'i';
+ if (that.multiline) result += 'm';
+ if (that.dotAll) result += 's';
+ if (that.unicode) result += 'u';
+ if (that.sticky) result += 'y';
+ return result;
+ };
+
+ // babel-minify and Closure Compiler transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError
+ var $RegExp$2 = global_1.RegExp;
+
+ var UNSUPPORTED_Y$3 = fails(function () {
+ var re = $RegExp$2('a', 'y');
+ re.lastIndex = 2;
+ return re.exec('abcd') != null;
+ });
+
+ var BROKEN_CARET = fails(function () {
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=773687
+ var re = $RegExp$2('^r', 'gy');
+ re.lastIndex = 2;
+ return re.exec('str') != null;
+ });
+
+ var regexpStickyHelpers = {
+ UNSUPPORTED_Y: UNSUPPORTED_Y$3,
+ BROKEN_CARET: BROKEN_CARET
+ };
+
+ // `Object.defineProperties` method
+ // https://tc39.es/ecma262/#sec-object.defineproperties
+ // eslint-disable-next-line es/no-object-defineproperties -- safe
+ var objectDefineProperties = descriptors ? Object.defineProperties : function defineProperties(O, Properties) {
+ anObject(O);
+ var keys = objectKeys(Properties);
+ var length = keys.length;
+ var index = 0;
+ var key;
+ while (length > index) objectDefineProperty.f(O, key = keys[index++], Properties[key]);
+ return O;
+ };
+
+ var html$1 = getBuiltIn('document', 'documentElement');
+
+ /* global ActiveXObject -- old IE, WSH */
+
+
+
+
+
+
+
+
+ var GT = '>';
+ var LT = '<';
+ var PROTOTYPE$2 = 'prototype';
+ var SCRIPT = 'script';
+ var IE_PROTO$1 = sharedKey('IE_PROTO');
+
+ var EmptyConstructor = function () { /* empty */ };
+
+ var scriptTag = function (content) {
+ return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;
+ };
+
+ // Create object with fake `null` prototype: use ActiveX Object with cleared prototype
+ var NullProtoObjectViaActiveX = function (activeXDocument) {
+ activeXDocument.write(scriptTag(''));
+ activeXDocument.close();
+ var temp = activeXDocument.parentWindow.Object;
+ activeXDocument = null; // avoid memory leak
+ return temp;
+ };
+
+ // Create object with fake `null` prototype: use iframe Object with cleared prototype
+ var NullProtoObjectViaIFrame = function () {
+ // Thrash, waste and sodomy: IE GC bug
+ var iframe = documentCreateElement('iframe');
+ var JS = 'java' + SCRIPT + ':';
+ var iframeDocument;
+ iframe.style.display = 'none';
+ html$1.appendChild(iframe);
+ // https://github.com/zloirock/core-js/issues/475
+ iframe.src = String(JS);
+ iframeDocument = iframe.contentWindow.document;
+ iframeDocument.open();
+ iframeDocument.write(scriptTag('document.F=Object'));
+ iframeDocument.close();
+ return iframeDocument.F;
+ };
+
+ // Check for document.domain and active x support
+ // No need to use active x approach when document.domain is not set
+ // see https://github.com/es-shims/es5-shim/issues/150
+ // variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346
+ // avoid IE GC bug
+ var activeXDocument;
+ var NullProtoObject = function () {
+ try {
+ activeXDocument = new ActiveXObject('htmlfile');
+ } catch (error) { /* ignore */ }
+ NullProtoObject = typeof document != 'undefined'
+ ? document.domain && activeXDocument
+ ? NullProtoObjectViaActiveX(activeXDocument) // old IE
+ : NullProtoObjectViaIFrame()
+ : NullProtoObjectViaActiveX(activeXDocument); // WSH
+ var length = enumBugKeys.length;
+ while (length--) delete NullProtoObject[PROTOTYPE$2][enumBugKeys[length]];
+ return NullProtoObject();
+ };
+
+ hiddenKeys$1[IE_PROTO$1] = true;
+
+ // `Object.create` method
+ // https://tc39.es/ecma262/#sec-object.create
+ var objectCreate = Object.create || function create(O, Properties) {
+ var result;
+ if (O !== null) {
+ EmptyConstructor[PROTOTYPE$2] = anObject(O);
+ result = new EmptyConstructor();
+ EmptyConstructor[PROTOTYPE$2] = null;
+ // add "__proto__" for Object.getPrototypeOf polyfill
+ result[IE_PROTO$1] = O;
+ } else result = NullProtoObject();
+ return Properties === undefined ? result : objectDefineProperties(result, Properties);
+ };
+
+ // babel-minify and Closure Compiler transpiles RegExp('.', 's') -> /./s and it causes SyntaxError
+ var $RegExp$1 = global_1.RegExp;
+
+ var regexpUnsupportedDotAll = fails(function () {
+ var re = $RegExp$1('.', 's');
+ return !(re.dotAll && re.exec('\n') && re.flags === 's');
+ });
+
+ // babel-minify and Closure Compiler transpiles RegExp('(?b)', 'g') -> /(? b)/g and it causes SyntaxError
+ var $RegExp = global_1.RegExp;
+
+ var regexpUnsupportedNcg = fails(function () {
+ var re = $RegExp('(? b)', 'g');
+ return re.exec('b').groups.a !== 'b' ||
+ 'b'.replace(re, '$ c') !== 'bc';
+ });
+
+ /* eslint-disable regexp/no-empty-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */
+ /* eslint-disable regexp/no-useless-quantifier -- testing */
+
+
+
+
+
+ var getInternalState$5 = internalState.get;
+
+
+
+ var nativeExec = RegExp.prototype.exec;
+ var nativeReplace = shared('native-string-replace', String.prototype.replace);
+
+ var patchedExec = nativeExec;
+
+ var UPDATES_LAST_INDEX_WRONG = (function () {
+ var re1 = /a/;
+ var re2 = /b*/g;
+ nativeExec.call(re1, 'a');
+ nativeExec.call(re2, 'a');
+ return re1.lastIndex !== 0 || re2.lastIndex !== 0;
+ })();
+
+ var UNSUPPORTED_Y$2 = regexpStickyHelpers.UNSUPPORTED_Y || regexpStickyHelpers.BROKEN_CARET;
+
+ // nonparticipating capturing group, copied from es5-shim's String#split patch.
+ var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;
+
+ var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y$2 || regexpUnsupportedDotAll || regexpUnsupportedNcg;
+
+ if (PATCH) {
+ // eslint-disable-next-line max-statements -- TODO
+ patchedExec = function exec(string) {
+ var re = this;
+ var state = getInternalState$5(re);
+ var str = toString_1(string);
+ var raw = state.raw;
+ var result, reCopy, lastIndex, match, i, object, group;
+
+ if (raw) {
+ raw.lastIndex = re.lastIndex;
+ result = patchedExec.call(raw, str);
+ re.lastIndex = raw.lastIndex;
+ return result;
+ }
+
+ var groups = state.groups;
+ var sticky = UNSUPPORTED_Y$2 && re.sticky;
+ var flags = regexpFlags.call(re);
+ var source = re.source;
+ var charsAdded = 0;
+ var strCopy = str;
+
+ if (sticky) {
+ flags = flags.replace('y', '');
+ if (flags.indexOf('g') === -1) {
+ flags += 'g';
+ }
+
+ strCopy = str.slice(re.lastIndex);
+ // Support anchored sticky behavior.
+ if (re.lastIndex > 0 && (!re.multiline || re.multiline && str.charAt(re.lastIndex - 1) !== '\n')) {
+ source = '(?: ' + source + ')';
+ strCopy = ' ' + strCopy;
+ charsAdded++;
+ }
+ // ^(? + rx + ) is needed, in combination with some str slicing, to
+ // simulate the 'y' flag.
+ reCopy = new RegExp('^(?:' + source + ')', flags);
+ }
+
+ if (NPCG_INCLUDED) {
+ reCopy = new RegExp('^' + source + '$(?!\\s)', flags);
+ }
+ if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;
+
+ match = nativeExec.call(sticky ? reCopy : re, strCopy);
+
+ if (sticky) {
+ if (match) {
+ match.input = match.input.slice(charsAdded);
+ match[0] = match[0].slice(charsAdded);
+ match.index = re.lastIndex;
+ re.lastIndex += match[0].length;
+ } else re.lastIndex = 0;
+ } else if (UPDATES_LAST_INDEX_WRONG && match) {
+ re.lastIndex = re.global ? match.index + match[0].length : lastIndex;
+ }
+ if (NPCG_INCLUDED && match && match.length > 1) {
+ // Fix browsers whose `exec` methods don't consistently return `undefined`
+ // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/
+ nativeReplace.call(match[0], reCopy, function () {
+ for (i = 1; i < arguments.length - 2; i++) {
+ if (arguments[i] === undefined) match[i] = undefined;
+ }
+ });
+ }
+
+ if (match && groups) {
+ match.groups = object = objectCreate(null);
+ for (i = 0; i < groups.length; i++) {
+ group = groups[i];
+ object[group[0]] = match[group[1]];
+ }
+ }
+
+ return match;
+ };
+ }
+
+ var regexpExec = patchedExec;
+
+ // `RegExp.prototype.exec` method
+ // https://tc39.es/ecma262/#sec-regexp.prototype.exec
+ _export({ target: 'RegExp', proto: true, forced: /./.exec !== regexpExec }, {
+ exec: regexpExec
+ });
+
+ // TODO: Remove from `core-js@4` since it's moved to entry points
+
+
+
+
+
+
+
+ var SPECIES$4 = wellKnownSymbol('species');
+ var RegExpPrototype$2 = RegExp.prototype;
+
+ var fixRegexpWellKnownSymbolLogic = function (KEY, exec, FORCED, SHAM) {
+ var SYMBOL = wellKnownSymbol(KEY);
+
+ var DELEGATES_TO_SYMBOL = !fails(function () {
+ // String methods call symbol-named RegEp methods
+ var O = {};
+ O[SYMBOL] = function () { return 7; };
+ return ''[KEY](O) != 7;
+ });
+
+ var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {
+ // Symbol-named RegExp methods call .exec
+ var execCalled = false;
+ var re = /a/;
+
+ if (KEY === 'split') {
+ // We can't use real regex here since it causes deoptimization
+ // and serious performance degradation in V8
+ // https://github.com/zloirock/core-js/issues/306
+ re = {};
+ // RegExp[@@split] doesn't call the regex's exec method, but first creates
+ // a new one. We need to return the patched regex when creating the new one.
+ re.constructor = {};
+ re.constructor[SPECIES$4] = function () { return re; };
+ re.flags = '';
+ re[SYMBOL] = /./[SYMBOL];
+ }
+
+ re.exec = function () { execCalled = true; return null; };
+
+ re[SYMBOL]('');
+ return !execCalled;
+ });
+
+ if (
+ !DELEGATES_TO_SYMBOL ||
+ !DELEGATES_TO_EXEC ||
+ FORCED
+ ) {
+ var nativeRegExpMethod = /./[SYMBOL];
+ var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {
+ var $exec = regexp.exec;
+ if ($exec === regexpExec || $exec === RegExpPrototype$2.exec) {
+ if (DELEGATES_TO_SYMBOL && !forceStringMethod) {
+ // The native String method already delegates to @@method (this
+ // polyfilled function), leasing to infinite recursion.
+ // We avoid it by directly calling the native @@method method.
+ return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };
+ }
+ return { done: true, value: nativeMethod.call(str, regexp, arg2) };
+ }
+ return { done: false };
+ });
+
+ redefine(String.prototype, KEY, methods[0]);
+ redefine(RegExpPrototype$2, SYMBOL, methods[1]);
+ }
+
+ if (SHAM) createNonEnumerableProperty(RegExpPrototype$2[SYMBOL], 'sham', true);
+ };
+
+ // `SameValue` abstract operation
+ // https://tc39.es/ecma262/#sec-samevalue
+ // eslint-disable-next-line es/no-object-is -- safe
+ var sameValue = Object.is || function is(x, y) {
+ // eslint-disable-next-line no-self-compare -- NaN check
+ return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;
+ };
+
+ // `RegExpExec` abstract operation
+ // https://tc39.es/ecma262/#sec-regexpexec
+ var regexpExecAbstract = function (R, S) {
+ var exec = R.exec;
+ if (isCallable(exec)) {
+ var result = exec.call(R, S);
+ if (result !== null) anObject(result);
+ return result;
+ }
+ if (classofRaw(R) === 'RegExp') return regexpExec.call(R, S);
+ throw TypeError('RegExp#exec called on incompatible receiver');
+ };
+
+ // @@search logic
+ fixRegexpWellKnownSymbolLogic('search', function (SEARCH, nativeSearch, maybeCallNative) {
+ return [
+ // `String.prototype.search` method
+ // https://tc39.es/ecma262/#sec-string.prototype.search
+ function search(regexp) {
+ var O = requireObjectCoercible(this);
+ var searcher = regexp == undefined ? undefined : getMethod(regexp, SEARCH);
+ return searcher ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](toString_1(O));
+ },
+ // `RegExp.prototype[@@search]` method
+ // https://tc39.es/ecma262/#sec-regexp.prototype-@@search
+ function (string) {
+ var rx = anObject(this);
+ var S = toString_1(string);
+ var res = maybeCallNative(nativeSearch, rx, S);
+
+ if (res.done) return res.value;
+
+ var previousLastIndex = rx.lastIndex;
+ if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;
+ var result = regexpExecAbstract(rx, S);
+ if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;
+ return result === null ? -1 : result.index;
+ }
+ ];
+ });
+
+ var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');
+ var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;
+ var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';
+
+ // We can't use this feature detection in V8 since it causes
+ // deoptimization and serious performance degradation
+ // https://github.com/zloirock/core-js/issues/679
+ var IS_CONCAT_SPREADABLE_SUPPORT = engineV8Version >= 51 || !fails(function () {
+ var array = [];
+ array[IS_CONCAT_SPREADABLE] = false;
+ return array.concat()[0] !== array;
+ });
+
+ var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');
+
+ var isConcatSpreadable = function (O) {
+ if (!isObject$1(O)) return false;
+ var spreadable = O[IS_CONCAT_SPREADABLE];
+ return spreadable !== undefined ? !!spreadable : isArray$3(O);
+ };
+
+ var FORCED$8 = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;
+
+ // `Array.prototype.concat` method
+ // https://tc39.es/ecma262/#sec-array.prototype.concat
+ // with adding support of @@isConcatSpreadable and @@species
+ _export({ target: 'Array', proto: true, forced: FORCED$8 }, {
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
+ concat: function concat(arg) {
+ var O = toObject(this);
+ var A = arraySpeciesCreate(O, 0);
+ var n = 0;
+ var i, k, length, len, E;
+ for (i = -1, length = arguments.length; i < length; i++) {
+ E = i === -1 ? O : arguments[i];
+ if (isConcatSpreadable(E)) {
+ len = toLength(E.length);
+ if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
+ for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);
+ } else {
+ if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);
+ createProperty(A, n++, E);
+ }
+ }
+ A.length = n;
+ return A;
+ }
+ });
+
+ var global$2 = typeof global$1 !== "undefined" ? global$1 : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};
+
+ var global$1 = typeof global$2 !== "undefined" ? global$2 : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};
+
+ // based off https://github.com/defunctzombie/node-process/blob/master/browser.js
+
+ function defaultSetTimout$1() {
+ throw new Error('setTimeout has not been defined');
+ }
+
+ function defaultClearTimeout$1() {
+ throw new Error('clearTimeout has not been defined');
+ }
+
+ var cachedSetTimeout$1 = defaultSetTimout$1;
+ var cachedClearTimeout$1 = defaultClearTimeout$1;
+
+ if (typeof global$1.setTimeout === 'function') {
+ cachedSetTimeout$1 = setTimeout;
+ }
+
+ if (typeof global$1.clearTimeout === 'function') {
+ cachedClearTimeout$1 = clearTimeout;
+ }
+
+ function runTimeout$1(fun) {
+ if (cachedSetTimeout$1 === setTimeout) {
+ //normal enviroments in sane situations
+ return setTimeout(fun, 0);
+ } // if setTimeout wasn't available but was latter defined
+
+
+ if ((cachedSetTimeout$1 === defaultSetTimout$1 || !cachedSetTimeout$1) && setTimeout) {
+ cachedSetTimeout$1 = setTimeout;
+ return setTimeout(fun, 0);
+ }
+
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedSetTimeout$1(fun, 0);
+ } catch (e) {
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedSetTimeout$1.call(null, fun, 0);
+ } catch (e) {
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+ return cachedSetTimeout$1.call(this, fun, 0);
+ }
+ }
+ }
+
+ function runClearTimeout$1(marker) {
+ if (cachedClearTimeout$1 === clearTimeout) {
+ //normal enviroments in sane situations
+ return clearTimeout(marker);
+ } // if clearTimeout wasn't available but was latter defined
+
+
+ if ((cachedClearTimeout$1 === defaultClearTimeout$1 || !cachedClearTimeout$1) && clearTimeout) {
+ cachedClearTimeout$1 = clearTimeout;
+ return clearTimeout(marker);
+ }
+
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedClearTimeout$1(marker);
+ } catch (e) {
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedClearTimeout$1.call(null, marker);
+ } catch (e) {
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+ // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+ return cachedClearTimeout$1.call(this, marker);
+ }
+ }
+ }
+
+ var queue$2 = [];
+ var draining$1 = false;
+ var currentQueue$1;
+ var queueIndex$1 = -1;
+
+ function cleanUpNextTick$1() {
+ if (!draining$1 || !currentQueue$1) {
+ return;
+ }
+
+ draining$1 = false;
+
+ if (currentQueue$1.length) {
+ queue$2 = currentQueue$1.concat(queue$2);
+ } else {
+ queueIndex$1 = -1;
+ }
+
+ if (queue$2.length) {
+ drainQueue$1();
+ }
+ }
+
+ function drainQueue$1() {
+ if (draining$1) {
+ return;
+ }
+
+ var timeout = runTimeout$1(cleanUpNextTick$1);
+ draining$1 = true;
+ var len = queue$2.length;
+
+ while (len) {
+ currentQueue$1 = queue$2;
+ queue$2 = [];
+
+ while (++queueIndex$1 < len) {
+ if (currentQueue$1) {
+ currentQueue$1[queueIndex$1].run();
+ }
+ }
+
+ queueIndex$1 = -1;
+ len = queue$2.length;
+ }
+
+ currentQueue$1 = null;
+ draining$1 = false;
+ runClearTimeout$1(timeout);
+ }
+
+ function nextTick$1(fun) {
+ var args = new Array(arguments.length - 1);
+
+ if (arguments.length > 1) {
+ for (var i = 1; i < arguments.length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ }
+
+ queue$2.push(new Item$1(fun, args));
+
+ if (queue$2.length === 1 && !draining$1) {
+ runTimeout$1(drainQueue$1);
+ }
+ } // v8 likes predictible objects
+
+ function Item$1(fun, array) {
+ this.fun = fun;
+ this.array = array;
+ }
+
+ Item$1.prototype.run = function () {
+ this.fun.apply(null, this.array);
+ };
+
+ var title$1 = 'browser';
+ var platform$1 = 'browser';
+ var browser$4 = true;
+ var env$1 = {};
+ var argv$1 = [];
+ var version$2 = ''; // empty string to avoid regexp issues
+
+ var versions$1 = {};
+ var release$1 = {};
+ var config$1 = {};
+
+ function noop$1() {}
+
+ var on$1 = noop$1;
+ var addListener$1 = noop$1;
+ var once$1 = noop$1;
+ var off$1 = noop$1;
+ var removeListener$1 = noop$1;
+ var removeAllListeners$1 = noop$1;
+ var emit$1 = noop$1;
+ function binding$1(name) {
+ throw new Error('process.binding is not supported');
+ }
+ function cwd$1() {
+ return '/';
+ }
+ function chdir$1(dir) {
+ throw new Error('process.chdir is not supported');
+ }
+ function umask$1() {
+ return 0;
+ } // from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js
+
+ var performance$1 = global$1.performance || {};
+
+ var performanceNow$1 = performance$1.now || performance$1.mozNow || performance$1.msNow || performance$1.oNow || performance$1.webkitNow || function () {
+ return new Date().getTime();
+ }; // generate timestamp or delta
+ // see http://nodejs.org/api/process.html#process_process_hrtime
+
+
+ function hrtime$1(previousTimestamp) {
+ var clocktime = performanceNow$1.call(performance$1) * 1e-3;
+ var seconds = Math.floor(clocktime);
+ var nanoseconds = Math.floor(clocktime % 1 * 1e9);
+
+ if (previousTimestamp) {
+ seconds = seconds - previousTimestamp[0];
+ nanoseconds = nanoseconds - previousTimestamp[1];
+
+ if (nanoseconds < 0) {
+ seconds--;
+ nanoseconds += 1e9;
+ }
+ }
+
+ return [seconds, nanoseconds];
+ }
+ var startTime$1 = new Date();
+ function uptime$1() {
+ var currentTime = new Date();
+ var dif = currentTime - startTime$1;
+ return dif / 1000;
+ }
+ var process$4 = {
+ nextTick: nextTick$1,
+ title: title$1,
+ browser: browser$4,
+ env: env$1,
+ argv: argv$1,
+ version: version$2,
+ versions: versions$1,
+ on: on$1,
+ addListener: addListener$1,
+ once: once$1,
+ off: off$1,
+ removeListener: removeListener$1,
+ removeAllListeners: removeAllListeners$1,
+ emit: emit$1,
+ binding: binding$1,
+ cwd: cwd$1,
+ chdir: chdir$1,
+ umask: umask$1,
+ hrtime: hrtime$1,
+ platform: platform$1,
+ release: release$1,
+ config: config$1,
+ uptime: uptime$1
+ };
+
+ // `Object.prototype.toString` method implementation
+ // https://tc39.es/ecma262/#sec-object.prototype.tostring
+ var objectToString$1 = toStringTagSupport ? {}.toString : function toString() {
+ return '[object ' + classof(this) + ']';
+ };
+
+ // `Object.prototype.toString` method
+ // https://tc39.es/ecma262/#sec-object.prototype.tostring
+ if (!toStringTagSupport) {
+ redefine(Object.prototype, 'toString', objectToString$1, { unsafe: true });
+ }
+
+ var PROPER_FUNCTION_NAME$4 = functionName.PROPER;
+
+
+
+
+
+
+ var TO_STRING = 'toString';
+ var RegExpPrototype$1 = RegExp.prototype;
+ var nativeToString = RegExpPrototype$1[TO_STRING];
+
+ var NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });
+ // FF44- RegExp#toString has a wrong name
+ var INCORRECT_NAME = PROPER_FUNCTION_NAME$4 && nativeToString.name != TO_STRING;
+
+ // `RegExp.prototype.toString` method
+ // https://tc39.es/ecma262/#sec-regexp.prototype.tostring
+ if (NOT_GENERIC || INCORRECT_NAME) {
+ redefine(RegExp.prototype, TO_STRING, function toString() {
+ var R = anObject(this);
+ var p = toString_1(R.source);
+ var rf = R.flags;
+ var f = toString_1(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype$1) ? regexpFlags.call(R) : rf);
+ return '/' + p + '/' + f;
+ }, { unsafe: true });
+ }
+
+ var correctPrototypeGetter = !fails(function () {
+ function F() { /* empty */ }
+ F.prototype.constructor = null;
+ // eslint-disable-next-line es/no-object-getprototypeof -- required for testing
+ return Object.getPrototypeOf(new F()) !== F.prototype;
+ });
+
+ var IE_PROTO = sharedKey('IE_PROTO');
+ var ObjectPrototype$3 = Object.prototype;
+
+ // `Object.getPrototypeOf` method
+ // https://tc39.es/ecma262/#sec-object.getprototypeof
+ // eslint-disable-next-line es/no-object-getprototypeof -- safe
+ var objectGetPrototypeOf = correctPrototypeGetter ? Object.getPrototypeOf : function (O) {
+ var object = toObject(O);
+ if (has$1(object, IE_PROTO)) return object[IE_PROTO];
+ var constructor = object.constructor;
+ if (isCallable(constructor) && object instanceof constructor) {
+ return constructor.prototype;
+ } return object instanceof Object ? ObjectPrototype$3 : null;
+ };
+
+ var FAILS_ON_PRIMITIVES$3 = fails(function () { objectGetPrototypeOf(1); });
+
+ // `Object.getPrototypeOf` method
+ // https://tc39.es/ecma262/#sec-object.getprototypeof
+ _export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES$3, sham: !correctPrototypeGetter }, {
+ getPrototypeOf: function getPrototypeOf(it) {
+ return objectGetPrototypeOf(toObject(it));
+ }
+ });
+
+ var FUNCTION_NAME_EXISTS = functionName.EXISTS;
+ var defineProperty$9 = objectDefineProperty.f;
+
+ var FunctionPrototype = Function.prototype;
+ var FunctionPrototypeToString = FunctionPrototype.toString;
+ var nameRE = /^\s*function ([^ (]*)/;
+ var NAME$1 = 'name';
+
+ // Function instances `.name` property
+ // https://tc39.es/ecma262/#sec-function-instances-name
+ if (descriptors && !FUNCTION_NAME_EXISTS) {
+ defineProperty$9(FunctionPrototype, NAME$1, {
+ configurable: true,
+ get: function () {
+ try {
+ return FunctionPrototypeToString.call(this).match(nameRE)[1];
+ } catch (error) {
+ return '';
+ }
+ }
+ });
+ }
+
+ // `Reflect.ownKeys` method
+ // https://tc39.es/ecma262/#sec-reflect.ownkeys
+ _export({ target: 'Reflect', stat: true }, {
+ ownKeys: ownKeys$1
+ });
+
+ var domain; // This constructor is used to store event handlers. Instantiating this is
+ // faster than explicitly calling `Object.create(null)` to get a "clean" empty
+ // object (tested with v8 v4.9).
+
+ function EventHandlers() {}
+
+ EventHandlers.prototype = Object.create(null);
+
+ function EventEmitter$2() {
+ EventEmitter$2.init.call(this);
+ }
+ // require('events') === require('events').EventEmitter
+
+ EventEmitter$2.EventEmitter = EventEmitter$2;
+ EventEmitter$2.usingDomains = false;
+ EventEmitter$2.prototype.domain = undefined;
+ EventEmitter$2.prototype._events = undefined;
+ EventEmitter$2.prototype._maxListeners = undefined; // By default EventEmitters will print a warning if more than 10 listeners are
+ // added to it. This is a useful default which helps finding memory leaks.
+
+ EventEmitter$2.defaultMaxListeners = 10;
+
+ EventEmitter$2.init = function () {
+ this.domain = null;
+
+ if (EventEmitter$2.usingDomains) {
+ // if there is an active domain, then attach to it.
+ if (domain.active ) ;
+ }
+
+ if (!this._events || this._events === Object.getPrototypeOf(this)._events) {
+ this._events = new EventHandlers();
+ this._eventsCount = 0;
+ }
+
+ this._maxListeners = this._maxListeners || undefined;
+ }; // Obviously not all Emitters should be limited to 10. This function allows
+ // that to be increased. Set to zero for unlimited.
+
+
+ EventEmitter$2.prototype.setMaxListeners = function setMaxListeners(n) {
+ if (typeof n !== 'number' || n < 0 || isNaN(n)) throw new TypeError('"n" argument must be a positive number');
+ this._maxListeners = n;
+ return this;
+ };
+
+ function $getMaxListeners(that) {
+ if (that._maxListeners === undefined) return EventEmitter$2.defaultMaxListeners;
+ return that._maxListeners;
+ }
+
+ EventEmitter$2.prototype.getMaxListeners = function getMaxListeners() {
+ return $getMaxListeners(this);
+ }; // These standalone emit* functions are used to optimize calling of event
+ // handlers for fast cases because emit() itself often has a variable number of
+ // arguments and can be deoptimized because of that. These functions always have
+ // the same number of arguments and thus do not get deoptimized, so the code
+ // inside them can execute faster.
+
+
+ function emitNone(handler, isFn, self) {
+ if (isFn) handler.call(self);else {
+ var len = handler.length;
+ var listeners = arrayClone(handler, len);
+
+ for (var i = 0; i < len; ++i) {
+ listeners[i].call(self);
+ }
+ }
+ }
+
+ function emitOne(handler, isFn, self, arg1) {
+ if (isFn) handler.call(self, arg1);else {
+ var len = handler.length;
+ var listeners = arrayClone(handler, len);
+
+ for (var i = 0; i < len; ++i) {
+ listeners[i].call(self, arg1);
+ }
+ }
+ }
+
+ function emitTwo(handler, isFn, self, arg1, arg2) {
+ if (isFn) handler.call(self, arg1, arg2);else {
+ var len = handler.length;
+ var listeners = arrayClone(handler, len);
+
+ for (var i = 0; i < len; ++i) {
+ listeners[i].call(self, arg1, arg2);
+ }
+ }
+ }
+
+ function emitThree(handler, isFn, self, arg1, arg2, arg3) {
+ if (isFn) handler.call(self, arg1, arg2, arg3);else {
+ var len = handler.length;
+ var listeners = arrayClone(handler, len);
+
+ for (var i = 0; i < len; ++i) {
+ listeners[i].call(self, arg1, arg2, arg3);
+ }
+ }
+ }
+
+ function emitMany(handler, isFn, self, args) {
+ if (isFn) handler.apply(self, args);else {
+ var len = handler.length;
+ var listeners = arrayClone(handler, len);
+
+ for (var i = 0; i < len; ++i) {
+ listeners[i].apply(self, args);
+ }
+ }
+ }
+
+ EventEmitter$2.prototype.emit = function emit(type) {
+ var er, handler, len, args, i, events, domain;
+ var doError = type === 'error';
+ events = this._events;
+ if (events) doError = doError && events.error == null;else if (!doError) return false;
+ domain = this.domain; // If there is no 'error' event listener then throw.
+
+ if (doError) {
+ er = arguments[1];
+
+ if (domain) {
+ if (!er) er = new Error('Uncaught, unspecified "error" event');
+ er.domainEmitter = this;
+ er.domain = domain;
+ er.domainThrown = false;
+ domain.emit('error', er);
+ } else if (er instanceof Error) {
+ throw er; // Unhandled 'error' event
+ } else {
+ // At least give some kind of context to the user
+ var err = new Error('Uncaught, unspecified "error" event. (' + er + ')');
+ err.context = er;
+ throw err;
+ }
+
+ return false;
+ }
+
+ handler = events[type];
+ if (!handler) return false;
+ var isFn = typeof handler === 'function';
+ len = arguments.length;
+
+ switch (len) {
+ // fast cases
+ case 1:
+ emitNone(handler, isFn, this);
+ break;
+
+ case 2:
+ emitOne(handler, isFn, this, arguments[1]);
+ break;
+
+ case 3:
+ emitTwo(handler, isFn, this, arguments[1], arguments[2]);
+ break;
+
+ case 4:
+ emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);
+ break;
+ // slower
+
+ default:
+ args = new Array(len - 1);
+
+ for (i = 1; i < len; i++) {
+ args[i - 1] = arguments[i];
+ }
+
+ emitMany(handler, isFn, this, args);
+ }
+ return true;
+ };
+
+ function _addListener(target, type, listener, prepend) {
+ var m;
+ var events;
+ var existing;
+ if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function');
+ events = target._events;
+
+ if (!events) {
+ events = target._events = new EventHandlers();
+ target._eventsCount = 0;
+ } else {
+ // To avoid recursion in the case that type === "newListener"! Before
+ // adding it to the listeners, first emit "newListener".
+ if (events.newListener) {
+ target.emit('newListener', type, listener.listener ? listener.listener : listener); // Re-assign `events` because a newListener handler could have caused the
+ // this._events to be assigned to a new object
+
+ events = target._events;
+ }
+
+ existing = events[type];
+ }
+
+ if (!existing) {
+ // Optimize the case of one listener. Don't need the extra array object.
+ existing = events[type] = listener;
+ ++target._eventsCount;
+ } else {
+ if (typeof existing === 'function') {
+ // Adding the second element, need to change to array.
+ existing = events[type] = prepend ? [listener, existing] : [existing, listener];
+ } else {
+ // If we've already got an array, just append.
+ if (prepend) {
+ existing.unshift(listener);
+ } else {
+ existing.push(listener);
+ }
+ } // Check for listener leak
+
+
+ if (!existing.warned) {
+ m = $getMaxListeners(target);
+
+ if (m && m > 0 && existing.length > m) {
+ existing.warned = true;
+ var w = new Error('Possible EventEmitter memory leak detected. ' + existing.length + ' ' + type + ' listeners added. ' + 'Use emitter.setMaxListeners() to increase limit');
+ w.name = 'MaxListenersExceededWarning';
+ w.emitter = target;
+ w.type = type;
+ w.count = existing.length;
+ emitWarning$1(w);
+ }
+ }
+ }
+
+ return target;
+ }
+
+ function emitWarning$1(e) {
+ typeof console.warn === 'function' ? console.warn(e) : console.log(e);
+ }
+
+ EventEmitter$2.prototype.addListener = function addListener(type, listener) {
+ return _addListener(this, type, listener, false);
+ };
+
+ EventEmitter$2.prototype.on = EventEmitter$2.prototype.addListener;
+
+ EventEmitter$2.prototype.prependListener = function prependListener(type, listener) {
+ return _addListener(this, type, listener, true);
+ };
+
+ function _onceWrap(target, type, listener) {
+ var fired = false;
+
+ function g() {
+ target.removeListener(type, g);
+
+ if (!fired) {
+ fired = true;
+ listener.apply(target, arguments);
+ }
+ }
+
+ g.listener = listener;
+ return g;
+ }
+
+ EventEmitter$2.prototype.once = function once(type, listener) {
+ if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function');
+ this.on(type, _onceWrap(this, type, listener));
+ return this;
+ };
+
+ EventEmitter$2.prototype.prependOnceListener = function prependOnceListener(type, listener) {
+ if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function');
+ this.prependListener(type, _onceWrap(this, type, listener));
+ return this;
+ }; // emits a 'removeListener' event iff the listener was removed
+
+
+ EventEmitter$2.prototype.removeListener = function removeListener(type, listener) {
+ var list, events, position, i, originalListener;
+ if (typeof listener !== 'function') throw new TypeError('"listener" argument must be a function');
+ events = this._events;
+ if (!events) return this;
+ list = events[type];
+ if (!list) return this;
+
+ if (list === listener || list.listener && list.listener === listener) {
+ if (--this._eventsCount === 0) this._events = new EventHandlers();else {
+ delete events[type];
+ if (events.removeListener) this.emit('removeListener', type, list.listener || listener);
+ }
+ } else if (typeof list !== 'function') {
+ position = -1;
+
+ for (i = list.length; i-- > 0;) {
+ if (list[i] === listener || list[i].listener && list[i].listener === listener) {
+ originalListener = list[i].listener;
+ position = i;
+ break;
+ }
+ }
+
+ if (position < 0) return this;
+
+ if (list.length === 1) {
+ list[0] = undefined;
+
+ if (--this._eventsCount === 0) {
+ this._events = new EventHandlers();
+ return this;
+ } else {
+ delete events[type];
+ }
+ } else {
+ spliceOne(list, position);
+ }
+
+ if (events.removeListener) this.emit('removeListener', type, originalListener || listener);
+ }
+
+ return this;
+ };
+
+ EventEmitter$2.prototype.removeAllListeners = function removeAllListeners(type) {
+ var listeners, events;
+ events = this._events;
+ if (!events) return this; // not listening for removeListener, no need to emit
+
+ if (!events.removeListener) {
+ if (arguments.length === 0) {
+ this._events = new EventHandlers();
+ this._eventsCount = 0;
+ } else if (events[type]) {
+ if (--this._eventsCount === 0) this._events = new EventHandlers();else delete events[type];
+ }
+
+ return this;
+ } // emit removeListener for all listeners on all events
+
+
+ if (arguments.length === 0) {
+ var keys = Object.keys(events);
+
+ for (var i = 0, key; i < keys.length; ++i) {
+ key = keys[i];
+ if (key === 'removeListener') continue;
+ this.removeAllListeners(key);
+ }
+
+ this.removeAllListeners('removeListener');
+ this._events = new EventHandlers();
+ this._eventsCount = 0;
+ return this;
+ }
+
+ listeners = events[type];
+
+ if (typeof listeners === 'function') {
+ this.removeListener(type, listeners);
+ } else if (listeners) {
+ // LIFO order
+ do {
+ this.removeListener(type, listeners[listeners.length - 1]);
+ } while (listeners[0]);
+ }
+
+ return this;
+ };
+
+ EventEmitter$2.prototype.listeners = function listeners(type) {
+ var evlistener;
+ var ret;
+ var events = this._events;
+ if (!events) ret = [];else {
+ evlistener = events[type];
+ if (!evlistener) ret = [];else if (typeof evlistener === 'function') ret = [evlistener.listener || evlistener];else ret = unwrapListeners(evlistener);
+ }
+ return ret;
+ };
+
+ EventEmitter$2.listenerCount = function (emitter, type) {
+ if (typeof emitter.listenerCount === 'function') {
+ return emitter.listenerCount(type);
+ } else {
+ return listenerCount$1.call(emitter, type);
+ }
+ };
+
+ EventEmitter$2.prototype.listenerCount = listenerCount$1;
+
+ function listenerCount$1(type) {
+ var events = this._events;
+
+ if (events) {
+ var evlistener = events[type];
+
+ if (typeof evlistener === 'function') {
+ return 1;
+ } else if (evlistener) {
+ return evlistener.length;
+ }
+ }
+
+ return 0;
+ }
+
+ EventEmitter$2.prototype.eventNames = function eventNames() {
+ return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];
+ }; // About 1.5x faster than the two-arg version of Array#splice().
+
+
+ function spliceOne(list, index) {
+ for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) {
+ list[i] = list[k];
+ }
+
+ list.pop();
+ }
+
+ function arrayClone(arr, i) {
+ var copy = new Array(i);
+
+ while (i--) {
+ copy[i] = arr[i];
+ }
+
+ return copy;
+ }
+
+ function unwrapListeners(arr) {
+ var ret = new Array(arr.length);
+
+ for (var i = 0; i < ret.length; ++i) {
+ ret[i] = arr[i].listener || arr[i];
+ }
+
+ return ret;
+ }
+
+ function ownKeys(object, enumerableOnly) {
+ var keys = Object.keys(object);
+
+ if (Object.getOwnPropertySymbols) {
+ var symbols = Object.getOwnPropertySymbols(object);
+
+ if (enumerableOnly) {
+ symbols = symbols.filter(function (sym) {
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
+ });
+ }
+
+ keys.push.apply(keys, symbols);
+ }
+
+ return keys;
+ }
+
+ function _objectSpread2(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i] != null ? arguments[i] : {};
+
+ if (i % 2) {
+ ownKeys(Object(source), true).forEach(function (key) {
+ _defineProperty(target, key, source[key]);
+ });
+ } else if (Object.getOwnPropertyDescriptors) {
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
+ } else {
+ ownKeys(Object(source)).forEach(function (key) {
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
+ });
+ }
+ }
+
+ return target;
+ }
+
+ function _typeof(obj) {
+ "@babel/helpers - typeof";
+
+ if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
+ _typeof = function (obj) {
+ return typeof obj;
+ };
+ } else {
+ _typeof = function (obj) {
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ };
+ }
+
+ return _typeof(obj);
+ }
+
+ function _asyncIterator(iterable) {
+ var method;
+
+ if (typeof Symbol !== "undefined") {
+ if (Symbol.asyncIterator) method = iterable[Symbol.asyncIterator];
+ if (method == null && Symbol.iterator) method = iterable[Symbol.iterator];
+ }
+
+ if (method == null) method = iterable["@@asyncIterator"];
+ if (method == null) method = iterable["@@iterator"];
+ if (method == null) throw new TypeError("Object is not async iterable");
+ return method.call(iterable);
+ }
+
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
+ try {
+ var info = gen[key](arg);
+ var value = info.value;
+ } catch (error) {
+ reject(error);
+ return;
+ }
+
+ if (info.done) {
+ resolve(value);
+ } else {
+ Promise.resolve(value).then(_next, _throw);
+ }
+ }
+
+ function _asyncToGenerator(fn) {
+ return function () {
+ var self = this,
+ args = arguments;
+ return new Promise(function (resolve, reject) {
+ var gen = fn.apply(self, args);
+
+ function _next(value) {
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
+ }
+
+ function _throw(err) {
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
+ }
+
+ _next(undefined);
+ });
+ };
+ }
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function _defineProperty(obj, key, value) {
+ if (key in obj) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
+ }
+
+ return obj;
+ }
+
+ function _inherits(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function");
+ }
+
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ writable: true,
+ configurable: true
+ }
+ });
+ if (superClass) _setPrototypeOf(subClass, superClass);
+ }
+
+ function _getPrototypeOf(o) {
+ _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
+ return o.__proto__ || Object.getPrototypeOf(o);
+ };
+ return _getPrototypeOf(o);
+ }
+
+ function _setPrototypeOf(o, p) {
+ _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
+ o.__proto__ = p;
+ return o;
+ };
+
+ return _setPrototypeOf(o, p);
+ }
+
+ function _isNativeReflectConstruct() {
+ if (typeof Reflect === "undefined" || !Reflect.construct) return false;
+ if (Reflect.construct.sham) return false;
+ if (typeof Proxy === "function") return true;
+
+ try {
+ Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+
+ function _assertThisInitialized(self) {
+ if (self === void 0) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }
+
+ return self;
+ }
+
+ function _possibleConstructorReturn(self, call) {
+ if (call && (typeof call === "object" || typeof call === "function")) {
+ return call;
+ } else if (call !== void 0) {
+ throw new TypeError("Derived constructors may only return object or undefined");
+ }
+
+ return _assertThisInitialized(self);
+ }
+
+ function _createSuper(Derived) {
+ var hasNativeReflectConstruct = _isNativeReflectConstruct();
+
+ return function _createSuperInternal() {
+ var Super = _getPrototypeOf(Derived),
+ result;
+
+ if (hasNativeReflectConstruct) {
+ var NewTarget = _getPrototypeOf(this).constructor;
+
+ result = Reflect.construct(Super, arguments, NewTarget);
+ } else {
+ result = Super.apply(this, arguments);
+ }
+
+ return _possibleConstructorReturn(this, result);
+ };
+ }
+
+ function _toConsumableArray(arr) {
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
+ }
+
+ function _arrayWithoutHoles(arr) {
+ if (Array.isArray(arr)) return _arrayLikeToArray(arr);
+ }
+
+ function _iterableToArray(iter) {
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
+ }
+
+ function _unsupportedIterableToArray(o, minLen) {
+ if (!o) return;
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
+ var n = Object.prototype.toString.call(o).slice(8, -1);
+ if (n === "Object" && o.constructor) n = o.constructor.name;
+ if (n === "Map" || n === "Set") return Array.from(o);
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
+ }
+
+ function _arrayLikeToArray(arr, len) {
+ if (len == null || len > arr.length) len = arr.length;
+
+ for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
+
+ return arr2;
+ }
+
+ function _nonIterableSpread() {
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+ }
+
+ var nativeJoin = [].join;
+
+ var ES3_STRINGS = indexedObject != Object;
+ var STRICT_METHOD$2 = arrayMethodIsStrict('join', ',');
+
+ // `Array.prototype.join` method
+ // https://tc39.es/ecma262/#sec-array.prototype.join
+ _export({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD$2 }, {
+ join: function join(separator) {
+ return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);
+ }
+ });
+
+ // `String.prototype.codePointAt` methods implementation
+ var createMethod$3 = function (CONVERT_TO_STRING) {
+ return function ($this, pos) {
+ var S = toString_1(requireObjectCoercible($this));
+ var position = toInteger(pos);
+ var size = S.length;
+ var first, second;
+ if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;
+ first = S.charCodeAt(position);
+ return first < 0xD800 || first > 0xDBFF || position + 1 === size
+ || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF
+ ? CONVERT_TO_STRING ? S.charAt(position) : first
+ : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;
+ };
+ };
+
+ var stringMultibyte = {
+ // `String.prototype.codePointAt` method
+ // https://tc39.es/ecma262/#sec-string.prototype.codepointat
+ codeAt: createMethod$3(false),
+ // `String.prototype.at` method
+ // https://github.com/mathiasbynens/String.prototype.at
+ charAt: createMethod$3(true)
+ };
+
+ var charAt$1 = stringMultibyte.charAt;
+
+ // `AdvanceStringIndex` abstract operation
+ // https://tc39.es/ecma262/#sec-advancestringindex
+ var advanceStringIndex = function (S, index, unicode) {
+ return index + (unicode ? charAt$1(S, index).length : 1);
+ };
+
+ var floor$5 = Math.floor;
+ var replace = ''.replace;
+ var SUBSTITUTION_SYMBOLS = /\$([$&'`]|\d{1,2}|<[^>]*>)/g;
+ var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&'`]|\d{1,2})/g;
+
+ // `GetSubstitution` abstract operation
+ // https://tc39.es/ecma262/#sec-getsubstitution
+ var getSubstitution = function (matched, str, position, captures, namedCaptures, replacement) {
+ var tailPos = position + matched.length;
+ var m = captures.length;
+ var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;
+ if (namedCaptures !== undefined) {
+ namedCaptures = toObject(namedCaptures);
+ symbols = SUBSTITUTION_SYMBOLS;
+ }
+ return replace.call(replacement, symbols, function (match, ch) {
+ var capture;
+ switch (ch.charAt(0)) {
+ case '$': return '$';
+ case '&': return matched;
+ case '`': return str.slice(0, position);
+ case "'": return str.slice(tailPos);
+ case '<':
+ capture = namedCaptures[ch.slice(1, -1)];
+ break;
+ default: // \d\d?
+ var n = +ch;
+ if (n === 0) return match;
+ if (n > m) {
+ var f = floor$5(n / 10);
+ if (f === 0) return match;
+ if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);
+ return match;
+ }
+ capture = captures[n - 1];
+ }
+ return capture === undefined ? '' : capture;
+ });
+ };
+
+ var REPLACE = wellKnownSymbol('replace');
+ var max$1 = Math.max;
+ var min$4 = Math.min;
+
+ var maybeToString = function (it) {
+ return it === undefined ? it : String(it);
+ };
+
+ // IE <= 11 replaces $0 with the whole match, as if it was $&
+ // https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0
+ var REPLACE_KEEPS_$0 = (function () {
+ // eslint-disable-next-line regexp/prefer-escape-replacement-dollar-char -- required for testing
+ return 'a'.replace(/./, '$0') === '$0';
+ })();
+
+ // Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string
+ var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {
+ if (/./[REPLACE]) {
+ return /./[REPLACE]('a', '$0') === '';
+ }
+ return false;
+ })();
+
+ var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {
+ var re = /./;
+ re.exec = function () {
+ var result = [];
+ result.groups = { a: '7' };
+ return result;
+ };
+ // eslint-disable-next-line regexp/no-useless-dollar-replacements -- false positive
+ return ''.replace(re, '$ ') !== '7';
+ });
+
+ // @@replace logic
+ fixRegexpWellKnownSymbolLogic('replace', function (_, nativeReplace, maybeCallNative) {
+ var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';
+
+ return [
+ // `String.prototype.replace` method
+ // https://tc39.es/ecma262/#sec-string.prototype.replace
+ function replace(searchValue, replaceValue) {
+ var O = requireObjectCoercible(this);
+ var replacer = searchValue == undefined ? undefined : getMethod(searchValue, REPLACE);
+ return replacer
+ ? replacer.call(searchValue, O, replaceValue)
+ : nativeReplace.call(toString_1(O), searchValue, replaceValue);
+ },
+ // `RegExp.prototype[@@replace]` method
+ // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace
+ function (string, replaceValue) {
+ var rx = anObject(this);
+ var S = toString_1(string);
+
+ if (
+ typeof replaceValue === 'string' &&
+ replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1 &&
+ replaceValue.indexOf('$<') === -1
+ ) {
+ var res = maybeCallNative(nativeReplace, rx, S, replaceValue);
+ if (res.done) return res.value;
+ }
+
+ var functionalReplace = isCallable(replaceValue);
+ if (!functionalReplace) replaceValue = toString_1(replaceValue);
+
+ var global = rx.global;
+ if (global) {
+ var fullUnicode = rx.unicode;
+ rx.lastIndex = 0;
+ }
+ var results = [];
+ while (true) {
+ var result = regexpExecAbstract(rx, S);
+ if (result === null) break;
+
+ results.push(result);
+ if (!global) break;
+
+ var matchStr = toString_1(result[0]);
+ if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);
+ }
+
+ var accumulatedResult = '';
+ var nextSourcePosition = 0;
+ for (var i = 0; i < results.length; i++) {
+ result = results[i];
+
+ var matched = toString_1(result[0]);
+ var position = max$1(min$4(toInteger(result.index), S.length), 0);
+ var captures = [];
+ // NOTE: This is equivalent to
+ // captures = result.slice(1).map(maybeToString)
+ // but for some reason `nativeSlice.call(result, 1, result.length)` (called in
+ // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and
+ // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.
+ for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));
+ var namedCaptures = result.groups;
+ if (functionalReplace) {
+ var replacerArgs = [matched].concat(captures, position, S);
+ if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);
+ var replacement = toString_1(replaceValue.apply(undefined, replacerArgs));
+ } else {
+ replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);
+ }
+ if (position >= nextSourcePosition) {
+ accumulatedResult += S.slice(nextSourcePosition, position) + replacement;
+ nextSourcePosition = position + matched.length;
+ }
+ }
+ return accumulatedResult + S.slice(nextSourcePosition);
+ }
+ ];
+ }, !REPLACE_SUPPORTS_NAMED_GROUPS || !REPLACE_KEEPS_$0 || REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE);
+
+ var aPossiblePrototype = function (argument) {
+ if (typeof argument === 'object' || isCallable(argument)) return argument;
+ throw TypeError("Can't set " + String(argument) + ' as a prototype');
+ };
+
+ /* eslint-disable no-proto -- safe */
+
+
+
+ // `Object.setPrototypeOf` method
+ // https://tc39.es/ecma262/#sec-object.setprototypeof
+ // Works with __proto__ only. Old v8 can't work with null proto objects.
+ // eslint-disable-next-line es/no-object-setprototypeof -- safe
+ var objectSetPrototypeOf = Object.setPrototypeOf || ('__proto__' in {} ? function () {
+ var CORRECT_SETTER = false;
+ var test = {};
+ var setter;
+ try {
+ // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe
+ setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;
+ setter.call(test, []);
+ CORRECT_SETTER = test instanceof Array;
+ } catch (error) { /* empty */ }
+ return function setPrototypeOf(O, proto) {
+ anObject(O);
+ aPossiblePrototype(proto);
+ if (CORRECT_SETTER) setter.call(O, proto);
+ else O.__proto__ = proto;
+ return O;
+ };
+ }() : undefined);
+
+ // makes subclassing work correct for wrapped built-ins
+ var inheritIfRequired = function ($this, dummy, Wrapper) {
+ var NewTarget, NewTargetPrototype;
+ if (
+ // it can work only with native `setPrototypeOf`
+ objectSetPrototypeOf &&
+ // we haven't completely correct pre-ES6 way for getting `new.target`, so use this
+ isCallable(NewTarget = dummy.constructor) &&
+ NewTarget !== Wrapper &&
+ isObject$1(NewTargetPrototype = NewTarget.prototype) &&
+ NewTargetPrototype !== Wrapper.prototype
+ ) objectSetPrototypeOf($this, NewTargetPrototype);
+ return $this;
+ };
+
+ // a string of all valid unicode whitespaces
+ var whitespaces = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u2000\u2001\u2002' +
+ '\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF';
+
+ var whitespace = '[' + whitespaces + ']';
+ var ltrim = RegExp('^' + whitespace + whitespace + '*');
+ var rtrim = RegExp(whitespace + whitespace + '*$');
+
+ // `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation
+ var createMethod$2 = function (TYPE) {
+ return function ($this) {
+ var string = toString_1(requireObjectCoercible($this));
+ if (TYPE & 1) string = string.replace(ltrim, '');
+ if (TYPE & 2) string = string.replace(rtrim, '');
+ return string;
+ };
+ };
+
+ var stringTrim = {
+ // `String.prototype.{ trimLeft, trimStart }` methods
+ // https://tc39.es/ecma262/#sec-string.prototype.trimstart
+ start: createMethod$2(1),
+ // `String.prototype.{ trimRight, trimEnd }` methods
+ // https://tc39.es/ecma262/#sec-string.prototype.trimend
+ end: createMethod$2(2),
+ // `String.prototype.trim` method
+ // https://tc39.es/ecma262/#sec-string.prototype.trim
+ trim: createMethod$2(3)
+ };
+
+ var getOwnPropertyNames$3 = objectGetOwnPropertyNames.f;
+ var getOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;
+ var defineProperty$8 = objectDefineProperty.f;
+ var trim = stringTrim.trim;
+
+ var NUMBER = 'Number';
+ var NativeNumber = global_1[NUMBER];
+ var NumberPrototype = NativeNumber.prototype;
+
+ // Opera ~12 has broken Object#toString
+ var BROKEN_CLASSOF = classofRaw(objectCreate(NumberPrototype)) == NUMBER;
+
+ // `ToNumber` abstract operation
+ // https://tc39.es/ecma262/#sec-tonumber
+ var toNumber = function (argument) {
+ if (isSymbol$1(argument)) throw TypeError('Cannot convert a Symbol value to a number');
+ var it = toPrimitive(argument, 'number');
+ var first, third, radix, maxCode, digits, length, index, code;
+ if (typeof it == 'string' && it.length > 2) {
+ it = trim(it);
+ first = it.charCodeAt(0);
+ if (first === 43 || first === 45) {
+ third = it.charCodeAt(2);
+ if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix
+ } else if (first === 48) {
+ switch (it.charCodeAt(1)) {
+ case 66: case 98: radix = 2; maxCode = 49; break; // fast equal of /^0b[01]+$/i
+ case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i
+ default: return +it;
+ }
+ digits = it.slice(2);
+ length = digits.length;
+ for (index = 0; index < length; index++) {
+ code = digits.charCodeAt(index);
+ // parseInt parses a string to a first unavailable symbol
+ // but ToNumber should return NaN if a string contains unavailable symbols
+ if (code < 48 || code > maxCode) return NaN;
+ } return parseInt(digits, radix);
+ }
+ } return +it;
+ };
+
+ // `Number` constructor
+ // https://tc39.es/ecma262/#sec-number-constructor
+ if (isForced_1(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {
+ var NumberWrapper = function Number(value) {
+ var it = arguments.length < 1 ? 0 : value;
+ var dummy = this;
+ return dummy instanceof NumberWrapper
+ // check on 1..constructor(foo) case
+ && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classofRaw(dummy) != NUMBER)
+ ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);
+ };
+ for (var keys$3 = descriptors ? getOwnPropertyNames$3(NativeNumber) : (
+ // ES3:
+ 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +
+ // ES2015 (in case, if modules with ES2015 Number statics required before):
+ 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +
+ 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger,' +
+ // ESNext
+ 'fromString,range'
+ ).split(','), j$1 = 0, key$1; keys$3.length > j$1; j$1++) {
+ if (has$1(NativeNumber, key$1 = keys$3[j$1]) && !has$1(NumberWrapper, key$1)) {
+ defineProperty$8(NumberWrapper, key$1, getOwnPropertyDescriptor$1(NativeNumber, key$1));
+ }
+ }
+ NumberWrapper.prototype = NumberPrototype;
+ NumberPrototype.constructor = NumberWrapper;
+ redefine(global_1, NUMBER, NumberWrapper);
+ }
+
+ var MATCH$2 = wellKnownSymbol('match');
+
+ // `IsRegExp` abstract operation
+ // https://tc39.es/ecma262/#sec-isregexp
+ var isRegexp = function (it) {
+ var isRegExp;
+ return isObject$1(it) && ((isRegExp = it[MATCH$2]) !== undefined ? !!isRegExp : classofRaw(it) == 'RegExp');
+ };
+
+ var SPECIES$3 = wellKnownSymbol('species');
+
+ var setSpecies = function (CONSTRUCTOR_NAME) {
+ var Constructor = getBuiltIn(CONSTRUCTOR_NAME);
+ var defineProperty = objectDefineProperty.f;
+
+ if (descriptors && Constructor && !Constructor[SPECIES$3]) {
+ defineProperty(Constructor, SPECIES$3, {
+ configurable: true,
+ get: function () { return this; }
+ });
+ }
+ };
+
+ var defineProperty$7 = objectDefineProperty.f;
+ var getOwnPropertyNames$2 = objectGetOwnPropertyNames.f;
+
+
+
+
+
+
+
+ var enforceInternalState = internalState.enforce;
+
+
+
+
+
+ var MATCH$1 = wellKnownSymbol('match');
+ var NativeRegExp = global_1.RegExp;
+ var RegExpPrototype = NativeRegExp.prototype;
+ // TODO: Use only propper RegExpIdentifierName
+ var IS_NCG = /^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/;
+ var re1 = /a/g;
+ var re2 = /a/g;
+
+ // "new" should create a new object, old webkit bug
+ var CORRECT_NEW = new NativeRegExp(re1) !== re1;
+
+ var UNSUPPORTED_Y$1 = regexpStickyHelpers.UNSUPPORTED_Y;
+
+ var BASE_FORCED = descriptors &&
+ (!CORRECT_NEW || UNSUPPORTED_Y$1 || regexpUnsupportedDotAll || regexpUnsupportedNcg || fails(function () {
+ re2[MATCH$1] = false;
+ // RegExp constructor can alter flags and IsRegExp works correct with @@match
+ return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';
+ }));
+
+ var handleDotAll = function (string) {
+ var length = string.length;
+ var index = 0;
+ var result = '';
+ var brackets = false;
+ var chr;
+ for (; index <= length; index++) {
+ chr = string.charAt(index);
+ if (chr === '\\') {
+ result += chr + string.charAt(++index);
+ continue;
+ }
+ if (!brackets && chr === '.') {
+ result += '[\\s\\S]';
+ } else {
+ if (chr === '[') {
+ brackets = true;
+ } else if (chr === ']') {
+ brackets = false;
+ } result += chr;
+ }
+ } return result;
+ };
+
+ var handleNCG = function (string) {
+ var length = string.length;
+ var index = 0;
+ var result = '';
+ var named = [];
+ var names = {};
+ var brackets = false;
+ var ncg = false;
+ var groupid = 0;
+ var groupname = '';
+ var chr;
+ for (; index <= length; index++) {
+ chr = string.charAt(index);
+ if (chr === '\\') {
+ chr = chr + string.charAt(++index);
+ } else if (chr === ']') {
+ brackets = false;
+ } else if (!brackets) switch (true) {
+ case chr === '[':
+ brackets = true;
+ break;
+ case chr === '(':
+ if (IS_NCG.test(string.slice(index + 1))) {
+ index += 2;
+ ncg = true;
+ }
+ result += chr;
+ groupid++;
+ continue;
+ case chr === '>' && ncg:
+ if (groupname === '' || has$1(names, groupname)) {
+ throw new SyntaxError('Invalid capture group name');
+ }
+ names[groupname] = true;
+ named.push([groupname, groupid]);
+ ncg = false;
+ groupname = '';
+ continue;
+ }
+ if (ncg) groupname += chr;
+ else result += chr;
+ } return [result, named];
+ };
+
+ // `RegExp` constructor
+ // https://tc39.es/ecma262/#sec-regexp-constructor
+ if (isForced_1('RegExp', BASE_FORCED)) {
+ var RegExpWrapper = function RegExp(pattern, flags) {
+ var thisIsRegExp = this instanceof RegExpWrapper;
+ var patternIsRegExp = isRegexp(pattern);
+ var flagsAreUndefined = flags === undefined;
+ var groups = [];
+ var rawPattern = pattern;
+ var rawFlags, dotAll, sticky, handled, result, state;
+
+ if (!thisIsRegExp && patternIsRegExp && flagsAreUndefined && pattern.constructor === RegExpWrapper) {
+ return pattern;
+ }
+
+ if (patternIsRegExp || pattern instanceof RegExpWrapper) {
+ pattern = pattern.source;
+ if (flagsAreUndefined) flags = 'flags' in rawPattern ? rawPattern.flags : regexpFlags.call(rawPattern);
+ }
+
+ pattern = pattern === undefined ? '' : toString_1(pattern);
+ flags = flags === undefined ? '' : toString_1(flags);
+ rawPattern = pattern;
+
+ if (regexpUnsupportedDotAll && 'dotAll' in re1) {
+ dotAll = !!flags && flags.indexOf('s') > -1;
+ if (dotAll) flags = flags.replace(/s/g, '');
+ }
+
+ rawFlags = flags;
+
+ if (UNSUPPORTED_Y$1 && 'sticky' in re1) {
+ sticky = !!flags && flags.indexOf('y') > -1;
+ if (sticky) flags = flags.replace(/y/g, '');
+ }
+
+ if (regexpUnsupportedNcg) {
+ handled = handleNCG(pattern);
+ pattern = handled[0];
+ groups = handled[1];
+ }
+
+ result = inheritIfRequired(NativeRegExp(pattern, flags), thisIsRegExp ? this : RegExpPrototype, RegExpWrapper);
+
+ if (dotAll || sticky || groups.length) {
+ state = enforceInternalState(result);
+ if (dotAll) {
+ state.dotAll = true;
+ state.raw = RegExpWrapper(handleDotAll(pattern), rawFlags);
+ }
+ if (sticky) state.sticky = true;
+ if (groups.length) state.groups = groups;
+ }
+
+ if (pattern !== rawPattern) try {
+ // fails in old engines, but we have no alternatives for unsupported regex syntax
+ createNonEnumerableProperty(result, 'source', rawPattern === '' ? '(?:)' : rawPattern);
+ } catch (error) { /* empty */ }
+
+ return result;
+ };
+
+ var proxy = function (key) {
+ key in RegExpWrapper || defineProperty$7(RegExpWrapper, key, {
+ configurable: true,
+ get: function () { return NativeRegExp[key]; },
+ set: function (it) { NativeRegExp[key] = it; }
+ });
+ };
+
+ for (var keys$2 = getOwnPropertyNames$2(NativeRegExp), index = 0; keys$2.length > index;) {
+ proxy(keys$2[index++]);
+ }
+
+ RegExpPrototype.constructor = RegExpWrapper;
+ RegExpWrapper.prototype = RegExpPrototype;
+ redefine(global_1, 'RegExp', RegExpWrapper);
+ }
+
+ // https://tc39.es/ecma262/#sec-get-regexp-@@species
+ setSpecies('RegExp');
+
+ /* eslint-disable es/no-object-getownpropertynames -- safe */
+
+ var $getOwnPropertyNames$1 = objectGetOwnPropertyNames.f;
+
+ var toString$3 = {}.toString;
+
+ var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
+ ? Object.getOwnPropertyNames(window) : [];
+
+ var getWindowNames = function (it) {
+ try {
+ return $getOwnPropertyNames$1(it);
+ } catch (error) {
+ return windowNames.slice();
+ }
+ };
+
+ // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
+ var f$2 = function getOwnPropertyNames(it) {
+ return windowNames && toString$3.call(it) == '[object Window]'
+ ? getWindowNames(it)
+ : $getOwnPropertyNames$1(toIndexedObject(it));
+ };
+
+ var objectGetOwnPropertyNamesExternal = {
+ f: f$2
+ };
+
+ var getOwnPropertyNames$1 = objectGetOwnPropertyNamesExternal.f;
+
+ // eslint-disable-next-line es/no-object-getownpropertynames -- required for testing
+ var FAILS_ON_PRIMITIVES$2 = fails(function () { return !Object.getOwnPropertyNames(1); });
+
+ // `Object.getOwnPropertyNames` method
+ // https://tc39.es/ecma262/#sec-object.getownpropertynames
+ _export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES$2 }, {
+ getOwnPropertyNames: getOwnPropertyNames$1
+ });
+
+ var $map$1 = arrayIteration.map;
+
+
+ var HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport('map');
+
+ // `Array.prototype.map` method
+ // https://tc39.es/ecma262/#sec-array.prototype.map
+ // with adding support of @@species
+ _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$1 }, {
+ map: function map(callbackfn /* , thisArg */) {
+ return $map$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ }
+ });
+
+ // @@match logic
+ fixRegexpWellKnownSymbolLogic('match', function (MATCH, nativeMatch, maybeCallNative) {
+ return [
+ // `String.prototype.match` method
+ // https://tc39.es/ecma262/#sec-string.prototype.match
+ function match(regexp) {
+ var O = requireObjectCoercible(this);
+ var matcher = regexp == undefined ? undefined : getMethod(regexp, MATCH);
+ return matcher ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](toString_1(O));
+ },
+ // `RegExp.prototype[@@match]` method
+ // https://tc39.es/ecma262/#sec-regexp.prototype-@@match
+ function (string) {
+ var rx = anObject(this);
+ var S = toString_1(string);
+ var res = maybeCallNative(nativeMatch, rx, S);
+
+ if (res.done) return res.value;
+
+ if (!rx.global) return regexpExecAbstract(rx, S);
+
+ var fullUnicode = rx.unicode;
+ rx.lastIndex = 0;
+ var A = [];
+ var n = 0;
+ var result;
+ while ((result = regexpExecAbstract(rx, S)) !== null) {
+ var matchStr = toString_1(result[0]);
+ A[n] = matchStr;
+ if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);
+ n++;
+ }
+ return n === 0 ? null : A;
+ }
+ ];
+ });
+
+ var nativeGetOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;
+
+
+ var FAILS_ON_PRIMITIVES$1 = fails(function () { nativeGetOwnPropertyDescriptor$1(1); });
+ var FORCED$7 = !descriptors || FAILS_ON_PRIMITIVES$1;
+
+ // `Object.getOwnPropertyDescriptor` method
+ // https://tc39.es/ecma262/#sec-object.getownpropertydescriptor
+ _export({ target: 'Object', stat: true, forced: FORCED$7, sham: !descriptors }, {
+ getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {
+ return nativeGetOwnPropertyDescriptor$1(toIndexedObject(it), key);
+ }
+ });
+
+ // `Assert: IsConstructor(argument) is true`
+ var aConstructor = function (argument) {
+ if (isConstructor(argument)) return argument;
+ throw TypeError(tryToString(argument) + ' is not a constructor');
+ };
+
+ var SPECIES$2 = wellKnownSymbol('species');
+
+ // `SpeciesConstructor` abstract operation
+ // https://tc39.es/ecma262/#sec-speciesconstructor
+ var speciesConstructor = function (O, defaultConstructor) {
+ var C = anObject(O).constructor;
+ var S;
+ return C === undefined || (S = anObject(C)[SPECIES$2]) == undefined ? defaultConstructor : aConstructor(S);
+ };
+
+ var UNSUPPORTED_Y = regexpStickyHelpers.UNSUPPORTED_Y;
+ var arrayPush = [].push;
+ var min$3 = Math.min;
+ var MAX_UINT32 = 0xFFFFFFFF;
+
+ // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec
+ // Weex JS has frozen built-in prototypes, so use try / catch wrapper
+ var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {
+ // eslint-disable-next-line regexp/no-empty-group -- required for testing
+ var re = /(?:)/;
+ var originalExec = re.exec;
+ re.exec = function () { return originalExec.apply(this, arguments); };
+ var result = 'ab'.split(re);
+ return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';
+ });
+
+ // @@split logic
+ fixRegexpWellKnownSymbolLogic('split', function (SPLIT, nativeSplit, maybeCallNative) {
+ var internalSplit;
+ if (
+ 'abbc'.split(/(b)*/)[1] == 'c' ||
+ // eslint-disable-next-line regexp/no-empty-group -- required for testing
+ 'test'.split(/(?:)/, -1).length != 4 ||
+ 'ab'.split(/(?:ab)*/).length != 2 ||
+ '.'.split(/(.?)(.?)/).length != 4 ||
+ // eslint-disable-next-line regexp/no-empty-capturing-group, regexp/no-empty-group -- required for testing
+ '.'.split(/()()/).length > 1 ||
+ ''.split(/.?/).length
+ ) {
+ // based on es5-shim implementation, need to rework it
+ internalSplit = function (separator, limit) {
+ var string = toString_1(requireObjectCoercible(this));
+ var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;
+ if (lim === 0) return [];
+ if (separator === undefined) return [string];
+ // If `separator` is not a regex, use native split
+ if (!isRegexp(separator)) {
+ return nativeSplit.call(string, separator, lim);
+ }
+ var output = [];
+ var flags = (separator.ignoreCase ? 'i' : '') +
+ (separator.multiline ? 'm' : '') +
+ (separator.unicode ? 'u' : '') +
+ (separator.sticky ? 'y' : '');
+ var lastLastIndex = 0;
+ // Make `global` and avoid `lastIndex` issues by working with a copy
+ var separatorCopy = new RegExp(separator.source, flags + 'g');
+ var match, lastIndex, lastLength;
+ while (match = regexpExec.call(separatorCopy, string)) {
+ lastIndex = separatorCopy.lastIndex;
+ if (lastIndex > lastLastIndex) {
+ output.push(string.slice(lastLastIndex, match.index));
+ if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));
+ lastLength = match[0].length;
+ lastLastIndex = lastIndex;
+ if (output.length >= lim) break;
+ }
+ if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop
+ }
+ if (lastLastIndex === string.length) {
+ if (lastLength || !separatorCopy.test('')) output.push('');
+ } else output.push(string.slice(lastLastIndex));
+ return output.length > lim ? output.slice(0, lim) : output;
+ };
+ // Chakra, V8
+ } else if ('0'.split(undefined, 0).length) {
+ internalSplit = function (separator, limit) {
+ return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);
+ };
+ } else internalSplit = nativeSplit;
+
+ return [
+ // `String.prototype.split` method
+ // https://tc39.es/ecma262/#sec-string.prototype.split
+ function split(separator, limit) {
+ var O = requireObjectCoercible(this);
+ var splitter = separator == undefined ? undefined : getMethod(separator, SPLIT);
+ return splitter
+ ? splitter.call(separator, O, limit)
+ : internalSplit.call(toString_1(O), separator, limit);
+ },
+ // `RegExp.prototype[@@split]` method
+ // https://tc39.es/ecma262/#sec-regexp.prototype-@@split
+ //
+ // NOTE: This cannot be properly polyfilled in engines that don't support
+ // the 'y' flag.
+ function (string, limit) {
+ var rx = anObject(this);
+ var S = toString_1(string);
+ var res = maybeCallNative(internalSplit, rx, S, limit, internalSplit !== nativeSplit);
+
+ if (res.done) return res.value;
+
+ var C = speciesConstructor(rx, RegExp);
+
+ var unicodeMatching = rx.unicode;
+ var flags = (rx.ignoreCase ? 'i' : '') +
+ (rx.multiline ? 'm' : '') +
+ (rx.unicode ? 'u' : '') +
+ (UNSUPPORTED_Y ? 'g' : 'y');
+
+ // ^(? + rx + ) is needed, in combination with some S slicing, to
+ // simulate the 'y' flag.
+ var splitter = new C(UNSUPPORTED_Y ? '^(?:' + rx.source + ')' : rx, flags);
+ var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;
+ if (lim === 0) return [];
+ if (S.length === 0) return regexpExecAbstract(splitter, S) === null ? [S] : [];
+ var p = 0;
+ var q = 0;
+ var A = [];
+ while (q < S.length) {
+ splitter.lastIndex = UNSUPPORTED_Y ? 0 : q;
+ var z = regexpExecAbstract(splitter, UNSUPPORTED_Y ? S.slice(q) : S);
+ var e;
+ if (
+ z === null ||
+ (e = min$3(toLength(splitter.lastIndex + (UNSUPPORTED_Y ? q : 0)), S.length)) === p
+ ) {
+ q = advanceStringIndex(S, q, unicodeMatching);
+ } else {
+ A.push(S.slice(p, q));
+ if (A.length === lim) return A;
+ for (var i = 1; i <= z.length - 1; i++) {
+ A.push(z[i]);
+ if (A.length === lim) return A;
+ }
+ q = p = e;
+ }
+ }
+ A.push(S.slice(p));
+ return A;
+ }
+ ];
+ }, !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC, UNSUPPORTED_Y);
+
+ var UNSCOPABLES = wellKnownSymbol('unscopables');
+ var ArrayPrototype$1 = Array.prototype;
+
+ // Array.prototype[@@unscopables]
+ // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+ if (ArrayPrototype$1[UNSCOPABLES] == undefined) {
+ objectDefineProperty.f(ArrayPrototype$1, UNSCOPABLES, {
+ configurable: true,
+ value: objectCreate(null)
+ });
+ }
+
+ // add a key to Array.prototype[@@unscopables]
+ var addToUnscopables = function (key) {
+ ArrayPrototype$1[UNSCOPABLES][key] = true;
+ };
+
+ var iterators = {};
+
+ var ITERATOR$6 = wellKnownSymbol('iterator');
+ var BUGGY_SAFARI_ITERATORS$1 = false;
+
+ // `%IteratorPrototype%` object
+ // https://tc39.es/ecma262/#sec-%iteratorprototype%-object
+ var IteratorPrototype$2, PrototypeOfArrayIteratorPrototype, arrayIterator;
+
+ /* eslint-disable es/no-array-prototype-keys -- safe */
+ if ([].keys) {
+ arrayIterator = [].keys();
+ // Safari 8 has buggy iterators w/o `next`
+ if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS$1 = true;
+ else {
+ PrototypeOfArrayIteratorPrototype = objectGetPrototypeOf(objectGetPrototypeOf(arrayIterator));
+ if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype$2 = PrototypeOfArrayIteratorPrototype;
+ }
+ }
+
+ var NEW_ITERATOR_PROTOTYPE = IteratorPrototype$2 == undefined || fails(function () {
+ var test = {};
+ // FF44- legacy iterators case
+ return IteratorPrototype$2[ITERATOR$6].call(test) !== test;
+ });
+
+ if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype$2 = {};
+
+ // `%IteratorPrototype%[@@iterator]()` method
+ // https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator
+ if (!isCallable(IteratorPrototype$2[ITERATOR$6])) {
+ redefine(IteratorPrototype$2, ITERATOR$6, function () {
+ return this;
+ });
+ }
+
+ var iteratorsCore = {
+ IteratorPrototype: IteratorPrototype$2,
+ BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS$1
+ };
+
+ var defineProperty$6 = objectDefineProperty.f;
+
+
+
+ var TO_STRING_TAG$2 = wellKnownSymbol('toStringTag');
+
+ var setToStringTag = function (it, TAG, STATIC) {
+ if (it && !has$1(it = STATIC ? it : it.prototype, TO_STRING_TAG$2)) {
+ defineProperty$6(it, TO_STRING_TAG$2, { configurable: true, value: TAG });
+ }
+ };
+
+ var IteratorPrototype$1 = iteratorsCore.IteratorPrototype;
+
+
+
+
+
+ var returnThis$1 = function () { return this; };
+
+ var createIteratorConstructor = function (IteratorConstructor, NAME, next) {
+ var TO_STRING_TAG = NAME + ' Iterator';
+ IteratorConstructor.prototype = objectCreate(IteratorPrototype$1, { next: createPropertyDescriptor(1, next) });
+ setToStringTag(IteratorConstructor, TO_STRING_TAG, false);
+ iterators[TO_STRING_TAG] = returnThis$1;
+ return IteratorConstructor;
+ };
+
+ var PROPER_FUNCTION_NAME$3 = functionName.PROPER;
+ var CONFIGURABLE_FUNCTION_NAME$1 = functionName.CONFIGURABLE;
+ var IteratorPrototype = iteratorsCore.IteratorPrototype;
+ var BUGGY_SAFARI_ITERATORS = iteratorsCore.BUGGY_SAFARI_ITERATORS;
+ var ITERATOR$5 = wellKnownSymbol('iterator');
+ var KEYS = 'keys';
+ var VALUES = 'values';
+ var ENTRIES = 'entries';
+
+ var returnThis = function () { return this; };
+
+ var defineIterator = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {
+ createIteratorConstructor(IteratorConstructor, NAME, next);
+
+ var getIterationMethod = function (KIND) {
+ if (KIND === DEFAULT && defaultIterator) return defaultIterator;
+ if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];
+ switch (KIND) {
+ case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };
+ case VALUES: return function values() { return new IteratorConstructor(this, KIND); };
+ case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };
+ } return function () { return new IteratorConstructor(this); };
+ };
+
+ var TO_STRING_TAG = NAME + ' Iterator';
+ var INCORRECT_VALUES_NAME = false;
+ var IterablePrototype = Iterable.prototype;
+ var nativeIterator = IterablePrototype[ITERATOR$5]
+ || IterablePrototype['@@iterator']
+ || DEFAULT && IterablePrototype[DEFAULT];
+ var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);
+ var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;
+ var CurrentIteratorPrototype, methods, KEY;
+
+ // fix native
+ if (anyNativeIterator) {
+ CurrentIteratorPrototype = objectGetPrototypeOf(anyNativeIterator.call(new Iterable()));
+ if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {
+ if (objectGetPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {
+ if (objectSetPrototypeOf) {
+ objectSetPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);
+ } else if (!isCallable(CurrentIteratorPrototype[ITERATOR$5])) {
+ redefine(CurrentIteratorPrototype, ITERATOR$5, returnThis);
+ }
+ }
+ // Set @@toStringTag to native iterators
+ setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true);
+ }
+ }
+
+ // fix Array.prototype.{ values, @@iterator }.name in V8 / FF
+ if (PROPER_FUNCTION_NAME$3 && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {
+ if (CONFIGURABLE_FUNCTION_NAME$1) {
+ createNonEnumerableProperty(IterablePrototype, 'name', VALUES);
+ } else {
+ INCORRECT_VALUES_NAME = true;
+ defaultIterator = function values() { return nativeIterator.call(this); };
+ }
+ }
+
+ // export additional methods
+ if (DEFAULT) {
+ methods = {
+ values: getIterationMethod(VALUES),
+ keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),
+ entries: getIterationMethod(ENTRIES)
+ };
+ if (FORCED) for (KEY in methods) {
+ if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {
+ redefine(IterablePrototype, KEY, methods[KEY]);
+ }
+ } else _export({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);
+ }
+
+ // define iterator
+ if (IterablePrototype[ITERATOR$5] !== defaultIterator) {
+ redefine(IterablePrototype, ITERATOR$5, defaultIterator, { name: DEFAULT });
+ }
+ iterators[NAME] = defaultIterator;
+
+ return methods;
+ };
+
+ var ARRAY_ITERATOR = 'Array Iterator';
+ var setInternalState$5 = internalState.set;
+ var getInternalState$4 = internalState.getterFor(ARRAY_ITERATOR);
+
+ // `Array.prototype.entries` method
+ // https://tc39.es/ecma262/#sec-array.prototype.entries
+ // `Array.prototype.keys` method
+ // https://tc39.es/ecma262/#sec-array.prototype.keys
+ // `Array.prototype.values` method
+ // https://tc39.es/ecma262/#sec-array.prototype.values
+ // `Array.prototype[@@iterator]` method
+ // https://tc39.es/ecma262/#sec-array.prototype-@@iterator
+ // `CreateArrayIterator` internal method
+ // https://tc39.es/ecma262/#sec-createarrayiterator
+ var es_array_iterator = defineIterator(Array, 'Array', function (iterated, kind) {
+ setInternalState$5(this, {
+ type: ARRAY_ITERATOR,
+ target: toIndexedObject(iterated), // target
+ index: 0, // next index
+ kind: kind // kind
+ });
+ // `%ArrayIteratorPrototype%.next` method
+ // https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next
+ }, function () {
+ var state = getInternalState$4(this);
+ var target = state.target;
+ var kind = state.kind;
+ var index = state.index++;
+ if (!target || index >= target.length) {
+ state.target = undefined;
+ return { value: undefined, done: true };
+ }
+ if (kind == 'keys') return { value: index, done: false };
+ if (kind == 'values') return { value: target[index], done: false };
+ return { value: [index, target[index]], done: false };
+ }, 'values');
+
+ // argumentsList[@@iterator] is %ArrayProto_values%
+ // https://tc39.es/ecma262/#sec-createunmappedargumentsobject
+ // https://tc39.es/ecma262/#sec-createmappedargumentsobject
+ iterators.Arguments = iterators.Array;
+
+ // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+ addToUnscopables('keys');
+ addToUnscopables('values');
+ addToUnscopables('entries');
+
+ var ITERATOR$4 = wellKnownSymbol('iterator');
+ var SAFE_CLOSING = false;
+
+ try {
+ var called = 0;
+ var iteratorWithReturn = {
+ next: function () {
+ return { done: !!called++ };
+ },
+ 'return': function () {
+ SAFE_CLOSING = true;
+ }
+ };
+ iteratorWithReturn[ITERATOR$4] = function () {
+ return this;
+ };
+ // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing
+ Array.from(iteratorWithReturn, function () { throw 2; });
+ } catch (error) { /* empty */ }
+
+ var checkCorrectnessOfIteration = function (exec, SKIP_CLOSING) {
+ if (!SKIP_CLOSING && !SAFE_CLOSING) return false;
+ var ITERATION_SUPPORT = false;
+ try {
+ var object = {};
+ object[ITERATOR$4] = function () {
+ return {
+ next: function () {
+ return { done: ITERATION_SUPPORT = true };
+ }
+ };
+ };
+ exec(object);
+ } catch (error) { /* empty */ }
+ return ITERATION_SUPPORT;
+ };
+
+ // eslint-disable-next-line es/no-typed-arrays -- safe
+ var arrayBufferNative = typeof ArrayBuffer !== 'undefined' && typeof DataView !== 'undefined';
+
+ var defineProperty$5 = objectDefineProperty.f;
+
+
+
+
+
+ var Int8Array$3 = global_1.Int8Array;
+ var Int8ArrayPrototype = Int8Array$3 && Int8Array$3.prototype;
+ var Uint8ClampedArray = global_1.Uint8ClampedArray;
+ var Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;
+ var TypedArray = Int8Array$3 && objectGetPrototypeOf(Int8Array$3);
+ var TypedArrayPrototype = Int8ArrayPrototype && objectGetPrototypeOf(Int8ArrayPrototype);
+ var ObjectPrototype$2 = Object.prototype;
+ var isPrototypeOf = ObjectPrototype$2.isPrototypeOf;
+
+ var TO_STRING_TAG$1 = wellKnownSymbol('toStringTag');
+ var TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');
+ var TYPED_ARRAY_CONSTRUCTOR$1 = uid('TYPED_ARRAY_CONSTRUCTOR');
+ // Fixing native typed arrays in Opera Presto crashes the browser, see #595
+ var NATIVE_ARRAY_BUFFER_VIEWS$1 = arrayBufferNative && !!objectSetPrototypeOf && classof(global_1.opera) !== 'Opera';
+ var TYPED_ARRAY_TAG_REQIRED = false;
+ var NAME, Constructor, Prototype;
+
+ var TypedArrayConstructorsList = {
+ Int8Array: 1,
+ Uint8Array: 1,
+ Uint8ClampedArray: 1,
+ Int16Array: 2,
+ Uint16Array: 2,
+ Int32Array: 4,
+ Uint32Array: 4,
+ Float32Array: 4,
+ Float64Array: 8
+ };
+
+ var BigIntArrayConstructorsList = {
+ BigInt64Array: 8,
+ BigUint64Array: 8
+ };
+
+ var isView = function isView(it) {
+ if (!isObject$1(it)) return false;
+ var klass = classof(it);
+ return klass === 'DataView'
+ || has$1(TypedArrayConstructorsList, klass)
+ || has$1(BigIntArrayConstructorsList, klass);
+ };
+
+ var isTypedArray = function (it) {
+ if (!isObject$1(it)) return false;
+ var klass = classof(it);
+ return has$1(TypedArrayConstructorsList, klass)
+ || has$1(BigIntArrayConstructorsList, klass);
+ };
+
+ var aTypedArray$m = function (it) {
+ if (isTypedArray(it)) return it;
+ throw TypeError('Target is not a typed array');
+ };
+
+ var aTypedArrayConstructor$2 = function (C) {
+ if (isCallable(C) && (!objectSetPrototypeOf || isPrototypeOf.call(TypedArray, C))) return C;
+ throw TypeError(tryToString(C) + ' is not a typed array constructor');
+ };
+
+ var exportTypedArrayMethod$n = function (KEY, property, forced) {
+ if (!descriptors) return;
+ if (forced) for (var ARRAY in TypedArrayConstructorsList) {
+ var TypedArrayConstructor = global_1[ARRAY];
+ if (TypedArrayConstructor && has$1(TypedArrayConstructor.prototype, KEY)) try {
+ delete TypedArrayConstructor.prototype[KEY];
+ } catch (error) { /* empty */ }
+ }
+ if (!TypedArrayPrototype[KEY] || forced) {
+ redefine(TypedArrayPrototype, KEY, forced ? property
+ : NATIVE_ARRAY_BUFFER_VIEWS$1 && Int8ArrayPrototype[KEY] || property);
+ }
+ };
+
+ var exportTypedArrayStaticMethod = function (KEY, property, forced) {
+ var ARRAY, TypedArrayConstructor;
+ if (!descriptors) return;
+ if (objectSetPrototypeOf) {
+ if (forced) for (ARRAY in TypedArrayConstructorsList) {
+ TypedArrayConstructor = global_1[ARRAY];
+ if (TypedArrayConstructor && has$1(TypedArrayConstructor, KEY)) try {
+ delete TypedArrayConstructor[KEY];
+ } catch (error) { /* empty */ }
+ }
+ if (!TypedArray[KEY] || forced) {
+ // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable
+ try {
+ return redefine(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS$1 && TypedArray[KEY] || property);
+ } catch (error) { /* empty */ }
+ } else return;
+ }
+ for (ARRAY in TypedArrayConstructorsList) {
+ TypedArrayConstructor = global_1[ARRAY];
+ if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {
+ redefine(TypedArrayConstructor, KEY, property);
+ }
+ }
+ };
+
+ for (NAME in TypedArrayConstructorsList) {
+ Constructor = global_1[NAME];
+ Prototype = Constructor && Constructor.prototype;
+ if (Prototype) createNonEnumerableProperty(Prototype, TYPED_ARRAY_CONSTRUCTOR$1, Constructor);
+ else NATIVE_ARRAY_BUFFER_VIEWS$1 = false;
+ }
+
+ for (NAME in BigIntArrayConstructorsList) {
+ Constructor = global_1[NAME];
+ Prototype = Constructor && Constructor.prototype;
+ if (Prototype) createNonEnumerableProperty(Prototype, TYPED_ARRAY_CONSTRUCTOR$1, Constructor);
+ }
+
+ // WebKit bug - typed arrays constructors prototype is Object.prototype
+ if (!NATIVE_ARRAY_BUFFER_VIEWS$1 || !isCallable(TypedArray) || TypedArray === Function.prototype) {
+ // eslint-disable-next-line no-shadow -- safe
+ TypedArray = function TypedArray() {
+ throw TypeError('Incorrect invocation');
+ };
+ if (NATIVE_ARRAY_BUFFER_VIEWS$1) for (NAME in TypedArrayConstructorsList) {
+ if (global_1[NAME]) objectSetPrototypeOf(global_1[NAME], TypedArray);
+ }
+ }
+
+ if (!NATIVE_ARRAY_BUFFER_VIEWS$1 || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype$2) {
+ TypedArrayPrototype = TypedArray.prototype;
+ if (NATIVE_ARRAY_BUFFER_VIEWS$1) for (NAME in TypedArrayConstructorsList) {
+ if (global_1[NAME]) objectSetPrototypeOf(global_1[NAME].prototype, TypedArrayPrototype);
+ }
+ }
+
+ // WebKit bug - one more object in Uint8ClampedArray prototype chain
+ if (NATIVE_ARRAY_BUFFER_VIEWS$1 && objectGetPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {
+ objectSetPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);
+ }
+
+ if (descriptors && !has$1(TypedArrayPrototype, TO_STRING_TAG$1)) {
+ TYPED_ARRAY_TAG_REQIRED = true;
+ defineProperty$5(TypedArrayPrototype, TO_STRING_TAG$1, { get: function () {
+ return isObject$1(this) ? this[TYPED_ARRAY_TAG] : undefined;
+ } });
+ for (NAME in TypedArrayConstructorsList) if (global_1[NAME]) {
+ createNonEnumerableProperty(global_1[NAME], TYPED_ARRAY_TAG, NAME);
+ }
+ }
+
+ var arrayBufferViewCore = {
+ NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS$1,
+ TYPED_ARRAY_CONSTRUCTOR: TYPED_ARRAY_CONSTRUCTOR$1,
+ TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQIRED && TYPED_ARRAY_TAG,
+ aTypedArray: aTypedArray$m,
+ aTypedArrayConstructor: aTypedArrayConstructor$2,
+ exportTypedArrayMethod: exportTypedArrayMethod$n,
+ exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,
+ isView: isView,
+ isTypedArray: isTypedArray,
+ TypedArray: TypedArray,
+ TypedArrayPrototype: TypedArrayPrototype
+ };
+
+ /* eslint-disable no-new -- required for testing */
+
+
+
+ var NATIVE_ARRAY_BUFFER_VIEWS = arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;
+
+ var ArrayBuffer$2 = global_1.ArrayBuffer;
+ var Int8Array$2 = global_1.Int8Array;
+
+ var typedArrayConstructorsRequireWrappers = !NATIVE_ARRAY_BUFFER_VIEWS || !fails(function () {
+ Int8Array$2(1);
+ }) || !fails(function () {
+ new Int8Array$2(-1);
+ }) || !checkCorrectnessOfIteration(function (iterable) {
+ new Int8Array$2();
+ new Int8Array$2(null);
+ new Int8Array$2(1.5);
+ new Int8Array$2(iterable);
+ }, true) || fails(function () {
+ // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill
+ return new Int8Array$2(new ArrayBuffer$2(2), 1, undefined).length !== 1;
+ });
+
+ var redefineAll = function (target, src, options) {
+ for (var key in src) redefine(target, key, src[key], options);
+ return target;
+ };
+
+ var anInstance = function (it, Constructor, name) {
+ if (it instanceof Constructor) return it;
+ throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');
+ };
+
+ // `ToIndex` abstract operation
+ // https://tc39.es/ecma262/#sec-toindex
+ var toIndex = function (it) {
+ if (it === undefined) return 0;
+ var number = toInteger(it);
+ var length = toLength(number);
+ if (number !== length) throw RangeError('Wrong length or index');
+ return length;
+ };
+
+ // IEEE754 conversions based on https://github.com/feross/ieee754
+ var abs = Math.abs;
+ var pow$1 = Math.pow;
+ var floor$4 = Math.floor;
+ var log$2 = Math.log;
+ var LN2 = Math.LN2;
+
+ var pack = function (number, mantissaLength, bytes) {
+ var buffer = new Array(bytes);
+ var exponentLength = bytes * 8 - mantissaLength - 1;
+ var eMax = (1 << exponentLength) - 1;
+ var eBias = eMax >> 1;
+ var rt = mantissaLength === 23 ? pow$1(2, -24) - pow$1(2, -77) : 0;
+ var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0;
+ var index = 0;
+ var exponent, mantissa, c;
+ number = abs(number);
+ // eslint-disable-next-line no-self-compare -- NaN check
+ if (number != number || number === Infinity) {
+ // eslint-disable-next-line no-self-compare -- NaN check
+ mantissa = number != number ? 1 : 0;
+ exponent = eMax;
+ } else {
+ exponent = floor$4(log$2(number) / LN2);
+ if (number * (c = pow$1(2, -exponent)) < 1) {
+ exponent--;
+ c *= 2;
+ }
+ if (exponent + eBias >= 1) {
+ number += rt / c;
+ } else {
+ number += rt * pow$1(2, 1 - eBias);
+ }
+ if (number * c >= 2) {
+ exponent++;
+ c /= 2;
+ }
+ if (exponent + eBias >= eMax) {
+ mantissa = 0;
+ exponent = eMax;
+ } else if (exponent + eBias >= 1) {
+ mantissa = (number * c - 1) * pow$1(2, mantissaLength);
+ exponent = exponent + eBias;
+ } else {
+ mantissa = number * pow$1(2, eBias - 1) * pow$1(2, mantissaLength);
+ exponent = 0;
+ }
+ }
+ for (; mantissaLength >= 8; buffer[index++] = mantissa & 255, mantissa /= 256, mantissaLength -= 8);
+ exponent = exponent << mantissaLength | mantissa;
+ exponentLength += mantissaLength;
+ for (; exponentLength > 0; buffer[index++] = exponent & 255, exponent /= 256, exponentLength -= 8);
+ buffer[--index] |= sign * 128;
+ return buffer;
+ };
+
+ var unpack = function (buffer, mantissaLength) {
+ var bytes = buffer.length;
+ var exponentLength = bytes * 8 - mantissaLength - 1;
+ var eMax = (1 << exponentLength) - 1;
+ var eBias = eMax >> 1;
+ var nBits = exponentLength - 7;
+ var index = bytes - 1;
+ var sign = buffer[index--];
+ var exponent = sign & 127;
+ var mantissa;
+ sign >>= 7;
+ for (; nBits > 0; exponent = exponent * 256 + buffer[index], index--, nBits -= 8);
+ mantissa = exponent & (1 << -nBits) - 1;
+ exponent >>= -nBits;
+ nBits += mantissaLength;
+ for (; nBits > 0; mantissa = mantissa * 256 + buffer[index], index--, nBits -= 8);
+ if (exponent === 0) {
+ exponent = 1 - eBias;
+ } else if (exponent === eMax) {
+ return mantissa ? NaN : sign ? -Infinity : Infinity;
+ } else {
+ mantissa = mantissa + pow$1(2, mantissaLength);
+ exponent = exponent - eBias;
+ } return (sign ? -1 : 1) * mantissa * pow$1(2, exponent - mantissaLength);
+ };
+
+ var ieee754 = {
+ pack: pack,
+ unpack: unpack
+ };
+
+ // `Array.prototype.fill` method implementation
+ // https://tc39.es/ecma262/#sec-array.prototype.fill
+ var arrayFill = function fill(value /* , start = 0, end = @length */) {
+ var O = toObject(this);
+ var length = toLength(O.length);
+ var argumentsLength = arguments.length;
+ var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length);
+ var end = argumentsLength > 2 ? arguments[2] : undefined;
+ var endPos = end === undefined ? length : toAbsoluteIndex(end, length);
+ while (endPos > index) O[index++] = value;
+ return O;
+ };
+
+ var getOwnPropertyNames = objectGetOwnPropertyNames.f;
+ var defineProperty$4 = objectDefineProperty.f;
+
+
+
+
+ var PROPER_FUNCTION_NAME$2 = functionName.PROPER;
+ var CONFIGURABLE_FUNCTION_NAME = functionName.CONFIGURABLE;
+ var getInternalState$3 = internalState.get;
+ var setInternalState$4 = internalState.set;
+ var ARRAY_BUFFER$1 = 'ArrayBuffer';
+ var DATA_VIEW = 'DataView';
+ var PROTOTYPE$1 = 'prototype';
+ var WRONG_LENGTH = 'Wrong length';
+ var WRONG_INDEX = 'Wrong index';
+ var NativeArrayBuffer$1 = global_1[ARRAY_BUFFER$1];
+ var $ArrayBuffer = NativeArrayBuffer$1;
+ var $DataView = global_1[DATA_VIEW];
+ var $DataViewPrototype = $DataView && $DataView[PROTOTYPE$1];
+ var ObjectPrototype$1 = Object.prototype;
+ var RangeError$1 = global_1.RangeError;
+
+ var packIEEE754 = ieee754.pack;
+ var unpackIEEE754 = ieee754.unpack;
+
+ var packInt8 = function (number) {
+ return [number & 0xFF];
+ };
+
+ var packInt16 = function (number) {
+ return [number & 0xFF, number >> 8 & 0xFF];
+ };
+
+ var packInt32 = function (number) {
+ return [number & 0xFF, number >> 8 & 0xFF, number >> 16 & 0xFF, number >> 24 & 0xFF];
+ };
+
+ var unpackInt32 = function (buffer) {
+ return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];
+ };
+
+ var packFloat32 = function (number) {
+ return packIEEE754(number, 23, 4);
+ };
+
+ var packFloat64 = function (number) {
+ return packIEEE754(number, 52, 8);
+ };
+
+ var addGetter = function (Constructor, key) {
+ defineProperty$4(Constructor[PROTOTYPE$1], key, { get: function () { return getInternalState$3(this)[key]; } });
+ };
+
+ var get = function (view, count, index, isLittleEndian) {
+ var intIndex = toIndex(index);
+ var store = getInternalState$3(view);
+ if (intIndex + count > store.byteLength) throw RangeError$1(WRONG_INDEX);
+ var bytes = getInternalState$3(store.buffer).bytes;
+ var start = intIndex + store.byteOffset;
+ var pack = bytes.slice(start, start + count);
+ return isLittleEndian ? pack : pack.reverse();
+ };
+
+ var set$1 = function (view, count, index, conversion, value, isLittleEndian) {
+ var intIndex = toIndex(index);
+ var store = getInternalState$3(view);
+ if (intIndex + count > store.byteLength) throw RangeError$1(WRONG_INDEX);
+ var bytes = getInternalState$3(store.buffer).bytes;
+ var start = intIndex + store.byteOffset;
+ var pack = conversion(+value);
+ for (var i = 0; i < count; i++) bytes[start + i] = pack[isLittleEndian ? i : count - i - 1];
+ };
+
+ if (!arrayBufferNative) {
+ $ArrayBuffer = function ArrayBuffer(length) {
+ anInstance(this, $ArrayBuffer, ARRAY_BUFFER$1);
+ var byteLength = toIndex(length);
+ setInternalState$4(this, {
+ bytes: arrayFill.call(new Array(byteLength), 0),
+ byteLength: byteLength
+ });
+ if (!descriptors) this.byteLength = byteLength;
+ };
+
+ $DataView = function DataView(buffer, byteOffset, byteLength) {
+ anInstance(this, $DataView, DATA_VIEW);
+ anInstance(buffer, $ArrayBuffer, DATA_VIEW);
+ var bufferLength = getInternalState$3(buffer).byteLength;
+ var offset = toInteger(byteOffset);
+ if (offset < 0 || offset > bufferLength) throw RangeError$1('Wrong offset');
+ byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);
+ if (offset + byteLength > bufferLength) throw RangeError$1(WRONG_LENGTH);
+ setInternalState$4(this, {
+ buffer: buffer,
+ byteLength: byteLength,
+ byteOffset: offset
+ });
+ if (!descriptors) {
+ this.buffer = buffer;
+ this.byteLength = byteLength;
+ this.byteOffset = offset;
+ }
+ };
+
+ if (descriptors) {
+ addGetter($ArrayBuffer, 'byteLength');
+ addGetter($DataView, 'buffer');
+ addGetter($DataView, 'byteLength');
+ addGetter($DataView, 'byteOffset');
+ }
+
+ redefineAll($DataView[PROTOTYPE$1], {
+ getInt8: function getInt8(byteOffset) {
+ return get(this, 1, byteOffset)[0] << 24 >> 24;
+ },
+ getUint8: function getUint8(byteOffset) {
+ return get(this, 1, byteOffset)[0];
+ },
+ getInt16: function getInt16(byteOffset /* , littleEndian */) {
+ var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);
+ return (bytes[1] << 8 | bytes[0]) << 16 >> 16;
+ },
+ getUint16: function getUint16(byteOffset /* , littleEndian */) {
+ var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);
+ return bytes[1] << 8 | bytes[0];
+ },
+ getInt32: function getInt32(byteOffset /* , littleEndian */) {
+ return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined));
+ },
+ getUint32: function getUint32(byteOffset /* , littleEndian */) {
+ return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)) >>> 0;
+ },
+ getFloat32: function getFloat32(byteOffset /* , littleEndian */) {
+ return unpackIEEE754(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 23);
+ },
+ getFloat64: function getFloat64(byteOffset /* , littleEndian */) {
+ return unpackIEEE754(get(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 52);
+ },
+ setInt8: function setInt8(byteOffset, value) {
+ set$1(this, 1, byteOffset, packInt8, value);
+ },
+ setUint8: function setUint8(byteOffset, value) {
+ set$1(this, 1, byteOffset, packInt8, value);
+ },
+ setInt16: function setInt16(byteOffset, value /* , littleEndian */) {
+ set$1(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);
+ },
+ setUint16: function setUint16(byteOffset, value /* , littleEndian */) {
+ set$1(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);
+ },
+ setInt32: function setInt32(byteOffset, value /* , littleEndian */) {
+ set$1(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);
+ },
+ setUint32: function setUint32(byteOffset, value /* , littleEndian */) {
+ set$1(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);
+ },
+ setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {
+ set$1(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : undefined);
+ },
+ setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {
+ set$1(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : undefined);
+ }
+ });
+ } else {
+ var INCORRECT_ARRAY_BUFFER_NAME = PROPER_FUNCTION_NAME$2 && NativeArrayBuffer$1.name !== ARRAY_BUFFER$1;
+ /* eslint-disable no-new -- required for testing */
+ if (!fails(function () {
+ NativeArrayBuffer$1(1);
+ }) || !fails(function () {
+ new NativeArrayBuffer$1(-1);
+ }) || fails(function () {
+ new NativeArrayBuffer$1();
+ new NativeArrayBuffer$1(1.5);
+ new NativeArrayBuffer$1(NaN);
+ return INCORRECT_ARRAY_BUFFER_NAME && !CONFIGURABLE_FUNCTION_NAME;
+ })) {
+ /* eslint-enable no-new -- required for testing */
+ $ArrayBuffer = function ArrayBuffer(length) {
+ anInstance(this, $ArrayBuffer);
+ return new NativeArrayBuffer$1(toIndex(length));
+ };
+ var ArrayBufferPrototype = $ArrayBuffer[PROTOTYPE$1] = NativeArrayBuffer$1[PROTOTYPE$1];
+ for (var keys$1 = getOwnPropertyNames(NativeArrayBuffer$1), j = 0, key; keys$1.length > j;) {
+ if (!((key = keys$1[j++]) in $ArrayBuffer)) {
+ createNonEnumerableProperty($ArrayBuffer, key, NativeArrayBuffer$1[key]);
+ }
+ }
+ ArrayBufferPrototype.constructor = $ArrayBuffer;
+ } else if (INCORRECT_ARRAY_BUFFER_NAME && CONFIGURABLE_FUNCTION_NAME) {
+ createNonEnumerableProperty(NativeArrayBuffer$1, 'name', ARRAY_BUFFER$1);
+ }
+
+ // WebKit bug - the same parent prototype for typed arrays and data view
+ if (objectSetPrototypeOf && objectGetPrototypeOf($DataViewPrototype) !== ObjectPrototype$1) {
+ objectSetPrototypeOf($DataViewPrototype, ObjectPrototype$1);
+ }
+
+ // iOS Safari 7.x bug
+ var testView = new $DataView(new $ArrayBuffer(2));
+ var $setInt8 = $DataViewPrototype.setInt8;
+ testView.setInt8(0, 2147483648);
+ testView.setInt8(1, 2147483649);
+ if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll($DataViewPrototype, {
+ setInt8: function setInt8(byteOffset, value) {
+ $setInt8.call(this, byteOffset, value << 24 >> 24);
+ },
+ setUint8: function setUint8(byteOffset, value) {
+ $setInt8.call(this, byteOffset, value << 24 >> 24);
+ }
+ }, { unsafe: true });
+ }
+
+ setToStringTag($ArrayBuffer, ARRAY_BUFFER$1);
+ setToStringTag($DataView, DATA_VIEW);
+
+ var arrayBuffer = {
+ ArrayBuffer: $ArrayBuffer,
+ DataView: $DataView
+ };
+
+ var floor$3 = Math.floor;
+
+ // `Number.isInteger` method implementation
+ // https://tc39.es/ecma262/#sec-number.isinteger
+ var isInteger = function isInteger(it) {
+ return !isObject$1(it) && isFinite(it) && floor$3(it) === it;
+ };
+
+ var toPositiveInteger = function (it) {
+ var result = toInteger(it);
+ if (result < 0) throw RangeError("The argument can't be less than 0");
+ return result;
+ };
+
+ var toOffset = function (it, BYTES) {
+ var offset = toPositiveInteger(it);
+ if (offset % BYTES) throw RangeError('Wrong offset');
+ return offset;
+ };
+
+ var ITERATOR$3 = wellKnownSymbol('iterator');
+
+ var getIteratorMethod = function (it) {
+ if (it != undefined) return getMethod(it, ITERATOR$3)
+ || getMethod(it, '@@iterator')
+ || iterators[classof(it)];
+ };
+
+ var getIterator = function (argument, usingIterator) {
+ var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;
+ if (aCallable(iteratorMethod)) return anObject(iteratorMethod.call(argument));
+ throw TypeError(String(argument) + ' is not iterable');
+ };
+
+ var ITERATOR$2 = wellKnownSymbol('iterator');
+ var ArrayPrototype = Array.prototype;
+
+ // check on default Array iterator
+ var isArrayIteratorMethod = function (it) {
+ return it !== undefined && (iterators.Array === it || ArrayPrototype[ITERATOR$2] === it);
+ };
+
+ var aTypedArrayConstructor$1 = arrayBufferViewCore.aTypedArrayConstructor;
+
+ var typedArrayFrom = function from(source /* , mapfn, thisArg */) {
+ var C = aConstructor(this);
+ var O = toObject(source);
+ var argumentsLength = arguments.length;
+ var mapfn = argumentsLength > 1 ? arguments[1] : undefined;
+ var mapping = mapfn !== undefined;
+ var iteratorMethod = getIteratorMethod(O);
+ var i, length, result, step, iterator, next;
+ if (iteratorMethod && !isArrayIteratorMethod(iteratorMethod)) {
+ iterator = getIterator(O, iteratorMethod);
+ next = iterator.next;
+ O = [];
+ while (!(step = next.call(iterator)).done) {
+ O.push(step.value);
+ }
+ }
+ if (mapping && argumentsLength > 2) {
+ mapfn = functionBindContext(mapfn, arguments[2], 2);
+ }
+ length = toLength(O.length);
+ result = new (aTypedArrayConstructor$1(C))(length);
+ for (i = 0; length > i; i++) {
+ result[i] = mapping ? mapfn(O[i], i) : O[i];
+ }
+ return result;
+ };
+
+ var typedArrayConstructor = createCommonjsModule(function (module) {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ var getOwnPropertyNames = objectGetOwnPropertyNames.f;
+
+ var forEach = arrayIteration.forEach;
+
+
+
+
+
+
+ var getInternalState = internalState.get;
+ var setInternalState = internalState.set;
+ var nativeDefineProperty = objectDefineProperty.f;
+ var nativeGetOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;
+ var round = Math.round;
+ var RangeError = global_1.RangeError;
+ var ArrayBuffer = arrayBuffer.ArrayBuffer;
+ var DataView = arrayBuffer.DataView;
+ var NATIVE_ARRAY_BUFFER_VIEWS = arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;
+ var TYPED_ARRAY_CONSTRUCTOR = arrayBufferViewCore.TYPED_ARRAY_CONSTRUCTOR;
+ var TYPED_ARRAY_TAG = arrayBufferViewCore.TYPED_ARRAY_TAG;
+ var TypedArray = arrayBufferViewCore.TypedArray;
+ var TypedArrayPrototype = arrayBufferViewCore.TypedArrayPrototype;
+ var aTypedArrayConstructor = arrayBufferViewCore.aTypedArrayConstructor;
+ var isTypedArray = arrayBufferViewCore.isTypedArray;
+ var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';
+ var WRONG_LENGTH = 'Wrong length';
+
+ var fromList = function (C, list) {
+ var index = 0;
+ var length = list.length;
+ var result = new (aTypedArrayConstructor(C))(length);
+ while (length > index) result[index] = list[index++];
+ return result;
+ };
+
+ var addGetter = function (it, key) {
+ nativeDefineProperty(it, key, { get: function () {
+ return getInternalState(this)[key];
+ } });
+ };
+
+ var isArrayBuffer = function (it) {
+ var klass;
+ return it instanceof ArrayBuffer || (klass = classof(it)) == 'ArrayBuffer' || klass == 'SharedArrayBuffer';
+ };
+
+ var isTypedArrayIndex = function (target, key) {
+ return isTypedArray(target)
+ && !isSymbol$1(key)
+ && key in target
+ && isInteger(+key)
+ && key >= 0;
+ };
+
+ var wrappedGetOwnPropertyDescriptor = function getOwnPropertyDescriptor(target, key) {
+ key = toPropertyKey(key);
+ return isTypedArrayIndex(target, key)
+ ? createPropertyDescriptor(2, target[key])
+ : nativeGetOwnPropertyDescriptor(target, key);
+ };
+
+ var wrappedDefineProperty = function defineProperty(target, key, descriptor) {
+ key = toPropertyKey(key);
+ if (isTypedArrayIndex(target, key)
+ && isObject$1(descriptor)
+ && has$1(descriptor, 'value')
+ && !has$1(descriptor, 'get')
+ && !has$1(descriptor, 'set')
+ // TODO: add validation descriptor w/o calling accessors
+ && !descriptor.configurable
+ && (!has$1(descriptor, 'writable') || descriptor.writable)
+ && (!has$1(descriptor, 'enumerable') || descriptor.enumerable)
+ ) {
+ target[key] = descriptor.value;
+ return target;
+ } return nativeDefineProperty(target, key, descriptor);
+ };
+
+ if (descriptors) {
+ if (!NATIVE_ARRAY_BUFFER_VIEWS) {
+ objectGetOwnPropertyDescriptor.f = wrappedGetOwnPropertyDescriptor;
+ objectDefineProperty.f = wrappedDefineProperty;
+ addGetter(TypedArrayPrototype, 'buffer');
+ addGetter(TypedArrayPrototype, 'byteOffset');
+ addGetter(TypedArrayPrototype, 'byteLength');
+ addGetter(TypedArrayPrototype, 'length');
+ }
+
+ _export({ target: 'Object', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS }, {
+ getOwnPropertyDescriptor: wrappedGetOwnPropertyDescriptor,
+ defineProperty: wrappedDefineProperty
+ });
+
+ module.exports = function (TYPE, wrapper, CLAMPED) {
+ var BYTES = TYPE.match(/\d+$/)[0] / 8;
+ var CONSTRUCTOR_NAME = TYPE + (CLAMPED ? 'Clamped' : '') + 'Array';
+ var GETTER = 'get' + TYPE;
+ var SETTER = 'set' + TYPE;
+ var NativeTypedArrayConstructor = global_1[CONSTRUCTOR_NAME];
+ var TypedArrayConstructor = NativeTypedArrayConstructor;
+ var TypedArrayConstructorPrototype = TypedArrayConstructor && TypedArrayConstructor.prototype;
+ var exported = {};
+
+ var getter = function (that, index) {
+ var data = getInternalState(that);
+ return data.view[GETTER](index * BYTES + data.byteOffset, true);
+ };
+
+ var setter = function (that, index, value) {
+ var data = getInternalState(that);
+ if (CLAMPED) value = (value = round(value)) < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF;
+ data.view[SETTER](index * BYTES + data.byteOffset, value, true);
+ };
+
+ var addElement = function (that, index) {
+ nativeDefineProperty(that, index, {
+ get: function () {
+ return getter(this, index);
+ },
+ set: function (value) {
+ return setter(this, index, value);
+ },
+ enumerable: true
+ });
+ };
+
+ if (!NATIVE_ARRAY_BUFFER_VIEWS) {
+ TypedArrayConstructor = wrapper(function (that, data, offset, $length) {
+ anInstance(that, TypedArrayConstructor, CONSTRUCTOR_NAME);
+ var index = 0;
+ var byteOffset = 0;
+ var buffer, byteLength, length;
+ if (!isObject$1(data)) {
+ length = toIndex(data);
+ byteLength = length * BYTES;
+ buffer = new ArrayBuffer(byteLength);
+ } else if (isArrayBuffer(data)) {
+ buffer = data;
+ byteOffset = toOffset(offset, BYTES);
+ var $len = data.byteLength;
+ if ($length === undefined) {
+ if ($len % BYTES) throw RangeError(WRONG_LENGTH);
+ byteLength = $len - byteOffset;
+ if (byteLength < 0) throw RangeError(WRONG_LENGTH);
+ } else {
+ byteLength = toLength($length) * BYTES;
+ if (byteLength + byteOffset > $len) throw RangeError(WRONG_LENGTH);
+ }
+ length = byteLength / BYTES;
+ } else if (isTypedArray(data)) {
+ return fromList(TypedArrayConstructor, data);
+ } else {
+ return typedArrayFrom.call(TypedArrayConstructor, data);
+ }
+ setInternalState(that, {
+ buffer: buffer,
+ byteOffset: byteOffset,
+ byteLength: byteLength,
+ length: length,
+ view: new DataView(buffer)
+ });
+ while (index < length) addElement(that, index++);
+ });
+
+ if (objectSetPrototypeOf) objectSetPrototypeOf(TypedArrayConstructor, TypedArray);
+ TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = objectCreate(TypedArrayPrototype);
+ } else if (typedArrayConstructorsRequireWrappers) {
+ TypedArrayConstructor = wrapper(function (dummy, data, typedArrayOffset, $length) {
+ anInstance(dummy, TypedArrayConstructor, CONSTRUCTOR_NAME);
+ return inheritIfRequired(function () {
+ if (!isObject$1(data)) return new NativeTypedArrayConstructor(toIndex(data));
+ if (isArrayBuffer(data)) return $length !== undefined
+ ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES), $length)
+ : typedArrayOffset !== undefined
+ ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES))
+ : new NativeTypedArrayConstructor(data);
+ if (isTypedArray(data)) return fromList(TypedArrayConstructor, data);
+ return typedArrayFrom.call(TypedArrayConstructor, data);
+ }(), dummy, TypedArrayConstructor);
+ });
+
+ if (objectSetPrototypeOf) objectSetPrototypeOf(TypedArrayConstructor, TypedArray);
+ forEach(getOwnPropertyNames(NativeTypedArrayConstructor), function (key) {
+ if (!(key in TypedArrayConstructor)) {
+ createNonEnumerableProperty(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]);
+ }
+ });
+ TypedArrayConstructor.prototype = TypedArrayConstructorPrototype;
+ }
+
+ if (TypedArrayConstructorPrototype.constructor !== TypedArrayConstructor) {
+ createNonEnumerableProperty(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor);
+ }
+
+ createNonEnumerableProperty(TypedArrayConstructorPrototype, TYPED_ARRAY_CONSTRUCTOR, TypedArrayConstructor);
+
+ if (TYPED_ARRAY_TAG) {
+ createNonEnumerableProperty(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME);
+ }
+
+ exported[CONSTRUCTOR_NAME] = TypedArrayConstructor;
+
+ _export({
+ global: true, forced: TypedArrayConstructor != NativeTypedArrayConstructor, sham: !NATIVE_ARRAY_BUFFER_VIEWS
+ }, exported);
+
+ if (!(BYTES_PER_ELEMENT in TypedArrayConstructor)) {
+ createNonEnumerableProperty(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES);
+ }
+
+ if (!(BYTES_PER_ELEMENT in TypedArrayConstructorPrototype)) {
+ createNonEnumerableProperty(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES);
+ }
+
+ setSpecies(CONSTRUCTOR_NAME);
+ };
+ } else module.exports = function () { /* empty */ };
+ });
+
+ // `Uint8Array` constructor
+ // https://tc39.es/ecma262/#sec-typedarray-objects
+ typedArrayConstructor('Uint8', function (init) {
+ return function Uint8Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+ });
+
+ var min$2 = Math.min;
+
+ // `Array.prototype.copyWithin` method implementation
+ // https://tc39.es/ecma262/#sec-array.prototype.copywithin
+ // eslint-disable-next-line es/no-array-prototype-copywithin -- safe
+ var arrayCopyWithin = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {
+ var O = toObject(this);
+ var len = toLength(O.length);
+ var to = toAbsoluteIndex(target, len);
+ var from = toAbsoluteIndex(start, len);
+ var end = arguments.length > 2 ? arguments[2] : undefined;
+ var count = min$2((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);
+ var inc = 1;
+ if (from < to && to < from + count) {
+ inc = -1;
+ from += count - 1;
+ to += count - 1;
+ }
+ while (count-- > 0) {
+ if (from in O) O[to] = O[from];
+ else delete O[to];
+ to += inc;
+ from += inc;
+ } return O;
+ };
+
+ var aTypedArray$l = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$m = arrayBufferViewCore.exportTypedArrayMethod;
+
+ // `%TypedArray%.prototype.copyWithin` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.copywithin
+ exportTypedArrayMethod$m('copyWithin', function copyWithin(target, start /* , end */) {
+ return arrayCopyWithin.call(aTypedArray$l(this), target, start, arguments.length > 2 ? arguments[2] : undefined);
+ });
+
+ var $every = arrayIteration.every;
+
+ var aTypedArray$k = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$l = arrayBufferViewCore.exportTypedArrayMethod;
+
+ // `%TypedArray%.prototype.every` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.every
+ exportTypedArrayMethod$l('every', function every(callbackfn /* , thisArg */) {
+ return $every(aTypedArray$k(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ });
+
+ var aTypedArray$j = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$k = arrayBufferViewCore.exportTypedArrayMethod;
+
+ // `%TypedArray%.prototype.fill` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.fill
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
+ exportTypedArrayMethod$k('fill', function fill(value /* , start, end */) {
+ return arrayFill.apply(aTypedArray$j(this), arguments);
+ });
+
+ var arrayFromConstructorAndList = function (Constructor, list) {
+ var index = 0;
+ var length = list.length;
+ var result = new Constructor(length);
+ while (length > index) result[index] = list[index++];
+ return result;
+ };
+
+ var TYPED_ARRAY_CONSTRUCTOR = arrayBufferViewCore.TYPED_ARRAY_CONSTRUCTOR;
+ var aTypedArrayConstructor = arrayBufferViewCore.aTypedArrayConstructor;
+
+ // a part of `TypedArraySpeciesCreate` abstract operation
+ // https://tc39.es/ecma262/#typedarray-species-create
+ var typedArraySpeciesConstructor = function (originalArray) {
+ return aTypedArrayConstructor(speciesConstructor(originalArray, originalArray[TYPED_ARRAY_CONSTRUCTOR]));
+ };
+
+ var typedArrayFromSpeciesAndList = function (instance, list) {
+ return arrayFromConstructorAndList(typedArraySpeciesConstructor(instance), list);
+ };
+
+ var $filter = arrayIteration.filter;
+
+
+ var aTypedArray$i = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$j = arrayBufferViewCore.exportTypedArrayMethod;
+
+ // `%TypedArray%.prototype.filter` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.filter
+ exportTypedArrayMethod$j('filter', function filter(callbackfn /* , thisArg */) {
+ var list = $filter(aTypedArray$i(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ return typedArrayFromSpeciesAndList(this, list);
+ });
+
+ var $find = arrayIteration.find;
+
+ var aTypedArray$h = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$i = arrayBufferViewCore.exportTypedArrayMethod;
+
+ // `%TypedArray%.prototype.find` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.find
+ exportTypedArrayMethod$i('find', function find(predicate /* , thisArg */) {
+ return $find(aTypedArray$h(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
+ });
+
+ var $findIndex = arrayIteration.findIndex;
+
+ var aTypedArray$g = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$h = arrayBufferViewCore.exportTypedArrayMethod;
+
+ // `%TypedArray%.prototype.findIndex` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.findindex
+ exportTypedArrayMethod$h('findIndex', function findIndex(predicate /* , thisArg */) {
+ return $findIndex(aTypedArray$g(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
+ });
+
+ var $forEach$1 = arrayIteration.forEach;
+
+ var aTypedArray$f = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$g = arrayBufferViewCore.exportTypedArrayMethod;
+
+ // `%TypedArray%.prototype.forEach` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.foreach
+ exportTypedArrayMethod$g('forEach', function forEach(callbackfn /* , thisArg */) {
+ $forEach$1(aTypedArray$f(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ });
+
+ var $includes$1 = arrayIncludes.includes;
+
+ var aTypedArray$e = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$f = arrayBufferViewCore.exportTypedArrayMethod;
+
+ // `%TypedArray%.prototype.includes` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.includes
+ exportTypedArrayMethod$f('includes', function includes(searchElement /* , fromIndex */) {
+ return $includes$1(aTypedArray$e(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
+ });
+
+ var $indexOf = arrayIncludes.indexOf;
+
+ var aTypedArray$d = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$e = arrayBufferViewCore.exportTypedArrayMethod;
+
+ // `%TypedArray%.prototype.indexOf` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.indexof
+ exportTypedArrayMethod$e('indexOf', function indexOf(searchElement /* , fromIndex */) {
+ return $indexOf(aTypedArray$d(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
+ });
+
+ var PROPER_FUNCTION_NAME$1 = functionName.PROPER;
+
+
+
+
+ var ITERATOR$1 = wellKnownSymbol('iterator');
+ var Uint8Array$2 = global_1.Uint8Array;
+ var arrayValues = es_array_iterator.values;
+ var arrayKeys = es_array_iterator.keys;
+ var arrayEntries = es_array_iterator.entries;
+ var aTypedArray$c = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$d = arrayBufferViewCore.exportTypedArrayMethod;
+ var nativeTypedArrayIterator = Uint8Array$2 && Uint8Array$2.prototype[ITERATOR$1];
+
+ var PROPER_ARRAY_VALUES_NAME = !!nativeTypedArrayIterator && nativeTypedArrayIterator.name === 'values';
+
+ var typedArrayValues = function values() {
+ return arrayValues.call(aTypedArray$c(this));
+ };
+
+ // `%TypedArray%.prototype.entries` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.entries
+ exportTypedArrayMethod$d('entries', function entries() {
+ return arrayEntries.call(aTypedArray$c(this));
+ });
+ // `%TypedArray%.prototype.keys` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.keys
+ exportTypedArrayMethod$d('keys', function keys() {
+ return arrayKeys.call(aTypedArray$c(this));
+ });
+ // `%TypedArray%.prototype.values` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.values
+ exportTypedArrayMethod$d('values', typedArrayValues, PROPER_FUNCTION_NAME$1 && !PROPER_ARRAY_VALUES_NAME);
+ // `%TypedArray%.prototype[@@iterator]` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype-@@iterator
+ exportTypedArrayMethod$d(ITERATOR$1, typedArrayValues, PROPER_FUNCTION_NAME$1 && !PROPER_ARRAY_VALUES_NAME);
+
+ var aTypedArray$b = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$c = arrayBufferViewCore.exportTypedArrayMethod;
+ var $join = [].join;
+
+ // `%TypedArray%.prototype.join` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.join
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
+ exportTypedArrayMethod$c('join', function join(separator) {
+ return $join.apply(aTypedArray$b(this), arguments);
+ });
+
+ /* eslint-disable es/no-array-prototype-lastindexof -- safe */
+
+
+
+
+
+ var min$1 = Math.min;
+ var $lastIndexOf = [].lastIndexOf;
+ var NEGATIVE_ZERO = !!$lastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;
+ var STRICT_METHOD$1 = arrayMethodIsStrict('lastIndexOf');
+ var FORCED$6 = NEGATIVE_ZERO || !STRICT_METHOD$1;
+
+ // `Array.prototype.lastIndexOf` method implementation
+ // https://tc39.es/ecma262/#sec-array.prototype.lastindexof
+ var arrayLastIndexOf = FORCED$6 ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {
+ // convert -0 to +0
+ if (NEGATIVE_ZERO) return $lastIndexOf.apply(this, arguments) || 0;
+ var O = toIndexedObject(this);
+ var length = toLength(O.length);
+ var index = length - 1;
+ if (arguments.length > 1) index = min$1(index, toInteger(arguments[1]));
+ if (index < 0) index = length + index;
+ for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;
+ return -1;
+ } : $lastIndexOf;
+
+ var aTypedArray$a = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$b = arrayBufferViewCore.exportTypedArrayMethod;
+
+ // `%TypedArray%.prototype.lastIndexOf` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.lastindexof
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
+ exportTypedArrayMethod$b('lastIndexOf', function lastIndexOf(searchElement /* , fromIndex */) {
+ return arrayLastIndexOf.apply(aTypedArray$a(this), arguments);
+ });
+
+ var $map = arrayIteration.map;
+
+
+ var aTypedArray$9 = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$a = arrayBufferViewCore.exportTypedArrayMethod;
+
+ // `%TypedArray%.prototype.map` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.map
+ exportTypedArrayMethod$a('map', function map(mapfn /* , thisArg */) {
+ return $map(aTypedArray$9(this), mapfn, arguments.length > 1 ? arguments[1] : undefined, function (O, length) {
+ return new (typedArraySpeciesConstructor(O))(length);
+ });
+ });
+
+ // `Array.prototype.{ reduce, reduceRight }` methods implementation
+ var createMethod$1 = function (IS_RIGHT) {
+ return function (that, callbackfn, argumentsLength, memo) {
+ aCallable(callbackfn);
+ var O = toObject(that);
+ var self = indexedObject(O);
+ var length = toLength(O.length);
+ var index = IS_RIGHT ? length - 1 : 0;
+ var i = IS_RIGHT ? -1 : 1;
+ if (argumentsLength < 2) while (true) {
+ if (index in self) {
+ memo = self[index];
+ index += i;
+ break;
+ }
+ index += i;
+ if (IS_RIGHT ? index < 0 : length <= index) {
+ throw TypeError('Reduce of empty array with no initial value');
+ }
+ }
+ for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {
+ memo = callbackfn(memo, self[index], index, O);
+ }
+ return memo;
+ };
+ };
+
+ var arrayReduce = {
+ // `Array.prototype.reduce` method
+ // https://tc39.es/ecma262/#sec-array.prototype.reduce
+ left: createMethod$1(false),
+ // `Array.prototype.reduceRight` method
+ // https://tc39.es/ecma262/#sec-array.prototype.reduceright
+ right: createMethod$1(true)
+ };
+
+ var $reduce = arrayReduce.left;
+
+ var aTypedArray$8 = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$9 = arrayBufferViewCore.exportTypedArrayMethod;
+
+ // `%TypedArray%.prototype.reduce` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.reduce
+ exportTypedArrayMethod$9('reduce', function reduce(callbackfn /* , initialValue */) {
+ return $reduce(aTypedArray$8(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
+ });
+
+ var $reduceRight = arrayReduce.right;
+
+ var aTypedArray$7 = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$8 = arrayBufferViewCore.exportTypedArrayMethod;
+
+ // `%TypedArray%.prototype.reduceRicht` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.reduceright
+ exportTypedArrayMethod$8('reduceRight', function reduceRight(callbackfn /* , initialValue */) {
+ return $reduceRight(aTypedArray$7(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);
+ });
+
+ var aTypedArray$6 = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$7 = arrayBufferViewCore.exportTypedArrayMethod;
+ var floor$2 = Math.floor;
+
+ // `%TypedArray%.prototype.reverse` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.reverse
+ exportTypedArrayMethod$7('reverse', function reverse() {
+ var that = this;
+ var length = aTypedArray$6(that).length;
+ var middle = floor$2(length / 2);
+ var index = 0;
+ var value;
+ while (index < middle) {
+ value = that[index];
+ that[index++] = that[--length];
+ that[length] = value;
+ } return that;
+ });
+
+ var aTypedArray$5 = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$6 = arrayBufferViewCore.exportTypedArrayMethod;
+
+ var FORCED$5 = fails(function () {
+ // eslint-disable-next-line es/no-typed-arrays -- required for testing
+ new Int8Array(1).set({});
+ });
+
+ // `%TypedArray%.prototype.set` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.set
+ exportTypedArrayMethod$6('set', function set(arrayLike /* , offset */) {
+ aTypedArray$5(this);
+ var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 1);
+ var length = this.length;
+ var src = toObject(arrayLike);
+ var len = toLength(src.length);
+ var index = 0;
+ if (len + offset > length) throw RangeError('Wrong length');
+ while (index < len) this[offset + index] = src[index++];
+ }, FORCED$5);
+
+ var aTypedArray$4 = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$5 = arrayBufferViewCore.exportTypedArrayMethod;
+ var $slice$1 = [].slice;
+
+ var FORCED$4 = fails(function () {
+ // eslint-disable-next-line es/no-typed-arrays -- required for testing
+ new Int8Array(1).slice();
+ });
+
+ // `%TypedArray%.prototype.slice` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.slice
+ exportTypedArrayMethod$5('slice', function slice(start, end) {
+ var list = $slice$1.call(aTypedArray$4(this), start, end);
+ var C = typedArraySpeciesConstructor(this);
+ var index = 0;
+ var length = list.length;
+ var result = new C(length);
+ while (length > index) result[index] = list[index++];
+ return result;
+ }, FORCED$4);
+
+ var $some = arrayIteration.some;
+
+ var aTypedArray$3 = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$4 = arrayBufferViewCore.exportTypedArrayMethod;
+
+ // `%TypedArray%.prototype.some` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.some
+ exportTypedArrayMethod$4('some', function some(callbackfn /* , thisArg */) {
+ return $some(aTypedArray$3(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ });
+
+ // TODO: use something more complex like timsort?
+ var floor$1 = Math.floor;
+
+ var mergeSort = function (array, comparefn) {
+ var length = array.length;
+ var middle = floor$1(length / 2);
+ return length < 8 ? insertionSort(array, comparefn) : merge(
+ mergeSort(array.slice(0, middle), comparefn),
+ mergeSort(array.slice(middle), comparefn),
+ comparefn
+ );
+ };
+
+ var insertionSort = function (array, comparefn) {
+ var length = array.length;
+ var i = 1;
+ var element, j;
+
+ while (i < length) {
+ j = i;
+ element = array[i];
+ while (j && comparefn(array[j - 1], element) > 0) {
+ array[j] = array[--j];
+ }
+ if (j !== i++) array[j] = element;
+ } return array;
+ };
+
+ var merge = function (left, right, comparefn) {
+ var llength = left.length;
+ var rlength = right.length;
+ var lindex = 0;
+ var rindex = 0;
+ var result = [];
+
+ while (lindex < llength || rindex < rlength) {
+ if (lindex < llength && rindex < rlength) {
+ result.push(comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++]);
+ } else {
+ result.push(lindex < llength ? left[lindex++] : right[rindex++]);
+ }
+ } return result;
+ };
+
+ var arraySort = mergeSort;
+
+ var firefox = engineUserAgent.match(/firefox\/(\d+)/i);
+
+ var engineFfVersion = !!firefox && +firefox[1];
+
+ var engineIsIeOrEdge = /MSIE|Trident/.test(engineUserAgent);
+
+ var webkit = engineUserAgent.match(/AppleWebKit\/(\d+)\./);
+
+ var engineWebkitVersion = !!webkit && +webkit[1];
+
+ var aTypedArray$2 = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$3 = arrayBufferViewCore.exportTypedArrayMethod;
+ var Uint16Array = global_1.Uint16Array;
+ var nativeSort$1 = Uint16Array && Uint16Array.prototype.sort;
+
+ // WebKit
+ var ACCEPT_INCORRECT_ARGUMENTS = !!nativeSort$1 && !fails(function () {
+ var array = new Uint16Array(2);
+ array.sort(null);
+ array.sort({});
+ });
+
+ var STABLE_SORT$1 = !!nativeSort$1 && !fails(function () {
+ // feature detection can be too slow, so check engines versions
+ if (engineV8Version) return engineV8Version < 74;
+ if (engineFfVersion) return engineFfVersion < 67;
+ if (engineIsIeOrEdge) return true;
+ if (engineWebkitVersion) return engineWebkitVersion < 602;
+
+ var array = new Uint16Array(516);
+ var expected = Array(516);
+ var index, mod;
+
+ for (index = 0; index < 516; index++) {
+ mod = index % 4;
+ array[index] = 515 - index;
+ expected[index] = index - 2 * mod + 3;
+ }
+
+ array.sort(function (a, b) {
+ return (a / 4 | 0) - (b / 4 | 0);
+ });
+
+ for (index = 0; index < 516; index++) {
+ if (array[index] !== expected[index]) return true;
+ }
+ });
+
+ var getSortCompare$1 = function (comparefn) {
+ return function (x, y) {
+ if (comparefn !== undefined) return +comparefn(x, y) || 0;
+ // eslint-disable-next-line no-self-compare -- NaN check
+ if (y !== y) return -1;
+ // eslint-disable-next-line no-self-compare -- NaN check
+ if (x !== x) return 1;
+ if (x === 0 && y === 0) return 1 / x > 0 && 1 / y < 0 ? 1 : -1;
+ return x > y;
+ };
+ };
+
+ // `%TypedArray%.prototype.sort` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.sort
+ exportTypedArrayMethod$3('sort', function sort(comparefn) {
+ var array = this;
+ if (comparefn !== undefined) aCallable(comparefn);
+ if (STABLE_SORT$1) return nativeSort$1.call(array, comparefn);
+
+ aTypedArray$2(array);
+ var arrayLength = toLength(array.length);
+ var items = Array(arrayLength);
+ var index;
+
+ for (index = 0; index < arrayLength; index++) {
+ items[index] = array[index];
+ }
+
+ items = arraySort(array, getSortCompare$1(comparefn));
+
+ for (index = 0; index < arrayLength; index++) {
+ array[index] = items[index];
+ }
+
+ return array;
+ }, !STABLE_SORT$1 || ACCEPT_INCORRECT_ARGUMENTS);
+
+ var aTypedArray$1 = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$2 = arrayBufferViewCore.exportTypedArrayMethod;
+
+ // `%TypedArray%.prototype.subarray` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.subarray
+ exportTypedArrayMethod$2('subarray', function subarray(begin, end) {
+ var O = aTypedArray$1(this);
+ var length = O.length;
+ var beginIndex = toAbsoluteIndex(begin, length);
+ var C = typedArraySpeciesConstructor(O);
+ return new C(
+ O.buffer,
+ O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT,
+ toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - beginIndex)
+ );
+ });
+
+ var Int8Array$1 = global_1.Int8Array;
+ var aTypedArray = arrayBufferViewCore.aTypedArray;
+ var exportTypedArrayMethod$1 = arrayBufferViewCore.exportTypedArrayMethod;
+ var $toLocaleString = [].toLocaleString;
+ var $slice = [].slice;
+
+ // iOS Safari 6.x fails here
+ var TO_LOCALE_STRING_BUG = !!Int8Array$1 && fails(function () {
+ $toLocaleString.call(new Int8Array$1(1));
+ });
+
+ var FORCED$3 = fails(function () {
+ return [1, 2].toLocaleString() != new Int8Array$1([1, 2]).toLocaleString();
+ }) || !fails(function () {
+ Int8Array$1.prototype.toLocaleString.call([1, 2]);
+ });
+
+ // `%TypedArray%.prototype.toLocaleString` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.tolocalestring
+ exportTypedArrayMethod$1('toLocaleString', function toLocaleString() {
+ return $toLocaleString.apply(TO_LOCALE_STRING_BUG ? $slice.call(aTypedArray(this)) : aTypedArray(this), arguments);
+ }, FORCED$3);
+
+ var exportTypedArrayMethod = arrayBufferViewCore.exportTypedArrayMethod;
+
+
+
+ var Uint8Array$1 = global_1.Uint8Array;
+ var Uint8ArrayPrototype = Uint8Array$1 && Uint8Array$1.prototype || {};
+ var arrayToString = [].toString;
+ var arrayJoin = [].join;
+
+ if (fails(function () { arrayToString.call({}); })) {
+ arrayToString = function toString() {
+ return arrayJoin.call(this);
+ };
+ }
+
+ var IS_NOT_ARRAY_METHOD = Uint8ArrayPrototype.toString != arrayToString;
+
+ // `%TypedArray%.prototype.toString` method
+ // https://tc39.es/ecma262/#sec-%typedarray%.prototype.tostring
+ exportTypedArrayMethod('toString', arrayToString, IS_NOT_ARRAY_METHOD);
+
+ var ARRAY_BUFFER = 'ArrayBuffer';
+ var ArrayBuffer$1 = arrayBuffer[ARRAY_BUFFER];
+ var NativeArrayBuffer = global_1[ARRAY_BUFFER];
+
+ // `ArrayBuffer` constructor
+ // https://tc39.es/ecma262/#sec-arraybuffer-constructor
+ _export({ global: true, forced: NativeArrayBuffer !== ArrayBuffer$1 }, {
+ ArrayBuffer: ArrayBuffer$1
+ });
+
+ setSpecies(ARRAY_BUFFER);
+
+ var f$1 = wellKnownSymbol;
+
+ var wellKnownSymbolWrapped = {
+ f: f$1
+ };
+
+ var path$1 = global_1;
+
+ var defineProperty$3 = objectDefineProperty.f;
+
+ var defineWellKnownSymbol = function (NAME) {
+ var Symbol = path$1.Symbol || (path$1.Symbol = {});
+ if (!has$1(Symbol, NAME)) defineProperty$3(Symbol, NAME, {
+ value: wellKnownSymbolWrapped.f(NAME)
+ });
+ };
+
+ var $forEach = arrayIteration.forEach;
+
+ var HIDDEN = sharedKey('hidden');
+ var SYMBOL = 'Symbol';
+ var PROTOTYPE = 'prototype';
+ var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');
+ var setInternalState$3 = internalState.set;
+ var getInternalState$2 = internalState.getterFor(SYMBOL);
+ var ObjectPrototype = Object[PROTOTYPE];
+ var $Symbol = global_1.Symbol;
+ var $stringify = getBuiltIn('JSON', 'stringify');
+ var nativeGetOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;
+ var nativeDefineProperty = objectDefineProperty.f;
+ var nativeGetOwnPropertyNames = objectGetOwnPropertyNamesExternal.f;
+ var nativePropertyIsEnumerable = objectPropertyIsEnumerable.f;
+ var AllSymbols = shared('symbols');
+ var ObjectPrototypeSymbols = shared('op-symbols');
+ var StringToSymbolRegistry = shared('string-to-symbol-registry');
+ var SymbolToStringRegistry = shared('symbol-to-string-registry');
+ var WellKnownSymbolsStore = shared('wks');
+ var QObject = global_1.QObject;
+ // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
+ var USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
+
+ // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
+ var setSymbolDescriptor = descriptors && fails(function () {
+ return objectCreate(nativeDefineProperty({}, 'a', {
+ get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }
+ })).a != 7;
+ }) ? function (O, P, Attributes) {
+ var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P);
+ if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];
+ nativeDefineProperty(O, P, Attributes);
+ if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {
+ nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor);
+ }
+ } : nativeDefineProperty;
+
+ var wrap = function (tag, description) {
+ var symbol = AllSymbols[tag] = objectCreate($Symbol[PROTOTYPE]);
+ setInternalState$3(symbol, {
+ type: SYMBOL,
+ tag: tag,
+ description: description
+ });
+ if (!descriptors) symbol.description = description;
+ return symbol;
+ };
+
+ var $defineProperty = function defineProperty(O, P, Attributes) {
+ if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);
+ anObject(O);
+ var key = toPropertyKey(P);
+ anObject(Attributes);
+ if (has$1(AllSymbols, key)) {
+ if (!Attributes.enumerable) {
+ if (!has$1(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {}));
+ O[HIDDEN][key] = true;
+ } else {
+ if (has$1(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;
+ Attributes = objectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });
+ } return setSymbolDescriptor(O, key, Attributes);
+ } return nativeDefineProperty(O, key, Attributes);
+ };
+
+ var $defineProperties = function defineProperties(O, Properties) {
+ anObject(O);
+ var properties = toIndexedObject(Properties);
+ var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));
+ $forEach(keys, function (key) {
+ if (!descriptors || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);
+ });
+ return O;
+ };
+
+ var $create = function create(O, Properties) {
+ return Properties === undefined ? objectCreate(O) : $defineProperties(objectCreate(O), Properties);
+ };
+
+ var $propertyIsEnumerable = function propertyIsEnumerable(V) {
+ var P = toPropertyKey(V);
+ var enumerable = nativePropertyIsEnumerable.call(this, P);
+ if (this === ObjectPrototype && has$1(AllSymbols, P) && !has$1(ObjectPrototypeSymbols, P)) return false;
+ return enumerable || !has$1(this, P) || !has$1(AllSymbols, P) || has$1(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;
+ };
+
+ var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {
+ var it = toIndexedObject(O);
+ var key = toPropertyKey(P);
+ if (it === ObjectPrototype && has$1(AllSymbols, key) && !has$1(ObjectPrototypeSymbols, key)) return;
+ var descriptor = nativeGetOwnPropertyDescriptor(it, key);
+ if (descriptor && has$1(AllSymbols, key) && !(has$1(it, HIDDEN) && it[HIDDEN][key])) {
+ descriptor.enumerable = true;
+ }
+ return descriptor;
+ };
+
+ var $getOwnPropertyNames = function getOwnPropertyNames(O) {
+ var names = nativeGetOwnPropertyNames(toIndexedObject(O));
+ var result = [];
+ $forEach(names, function (key) {
+ if (!has$1(AllSymbols, key) && !has$1(hiddenKeys$1, key)) result.push(key);
+ });
+ return result;
+ };
+
+ var $getOwnPropertySymbols = function getOwnPropertySymbols(O) {
+ var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;
+ var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));
+ var result = [];
+ $forEach(names, function (key) {
+ if (has$1(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has$1(ObjectPrototype, key))) {
+ result.push(AllSymbols[key]);
+ }
+ });
+ return result;
+ };
+
+ // `Symbol` constructor
+ // https://tc39.es/ecma262/#sec-symbol-constructor
+ if (!nativeSymbol$1) {
+ $Symbol = function Symbol() {
+ if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');
+ var description = !arguments.length || arguments[0] === undefined ? undefined : toString_1(arguments[0]);
+ var tag = uid(description);
+ var setter = function (value) {
+ if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);
+ if (has$1(this, HIDDEN) && has$1(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
+ setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));
+ };
+ if (descriptors && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });
+ return wrap(tag, description);
+ };
+
+ redefine($Symbol[PROTOTYPE], 'toString', function toString() {
+ return getInternalState$2(this).tag;
+ });
+
+ redefine($Symbol, 'withoutSetter', function (description) {
+ return wrap(uid(description), description);
+ });
+
+ objectPropertyIsEnumerable.f = $propertyIsEnumerable;
+ objectDefineProperty.f = $defineProperty;
+ objectGetOwnPropertyDescriptor.f = $getOwnPropertyDescriptor;
+ objectGetOwnPropertyNames.f = objectGetOwnPropertyNamesExternal.f = $getOwnPropertyNames;
+ objectGetOwnPropertySymbols.f = $getOwnPropertySymbols;
+
+ wellKnownSymbolWrapped.f = function (name) {
+ return wrap(wellKnownSymbol(name), name);
+ };
+
+ if (descriptors) {
+ // https://github.com/tc39/proposal-Symbol-description
+ nativeDefineProperty($Symbol[PROTOTYPE], 'description', {
+ configurable: true,
+ get: function description() {
+ return getInternalState$2(this).description;
+ }
+ });
+ {
+ redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });
+ }
+ }
+ }
+
+ _export({ global: true, wrap: true, forced: !nativeSymbol$1, sham: !nativeSymbol$1 }, {
+ Symbol: $Symbol
+ });
+
+ $forEach(objectKeys(WellKnownSymbolsStore), function (name) {
+ defineWellKnownSymbol(name);
+ });
+
+ _export({ target: SYMBOL, stat: true, forced: !nativeSymbol$1 }, {
+ // `Symbol.for` method
+ // https://tc39.es/ecma262/#sec-symbol.for
+ 'for': function (key) {
+ var string = toString_1(key);
+ if (has$1(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];
+ var symbol = $Symbol(string);
+ StringToSymbolRegistry[string] = symbol;
+ SymbolToStringRegistry[symbol] = string;
+ return symbol;
+ },
+ // `Symbol.keyFor` method
+ // https://tc39.es/ecma262/#sec-symbol.keyfor
+ keyFor: function keyFor(sym) {
+ if (!isSymbol$1(sym)) throw TypeError(sym + ' is not a symbol');
+ if (has$1(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];
+ },
+ useSetter: function () { USE_SETTER = true; },
+ useSimple: function () { USE_SETTER = false; }
+ });
+
+ _export({ target: 'Object', stat: true, forced: !nativeSymbol$1, sham: !descriptors }, {
+ // `Object.create` method
+ // https://tc39.es/ecma262/#sec-object.create
+ create: $create,
+ // `Object.defineProperty` method
+ // https://tc39.es/ecma262/#sec-object.defineproperty
+ defineProperty: $defineProperty,
+ // `Object.defineProperties` method
+ // https://tc39.es/ecma262/#sec-object.defineproperties
+ defineProperties: $defineProperties,
+ // `Object.getOwnPropertyDescriptor` method
+ // https://tc39.es/ecma262/#sec-object.getownpropertydescriptors
+ getOwnPropertyDescriptor: $getOwnPropertyDescriptor
+ });
+
+ _export({ target: 'Object', stat: true, forced: !nativeSymbol$1 }, {
+ // `Object.getOwnPropertyNames` method
+ // https://tc39.es/ecma262/#sec-object.getownpropertynames
+ getOwnPropertyNames: $getOwnPropertyNames,
+ // `Object.getOwnPropertySymbols` method
+ // https://tc39.es/ecma262/#sec-object.getownpropertysymbols
+ getOwnPropertySymbols: $getOwnPropertySymbols
+ });
+
+ // Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives
+ // https://bugs.chromium.org/p/v8/issues/detail?id=3443
+ _export({ target: 'Object', stat: true, forced: fails(function () { objectGetOwnPropertySymbols.f(1); }) }, {
+ getOwnPropertySymbols: function getOwnPropertySymbols(it) {
+ return objectGetOwnPropertySymbols.f(toObject(it));
+ }
+ });
+
+ // `JSON.stringify` method behavior with symbols
+ // https://tc39.es/ecma262/#sec-json.stringify
+ if ($stringify) {
+ var FORCED_JSON_STRINGIFY = !nativeSymbol$1 || fails(function () {
+ var symbol = $Symbol();
+ // MS Edge converts symbol values to JSON as {}
+ return $stringify([symbol]) != '[null]'
+ // WebKit converts symbol values to JSON as null
+ || $stringify({ a: symbol }) != '{}'
+ // V8 throws on boxed symbols
+ || $stringify(Object(symbol)) != '{}';
+ });
+
+ _export({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
+ stringify: function stringify(it, replacer, space) {
+ var args = [it];
+ var index = 1;
+ var $replacer;
+ while (arguments.length > index) args.push(arguments[index++]);
+ $replacer = replacer;
+ if (!isObject$1(replacer) && it === undefined || isSymbol$1(it)) return; // IE8 returns string on undefined
+ if (!isArray$3(replacer)) replacer = function (key, value) {
+ if (isCallable($replacer)) value = $replacer.call(this, key, value);
+ if (!isSymbol$1(value)) return value;
+ };
+ args[1] = replacer;
+ return $stringify.apply(null, args);
+ }
+ });
+ }
+
+ // `Symbol.prototype[@@toPrimitive]` method
+ // https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive
+ if (!$Symbol[PROTOTYPE][TO_PRIMITIVE]) {
+ var valueOf$1 = $Symbol[PROTOTYPE].valueOf;
+ redefine($Symbol[PROTOTYPE], TO_PRIMITIVE, function () {
+ return valueOf$1.apply(this, arguments);
+ });
+ }
+ // `Symbol.prototype[@@toStringTag]` property
+ // https://tc39.es/ecma262/#sec-symbol.prototype-@@tostringtag
+ setToStringTag($Symbol, SYMBOL);
+
+ hiddenKeys$1[HIDDEN] = true;
+
+ var defineProperty$2 = objectDefineProperty.f;
+
+
+ var NativeSymbol = global_1.Symbol;
+
+ if (descriptors && isCallable(NativeSymbol) && (!('description' in NativeSymbol.prototype) ||
+ // Safari 12 bug
+ NativeSymbol().description !== undefined
+ )) {
+ var EmptyStringDescriptionStore = {};
+ // wrap Symbol constructor for correct work with undefined description
+ var SymbolWrapper = function Symbol() {
+ var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);
+ var result = this instanceof SymbolWrapper
+ ? new NativeSymbol(description)
+ // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'
+ : description === undefined ? NativeSymbol() : NativeSymbol(description);
+ if (description === '') EmptyStringDescriptionStore[result] = true;
+ return result;
+ };
+ copyConstructorProperties(SymbolWrapper, NativeSymbol);
+ var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;
+ symbolPrototype.constructor = SymbolWrapper;
+
+ var symbolToString = symbolPrototype.toString;
+ var nativeSymbol = String(NativeSymbol('test')) == 'Symbol(test)';
+ var regexp = /^Symbol\((.*)\)[^)]+$/;
+ defineProperty$2(symbolPrototype, 'description', {
+ configurable: true,
+ get: function description() {
+ var symbol = isObject$1(this) ? this.valueOf() : this;
+ var string = symbolToString.call(symbol);
+ if (has$1(EmptyStringDescriptionStore, symbol)) return '';
+ var desc = nativeSymbol ? string.slice(7, -1) : string.replace(regexp, '$1');
+ return desc === '' ? undefined : desc;
+ }
+ });
+
+ _export({ global: true, forced: true }, {
+ Symbol: SymbolWrapper
+ });
+ }
+
+ // `Symbol.species` well-known symbol
+ // https://tc39.es/ecma262/#sec-symbol.species
+ defineWellKnownSymbol('species');
+
+ // `Array[@@species]` getter
+ // https://tc39.es/ecma262/#sec-get-array-@@species
+ setSpecies('Array');
+
+ // `Array.prototype.fill` method
+ // https://tc39.es/ecma262/#sec-array.prototype.fill
+ _export({ target: 'Array', proto: true }, {
+ fill: arrayFill
+ });
+
+ // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+ addToUnscopables('fill');
+
+ var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');
+
+ var SPECIES$1 = wellKnownSymbol('species');
+ var nativeSlice = [].slice;
+ var max = Math.max;
+
+ // `Array.prototype.slice` method
+ // https://tc39.es/ecma262/#sec-array.prototype.slice
+ // fallback for not array-like ES3 strings and DOM objects
+ _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {
+ slice: function slice(start, end) {
+ var O = toIndexedObject(this);
+ var length = toLength(O.length);
+ var k = toAbsoluteIndex(start, length);
+ var fin = toAbsoluteIndex(end === undefined ? length : end, length);
+ // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible
+ var Constructor, result, n;
+ if (isArray$3(O)) {
+ Constructor = O.constructor;
+ // cross-realm fallback
+ if (isConstructor(Constructor) && (Constructor === Array || isArray$3(Constructor.prototype))) {
+ Constructor = undefined;
+ } else if (isObject$1(Constructor)) {
+ Constructor = Constructor[SPECIES$1];
+ if (Constructor === null) Constructor = undefined;
+ }
+ if (Constructor === Array || Constructor === undefined) {
+ return nativeSlice.call(O, k, fin);
+ }
+ }
+ result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));
+ for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);
+ result.length = n;
+ return result;
+ }
+ });
+
+ var $includes = arrayIncludes.includes;
+
+
+ // `Array.prototype.includes` method
+ // https://tc39.es/ecma262/#sec-array.prototype.includes
+ _export({ target: 'Array', proto: true }, {
+ includes: function includes(el /* , fromIndex = 0 */) {
+ return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
+ }
+ });
+
+ // https://tc39.es/ecma262/#sec-array.prototype-@@unscopables
+ addToUnscopables('includes');
+
+ var notARegexp = function (it) {
+ if (isRegexp(it)) {
+ throw TypeError("The method doesn't accept regular expressions");
+ } return it;
+ };
+
+ var MATCH = wellKnownSymbol('match');
+
+ var correctIsRegexpLogic = function (METHOD_NAME) {
+ var regexp = /./;
+ try {
+ '/./'[METHOD_NAME](regexp);
+ } catch (error1) {
+ try {
+ regexp[MATCH] = false;
+ return '/./'[METHOD_NAME](regexp);
+ } catch (error2) { /* empty */ }
+ } return false;
+ };
+
+ // `String.prototype.includes` method
+ // https://tc39.es/ecma262/#sec-string.prototype.includes
+ _export({ target: 'String', proto: true, forced: !correctIsRegexpLogic('includes') }, {
+ includes: function includes(searchString /* , position = 0 */) {
+ return !!~toString_1(requireObjectCoercible(this))
+ .indexOf(toString_1(notARegexp(searchString)), arguments.length > 1 ? arguments[1] : undefined);
+ }
+ });
+
+ // `URL.prototype.toJSON` method
+ // https://url.spec.whatwg.org/#dom-url-tojson
+ _export({ target: 'URL', proto: true, enumerable: true }, {
+ toJSON: function toJSON() {
+ return URL.prototype.toString.call(this);
+ }
+ });
+
+ var PROPER_FUNCTION_NAME = functionName.PROPER;
+
+
+
+ var non = '\u200B\u0085\u180E';
+
+ // check that a method works with the correct list
+ // of whitespaces and has a correct name
+ var stringTrimForced = function (METHOD_NAME) {
+ return fails(function () {
+ return !!whitespaces[METHOD_NAME]()
+ || non[METHOD_NAME]() !== non
+ || (PROPER_FUNCTION_NAME && whitespaces[METHOD_NAME].name !== METHOD_NAME);
+ });
+ };
+
+ var $trim = stringTrim.trim;
+
+
+ // `String.prototype.trim` method
+ // https://tc39.es/ecma262/#sec-string.prototype.trim
+ _export({ target: 'String', proto: true, forced: stringTrimForced('trim') }, {
+ trim: function trim() {
+ return $trim(this);
+ }
+ });
+
+ var lookup$1 = [];
+ var revLookup$1 = [];
+ var Arr$1 = typeof Uint8Array !== 'undefined' ? Uint8Array : Array;
+ var inited$1 = false;
+
+ function init$1() {
+ inited$1 = true;
+ var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+
+ for (var i = 0, len = code.length; i < len; ++i) {
+ lookup$1[i] = code[i];
+ revLookup$1[code.charCodeAt(i)] = i;
+ }
+
+ revLookup$1['-'.charCodeAt(0)] = 62;
+ revLookup$1['_'.charCodeAt(0)] = 63;
+ }
+
+ function toByteArray$1(b64) {
+ if (!inited$1) {
+ init$1();
+ }
+
+ var i, j, l, tmp, placeHolders, arr;
+ var len = b64.length;
+
+ if (len % 4 > 0) {
+ throw new Error('Invalid string. Length must be a multiple of 4');
+ } // the number of equal signs (place holders)
+ // if there are two placeholders, than the two characters before it
+ // represent one byte
+ // if there is only one, then the three characters before it represent 2 bytes
+ // this is just a cheap hack to not do indexOf twice
+
+
+ placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0; // base64 is 4/3 + up to two characters of the original data
+
+ arr = new Arr$1(len * 3 / 4 - placeHolders); // if there are placeholders, only get up to the last complete 4 chars
+
+ l = placeHolders > 0 ? len - 4 : len;
+ var L = 0;
+
+ for (i = 0, j = 0; i < l; i += 4, j += 3) {
+ tmp = revLookup$1[b64.charCodeAt(i)] << 18 | revLookup$1[b64.charCodeAt(i + 1)] << 12 | revLookup$1[b64.charCodeAt(i + 2)] << 6 | revLookup$1[b64.charCodeAt(i + 3)];
+ arr[L++] = tmp >> 16 & 0xFF;
+ arr[L++] = tmp >> 8 & 0xFF;
+ arr[L++] = tmp & 0xFF;
+ }
+
+ if (placeHolders === 2) {
+ tmp = revLookup$1[b64.charCodeAt(i)] << 2 | revLookup$1[b64.charCodeAt(i + 1)] >> 4;
+ arr[L++] = tmp & 0xFF;
+ } else if (placeHolders === 1) {
+ tmp = revLookup$1[b64.charCodeAt(i)] << 10 | revLookup$1[b64.charCodeAt(i + 1)] << 4 | revLookup$1[b64.charCodeAt(i + 2)] >> 2;
+ arr[L++] = tmp >> 8 & 0xFF;
+ arr[L++] = tmp & 0xFF;
+ }
+
+ return arr;
+ }
+
+ function tripletToBase64$1(num) {
+ return lookup$1[num >> 18 & 0x3F] + lookup$1[num >> 12 & 0x3F] + lookup$1[num >> 6 & 0x3F] + lookup$1[num & 0x3F];
+ }
+
+ function encodeChunk$1(uint8, start, end) {
+ var tmp;
+ var output = [];
+
+ for (var i = start; i < end; i += 3) {
+ tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + uint8[i + 2];
+ output.push(tripletToBase64$1(tmp));
+ }
+
+ return output.join('');
+ }
+
+ function fromByteArray$1(uint8) {
+ if (!inited$1) {
+ init$1();
+ }
+
+ var tmp;
+ var len = uint8.length;
+ var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes
+
+ var output = '';
+ var parts = [];
+ var maxChunkLength = 16383; // must be multiple of 3
+ // go through the array every three bytes, we'll deal with trailing stuff later
+
+ for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
+ parts.push(encodeChunk$1(uint8, i, i + maxChunkLength > len2 ? len2 : i + maxChunkLength));
+ } // pad the end with zeros, but make sure to not forget the extra bytes
+
+
+ if (extraBytes === 1) {
+ tmp = uint8[len - 1];
+ output += lookup$1[tmp >> 2];
+ output += lookup$1[tmp << 4 & 0x3F];
+ output += '==';
+ } else if (extraBytes === 2) {
+ tmp = (uint8[len - 2] << 8) + uint8[len - 1];
+ output += lookup$1[tmp >> 10];
+ output += lookup$1[tmp >> 4 & 0x3F];
+ output += lookup$1[tmp << 2 & 0x3F];
+ output += '=';
+ }
+
+ parts.push(output);
+ return parts.join('');
+ }
+
+ function read$1(buffer, offset, isLE, mLen, nBytes) {
+ var e, m;
+ var eLen = nBytes * 8 - mLen - 1;
+ var eMax = (1 << eLen) - 1;
+ var eBias = eMax >> 1;
+ var nBits = -7;
+ var i = isLE ? nBytes - 1 : 0;
+ var d = isLE ? -1 : 1;
+ var s = buffer[offset + i];
+ i += d;
+ e = s & (1 << -nBits) - 1;
+ s >>= -nBits;
+ nBits += eLen;
+
+ for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
+
+ m = e & (1 << -nBits) - 1;
+ e >>= -nBits;
+ nBits += mLen;
+
+ for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
+
+ if (e === 0) {
+ e = 1 - eBias;
+ } else if (e === eMax) {
+ return m ? NaN : (s ? -1 : 1) * Infinity;
+ } else {
+ m = m + Math.pow(2, mLen);
+ e = e - eBias;
+ }
+
+ return (s ? -1 : 1) * m * Math.pow(2, e - mLen);
+ }
+ function write$1(buffer, value, offset, isLE, mLen, nBytes) {
+ var e, m, c;
+ var eLen = nBytes * 8 - mLen - 1;
+ var eMax = (1 << eLen) - 1;
+ var eBias = eMax >> 1;
+ var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0;
+ var i = isLE ? 0 : nBytes - 1;
+ var d = isLE ? 1 : -1;
+ var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;
+ value = Math.abs(value);
+
+ if (isNaN(value) || value === Infinity) {
+ m = isNaN(value) ? 1 : 0;
+ e = eMax;
+ } else {
+ e = Math.floor(Math.log(value) / Math.LN2);
+
+ if (value * (c = Math.pow(2, -e)) < 1) {
+ e--;
+ c *= 2;
+ }
+
+ if (e + eBias >= 1) {
+ value += rt / c;
+ } else {
+ value += rt * Math.pow(2, 1 - eBias);
+ }
+
+ if (value * c >= 2) {
+ e++;
+ c /= 2;
+ }
+
+ if (e + eBias >= eMax) {
+ m = 0;
+ e = eMax;
+ } else if (e + eBias >= 1) {
+ m = (value * c - 1) * Math.pow(2, mLen);
+ e = e + eBias;
+ } else {
+ m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
+ e = 0;
+ }
+ }
+
+ for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
+
+ e = e << mLen | m;
+ eLen += mLen;
+
+ for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
+
+ buffer[offset + i - d] |= s * 128;
+ }
+
+ var toString$2 = {}.toString;
+ var isArray$2 = Array.isArray || function (arr) {
+ return toString$2.call(arr) == '[object Array]';
+ };
+
+ var INSPECT_MAX_BYTES$1 = 50;
+ /**
+ * If `Buffer.TYPED_ARRAY_SUPPORT`:
+ * === true Use Uint8Array implementation (fastest)
+ * === false Use Object implementation (most compatible, even IE6)
+ *
+ * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
+ * Opera 11.6+, iOS 4.2+.
+ *
+ * Due to various browser bugs, sometimes the Object implementation will be used even
+ * when the browser supports typed arrays.
+ *
+ * Note:
+ *
+ * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
+ * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
+ *
+ * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
+ *
+ * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
+ * incorrect length in some situations.
+
+ * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
+ * get the Object implementation, which is slower but behaves correctly.
+ */
+
+ Buffer$1.TYPED_ARRAY_SUPPORT = global$1.TYPED_ARRAY_SUPPORT !== undefined ? global$1.TYPED_ARRAY_SUPPORT : true;
+
+ function kMaxLength$1() {
+ return Buffer$1.TYPED_ARRAY_SUPPORT ? 0x7fffffff : 0x3fffffff;
+ }
+
+ function createBuffer$1(that, length) {
+ if (kMaxLength$1() < length) {
+ throw new RangeError('Invalid typed array length');
+ }
+
+ if (Buffer$1.TYPED_ARRAY_SUPPORT) {
+ // Return an augmented `Uint8Array` instance, for best performance
+ that = new Uint8Array(length);
+ that.__proto__ = Buffer$1.prototype;
+ } else {
+ // Fallback: Return an object instance of the Buffer class
+ if (that === null) {
+ that = new Buffer$1(length);
+ }
+
+ that.length = length;
+ }
+
+ return that;
+ }
+ /**
+ * The Buffer constructor returns instances of `Uint8Array` that have their
+ * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
+ * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
+ * and the `Uint8Array` methods. Square bracket notation works as expected -- it
+ * returns a single octet.
+ *
+ * The `Uint8Array` prototype remains unmodified.
+ */
+
+
+ function Buffer$1(arg, encodingOrOffset, length) {
+ if (!Buffer$1.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer$1)) {
+ return new Buffer$1(arg, encodingOrOffset, length);
+ } // Common case.
+
+
+ if (typeof arg === 'number') {
+ if (typeof encodingOrOffset === 'string') {
+ throw new Error('If encoding is specified then the first argument must be a string');
+ }
+
+ return allocUnsafe$1(this, arg);
+ }
+
+ return from$1(this, arg, encodingOrOffset, length);
+ }
+ Buffer$1.poolSize = 8192; // not used by this implementation
+ // TODO: Legacy, not needed anymore. Remove in next major version.
+
+ Buffer$1._augment = function (arr) {
+ arr.__proto__ = Buffer$1.prototype;
+ return arr;
+ };
+
+ function from$1(that, value, encodingOrOffset, length) {
+ if (typeof value === 'number') {
+ throw new TypeError('"value" argument must not be a number');
+ }
+
+ if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
+ return fromArrayBuffer$1(that, value, encodingOrOffset, length);
+ }
+
+ if (typeof value === 'string') {
+ return fromString$1(that, value, encodingOrOffset);
+ }
+
+ return fromObject$1(that, value);
+ }
+ /**
+ * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
+ * if value is a number.
+ * Buffer.from(str[, encoding])
+ * Buffer.from(array)
+ * Buffer.from(buffer)
+ * Buffer.from(arrayBuffer[, byteOffset[, length]])
+ **/
+
+
+ Buffer$1.from = function (value, encodingOrOffset, length) {
+ return from$1(null, value, encodingOrOffset, length);
+ };
+
+ if (Buffer$1.TYPED_ARRAY_SUPPORT) {
+ Buffer$1.prototype.__proto__ = Uint8Array.prototype;
+ Buffer$1.__proto__ = Uint8Array;
+ }
+
+ function assertSize$1(size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('"size" argument must be a number');
+ } else if (size < 0) {
+ throw new RangeError('"size" argument must not be negative');
+ }
+ }
+
+ function alloc$1(that, size, fill, encoding) {
+ assertSize$1(size);
+
+ if (size <= 0) {
+ return createBuffer$1(that, size);
+ }
+
+ if (fill !== undefined) {
+ // Only pay attention to encoding if it's a string. This
+ // prevents accidentally sending in a number that would
+ // be interpretted as a start offset.
+ return typeof encoding === 'string' ? createBuffer$1(that, size).fill(fill, encoding) : createBuffer$1(that, size).fill(fill);
+ }
+
+ return createBuffer$1(that, size);
+ }
+ /**
+ * Creates a new filled Buffer instance.
+ * alloc(size[, fill[, encoding]])
+ **/
+
+
+ Buffer$1.alloc = function (size, fill, encoding) {
+ return alloc$1(null, size, fill, encoding);
+ };
+
+ function allocUnsafe$1(that, size) {
+ assertSize$1(size);
+ that = createBuffer$1(that, size < 0 ? 0 : checked$1(size) | 0);
+
+ if (!Buffer$1.TYPED_ARRAY_SUPPORT) {
+ for (var i = 0; i < size; ++i) {
+ that[i] = 0;
+ }
+ }
+
+ return that;
+ }
+ /**
+ * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
+ * */
+
+
+ Buffer$1.allocUnsafe = function (size) {
+ return allocUnsafe$1(null, size);
+ };
+ /**
+ * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
+ */
+
+
+ Buffer$1.allocUnsafeSlow = function (size) {
+ return allocUnsafe$1(null, size);
+ };
+
+ function fromString$1(that, string, encoding) {
+ if (typeof encoding !== 'string' || encoding === '') {
+ encoding = 'utf8';
+ }
+
+ if (!Buffer$1.isEncoding(encoding)) {
+ throw new TypeError('"encoding" must be a valid string encoding');
+ }
+
+ var length = byteLength$1(string, encoding) | 0;
+ that = createBuffer$1(that, length);
+ var actual = that.write(string, encoding);
+
+ if (actual !== length) {
+ // Writing a hex string, for example, that contains invalid characters will
+ // cause everything after the first invalid character to be ignored. (e.g.
+ // 'abxxcd' will be treated as 'ab')
+ that = that.slice(0, actual);
+ }
+
+ return that;
+ }
+
+ function fromArrayLike$1(that, array) {
+ var length = array.length < 0 ? 0 : checked$1(array.length) | 0;
+ that = createBuffer$1(that, length);
+
+ for (var i = 0; i < length; i += 1) {
+ that[i] = array[i] & 255;
+ }
+
+ return that;
+ }
+
+ function fromArrayBuffer$1(that, array, byteOffset, length) {
+ array.byteLength; // this throws if `array` is not a valid ArrayBuffer
+
+ if (byteOffset < 0 || array.byteLength < byteOffset) {
+ throw new RangeError('\'offset\' is out of bounds');
+ }
+
+ if (array.byteLength < byteOffset + (length || 0)) {
+ throw new RangeError('\'length\' is out of bounds');
+ }
+
+ if (byteOffset === undefined && length === undefined) {
+ array = new Uint8Array(array);
+ } else if (length === undefined) {
+ array = new Uint8Array(array, byteOffset);
+ } else {
+ array = new Uint8Array(array, byteOffset, length);
+ }
+
+ if (Buffer$1.TYPED_ARRAY_SUPPORT) {
+ // Return an augmented `Uint8Array` instance, for best performance
+ that = array;
+ that.__proto__ = Buffer$1.prototype;
+ } else {
+ // Fallback: Return an object instance of the Buffer class
+ that = fromArrayLike$1(that, array);
+ }
+
+ return that;
+ }
+
+ function fromObject$1(that, obj) {
+ if (internalIsBuffer$1(obj)) {
+ var len = checked$1(obj.length) | 0;
+ that = createBuffer$1(that, len);
+
+ if (that.length === 0) {
+ return that;
+ }
+
+ obj.copy(that, 0, 0, len);
+ return that;
+ }
+
+ if (obj) {
+ if (typeof ArrayBuffer !== 'undefined' && obj.buffer instanceof ArrayBuffer || 'length' in obj) {
+ if (typeof obj.length !== 'number' || isnan$1(obj.length)) {
+ return createBuffer$1(that, 0);
+ }
+
+ return fromArrayLike$1(that, obj);
+ }
+
+ if (obj.type === 'Buffer' && isArray$2(obj.data)) {
+ return fromArrayLike$1(that, obj.data);
+ }
+ }
+
+ throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.');
+ }
+
+ function checked$1(length) {
+ // Note: cannot use `length < kMaxLength()` here because that fails when
+ // length is NaN (which is otherwise coerced to zero.)
+ if (length >= kMaxLength$1()) {
+ throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 'size: 0x' + kMaxLength$1().toString(16) + ' bytes');
+ }
+
+ return length | 0;
+ }
+ Buffer$1.isBuffer = isBuffer$2;
+
+ function internalIsBuffer$1(b) {
+ return !!(b != null && b._isBuffer);
+ }
+
+ Buffer$1.compare = function compare(a, b) {
+ if (!internalIsBuffer$1(a) || !internalIsBuffer$1(b)) {
+ throw new TypeError('Arguments must be Buffers');
+ }
+
+ if (a === b) return 0;
+ var x = a.length;
+ var y = b.length;
+
+ for (var i = 0, len = Math.min(x, y); i < len; ++i) {
+ if (a[i] !== b[i]) {
+ x = a[i];
+ y = b[i];
+ break;
+ }
+ }
+
+ if (x < y) return -1;
+ if (y < x) return 1;
+ return 0;
+ };
+
+ Buffer$1.isEncoding = function isEncoding(encoding) {
+ switch (String(encoding).toLowerCase()) {
+ case 'hex':
+ case 'utf8':
+ case 'utf-8':
+ case 'ascii':
+ case 'latin1':
+ case 'binary':
+ case 'base64':
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return true;
+
+ default:
+ return false;
+ }
+ };
+
+ Buffer$1.concat = function concat(list, length) {
+ if (!isArray$2(list)) {
+ throw new TypeError('"list" argument must be an Array of Buffers');
+ }
+
+ if (list.length === 0) {
+ return Buffer$1.alloc(0);
+ }
+
+ var i;
+
+ if (length === undefined) {
+ length = 0;
+
+ for (i = 0; i < list.length; ++i) {
+ length += list[i].length;
+ }
+ }
+
+ var buffer = Buffer$1.allocUnsafe(length);
+ var pos = 0;
+
+ for (i = 0; i < list.length; ++i) {
+ var buf = list[i];
+
+ if (!internalIsBuffer$1(buf)) {
+ throw new TypeError('"list" argument must be an Array of Buffers');
+ }
+
+ buf.copy(buffer, pos);
+ pos += buf.length;
+ }
+
+ return buffer;
+ };
+
+ function byteLength$1(string, encoding) {
+ if (internalIsBuffer$1(string)) {
+ return string.length;
+ }
+
+ if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
+ return string.byteLength;
+ }
+
+ if (typeof string !== 'string') {
+ string = '' + string;
+ }
+
+ var len = string.length;
+ if (len === 0) return 0; // Use a for loop to avoid recursion
+
+ var loweredCase = false;
+
+ for (;;) {
+ switch (encoding) {
+ case 'ascii':
+ case 'latin1':
+ case 'binary':
+ return len;
+
+ case 'utf8':
+ case 'utf-8':
+ case undefined:
+ return utf8ToBytes$1(string).length;
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return len * 2;
+
+ case 'hex':
+ return len >>> 1;
+
+ case 'base64':
+ return base64ToBytes$1(string).length;
+
+ default:
+ if (loweredCase) return utf8ToBytes$1(string).length; // assume utf8
+
+ encoding = ('' + encoding).toLowerCase();
+ loweredCase = true;
+ }
+ }
+ }
+
+ Buffer$1.byteLength = byteLength$1;
+
+ function slowToString$1(encoding, start, end) {
+ var loweredCase = false; // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
+ // property of a typed array.
+ // This behaves neither like String nor Uint8Array in that we set start/end
+ // to their upper/lower bounds if the value passed is out of range.
+ // undefined is handled specially as per ECMA-262 6th Edition,
+ // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
+
+ if (start === undefined || start < 0) {
+ start = 0;
+ } // Return early if start > this.length. Done here to prevent potential uint32
+ // coercion fail below.
+
+
+ if (start > this.length) {
+ return '';
+ }
+
+ if (end === undefined || end > this.length) {
+ end = this.length;
+ }
+
+ if (end <= 0) {
+ return '';
+ } // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
+
+
+ end >>>= 0;
+ start >>>= 0;
+
+ if (end <= start) {
+ return '';
+ }
+
+ if (!encoding) encoding = 'utf8';
+
+ while (true) {
+ switch (encoding) {
+ case 'hex':
+ return hexSlice$1(this, start, end);
+
+ case 'utf8':
+ case 'utf-8':
+ return utf8Slice$1(this, start, end);
+
+ case 'ascii':
+ return asciiSlice$1(this, start, end);
+
+ case 'latin1':
+ case 'binary':
+ return latin1Slice$1(this, start, end);
+
+ case 'base64':
+ return base64Slice$1(this, start, end);
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return utf16leSlice$1(this, start, end);
+
+ default:
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding);
+ encoding = (encoding + '').toLowerCase();
+ loweredCase = true;
+ }
+ }
+ } // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
+ // Buffer instances.
+
+
+ Buffer$1.prototype._isBuffer = true;
+
+ function swap$1(b, n, m) {
+ var i = b[n];
+ b[n] = b[m];
+ b[m] = i;
+ }
+
+ Buffer$1.prototype.swap16 = function swap16() {
+ var len = this.length;
+
+ if (len % 2 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 16-bits');
+ }
+
+ for (var i = 0; i < len; i += 2) {
+ swap$1(this, i, i + 1);
+ }
+
+ return this;
+ };
+
+ Buffer$1.prototype.swap32 = function swap32() {
+ var len = this.length;
+
+ if (len % 4 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 32-bits');
+ }
+
+ for (var i = 0; i < len; i += 4) {
+ swap$1(this, i, i + 3);
+ swap$1(this, i + 1, i + 2);
+ }
+
+ return this;
+ };
+
+ Buffer$1.prototype.swap64 = function swap64() {
+ var len = this.length;
+
+ if (len % 8 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 64-bits');
+ }
+
+ for (var i = 0; i < len; i += 8) {
+ swap$1(this, i, i + 7);
+ swap$1(this, i + 1, i + 6);
+ swap$1(this, i + 2, i + 5);
+ swap$1(this, i + 3, i + 4);
+ }
+
+ return this;
+ };
+
+ Buffer$1.prototype.toString = function toString() {
+ var length = this.length | 0;
+ if (length === 0) return '';
+ if (arguments.length === 0) return utf8Slice$1(this, 0, length);
+ return slowToString$1.apply(this, arguments);
+ };
+
+ Buffer$1.prototype.equals = function equals(b) {
+ if (!internalIsBuffer$1(b)) throw new TypeError('Argument must be a Buffer');
+ if (this === b) return true;
+ return Buffer$1.compare(this, b) === 0;
+ };
+
+ Buffer$1.prototype.inspect = function inspect() {
+ var str = '';
+ var max = INSPECT_MAX_BYTES$1;
+
+ if (this.length > 0) {
+ str = this.toString('hex', 0, max).match(/.{2}/g).join(' ');
+ if (this.length > max) str += ' ... ';
+ }
+
+ return '';
+ };
+
+ Buffer$1.prototype.compare = function compare(target, start, end, thisStart, thisEnd) {
+ if (!internalIsBuffer$1(target)) {
+ throw new TypeError('Argument must be a Buffer');
+ }
+
+ if (start === undefined) {
+ start = 0;
+ }
+
+ if (end === undefined) {
+ end = target ? target.length : 0;
+ }
+
+ if (thisStart === undefined) {
+ thisStart = 0;
+ }
+
+ if (thisEnd === undefined) {
+ thisEnd = this.length;
+ }
+
+ if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
+ throw new RangeError('out of range index');
+ }
+
+ if (thisStart >= thisEnd && start >= end) {
+ return 0;
+ }
+
+ if (thisStart >= thisEnd) {
+ return -1;
+ }
+
+ if (start >= end) {
+ return 1;
+ }
+
+ start >>>= 0;
+ end >>>= 0;
+ thisStart >>>= 0;
+ thisEnd >>>= 0;
+ if (this === target) return 0;
+ var x = thisEnd - thisStart;
+ var y = end - start;
+ var len = Math.min(x, y);
+ var thisCopy = this.slice(thisStart, thisEnd);
+ var targetCopy = target.slice(start, end);
+
+ for (var i = 0; i < len; ++i) {
+ if (thisCopy[i] !== targetCopy[i]) {
+ x = thisCopy[i];
+ y = targetCopy[i];
+ break;
+ }
+ }
+
+ if (x < y) return -1;
+ if (y < x) return 1;
+ return 0;
+ }; // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
+ // OR the last index of `val` in `buffer` at offset <= `byteOffset`.
+ //
+ // Arguments:
+ // - buffer - a Buffer to search
+ // - val - a string, Buffer, or number
+ // - byteOffset - an index into `buffer`; will be clamped to an int32
+ // - encoding - an optional encoding, relevant is val is a string
+ // - dir - true for indexOf, false for lastIndexOf
+
+
+ function bidirectionalIndexOf$1(buffer, val, byteOffset, encoding, dir) {
+ // Empty buffer means no match
+ if (buffer.length === 0) return -1; // Normalize byteOffset
+
+ if (typeof byteOffset === 'string') {
+ encoding = byteOffset;
+ byteOffset = 0;
+ } else if (byteOffset > 0x7fffffff) {
+ byteOffset = 0x7fffffff;
+ } else if (byteOffset < -0x80000000) {
+ byteOffset = -0x80000000;
+ }
+
+ byteOffset = +byteOffset; // Coerce to Number.
+
+ if (isNaN(byteOffset)) {
+ // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
+ byteOffset = dir ? 0 : buffer.length - 1;
+ } // Normalize byteOffset: negative offsets start from the end of the buffer
+
+
+ if (byteOffset < 0) byteOffset = buffer.length + byteOffset;
+
+ if (byteOffset >= buffer.length) {
+ if (dir) return -1;else byteOffset = buffer.length - 1;
+ } else if (byteOffset < 0) {
+ if (dir) byteOffset = 0;else return -1;
+ } // Normalize val
+
+
+ if (typeof val === 'string') {
+ val = Buffer$1.from(val, encoding);
+ } // Finally, search either indexOf (if dir is true) or lastIndexOf
+
+
+ if (internalIsBuffer$1(val)) {
+ // Special case: looking for empty string/buffer always fails
+ if (val.length === 0) {
+ return -1;
+ }
+
+ return arrayIndexOf$1(buffer, val, byteOffset, encoding, dir);
+ } else if (typeof val === 'number') {
+ val = val & 0xFF; // Search for a byte value [0-255]
+
+ if (Buffer$1.TYPED_ARRAY_SUPPORT && typeof Uint8Array.prototype.indexOf === 'function') {
+ if (dir) {
+ return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset);
+ } else {
+ return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset);
+ }
+ }
+
+ return arrayIndexOf$1(buffer, [val], byteOffset, encoding, dir);
+ }
+
+ throw new TypeError('val must be string, number or Buffer');
+ }
+
+ function arrayIndexOf$1(arr, val, byteOffset, encoding, dir) {
+ var indexSize = 1;
+ var arrLength = arr.length;
+ var valLength = val.length;
+
+ if (encoding !== undefined) {
+ encoding = String(encoding).toLowerCase();
+
+ if (encoding === 'ucs2' || encoding === 'ucs-2' || encoding === 'utf16le' || encoding === 'utf-16le') {
+ if (arr.length < 2 || val.length < 2) {
+ return -1;
+ }
+
+ indexSize = 2;
+ arrLength /= 2;
+ valLength /= 2;
+ byteOffset /= 2;
+ }
+ }
+
+ function read(buf, i) {
+ if (indexSize === 1) {
+ return buf[i];
+ } else {
+ return buf.readUInt16BE(i * indexSize);
+ }
+ }
+
+ var i;
+
+ if (dir) {
+ var foundIndex = -1;
+
+ for (i = byteOffset; i < arrLength; i++) {
+ if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
+ if (foundIndex === -1) foundIndex = i;
+ if (i - foundIndex + 1 === valLength) return foundIndex * indexSize;
+ } else {
+ if (foundIndex !== -1) i -= i - foundIndex;
+ foundIndex = -1;
+ }
+ }
+ } else {
+ if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength;
+
+ for (i = byteOffset; i >= 0; i--) {
+ var found = true;
+
+ for (var j = 0; j < valLength; j++) {
+ if (read(arr, i + j) !== read(val, j)) {
+ found = false;
+ break;
+ }
+ }
+
+ if (found) return i;
+ }
+ }
+
+ return -1;
+ }
+
+ Buffer$1.prototype.includes = function includes(val, byteOffset, encoding) {
+ return this.indexOf(val, byteOffset, encoding) !== -1;
+ };
+
+ Buffer$1.prototype.indexOf = function indexOf(val, byteOffset, encoding) {
+ return bidirectionalIndexOf$1(this, val, byteOffset, encoding, true);
+ };
+
+ Buffer$1.prototype.lastIndexOf = function lastIndexOf(val, byteOffset, encoding) {
+ return bidirectionalIndexOf$1(this, val, byteOffset, encoding, false);
+ };
+
+ function hexWrite$1(buf, string, offset, length) {
+ offset = Number(offset) || 0;
+ var remaining = buf.length - offset;
+
+ if (!length) {
+ length = remaining;
+ } else {
+ length = Number(length);
+
+ if (length > remaining) {
+ length = remaining;
+ }
+ } // must be an even number of digits
+
+
+ var strLen = string.length;
+ if (strLen % 2 !== 0) throw new TypeError('Invalid hex string');
+
+ if (length > strLen / 2) {
+ length = strLen / 2;
+ }
+
+ for (var i = 0; i < length; ++i) {
+ var parsed = parseInt(string.substr(i * 2, 2), 16);
+ if (isNaN(parsed)) return i;
+ buf[offset + i] = parsed;
+ }
+
+ return i;
+ }
+
+ function utf8Write$1(buf, string, offset, length) {
+ return blitBuffer$1(utf8ToBytes$1(string, buf.length - offset), buf, offset, length);
+ }
+
+ function asciiWrite$1(buf, string, offset, length) {
+ return blitBuffer$1(asciiToBytes$1(string), buf, offset, length);
+ }
+
+ function latin1Write$1(buf, string, offset, length) {
+ return asciiWrite$1(buf, string, offset, length);
+ }
+
+ function base64Write$1(buf, string, offset, length) {
+ return blitBuffer$1(base64ToBytes$1(string), buf, offset, length);
+ }
+
+ function ucs2Write$1(buf, string, offset, length) {
+ return blitBuffer$1(utf16leToBytes$1(string, buf.length - offset), buf, offset, length);
+ }
+
+ Buffer$1.prototype.write = function write(string, offset, length, encoding) {
+ // Buffer#write(string)
+ if (offset === undefined) {
+ encoding = 'utf8';
+ length = this.length;
+ offset = 0; // Buffer#write(string, encoding)
+ } else if (length === undefined && typeof offset === 'string') {
+ encoding = offset;
+ length = this.length;
+ offset = 0; // Buffer#write(string, offset[, length][, encoding])
+ } else if (isFinite(offset)) {
+ offset = offset | 0;
+
+ if (isFinite(length)) {
+ length = length | 0;
+ if (encoding === undefined) encoding = 'utf8';
+ } else {
+ encoding = length;
+ length = undefined;
+ } // legacy write(string, encoding, offset, length) - remove in v0.13
+
+ } else {
+ throw new Error('Buffer.write(string, encoding, offset[, length]) is no longer supported');
+ }
+
+ var remaining = this.length - offset;
+ if (length === undefined || length > remaining) length = remaining;
+
+ if (string.length > 0 && (length < 0 || offset < 0) || offset > this.length) {
+ throw new RangeError('Attempt to write outside buffer bounds');
+ }
+
+ if (!encoding) encoding = 'utf8';
+ var loweredCase = false;
+
+ for (;;) {
+ switch (encoding) {
+ case 'hex':
+ return hexWrite$1(this, string, offset, length);
+
+ case 'utf8':
+ case 'utf-8':
+ return utf8Write$1(this, string, offset, length);
+
+ case 'ascii':
+ return asciiWrite$1(this, string, offset, length);
+
+ case 'latin1':
+ case 'binary':
+ return latin1Write$1(this, string, offset, length);
+
+ case 'base64':
+ // Warning: maxLength not taken into account in base64Write
+ return base64Write$1(this, string, offset, length);
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return ucs2Write$1(this, string, offset, length);
+
+ default:
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding);
+ encoding = ('' + encoding).toLowerCase();
+ loweredCase = true;
+ }
+ }
+ };
+
+ Buffer$1.prototype.toJSON = function toJSON() {
+ return {
+ type: 'Buffer',
+ data: Array.prototype.slice.call(this._arr || this, 0)
+ };
+ };
+
+ function base64Slice$1(buf, start, end) {
+ if (start === 0 && end === buf.length) {
+ return fromByteArray$1(buf);
+ } else {
+ return fromByteArray$1(buf.slice(start, end));
+ }
+ }
+
+ function utf8Slice$1(buf, start, end) {
+ end = Math.min(buf.length, end);
+ var res = [];
+ var i = start;
+
+ while (i < end) {
+ var firstByte = buf[i];
+ var codePoint = null;
+ var bytesPerSequence = firstByte > 0xEF ? 4 : firstByte > 0xDF ? 3 : firstByte > 0xBF ? 2 : 1;
+
+ if (i + bytesPerSequence <= end) {
+ var secondByte, thirdByte, fourthByte, tempCodePoint;
+
+ switch (bytesPerSequence) {
+ case 1:
+ if (firstByte < 0x80) {
+ codePoint = firstByte;
+ }
+
+ break;
+
+ case 2:
+ secondByte = buf[i + 1];
+
+ if ((secondByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0x1F) << 0x6 | secondByte & 0x3F;
+
+ if (tempCodePoint > 0x7F) {
+ codePoint = tempCodePoint;
+ }
+ }
+
+ break;
+
+ case 3:
+ secondByte = buf[i + 1];
+ thirdByte = buf[i + 2];
+
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | thirdByte & 0x3F;
+
+ if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
+ codePoint = tempCodePoint;
+ }
+ }
+
+ break;
+
+ case 4:
+ secondByte = buf[i + 1];
+ thirdByte = buf[i + 2];
+ fourthByte = buf[i + 3];
+
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | fourthByte & 0x3F;
+
+ if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
+ codePoint = tempCodePoint;
+ }
+ }
+
+ }
+ }
+
+ if (codePoint === null) {
+ // we did not generate a valid codePoint so insert a
+ // replacement char (U+FFFD) and advance only 1 byte
+ codePoint = 0xFFFD;
+ bytesPerSequence = 1;
+ } else if (codePoint > 0xFFFF) {
+ // encode to utf16 (surrogate pair dance)
+ codePoint -= 0x10000;
+ res.push(codePoint >>> 10 & 0x3FF | 0xD800);
+ codePoint = 0xDC00 | codePoint & 0x3FF;
+ }
+
+ res.push(codePoint);
+ i += bytesPerSequence;
+ }
+
+ return decodeCodePointsArray$1(res);
+ } // Based on http://stackoverflow.com/a/22747272/680742, the browser with
+ // the lowest limit is Chrome, with 0x10000 args.
+ // We go 1 magnitude less, for safety
+
+
+ var MAX_ARGUMENTS_LENGTH$1 = 0x1000;
+
+ function decodeCodePointsArray$1(codePoints) {
+ var len = codePoints.length;
+
+ if (len <= MAX_ARGUMENTS_LENGTH$1) {
+ return String.fromCharCode.apply(String, codePoints); // avoid extra slice()
+ } // Decode in chunks to avoid "call stack size exceeded".
+
+
+ var res = '';
+ var i = 0;
+
+ while (i < len) {
+ res += String.fromCharCode.apply(String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH$1));
+ }
+
+ return res;
+ }
+
+ function asciiSlice$1(buf, start, end) {
+ var ret = '';
+ end = Math.min(buf.length, end);
+
+ for (var i = start; i < end; ++i) {
+ ret += String.fromCharCode(buf[i] & 0x7F);
+ }
+
+ return ret;
+ }
+
+ function latin1Slice$1(buf, start, end) {
+ var ret = '';
+ end = Math.min(buf.length, end);
+
+ for (var i = start; i < end; ++i) {
+ ret += String.fromCharCode(buf[i]);
+ }
+
+ return ret;
+ }
+
+ function hexSlice$1(buf, start, end) {
+ var len = buf.length;
+ if (!start || start < 0) start = 0;
+ if (!end || end < 0 || end > len) end = len;
+ var out = '';
+
+ for (var i = start; i < end; ++i) {
+ out += toHex$1(buf[i]);
+ }
+
+ return out;
+ }
+
+ function utf16leSlice$1(buf, start, end) {
+ var bytes = buf.slice(start, end);
+ var res = '';
+
+ for (var i = 0; i < bytes.length; i += 2) {
+ res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256);
+ }
+
+ return res;
+ }
+
+ Buffer$1.prototype.slice = function slice(start, end) {
+ var len = this.length;
+ start = ~~start;
+ end = end === undefined ? len : ~~end;
+
+ if (start < 0) {
+ start += len;
+ if (start < 0) start = 0;
+ } else if (start > len) {
+ start = len;
+ }
+
+ if (end < 0) {
+ end += len;
+ if (end < 0) end = 0;
+ } else if (end > len) {
+ end = len;
+ }
+
+ if (end < start) end = start;
+ var newBuf;
+
+ if (Buffer$1.TYPED_ARRAY_SUPPORT) {
+ newBuf = this.subarray(start, end);
+ newBuf.__proto__ = Buffer$1.prototype;
+ } else {
+ var sliceLen = end - start;
+ newBuf = new Buffer$1(sliceLen, undefined);
+
+ for (var i = 0; i < sliceLen; ++i) {
+ newBuf[i] = this[i + start];
+ }
+ }
+
+ return newBuf;
+ };
+ /*
+ * Need to make sure that buffer isn't trying to write out of bounds.
+ */
+
+
+ function checkOffset$1(offset, ext, length) {
+ if (offset % 1 !== 0 || offset < 0) throw new RangeError('offset is not uint');
+ if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length');
+ }
+
+ Buffer$1.prototype.readUIntLE = function readUIntLE(offset, byteLength, noAssert) {
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+ if (!noAssert) checkOffset$1(offset, byteLength, this.length);
+ var val = this[offset];
+ var mul = 1;
+ var i = 0;
+
+ while (++i < byteLength && (mul *= 0x100)) {
+ val += this[offset + i] * mul;
+ }
+
+ return val;
+ };
+
+ Buffer$1.prototype.readUIntBE = function readUIntBE(offset, byteLength, noAssert) {
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+
+ if (!noAssert) {
+ checkOffset$1(offset, byteLength, this.length);
+ }
+
+ var val = this[offset + --byteLength];
+ var mul = 1;
+
+ while (byteLength > 0 && (mul *= 0x100)) {
+ val += this[offset + --byteLength] * mul;
+ }
+
+ return val;
+ };
+
+ Buffer$1.prototype.readUInt8 = function readUInt8(offset, noAssert) {
+ if (!noAssert) checkOffset$1(offset, 1, this.length);
+ return this[offset];
+ };
+
+ Buffer$1.prototype.readUInt16LE = function readUInt16LE(offset, noAssert) {
+ if (!noAssert) checkOffset$1(offset, 2, this.length);
+ return this[offset] | this[offset + 1] << 8;
+ };
+
+ Buffer$1.prototype.readUInt16BE = function readUInt16BE(offset, noAssert) {
+ if (!noAssert) checkOffset$1(offset, 2, this.length);
+ return this[offset] << 8 | this[offset + 1];
+ };
+
+ Buffer$1.prototype.readUInt32LE = function readUInt32LE(offset, noAssert) {
+ if (!noAssert) checkOffset$1(offset, 4, this.length);
+ return (this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16) + this[offset + 3] * 0x1000000;
+ };
+
+ Buffer$1.prototype.readUInt32BE = function readUInt32BE(offset, noAssert) {
+ if (!noAssert) checkOffset$1(offset, 4, this.length);
+ return this[offset] * 0x1000000 + (this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]);
+ };
+
+ Buffer$1.prototype.readIntLE = function readIntLE(offset, byteLength, noAssert) {
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+ if (!noAssert) checkOffset$1(offset, byteLength, this.length);
+ var val = this[offset];
+ var mul = 1;
+ var i = 0;
+
+ while (++i < byteLength && (mul *= 0x100)) {
+ val += this[offset + i] * mul;
+ }
+
+ mul *= 0x80;
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength);
+ return val;
+ };
+
+ Buffer$1.prototype.readIntBE = function readIntBE(offset, byteLength, noAssert) {
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+ if (!noAssert) checkOffset$1(offset, byteLength, this.length);
+ var i = byteLength;
+ var mul = 1;
+ var val = this[offset + --i];
+
+ while (i > 0 && (mul *= 0x100)) {
+ val += this[offset + --i] * mul;
+ }
+
+ mul *= 0x80;
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength);
+ return val;
+ };
+
+ Buffer$1.prototype.readInt8 = function readInt8(offset, noAssert) {
+ if (!noAssert) checkOffset$1(offset, 1, this.length);
+ if (!(this[offset] & 0x80)) return this[offset];
+ return (0xff - this[offset] + 1) * -1;
+ };
+
+ Buffer$1.prototype.readInt16LE = function readInt16LE(offset, noAssert) {
+ if (!noAssert) checkOffset$1(offset, 2, this.length);
+ var val = this[offset] | this[offset + 1] << 8;
+ return val & 0x8000 ? val | 0xFFFF0000 : val;
+ };
+
+ Buffer$1.prototype.readInt16BE = function readInt16BE(offset, noAssert) {
+ if (!noAssert) checkOffset$1(offset, 2, this.length);
+ var val = this[offset + 1] | this[offset] << 8;
+ return val & 0x8000 ? val | 0xFFFF0000 : val;
+ };
+
+ Buffer$1.prototype.readInt32LE = function readInt32LE(offset, noAssert) {
+ if (!noAssert) checkOffset$1(offset, 4, this.length);
+ return this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16 | this[offset + 3] << 24;
+ };
+
+ Buffer$1.prototype.readInt32BE = function readInt32BE(offset, noAssert) {
+ if (!noAssert) checkOffset$1(offset, 4, this.length);
+ return this[offset] << 24 | this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3];
+ };
+
+ Buffer$1.prototype.readFloatLE = function readFloatLE(offset, noAssert) {
+ if (!noAssert) checkOffset$1(offset, 4, this.length);
+ return read$1(this, offset, true, 23, 4);
+ };
+
+ Buffer$1.prototype.readFloatBE = function readFloatBE(offset, noAssert) {
+ if (!noAssert) checkOffset$1(offset, 4, this.length);
+ return read$1(this, offset, false, 23, 4);
+ };
+
+ Buffer$1.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) {
+ if (!noAssert) checkOffset$1(offset, 8, this.length);
+ return read$1(this, offset, true, 52, 8);
+ };
+
+ Buffer$1.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) {
+ if (!noAssert) checkOffset$1(offset, 8, this.length);
+ return read$1(this, offset, false, 52, 8);
+ };
+
+ function checkInt$1(buf, value, offset, ext, max, min) {
+ if (!internalIsBuffer$1(buf)) throw new TypeError('"buffer" argument must be a Buffer instance');
+ if (value > max || value < min) throw new RangeError('"value" argument is out of bounds');
+ if (offset + ext > buf.length) throw new RangeError('Index out of range');
+ }
+
+ Buffer$1.prototype.writeUIntLE = function writeUIntLE(value, offset, byteLength, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+
+ if (!noAssert) {
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1;
+ checkInt$1(this, value, offset, byteLength, maxBytes, 0);
+ }
+
+ var mul = 1;
+ var i = 0;
+ this[offset] = value & 0xFF;
+
+ while (++i < byteLength && (mul *= 0x100)) {
+ this[offset + i] = value / mul & 0xFF;
+ }
+
+ return offset + byteLength;
+ };
+
+ Buffer$1.prototype.writeUIntBE = function writeUIntBE(value, offset, byteLength, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+
+ if (!noAssert) {
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1;
+ checkInt$1(this, value, offset, byteLength, maxBytes, 0);
+ }
+
+ var i = byteLength - 1;
+ var mul = 1;
+ this[offset + i] = value & 0xFF;
+
+ while (--i >= 0 && (mul *= 0x100)) {
+ this[offset + i] = value / mul & 0xFF;
+ }
+
+ return offset + byteLength;
+ };
+
+ Buffer$1.prototype.writeUInt8 = function writeUInt8(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt$1(this, value, offset, 1, 0xff, 0);
+ if (!Buffer$1.TYPED_ARRAY_SUPPORT) value = Math.floor(value);
+ this[offset] = value & 0xff;
+ return offset + 1;
+ };
+
+ function objectWriteUInt16$1(buf, value, offset, littleEndian) {
+ if (value < 0) value = 0xffff + value + 1;
+
+ for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
+ buf[offset + i] = (value & 0xff << 8 * (littleEndian ? i : 1 - i)) >>> (littleEndian ? i : 1 - i) * 8;
+ }
+ }
+
+ Buffer$1.prototype.writeUInt16LE = function writeUInt16LE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt$1(this, value, offset, 2, 0xffff, 0);
+
+ if (Buffer$1.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value & 0xff;
+ this[offset + 1] = value >>> 8;
+ } else {
+ objectWriteUInt16$1(this, value, offset, true);
+ }
+
+ return offset + 2;
+ };
+
+ Buffer$1.prototype.writeUInt16BE = function writeUInt16BE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt$1(this, value, offset, 2, 0xffff, 0);
+
+ if (Buffer$1.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value >>> 8;
+ this[offset + 1] = value & 0xff;
+ } else {
+ objectWriteUInt16$1(this, value, offset, false);
+ }
+
+ return offset + 2;
+ };
+
+ function objectWriteUInt32$1(buf, value, offset, littleEndian) {
+ if (value < 0) value = 0xffffffff + value + 1;
+
+ for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
+ buf[offset + i] = value >>> (littleEndian ? i : 3 - i) * 8 & 0xff;
+ }
+ }
+
+ Buffer$1.prototype.writeUInt32LE = function writeUInt32LE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt$1(this, value, offset, 4, 0xffffffff, 0);
+
+ if (Buffer$1.TYPED_ARRAY_SUPPORT) {
+ this[offset + 3] = value >>> 24;
+ this[offset + 2] = value >>> 16;
+ this[offset + 1] = value >>> 8;
+ this[offset] = value & 0xff;
+ } else {
+ objectWriteUInt32$1(this, value, offset, true);
+ }
+
+ return offset + 4;
+ };
+
+ Buffer$1.prototype.writeUInt32BE = function writeUInt32BE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt$1(this, value, offset, 4, 0xffffffff, 0);
+
+ if (Buffer$1.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value >>> 24;
+ this[offset + 1] = value >>> 16;
+ this[offset + 2] = value >>> 8;
+ this[offset + 3] = value & 0xff;
+ } else {
+ objectWriteUInt32$1(this, value, offset, false);
+ }
+
+ return offset + 4;
+ };
+
+ Buffer$1.prototype.writeIntLE = function writeIntLE(value, offset, byteLength, noAssert) {
+ value = +value;
+ offset = offset | 0;
+
+ if (!noAssert) {
+ var limit = Math.pow(2, 8 * byteLength - 1);
+ checkInt$1(this, value, offset, byteLength, limit - 1, -limit);
+ }
+
+ var i = 0;
+ var mul = 1;
+ var sub = 0;
+ this[offset] = value & 0xFF;
+
+ while (++i < byteLength && (mul *= 0x100)) {
+ if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
+ sub = 1;
+ }
+
+ this[offset + i] = (value / mul >> 0) - sub & 0xFF;
+ }
+
+ return offset + byteLength;
+ };
+
+ Buffer$1.prototype.writeIntBE = function writeIntBE(value, offset, byteLength, noAssert) {
+ value = +value;
+ offset = offset | 0;
+
+ if (!noAssert) {
+ var limit = Math.pow(2, 8 * byteLength - 1);
+ checkInt$1(this, value, offset, byteLength, limit - 1, -limit);
+ }
+
+ var i = byteLength - 1;
+ var mul = 1;
+ var sub = 0;
+ this[offset + i] = value & 0xFF;
+
+ while (--i >= 0 && (mul *= 0x100)) {
+ if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
+ sub = 1;
+ }
+
+ this[offset + i] = (value / mul >> 0) - sub & 0xFF;
+ }
+
+ return offset + byteLength;
+ };
+
+ Buffer$1.prototype.writeInt8 = function writeInt8(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt$1(this, value, offset, 1, 0x7f, -0x80);
+ if (!Buffer$1.TYPED_ARRAY_SUPPORT) value = Math.floor(value);
+ if (value < 0) value = 0xff + value + 1;
+ this[offset] = value & 0xff;
+ return offset + 1;
+ };
+
+ Buffer$1.prototype.writeInt16LE = function writeInt16LE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt$1(this, value, offset, 2, 0x7fff, -0x8000);
+
+ if (Buffer$1.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value & 0xff;
+ this[offset + 1] = value >>> 8;
+ } else {
+ objectWriteUInt16$1(this, value, offset, true);
+ }
+
+ return offset + 2;
+ };
+
+ Buffer$1.prototype.writeInt16BE = function writeInt16BE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt$1(this, value, offset, 2, 0x7fff, -0x8000);
+
+ if (Buffer$1.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value >>> 8;
+ this[offset + 1] = value & 0xff;
+ } else {
+ objectWriteUInt16$1(this, value, offset, false);
+ }
+
+ return offset + 2;
+ };
+
+ Buffer$1.prototype.writeInt32LE = function writeInt32LE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt$1(this, value, offset, 4, 0x7fffffff, -0x80000000);
+
+ if (Buffer$1.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value & 0xff;
+ this[offset + 1] = value >>> 8;
+ this[offset + 2] = value >>> 16;
+ this[offset + 3] = value >>> 24;
+ } else {
+ objectWriteUInt32$1(this, value, offset, true);
+ }
+
+ return offset + 4;
+ };
+
+ Buffer$1.prototype.writeInt32BE = function writeInt32BE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt$1(this, value, offset, 4, 0x7fffffff, -0x80000000);
+ if (value < 0) value = 0xffffffff + value + 1;
+
+ if (Buffer$1.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value >>> 24;
+ this[offset + 1] = value >>> 16;
+ this[offset + 2] = value >>> 8;
+ this[offset + 3] = value & 0xff;
+ } else {
+ objectWriteUInt32$1(this, value, offset, false);
+ }
+
+ return offset + 4;
+ };
+
+ function checkIEEE754$1(buf, value, offset, ext, max, min) {
+ if (offset + ext > buf.length) throw new RangeError('Index out of range');
+ if (offset < 0) throw new RangeError('Index out of range');
+ }
+
+ function writeFloat$1(buf, value, offset, littleEndian, noAssert) {
+ if (!noAssert) {
+ checkIEEE754$1(buf, value, offset, 4);
+ }
+
+ write$1(buf, value, offset, littleEndian, 23, 4);
+ return offset + 4;
+ }
+
+ Buffer$1.prototype.writeFloatLE = function writeFloatLE(value, offset, noAssert) {
+ return writeFloat$1(this, value, offset, true, noAssert);
+ };
+
+ Buffer$1.prototype.writeFloatBE = function writeFloatBE(value, offset, noAssert) {
+ return writeFloat$1(this, value, offset, false, noAssert);
+ };
+
+ function writeDouble$1(buf, value, offset, littleEndian, noAssert) {
+ if (!noAssert) {
+ checkIEEE754$1(buf, value, offset, 8);
+ }
+
+ write$1(buf, value, offset, littleEndian, 52, 8);
+ return offset + 8;
+ }
+
+ Buffer$1.prototype.writeDoubleLE = function writeDoubleLE(value, offset, noAssert) {
+ return writeDouble$1(this, value, offset, true, noAssert);
+ };
+
+ Buffer$1.prototype.writeDoubleBE = function writeDoubleBE(value, offset, noAssert) {
+ return writeDouble$1(this, value, offset, false, noAssert);
+ }; // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
+
+
+ Buffer$1.prototype.copy = function copy(target, targetStart, start, end) {
+ if (!start) start = 0;
+ if (!end && end !== 0) end = this.length;
+ if (targetStart >= target.length) targetStart = target.length;
+ if (!targetStart) targetStart = 0;
+ if (end > 0 && end < start) end = start; // Copy 0 bytes; we're done
+
+ if (end === start) return 0;
+ if (target.length === 0 || this.length === 0) return 0; // Fatal error conditions
+
+ if (targetStart < 0) {
+ throw new RangeError('targetStart out of bounds');
+ }
+
+ if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds');
+ if (end < 0) throw new RangeError('sourceEnd out of bounds'); // Are we oob?
+
+ if (end > this.length) end = this.length;
+
+ if (target.length - targetStart < end - start) {
+ end = target.length - targetStart + start;
+ }
+
+ var len = end - start;
+ var i;
+
+ if (this === target && start < targetStart && targetStart < end) {
+ // descending copy from end
+ for (i = len - 1; i >= 0; --i) {
+ target[i + targetStart] = this[i + start];
+ }
+ } else if (len < 1000 || !Buffer$1.TYPED_ARRAY_SUPPORT) {
+ // ascending copy from start
+ for (i = 0; i < len; ++i) {
+ target[i + targetStart] = this[i + start];
+ }
+ } else {
+ Uint8Array.prototype.set.call(target, this.subarray(start, start + len), targetStart);
+ }
+
+ return len;
+ }; // Usage:
+ // buffer.fill(number[, offset[, end]])
+ // buffer.fill(buffer[, offset[, end]])
+ // buffer.fill(string[, offset[, end]][, encoding])
+
+
+ Buffer$1.prototype.fill = function fill(val, start, end, encoding) {
+ // Handle string cases:
+ if (typeof val === 'string') {
+ if (typeof start === 'string') {
+ encoding = start;
+ start = 0;
+ end = this.length;
+ } else if (typeof end === 'string') {
+ encoding = end;
+ end = this.length;
+ }
+
+ if (val.length === 1) {
+ var code = val.charCodeAt(0);
+
+ if (code < 256) {
+ val = code;
+ }
+ }
+
+ if (encoding !== undefined && typeof encoding !== 'string') {
+ throw new TypeError('encoding must be a string');
+ }
+
+ if (typeof encoding === 'string' && !Buffer$1.isEncoding(encoding)) {
+ throw new TypeError('Unknown encoding: ' + encoding);
+ }
+ } else if (typeof val === 'number') {
+ val = val & 255;
+ } // Invalid ranges are not set to a default, so can range check early.
+
+
+ if (start < 0 || this.length < start || this.length < end) {
+ throw new RangeError('Out of range index');
+ }
+
+ if (end <= start) {
+ return this;
+ }
+
+ start = start >>> 0;
+ end = end === undefined ? this.length : end >>> 0;
+ if (!val) val = 0;
+ var i;
+
+ if (typeof val === 'number') {
+ for (i = start; i < end; ++i) {
+ this[i] = val;
+ }
+ } else {
+ var bytes = internalIsBuffer$1(val) ? val : utf8ToBytes$1(new Buffer$1(val, encoding).toString());
+ var len = bytes.length;
+
+ for (i = 0; i < end - start; ++i) {
+ this[i + start] = bytes[i % len];
+ }
+ }
+
+ return this;
+ }; // HELPER FUNCTIONS
+ // ================
+
+
+ var INVALID_BASE64_RE$1 = /[^+\/0-9A-Za-z-_]/g;
+
+ function base64clean$1(str) {
+ // Node strips out invalid characters like \n and \t from the string, base64-js does not
+ str = stringtrim$1(str).replace(INVALID_BASE64_RE$1, ''); // Node converts strings with length < 2 to ''
+
+ if (str.length < 2) return ''; // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
+
+ while (str.length % 4 !== 0) {
+ str = str + '=';
+ }
+
+ return str;
+ }
+
+ function stringtrim$1(str) {
+ if (str.trim) return str.trim();
+ return str.replace(/^\s+|\s+$/g, '');
+ }
+
+ function toHex$1(n) {
+ if (n < 16) return '0' + n.toString(16);
+ return n.toString(16);
+ }
+
+ function utf8ToBytes$1(string, units) {
+ units = units || Infinity;
+ var codePoint;
+ var length = string.length;
+ var leadSurrogate = null;
+ var bytes = [];
+
+ for (var i = 0; i < length; ++i) {
+ codePoint = string.charCodeAt(i); // is surrogate component
+
+ if (codePoint > 0xD7FF && codePoint < 0xE000) {
+ // last char was a lead
+ if (!leadSurrogate) {
+ // no lead yet
+ if (codePoint > 0xDBFF) {
+ // unexpected trail
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
+ continue;
+ } else if (i + 1 === length) {
+ // unpaired lead
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
+ continue;
+ } // valid lead
+
+
+ leadSurrogate = codePoint;
+ continue;
+ } // 2 leads in a row
+
+
+ if (codePoint < 0xDC00) {
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
+ leadSurrogate = codePoint;
+ continue;
+ } // valid surrogate pair
+
+
+ codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000;
+ } else if (leadSurrogate) {
+ // valid bmp char, but last char was a lead
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
+ }
+
+ leadSurrogate = null; // encode utf8
+
+ if (codePoint < 0x80) {
+ if ((units -= 1) < 0) break;
+ bytes.push(codePoint);
+ } else if (codePoint < 0x800) {
+ if ((units -= 2) < 0) break;
+ bytes.push(codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80);
+ } else if (codePoint < 0x10000) {
+ if ((units -= 3) < 0) break;
+ bytes.push(codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80);
+ } else if (codePoint < 0x110000) {
+ if ((units -= 4) < 0) break;
+ bytes.push(codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80);
+ } else {
+ throw new Error('Invalid code point');
+ }
+ }
+
+ return bytes;
+ }
+
+ function asciiToBytes$1(str) {
+ var byteArray = [];
+
+ for (var i = 0; i < str.length; ++i) {
+ // Node's code seems to be doing this and not & 0x7F..
+ byteArray.push(str.charCodeAt(i) & 0xFF);
+ }
+
+ return byteArray;
+ }
+
+ function utf16leToBytes$1(str, units) {
+ var c, hi, lo;
+ var byteArray = [];
+
+ for (var i = 0; i < str.length; ++i) {
+ if ((units -= 2) < 0) break;
+ c = str.charCodeAt(i);
+ hi = c >> 8;
+ lo = c % 256;
+ byteArray.push(lo);
+ byteArray.push(hi);
+ }
+
+ return byteArray;
+ }
+
+ function base64ToBytes$1(str) {
+ return toByteArray$1(base64clean$1(str));
+ }
+
+ function blitBuffer$1(src, dst, offset, length) {
+ for (var i = 0; i < length; ++i) {
+ if (i + offset >= dst.length || i >= src.length) break;
+ dst[i + offset] = src[i];
+ }
+
+ return i;
+ }
+
+ function isnan$1(val) {
+ return val !== val; // eslint-disable-line no-self-compare
+ } // the following is from is-buffer, also by Feross Aboukhadijeh and with same lisence
+ // The _isBuffer check is for Safari 5-7 support, because it's missing
+ // Object.prototype.constructor. Remove this eventually
+
+
+ function isBuffer$2(obj) {
+ return obj != null && (!!obj._isBuffer || isFastBuffer$1(obj) || isSlowBuffer$1(obj));
+ }
+
+ function isFastBuffer$1(obj) {
+ return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj);
+ } // For Node v0.10 support. Remove this eventually.
+
+
+ function isSlowBuffer$1(obj) {
+ return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer$1(obj.slice(0, 0));
+ }
+
+ // based off https://github.com/defunctzombie/node-process/blob/master/browser.js
+
+ function defaultSetTimout() {
+ throw new Error('setTimeout has not been defined');
+ }
+
+ function defaultClearTimeout() {
+ throw new Error('clearTimeout has not been defined');
+ }
+
+ var cachedSetTimeout = defaultSetTimout;
+ var cachedClearTimeout = defaultClearTimeout;
+
+ if (typeof global$1.setTimeout === 'function') {
+ cachedSetTimeout = setTimeout;
+ }
+
+ if (typeof global$1.clearTimeout === 'function') {
+ cachedClearTimeout = clearTimeout;
+ }
+
+ function runTimeout(fun) {
+ if (cachedSetTimeout === setTimeout) {
+ //normal enviroments in sane situations
+ return setTimeout(fun, 0);
+ } // if setTimeout wasn't available but was latter defined
+
+
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+ cachedSetTimeout = setTimeout;
+ return setTimeout(fun, 0);
+ }
+
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedSetTimeout(fun, 0);
+ } catch (e) {
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedSetTimeout.call(null, fun, 0);
+ } catch (e) {
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+ return cachedSetTimeout.call(this, fun, 0);
+ }
+ }
+ }
+
+ function runClearTimeout(marker) {
+ if (cachedClearTimeout === clearTimeout) {
+ //normal enviroments in sane situations
+ return clearTimeout(marker);
+ } // if clearTimeout wasn't available but was latter defined
+
+
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+ cachedClearTimeout = clearTimeout;
+ return clearTimeout(marker);
+ }
+
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedClearTimeout(marker);
+ } catch (e) {
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedClearTimeout.call(null, marker);
+ } catch (e) {
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+ // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+ return cachedClearTimeout.call(this, marker);
+ }
+ }
+ }
+
+ var queue$1 = [];
+ var draining = false;
+ var currentQueue;
+ var queueIndex = -1;
+
+ function cleanUpNextTick() {
+ if (!draining || !currentQueue) {
+ return;
+ }
+
+ draining = false;
+
+ if (currentQueue.length) {
+ queue$1 = currentQueue.concat(queue$1);
+ } else {
+ queueIndex = -1;
+ }
+
+ if (queue$1.length) {
+ drainQueue();
+ }
+ }
+
+ function drainQueue() {
+ if (draining) {
+ return;
+ }
+
+ var timeout = runTimeout(cleanUpNextTick);
+ draining = true;
+ var len = queue$1.length;
+
+ while (len) {
+ currentQueue = queue$1;
+ queue$1 = [];
+
+ while (++queueIndex < len) {
+ if (currentQueue) {
+ currentQueue[queueIndex].run();
+ }
+ }
+
+ queueIndex = -1;
+ len = queue$1.length;
+ }
+
+ currentQueue = null;
+ draining = false;
+ runClearTimeout(timeout);
+ }
+
+ function nextTick(fun) {
+ var args = new Array(arguments.length - 1);
+
+ if (arguments.length > 1) {
+ for (var i = 1; i < arguments.length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ }
+
+ queue$1.push(new Item(fun, args));
+
+ if (queue$1.length === 1 && !draining) {
+ runTimeout(drainQueue);
+ }
+ } // v8 likes predictible objects
+
+
+ function Item(fun, array) {
+ this.fun = fun;
+ this.array = array;
+ }
+
+ Item.prototype.run = function () {
+ this.fun.apply(null, this.array);
+ };
+
+ var title = 'browser';
+ var platform = 'browser';
+ var browser$3 = true;
+ var env = {};
+ var argv = [];
+ var version$1 = ''; // empty string to avoid regexp issues
+
+ var versions = {};
+ var release = {};
+ var config = {};
+
+ function noop() {}
+
+ var on = noop;
+ var addListener = noop;
+ var once = noop;
+ var off = noop;
+ var removeListener = noop;
+ var removeAllListeners = noop;
+ var emit = noop;
+
+ function binding(name) {
+ throw new Error('process.binding is not supported');
+ }
+
+ function cwd() {
+ return '/';
+ }
+
+ function chdir(dir) {
+ throw new Error('process.chdir is not supported');
+ }
+
+ function umask() {
+ return 0;
+ } // from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js
+
+
+ var performance = global$1.performance || {};
+
+ var performanceNow = performance.now || performance.mozNow || performance.msNow || performance.oNow || performance.webkitNow || function () {
+ return new Date().getTime();
+ }; // generate timestamp or delta
+ // see http://nodejs.org/api/process.html#process_process_hrtime
+
+
+ function hrtime(previousTimestamp) {
+ var clocktime = performanceNow.call(performance) * 1e-3;
+ var seconds = Math.floor(clocktime);
+ var nanoseconds = Math.floor(clocktime % 1 * 1e9);
+
+ if (previousTimestamp) {
+ seconds = seconds - previousTimestamp[0];
+ nanoseconds = nanoseconds - previousTimestamp[1];
+
+ if (nanoseconds < 0) {
+ seconds--;
+ nanoseconds += 1e9;
+ }
+ }
+
+ return [seconds, nanoseconds];
+ }
+
+ var startTime = new Date();
+
+ function uptime() {
+ var currentTime = new Date();
+ var dif = currentTime - startTime;
+ return dif / 1000;
+ }
+
+ var browser$1$1 = {
+ nextTick: nextTick,
+ title: title,
+ browser: browser$3,
+ env: env,
+ argv: argv,
+ version: version$1,
+ versions: versions,
+ on: on,
+ addListener: addListener,
+ once: once,
+ off: off,
+ removeListener: removeListener,
+ removeAllListeners: removeAllListeners,
+ emit: emit,
+ binding: binding,
+ cwd: cwd,
+ chdir: chdir,
+ umask: umask,
+ hrtime: hrtime,
+ platform: platform,
+ release: release,
+ config: config,
+ uptime: uptime
+ };
+ var process$3 = browser$1$1;
+
+ var inherits$2;
+
+ if (typeof Object.create === 'function') {
+ inherits$2 = function inherits(ctor, superCtor) {
+ // implementation from standard node.js 'util' module
+ ctor.super_ = superCtor;
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ };
+ } else {
+ inherits$2 = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor;
+
+ var TempCtor = function TempCtor() {};
+
+ TempCtor.prototype = superCtor.prototype;
+ ctor.prototype = new TempCtor();
+ ctor.prototype.constructor = ctor;
+ };
+ }
+
+ var inherits$3 = inherits$2;
+
+ var formatRegExp = /%[sdj%]/g;
+ function format$1(f) {
+ if (!isString$1(f)) {
+ var objects = [];
+
+ for (var i = 0; i < arguments.length; i++) {
+ objects.push(inspect(arguments[i]));
+ }
+
+ return objects.join(' ');
+ }
+
+ var i = 1;
+ var args = arguments;
+ var len = args.length;
+ var str = String(f).replace(formatRegExp, function (x) {
+ if (x === '%%') return '%';
+ if (i >= len) return x;
+
+ switch (x) {
+ case '%s':
+ return String(args[i++]);
+
+ case '%d':
+ return Number(args[i++]);
+
+ case '%j':
+ try {
+ return JSON.stringify(args[i++]);
+ } catch (_) {
+ return '[Circular]';
+ }
+
+ default:
+ return x;
+ }
+ });
+
+ for (var x = args[i]; i < len; x = args[++i]) {
+ if (isNull(x) || !isObject(x)) {
+ str += ' ' + x;
+ } else {
+ str += ' ' + inspect(x);
+ }
+ }
+
+ return str;
+ }
+ // Returns a modified function which warns once by default.
+ // If --no-deprecation is set, then it is a no-op.
+
+ function deprecate$1(fn, msg) {
+ // Allow for deprecating things in the process of starting up.
+ if (isUndefined(global$1.process)) {
+ return function () {
+ return deprecate$1(fn, msg).apply(this, arguments);
+ };
+ }
+
+ if (process$3.noDeprecation === true) {
+ return fn;
+ }
+
+ var warned = false;
+
+ function deprecated() {
+ if (!warned) {
+ if (process$3.throwDeprecation) {
+ throw new Error(msg);
+ } else if (process$3.traceDeprecation) {
+ console.trace(msg);
+ } else {
+ console.error(msg);
+ }
+
+ warned = true;
+ }
+
+ return fn.apply(this, arguments);
+ }
+
+ return deprecated;
+ }
+ var debugs = {};
+ var debugEnviron;
+ function debuglog(set) {
+ if (isUndefined(debugEnviron)) debugEnviron = process$3.env.NODE_DEBUG || '';
+ set = set.toUpperCase();
+
+ if (!debugs[set]) {
+ if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
+ var pid = 0;
+
+ debugs[set] = function () {
+ var msg = format$1.apply(null, arguments);
+ console.error('%s %d: %s', set, pid, msg);
+ };
+ } else {
+ debugs[set] = function () {};
+ }
+ }
+
+ return debugs[set];
+ }
+ /**
+ * Echos the value of a value. Trys to print the value out
+ * in the best way possible given the different types.
+ *
+ * @param {Object} obj The object to print out.
+ * @param {Object} opts Optional options object that alters the output.
+ */
+
+ /* legacy: obj, showHidden, depth, colors*/
+
+ function inspect(obj, opts) {
+ // default options
+ var ctx = {
+ seen: [],
+ stylize: stylizeNoColor
+ }; // legacy...
+
+ if (arguments.length >= 3) ctx.depth = arguments[2];
+ if (arguments.length >= 4) ctx.colors = arguments[3];
+
+ if (isBoolean(opts)) {
+ // legacy...
+ ctx.showHidden = opts;
+ } else if (opts) {
+ // got an "options" object
+ _extend(ctx, opts);
+ } // set default options
+
+
+ if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
+ if (isUndefined(ctx.depth)) ctx.depth = 2;
+ if (isUndefined(ctx.colors)) ctx.colors = false;
+ if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
+ if (ctx.colors) ctx.stylize = stylizeWithColor;
+ return formatValue(ctx, obj, ctx.depth);
+ } // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
+
+ inspect.colors = {
+ 'bold': [1, 22],
+ 'italic': [3, 23],
+ 'underline': [4, 24],
+ 'inverse': [7, 27],
+ 'white': [37, 39],
+ 'grey': [90, 39],
+ 'black': [30, 39],
+ 'blue': [34, 39],
+ 'cyan': [36, 39],
+ 'green': [32, 39],
+ 'magenta': [35, 39],
+ 'red': [31, 39],
+ 'yellow': [33, 39]
+ }; // Don't use 'blue' not visible on cmd.exe
+
+ inspect.styles = {
+ 'special': 'cyan',
+ 'number': 'yellow',
+ 'boolean': 'yellow',
+ 'undefined': 'grey',
+ 'null': 'bold',
+ 'string': 'green',
+ 'date': 'magenta',
+ // "name": intentionally not styling
+ 'regexp': 'red'
+ };
+
+ function stylizeWithColor(str, styleType) {
+ var style = inspect.styles[styleType];
+
+ if (style) {
+ return "\x1B[" + inspect.colors[style][0] + 'm' + str + "\x1B[" + inspect.colors[style][1] + 'm';
+ } else {
+ return str;
+ }
+ }
+
+ function stylizeNoColor(str, styleType) {
+ return str;
+ }
+
+ function arrayToHash(array) {
+ var hash = {};
+ array.forEach(function (val, idx) {
+ hash[val] = true;
+ });
+ return hash;
+ }
+
+ function formatValue(ctx, value, recurseTimes) {
+ // Provide a hook for user-specified inspect functions.
+ // Check that value is an object with an inspect function on it
+ if (ctx.customInspect && value && isFunction(value.inspect) && // Filter out the util module, it's inspect function is special
+ value.inspect !== inspect && // Also filter out any prototype objects using the circular check.
+ !(value.constructor && value.constructor.prototype === value)) {
+ var ret = value.inspect(recurseTimes, ctx);
+
+ if (!isString$1(ret)) {
+ ret = formatValue(ctx, ret, recurseTimes);
+ }
+
+ return ret;
+ } // Primitive types cannot have properties
+
+
+ var primitive = formatPrimitive(ctx, value);
+
+ if (primitive) {
+ return primitive;
+ } // Look up the keys of the object.
+
+
+ var keys = Object.keys(value);
+ var visibleKeys = arrayToHash(keys);
+
+ if (ctx.showHidden) {
+ keys = Object.getOwnPropertyNames(value);
+ } // IE doesn't make error fields non-enumerable
+ // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
+
+
+ if (isError$1(value) && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
+ return formatError(value);
+ } // Some type of object without properties can be shortcutted.
+
+
+ if (keys.length === 0) {
+ if (isFunction(value)) {
+ var name = value.name ? ': ' + value.name : '';
+ return ctx.stylize('[Function' + name + ']', 'special');
+ }
+
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ }
+
+ if (isDate(value)) {
+ return ctx.stylize(Date.prototype.toString.call(value), 'date');
+ }
+
+ if (isError$1(value)) {
+ return formatError(value);
+ }
+ }
+
+ var base = '',
+ array = false,
+ braces = ['{', '}']; // Make Array say that they are Array
+
+ if (isArray$1(value)) {
+ array = true;
+ braces = ['[', ']'];
+ } // Make functions say that they are functions
+
+
+ if (isFunction(value)) {
+ var n = value.name ? ': ' + value.name : '';
+ base = ' [Function' + n + ']';
+ } // Make RegExps say that they are RegExps
+
+
+ if (isRegExp(value)) {
+ base = ' ' + RegExp.prototype.toString.call(value);
+ } // Make dates with properties first say the date
+
+
+ if (isDate(value)) {
+ base = ' ' + Date.prototype.toUTCString.call(value);
+ } // Make error with message first say the error
+
+
+ if (isError$1(value)) {
+ base = ' ' + formatError(value);
+ }
+
+ if (keys.length === 0 && (!array || value.length == 0)) {
+ return braces[0] + base + braces[1];
+ }
+
+ if (recurseTimes < 0) {
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ } else {
+ return ctx.stylize('[Object]', 'special');
+ }
+ }
+
+ ctx.seen.push(value);
+ var output;
+
+ if (array) {
+ output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
+ } else {
+ output = keys.map(function (key) {
+ return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
+ });
+ }
+
+ ctx.seen.pop();
+ return reduceToSingleString(output, base, braces);
+ }
+
+ function formatPrimitive(ctx, value) {
+ if (isUndefined(value)) return ctx.stylize('undefined', 'undefined');
+
+ if (isString$1(value)) {
+ var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '').replace(/'/g, "\\'").replace(/\\"/g, '"') + '\'';
+ return ctx.stylize(simple, 'string');
+ }
+
+ if (isNumber(value)) return ctx.stylize('' + value, 'number');
+ if (isBoolean(value)) return ctx.stylize('' + value, 'boolean'); // For some reason typeof null is "object", so special case here.
+
+ if (isNull(value)) return ctx.stylize('null', 'null');
+ }
+
+ function formatError(value) {
+ return '[' + Error.prototype.toString.call(value) + ']';
+ }
+
+ function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
+ var output = [];
+
+ for (var i = 0, l = value.length; i < l; ++i) {
+ if (hasOwnProperty(value, String(i))) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true));
+ } else {
+ output.push('');
+ }
+ }
+
+ keys.forEach(function (key) {
+ if (!key.match(/^\d+$/)) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true));
+ }
+ });
+ return output;
+ }
+
+ function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
+ var name, str, desc;
+ desc = Object.getOwnPropertyDescriptor(value, key) || {
+ value: value[key]
+ };
+
+ if (desc.get) {
+ if (desc.set) {
+ str = ctx.stylize('[Getter/Setter]', 'special');
+ } else {
+ str = ctx.stylize('[Getter]', 'special');
+ }
+ } else {
+ if (desc.set) {
+ str = ctx.stylize('[Setter]', 'special');
+ }
+ }
+
+ if (!hasOwnProperty(visibleKeys, key)) {
+ name = '[' + key + ']';
+ }
+
+ if (!str) {
+ if (ctx.seen.indexOf(desc.value) < 0) {
+ if (isNull(recurseTimes)) {
+ str = formatValue(ctx, desc.value, null);
+ } else {
+ str = formatValue(ctx, desc.value, recurseTimes - 1);
+ }
+
+ if (str.indexOf('\n') > -1) {
+ if (array) {
+ str = str.split('\n').map(function (line) {
+ return ' ' + line;
+ }).join('\n').substr(2);
+ } else {
+ str = '\n' + str.split('\n').map(function (line) {
+ return ' ' + line;
+ }).join('\n');
+ }
+ }
+ } else {
+ str = ctx.stylize('[Circular]', 'special');
+ }
+ }
+
+ if (isUndefined(name)) {
+ if (array && key.match(/^\d+$/)) {
+ return str;
+ }
+
+ name = JSON.stringify('' + key);
+
+ if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
+ name = name.substr(1, name.length - 2);
+ name = ctx.stylize(name, 'name');
+ } else {
+ name = name.replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'");
+ name = ctx.stylize(name, 'string');
+ }
+ }
+
+ return name + ': ' + str;
+ }
+
+ function reduceToSingleString(output, base, braces) {
+ var length = output.reduce(function (prev, cur) {
+ if (cur.indexOf('\n') >= 0) ;
+ return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
+ }, 0);
+
+ if (length > 60) {
+ return braces[0] + (base === '' ? '' : base + '\n ') + ' ' + output.join(',\n ') + ' ' + braces[1];
+ }
+
+ return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
+ } // NOTE: These type checking functions intentionally don't use `instanceof`
+ // because it is fragile and can be easily faked with `Object.create()`.
+
+
+ function isArray$1(ar) {
+ return Array.isArray(ar);
+ }
+ function isBoolean(arg) {
+ return typeof arg === 'boolean';
+ }
+ function isNull(arg) {
+ return arg === null;
+ }
+ function isNullOrUndefined(arg) {
+ return arg == null;
+ }
+ function isNumber(arg) {
+ return typeof arg === 'number';
+ }
+ function isString$1(arg) {
+ return typeof arg === 'string';
+ }
+ function isSymbol(arg) {
+ return _typeof(arg) === 'symbol';
+ }
+ function isUndefined(arg) {
+ return arg === void 0;
+ }
+ function isRegExp(re) {
+ return isObject(re) && objectToString(re) === '[object RegExp]';
+ }
+ function isObject(arg) {
+ return _typeof(arg) === 'object' && arg !== null;
+ }
+ function isDate(d) {
+ return isObject(d) && objectToString(d) === '[object Date]';
+ }
+ function isError$1(e) {
+ return isObject(e) && (objectToString(e) === '[object Error]' || e instanceof Error);
+ }
+ function isFunction(arg) {
+ return typeof arg === 'function';
+ }
+ function isPrimitive(arg) {
+ return arg === null || typeof arg === 'boolean' || typeof arg === 'number' || typeof arg === 'string' || _typeof(arg) === 'symbol' || // ES6 symbol
+ typeof arg === 'undefined';
+ }
+ function isBuffer$1(maybeBuf) {
+ return isBuffer$2(maybeBuf);
+ }
+
+ function objectToString(o) {
+ return Object.prototype.toString.call(o);
+ }
+
+ function pad(n) {
+ return n < 10 ? '0' + n.toString(10) : n.toString(10);
+ }
+
+ var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; // 26 Feb 16:19:34
+
+ function timestamp() {
+ var d = new Date();
+ var time = [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(':');
+ return [d.getDate(), months[d.getMonth()], time].join(' ');
+ } // log is just a thin wrapper to console.log that prepends a timestamp
+
+
+ function log$1() {
+ console.log('%s - %s', timestamp(), format$1.apply(null, arguments));
+ }
+ function _extend(origin, add) {
+ // Don't do anything if add isn't an object
+ if (!add || !isObject(add)) return origin;
+ var keys = Object.keys(add);
+ var i = keys.length;
+
+ while (i--) {
+ origin[keys[i]] = add[keys[i]];
+ }
+
+ return origin;
+ }
+
+ function hasOwnProperty(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+ }
+
+ var util = {
+ inherits: inherits$3,
+ _extend: _extend,
+ log: log$1,
+ isBuffer: isBuffer$1,
+ isPrimitive: isPrimitive,
+ isFunction: isFunction,
+ isError: isError$1,
+ isDate: isDate,
+ isObject: isObject,
+ isRegExp: isRegExp,
+ isUndefined: isUndefined,
+ isSymbol: isSymbol,
+ isString: isString$1,
+ isNumber: isNumber,
+ isNullOrUndefined: isNullOrUndefined,
+ isNull: isNull,
+ isBoolean: isBoolean,
+ isArray: isArray$1,
+ inspect: inspect,
+ deprecate: deprecate$1,
+ format: format$1,
+ debuglog: debuglog
+ };
+
+ var lookup = [];
+ var revLookup = [];
+ var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array;
+ var inited = false;
+
+ function init() {
+ inited = true;
+ var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+
+ for (var i = 0, len = code.length; i < len; ++i) {
+ lookup[i] = code[i];
+ revLookup[code.charCodeAt(i)] = i;
+ }
+
+ revLookup['-'.charCodeAt(0)] = 62;
+ revLookup['_'.charCodeAt(0)] = 63;
+ }
+
+ function toByteArray(b64) {
+ if (!inited) {
+ init();
+ }
+
+ var i, j, l, tmp, placeHolders, arr;
+ var len = b64.length;
+
+ if (len % 4 > 0) {
+ throw new Error('Invalid string. Length must be a multiple of 4');
+ } // the number of equal signs (place holders)
+ // if there are two placeholders, than the two characters before it
+ // represent one byte
+ // if there is only one, then the three characters before it represent 2 bytes
+ // this is just a cheap hack to not do indexOf twice
+
+
+ placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0; // base64 is 4/3 + up to two characters of the original data
+
+ arr = new Arr(len * 3 / 4 - placeHolders); // if there are placeholders, only get up to the last complete 4 chars
+
+ l = placeHolders > 0 ? len - 4 : len;
+ var L = 0;
+
+ for (i = 0, j = 0; i < l; i += 4, j += 3) {
+ tmp = revLookup[b64.charCodeAt(i)] << 18 | revLookup[b64.charCodeAt(i + 1)] << 12 | revLookup[b64.charCodeAt(i + 2)] << 6 | revLookup[b64.charCodeAt(i + 3)];
+ arr[L++] = tmp >> 16 & 0xFF;
+ arr[L++] = tmp >> 8 & 0xFF;
+ arr[L++] = tmp & 0xFF;
+ }
+
+ if (placeHolders === 2) {
+ tmp = revLookup[b64.charCodeAt(i)] << 2 | revLookup[b64.charCodeAt(i + 1)] >> 4;
+ arr[L++] = tmp & 0xFF;
+ } else if (placeHolders === 1) {
+ tmp = revLookup[b64.charCodeAt(i)] << 10 | revLookup[b64.charCodeAt(i + 1)] << 4 | revLookup[b64.charCodeAt(i + 2)] >> 2;
+ arr[L++] = tmp >> 8 & 0xFF;
+ arr[L++] = tmp & 0xFF;
+ }
+
+ return arr;
+ }
+
+ function tripletToBase64(num) {
+ return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F];
+ }
+
+ function encodeChunk(uint8, start, end) {
+ var tmp;
+ var output = [];
+
+ for (var i = start; i < end; i += 3) {
+ tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + uint8[i + 2];
+ output.push(tripletToBase64(tmp));
+ }
+
+ return output.join('');
+ }
+
+ function fromByteArray(uint8) {
+ if (!inited) {
+ init();
+ }
+
+ var tmp;
+ var len = uint8.length;
+ var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes
+
+ var output = '';
+ var parts = [];
+ var maxChunkLength = 16383; // must be multiple of 3
+ // go through the array every three bytes, we'll deal with trailing stuff later
+
+ for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
+ parts.push(encodeChunk(uint8, i, i + maxChunkLength > len2 ? len2 : i + maxChunkLength));
+ } // pad the end with zeros, but make sure to not forget the extra bytes
+
+
+ if (extraBytes === 1) {
+ tmp = uint8[len - 1];
+ output += lookup[tmp >> 2];
+ output += lookup[tmp << 4 & 0x3F];
+ output += '==';
+ } else if (extraBytes === 2) {
+ tmp = (uint8[len - 2] << 8) + uint8[len - 1];
+ output += lookup[tmp >> 10];
+ output += lookup[tmp >> 4 & 0x3F];
+ output += lookup[tmp << 2 & 0x3F];
+ output += '=';
+ }
+
+ parts.push(output);
+ return parts.join('');
+ }
+
+ function read(buffer, offset, isLE, mLen, nBytes) {
+ var e, m;
+ var eLen = nBytes * 8 - mLen - 1;
+ var eMax = (1 << eLen) - 1;
+ var eBias = eMax >> 1;
+ var nBits = -7;
+ var i = isLE ? nBytes - 1 : 0;
+ var d = isLE ? -1 : 1;
+ var s = buffer[offset + i];
+ i += d;
+ e = s & (1 << -nBits) - 1;
+ s >>= -nBits;
+ nBits += eLen;
+
+ for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
+
+ m = e & (1 << -nBits) - 1;
+ e >>= -nBits;
+ nBits += mLen;
+
+ for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
+
+ if (e === 0) {
+ e = 1 - eBias;
+ } else if (e === eMax) {
+ return m ? NaN : (s ? -1 : 1) * Infinity;
+ } else {
+ m = m + Math.pow(2, mLen);
+ e = e - eBias;
+ }
+
+ return (s ? -1 : 1) * m * Math.pow(2, e - mLen);
+ }
+
+ function write(buffer, value, offset, isLE, mLen, nBytes) {
+ var e, m, c;
+ var eLen = nBytes * 8 - mLen - 1;
+ var eMax = (1 << eLen) - 1;
+ var eBias = eMax >> 1;
+ var rt = mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0;
+ var i = isLE ? 0 : nBytes - 1;
+ var d = isLE ? 1 : -1;
+ var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;
+ value = Math.abs(value);
+
+ if (isNaN(value) || value === Infinity) {
+ m = isNaN(value) ? 1 : 0;
+ e = eMax;
+ } else {
+ e = Math.floor(Math.log(value) / Math.LN2);
+
+ if (value * (c = Math.pow(2, -e)) < 1) {
+ e--;
+ c *= 2;
+ }
+
+ if (e + eBias >= 1) {
+ value += rt / c;
+ } else {
+ value += rt * Math.pow(2, 1 - eBias);
+ }
+
+ if (value * c >= 2) {
+ e++;
+ c /= 2;
+ }
+
+ if (e + eBias >= eMax) {
+ m = 0;
+ e = eMax;
+ } else if (e + eBias >= 1) {
+ m = (value * c - 1) * Math.pow(2, mLen);
+ e = e + eBias;
+ } else {
+ m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
+ e = 0;
+ }
+ }
+
+ for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
+
+ e = e << mLen | m;
+ eLen += mLen;
+
+ for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
+
+ buffer[offset + i - d] |= s * 128;
+ }
+
+ var toString$1 = {}.toString;
+
+ var isArray = Array.isArray || function (arr) {
+ return toString$1.call(arr) == '[object Array]';
+ };
+ /*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author Feross Aboukhadijeh
+ * @license MIT
+ */
+
+
+ var INSPECT_MAX_BYTES = 50;
+ /**
+ * If `Buffer.TYPED_ARRAY_SUPPORT`:
+ * === true Use Uint8Array implementation (fastest)
+ * === false Use Object implementation (most compatible, even IE6)
+ *
+ * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
+ * Opera 11.6+, iOS 4.2+.
+ *
+ * Due to various browser bugs, sometimes the Object implementation will be used even
+ * when the browser supports typed arrays.
+ *
+ * Note:
+ *
+ * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
+ * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
+ *
+ * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
+ *
+ * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
+ * incorrect length in some situations.
+
+ * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
+ * get the Object implementation, which is slower but behaves correctly.
+ */
+
+ Buffer.TYPED_ARRAY_SUPPORT = global$1.TYPED_ARRAY_SUPPORT !== undefined ? global$1.TYPED_ARRAY_SUPPORT : true;
+
+ function kMaxLength() {
+ return Buffer.TYPED_ARRAY_SUPPORT ? 0x7fffffff : 0x3fffffff;
+ }
+
+ function createBuffer(that, length) {
+ if (kMaxLength() < length) {
+ throw new RangeError('Invalid typed array length');
+ }
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ // Return an augmented `Uint8Array` instance, for best performance
+ that = new Uint8Array(length);
+ that.__proto__ = Buffer.prototype;
+ } else {
+ // Fallback: Return an object instance of the Buffer class
+ if (that === null) {
+ that = new Buffer(length);
+ }
+
+ that.length = length;
+ }
+
+ return that;
+ }
+ /**
+ * The Buffer constructor returns instances of `Uint8Array` that have their
+ * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
+ * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
+ * and the `Uint8Array` methods. Square bracket notation works as expected -- it
+ * returns a single octet.
+ *
+ * The `Uint8Array` prototype remains unmodified.
+ */
+
+
+ function Buffer(arg, encodingOrOffset, length) {
+ if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
+ return new Buffer(arg, encodingOrOffset, length);
+ } // Common case.
+
+
+ if (typeof arg === 'number') {
+ if (typeof encodingOrOffset === 'string') {
+ throw new Error('If encoding is specified then the first argument must be a string');
+ }
+
+ return allocUnsafe(this, arg);
+ }
+
+ return from(this, arg, encodingOrOffset, length);
+ }
+
+ Buffer.poolSize = 8192; // not used by this implementation
+ // TODO: Legacy, not needed anymore. Remove in next major version.
+
+ Buffer._augment = function (arr) {
+ arr.__proto__ = Buffer.prototype;
+ return arr;
+ };
+
+ function from(that, value, encodingOrOffset, length) {
+ if (typeof value === 'number') {
+ throw new TypeError('"value" argument must not be a number');
+ }
+
+ if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
+ return fromArrayBuffer(that, value, encodingOrOffset, length);
+ }
+
+ if (typeof value === 'string') {
+ return fromString(that, value, encodingOrOffset);
+ }
+
+ return fromObject(that, value);
+ }
+ /**
+ * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
+ * if value is a number.
+ * Buffer.from(str[, encoding])
+ * Buffer.from(array)
+ * Buffer.from(buffer)
+ * Buffer.from(arrayBuffer[, byteOffset[, length]])
+ **/
+
+
+ Buffer.from = function (value, encodingOrOffset, length) {
+ return from(null, value, encodingOrOffset, length);
+ };
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ Buffer.prototype.__proto__ = Uint8Array.prototype;
+ Buffer.__proto__ = Uint8Array;
+ }
+
+ function assertSize(size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('"size" argument must be a number');
+ } else if (size < 0) {
+ throw new RangeError('"size" argument must not be negative');
+ }
+ }
+
+ function alloc(that, size, fill, encoding) {
+ assertSize(size);
+
+ if (size <= 0) {
+ return createBuffer(that, size);
+ }
+
+ if (fill !== undefined) {
+ // Only pay attention to encoding if it's a string. This
+ // prevents accidentally sending in a number that would
+ // be interpretted as a start offset.
+ return typeof encoding === 'string' ? createBuffer(that, size).fill(fill, encoding) : createBuffer(that, size).fill(fill);
+ }
+
+ return createBuffer(that, size);
+ }
+ /**
+ * Creates a new filled Buffer instance.
+ * alloc(size[, fill[, encoding]])
+ **/
+
+
+ Buffer.alloc = function (size, fill, encoding) {
+ return alloc(null, size, fill, encoding);
+ };
+
+ function allocUnsafe(that, size) {
+ assertSize(size);
+ that = createBuffer(that, size < 0 ? 0 : checked(size) | 0);
+
+ if (!Buffer.TYPED_ARRAY_SUPPORT) {
+ for (var i = 0; i < size; ++i) {
+ that[i] = 0;
+ }
+ }
+
+ return that;
+ }
+ /**
+ * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
+ * */
+
+
+ Buffer.allocUnsafe = function (size) {
+ return allocUnsafe(null, size);
+ };
+ /**
+ * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
+ */
+
+
+ Buffer.allocUnsafeSlow = function (size) {
+ return allocUnsafe(null, size);
+ };
+
+ function fromString(that, string, encoding) {
+ if (typeof encoding !== 'string' || encoding === '') {
+ encoding = 'utf8';
+ }
+
+ if (!Buffer.isEncoding(encoding)) {
+ throw new TypeError('"encoding" must be a valid string encoding');
+ }
+
+ var length = byteLength(string, encoding) | 0;
+ that = createBuffer(that, length);
+ var actual = that.write(string, encoding);
+
+ if (actual !== length) {
+ // Writing a hex string, for example, that contains invalid characters will
+ // cause everything after the first invalid character to be ignored. (e.g.
+ // 'abxxcd' will be treated as 'ab')
+ that = that.slice(0, actual);
+ }
+
+ return that;
+ }
+
+ function fromArrayLike(that, array) {
+ var length = array.length < 0 ? 0 : checked(array.length) | 0;
+ that = createBuffer(that, length);
+
+ for (var i = 0; i < length; i += 1) {
+ that[i] = array[i] & 255;
+ }
+
+ return that;
+ }
+
+ function fromArrayBuffer(that, array, byteOffset, length) {
+ array.byteLength; // this throws if `array` is not a valid ArrayBuffer
+
+ if (byteOffset < 0 || array.byteLength < byteOffset) {
+ throw new RangeError('\'offset\' is out of bounds');
+ }
+
+ if (array.byteLength < byteOffset + (length || 0)) {
+ throw new RangeError('\'length\' is out of bounds');
+ }
+
+ if (byteOffset === undefined && length === undefined) {
+ array = new Uint8Array(array);
+ } else if (length === undefined) {
+ array = new Uint8Array(array, byteOffset);
+ } else {
+ array = new Uint8Array(array, byteOffset, length);
+ }
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ // Return an augmented `Uint8Array` instance, for best performance
+ that = array;
+ that.__proto__ = Buffer.prototype;
+ } else {
+ // Fallback: Return an object instance of the Buffer class
+ that = fromArrayLike(that, array);
+ }
+
+ return that;
+ }
+
+ function fromObject(that, obj) {
+ if (internalIsBuffer(obj)) {
+ var len = checked(obj.length) | 0;
+ that = createBuffer(that, len);
+
+ if (that.length === 0) {
+ return that;
+ }
+
+ obj.copy(that, 0, 0, len);
+ return that;
+ }
+
+ if (obj) {
+ if (typeof ArrayBuffer !== 'undefined' && obj.buffer instanceof ArrayBuffer || 'length' in obj) {
+ if (typeof obj.length !== 'number' || isnan(obj.length)) {
+ return createBuffer(that, 0);
+ }
+
+ return fromArrayLike(that, obj);
+ }
+
+ if (obj.type === 'Buffer' && isArray(obj.data)) {
+ return fromArrayLike(that, obj.data);
+ }
+ }
+
+ throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.');
+ }
+
+ function checked(length) {
+ // Note: cannot use `length < kMaxLength()` here because that fails when
+ // length is NaN (which is otherwise coerced to zero.)
+ if (length >= kMaxLength()) {
+ throw new RangeError('Attempt to allocate Buffer larger than maximum ' + 'size: 0x' + kMaxLength().toString(16) + ' bytes');
+ }
+
+ return length | 0;
+ }
+
+ Buffer.isBuffer = isBuffer;
+
+ function internalIsBuffer(b) {
+ return !!(b != null && b._isBuffer);
+ }
+
+ Buffer.compare = function compare(a, b) {
+ if (!internalIsBuffer(a) || !internalIsBuffer(b)) {
+ throw new TypeError('Arguments must be Buffers');
+ }
+
+ if (a === b) return 0;
+ var x = a.length;
+ var y = b.length;
+
+ for (var i = 0, len = Math.min(x, y); i < len; ++i) {
+ if (a[i] !== b[i]) {
+ x = a[i];
+ y = b[i];
+ break;
+ }
+ }
+
+ if (x < y) return -1;
+ if (y < x) return 1;
+ return 0;
+ };
+
+ Buffer.isEncoding = function isEncoding(encoding) {
+ switch (String(encoding).toLowerCase()) {
+ case 'hex':
+ case 'utf8':
+ case 'utf-8':
+ case 'ascii':
+ case 'latin1':
+ case 'binary':
+ case 'base64':
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return true;
+
+ default:
+ return false;
+ }
+ };
+
+ Buffer.concat = function concat(list, length) {
+ if (!isArray(list)) {
+ throw new TypeError('"list" argument must be an Array of Buffers');
+ }
+
+ if (list.length === 0) {
+ return Buffer.alloc(0);
+ }
+
+ var i;
+
+ if (length === undefined) {
+ length = 0;
+
+ for (i = 0; i < list.length; ++i) {
+ length += list[i].length;
+ }
+ }
+
+ var buffer = Buffer.allocUnsafe(length);
+ var pos = 0;
+
+ for (i = 0; i < list.length; ++i) {
+ var buf = list[i];
+
+ if (!internalIsBuffer(buf)) {
+ throw new TypeError('"list" argument must be an Array of Buffers');
+ }
+
+ buf.copy(buffer, pos);
+ pos += buf.length;
+ }
+
+ return buffer;
+ };
+
+ function byteLength(string, encoding) {
+ if (internalIsBuffer(string)) {
+ return string.length;
+ }
+
+ if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' && (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
+ return string.byteLength;
+ }
+
+ if (typeof string !== 'string') {
+ string = '' + string;
+ }
+
+ var len = string.length;
+ if (len === 0) return 0; // Use a for loop to avoid recursion
+
+ var loweredCase = false;
+
+ for (;;) {
+ switch (encoding) {
+ case 'ascii':
+ case 'latin1':
+ case 'binary':
+ return len;
+
+ case 'utf8':
+ case 'utf-8':
+ case undefined:
+ return utf8ToBytes(string).length;
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return len * 2;
+
+ case 'hex':
+ return len >>> 1;
+
+ case 'base64':
+ return base64ToBytes(string).length;
+
+ default:
+ if (loweredCase) return utf8ToBytes(string).length; // assume utf8
+
+ encoding = ('' + encoding).toLowerCase();
+ loweredCase = true;
+ }
+ }
+ }
+
+ Buffer.byteLength = byteLength;
+
+ function slowToString(encoding, start, end) {
+ var loweredCase = false; // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
+ // property of a typed array.
+ // This behaves neither like String nor Uint8Array in that we set start/end
+ // to their upper/lower bounds if the value passed is out of range.
+ // undefined is handled specially as per ECMA-262 6th Edition,
+ // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
+
+ if (start === undefined || start < 0) {
+ start = 0;
+ } // Return early if start > this.length. Done here to prevent potential uint32
+ // coercion fail below.
+
+
+ if (start > this.length) {
+ return '';
+ }
+
+ if (end === undefined || end > this.length) {
+ end = this.length;
+ }
+
+ if (end <= 0) {
+ return '';
+ } // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
+
+
+ end >>>= 0;
+ start >>>= 0;
+
+ if (end <= start) {
+ return '';
+ }
+
+ if (!encoding) encoding = 'utf8';
+
+ while (true) {
+ switch (encoding) {
+ case 'hex':
+ return hexSlice(this, start, end);
+
+ case 'utf8':
+ case 'utf-8':
+ return utf8Slice(this, start, end);
+
+ case 'ascii':
+ return asciiSlice(this, start, end);
+
+ case 'latin1':
+ case 'binary':
+ return latin1Slice(this, start, end);
+
+ case 'base64':
+ return base64Slice(this, start, end);
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return utf16leSlice(this, start, end);
+
+ default:
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding);
+ encoding = (encoding + '').toLowerCase();
+ loweredCase = true;
+ }
+ }
+ } // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
+ // Buffer instances.
+
+
+ Buffer.prototype._isBuffer = true;
+
+ function swap(b, n, m) {
+ var i = b[n];
+ b[n] = b[m];
+ b[m] = i;
+ }
+
+ Buffer.prototype.swap16 = function swap16() {
+ var len = this.length;
+
+ if (len % 2 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 16-bits');
+ }
+
+ for (var i = 0; i < len; i += 2) {
+ swap(this, i, i + 1);
+ }
+
+ return this;
+ };
+
+ Buffer.prototype.swap32 = function swap32() {
+ var len = this.length;
+
+ if (len % 4 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 32-bits');
+ }
+
+ for (var i = 0; i < len; i += 4) {
+ swap(this, i, i + 3);
+ swap(this, i + 1, i + 2);
+ }
+
+ return this;
+ };
+
+ Buffer.prototype.swap64 = function swap64() {
+ var len = this.length;
+
+ if (len % 8 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 64-bits');
+ }
+
+ for (var i = 0; i < len; i += 8) {
+ swap(this, i, i + 7);
+ swap(this, i + 1, i + 6);
+ swap(this, i + 2, i + 5);
+ swap(this, i + 3, i + 4);
+ }
+
+ return this;
+ };
+
+ Buffer.prototype.toString = function toString() {
+ var length = this.length | 0;
+ if (length === 0) return '';
+ if (arguments.length === 0) return utf8Slice(this, 0, length);
+ return slowToString.apply(this, arguments);
+ };
+
+ Buffer.prototype.equals = function equals(b) {
+ if (!internalIsBuffer(b)) throw new TypeError('Argument must be a Buffer');
+ if (this === b) return true;
+ return Buffer.compare(this, b) === 0;
+ };
+
+ Buffer.prototype.inspect = function inspect() {
+ var str = '';
+ var max = INSPECT_MAX_BYTES;
+
+ if (this.length > 0) {
+ str = this.toString('hex', 0, max).match(/.{2}/g).join(' ');
+ if (this.length > max) str += ' ... ';
+ }
+
+ return '';
+ };
+
+ Buffer.prototype.compare = function compare(target, start, end, thisStart, thisEnd) {
+ if (!internalIsBuffer(target)) {
+ throw new TypeError('Argument must be a Buffer');
+ }
+
+ if (start === undefined) {
+ start = 0;
+ }
+
+ if (end === undefined) {
+ end = target ? target.length : 0;
+ }
+
+ if (thisStart === undefined) {
+ thisStart = 0;
+ }
+
+ if (thisEnd === undefined) {
+ thisEnd = this.length;
+ }
+
+ if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
+ throw new RangeError('out of range index');
+ }
+
+ if (thisStart >= thisEnd && start >= end) {
+ return 0;
+ }
+
+ if (thisStart >= thisEnd) {
+ return -1;
+ }
+
+ if (start >= end) {
+ return 1;
+ }
+
+ start >>>= 0;
+ end >>>= 0;
+ thisStart >>>= 0;
+ thisEnd >>>= 0;
+ if (this === target) return 0;
+ var x = thisEnd - thisStart;
+ var y = end - start;
+ var len = Math.min(x, y);
+ var thisCopy = this.slice(thisStart, thisEnd);
+ var targetCopy = target.slice(start, end);
+
+ for (var i = 0; i < len; ++i) {
+ if (thisCopy[i] !== targetCopy[i]) {
+ x = thisCopy[i];
+ y = targetCopy[i];
+ break;
+ }
+ }
+
+ if (x < y) return -1;
+ if (y < x) return 1;
+ return 0;
+ }; // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
+ // OR the last index of `val` in `buffer` at offset <= `byteOffset`.
+ //
+ // Arguments:
+ // - buffer - a Buffer to search
+ // - val - a string, Buffer, or number
+ // - byteOffset - an index into `buffer`; will be clamped to an int32
+ // - encoding - an optional encoding, relevant is val is a string
+ // - dir - true for indexOf, false for lastIndexOf
+
+
+ function bidirectionalIndexOf(buffer, val, byteOffset, encoding, dir) {
+ // Empty buffer means no match
+ if (buffer.length === 0) return -1; // Normalize byteOffset
+
+ if (typeof byteOffset === 'string') {
+ encoding = byteOffset;
+ byteOffset = 0;
+ } else if (byteOffset > 0x7fffffff) {
+ byteOffset = 0x7fffffff;
+ } else if (byteOffset < -0x80000000) {
+ byteOffset = -0x80000000;
+ }
+
+ byteOffset = +byteOffset; // Coerce to Number.
+
+ if (isNaN(byteOffset)) {
+ // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
+ byteOffset = dir ? 0 : buffer.length - 1;
+ } // Normalize byteOffset: negative offsets start from the end of the buffer
+
+
+ if (byteOffset < 0) byteOffset = buffer.length + byteOffset;
+
+ if (byteOffset >= buffer.length) {
+ if (dir) return -1;else byteOffset = buffer.length - 1;
+ } else if (byteOffset < 0) {
+ if (dir) byteOffset = 0;else return -1;
+ } // Normalize val
+
+
+ if (typeof val === 'string') {
+ val = Buffer.from(val, encoding);
+ } // Finally, search either indexOf (if dir is true) or lastIndexOf
+
+
+ if (internalIsBuffer(val)) {
+ // Special case: looking for empty string/buffer always fails
+ if (val.length === 0) {
+ return -1;
+ }
+
+ return arrayIndexOf(buffer, val, byteOffset, encoding, dir);
+ } else if (typeof val === 'number') {
+ val = val & 0xFF; // Search for a byte value [0-255]
+
+ if (Buffer.TYPED_ARRAY_SUPPORT && typeof Uint8Array.prototype.indexOf === 'function') {
+ if (dir) {
+ return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset);
+ } else {
+ return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset);
+ }
+ }
+
+ return arrayIndexOf(buffer, [val], byteOffset, encoding, dir);
+ }
+
+ throw new TypeError('val must be string, number or Buffer');
+ }
+
+ function arrayIndexOf(arr, val, byteOffset, encoding, dir) {
+ var indexSize = 1;
+ var arrLength = arr.length;
+ var valLength = val.length;
+
+ if (encoding !== undefined) {
+ encoding = String(encoding).toLowerCase();
+
+ if (encoding === 'ucs2' || encoding === 'ucs-2' || encoding === 'utf16le' || encoding === 'utf-16le') {
+ if (arr.length < 2 || val.length < 2) {
+ return -1;
+ }
+
+ indexSize = 2;
+ arrLength /= 2;
+ valLength /= 2;
+ byteOffset /= 2;
+ }
+ }
+
+ function read(buf, i) {
+ if (indexSize === 1) {
+ return buf[i];
+ } else {
+ return buf.readUInt16BE(i * indexSize);
+ }
+ }
+
+ var i;
+
+ if (dir) {
+ var foundIndex = -1;
+
+ for (i = byteOffset; i < arrLength; i++) {
+ if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
+ if (foundIndex === -1) foundIndex = i;
+ if (i - foundIndex + 1 === valLength) return foundIndex * indexSize;
+ } else {
+ if (foundIndex !== -1) i -= i - foundIndex;
+ foundIndex = -1;
+ }
+ }
+ } else {
+ if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength;
+
+ for (i = byteOffset; i >= 0; i--) {
+ var found = true;
+
+ for (var j = 0; j < valLength; j++) {
+ if (read(arr, i + j) !== read(val, j)) {
+ found = false;
+ break;
+ }
+ }
+
+ if (found) return i;
+ }
+ }
+
+ return -1;
+ }
+
+ Buffer.prototype.includes = function includes(val, byteOffset, encoding) {
+ return this.indexOf(val, byteOffset, encoding) !== -1;
+ };
+
+ Buffer.prototype.indexOf = function indexOf(val, byteOffset, encoding) {
+ return bidirectionalIndexOf(this, val, byteOffset, encoding, true);
+ };
+
+ Buffer.prototype.lastIndexOf = function lastIndexOf(val, byteOffset, encoding) {
+ return bidirectionalIndexOf(this, val, byteOffset, encoding, false);
+ };
+
+ function hexWrite(buf, string, offset, length) {
+ offset = Number(offset) || 0;
+ var remaining = buf.length - offset;
+
+ if (!length) {
+ length = remaining;
+ } else {
+ length = Number(length);
+
+ if (length > remaining) {
+ length = remaining;
+ }
+ } // must be an even number of digits
+
+
+ var strLen = string.length;
+ if (strLen % 2 !== 0) throw new TypeError('Invalid hex string');
+
+ if (length > strLen / 2) {
+ length = strLen / 2;
+ }
+
+ for (var i = 0; i < length; ++i) {
+ var parsed = parseInt(string.substr(i * 2, 2), 16);
+ if (isNaN(parsed)) return i;
+ buf[offset + i] = parsed;
+ }
+
+ return i;
+ }
+
+ function utf8Write(buf, string, offset, length) {
+ return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length);
+ }
+
+ function asciiWrite(buf, string, offset, length) {
+ return blitBuffer(asciiToBytes(string), buf, offset, length);
+ }
+
+ function latin1Write(buf, string, offset, length) {
+ return asciiWrite(buf, string, offset, length);
+ }
+
+ function base64Write(buf, string, offset, length) {
+ return blitBuffer(base64ToBytes(string), buf, offset, length);
+ }
+
+ function ucs2Write(buf, string, offset, length) {
+ return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length);
+ }
+
+ Buffer.prototype.write = function write(string, offset, length, encoding) {
+ // Buffer#write(string)
+ if (offset === undefined) {
+ encoding = 'utf8';
+ length = this.length;
+ offset = 0; // Buffer#write(string, encoding)
+ } else if (length === undefined && typeof offset === 'string') {
+ encoding = offset;
+ length = this.length;
+ offset = 0; // Buffer#write(string, offset[, length][, encoding])
+ } else if (isFinite(offset)) {
+ offset = offset | 0;
+
+ if (isFinite(length)) {
+ length = length | 0;
+ if (encoding === undefined) encoding = 'utf8';
+ } else {
+ encoding = length;
+ length = undefined;
+ } // legacy write(string, encoding, offset, length) - remove in v0.13
+
+ } else {
+ throw new Error('Buffer.write(string, encoding, offset[, length]) is no longer supported');
+ }
+
+ var remaining = this.length - offset;
+ if (length === undefined || length > remaining) length = remaining;
+
+ if (string.length > 0 && (length < 0 || offset < 0) || offset > this.length) {
+ throw new RangeError('Attempt to write outside buffer bounds');
+ }
+
+ if (!encoding) encoding = 'utf8';
+ var loweredCase = false;
+
+ for (;;) {
+ switch (encoding) {
+ case 'hex':
+ return hexWrite(this, string, offset, length);
+
+ case 'utf8':
+ case 'utf-8':
+ return utf8Write(this, string, offset, length);
+
+ case 'ascii':
+ return asciiWrite(this, string, offset, length);
+
+ case 'latin1':
+ case 'binary':
+ return latin1Write(this, string, offset, length);
+
+ case 'base64':
+ // Warning: maxLength not taken into account in base64Write
+ return base64Write(this, string, offset, length);
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return ucs2Write(this, string, offset, length);
+
+ default:
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding);
+ encoding = ('' + encoding).toLowerCase();
+ loweredCase = true;
+ }
+ }
+ };
+
+ Buffer.prototype.toJSON = function toJSON() {
+ return {
+ type: 'Buffer',
+ data: Array.prototype.slice.call(this._arr || this, 0)
+ };
+ };
+
+ function base64Slice(buf, start, end) {
+ if (start === 0 && end === buf.length) {
+ return fromByteArray(buf);
+ } else {
+ return fromByteArray(buf.slice(start, end));
+ }
+ }
+
+ function utf8Slice(buf, start, end) {
+ end = Math.min(buf.length, end);
+ var res = [];
+ var i = start;
+
+ while (i < end) {
+ var firstByte = buf[i];
+ var codePoint = null;
+ var bytesPerSequence = firstByte > 0xEF ? 4 : firstByte > 0xDF ? 3 : firstByte > 0xBF ? 2 : 1;
+
+ if (i + bytesPerSequence <= end) {
+ var secondByte, thirdByte, fourthByte, tempCodePoint;
+
+ switch (bytesPerSequence) {
+ case 1:
+ if (firstByte < 0x80) {
+ codePoint = firstByte;
+ }
+
+ break;
+
+ case 2:
+ secondByte = buf[i + 1];
+
+ if ((secondByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0x1F) << 0x6 | secondByte & 0x3F;
+
+ if (tempCodePoint > 0x7F) {
+ codePoint = tempCodePoint;
+ }
+ }
+
+ break;
+
+ case 3:
+ secondByte = buf[i + 1];
+ thirdByte = buf[i + 2];
+
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | thirdByte & 0x3F;
+
+ if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
+ codePoint = tempCodePoint;
+ }
+ }
+
+ break;
+
+ case 4:
+ secondByte = buf[i + 1];
+ thirdByte = buf[i + 2];
+ fourthByte = buf[i + 3];
+
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | fourthByte & 0x3F;
+
+ if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
+ codePoint = tempCodePoint;
+ }
+ }
+
+ }
+ }
+
+ if (codePoint === null) {
+ // we did not generate a valid codePoint so insert a
+ // replacement char (U+FFFD) and advance only 1 byte
+ codePoint = 0xFFFD;
+ bytesPerSequence = 1;
+ } else if (codePoint > 0xFFFF) {
+ // encode to utf16 (surrogate pair dance)
+ codePoint -= 0x10000;
+ res.push(codePoint >>> 10 & 0x3FF | 0xD800);
+ codePoint = 0xDC00 | codePoint & 0x3FF;
+ }
+
+ res.push(codePoint);
+ i += bytesPerSequence;
+ }
+
+ return decodeCodePointsArray(res);
+ } // Based on http://stackoverflow.com/a/22747272/680742, the browser with
+ // the lowest limit is Chrome, with 0x10000 args.
+ // We go 1 magnitude less, for safety
+
+
+ var MAX_ARGUMENTS_LENGTH = 0x1000;
+
+ function decodeCodePointsArray(codePoints) {
+ var len = codePoints.length;
+
+ if (len <= MAX_ARGUMENTS_LENGTH) {
+ return String.fromCharCode.apply(String, codePoints); // avoid extra slice()
+ } // Decode in chunks to avoid "call stack size exceeded".
+
+
+ var res = '';
+ var i = 0;
+
+ while (i < len) {
+ res += String.fromCharCode.apply(String, codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH));
+ }
+
+ return res;
+ }
+
+ function asciiSlice(buf, start, end) {
+ var ret = '';
+ end = Math.min(buf.length, end);
+
+ for (var i = start; i < end; ++i) {
+ ret += String.fromCharCode(buf[i] & 0x7F);
+ }
+
+ return ret;
+ }
+
+ function latin1Slice(buf, start, end) {
+ var ret = '';
+ end = Math.min(buf.length, end);
+
+ for (var i = start; i < end; ++i) {
+ ret += String.fromCharCode(buf[i]);
+ }
+
+ return ret;
+ }
+
+ function hexSlice(buf, start, end) {
+ var len = buf.length;
+ if (!start || start < 0) start = 0;
+ if (!end || end < 0 || end > len) end = len;
+ var out = '';
+
+ for (var i = start; i < end; ++i) {
+ out += toHex(buf[i]);
+ }
+
+ return out;
+ }
+
+ function utf16leSlice(buf, start, end) {
+ var bytes = buf.slice(start, end);
+ var res = '';
+
+ for (var i = 0; i < bytes.length; i += 2) {
+ res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256);
+ }
+
+ return res;
+ }
+
+ Buffer.prototype.slice = function slice(start, end) {
+ var len = this.length;
+ start = ~~start;
+ end = end === undefined ? len : ~~end;
+
+ if (start < 0) {
+ start += len;
+ if (start < 0) start = 0;
+ } else if (start > len) {
+ start = len;
+ }
+
+ if (end < 0) {
+ end += len;
+ if (end < 0) end = 0;
+ } else if (end > len) {
+ end = len;
+ }
+
+ if (end < start) end = start;
+ var newBuf;
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ newBuf = this.subarray(start, end);
+ newBuf.__proto__ = Buffer.prototype;
+ } else {
+ var sliceLen = end - start;
+ newBuf = new Buffer(sliceLen, undefined);
+
+ for (var i = 0; i < sliceLen; ++i) {
+ newBuf[i] = this[i + start];
+ }
+ }
+
+ return newBuf;
+ };
+ /*
+ * Need to make sure that buffer isn't trying to write out of bounds.
+ */
+
+
+ function checkOffset(offset, ext, length) {
+ if (offset % 1 !== 0 || offset < 0) throw new RangeError('offset is not uint');
+ if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length');
+ }
+
+ Buffer.prototype.readUIntLE = function readUIntLE(offset, byteLength, noAssert) {
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+ if (!noAssert) checkOffset(offset, byteLength, this.length);
+ var val = this[offset];
+ var mul = 1;
+ var i = 0;
+
+ while (++i < byteLength && (mul *= 0x100)) {
+ val += this[offset + i] * mul;
+ }
+
+ return val;
+ };
+
+ Buffer.prototype.readUIntBE = function readUIntBE(offset, byteLength, noAssert) {
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+
+ if (!noAssert) {
+ checkOffset(offset, byteLength, this.length);
+ }
+
+ var val = this[offset + --byteLength];
+ var mul = 1;
+
+ while (byteLength > 0 && (mul *= 0x100)) {
+ val += this[offset + --byteLength] * mul;
+ }
+
+ return val;
+ };
+
+ Buffer.prototype.readUInt8 = function readUInt8(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 1, this.length);
+ return this[offset];
+ };
+
+ Buffer.prototype.readUInt16LE = function readUInt16LE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length);
+ return this[offset] | this[offset + 1] << 8;
+ };
+
+ Buffer.prototype.readUInt16BE = function readUInt16BE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length);
+ return this[offset] << 8 | this[offset + 1];
+ };
+
+ Buffer.prototype.readUInt32LE = function readUInt32LE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length);
+ return (this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16) + this[offset + 3] * 0x1000000;
+ };
+
+ Buffer.prototype.readUInt32BE = function readUInt32BE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length);
+ return this[offset] * 0x1000000 + (this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3]);
+ };
+
+ Buffer.prototype.readIntLE = function readIntLE(offset, byteLength, noAssert) {
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+ if (!noAssert) checkOffset(offset, byteLength, this.length);
+ var val = this[offset];
+ var mul = 1;
+ var i = 0;
+
+ while (++i < byteLength && (mul *= 0x100)) {
+ val += this[offset + i] * mul;
+ }
+
+ mul *= 0x80;
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength);
+ return val;
+ };
+
+ Buffer.prototype.readIntBE = function readIntBE(offset, byteLength, noAssert) {
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+ if (!noAssert) checkOffset(offset, byteLength, this.length);
+ var i = byteLength;
+ var mul = 1;
+ var val = this[offset + --i];
+
+ while (i > 0 && (mul *= 0x100)) {
+ val += this[offset + --i] * mul;
+ }
+
+ mul *= 0x80;
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength);
+ return val;
+ };
+
+ Buffer.prototype.readInt8 = function readInt8(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 1, this.length);
+ if (!(this[offset] & 0x80)) return this[offset];
+ return (0xff - this[offset] + 1) * -1;
+ };
+
+ Buffer.prototype.readInt16LE = function readInt16LE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length);
+ var val = this[offset] | this[offset + 1] << 8;
+ return val & 0x8000 ? val | 0xFFFF0000 : val;
+ };
+
+ Buffer.prototype.readInt16BE = function readInt16BE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length);
+ var val = this[offset + 1] | this[offset] << 8;
+ return val & 0x8000 ? val | 0xFFFF0000 : val;
+ };
+
+ Buffer.prototype.readInt32LE = function readInt32LE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length);
+ return this[offset] | this[offset + 1] << 8 | this[offset + 2] << 16 | this[offset + 3] << 24;
+ };
+
+ Buffer.prototype.readInt32BE = function readInt32BE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length);
+ return this[offset] << 24 | this[offset + 1] << 16 | this[offset + 2] << 8 | this[offset + 3];
+ };
+
+ Buffer.prototype.readFloatLE = function readFloatLE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length);
+ return read(this, offset, true, 23, 4);
+ };
+
+ Buffer.prototype.readFloatBE = function readFloatBE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length);
+ return read(this, offset, false, 23, 4);
+ };
+
+ Buffer.prototype.readDoubleLE = function readDoubleLE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 8, this.length);
+ return read(this, offset, true, 52, 8);
+ };
+
+ Buffer.prototype.readDoubleBE = function readDoubleBE(offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 8, this.length);
+ return read(this, offset, false, 52, 8);
+ };
+
+ function checkInt(buf, value, offset, ext, max, min) {
+ if (!internalIsBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance');
+ if (value > max || value < min) throw new RangeError('"value" argument is out of bounds');
+ if (offset + ext > buf.length) throw new RangeError('Index out of range');
+ }
+
+ Buffer.prototype.writeUIntLE = function writeUIntLE(value, offset, byteLength, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+
+ if (!noAssert) {
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1;
+ checkInt(this, value, offset, byteLength, maxBytes, 0);
+ }
+
+ var mul = 1;
+ var i = 0;
+ this[offset] = value & 0xFF;
+
+ while (++i < byteLength && (mul *= 0x100)) {
+ this[offset + i] = value / mul & 0xFF;
+ }
+
+ return offset + byteLength;
+ };
+
+ Buffer.prototype.writeUIntBE = function writeUIntBE(value, offset, byteLength, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+
+ if (!noAssert) {
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1;
+ checkInt(this, value, offset, byteLength, maxBytes, 0);
+ }
+
+ var i = byteLength - 1;
+ var mul = 1;
+ this[offset + i] = value & 0xFF;
+
+ while (--i >= 0 && (mul *= 0x100)) {
+ this[offset + i] = value / mul & 0xFF;
+ }
+
+ return offset + byteLength;
+ };
+
+ Buffer.prototype.writeUInt8 = function writeUInt8(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0);
+ if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value);
+ this[offset] = value & 0xff;
+ return offset + 1;
+ };
+
+ function objectWriteUInt16(buf, value, offset, littleEndian) {
+ if (value < 0) value = 0xffff + value + 1;
+
+ for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
+ buf[offset + i] = (value & 0xff << 8 * (littleEndian ? i : 1 - i)) >>> (littleEndian ? i : 1 - i) * 8;
+ }
+ }
+
+ Buffer.prototype.writeUInt16LE = function writeUInt16LE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value & 0xff;
+ this[offset + 1] = value >>> 8;
+ } else {
+ objectWriteUInt16(this, value, offset, true);
+ }
+
+ return offset + 2;
+ };
+
+ Buffer.prototype.writeUInt16BE = function writeUInt16BE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value >>> 8;
+ this[offset + 1] = value & 0xff;
+ } else {
+ objectWriteUInt16(this, value, offset, false);
+ }
+
+ return offset + 2;
+ };
+
+ function objectWriteUInt32(buf, value, offset, littleEndian) {
+ if (value < 0) value = 0xffffffff + value + 1;
+
+ for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
+ buf[offset + i] = value >>> (littleEndian ? i : 3 - i) * 8 & 0xff;
+ }
+ }
+
+ Buffer.prototype.writeUInt32LE = function writeUInt32LE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset + 3] = value >>> 24;
+ this[offset + 2] = value >>> 16;
+ this[offset + 1] = value >>> 8;
+ this[offset] = value & 0xff;
+ } else {
+ objectWriteUInt32(this, value, offset, true);
+ }
+
+ return offset + 4;
+ };
+
+ Buffer.prototype.writeUInt32BE = function writeUInt32BE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value >>> 24;
+ this[offset + 1] = value >>> 16;
+ this[offset + 2] = value >>> 8;
+ this[offset + 3] = value & 0xff;
+ } else {
+ objectWriteUInt32(this, value, offset, false);
+ }
+
+ return offset + 4;
+ };
+
+ Buffer.prototype.writeIntLE = function writeIntLE(value, offset, byteLength, noAssert) {
+ value = +value;
+ offset = offset | 0;
+
+ if (!noAssert) {
+ var limit = Math.pow(2, 8 * byteLength - 1);
+ checkInt(this, value, offset, byteLength, limit - 1, -limit);
+ }
+
+ var i = 0;
+ var mul = 1;
+ var sub = 0;
+ this[offset] = value & 0xFF;
+
+ while (++i < byteLength && (mul *= 0x100)) {
+ if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
+ sub = 1;
+ }
+
+ this[offset + i] = (value / mul >> 0) - sub & 0xFF;
+ }
+
+ return offset + byteLength;
+ };
+
+ Buffer.prototype.writeIntBE = function writeIntBE(value, offset, byteLength, noAssert) {
+ value = +value;
+ offset = offset | 0;
+
+ if (!noAssert) {
+ var limit = Math.pow(2, 8 * byteLength - 1);
+ checkInt(this, value, offset, byteLength, limit - 1, -limit);
+ }
+
+ var i = byteLength - 1;
+ var mul = 1;
+ var sub = 0;
+ this[offset + i] = value & 0xFF;
+
+ while (--i >= 0 && (mul *= 0x100)) {
+ if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
+ sub = 1;
+ }
+
+ this[offset + i] = (value / mul >> 0) - sub & 0xFF;
+ }
+
+ return offset + byteLength;
+ };
+
+ Buffer.prototype.writeInt8 = function writeInt8(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80);
+ if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value);
+ if (value < 0) value = 0xff + value + 1;
+ this[offset] = value & 0xff;
+ return offset + 1;
+ };
+
+ Buffer.prototype.writeInt16LE = function writeInt16LE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000);
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value & 0xff;
+ this[offset + 1] = value >>> 8;
+ } else {
+ objectWriteUInt16(this, value, offset, true);
+ }
+
+ return offset + 2;
+ };
+
+ Buffer.prototype.writeInt16BE = function writeInt16BE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000);
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value >>> 8;
+ this[offset + 1] = value & 0xff;
+ } else {
+ objectWriteUInt16(this, value, offset, false);
+ }
+
+ return offset + 2;
+ };
+
+ Buffer.prototype.writeInt32LE = function writeInt32LE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value & 0xff;
+ this[offset + 1] = value >>> 8;
+ this[offset + 2] = value >>> 16;
+ this[offset + 3] = value >>> 24;
+ } else {
+ objectWriteUInt32(this, value, offset, true);
+ }
+
+ return offset + 4;
+ };
+
+ Buffer.prototype.writeInt32BE = function writeInt32BE(value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);
+ if (value < 0) value = 0xffffffff + value + 1;
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = value >>> 24;
+ this[offset + 1] = value >>> 16;
+ this[offset + 2] = value >>> 8;
+ this[offset + 3] = value & 0xff;
+ } else {
+ objectWriteUInt32(this, value, offset, false);
+ }
+
+ return offset + 4;
+ };
+
+ function checkIEEE754(buf, value, offset, ext, max, min) {
+ if (offset + ext > buf.length) throw new RangeError('Index out of range');
+ if (offset < 0) throw new RangeError('Index out of range');
+ }
+
+ function writeFloat(buf, value, offset, littleEndian, noAssert) {
+ if (!noAssert) {
+ checkIEEE754(buf, value, offset, 4);
+ }
+
+ write(buf, value, offset, littleEndian, 23, 4);
+ return offset + 4;
+ }
+
+ Buffer.prototype.writeFloatLE = function writeFloatLE(value, offset, noAssert) {
+ return writeFloat(this, value, offset, true, noAssert);
+ };
+
+ Buffer.prototype.writeFloatBE = function writeFloatBE(value, offset, noAssert) {
+ return writeFloat(this, value, offset, false, noAssert);
+ };
+
+ function writeDouble(buf, value, offset, littleEndian, noAssert) {
+ if (!noAssert) {
+ checkIEEE754(buf, value, offset, 8);
+ }
+
+ write(buf, value, offset, littleEndian, 52, 8);
+ return offset + 8;
+ }
+
+ Buffer.prototype.writeDoubleLE = function writeDoubleLE(value, offset, noAssert) {
+ return writeDouble(this, value, offset, true, noAssert);
+ };
+
+ Buffer.prototype.writeDoubleBE = function writeDoubleBE(value, offset, noAssert) {
+ return writeDouble(this, value, offset, false, noAssert);
+ }; // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
+
+
+ Buffer.prototype.copy = function copy(target, targetStart, start, end) {
+ if (!start) start = 0;
+ if (!end && end !== 0) end = this.length;
+ if (targetStart >= target.length) targetStart = target.length;
+ if (!targetStart) targetStart = 0;
+ if (end > 0 && end < start) end = start; // Copy 0 bytes; we're done
+
+ if (end === start) return 0;
+ if (target.length === 0 || this.length === 0) return 0; // Fatal error conditions
+
+ if (targetStart < 0) {
+ throw new RangeError('targetStart out of bounds');
+ }
+
+ if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds');
+ if (end < 0) throw new RangeError('sourceEnd out of bounds'); // Are we oob?
+
+ if (end > this.length) end = this.length;
+
+ if (target.length - targetStart < end - start) {
+ end = target.length - targetStart + start;
+ }
+
+ var len = end - start;
+ var i;
+
+ if (this === target && start < targetStart && targetStart < end) {
+ // descending copy from end
+ for (i = len - 1; i >= 0; --i) {
+ target[i + targetStart] = this[i + start];
+ }
+ } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
+ // ascending copy from start
+ for (i = 0; i < len; ++i) {
+ target[i + targetStart] = this[i + start];
+ }
+ } else {
+ Uint8Array.prototype.set.call(target, this.subarray(start, start + len), targetStart);
+ }
+
+ return len;
+ }; // Usage:
+ // buffer.fill(number[, offset[, end]])
+ // buffer.fill(buffer[, offset[, end]])
+ // buffer.fill(string[, offset[, end]][, encoding])
+
+
+ Buffer.prototype.fill = function fill(val, start, end, encoding) {
+ // Handle string cases:
+ if (typeof val === 'string') {
+ if (typeof start === 'string') {
+ encoding = start;
+ start = 0;
+ end = this.length;
+ } else if (typeof end === 'string') {
+ encoding = end;
+ end = this.length;
+ }
+
+ if (val.length === 1) {
+ var code = val.charCodeAt(0);
+
+ if (code < 256) {
+ val = code;
+ }
+ }
+
+ if (encoding !== undefined && typeof encoding !== 'string') {
+ throw new TypeError('encoding must be a string');
+ }
+
+ if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
+ throw new TypeError('Unknown encoding: ' + encoding);
+ }
+ } else if (typeof val === 'number') {
+ val = val & 255;
+ } // Invalid ranges are not set to a default, so can range check early.
+
+
+ if (start < 0 || this.length < start || this.length < end) {
+ throw new RangeError('Out of range index');
+ }
+
+ if (end <= start) {
+ return this;
+ }
+
+ start = start >>> 0;
+ end = end === undefined ? this.length : end >>> 0;
+ if (!val) val = 0;
+ var i;
+
+ if (typeof val === 'number') {
+ for (i = start; i < end; ++i) {
+ this[i] = val;
+ }
+ } else {
+ var bytes = internalIsBuffer(val) ? val : utf8ToBytes(new Buffer(val, encoding).toString());
+ var len = bytes.length;
+
+ for (i = 0; i < end - start; ++i) {
+ this[i + start] = bytes[i % len];
+ }
+ }
+
+ return this;
+ }; // HELPER FUNCTIONS
+ // ================
+
+
+ var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g;
+
+ function base64clean(str) {
+ // Node strips out invalid characters like \n and \t from the string, base64-js does not
+ str = stringtrim(str).replace(INVALID_BASE64_RE, ''); // Node converts strings with length < 2 to ''
+
+ if (str.length < 2) return ''; // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
+
+ while (str.length % 4 !== 0) {
+ str = str + '=';
+ }
+
+ return str;
+ }
+
+ function stringtrim(str) {
+ if (str.trim) return str.trim();
+ return str.replace(/^\s+|\s+$/g, '');
+ }
+
+ function toHex(n) {
+ if (n < 16) return '0' + n.toString(16);
+ return n.toString(16);
+ }
+
+ function utf8ToBytes(string, units) {
+ units = units || Infinity;
+ var codePoint;
+ var length = string.length;
+ var leadSurrogate = null;
+ var bytes = [];
+
+ for (var i = 0; i < length; ++i) {
+ codePoint = string.charCodeAt(i); // is surrogate component
+
+ if (codePoint > 0xD7FF && codePoint < 0xE000) {
+ // last char was a lead
+ if (!leadSurrogate) {
+ // no lead yet
+ if (codePoint > 0xDBFF) {
+ // unexpected trail
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
+ continue;
+ } else if (i + 1 === length) {
+ // unpaired lead
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
+ continue;
+ } // valid lead
+
+
+ leadSurrogate = codePoint;
+ continue;
+ } // 2 leads in a row
+
+
+ if (codePoint < 0xDC00) {
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
+ leadSurrogate = codePoint;
+ continue;
+ } // valid surrogate pair
+
+
+ codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000;
+ } else if (leadSurrogate) {
+ // valid bmp char, but last char was a lead
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
+ }
+
+ leadSurrogate = null; // encode utf8
+
+ if (codePoint < 0x80) {
+ if ((units -= 1) < 0) break;
+ bytes.push(codePoint);
+ } else if (codePoint < 0x800) {
+ if ((units -= 2) < 0) break;
+ bytes.push(codePoint >> 0x6 | 0xC0, codePoint & 0x3F | 0x80);
+ } else if (codePoint < 0x10000) {
+ if ((units -= 3) < 0) break;
+ bytes.push(codePoint >> 0xC | 0xE0, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80);
+ } else if (codePoint < 0x110000) {
+ if ((units -= 4) < 0) break;
+ bytes.push(codePoint >> 0x12 | 0xF0, codePoint >> 0xC & 0x3F | 0x80, codePoint >> 0x6 & 0x3F | 0x80, codePoint & 0x3F | 0x80);
+ } else {
+ throw new Error('Invalid code point');
+ }
+ }
+
+ return bytes;
+ }
+
+ function asciiToBytes(str) {
+ var byteArray = [];
+
+ for (var i = 0; i < str.length; ++i) {
+ // Node's code seems to be doing this and not & 0x7F..
+ byteArray.push(str.charCodeAt(i) & 0xFF);
+ }
+
+ return byteArray;
+ }
+
+ function utf16leToBytes(str, units) {
+ var c, hi, lo;
+ var byteArray = [];
+
+ for (var i = 0; i < str.length; ++i) {
+ if ((units -= 2) < 0) break;
+ c = str.charCodeAt(i);
+ hi = c >> 8;
+ lo = c % 256;
+ byteArray.push(lo);
+ byteArray.push(hi);
+ }
+
+ return byteArray;
+ }
+
+ function base64ToBytes(str) {
+ return toByteArray(base64clean(str));
+ }
+
+ function blitBuffer(src, dst, offset, length) {
+ for (var i = 0; i < length; ++i) {
+ if (i + offset >= dst.length || i >= src.length) break;
+ dst[i + offset] = src[i];
+ }
+
+ return i;
+ }
+
+ function isnan(val) {
+ return val !== val; // eslint-disable-line no-self-compare
+ } // the following is from is-buffer, also by Feross Aboukhadijeh and with same lisence
+ // The _isBuffer check is for Safari 5-7 support, because it's missing
+ // Object.prototype.constructor. Remove this eventually
+
+
+ function isBuffer(obj) {
+ return obj != null && (!!obj._isBuffer || isFastBuffer(obj) || isSlowBuffer(obj));
+ }
+
+ function isFastBuffer(obj) {
+ return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj);
+ } // For Node v0.10 support. Remove this eventually.
+
+
+ function isSlowBuffer(obj) {
+ return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer(obj.slice(0, 0));
+ }
+
+ function BufferList() {
+ this.head = null;
+ this.tail = null;
+ this.length = 0;
+ }
+
+ BufferList.prototype.push = function (v) {
+ var entry = {
+ data: v,
+ next: null
+ };
+ if (this.length > 0) this.tail.next = entry;else this.head = entry;
+ this.tail = entry;
+ ++this.length;
+ };
+
+ BufferList.prototype.unshift = function (v) {
+ var entry = {
+ data: v,
+ next: this.head
+ };
+ if (this.length === 0) this.tail = entry;
+ this.head = entry;
+ ++this.length;
+ };
+
+ BufferList.prototype.shift = function () {
+ if (this.length === 0) return;
+ var ret = this.head.data;
+ if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
+ --this.length;
+ return ret;
+ };
+
+ BufferList.prototype.clear = function () {
+ this.head = this.tail = null;
+ this.length = 0;
+ };
+
+ BufferList.prototype.join = function (s) {
+ if (this.length === 0) return '';
+ var p = this.head;
+ var ret = '' + p.data;
+
+ while (p = p.next) {
+ ret += s + p.data;
+ }
+
+ return ret;
+ };
+
+ BufferList.prototype.concat = function (n) {
+ if (this.length === 0) return Buffer.alloc(0);
+ if (this.length === 1) return this.head.data;
+ var ret = Buffer.allocUnsafe(n >>> 0);
+ var p = this.head;
+ var i = 0;
+
+ while (p) {
+ p.data.copy(ret, i);
+ i += p.data.length;
+ p = p.next;
+ }
+
+ return ret;
+ };
+
+ var isBufferEncoding = Buffer.isEncoding || function (encoding) {
+ switch (encoding && encoding.toLowerCase()) {
+ case 'hex':
+ case 'utf8':
+ case 'utf-8':
+ case 'ascii':
+ case 'binary':
+ case 'base64':
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ case 'raw':
+ return true;
+
+ default:
+ return false;
+ }
+ };
+
+ function assertEncoding(encoding) {
+ if (encoding && !isBufferEncoding(encoding)) {
+ throw new Error('Unknown encoding: ' + encoding);
+ }
+ } // StringDecoder provides an interface for efficiently splitting a series of
+ // buffers into a series of JS strings without breaking apart multi-byte
+ // characters. CESU-8 is handled as part of the UTF-8 encoding.
+ //
+ // @TODO Handling all encodings inside a single object makes it very difficult
+ // to reason about this code, so it should be split up in the future.
+ // @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code
+ // points as used by CESU-8.
+
+
+ function StringDecoder(encoding) {
+ this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');
+ assertEncoding(encoding);
+
+ switch (this.encoding) {
+ case 'utf8':
+ // CESU-8 represents each of Surrogate Pair by 3-bytes
+ this.surrogateSize = 3;
+ break;
+
+ case 'ucs2':
+ case 'utf16le':
+ // UTF-16 represents each of Surrogate Pair by 2-bytes
+ this.surrogateSize = 2;
+ this.detectIncompleteChar = utf16DetectIncompleteChar;
+ break;
+
+ case 'base64':
+ // Base-64 stores 3 bytes in 4 chars, and pads the remainder.
+ this.surrogateSize = 3;
+ this.detectIncompleteChar = base64DetectIncompleteChar;
+ break;
+
+ default:
+ this.write = passThroughWrite;
+ return;
+ } // Enough space to store all bytes of a single character. UTF-8 needs 4
+ // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).
+
+
+ this.charBuffer = new Buffer(6); // Number of bytes received for the current incomplete multi-byte character.
+
+ this.charReceived = 0; // Number of bytes expected for the current incomplete multi-byte character.
+
+ this.charLength = 0;
+ }
+ // guaranteed to not contain any partial multi-byte characters. Any partial
+ // character found at the end of the buffer is buffered up, and will be
+ // returned when calling write again with the remaining bytes.
+ //
+ // Note: Converting a Buffer containing an orphan surrogate to a String
+ // currently works, but converting a String to a Buffer (via `new Buffer`, or
+ // Buffer#write) will replace incomplete surrogates with the unicode
+ // replacement character. See https://codereview.chromium.org/121173009/ .
+
+ StringDecoder.prototype.write = function (buffer) {
+ var charStr = ''; // if our last write ended with an incomplete multibyte character
+
+ while (this.charLength) {
+ // determine how many remaining bytes this buffer has to offer for this char
+ var available = buffer.length >= this.charLength - this.charReceived ? this.charLength - this.charReceived : buffer.length; // add the new bytes to the char buffer
+
+ buffer.copy(this.charBuffer, this.charReceived, 0, available);
+ this.charReceived += available;
+
+ if (this.charReceived < this.charLength) {
+ // still not enough chars in this buffer? wait for more ...
+ return '';
+ } // remove bytes belonging to the current character from the buffer
+
+
+ buffer = buffer.slice(available, buffer.length); // get the character that was split
+
+ charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
+
+ var charCode = charStr.charCodeAt(charStr.length - 1);
+
+ if (charCode >= 0xD800 && charCode <= 0xDBFF) {
+ this.charLength += this.surrogateSize;
+ charStr = '';
+ continue;
+ }
+
+ this.charReceived = this.charLength = 0; // if there are no more bytes in this buffer, just emit our char
+
+ if (buffer.length === 0) {
+ return charStr;
+ }
+
+ break;
+ } // determine and set charLength / charReceived
+
+
+ this.detectIncompleteChar(buffer);
+ var end = buffer.length;
+
+ if (this.charLength) {
+ // buffer the incomplete character bytes we got
+ buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);
+ end -= this.charReceived;
+ }
+
+ charStr += buffer.toString(this.encoding, 0, end);
+ var end = charStr.length - 1;
+ var charCode = charStr.charCodeAt(end); // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
+
+ if (charCode >= 0xD800 && charCode <= 0xDBFF) {
+ var size = this.surrogateSize;
+ this.charLength += size;
+ this.charReceived += size;
+ this.charBuffer.copy(this.charBuffer, size, 0, size);
+ buffer.copy(this.charBuffer, 0, 0, size);
+ return charStr.substring(0, end);
+ } // or just emit the charStr
+
+
+ return charStr;
+ }; // detectIncompleteChar determines if there is an incomplete UTF-8 character at
+ // the end of the given buffer. If so, it sets this.charLength to the byte
+ // length that character, and sets this.charReceived to the number of bytes
+ // that are available for this character.
+
+
+ StringDecoder.prototype.detectIncompleteChar = function (buffer) {
+ // determine how many bytes we have to check at the end of this buffer
+ var i = buffer.length >= 3 ? 3 : buffer.length; // Figure out if one of the last i bytes of our buffer announces an
+ // incomplete char.
+
+ for (; i > 0; i--) {
+ var c = buffer[buffer.length - i]; // See http://en.wikipedia.org/wiki/UTF-8#Description
+ // 110XXXXX
+
+ if (i == 1 && c >> 5 == 0x06) {
+ this.charLength = 2;
+ break;
+ } // 1110XXXX
+
+
+ if (i <= 2 && c >> 4 == 0x0E) {
+ this.charLength = 3;
+ break;
+ } // 11110XXX
+
+
+ if (i <= 3 && c >> 3 == 0x1E) {
+ this.charLength = 4;
+ break;
+ }
+ }
+
+ this.charReceived = i;
+ };
+
+ StringDecoder.prototype.end = function (buffer) {
+ var res = '';
+ if (buffer && buffer.length) res = this.write(buffer);
+
+ if (this.charReceived) {
+ var cr = this.charReceived;
+ var buf = this.charBuffer;
+ var enc = this.encoding;
+ res += buf.slice(0, cr).toString(enc);
+ }
+
+ return res;
+ };
+
+ function passThroughWrite(buffer) {
+ return buffer.toString(this.encoding);
+ }
+
+ function utf16DetectIncompleteChar(buffer) {
+ this.charReceived = buffer.length % 2;
+ this.charLength = this.charReceived ? 2 : 0;
+ }
+
+ function base64DetectIncompleteChar(buffer) {
+ this.charReceived = buffer.length % 3;
+ this.charLength = this.charReceived ? 3 : 0;
+ }
+
+ Readable.ReadableState = ReadableState;
+ var debug$2 = debuglog('stream');
+ inherits$3(Readable, EventEmitter$2);
+
+ function prependListener(emitter, event, fn) {
+ // Sadly this is not cacheable as some libraries bundle their own
+ // event emitter implementation with them.
+ if (typeof emitter.prependListener === 'function') {
+ return emitter.prependListener(event, fn);
+ } else {
+ // This is a hack to make sure that our error handler is attached before any
+ // userland ones. NEVER DO THIS. This is here only because this code needs
+ // to continue to work with older versions of Node.js that do not include
+ // the prependListener() method. The goal is to eventually remove this hack.
+ if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
+ }
+ }
+
+ function listenerCount(emitter, type) {
+ return emitter.listeners(type).length;
+ }
+
+ function ReadableState(options, stream) {
+ options = options || {}; // object stream flag. Used to make read(n) ignore n and to
+ // make all the buffer merging and length checks go away
+
+ this.objectMode = !!options.objectMode;
+ if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer
+ // Note: 0 is a valid value, means "don't call _read preemptively ever"
+
+ var hwm = options.highWaterMark;
+ var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+ this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; // cast to ints.
+
+ this.highWaterMark = ~~this.highWaterMark; // A linked list is used to store data chunks instead of an array because the
+ // linked list can remove elements from the beginning faster than
+ // array.shift()
+
+ this.buffer = new BufferList();
+ this.length = 0;
+ this.pipes = null;
+ this.pipesCount = 0;
+ this.flowing = null;
+ this.ended = false;
+ this.endEmitted = false;
+ this.reading = false; // a flag to be able to tell if the onwrite cb is called immediately,
+ // or on a later tick. We set this to true at first, because any
+ // actions that shouldn't happen until "later" should generally also
+ // not happen before the first write call.
+
+ this.sync = true; // whenever we return null, then we set a flag to say
+ // that we're awaiting a 'readable' event emission.
+
+ this.needReadable = false;
+ this.emittedReadable = false;
+ this.readableListening = false;
+ this.resumeScheduled = false; // Crypto is kind of old and crusty. Historically, its default string
+ // encoding is 'binary' so we have to make this configurable.
+ // Everything else in the universe uses 'utf8', though.
+
+ this.defaultEncoding = options.defaultEncoding || 'utf8'; // when piping, we only care about 'readable' events that happen
+ // after read()ing all the bytes and not getting any pushback.
+
+ this.ranOut = false; // the number of writers that are awaiting a drain event in .pipe()s
+
+ this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled
+
+ this.readingMore = false;
+ this.decoder = null;
+ this.encoding = null;
+
+ if (options.encoding) {
+ this.decoder = new StringDecoder(options.encoding);
+ this.encoding = options.encoding;
+ }
+ }
+ function Readable(options) {
+ if (!(this instanceof Readable)) return new Readable(options);
+ this._readableState = new ReadableState(options, this); // legacy
+
+ this.readable = true;
+ if (options && typeof options.read === 'function') this._read = options.read;
+ EventEmitter$2.call(this);
+ } // Manually shove something into the read() buffer.
+ // This returns true if the highWaterMark has not been hit yet,
+ // similar to how Writable.write() returns true if you should
+ // write() some more.
+
+ Readable.prototype.push = function (chunk, encoding) {
+ var state = this._readableState;
+
+ if (!state.objectMode && typeof chunk === 'string') {
+ encoding = encoding || state.defaultEncoding;
+
+ if (encoding !== state.encoding) {
+ chunk = Buffer$1.from(chunk, encoding);
+ encoding = '';
+ }
+ }
+
+ return readableAddChunk(this, state, chunk, encoding, false);
+ }; // Unshift should *always* be something directly out of read()
+
+
+ Readable.prototype.unshift = function (chunk) {
+ var state = this._readableState;
+ return readableAddChunk(this, state, chunk, '', true);
+ };
+
+ Readable.prototype.isPaused = function () {
+ return this._readableState.flowing === false;
+ };
+
+ function readableAddChunk(stream, state, chunk, encoding, addToFront) {
+ var er = chunkInvalid(state, chunk);
+
+ if (er) {
+ stream.emit('error', er);
+ } else if (chunk === null) {
+ state.reading = false;
+ onEofChunk(stream, state);
+ } else if (state.objectMode || chunk && chunk.length > 0) {
+ if (state.ended && !addToFront) {
+ var e = new Error('stream.push() after EOF');
+ stream.emit('error', e);
+ } else if (state.endEmitted && addToFront) {
+ var _e = new Error('stream.unshift() after end event');
+
+ stream.emit('error', _e);
+ } else {
+ var skipAdd;
+
+ if (state.decoder && !addToFront && !encoding) {
+ chunk = state.decoder.write(chunk);
+ skipAdd = !state.objectMode && chunk.length === 0;
+ }
+
+ if (!addToFront) state.reading = false; // Don't add to the buffer if we've decoded to an empty string chunk and
+ // we're not in object mode
+
+ if (!skipAdd) {
+ // if we want the data now, just emit it.
+ if (state.flowing && state.length === 0 && !state.sync) {
+ stream.emit('data', chunk);
+ stream.read(0);
+ } else {
+ // update the buffer info.
+ state.length += state.objectMode ? 1 : chunk.length;
+ if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
+ if (state.needReadable) emitReadable(stream);
+ }
+ }
+
+ maybeReadMore(stream, state);
+ }
+ } else if (!addToFront) {
+ state.reading = false;
+ }
+
+ return needMoreData(state);
+ } // if it's past the high water mark, we can push in some more.
+ // Also, if we have no data yet, we can stand some
+ // more bytes. This is to work around cases where hwm=0,
+ // such as the repl. Also, if the push() triggered a
+ // readable event, and the user called read(largeNumber) such that
+ // needReadable was set, then we ought to push more, so that another
+ // 'readable' event will be triggered.
+
+
+ function needMoreData(state) {
+ return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
+ } // backwards compatibility.
+
+
+ Readable.prototype.setEncoding = function (enc) {
+ this._readableState.decoder = new StringDecoder(enc);
+ this._readableState.encoding = enc;
+ return this;
+ }; // Don't raise the hwm > 8MB
+
+
+ var MAX_HWM = 0x800000;
+
+ function computeNewHighWaterMark(n) {
+ if (n >= MAX_HWM) {
+ n = MAX_HWM;
+ } else {
+ // Get the next highest power of 2 to prevent increasing hwm excessively in
+ // tiny amounts
+ n--;
+ n |= n >>> 1;
+ n |= n >>> 2;
+ n |= n >>> 4;
+ n |= n >>> 8;
+ n |= n >>> 16;
+ n++;
+ }
+
+ return n;
+ } // This function is designed to be inlinable, so please take care when making
+ // changes to the function body.
+
+
+ function howMuchToRead(n, state) {
+ if (n <= 0 || state.length === 0 && state.ended) return 0;
+ if (state.objectMode) return 1;
+
+ if (n !== n) {
+ // Only flow one buffer at a time
+ if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
+ } // If we're asking for more than the current hwm, then raise the hwm.
+
+
+ if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
+ if (n <= state.length) return n; // Don't have enough
+
+ if (!state.ended) {
+ state.needReadable = true;
+ return 0;
+ }
+
+ return state.length;
+ } // you can override either this method, or the async _read(n) below.
+
+
+ Readable.prototype.read = function (n) {
+ debug$2('read', n);
+ n = parseInt(n, 10);
+ var state = this._readableState;
+ var nOrig = n;
+ if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we
+ // already have a bunch of data in the buffer, then just trigger
+ // the 'readable' event and move on.
+
+ if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
+ debug$2('read: emitReadable', state.length, state.ended);
+ if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
+ return null;
+ }
+
+ n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up.
+
+ if (n === 0 && state.ended) {
+ if (state.length === 0) endReadable(this);
+ return null;
+ } // All the actual chunk generation logic needs to be
+ // *below* the call to _read. The reason is that in certain
+ // synthetic stream cases, such as passthrough streams, _read
+ // may be a completely synchronous operation which may change
+ // the state of the read buffer, providing enough data when
+ // before there was *not* enough.
+ //
+ // So, the steps are:
+ // 1. Figure out what the state of things will be after we do
+ // a read from the buffer.
+ //
+ // 2. If that resulting state will trigger a _read, then call _read.
+ // Note that this may be asynchronous, or synchronous. Yes, it is
+ // deeply ugly to write APIs this way, but that still doesn't mean
+ // that the Readable class should behave improperly, as streams are
+ // designed to be sync/async agnostic.
+ // Take note if the _read call is sync or async (ie, if the read call
+ // has returned yet), so that we know whether or not it's safe to emit
+ // 'readable' etc.
+ //
+ // 3. Actually pull the requested chunks out of the buffer and return.
+ // if we need a readable event, then we need to do some reading.
+
+
+ var doRead = state.needReadable;
+ debug$2('need readable', doRead); // if we currently have less than the highWaterMark, then also read some
+
+ if (state.length === 0 || state.length - n < state.highWaterMark) {
+ doRead = true;
+ debug$2('length less than watermark', doRead);
+ } // however, if we've ended, then there's no point, and if we're already
+ // reading, then it's unnecessary.
+
+
+ if (state.ended || state.reading) {
+ doRead = false;
+ debug$2('reading or ended', doRead);
+ } else if (doRead) {
+ debug$2('do read');
+ state.reading = true;
+ state.sync = true; // if the length is currently zero, then we *need* a readable event.
+
+ if (state.length === 0) state.needReadable = true; // call internal read method
+
+ this._read(state.highWaterMark);
+
+ state.sync = false; // If _read pushed data synchronously, then `reading` will be false,
+ // and we need to re-evaluate how much data we can return to the user.
+
+ if (!state.reading) n = howMuchToRead(nOrig, state);
+ }
+
+ var ret;
+ if (n > 0) ret = fromList(n, state);else ret = null;
+
+ if (ret === null) {
+ state.needReadable = true;
+ n = 0;
+ } else {
+ state.length -= n;
+ }
+
+ if (state.length === 0) {
+ // If we have nothing in the buffer, then we want to know
+ // as soon as we *do* get something into the buffer.
+ if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick.
+
+ if (nOrig !== n && state.ended) endReadable(this);
+ }
+
+ if (ret !== null) this.emit('data', ret);
+ return ret;
+ };
+
+ function chunkInvalid(state, chunk) {
+ var er = null;
+
+ if (!isBuffer$2(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) {
+ er = new TypeError('Invalid non-string/buffer chunk');
+ }
+
+ return er;
+ }
+
+ function onEofChunk(stream, state) {
+ if (state.ended) return;
+
+ if (state.decoder) {
+ var chunk = state.decoder.end();
+
+ if (chunk && chunk.length) {
+ state.buffer.push(chunk);
+ state.length += state.objectMode ? 1 : chunk.length;
+ }
+ }
+
+ state.ended = true; // emit 'readable' now to make sure it gets picked up.
+
+ emitReadable(stream);
+ } // Don't emit readable right away in sync mode, because this can trigger
+ // another read() call => stack overflow. This way, it might trigger
+ // a nextTick recursion warning, but that's not so bad.
+
+
+ function emitReadable(stream) {
+ var state = stream._readableState;
+ state.needReadable = false;
+
+ if (!state.emittedReadable) {
+ debug$2('emitReadable', state.flowing);
+ state.emittedReadable = true;
+ if (state.sync) nextTick(emitReadable_, stream);else emitReadable_(stream);
+ }
+ }
+
+ function emitReadable_(stream) {
+ debug$2('emit readable');
+ stream.emit('readable');
+ flow(stream);
+ } // at this point, the user has presumably seen the 'readable' event,
+ // and called read() to consume some data. that may have triggered
+ // in turn another _read(n) call, in which case reading = true if
+ // it's in progress.
+ // However, if we're not ended, or reading, and the length < hwm,
+ // then go ahead and try to read some more preemptively.
+
+
+ function maybeReadMore(stream, state) {
+ if (!state.readingMore) {
+ state.readingMore = true;
+ nextTick(maybeReadMore_, stream, state);
+ }
+ }
+
+ function maybeReadMore_(stream, state) {
+ var len = state.length;
+
+ while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
+ debug$2('maybeReadMore read 0');
+ stream.read(0);
+ if (len === state.length) // didn't get any data, stop spinning.
+ break;else len = state.length;
+ }
+
+ state.readingMore = false;
+ } // abstract method. to be overridden in specific implementation classes.
+ // call cb(er, data) where data is <= n in length.
+ // for virtual (non-string, non-buffer) streams, "length" is somewhat
+ // arbitrary, and perhaps not very meaningful.
+
+
+ Readable.prototype._read = function (n) {
+ this.emit('error', new Error('not implemented'));
+ };
+
+ Readable.prototype.pipe = function (dest, pipeOpts) {
+ var src = this;
+ var state = this._readableState;
+
+ switch (state.pipesCount) {
+ case 0:
+ state.pipes = dest;
+ break;
+
+ case 1:
+ state.pipes = [state.pipes, dest];
+ break;
+
+ default:
+ state.pipes.push(dest);
+ break;
+ }
+
+ state.pipesCount += 1;
+ debug$2('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
+ var doEnd = !pipeOpts || pipeOpts.end !== false;
+ var endFn = doEnd ? onend : cleanup;
+ if (state.endEmitted) nextTick(endFn);else src.once('end', endFn);
+ dest.on('unpipe', onunpipe);
+
+ function onunpipe(readable) {
+ debug$2('onunpipe');
+
+ if (readable === src) {
+ cleanup();
+ }
+ }
+
+ function onend() {
+ debug$2('onend');
+ dest.end();
+ } // when the dest drains, it reduces the awaitDrain counter
+ // on the source. This would be more elegant with a .once()
+ // handler in flow(), but adding and removing repeatedly is
+ // too slow.
+
+
+ var ondrain = pipeOnDrain(src);
+ dest.on('drain', ondrain);
+ var cleanedUp = false;
+
+ function cleanup() {
+ debug$2('cleanup'); // cleanup event handlers once the pipe is broken
+
+ dest.removeListener('close', onclose);
+ dest.removeListener('finish', onfinish);
+ dest.removeListener('drain', ondrain);
+ dest.removeListener('error', onerror);
+ dest.removeListener('unpipe', onunpipe);
+ src.removeListener('end', onend);
+ src.removeListener('end', cleanup);
+ src.removeListener('data', ondata);
+ cleanedUp = true; // if the reader is waiting for a drain event from this
+ // specific writer, then it would cause it to never start
+ // flowing again.
+ // So, if this is awaiting a drain, then we just call it now.
+ // If we don't know, then assume that we are waiting for one.
+
+ if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
+ } // If the user pushes more data while we're writing to dest then we'll end up
+ // in ondata again. However, we only want to increase awaitDrain once because
+ // dest will only emit one 'drain' event for the multiple writes.
+ // => Introduce a guard on increasing awaitDrain.
+
+
+ var increasedAwaitDrain = false;
+ src.on('data', ondata);
+
+ function ondata(chunk) {
+ debug$2('ondata');
+ increasedAwaitDrain = false;
+ var ret = dest.write(chunk);
+
+ if (false === ret && !increasedAwaitDrain) {
+ // If the user unpiped during `dest.write()`, it is possible
+ // to get stuck in a permanently paused state if that write
+ // also returned false.
+ // => Check whether `dest` is still a piping destination.
+ if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
+ debug$2('false write response, pause', src._readableState.awaitDrain);
+ src._readableState.awaitDrain++;
+ increasedAwaitDrain = true;
+ }
+
+ src.pause();
+ }
+ } // if the dest has an error, then stop piping into it.
+ // however, don't suppress the throwing behavior for this.
+
+
+ function onerror(er) {
+ debug$2('onerror', er);
+ unpipe();
+ dest.removeListener('error', onerror);
+ if (listenerCount(dest, 'error') === 0) dest.emit('error', er);
+ } // Make sure our error handler is attached before userland ones.
+
+
+ prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once.
+
+ function onclose() {
+ dest.removeListener('finish', onfinish);
+ unpipe();
+ }
+
+ dest.once('close', onclose);
+
+ function onfinish() {
+ debug$2('onfinish');
+ dest.removeListener('close', onclose);
+ unpipe();
+ }
+
+ dest.once('finish', onfinish);
+
+ function unpipe() {
+ debug$2('unpipe');
+ src.unpipe(dest);
+ } // tell the dest that it's being piped to
+
+
+ dest.emit('pipe', src); // start the flow if it hasn't been started already.
+
+ if (!state.flowing) {
+ debug$2('pipe resume');
+ src.resume();
+ }
+
+ return dest;
+ };
+
+ function pipeOnDrain(src) {
+ return function () {
+ var state = src._readableState;
+ debug$2('pipeOnDrain', state.awaitDrain);
+ if (state.awaitDrain) state.awaitDrain--;
+
+ if (state.awaitDrain === 0 && src.listeners('data').length) {
+ state.flowing = true;
+ flow(src);
+ }
+ };
+ }
+
+ Readable.prototype.unpipe = function (dest) {
+ var state = this._readableState; // if we're not piping anywhere, then do nothing.
+
+ if (state.pipesCount === 0) return this; // just one destination. most common case.
+
+ if (state.pipesCount === 1) {
+ // passed in one, but it's not the right one.
+ if (dest && dest !== state.pipes) return this;
+ if (!dest) dest = state.pipes; // got a match.
+
+ state.pipes = null;
+ state.pipesCount = 0;
+ state.flowing = false;
+ if (dest) dest.emit('unpipe', this);
+ return this;
+ } // slow case. multiple pipe destinations.
+
+
+ if (!dest) {
+ // remove all.
+ var dests = state.pipes;
+ var len = state.pipesCount;
+ state.pipes = null;
+ state.pipesCount = 0;
+ state.flowing = false;
+
+ for (var _i = 0; _i < len; _i++) {
+ dests[_i].emit('unpipe', this);
+ }
+
+ return this;
+ } // try to find the right one.
+
+
+ var i = indexOf(state.pipes, dest);
+ if (i === -1) return this;
+ state.pipes.splice(i, 1);
+ state.pipesCount -= 1;
+ if (state.pipesCount === 1) state.pipes = state.pipes[0];
+ dest.emit('unpipe', this);
+ return this;
+ }; // set up data events if they are asked for
+ // Ensure readable listeners eventually get something
+
+
+ Readable.prototype.on = function (ev, fn) {
+ var res = EventEmitter$2.prototype.on.call(this, ev, fn);
+
+ if (ev === 'data') {
+ // Start flowing on next tick if stream isn't explicitly paused
+ if (this._readableState.flowing !== false) this.resume();
+ } else if (ev === 'readable') {
+ var state = this._readableState;
+
+ if (!state.endEmitted && !state.readableListening) {
+ state.readableListening = state.needReadable = true;
+ state.emittedReadable = false;
+
+ if (!state.reading) {
+ nextTick(nReadingNextTick, this);
+ } else if (state.length) {
+ emitReadable(this);
+ }
+ }
+ }
+
+ return res;
+ };
+
+ Readable.prototype.addListener = Readable.prototype.on;
+
+ function nReadingNextTick(self) {
+ debug$2('readable nexttick read 0');
+ self.read(0);
+ } // pause() and resume() are remnants of the legacy readable stream API
+ // If the user uses them, then switch into old mode.
+
+
+ Readable.prototype.resume = function () {
+ var state = this._readableState;
+
+ if (!state.flowing) {
+ debug$2('resume');
+ state.flowing = true;
+ resume(this, state);
+ }
+
+ return this;
+ };
+
+ function resume(stream, state) {
+ if (!state.resumeScheduled) {
+ state.resumeScheduled = true;
+ nextTick(resume_, stream, state);
+ }
+ }
+
+ function resume_(stream, state) {
+ if (!state.reading) {
+ debug$2('resume read 0');
+ stream.read(0);
+ }
+
+ state.resumeScheduled = false;
+ state.awaitDrain = 0;
+ stream.emit('resume');
+ flow(stream);
+ if (state.flowing && !state.reading) stream.read(0);
+ }
+
+ Readable.prototype.pause = function () {
+ debug$2('call pause flowing=%j', this._readableState.flowing);
+
+ if (false !== this._readableState.flowing) {
+ debug$2('pause');
+ this._readableState.flowing = false;
+ this.emit('pause');
+ }
+
+ return this;
+ };
+
+ function flow(stream) {
+ var state = stream._readableState;
+ debug$2('flow', state.flowing);
+
+ while (state.flowing && stream.read() !== null) {}
+ } // wrap an old-style stream as the async data source.
+ // This is *not* part of the readable stream interface.
+ // It is an ugly unfortunate mess of history.
+
+
+ Readable.prototype.wrap = function (stream) {
+ var state = this._readableState;
+ var paused = false;
+ var self = this;
+ stream.on('end', function () {
+ debug$2('wrapped end');
+
+ if (state.decoder && !state.ended) {
+ var chunk = state.decoder.end();
+ if (chunk && chunk.length) self.push(chunk);
+ }
+
+ self.push(null);
+ });
+ stream.on('data', function (chunk) {
+ debug$2('wrapped data');
+ if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode
+
+ if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
+ var ret = self.push(chunk);
+
+ if (!ret) {
+ paused = true;
+ stream.pause();
+ }
+ }); // proxy all the other methods.
+ // important when wrapping filters and duplexes.
+
+ for (var i in stream) {
+ if (this[i] === undefined && typeof stream[i] === 'function') {
+ this[i] = function (method) {
+ return function () {
+ return stream[method].apply(stream, arguments);
+ };
+ }(i);
+ }
+ } // proxy certain important events.
+
+
+ var events = ['error', 'close', 'destroy', 'pause', 'resume'];
+ forEach(events, function (ev) {
+ stream.on(ev, self.emit.bind(self, ev));
+ }); // when we try to consume some more bytes, simply unpause the
+ // underlying stream.
+
+ self._read = function (n) {
+ debug$2('wrapped _read', n);
+
+ if (paused) {
+ paused = false;
+ stream.resume();
+ }
+ };
+
+ return self;
+ }; // exposed for testing purposes only.
+
+
+ Readable._fromList = fromList; // Pluck off n bytes from an array of buffers.
+ // Length is the combined lengths of all the buffers in the list.
+ // This function is designed to be inlinable, so please take care when making
+ // changes to the function body.
+
+ function fromList(n, state) {
+ // nothing buffered
+ if (state.length === 0) return null;
+ var ret;
+ if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
+ // read it all, truncate the list
+ if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
+ state.buffer.clear();
+ } else {
+ // read part of list
+ ret = fromListPartial(n, state.buffer, state.decoder);
+ }
+ return ret;
+ } // Extracts only enough buffered data to satisfy the amount requested.
+ // This function is designed to be inlinable, so please take care when making
+ // changes to the function body.
+
+
+ function fromListPartial(n, list, hasStrings) {
+ var ret;
+
+ if (n < list.head.data.length) {
+ // slice is the same for buffers and strings
+ ret = list.head.data.slice(0, n);
+ list.head.data = list.head.data.slice(n);
+ } else if (n === list.head.data.length) {
+ // first chunk is a perfect match
+ ret = list.shift();
+ } else {
+ // result spans more than one buffer
+ ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
+ }
+
+ return ret;
+ } // Copies a specified amount of characters from the list of buffered data
+ // chunks.
+ // This function is designed to be inlinable, so please take care when making
+ // changes to the function body.
+
+
+ function copyFromBufferString(n, list) {
+ var p = list.head;
+ var c = 1;
+ var ret = p.data;
+ n -= ret.length;
+
+ while (p = p.next) {
+ var str = p.data;
+ var nb = n > str.length ? str.length : n;
+ if (nb === str.length) ret += str;else ret += str.slice(0, n);
+ n -= nb;
+
+ if (n === 0) {
+ if (nb === str.length) {
+ ++c;
+ if (p.next) list.head = p.next;else list.head = list.tail = null;
+ } else {
+ list.head = p;
+ p.data = str.slice(nb);
+ }
+
+ break;
+ }
+
+ ++c;
+ }
+
+ list.length -= c;
+ return ret;
+ } // Copies a specified amount of bytes from the list of buffered data chunks.
+ // This function is designed to be inlinable, so please take care when making
+ // changes to the function body.
+
+
+ function copyFromBuffer(n, list) {
+ var ret = Buffer$1.allocUnsafe(n);
+ var p = list.head;
+ var c = 1;
+ p.data.copy(ret);
+ n -= p.data.length;
+
+ while (p = p.next) {
+ var buf = p.data;
+ var nb = n > buf.length ? buf.length : n;
+ buf.copy(ret, ret.length - n, 0, nb);
+ n -= nb;
+
+ if (n === 0) {
+ if (nb === buf.length) {
+ ++c;
+ if (p.next) list.head = p.next;else list.head = list.tail = null;
+ } else {
+ list.head = p;
+ p.data = buf.slice(nb);
+ }
+
+ break;
+ }
+
+ ++c;
+ }
+
+ list.length -= c;
+ return ret;
+ }
+
+ function endReadable(stream) {
+ var state = stream._readableState; // If we get here before consuming all the bytes, then that is a
+ // bug in node. Should never happen.
+
+ if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
+
+ if (!state.endEmitted) {
+ state.ended = true;
+ nextTick(endReadableNT, state, stream);
+ }
+ }
+
+ function endReadableNT(state, stream) {
+ // Check that we didn't get one last unshift.
+ if (!state.endEmitted && state.length === 0) {
+ state.endEmitted = true;
+ stream.readable = false;
+ stream.emit('end');
+ }
+ }
+
+ function forEach(xs, f) {
+ for (var i = 0, l = xs.length; i < l; i++) {
+ f(xs[i], i);
+ }
+ }
+
+ function indexOf(xs, x) {
+ for (var i = 0, l = xs.length; i < l; i++) {
+ if (xs[i] === x) return i;
+ }
+
+ return -1;
+ }
+
+ // A bit simpler than readable streams.
+ Writable.WritableState = WritableState;
+ inherits$3(Writable, EventEmitter$2);
+
+ function nop() {}
+
+ function WriteReq(chunk, encoding, cb) {
+ this.chunk = chunk;
+ this.encoding = encoding;
+ this.callback = cb;
+ this.next = null;
+ }
+
+ function WritableState(options, stream) {
+ Object.defineProperty(this, 'buffer', {
+ get: deprecate$1(function () {
+ return this.getBuffer();
+ }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.')
+ });
+ options = options || {}; // object stream flag to indicate whether or not this stream
+ // contains buffers or objects.
+
+ this.objectMode = !!options.objectMode;
+ if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false
+ // Note: 0 is a valid value, means that we always return false if
+ // the entire buffer is not flushed immediately on write()
+
+ var hwm = options.highWaterMark;
+ var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+ this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; // cast to ints.
+
+ this.highWaterMark = ~~this.highWaterMark;
+ this.needDrain = false; // at the start of calling end()
+
+ this.ending = false; // when end() has been called, and returned
+
+ this.ended = false; // when 'finish' is emitted
+
+ this.finished = false; // should we decode strings into buffers before passing to _write?
+ // this is here so that some node-core streams can optimize string
+ // handling at a lower level.
+
+ var noDecode = options.decodeStrings === false;
+ this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string
+ // encoding is 'binary' so we have to make this configurable.
+ // Everything else in the universe uses 'utf8', though.
+
+ this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement
+ // of how much we're waiting to get pushed to some underlying
+ // socket or file.
+
+ this.length = 0; // a flag to see when we're in the middle of a write.
+
+ this.writing = false; // when true all writes will be buffered until .uncork() call
+
+ this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately,
+ // or on a later tick. We set this to true at first, because any
+ // actions that shouldn't happen until "later" should generally also
+ // not happen before the first write call.
+
+ this.sync = true; // a flag to know if we're processing previously buffered items, which
+ // may call the _write() callback in the same tick, so that we don't
+ // end up in an overlapped onwrite situation.
+
+ this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb)
+
+ this.onwrite = function (er) {
+ onwrite(stream, er);
+ }; // the callback that the user supplies to write(chunk,encoding,cb)
+
+
+ this.writecb = null; // the amount that is being written when _write is called.
+
+ this.writelen = 0;
+ this.bufferedRequest = null;
+ this.lastBufferedRequest = null; // number of pending user-supplied write callbacks
+ // this must be 0 before 'finish' can be emitted
+
+ this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs
+ // This is relevant for synchronous Transform streams
+
+ this.prefinished = false; // True if the error was already emitted and should not be thrown again
+
+ this.errorEmitted = false; // count buffered requests
+
+ this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always
+ // one allocated and free to use, and we maintain at most two
+
+ this.corkedRequestsFree = new CorkedRequest(this);
+ }
+
+ WritableState.prototype.getBuffer = function writableStateGetBuffer() {
+ var current = this.bufferedRequest;
+ var out = [];
+
+ while (current) {
+ out.push(current);
+ current = current.next;
+ }
+
+ return out;
+ };
+ function Writable(options) {
+ // Writable ctor is applied to Duplexes, though they're not
+ // instanceof Writable, they're instanceof Readable.
+ if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options);
+ this._writableState = new WritableState(options, this); // legacy.
+
+ this.writable = true;
+
+ if (options) {
+ if (typeof options.write === 'function') this._write = options.write;
+ if (typeof options.writev === 'function') this._writev = options.writev;
+ }
+
+ EventEmitter$2.call(this);
+ } // Otherwise people can pipe Writable streams, which is just wrong.
+
+ Writable.prototype.pipe = function () {
+ this.emit('error', new Error('Cannot pipe, not readable'));
+ };
+
+ function writeAfterEnd(stream, cb) {
+ var er = new Error('write after end'); // TODO: defer error events consistently everywhere, not just the cb
+
+ stream.emit('error', er);
+ nextTick(cb, er);
+ } // If we get something that is not a buffer, string, null, or undefined,
+ // and we're not in objectMode, then that's an error.
+ // Otherwise stream chunks are all considered to be of length=1, and the
+ // watermarks determine how many objects to keep in the buffer, rather than
+ // how many bytes or characters.
+
+
+ function validChunk(stream, state, chunk, cb) {
+ var valid = true;
+ var er = false; // Always throw error if a null is written
+ // if we are not in object mode then throw
+ // if it is not a buffer, string, or undefined.
+
+ if (chunk === null) {
+ er = new TypeError('May not write null values to stream');
+ } else if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
+ er = new TypeError('Invalid non-string/buffer chunk');
+ }
+
+ if (er) {
+ stream.emit('error', er);
+ nextTick(cb, er);
+ valid = false;
+ }
+
+ return valid;
+ }
+
+ Writable.prototype.write = function (chunk, encoding, cb) {
+ var state = this._writableState;
+ var ret = false;
+
+ if (typeof encoding === 'function') {
+ cb = encoding;
+ encoding = null;
+ }
+
+ if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
+ if (typeof cb !== 'function') cb = nop;
+ if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) {
+ state.pendingcb++;
+ ret = writeOrBuffer(this, state, chunk, encoding, cb);
+ }
+ return ret;
+ };
+
+ Writable.prototype.cork = function () {
+ var state = this._writableState;
+ state.corked++;
+ };
+
+ Writable.prototype.uncork = function () {
+ var state = this._writableState;
+
+ if (state.corked) {
+ state.corked--;
+ if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
+ }
+ };
+
+ Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
+ // node::ParseEncoding() requires lower case.
+ if (typeof encoding === 'string') encoding = encoding.toLowerCase();
+ if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
+ this._writableState.defaultEncoding = encoding;
+ return this;
+ };
+
+ function decodeChunk(state, chunk, encoding) {
+ if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
+ chunk = Buffer.from(chunk, encoding);
+ }
+
+ return chunk;
+ } // if we're already writing something, then just put this
+ // in the queue, and wait our turn. Otherwise, call _write
+ // If we return false, then we need a drain event, so set that flag.
+
+
+ function writeOrBuffer(stream, state, chunk, encoding, cb) {
+ chunk = decodeChunk(state, chunk, encoding);
+ if (Buffer.isBuffer(chunk)) encoding = 'buffer';
+ var len = state.objectMode ? 1 : chunk.length;
+ state.length += len;
+ var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false.
+
+ if (!ret) state.needDrain = true;
+
+ if (state.writing || state.corked) {
+ var last = state.lastBufferedRequest;
+ state.lastBufferedRequest = new WriteReq(chunk, encoding, cb);
+
+ if (last) {
+ last.next = state.lastBufferedRequest;
+ } else {
+ state.bufferedRequest = state.lastBufferedRequest;
+ }
+
+ state.bufferedRequestCount += 1;
+ } else {
+ doWrite(stream, state, false, len, chunk, encoding, cb);
+ }
+
+ return ret;
+ }
+
+ function doWrite(stream, state, writev, len, chunk, encoding, cb) {
+ state.writelen = len;
+ state.writecb = cb;
+ state.writing = true;
+ state.sync = true;
+ if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
+ state.sync = false;
+ }
+
+ function onwriteError(stream, state, sync, er, cb) {
+ --state.pendingcb;
+ if (sync) nextTick(cb, er);else cb(er);
+ stream._writableState.errorEmitted = true;
+ stream.emit('error', er);
+ }
+
+ function onwriteStateUpdate(state) {
+ state.writing = false;
+ state.writecb = null;
+ state.length -= state.writelen;
+ state.writelen = 0;
+ }
+
+ function onwrite(stream, er) {
+ var state = stream._writableState;
+ var sync = state.sync;
+ var cb = state.writecb;
+ onwriteStateUpdate(state);
+ if (er) onwriteError(stream, state, sync, er, cb);else {
+ // Check if we're actually ready to finish, but don't emit yet
+ var finished = needFinish(state);
+
+ if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
+ clearBuffer(stream, state);
+ }
+
+ if (sync) {
+ /**/
+ nextTick(afterWrite, stream, state, finished, cb);
+ /* */
+ } else {
+ afterWrite(stream, state, finished, cb);
+ }
+ }
+ }
+
+ function afterWrite(stream, state, finished, cb) {
+ if (!finished) onwriteDrain(stream, state);
+ state.pendingcb--;
+ cb();
+ finishMaybe(stream, state);
+ } // Must force callback to be called on nextTick, so that we don't
+ // emit 'drain' before the write() consumer gets the 'false' return
+ // value, and has a chance to attach a 'drain' listener.
+
+
+ function onwriteDrain(stream, state) {
+ if (state.length === 0 && state.needDrain) {
+ state.needDrain = false;
+ stream.emit('drain');
+ }
+ } // if there's something in the buffer waiting, then process it
+
+
+ function clearBuffer(stream, state) {
+ state.bufferProcessing = true;
+ var entry = state.bufferedRequest;
+
+ if (stream._writev && entry && entry.next) {
+ // Fast case, write everything using _writev()
+ var l = state.bufferedRequestCount;
+ var buffer = new Array(l);
+ var holder = state.corkedRequestsFree;
+ holder.entry = entry;
+ var count = 0;
+
+ while (entry) {
+ buffer[count] = entry;
+ entry = entry.next;
+ count += 1;
+ }
+
+ doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time
+ // as the hot path ends with doWrite
+
+ state.pendingcb++;
+ state.lastBufferedRequest = null;
+
+ if (holder.next) {
+ state.corkedRequestsFree = holder.next;
+ holder.next = null;
+ } else {
+ state.corkedRequestsFree = new CorkedRequest(state);
+ }
+ } else {
+ // Slow case, write chunks one-by-one
+ while (entry) {
+ var chunk = entry.chunk;
+ var encoding = entry.encoding;
+ var cb = entry.callback;
+ var len = state.objectMode ? 1 : chunk.length;
+ doWrite(stream, state, false, len, chunk, encoding, cb);
+ entry = entry.next; // if we didn't call the onwrite immediately, then
+ // it means that we need to wait until it does.
+ // also, that means that the chunk and cb are currently
+ // being processed, so move the buffer counter past them.
+
+ if (state.writing) {
+ break;
+ }
+ }
+
+ if (entry === null) state.lastBufferedRequest = null;
+ }
+
+ state.bufferedRequestCount = 0;
+ state.bufferedRequest = entry;
+ state.bufferProcessing = false;
+ }
+
+ Writable.prototype._write = function (chunk, encoding, cb) {
+ cb(new Error('not implemented'));
+ };
+
+ Writable.prototype._writev = null;
+
+ Writable.prototype.end = function (chunk, encoding, cb) {
+ var state = this._writableState;
+
+ if (typeof chunk === 'function') {
+ cb = chunk;
+ chunk = null;
+ encoding = null;
+ } else if (typeof encoding === 'function') {
+ cb = encoding;
+ encoding = null;
+ }
+
+ if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks
+
+ if (state.corked) {
+ state.corked = 1;
+ this.uncork();
+ } // ignore unnecessary end() calls.
+
+
+ if (!state.ending && !state.finished) endWritable(this, state, cb);
+ };
+
+ function needFinish(state) {
+ return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
+ }
+
+ function prefinish(stream, state) {
+ if (!state.prefinished) {
+ state.prefinished = true;
+ stream.emit('prefinish');
+ }
+ }
+
+ function finishMaybe(stream, state) {
+ var need = needFinish(state);
+
+ if (need) {
+ if (state.pendingcb === 0) {
+ prefinish(stream, state);
+ state.finished = true;
+ stream.emit('finish');
+ } else {
+ prefinish(stream, state);
+ }
+ }
+
+ return need;
+ }
+
+ function endWritable(stream, state, cb) {
+ state.ending = true;
+ finishMaybe(stream, state);
+
+ if (cb) {
+ if (state.finished) nextTick(cb);else stream.once('finish', cb);
+ }
+
+ state.ended = true;
+ stream.writable = false;
+ } // It seems a linked list but it is not
+ // there will be only 2 of these for each stream
+
+
+ function CorkedRequest(state) {
+ var _this = this;
+
+ this.next = null;
+ this.entry = null;
+
+ this.finish = function (err) {
+ var entry = _this.entry;
+ _this.entry = null;
+
+ while (entry) {
+ var cb = entry.callback;
+ state.pendingcb--;
+ cb(err);
+ entry = entry.next;
+ }
+
+ if (state.corkedRequestsFree) {
+ state.corkedRequestsFree.next = _this;
+ } else {
+ state.corkedRequestsFree = _this;
+ }
+ };
+ }
+
+ inherits$3(Duplex, Readable);
+ var keys = Object.keys(Writable.prototype);
+
+ for (var v = 0; v < keys.length; v++) {
+ var method = keys[v];
+ if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
+ }
+ function Duplex(options) {
+ if (!(this instanceof Duplex)) return new Duplex(options);
+ Readable.call(this, options);
+ Writable.call(this, options);
+ if (options && options.readable === false) this.readable = false;
+ if (options && options.writable === false) this.writable = false;
+ this.allowHalfOpen = true;
+ if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
+ this.once('end', onend);
+ } // the no-half-open enforcer
+
+ function onend() {
+ // if we allow half-open state, or if the writable side ended,
+ // then we're ok.
+ if (this.allowHalfOpen || this._writableState.ended) return; // no more data can be written.
+ // But allow more writes to happen in this tick.
+
+ nextTick(onEndNT, this);
+ }
+
+ function onEndNT(self) {
+ self.end();
+ }
+
+ // a transform stream is a readable/writable stream where you do
+ inherits$3(Transform, Duplex);
+
+ function TransformState(stream) {
+ this.afterTransform = function (er, data) {
+ return afterTransform(stream, er, data);
+ };
+
+ this.needTransform = false;
+ this.transforming = false;
+ this.writecb = null;
+ this.writechunk = null;
+ this.writeencoding = null;
+ }
+
+ function afterTransform(stream, er, data) {
+ var ts = stream._transformState;
+ ts.transforming = false;
+ var cb = ts.writecb;
+ if (!cb) return stream.emit('error', new Error('no writecb in Transform class'));
+ ts.writechunk = null;
+ ts.writecb = null;
+ if (data !== null && data !== undefined) stream.push(data);
+ cb(er);
+ var rs = stream._readableState;
+ rs.reading = false;
+
+ if (rs.needReadable || rs.length < rs.highWaterMark) {
+ stream._read(rs.highWaterMark);
+ }
+ }
+ function Transform(options) {
+ if (!(this instanceof Transform)) return new Transform(options);
+ Duplex.call(this, options);
+ this._transformState = new TransformState(this); // when the writable side finishes, then flush out anything remaining.
+
+ var stream = this; // start out asking for a readable event once data is transformed.
+
+ this._readableState.needReadable = true; // we have implemented the _read method, and done the other things
+ // that Readable wants before the first _read call, so unset the
+ // sync guard flag.
+
+ this._readableState.sync = false;
+
+ if (options) {
+ if (typeof options.transform === 'function') this._transform = options.transform;
+ if (typeof options.flush === 'function') this._flush = options.flush;
+ }
+
+ this.once('prefinish', function () {
+ if (typeof this._flush === 'function') this._flush(function (er) {
+ done(stream, er);
+ });else done(stream);
+ });
+ }
+
+ Transform.prototype.push = function (chunk, encoding) {
+ this._transformState.needTransform = false;
+ return Duplex.prototype.push.call(this, chunk, encoding);
+ }; // This is the part where you do stuff!
+ // override this function in implementation classes.
+ // 'chunk' is an input chunk.
+ //
+ // Call `push(newChunk)` to pass along transformed output
+ // to the readable side. You may call 'push' zero or more times.
+ //
+ // Call `cb(err)` when you are done with this chunk. If you pass
+ // an error, then that'll put the hurt on the whole operation. If you
+ // never call cb(), then you'll never get another chunk.
+
+
+ Transform.prototype._transform = function (chunk, encoding, cb) {
+ throw new Error('Not implemented');
+ };
+
+ Transform.prototype._write = function (chunk, encoding, cb) {
+ var ts = this._transformState;
+ ts.writecb = cb;
+ ts.writechunk = chunk;
+ ts.writeencoding = encoding;
+
+ if (!ts.transforming) {
+ var rs = this._readableState;
+ if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
+ }
+ }; // Doesn't matter what the args are here.
+ // _transform does all the work.
+ // That we got here means that the readable side wants more data.
+
+
+ Transform.prototype._read = function (n) {
+ var ts = this._transformState;
+
+ if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
+ ts.transforming = true;
+
+ this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
+ } else {
+ // mark that we need a transform, so that any data that comes in
+ // will get processed, now that we've asked for it.
+ ts.needTransform = true;
+ }
+ };
+
+ function done(stream, er) {
+ if (er) return stream.emit('error', er); // if there's nothing in the write buffer, then that means
+ // that nothing more will ever be provided
+
+ var ws = stream._writableState;
+ var ts = stream._transformState;
+ if (ws.length) throw new Error('Calling transform done when ws.length != 0');
+ if (ts.transforming) throw new Error('Calling transform done when still transforming');
+ return stream.push(null);
+ }
+
+ inherits$3(PassThrough, Transform);
+ function PassThrough(options) {
+ if (!(this instanceof PassThrough)) return new PassThrough(options);
+ Transform.call(this, options);
+ }
+
+ PassThrough.prototype._transform = function (chunk, encoding, cb) {
+ cb(null, chunk);
+ };
+
+ inherits$3(Stream, EventEmitter$2);
+ Stream.Readable = Readable;
+ Stream.Writable = Writable;
+ Stream.Duplex = Duplex;
+ Stream.Transform = Transform;
+ Stream.PassThrough = PassThrough; // Backwards-compat with node 0.4.x
+
+ Stream.Stream = Stream;
+ // part of this class) is overridden in the Readable class.
+
+ function Stream() {
+ EventEmitter$2.call(this);
+ }
+
+ Stream.prototype.pipe = function (dest, options) {
+ var source = this;
+
+ function ondata(chunk) {
+ if (dest.writable) {
+ if (false === dest.write(chunk) && source.pause) {
+ source.pause();
+ }
+ }
+ }
+
+ source.on('data', ondata);
+
+ function ondrain() {
+ if (source.readable && source.resume) {
+ source.resume();
+ }
+ }
+
+ dest.on('drain', ondrain); // If the 'end' option is not supplied, dest.end() will be called when
+ // source gets the 'end' or 'close' events. Only dest.end() once.
+
+ if (!dest._isStdio && (!options || options.end !== false)) {
+ source.on('end', onend);
+ source.on('close', onclose);
+ }
+
+ var didOnEnd = false;
+
+ function onend() {
+ if (didOnEnd) return;
+ didOnEnd = true;
+ dest.end();
+ }
+
+ function onclose() {
+ if (didOnEnd) return;
+ didOnEnd = true;
+ if (typeof dest.destroy === 'function') dest.destroy();
+ } // don't leave dangling pipes when there are errors.
+
+
+ function onerror(er) {
+ cleanup();
+
+ if (EventEmitter$2.listenerCount(this, 'error') === 0) {
+ throw er; // Unhandled stream error in pipe.
+ }
+ }
+
+ source.on('error', onerror);
+ dest.on('error', onerror); // remove all the event listeners that were added.
+
+ function cleanup() {
+ source.removeListener('data', ondata);
+ dest.removeListener('drain', ondrain);
+ source.removeListener('end', onend);
+ source.removeListener('close', onclose);
+ source.removeListener('error', onerror);
+ dest.removeListener('error', onerror);
+ source.removeListener('end', cleanup);
+ source.removeListener('close', cleanup);
+ dest.removeListener('close', cleanup);
+ }
+
+ source.on('end', cleanup);
+ source.on('close', cleanup);
+ dest.on('close', cleanup);
+ dest.emit('pipe', source); // Allow for unix-like usage: A.pipe(B).pipe(C)
+
+ return dest;
+ };
+
+ var WritableStream = Stream.Writable;
+ var inherits$1 = util.inherits;
+ var browserStdout = BrowserStdout;
+ inherits$1(BrowserStdout, WritableStream);
+
+ function BrowserStdout(opts) {
+ if (!(this instanceof BrowserStdout)) return new BrowserStdout(opts);
+ opts = opts || {};
+ WritableStream.call(this, opts);
+ this.label = opts.label !== undefined ? opts.label : 'stdout';
+ }
+
+ BrowserStdout.prototype._write = function (chunks, encoding, cb) {
+ var output = chunks.toString ? chunks.toString() : chunks;
+
+ if (this.label === false) {
+ console.log(output);
+ } else {
+ console.log(this.label + ':', output);
+ }
+
+ nextTick$1(cb);
+ };
+
+ var parseQuery = function parseQuery(qs) {
+ return qs.replace('?', '').split('&').reduce(function (obj, pair) {
+ var i = pair.indexOf('=');
+ var key = pair.slice(0, i);
+ var val = pair.slice(++i); // Due to how the URLSearchParams API treats spaces
+
+ obj[key] = decodeURIComponent(val.replace(/\+/g, '%20'));
+ return obj;
+ }, {});
+ };
+
+ function highlight(js) {
+ return js.replace(//g, '>').replace(/\/\/(.*)/gm, '').replace(/('.*?')/gm, '$1 ').replace(/(\d+\.\d+)/gm, '$1 ').replace(/(\d+)/gm, '$1 ').replace(/\bnew[ \t]+(\w+)/gm, 'new $1 ').replace(/\b(function|new|throw|return|var|if|else)\b/gm, '$1 ');
+ }
+ /**
+ * Highlight the contents of tag `name`.
+ *
+ * @private
+ * @param {string} name
+ */
+
+
+ var highlightTags = function highlightTags(name) {
+ var code = document.getElementById('mocha').getElementsByTagName(name);
+
+ for (var i = 0, len = code.length; i < len; ++i) {
+ code[i].innerHTML = highlight(code[i].innerHTML);
+ }
+ };
+
+ // `Symbol.iterator` well-known symbol
+ // https://tc39.es/ecma262/#sec-symbol.iterator
+ defineWellKnownSymbol('iterator');
+
+ var charAt = stringMultibyte.charAt;
+
+
+
+
+ var STRING_ITERATOR = 'String Iterator';
+ var setInternalState$2 = internalState.set;
+ var getInternalState$1 = internalState.getterFor(STRING_ITERATOR);
+
+ // `String.prototype[@@iterator]` method
+ // https://tc39.es/ecma262/#sec-string.prototype-@@iterator
+ defineIterator(String, 'String', function (iterated) {
+ setInternalState$2(this, {
+ type: STRING_ITERATOR,
+ string: toString_1(iterated),
+ index: 0
+ });
+ // `%StringIteratorPrototype%.next` method
+ // https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next
+ }, function next() {
+ var state = getInternalState$1(this);
+ var string = state.string;
+ var index = state.index;
+ var point;
+ if (index >= string.length) return { value: undefined, done: true };
+ point = charAt(string, index);
+ state.index += point.length;
+ return { value: point, done: false };
+ });
+
+ var ITERATOR = wellKnownSymbol('iterator');
+ var TO_STRING_TAG = wellKnownSymbol('toStringTag');
+ var ArrayValues = es_array_iterator.values;
+
+ var handlePrototype = function (CollectionPrototype, COLLECTION_NAME) {
+ if (CollectionPrototype) {
+ // some Chrome versions have non-configurable methods on DOMTokenList
+ if (CollectionPrototype[ITERATOR] !== ArrayValues) try {
+ createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);
+ } catch (error) {
+ CollectionPrototype[ITERATOR] = ArrayValues;
+ }
+ if (!CollectionPrototype[TO_STRING_TAG]) {
+ createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);
+ }
+ if (domIterables[COLLECTION_NAME]) for (var METHOD_NAME in es_array_iterator) {
+ // some Chrome versions have non-configurable methods on DOMTokenList
+ if (CollectionPrototype[METHOD_NAME] !== es_array_iterator[METHOD_NAME]) try {
+ createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, es_array_iterator[METHOD_NAME]);
+ } catch (error) {
+ CollectionPrototype[METHOD_NAME] = es_array_iterator[METHOD_NAME];
+ }
+ }
+ }
+ };
+
+ for (var COLLECTION_NAME in domIterables) {
+ handlePrototype(global_1[COLLECTION_NAME] && global_1[COLLECTION_NAME].prototype, COLLECTION_NAME);
+ }
+
+ handlePrototype(domTokenListPrototype, 'DOMTokenList');
+
+ // `Symbol.asyncIterator` well-known symbol
+ // https://tc39.es/ecma262/#sec-symbol.asynciterator
+ defineWellKnownSymbol('asyncIterator');
+
+ // `Symbol.toStringTag` well-known symbol
+ // https://tc39.es/ecma262/#sec-symbol.tostringtag
+ defineWellKnownSymbol('toStringTag');
+
+ // JSON[@@toStringTag] property
+ // https://tc39.es/ecma262/#sec-json-@@tostringtag
+ setToStringTag(global_1.JSON, 'JSON', true);
+
+ // Math[@@toStringTag] property
+ // https://tc39.es/ecma262/#sec-math-@@tostringtag
+ setToStringTag(Math, 'Math', true);
+
+ var nativePromiseConstructor = global_1.Promise;
+
+ var iteratorClose = function (iterator, kind, value) {
+ var innerResult, innerError;
+ anObject(iterator);
+ try {
+ innerResult = getMethod(iterator, 'return');
+ if (!innerResult) {
+ if (kind === 'throw') throw value;
+ return value;
+ }
+ innerResult = innerResult.call(iterator);
+ } catch (error) {
+ innerError = true;
+ innerResult = error;
+ }
+ if (kind === 'throw') throw value;
+ if (innerError) throw innerResult;
+ anObject(innerResult);
+ return value;
+ };
+
+ var Result = function (stopped, result) {
+ this.stopped = stopped;
+ this.result = result;
+ };
+
+ var iterate = function (iterable, unboundFunction, options) {
+ var that = options && options.that;
+ var AS_ENTRIES = !!(options && options.AS_ENTRIES);
+ var IS_ITERATOR = !!(options && options.IS_ITERATOR);
+ var INTERRUPTED = !!(options && options.INTERRUPTED);
+ var fn = functionBindContext(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED);
+ var iterator, iterFn, index, length, result, next, step;
+
+ var stop = function (condition) {
+ if (iterator) iteratorClose(iterator, 'normal', condition);
+ return new Result(true, condition);
+ };
+
+ var callFn = function (value) {
+ if (AS_ENTRIES) {
+ anObject(value);
+ return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);
+ } return INTERRUPTED ? fn(value, stop) : fn(value);
+ };
+
+ if (IS_ITERATOR) {
+ iterator = iterable;
+ } else {
+ iterFn = getIteratorMethod(iterable);
+ if (!iterFn) throw TypeError(String(iterable) + ' is not iterable');
+ // optimisation for array iterators
+ if (isArrayIteratorMethod(iterFn)) {
+ for (index = 0, length = toLength(iterable.length); length > index; index++) {
+ result = callFn(iterable[index]);
+ if (result && result instanceof Result) return result;
+ } return new Result(false);
+ }
+ iterator = getIterator(iterable, iterFn);
+ }
+
+ next = iterator.next;
+ while (!(step = next.call(iterator)).done) {
+ try {
+ result = callFn(step.value);
+ } catch (error) {
+ iteratorClose(iterator, 'throw', error);
+ }
+ if (typeof result == 'object' && result && result instanceof Result) return result;
+ } return new Result(false);
+ };
+
+ var engineIsIos = /(?:ipad|iphone|ipod).*applewebkit/i.test(engineUserAgent);
+
+ var engineIsNode = classofRaw(global_1.process) == 'process';
+
+ var set = global_1.setImmediate;
+ var clear = global_1.clearImmediate;
+ var process$2 = global_1.process;
+ var MessageChannel = global_1.MessageChannel;
+ var Dispatch = global_1.Dispatch;
+ var counter = 0;
+ var queue = {};
+ var ONREADYSTATECHANGE = 'onreadystatechange';
+ var location$1, defer, channel, port;
+
+ try {
+ // Deno throws a ReferenceError on `location` access without `--location` flag
+ location$1 = global_1.location;
+ } catch (error) { /* empty */ }
+
+ var run = function (id) {
+ // eslint-disable-next-line no-prototype-builtins -- safe
+ if (queue.hasOwnProperty(id)) {
+ var fn = queue[id];
+ delete queue[id];
+ fn();
+ }
+ };
+
+ var runner$1 = function (id) {
+ return function () {
+ run(id);
+ };
+ };
+
+ var listener = function (event) {
+ run(event.data);
+ };
+
+ var post = function (id) {
+ // old engines have not location.origin
+ global_1.postMessage(String(id), location$1.protocol + '//' + location$1.host);
+ };
+
+ // Node.js 0.9+ & IE10+ has setImmediate, otherwise:
+ if (!set || !clear) {
+ set = function setImmediate(fn) {
+ var args = [];
+ var argumentsLength = arguments.length;
+ var i = 1;
+ while (argumentsLength > i) args.push(arguments[i++]);
+ queue[++counter] = function () {
+ // eslint-disable-next-line no-new-func -- spec requirement
+ (isCallable(fn) ? fn : Function(fn)).apply(undefined, args);
+ };
+ defer(counter);
+ return counter;
+ };
+ clear = function clearImmediate(id) {
+ delete queue[id];
+ };
+ // Node.js 0.8-
+ if (engineIsNode) {
+ defer = function (id) {
+ process$2.nextTick(runner$1(id));
+ };
+ // Sphere (JS game engine) Dispatch API
+ } else if (Dispatch && Dispatch.now) {
+ defer = function (id) {
+ Dispatch.now(runner$1(id));
+ };
+ // Browsers with MessageChannel, includes WebWorkers
+ // except iOS - https://github.com/zloirock/core-js/issues/624
+ } else if (MessageChannel && !engineIsIos) {
+ channel = new MessageChannel();
+ port = channel.port2;
+ channel.port1.onmessage = listener;
+ defer = functionBindContext(port.postMessage, port, 1);
+ // Browsers with postMessage, skip WebWorkers
+ // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
+ } else if (
+ global_1.addEventListener &&
+ isCallable(global_1.postMessage) &&
+ !global_1.importScripts &&
+ location$1 && location$1.protocol !== 'file:' &&
+ !fails(post)
+ ) {
+ defer = post;
+ global_1.addEventListener('message', listener, false);
+ // IE8-
+ } else if (ONREADYSTATECHANGE in documentCreateElement('script')) {
+ defer = function (id) {
+ html$1.appendChild(documentCreateElement('script'))[ONREADYSTATECHANGE] = function () {
+ html$1.removeChild(this);
+ run(id);
+ };
+ };
+ // Rest old browsers
+ } else {
+ defer = function (id) {
+ setTimeout(runner$1(id), 0);
+ };
+ }
+ }
+
+ var task$1 = {
+ set: set,
+ clear: clear
+ };
+
+ var engineIsIosPebble = /ipad|iphone|ipod/i.test(engineUserAgent) && global_1.Pebble !== undefined;
+
+ var engineIsWebosWebkit = /web0s(?!.*chrome)/i.test(engineUserAgent);
+
+ var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;
+ var macrotask = task$1.set;
+
+
+
+
+
+ var MutationObserver = global_1.MutationObserver || global_1.WebKitMutationObserver;
+ var document$2 = global_1.document;
+ var process$1 = global_1.process;
+ var Promise$1 = global_1.Promise;
+ // Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`
+ var queueMicrotaskDescriptor = getOwnPropertyDescriptor(global_1, 'queueMicrotask');
+ var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;
+
+ var flush, head, last, notify$2, toggle, node, promise, then;
+
+ // modern engines have queueMicrotask method
+ if (!queueMicrotask) {
+ flush = function () {
+ var parent, fn;
+ if (engineIsNode && (parent = process$1.domain)) parent.exit();
+ while (head) {
+ fn = head.fn;
+ head = head.next;
+ try {
+ fn();
+ } catch (error) {
+ if (head) notify$2();
+ else last = undefined;
+ throw error;
+ }
+ } last = undefined;
+ if (parent) parent.enter();
+ };
+
+ // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339
+ // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898
+ if (!engineIsIos && !engineIsNode && !engineIsWebosWebkit && MutationObserver && document$2) {
+ toggle = true;
+ node = document$2.createTextNode('');
+ new MutationObserver(flush).observe(node, { characterData: true });
+ notify$2 = function () {
+ node.data = toggle = !toggle;
+ };
+ // environments with maybe non-completely correct, but existent Promise
+ } else if (!engineIsIosPebble && Promise$1 && Promise$1.resolve) {
+ // Promise.resolve without an argument throws an error in LG WebOS 2
+ promise = Promise$1.resolve(undefined);
+ // workaround of WebKit ~ iOS Safari 10.1 bug
+ promise.constructor = Promise$1;
+ then = promise.then;
+ notify$2 = function () {
+ then.call(promise, flush);
+ };
+ // Node.js without promises
+ } else if (engineIsNode) {
+ notify$2 = function () {
+ process$1.nextTick(flush);
+ };
+ // for other environments - macrotask based on:
+ // - setImmediate
+ // - MessageChannel
+ // - window.postMessag
+ // - onreadystatechange
+ // - setTimeout
+ } else {
+ notify$2 = function () {
+ // strange IE + webpack dev server bug - use .call(global)
+ macrotask.call(global_1, flush);
+ };
+ }
+ }
+
+ var microtask = queueMicrotask || function (fn) {
+ var task = { fn: fn, next: undefined };
+ if (last) last.next = task;
+ if (!head) {
+ head = task;
+ notify$2();
+ } last = task;
+ };
+
+ var PromiseCapability = function (C) {
+ var resolve, reject;
+ this.promise = new C(function ($$resolve, $$reject) {
+ if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
+ resolve = $$resolve;
+ reject = $$reject;
+ });
+ this.resolve = aCallable(resolve);
+ this.reject = aCallable(reject);
+ };
+
+ // `NewPromiseCapability` abstract operation
+ // https://tc39.es/ecma262/#sec-newpromisecapability
+ var f = function (C) {
+ return new PromiseCapability(C);
+ };
+
+ var newPromiseCapability$1 = {
+ f: f
+ };
+
+ var promiseResolve = function (C, x) {
+ anObject(C);
+ if (isObject$1(x) && x.constructor === C) return x;
+ var promiseCapability = newPromiseCapability$1.f(C);
+ var resolve = promiseCapability.resolve;
+ resolve(x);
+ return promiseCapability.promise;
+ };
+
+ var hostReportErrors = function (a, b) {
+ var console = global_1.console;
+ if (console && console.error) {
+ arguments.length === 1 ? console.error(a) : console.error(a, b);
+ }
+ };
+
+ var perform = function (exec) {
+ try {
+ return { error: false, value: exec() };
+ } catch (error) {
+ return { error: true, value: error };
+ }
+ };
+
+ var engineIsBrowser = typeof window == 'object';
+
+ var task = task$1.set;
+
+
+
+
+
+
+
+
+
+
+
+
+ var SPECIES = wellKnownSymbol('species');
+ var PROMISE = 'Promise';
+ var getInternalState = internalState.get;
+ var setInternalState$1 = internalState.set;
+ var getInternalPromiseState = internalState.getterFor(PROMISE);
+ var NativePromisePrototype = nativePromiseConstructor && nativePromiseConstructor.prototype;
+ var PromiseConstructor = nativePromiseConstructor;
+ var PromiseConstructorPrototype = NativePromisePrototype;
+ var TypeError$1 = global_1.TypeError;
+ var document$1 = global_1.document;
+ var process = global_1.process;
+ var newPromiseCapability = newPromiseCapability$1.f;
+ var newGenericPromiseCapability = newPromiseCapability;
+ var DISPATCH_EVENT = !!(document$1 && document$1.createEvent && global_1.dispatchEvent);
+ var NATIVE_REJECTION_EVENT = isCallable(global_1.PromiseRejectionEvent);
+ var UNHANDLED_REJECTION = 'unhandledrejection';
+ var REJECTION_HANDLED = 'rejectionhandled';
+ var PENDING = 0;
+ var FULFILLED = 1;
+ var REJECTED = 2;
+ var HANDLED = 1;
+ var UNHANDLED = 2;
+ var SUBCLASSING = false;
+ var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;
+
+ var FORCED$2 = isForced_1(PROMISE, function () {
+ var PROMISE_CONSTRUCTOR_SOURCE = inspectSource(PromiseConstructor);
+ var GLOBAL_CORE_JS_PROMISE = PROMISE_CONSTRUCTOR_SOURCE !== String(PromiseConstructor);
+ // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=830565
+ // We can't detect it synchronously, so just check versions
+ if (!GLOBAL_CORE_JS_PROMISE && engineV8Version === 66) return true;
+ // We can't use @@species feature detection in V8 since it causes
+ // deoptimization and performance degradation
+ // https://github.com/zloirock/core-js/issues/679
+ if (engineV8Version >= 51 && /native code/.test(PROMISE_CONSTRUCTOR_SOURCE)) return false;
+ // Detect correctness of subclassing with @@species support
+ var promise = new PromiseConstructor(function (resolve) { resolve(1); });
+ var FakePromise = function (exec) {
+ exec(function () { /* empty */ }, function () { /* empty */ });
+ };
+ var constructor = promise.constructor = {};
+ constructor[SPECIES] = FakePromise;
+ SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise;
+ if (!SUBCLASSING) return true;
+ // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test
+ return !GLOBAL_CORE_JS_PROMISE && engineIsBrowser && !NATIVE_REJECTION_EVENT;
+ });
+
+ var INCORRECT_ITERATION$1 = FORCED$2 || !checkCorrectnessOfIteration(function (iterable) {
+ PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });
+ });
+
+ // helpers
+ var isThenable = function (it) {
+ var then;
+ return isObject$1(it) && isCallable(then = it.then) ? then : false;
+ };
+
+ var notify$1 = function (state, isReject) {
+ if (state.notified) return;
+ state.notified = true;
+ var chain = state.reactions;
+ microtask(function () {
+ var value = state.value;
+ var ok = state.state == FULFILLED;
+ var index = 0;
+ // variable length - can't use forEach
+ while (chain.length > index) {
+ var reaction = chain[index++];
+ var handler = ok ? reaction.ok : reaction.fail;
+ var resolve = reaction.resolve;
+ var reject = reaction.reject;
+ var domain = reaction.domain;
+ var result, then, exited;
+ try {
+ if (handler) {
+ if (!ok) {
+ if (state.rejection === UNHANDLED) onHandleUnhandled(state);
+ state.rejection = HANDLED;
+ }
+ if (handler === true) result = value;
+ else {
+ if (domain) domain.enter();
+ result = handler(value); // can throw
+ if (domain) {
+ domain.exit();
+ exited = true;
+ }
+ }
+ if (result === reaction.promise) {
+ reject(TypeError$1('Promise-chain cycle'));
+ } else if (then = isThenable(result)) {
+ then.call(result, resolve, reject);
+ } else resolve(result);
+ } else reject(value);
+ } catch (error) {
+ if (domain && !exited) domain.exit();
+ reject(error);
+ }
+ }
+ state.reactions = [];
+ state.notified = false;
+ if (isReject && !state.rejection) onUnhandled(state);
+ });
+ };
+
+ var dispatchEvent = function (name, promise, reason) {
+ var event, handler;
+ if (DISPATCH_EVENT) {
+ event = document$1.createEvent('Event');
+ event.promise = promise;
+ event.reason = reason;
+ event.initEvent(name, false, true);
+ global_1.dispatchEvent(event);
+ } else event = { promise: promise, reason: reason };
+ if (!NATIVE_REJECTION_EVENT && (handler = global_1['on' + name])) handler(event);
+ else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);
+ };
+
+ var onUnhandled = function (state) {
+ task.call(global_1, function () {
+ var promise = state.facade;
+ var value = state.value;
+ var IS_UNHANDLED = isUnhandled(state);
+ var result;
+ if (IS_UNHANDLED) {
+ result = perform(function () {
+ if (engineIsNode) {
+ process.emit('unhandledRejection', value, promise);
+ } else dispatchEvent(UNHANDLED_REJECTION, promise, value);
+ });
+ // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
+ state.rejection = engineIsNode || isUnhandled(state) ? UNHANDLED : HANDLED;
+ if (result.error) throw result.value;
+ }
+ });
+ };
+
+ var isUnhandled = function (state) {
+ return state.rejection !== HANDLED && !state.parent;
+ };
+
+ var onHandleUnhandled = function (state) {
+ task.call(global_1, function () {
+ var promise = state.facade;
+ if (engineIsNode) {
+ process.emit('rejectionHandled', promise);
+ } else dispatchEvent(REJECTION_HANDLED, promise, state.value);
+ });
+ };
+
+ var bind = function (fn, state, unwrap) {
+ return function (value) {
+ fn(state, value, unwrap);
+ };
+ };
+
+ var internalReject = function (state, value, unwrap) {
+ if (state.done) return;
+ state.done = true;
+ if (unwrap) state = unwrap;
+ state.value = value;
+ state.state = REJECTED;
+ notify$1(state, true);
+ };
+
+ var internalResolve = function (state, value, unwrap) {
+ if (state.done) return;
+ state.done = true;
+ if (unwrap) state = unwrap;
+ try {
+ if (state.facade === value) throw TypeError$1("Promise can't be resolved itself");
+ var then = isThenable(value);
+ if (then) {
+ microtask(function () {
+ var wrapper = { done: false };
+ try {
+ then.call(value,
+ bind(internalResolve, wrapper, state),
+ bind(internalReject, wrapper, state)
+ );
+ } catch (error) {
+ internalReject(wrapper, error, state);
+ }
+ });
+ } else {
+ state.value = value;
+ state.state = FULFILLED;
+ notify$1(state, false);
+ }
+ } catch (error) {
+ internalReject({ done: false }, error, state);
+ }
+ };
+
+ // constructor polyfill
+ if (FORCED$2) {
+ // 25.4.3.1 Promise(executor)
+ PromiseConstructor = function Promise(executor) {
+ anInstance(this, PromiseConstructor, PROMISE);
+ aCallable(executor);
+ Internal.call(this);
+ var state = getInternalState(this);
+ try {
+ executor(bind(internalResolve, state), bind(internalReject, state));
+ } catch (error) {
+ internalReject(state, error);
+ }
+ };
+ PromiseConstructorPrototype = PromiseConstructor.prototype;
+ // eslint-disable-next-line no-unused-vars -- required for `.length`
+ Internal = function Promise(executor) {
+ setInternalState$1(this, {
+ type: PROMISE,
+ done: false,
+ notified: false,
+ parent: false,
+ reactions: [],
+ rejection: false,
+ state: PENDING,
+ value: undefined
+ });
+ };
+ Internal.prototype = redefineAll(PromiseConstructorPrototype, {
+ // `Promise.prototype.then` method
+ // https://tc39.es/ecma262/#sec-promise.prototype.then
+ then: function then(onFulfilled, onRejected) {
+ var state = getInternalPromiseState(this);
+ var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));
+ reaction.ok = isCallable(onFulfilled) ? onFulfilled : true;
+ reaction.fail = isCallable(onRejected) && onRejected;
+ reaction.domain = engineIsNode ? process.domain : undefined;
+ state.parent = true;
+ state.reactions.push(reaction);
+ if (state.state != PENDING) notify$1(state, false);
+ return reaction.promise;
+ },
+ // `Promise.prototype.catch` method
+ // https://tc39.es/ecma262/#sec-promise.prototype.catch
+ 'catch': function (onRejected) {
+ return this.then(undefined, onRejected);
+ }
+ });
+ OwnPromiseCapability = function () {
+ var promise = new Internal();
+ var state = getInternalState(promise);
+ this.promise = promise;
+ this.resolve = bind(internalResolve, state);
+ this.reject = bind(internalReject, state);
+ };
+ newPromiseCapability$1.f = newPromiseCapability = function (C) {
+ return C === PromiseConstructor || C === PromiseWrapper
+ ? new OwnPromiseCapability(C)
+ : newGenericPromiseCapability(C);
+ };
+
+ if (isCallable(nativePromiseConstructor) && NativePromisePrototype !== Object.prototype) {
+ nativeThen = NativePromisePrototype.then;
+
+ if (!SUBCLASSING) {
+ // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs
+ redefine(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) {
+ var that = this;
+ return new PromiseConstructor(function (resolve, reject) {
+ nativeThen.call(that, resolve, reject);
+ }).then(onFulfilled, onRejected);
+ // https://github.com/zloirock/core-js/issues/640
+ }, { unsafe: true });
+
+ // makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then`
+ redefine(NativePromisePrototype, 'catch', PromiseConstructorPrototype['catch'], { unsafe: true });
+ }
+
+ // make `.constructor === Promise` work for native promise-based APIs
+ try {
+ delete NativePromisePrototype.constructor;
+ } catch (error) { /* empty */ }
+
+ // make `instanceof Promise` work for native promise-based APIs
+ if (objectSetPrototypeOf) {
+ objectSetPrototypeOf(NativePromisePrototype, PromiseConstructorPrototype);
+ }
+ }
+ }
+
+ _export({ global: true, wrap: true, forced: FORCED$2 }, {
+ Promise: PromiseConstructor
+ });
+
+ setToStringTag(PromiseConstructor, PROMISE, false);
+ setSpecies(PROMISE);
+
+ PromiseWrapper = getBuiltIn(PROMISE);
+
+ // statics
+ _export({ target: PROMISE, stat: true, forced: FORCED$2 }, {
+ // `Promise.reject` method
+ // https://tc39.es/ecma262/#sec-promise.reject
+ reject: function reject(r) {
+ var capability = newPromiseCapability(this);
+ capability.reject.call(undefined, r);
+ return capability.promise;
+ }
+ });
+
+ _export({ target: PROMISE, stat: true, forced: FORCED$2 }, {
+ // `Promise.resolve` method
+ // https://tc39.es/ecma262/#sec-promise.resolve
+ resolve: function resolve(x) {
+ return promiseResolve(this, x);
+ }
+ });
+
+ _export({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION$1 }, {
+ // `Promise.all` method
+ // https://tc39.es/ecma262/#sec-promise.all
+ all: function all(iterable) {
+ var C = this;
+ var capability = newPromiseCapability(C);
+ var resolve = capability.resolve;
+ var reject = capability.reject;
+ var result = perform(function () {
+ var $promiseResolve = aCallable(C.resolve);
+ var values = [];
+ var counter = 0;
+ var remaining = 1;
+ iterate(iterable, function (promise) {
+ var index = counter++;
+ var alreadyCalled = false;
+ values.push(undefined);
+ remaining++;
+ $promiseResolve.call(C, promise).then(function (value) {
+ if (alreadyCalled) return;
+ alreadyCalled = true;
+ values[index] = value;
+ --remaining || resolve(values);
+ }, reject);
+ });
+ --remaining || resolve(values);
+ });
+ if (result.error) reject(result.value);
+ return capability.promise;
+ },
+ // `Promise.race` method
+ // https://tc39.es/ecma262/#sec-promise.race
+ race: function race(iterable) {
+ var C = this;
+ var capability = newPromiseCapability(C);
+ var reject = capability.reject;
+ var result = perform(function () {
+ var $promiseResolve = aCallable(C.resolve);
+ iterate(iterable, function (promise) {
+ $promiseResolve.call(C, promise).then(capability.resolve, reject);
+ });
+ });
+ if (result.error) reject(result.value);
+ return capability.promise;
+ }
+ });
+
+ createCommonjsModule(function (module) {
+ /**
+ * Copyright (c) 2014-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+ var runtime = function (exports) {
+
+ var Op = Object.prototype;
+ var hasOwn = Op.hasOwnProperty;
+ var undefined$1; // More compressible than void 0.
+
+ var $Symbol = typeof Symbol === "function" ? Symbol : {};
+ var iteratorSymbol = $Symbol.iterator || "@@iterator";
+ var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
+ var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
+
+ function define(obj, key, value) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ return obj[key];
+ }
+
+ try {
+ // IE 8 has a broken Object.defineProperty that only works on DOM objects.
+ define({}, "");
+ } catch (err) {
+ define = function define(obj, key, value) {
+ return obj[key] = value;
+ };
+ }
+
+ function wrap(innerFn, outerFn, self, tryLocsList) {
+ // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
+ var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
+ var generator = Object.create(protoGenerator.prototype);
+ var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next,
+ // .throw, and .return methods.
+
+ generator._invoke = makeInvokeMethod(innerFn, self, context);
+ return generator;
+ }
+
+ exports.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion
+ // record like context.tryEntries[i].completion. This interface could
+ // have been (and was previously) designed to take a closure to be
+ // invoked without arguments, but in all the cases we care about we
+ // already have an existing method we want to call, so there's no need
+ // to create a new function object. We can even get away with assuming
+ // the method takes exactly one argument, since that happens to be true
+ // in every case, so we don't have to touch the arguments object. The
+ // only additional allocation required is the completion record, which
+ // has a stable shape and so hopefully should be cheap to allocate.
+
+ function tryCatch(fn, obj, arg) {
+ try {
+ return {
+ type: "normal",
+ arg: fn.call(obj, arg)
+ };
+ } catch (err) {
+ return {
+ type: "throw",
+ arg: err
+ };
+ }
+ }
+
+ var GenStateSuspendedStart = "suspendedStart";
+ var GenStateSuspendedYield = "suspendedYield";
+ var GenStateExecuting = "executing";
+ var GenStateCompleted = "completed"; // Returning this object from the innerFn has the same effect as
+ // breaking out of the dispatch switch statement.
+
+ var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and
+ // .constructor.prototype properties for functions that return Generator
+ // objects. For full spec compliance, you may wish to configure your
+ // minifier not to mangle the names of these two functions.
+
+ function Generator() {}
+
+ function GeneratorFunction() {}
+
+ function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that
+ // don't natively support it.
+
+
+ var IteratorPrototype = {};
+
+ IteratorPrototype[iteratorSymbol] = function () {
+ return this;
+ };
+
+ var getProto = Object.getPrototypeOf;
+ var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
+
+ if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
+ // This environment has a native %IteratorPrototype%; use it instead
+ // of the polyfill.
+ IteratorPrototype = NativeIteratorPrototype;
+ }
+
+ var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
+ GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
+ GeneratorFunctionPrototype.constructor = GeneratorFunction;
+ GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"); // Helper for defining the .next, .throw, and .return methods of the
+ // Iterator interface in terms of a single ._invoke method.
+
+ function defineIteratorMethods(prototype) {
+ ["next", "throw", "return"].forEach(function (method) {
+ define(prototype, method, function (arg) {
+ return this._invoke(method, arg);
+ });
+ });
+ }
+
+ exports.isGeneratorFunction = function (genFun) {
+ var ctor = typeof genFun === "function" && genFun.constructor;
+ return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can
+ // do is to check its .name property.
+ (ctor.displayName || ctor.name) === "GeneratorFunction" : false;
+ };
+
+ exports.mark = function (genFun) {
+ if (Object.setPrototypeOf) {
+ Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
+ } else {
+ genFun.__proto__ = GeneratorFunctionPrototype;
+ define(genFun, toStringTagSymbol, "GeneratorFunction");
+ }
+
+ genFun.prototype = Object.create(Gp);
+ return genFun;
+ }; // Within the body of any async function, `await x` is transformed to
+ // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
+ // `hasOwn.call(value, "__await")` to determine if the yielded value is
+ // meant to be awaited.
+
+
+ exports.awrap = function (arg) {
+ return {
+ __await: arg
+ };
+ };
+
+ function AsyncIterator(generator, PromiseImpl) {
+ function invoke(method, arg, resolve, reject) {
+ var record = tryCatch(generator[method], generator, arg);
+
+ if (record.type === "throw") {
+ reject(record.arg);
+ } else {
+ var result = record.arg;
+ var value = result.value;
+
+ if (value && _typeof(value) === "object" && hasOwn.call(value, "__await")) {
+ return PromiseImpl.resolve(value.__await).then(function (value) {
+ invoke("next", value, resolve, reject);
+ }, function (err) {
+ invoke("throw", err, resolve, reject);
+ });
+ }
+
+ return PromiseImpl.resolve(value).then(function (unwrapped) {
+ // When a yielded Promise is resolved, its final value becomes
+ // the .value of the Promise<{value,done}> result for the
+ // current iteration.
+ result.value = unwrapped;
+ resolve(result);
+ }, function (error) {
+ // If a rejected Promise was yielded, throw the rejection back
+ // into the async generator function so it can be handled there.
+ return invoke("throw", error, resolve, reject);
+ });
+ }
+ }
+
+ var previousPromise;
+
+ function enqueue(method, arg) {
+ function callInvokeWithMethodAndArg() {
+ return new PromiseImpl(function (resolve, reject) {
+ invoke(method, arg, resolve, reject);
+ });
+ }
+
+ return previousPromise = // If enqueue has been called before, then we want to wait until
+ // all previous Promises have been resolved before calling invoke,
+ // so that results are always delivered in the correct order. If
+ // enqueue has not been called before, then it is important to
+ // call invoke immediately, without waiting on a callback to fire,
+ // so that the async generator function has the opportunity to do
+ // any necessary setup in a predictable way. This predictability
+ // is why the Promise constructor synchronously invokes its
+ // executor callback, and why async functions synchronously
+ // execute code before the first await. Since we implement simple
+ // async functions in terms of async generators, it is especially
+ // important to get this right, even though it requires care.
+ previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later
+ // invocations of the iterator.
+ callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
+ } // Define the unified helper method that is used to implement .next,
+ // .throw, and .return (see defineIteratorMethods).
+
+
+ this._invoke = enqueue;
+ }
+
+ defineIteratorMethods(AsyncIterator.prototype);
+
+ AsyncIterator.prototype[asyncIteratorSymbol] = function () {
+ return this;
+ };
+
+ exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of
+ // AsyncIterator objects; they just return a Promise for the value of
+ // the final result produced by the iterator.
+
+ exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {
+ if (PromiseImpl === void 0) PromiseImpl = Promise;
+ var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);
+ return exports.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator.
+ : iter.next().then(function (result) {
+ return result.done ? result.value : iter.next();
+ });
+ };
+
+ function makeInvokeMethod(innerFn, self, context) {
+ var state = GenStateSuspendedStart;
+ return function invoke(method, arg) {
+ if (state === GenStateExecuting) {
+ throw new Error("Generator is already running");
+ }
+
+ if (state === GenStateCompleted) {
+ if (method === "throw") {
+ throw arg;
+ } // Be forgiving, per 25.3.3.3.3 of the spec:
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
+
+
+ return doneResult();
+ }
+
+ context.method = method;
+ context.arg = arg;
+
+ while (true) {
+ var delegate = context.delegate;
+
+ if (delegate) {
+ var delegateResult = maybeInvokeDelegate(delegate, context);
+
+ if (delegateResult) {
+ if (delegateResult === ContinueSentinel) continue;
+ return delegateResult;
+ }
+ }
+
+ if (context.method === "next") {
+ // Setting context._sent for legacy support of Babel's
+ // function.sent implementation.
+ context.sent = context._sent = context.arg;
+ } else if (context.method === "throw") {
+ if (state === GenStateSuspendedStart) {
+ state = GenStateCompleted;
+ throw context.arg;
+ }
+
+ context.dispatchException(context.arg);
+ } else if (context.method === "return") {
+ context.abrupt("return", context.arg);
+ }
+
+ state = GenStateExecuting;
+ var record = tryCatch(innerFn, self, context);
+
+ if (record.type === "normal") {
+ // If an exception is thrown from innerFn, we leave state ===
+ // GenStateExecuting and loop back for another invocation.
+ state = context.done ? GenStateCompleted : GenStateSuspendedYield;
+
+ if (record.arg === ContinueSentinel) {
+ continue;
+ }
+
+ return {
+ value: record.arg,
+ done: context.done
+ };
+ } else if (record.type === "throw") {
+ state = GenStateCompleted; // Dispatch the exception by looping back around to the
+ // context.dispatchException(context.arg) call above.
+
+ context.method = "throw";
+ context.arg = record.arg;
+ }
+ }
+ };
+ } // Call delegate.iterator[context.method](context.arg) and handle the
+ // result, either by returning a { value, done } result from the
+ // delegate iterator, or by modifying context.method and context.arg,
+ // setting context.delegate to null, and returning the ContinueSentinel.
+
+
+ function maybeInvokeDelegate(delegate, context) {
+ var method = delegate.iterator[context.method];
+
+ if (method === undefined$1) {
+ // A .throw or .return when the delegate iterator has no .throw
+ // method always terminates the yield* loop.
+ context.delegate = null;
+
+ if (context.method === "throw") {
+ // Note: ["return"] must be used for ES3 parsing compatibility.
+ if (delegate.iterator["return"]) {
+ // If the delegate iterator has a return method, give it a
+ // chance to clean up.
+ context.method = "return";
+ context.arg = undefined$1;
+ maybeInvokeDelegate(delegate, context);
+
+ if (context.method === "throw") {
+ // If maybeInvokeDelegate(context) changed context.method from
+ // "return" to "throw", let that override the TypeError below.
+ return ContinueSentinel;
+ }
+ }
+
+ context.method = "throw";
+ context.arg = new TypeError("The iterator does not provide a 'throw' method");
+ }
+
+ return ContinueSentinel;
+ }
+
+ var record = tryCatch(method, delegate.iterator, context.arg);
+
+ if (record.type === "throw") {
+ context.method = "throw";
+ context.arg = record.arg;
+ context.delegate = null;
+ return ContinueSentinel;
+ }
+
+ var info = record.arg;
+
+ if (!info) {
+ context.method = "throw";
+ context.arg = new TypeError("iterator result is not an object");
+ context.delegate = null;
+ return ContinueSentinel;
+ }
+
+ if (info.done) {
+ // Assign the result of the finished delegate to the temporary
+ // variable specified by delegate.resultName (see delegateYield).
+ context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield).
+
+ context.next = delegate.nextLoc; // If context.method was "throw" but the delegate handled the
+ // exception, let the outer generator proceed normally. If
+ // context.method was "next", forget context.arg since it has been
+ // "consumed" by the delegate iterator. If context.method was
+ // "return", allow the original .return call to continue in the
+ // outer generator.
+
+ if (context.method !== "return") {
+ context.method = "next";
+ context.arg = undefined$1;
+ }
+ } else {
+ // Re-yield the result returned by the delegate method.
+ return info;
+ } // The delegate iterator is finished, so forget it and continue with
+ // the outer generator.
+
+
+ context.delegate = null;
+ return ContinueSentinel;
+ } // Define Generator.prototype.{next,throw,return} in terms of the
+ // unified ._invoke helper method.
+
+
+ defineIteratorMethods(Gp);
+ define(Gp, toStringTagSymbol, "Generator"); // A Generator should always return itself as the iterator object when the
+ // @@iterator function is called on it. Some browsers' implementations of the
+ // iterator prototype chain incorrectly implement this, causing the Generator
+ // object to not be returned from this call. This ensures that doesn't happen.
+ // See https://github.com/facebook/regenerator/issues/274 for more details.
+
+ Gp[iteratorSymbol] = function () {
+ return this;
+ };
+
+ Gp.toString = function () {
+ return "[object Generator]";
+ };
+
+ function pushTryEntry(locs) {
+ var entry = {
+ tryLoc: locs[0]
+ };
+
+ if (1 in locs) {
+ entry.catchLoc = locs[1];
+ }
+
+ if (2 in locs) {
+ entry.finallyLoc = locs[2];
+ entry.afterLoc = locs[3];
+ }
+
+ this.tryEntries.push(entry);
+ }
+
+ function resetTryEntry(entry) {
+ var record = entry.completion || {};
+ record.type = "normal";
+ delete record.arg;
+ entry.completion = record;
+ }
+
+ function Context(tryLocsList) {
+ // The root entry object (effectively a try statement without a catch
+ // or a finally block) gives us a place to store values thrown from
+ // locations where there is no enclosing try statement.
+ this.tryEntries = [{
+ tryLoc: "root"
+ }];
+ tryLocsList.forEach(pushTryEntry, this);
+ this.reset(true);
+ }
+
+ exports.keys = function (object) {
+ var keys = [];
+
+ for (var key in object) {
+ keys.push(key);
+ }
+
+ keys.reverse(); // Rather than returning an object with a next method, we keep
+ // things simple and return the next function itself.
+
+ return function next() {
+ while (keys.length) {
+ var key = keys.pop();
+
+ if (key in object) {
+ next.value = key;
+ next.done = false;
+ return next;
+ }
+ } // To avoid creating an additional object, we just hang the .value
+ // and .done properties off the next function object itself. This
+ // also ensures that the minifier will not anonymize the function.
+
+
+ next.done = true;
+ return next;
+ };
+ };
+
+ function values(iterable) {
+ if (iterable) {
+ var iteratorMethod = iterable[iteratorSymbol];
+
+ if (iteratorMethod) {
+ return iteratorMethod.call(iterable);
+ }
+
+ if (typeof iterable.next === "function") {
+ return iterable;
+ }
+
+ if (!isNaN(iterable.length)) {
+ var i = -1,
+ next = function next() {
+ while (++i < iterable.length) {
+ if (hasOwn.call(iterable, i)) {
+ next.value = iterable[i];
+ next.done = false;
+ return next;
+ }
+ }
+
+ next.value = undefined$1;
+ next.done = true;
+ return next;
+ };
+
+ return next.next = next;
+ }
+ } // Return an iterator with no values.
+
+
+ return {
+ next: doneResult
+ };
+ }
+
+ exports.values = values;
+
+ function doneResult() {
+ return {
+ value: undefined$1,
+ done: true
+ };
+ }
+
+ Context.prototype = {
+ constructor: Context,
+ reset: function reset(skipTempReset) {
+ this.prev = 0;
+ this.next = 0; // Resetting context._sent for legacy support of Babel's
+ // function.sent implementation.
+
+ this.sent = this._sent = undefined$1;
+ this.done = false;
+ this.delegate = null;
+ this.method = "next";
+ this.arg = undefined$1;
+ this.tryEntries.forEach(resetTryEntry);
+
+ if (!skipTempReset) {
+ for (var name in this) {
+ // Not sure about the optimal order of these conditions:
+ if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {
+ this[name] = undefined$1;
+ }
+ }
+ }
+ },
+ stop: function stop() {
+ this.done = true;
+ var rootEntry = this.tryEntries[0];
+ var rootRecord = rootEntry.completion;
+
+ if (rootRecord.type === "throw") {
+ throw rootRecord.arg;
+ }
+
+ return this.rval;
+ },
+ dispatchException: function dispatchException(exception) {
+ if (this.done) {
+ throw exception;
+ }
+
+ var context = this;
+
+ function handle(loc, caught) {
+ record.type = "throw";
+ record.arg = exception;
+ context.next = loc;
+
+ if (caught) {
+ // If the dispatched exception was caught by a catch block,
+ // then let that catch block handle the exception normally.
+ context.method = "next";
+ context.arg = undefined$1;
+ }
+
+ return !!caught;
+ }
+
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ var record = entry.completion;
+
+ if (entry.tryLoc === "root") {
+ // Exception thrown outside of any try block that could handle
+ // it, so set the completion value of the entire function to
+ // throw the exception.
+ return handle("end");
+ }
+
+ if (entry.tryLoc <= this.prev) {
+ var hasCatch = hasOwn.call(entry, "catchLoc");
+ var hasFinally = hasOwn.call(entry, "finallyLoc");
+
+ if (hasCatch && hasFinally) {
+ if (this.prev < entry.catchLoc) {
+ return handle(entry.catchLoc, true);
+ } else if (this.prev < entry.finallyLoc) {
+ return handle(entry.finallyLoc);
+ }
+ } else if (hasCatch) {
+ if (this.prev < entry.catchLoc) {
+ return handle(entry.catchLoc, true);
+ }
+ } else if (hasFinally) {
+ if (this.prev < entry.finallyLoc) {
+ return handle(entry.finallyLoc);
+ }
+ } else {
+ throw new Error("try statement without catch or finally");
+ }
+ }
+ }
+ },
+ abrupt: function abrupt(type, arg) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+
+ if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
+ var finallyEntry = entry;
+ break;
+ }
+ }
+
+ if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {
+ // Ignore the finally entry if control is not jumping to a
+ // location outside the try/catch block.
+ finallyEntry = null;
+ }
+
+ var record = finallyEntry ? finallyEntry.completion : {};
+ record.type = type;
+ record.arg = arg;
+
+ if (finallyEntry) {
+ this.method = "next";
+ this.next = finallyEntry.finallyLoc;
+ return ContinueSentinel;
+ }
+
+ return this.complete(record);
+ },
+ complete: function complete(record, afterLoc) {
+ if (record.type === "throw") {
+ throw record.arg;
+ }
+
+ if (record.type === "break" || record.type === "continue") {
+ this.next = record.arg;
+ } else if (record.type === "return") {
+ this.rval = this.arg = record.arg;
+ this.method = "return";
+ this.next = "end";
+ } else if (record.type === "normal" && afterLoc) {
+ this.next = afterLoc;
+ }
+
+ return ContinueSentinel;
+ },
+ finish: function finish(finallyLoc) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+
+ if (entry.finallyLoc === finallyLoc) {
+ this.complete(entry.completion, entry.afterLoc);
+ resetTryEntry(entry);
+ return ContinueSentinel;
+ }
+ }
+ },
+ "catch": function _catch(tryLoc) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+
+ if (entry.tryLoc === tryLoc) {
+ var record = entry.completion;
+
+ if (record.type === "throw") {
+ var thrown = record.arg;
+ resetTryEntry(entry);
+ }
+
+ return thrown;
+ }
+ } // The context.catch method must only be called with a location
+ // argument that corresponds to a known catch block.
+
+
+ throw new Error("illegal catch attempt");
+ },
+ delegateYield: function delegateYield(iterable, resultName, nextLoc) {
+ this.delegate = {
+ iterator: values(iterable),
+ resultName: resultName,
+ nextLoc: nextLoc
+ };
+
+ if (this.method === "next") {
+ // Deliberately forget the last sent value so that we don't
+ // accidentally pass it on to the delegate.
+ this.arg = undefined$1;
+ }
+
+ return ContinueSentinel;
+ }
+ }; // Regardless of whether this script is executing as a CommonJS module
+ // or not, return the runtime object so that we can declare the variable
+ // regeneratorRuntime in the outer scope, which allows this module to be
+ // injected easily by `bin/regenerator --include-runtime script.js`.
+
+ return exports;
+ }( // If this script is executing as a CommonJS module, use module.exports
+ // as the regeneratorRuntime namespace. Otherwise create a new empty
+ // object. Either way, the resulting object will be used to initialize
+ // the regeneratorRuntime variable at the top of this file.
+ module.exports );
+
+ try {
+ regeneratorRuntime = runtime;
+ } catch (accidentalStrictMode) {
+ // This module should not be running in strict mode, so the above
+ // assignment should always work unless something is misconfigured. Just
+ // in case runtime.js accidentally runs in strict mode, we can escape
+ // strict mode using a global Function call. This could conceivably fail
+ // if a Content Security Policy forbids using Function, but in that case
+ // the proper solution is to fix the accidental strict mode problem. If
+ // you've misconfigured your bundler to force strict mode and applied a
+ // CSP to forbid Function, and you're not willing to fix either of those
+ // problems, please detail your unique predicament in a GitHub issue.
+ Function("r", "regeneratorRuntime = r")(runtime);
+ }
+ });
+
+ var escapeStringRegexp = function escapeStringRegexp(string) {
+ if (typeof string !== 'string') {
+ throw new TypeError('Expected a string');
+ } // Escape characters with special meaning either inside or outside character sets.
+ // Use a simple backslash escape when it’s always valid, and a \unnnn escape when the simpler form would be disallowed by Unicode patterns’ stricter grammar.
+
+
+ return string.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&').replace(/-/g, '\\x2d');
+ };
+
+ // Copyright Joyent, Inc. and other Node contributors.
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining a
+ // copy of this software and associated documentation files (the
+ // "Software"), to deal in the Software without restriction, including
+ // without limitation the rights to use, copy, modify, merge, publish,
+ // distribute, sublicense, and/or sell copies of the Software, and to permit
+ // persons to whom the Software is furnished to do so, subject to the
+ // following conditions:
+ //
+ // The above copyright notice and this permission notice shall be included
+ // in all copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+ // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ // USE OR OTHER DEALINGS IN THE SOFTWARE.
+ // resolves . and .. elements in a path array with directory names there
+ // must be no slashes, empty elements, or device names (c:\) in the array
+ // (so also no leading and trailing slashes - it does not distinguish
+ // relative and absolute paths)
+ function normalizeArray(parts, allowAboveRoot) {
+ // if the path tries to go above the root, `up` ends up > 0
+ var up = 0;
+
+ for (var i = parts.length - 1; i >= 0; i--) {
+ var last = parts[i];
+
+ if (last === '.') {
+ parts.splice(i, 1);
+ } else if (last === '..') {
+ parts.splice(i, 1);
+ up++;
+ } else if (up) {
+ parts.splice(i, 1);
+ up--;
+ }
+ } // if the path is allowed to go above the root, restore leading ..s
+
+
+ if (allowAboveRoot) {
+ for (; up--; up) {
+ parts.unshift('..');
+ }
+ }
+
+ return parts;
+ } // Split a filename into [root, dir, basename, ext], unix version
+ // 'root' is just a slash, or nothing.
+
+
+ var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
+
+ var splitPath = function splitPath(filename) {
+ return splitPathRe.exec(filename).slice(1);
+ }; // path.resolve([from ...], to)
+ // posix version
+
+
+ function resolve() {
+ var resolvedPath = '',
+ resolvedAbsolute = false;
+
+ for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
+ var path = i >= 0 ? arguments[i] : '/'; // Skip empty and invalid entries
+
+ if (typeof path !== 'string') {
+ throw new TypeError('Arguments to path.resolve must be strings');
+ } else if (!path) {
+ continue;
+ }
+
+ resolvedPath = path + '/' + resolvedPath;
+ resolvedAbsolute = path.charAt(0) === '/';
+ } // At this point the path should be resolved to a full absolute path, but
+ // handle relative paths to be safe (might happen when process.cwd() fails)
+ // Normalize the path
+
+
+ resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function (p) {
+ return !!p;
+ }), !resolvedAbsolute).join('/');
+ return (resolvedAbsolute ? '/' : '') + resolvedPath || '.';
+ }
+ // posix version
+
+ function normalize(path) {
+ var isPathAbsolute = isAbsolute(path),
+ trailingSlash = substr(path, -1) === '/'; // Normalize the path
+
+ path = normalizeArray(filter(path.split('/'), function (p) {
+ return !!p;
+ }), !isPathAbsolute).join('/');
+
+ if (!path && !isPathAbsolute) {
+ path = '.';
+ }
+
+ if (path && trailingSlash) {
+ path += '/';
+ }
+
+ return (isPathAbsolute ? '/' : '') + path;
+ }
+
+ function isAbsolute(path) {
+ return path.charAt(0) === '/';
+ } // posix version
+
+ function join() {
+ var paths = Array.prototype.slice.call(arguments, 0);
+ return normalize(filter(paths, function (p, index) {
+ if (typeof p !== 'string') {
+ throw new TypeError('Arguments to path.join must be strings');
+ }
+
+ return p;
+ }).join('/'));
+ } // path.relative(from, to)
+ // posix version
+
+ function relative(from, to) {
+ from = resolve(from).substr(1);
+ to = resolve(to).substr(1);
+
+ function trim(arr) {
+ var start = 0;
+
+ for (; start < arr.length; start++) {
+ if (arr[start] !== '') break;
+ }
+
+ var end = arr.length - 1;
+
+ for (; end >= 0; end--) {
+ if (arr[end] !== '') break;
+ }
+
+ if (start > end) return [];
+ return arr.slice(start, end - start + 1);
+ }
+
+ var fromParts = trim(from.split('/'));
+ var toParts = trim(to.split('/'));
+ var length = Math.min(fromParts.length, toParts.length);
+ var samePartsLength = length;
+
+ for (var i = 0; i < length; i++) {
+ if (fromParts[i] !== toParts[i]) {
+ samePartsLength = i;
+ break;
+ }
+ }
+
+ var outputParts = [];
+
+ for (var i = samePartsLength; i < fromParts.length; i++) {
+ outputParts.push('..');
+ }
+
+ outputParts = outputParts.concat(toParts.slice(samePartsLength));
+ return outputParts.join('/');
+ }
+ var sep = '/';
+ var delimiter = ':';
+ function dirname(path) {
+ var result = splitPath(path),
+ root = result[0],
+ dir = result[1];
+
+ if (!root && !dir) {
+ // No dirname whatsoever
+ return '.';
+ }
+
+ if (dir) {
+ // It has a dirname, strip trailing slash
+ dir = dir.substr(0, dir.length - 1);
+ }
+
+ return root + dir;
+ }
+ function basename(path, ext) {
+ var f = splitPath(path)[2]; // TODO: make this comparison case-insensitive on windows?
+
+ if (ext && f.substr(-1 * ext.length) === ext) {
+ f = f.substr(0, f.length - ext.length);
+ }
+
+ return f;
+ }
+ function extname(path) {
+ return splitPath(path)[3];
+ }
+ var path = {
+ extname: extname,
+ basename: basename,
+ dirname: dirname,
+ sep: sep,
+ delimiter: delimiter,
+ relative: relative,
+ join: join,
+ isAbsolute: isAbsolute,
+ normalize: normalize,
+ resolve: resolve
+ };
+
+ function filter(xs, f) {
+ if (xs.filter) return xs.filter(f);
+ var res = [];
+
+ for (var i = 0; i < xs.length; i++) {
+ if (f(xs[i], i, xs)) res.push(xs[i]);
+ }
+
+ return res;
+ } // String.prototype.substr - negative index don't work in IE8
+
+
+ var substr = 'ab'.substr(-1) === 'b' ? function (str, start, len) {
+ return str.substr(start, len);
+ } : function (str, start, len) {
+ if (start < 0) start = str.length + start;
+ return str.substr(start, len);
+ };
+
+ // call something on iterator step with safe closing on error
+ var callWithSafeIterationClosing = function (iterator, fn, value, ENTRIES) {
+ try {
+ return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);
+ } catch (error) {
+ iteratorClose(iterator, 'throw', error);
+ }
+ };
+
+ // `Array.from` method implementation
+ // https://tc39.es/ecma262/#sec-array.from
+ var arrayFrom = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
+ var O = toObject(arrayLike);
+ var IS_CONSTRUCTOR = isConstructor(this);
+ var argumentsLength = arguments.length;
+ var mapfn = argumentsLength > 1 ? arguments[1] : undefined;
+ var mapping = mapfn !== undefined;
+ if (mapping) mapfn = functionBindContext(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);
+ var iteratorMethod = getIteratorMethod(O);
+ var index = 0;
+ var length, result, step, iterator, next, value;
+ // if the target is not iterable or it's an array with the default iterator - use a simple case
+ if (iteratorMethod && !(this == Array && isArrayIteratorMethod(iteratorMethod))) {
+ iterator = getIterator(O, iteratorMethod);
+ next = iterator.next;
+ result = IS_CONSTRUCTOR ? new this() : [];
+ for (;!(step = next.call(iterator)).done; index++) {
+ value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;
+ createProperty(result, index, value);
+ }
+ } else {
+ length = toLength(O.length);
+ result = IS_CONSTRUCTOR ? new this(length) : Array(length);
+ for (;length > index; index++) {
+ value = mapping ? mapfn(O[index], index) : O[index];
+ createProperty(result, index, value);
+ }
+ }
+ result.length = index;
+ return result;
+ };
+
+ var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {
+ // eslint-disable-next-line es/no-array-from -- required for testing
+ Array.from(iterable);
+ });
+
+ // `Array.from` method
+ // https://tc39.es/ecma262/#sec-array.from
+ _export({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {
+ from: arrayFrom
+ });
+
+ var test$1 = [];
+ var nativeSort = test$1.sort;
+
+ // IE8-
+ var FAILS_ON_UNDEFINED = fails(function () {
+ test$1.sort(undefined);
+ });
+ // V8 bug
+ var FAILS_ON_NULL = fails(function () {
+ test$1.sort(null);
+ });
+ // Old WebKit
+ var STRICT_METHOD = arrayMethodIsStrict('sort');
+
+ var STABLE_SORT = !fails(function () {
+ // feature detection can be too slow, so check engines versions
+ if (engineV8Version) return engineV8Version < 70;
+ if (engineFfVersion && engineFfVersion > 3) return;
+ if (engineIsIeOrEdge) return true;
+ if (engineWebkitVersion) return engineWebkitVersion < 603;
+
+ var result = '';
+ var code, chr, value, index;
+
+ // generate an array with more 512 elements (Chakra and old V8 fails only in this case)
+ for (code = 65; code < 76; code++) {
+ chr = String.fromCharCode(code);
+
+ switch (code) {
+ case 66: case 69: case 70: case 72: value = 3; break;
+ case 68: case 71: value = 4; break;
+ default: value = 2;
+ }
+
+ for (index = 0; index < 47; index++) {
+ test$1.push({ k: chr + index, v: value });
+ }
+ }
+
+ test$1.sort(function (a, b) { return b.v - a.v; });
+
+ for (index = 0; index < test$1.length; index++) {
+ chr = test$1[index].k.charAt(0);
+ if (result.charAt(result.length - 1) !== chr) result += chr;
+ }
+
+ return result !== 'DGBEFHACIJK';
+ });
+
+ var FORCED$1 = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD || !STABLE_SORT;
+
+ var getSortCompare = function (comparefn) {
+ return function (x, y) {
+ if (y === undefined) return -1;
+ if (x === undefined) return 1;
+ if (comparefn !== undefined) return +comparefn(x, y) || 0;
+ return toString_1(x) > toString_1(y) ? 1 : -1;
+ };
+ };
+
+ // `Array.prototype.sort` method
+ // https://tc39.es/ecma262/#sec-array.prototype.sort
+ _export({ target: 'Array', proto: true, forced: FORCED$1 }, {
+ sort: function sort(comparefn) {
+ if (comparefn !== undefined) aCallable(comparefn);
+
+ var array = toObject(this);
+
+ if (STABLE_SORT) return comparefn === undefined ? nativeSort.call(array) : nativeSort.call(array, comparefn);
+
+ var items = [];
+ var arrayLength = toLength(array.length);
+ var itemsLength, index;
+
+ for (index = 0; index < arrayLength; index++) {
+ if (index in array) items.push(array[index]);
+ }
+
+ items = arraySort(items, getSortCompare(comparefn));
+ itemsLength = items.length;
+ index = 0;
+
+ while (index < itemsLength) array[index] = items[index++];
+ while (index < arrayLength) delete array[index++];
+
+ return array;
+ }
+ });
+
+ var diff$1 = createCommonjsModule(function (module, exports) {
+ (function (global, factory) {
+ factory(exports) ;
+ })(commonjsGlobal, function (exports) {
+
+ function Diff() {}
+
+ Diff.prototype = {
+ diff: function diff(oldString, newString) {
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+ var callback = options.callback;
+
+ if (typeof options === 'function') {
+ callback = options;
+ options = {};
+ }
+
+ this.options = options;
+ var self = this;
+
+ function done(value) {
+ if (callback) {
+ setTimeout(function () {
+ callback(undefined, value);
+ }, 0);
+ return true;
+ } else {
+ return value;
+ }
+ } // Allow subclasses to massage the input prior to running
+
+
+ oldString = this.castInput(oldString);
+ newString = this.castInput(newString);
+ oldString = this.removeEmpty(this.tokenize(oldString));
+ newString = this.removeEmpty(this.tokenize(newString));
+ var newLen = newString.length,
+ oldLen = oldString.length;
+ var editLength = 1;
+ var maxEditLength = newLen + oldLen;
+ var bestPath = [{
+ newPos: -1,
+ components: []
+ }]; // Seed editLength = 0, i.e. the content starts with the same values
+
+ var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0);
+
+ if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) {
+ // Identity per the equality and tokenizer
+ return done([{
+ value: this.join(newString),
+ count: newString.length
+ }]);
+ } // Main worker method. checks all permutations of a given edit length for acceptance.
+
+
+ function execEditLength() {
+ for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) {
+ var basePath = void 0;
+
+ var addPath = bestPath[diagonalPath - 1],
+ removePath = bestPath[diagonalPath + 1],
+ _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath;
+
+ if (addPath) {
+ // No one else is going to attempt to use this value, clear it
+ bestPath[diagonalPath - 1] = undefined;
+ }
+
+ var canAdd = addPath && addPath.newPos + 1 < newLen,
+ canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen;
+
+ if (!canAdd && !canRemove) {
+ // If this path is a terminal then prune
+ bestPath[diagonalPath] = undefined;
+ continue;
+ } // Select the diagonal that we want to branch from. We select the prior
+ // path whose position in the new string is the farthest from the origin
+ // and does not pass the bounds of the diff graph
+
+
+ if (!canAdd || canRemove && addPath.newPos < removePath.newPos) {
+ basePath = clonePath(removePath);
+ self.pushComponent(basePath.components, undefined, true);
+ } else {
+ basePath = addPath; // No need to clone, we've pulled it from the list
+
+ basePath.newPos++;
+ self.pushComponent(basePath.components, true, undefined);
+ }
+
+ _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); // If we have hit the end of both strings, then we are done
+
+ if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) {
+ return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken));
+ } else {
+ // Otherwise track this path as a potential candidate and continue.
+ bestPath[diagonalPath] = basePath;
+ }
+ }
+
+ editLength++;
+ } // Performs the length of edit iteration. Is a bit fugly as this has to support the
+ // sync and async mode which is never fun. Loops over execEditLength until a value
+ // is produced.
+
+
+ if (callback) {
+ (function exec() {
+ setTimeout(function () {
+ // This should not happen, but we want to be safe.
+
+ /* istanbul ignore next */
+ if (editLength > maxEditLength) {
+ return callback();
+ }
+
+ if (!execEditLength()) {
+ exec();
+ }
+ }, 0);
+ })();
+ } else {
+ while (editLength <= maxEditLength) {
+ var ret = execEditLength();
+
+ if (ret) {
+ return ret;
+ }
+ }
+ }
+ },
+ pushComponent: function pushComponent(components, added, removed) {
+ var last = components[components.length - 1];
+
+ if (last && last.added === added && last.removed === removed) {
+ // We need to clone here as the component clone operation is just
+ // as shallow array clone
+ components[components.length - 1] = {
+ count: last.count + 1,
+ added: added,
+ removed: removed
+ };
+ } else {
+ components.push({
+ count: 1,
+ added: added,
+ removed: removed
+ });
+ }
+ },
+ extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) {
+ var newLen = newString.length,
+ oldLen = oldString.length,
+ newPos = basePath.newPos,
+ oldPos = newPos - diagonalPath,
+ commonCount = 0;
+
+ while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) {
+ newPos++;
+ oldPos++;
+ commonCount++;
+ }
+
+ if (commonCount) {
+ basePath.components.push({
+ count: commonCount
+ });
+ }
+
+ basePath.newPos = newPos;
+ return oldPos;
+ },
+ equals: function equals(left, right) {
+ if (this.options.comparator) {
+ return this.options.comparator(left, right);
+ } else {
+ return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase();
+ }
+ },
+ removeEmpty: function removeEmpty(array) {
+ var ret = [];
+
+ for (var i = 0; i < array.length; i++) {
+ if (array[i]) {
+ ret.push(array[i]);
+ }
+ }
+
+ return ret;
+ },
+ castInput: function castInput(value) {
+ return value;
+ },
+ tokenize: function tokenize(value) {
+ return value.split('');
+ },
+ join: function join(chars) {
+ return chars.join('');
+ }
+ };
+
+ function buildValues(diff, components, newString, oldString, useLongestToken) {
+ var componentPos = 0,
+ componentLen = components.length,
+ newPos = 0,
+ oldPos = 0;
+
+ for (; componentPos < componentLen; componentPos++) {
+ var component = components[componentPos];
+
+ if (!component.removed) {
+ if (!component.added && useLongestToken) {
+ var value = newString.slice(newPos, newPos + component.count);
+ value = value.map(function (value, i) {
+ var oldValue = oldString[oldPos + i];
+ return oldValue.length > value.length ? oldValue : value;
+ });
+ component.value = diff.join(value);
+ } else {
+ component.value = diff.join(newString.slice(newPos, newPos + component.count));
+ }
+
+ newPos += component.count; // Common case
+
+ if (!component.added) {
+ oldPos += component.count;
+ }
+ } else {
+ component.value = diff.join(oldString.slice(oldPos, oldPos + component.count));
+ oldPos += component.count; // Reverse add and remove so removes are output first to match common convention
+ // The diffing algorithm is tied to add then remove output and this is the simplest
+ // route to get the desired output with minimal overhead.
+
+ if (componentPos && components[componentPos - 1].added) {
+ var tmp = components[componentPos - 1];
+ components[componentPos - 1] = components[componentPos];
+ components[componentPos] = tmp;
+ }
+ }
+ } // Special case handle for when one terminal is ignored (i.e. whitespace).
+ // For this case we merge the terminal into the prior string and drop the change.
+ // This is only available for string mode.
+
+
+ var lastComponent = components[componentLen - 1];
+
+ if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) {
+ components[componentLen - 2].value += lastComponent.value;
+ components.pop();
+ }
+
+ return components;
+ }
+
+ function clonePath(path) {
+ return {
+ newPos: path.newPos,
+ components: path.components.slice(0)
+ };
+ }
+
+ var characterDiff = new Diff();
+
+ function diffChars(oldStr, newStr, options) {
+ return characterDiff.diff(oldStr, newStr, options);
+ }
+
+ function generateOptions(options, defaults) {
+ if (typeof options === 'function') {
+ defaults.callback = options;
+ } else if (options) {
+ for (var name in options) {
+ /* istanbul ignore else */
+ if (options.hasOwnProperty(name)) {
+ defaults[name] = options[name];
+ }
+ }
+ }
+
+ return defaults;
+ } //
+ // Ranges and exceptions:
+ // Latin-1 Supplement, 0080–00FF
+ // - U+00D7 × Multiplication sign
+ // - U+00F7 ÷ Division sign
+ // Latin Extended-A, 0100–017F
+ // Latin Extended-B, 0180–024F
+ // IPA Extensions, 0250–02AF
+ // Spacing Modifier Letters, 02B0–02FF
+ // - U+02C7 ˇ ˇ Caron
+ // - U+02D8 ˘ ˘ Breve
+ // - U+02D9 ˙ ˙ Dot Above
+ // - U+02DA ˚ ˚ Ring Above
+ // - U+02DB ˛ ˛ Ogonek
+ // - U+02DC ˜ ˜ Small Tilde
+ // - U+02DD ˝ ˝ Double Acute Accent
+ // Latin Extended Additional, 1E00–1EFF
+
+
+ var extendedWordChars = /^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/;
+ var reWhitespace = /\S/;
+ var wordDiff = new Diff();
+
+ wordDiff.equals = function (left, right) {
+ if (this.options.ignoreCase) {
+ left = left.toLowerCase();
+ right = right.toLowerCase();
+ }
+
+ return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right);
+ };
+
+ wordDiff.tokenize = function (value) {
+ // All whitespace symbols except newline group into one token, each newline - in separate token
+ var tokens = value.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/); // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set.
+
+ for (var i = 0; i < tokens.length - 1; i++) {
+ // If we have an empty string in the next field and we have only word chars before and after, merge
+ if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) {
+ tokens[i] += tokens[i + 2];
+ tokens.splice(i + 1, 2);
+ i--;
+ }
+ }
+
+ return tokens;
+ };
+
+ function diffWords(oldStr, newStr, options) {
+ options = generateOptions(options, {
+ ignoreWhitespace: true
+ });
+ return wordDiff.diff(oldStr, newStr, options);
+ }
+
+ function diffWordsWithSpace(oldStr, newStr, options) {
+ return wordDiff.diff(oldStr, newStr, options);
+ }
+
+ var lineDiff = new Diff();
+
+ lineDiff.tokenize = function (value) {
+ var retLines = [],
+ linesAndNewlines = value.split(/(\n|\r\n)/); // Ignore the final empty token that occurs if the string ends with a new line
+
+ if (!linesAndNewlines[linesAndNewlines.length - 1]) {
+ linesAndNewlines.pop();
+ } // Merge the content and line separators into single tokens
+
+
+ for (var i = 0; i < linesAndNewlines.length; i++) {
+ var line = linesAndNewlines[i];
+
+ if (i % 2 && !this.options.newlineIsToken) {
+ retLines[retLines.length - 1] += line;
+ } else {
+ if (this.options.ignoreWhitespace) {
+ line = line.trim();
+ }
+
+ retLines.push(line);
+ }
+ }
+
+ return retLines;
+ };
+
+ function diffLines(oldStr, newStr, callback) {
+ return lineDiff.diff(oldStr, newStr, callback);
+ }
+
+ function diffTrimmedLines(oldStr, newStr, callback) {
+ var options = generateOptions(callback, {
+ ignoreWhitespace: true
+ });
+ return lineDiff.diff(oldStr, newStr, options);
+ }
+
+ var sentenceDiff = new Diff();
+
+ sentenceDiff.tokenize = function (value) {
+ return value.split(/(\S.+?[.!?])(?=\s+|$)/);
+ };
+
+ function diffSentences(oldStr, newStr, callback) {
+ return sentenceDiff.diff(oldStr, newStr, callback);
+ }
+
+ var cssDiff = new Diff();
+
+ cssDiff.tokenize = function (value) {
+ return value.split(/([{}:;,]|\s+)/);
+ };
+
+ function diffCss(oldStr, newStr, callback) {
+ return cssDiff.diff(oldStr, newStr, callback);
+ }
+
+ function _typeof(obj) {
+ "@babel/helpers - typeof";
+
+ if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
+ _typeof = function _typeof(obj) {
+ return typeof obj;
+ };
+ } else {
+ _typeof = function _typeof(obj) {
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ };
+ }
+
+ return _typeof(obj);
+ }
+
+ function _toConsumableArray(arr) {
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
+ }
+
+ function _arrayWithoutHoles(arr) {
+ if (Array.isArray(arr)) return _arrayLikeToArray(arr);
+ }
+
+ function _iterableToArray(iter) {
+ if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);
+ }
+
+ function _unsupportedIterableToArray(o, minLen) {
+ if (!o) return;
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
+ var n = Object.prototype.toString.call(o).slice(8, -1);
+ if (n === "Object" && o.constructor) n = o.constructor.name;
+ if (n === "Map" || n === "Set") return Array.from(o);
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
+ }
+
+ function _arrayLikeToArray(arr, len) {
+ if (len == null || len > arr.length) len = arr.length;
+
+ for (var i = 0, arr2 = new Array(len); i < len; i++) {
+ arr2[i] = arr[i];
+ }
+
+ return arr2;
+ }
+
+ function _nonIterableSpread() {
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
+ }
+
+ var objectPrototypeToString = Object.prototype.toString;
+ var jsonDiff = new Diff(); // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a
+ // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output:
+
+ jsonDiff.useLongestToken = true;
+ jsonDiff.tokenize = lineDiff.tokenize;
+
+ jsonDiff.castInput = function (value) {
+ var _this$options = this.options,
+ undefinedReplacement = _this$options.undefinedReplacement,
+ _this$options$stringi = _this$options.stringifyReplacer,
+ stringifyReplacer = _this$options$stringi === void 0 ? function (k, v) {
+ return typeof v === 'undefined' ? undefinedReplacement : v;
+ } : _this$options$stringi;
+ return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, ' ');
+ };
+
+ jsonDiff.equals = function (left, right) {
+ return Diff.prototype.equals.call(jsonDiff, left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1'));
+ };
+
+ function diffJson(oldObj, newObj, options) {
+ return jsonDiff.diff(oldObj, newObj, options);
+ } // This function handles the presence of circular references by bailing out when encountering an
+ // object that is already on the "stack" of items being processed. Accepts an optional replacer
+
+
+ function canonicalize(obj, stack, replacementStack, replacer, key) {
+ stack = stack || [];
+ replacementStack = replacementStack || [];
+
+ if (replacer) {
+ obj = replacer(key, obj);
+ }
+
+ var i;
+
+ for (i = 0; i < stack.length; i += 1) {
+ if (stack[i] === obj) {
+ return replacementStack[i];
+ }
+ }
+
+ var canonicalizedObj;
+
+ if ('[object Array]' === objectPrototypeToString.call(obj)) {
+ stack.push(obj);
+ canonicalizedObj = new Array(obj.length);
+ replacementStack.push(canonicalizedObj);
+
+ for (i = 0; i < obj.length; i += 1) {
+ canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key);
+ }
+
+ stack.pop();
+ replacementStack.pop();
+ return canonicalizedObj;
+ }
+
+ if (obj && obj.toJSON) {
+ obj = obj.toJSON();
+ }
+
+ if (_typeof(obj) === 'object' && obj !== null) {
+ stack.push(obj);
+ canonicalizedObj = {};
+ replacementStack.push(canonicalizedObj);
+
+ var sortedKeys = [],
+ _key;
+
+ for (_key in obj) {
+ /* istanbul ignore else */
+ if (obj.hasOwnProperty(_key)) {
+ sortedKeys.push(_key);
+ }
+ }
+
+ sortedKeys.sort();
+
+ for (i = 0; i < sortedKeys.length; i += 1) {
+ _key = sortedKeys[i];
+ canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key);
+ }
+
+ stack.pop();
+ replacementStack.pop();
+ } else {
+ canonicalizedObj = obj;
+ }
+
+ return canonicalizedObj;
+ }
+
+ var arrayDiff = new Diff();
+
+ arrayDiff.tokenize = function (value) {
+ return value.slice();
+ };
+
+ arrayDiff.join = arrayDiff.removeEmpty = function (value) {
+ return value;
+ };
+
+ function diffArrays(oldArr, newArr, callback) {
+ return arrayDiff.diff(oldArr, newArr, callback);
+ }
+
+ function parsePatch(uniDiff) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ var diffstr = uniDiff.split(/\r\n|[\n\v\f\r\x85]/),
+ delimiters = uniDiff.match(/\r\n|[\n\v\f\r\x85]/g) || [],
+ list = [],
+ i = 0;
+
+ function parseIndex() {
+ var index = {};
+ list.push(index); // Parse diff metadata
+
+ while (i < diffstr.length) {
+ var line = diffstr[i]; // File header found, end parsing diff metadata
+
+ if (/^(\-\-\-|\+\+\+|@@)\s/.test(line)) {
+ break;
+ } // Diff index
+
+
+ var header = /^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/.exec(line);
+
+ if (header) {
+ index.index = header[1];
+ }
+
+ i++;
+ } // Parse file headers if they are defined. Unified diff requires them, but
+ // there's no technical issues to have an isolated hunk without file header
+
+
+ parseFileHeader(index);
+ parseFileHeader(index); // Parse hunks
+
+ index.hunks = [];
+
+ while (i < diffstr.length) {
+ var _line = diffstr[i];
+
+ if (/^(Index:|diff|\-\-\-|\+\+\+)\s/.test(_line)) {
+ break;
+ } else if (/^@@/.test(_line)) {
+ index.hunks.push(parseHunk());
+ } else if (_line && options.strict) {
+ // Ignore unexpected content unless in strict mode
+ throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line));
+ } else {
+ i++;
+ }
+ }
+ } // Parses the --- and +++ headers, if none are found, no lines
+ // are consumed.
+
+
+ function parseFileHeader(index) {
+ var fileHeader = /^(---|\+\+\+)\s+(.*)$/.exec(diffstr[i]);
+
+ if (fileHeader) {
+ var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new';
+ var data = fileHeader[2].split('\t', 2);
+ var fileName = data[0].replace(/\\\\/g, '\\');
+
+ if (/^".*"$/.test(fileName)) {
+ fileName = fileName.substr(1, fileName.length - 2);
+ }
+
+ index[keyPrefix + 'FileName'] = fileName;
+ index[keyPrefix + 'Header'] = (data[1] || '').trim();
+ i++;
+ }
+ } // Parses a hunk
+ // This assumes that we are at the start of a hunk.
+
+
+ function parseHunk() {
+ var chunkHeaderIndex = i,
+ chunkHeaderLine = diffstr[i++],
+ chunkHeader = chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/);
+ var hunk = {
+ oldStart: +chunkHeader[1],
+ oldLines: typeof chunkHeader[2] === 'undefined' ? 1 : +chunkHeader[2],
+ newStart: +chunkHeader[3],
+ newLines: typeof chunkHeader[4] === 'undefined' ? 1 : +chunkHeader[4],
+ lines: [],
+ linedelimiters: []
+ }; // Unified Diff Format quirk: If the chunk size is 0,
+ // the first number is one lower than one would expect.
+ // https://www.artima.com/weblogs/viewpost.jsp?thread=164293
+
+ if (hunk.oldLines === 0) {
+ hunk.oldStart += 1;
+ }
+
+ if (hunk.newLines === 0) {
+ hunk.newStart += 1;
+ }
+
+ var addCount = 0,
+ removeCount = 0;
+
+ for (; i < diffstr.length; i++) {
+ // Lines starting with '---' could be mistaken for the "remove line" operation
+ // But they could be the header for the next file. Therefore prune such cases out.
+ if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) {
+ break;
+ }
+
+ var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? ' ' : diffstr[i][0];
+
+ if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\') {
+ hunk.lines.push(diffstr[i]);
+ hunk.linedelimiters.push(delimiters[i] || '\n');
+
+ if (operation === '+') {
+ addCount++;
+ } else if (operation === '-') {
+ removeCount++;
+ } else if (operation === ' ') {
+ addCount++;
+ removeCount++;
+ }
+ } else {
+ break;
+ }
+ } // Handle the empty block count case
+
+
+ if (!addCount && hunk.newLines === 1) {
+ hunk.newLines = 0;
+ }
+
+ if (!removeCount && hunk.oldLines === 1) {
+ hunk.oldLines = 0;
+ } // Perform optional sanity checking
+
+
+ if (options.strict) {
+ if (addCount !== hunk.newLines) {
+ throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1));
+ }
+
+ if (removeCount !== hunk.oldLines) {
+ throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1));
+ }
+ }
+
+ return hunk;
+ }
+
+ while (i < diffstr.length) {
+ parseIndex();
+ }
+
+ return list;
+ } // Iterator that traverses in the range of [min, max], stepping
+ // by distance from a given start position. I.e. for [0, 4], with
+ // start of 2, this will iterate 2, 3, 1, 4, 0.
+
+
+ function distanceIterator(start, minLine, maxLine) {
+ var wantForward = true,
+ backwardExhausted = false,
+ forwardExhausted = false,
+ localOffset = 1;
+ return function iterator() {
+ if (wantForward && !forwardExhausted) {
+ if (backwardExhausted) {
+ localOffset++;
+ } else {
+ wantForward = false;
+ } // Check if trying to fit beyond text length, and if not, check it fits
+ // after offset location (or desired location on first iteration)
+
+
+ if (start + localOffset <= maxLine) {
+ return localOffset;
+ }
+
+ forwardExhausted = true;
+ }
+
+ if (!backwardExhausted) {
+ if (!forwardExhausted) {
+ wantForward = true;
+ } // Check if trying to fit before text beginning, and if not, check it fits
+ // before offset location
+
+
+ if (minLine <= start - localOffset) {
+ return -localOffset++;
+ }
+
+ backwardExhausted = true;
+ return iterator();
+ } // We tried to fit hunk before text beginning and beyond text length, then
+ // hunk can't fit on the text. Return undefined
+
+ };
+ }
+
+ function applyPatch(source, uniDiff) {
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+
+ if (typeof uniDiff === 'string') {
+ uniDiff = parsePatch(uniDiff);
+ }
+
+ if (Array.isArray(uniDiff)) {
+ if (uniDiff.length > 1) {
+ throw new Error('applyPatch only works with a single input.');
+ }
+
+ uniDiff = uniDiff[0];
+ } // Apply the diff to the input
+
+
+ var lines = source.split(/\r\n|[\n\v\f\r\x85]/),
+ delimiters = source.match(/\r\n|[\n\v\f\r\x85]/g) || [],
+ hunks = uniDiff.hunks,
+ compareLine = options.compareLine || function (lineNumber, line, operation, patchContent) {
+ return line === patchContent;
+ },
+ errorCount = 0,
+ fuzzFactor = options.fuzzFactor || 0,
+ minLine = 0,
+ offset = 0,
+ removeEOFNL,
+ addEOFNL;
+ /**
+ * Checks if the hunk exactly fits on the provided location
+ */
+
+
+ function hunkFits(hunk, toPos) {
+ for (var j = 0; j < hunk.lines.length; j++) {
+ var line = hunk.lines[j],
+ operation = line.length > 0 ? line[0] : ' ',
+ content = line.length > 0 ? line.substr(1) : line;
+
+ if (operation === ' ' || operation === '-') {
+ // Context sanity check
+ if (!compareLine(toPos + 1, lines[toPos], operation, content)) {
+ errorCount++;
+
+ if (errorCount > fuzzFactor) {
+ return false;
+ }
+ }
+
+ toPos++;
+ }
+ }
+
+ return true;
+ } // Search best fit offsets for each hunk based on the previous ones
+
+
+ for (var i = 0; i < hunks.length; i++) {
+ var hunk = hunks[i],
+ maxLine = lines.length - hunk.oldLines,
+ localOffset = 0,
+ toPos = offset + hunk.oldStart - 1;
+ var iterator = distanceIterator(toPos, minLine, maxLine);
+
+ for (; localOffset !== undefined; localOffset = iterator()) {
+ if (hunkFits(hunk, toPos + localOffset)) {
+ hunk.offset = offset += localOffset;
+ break;
+ }
+ }
+
+ if (localOffset === undefined) {
+ return false;
+ } // Set lower text limit to end of the current hunk, so next ones don't try
+ // to fit over already patched text
+
+
+ minLine = hunk.offset + hunk.oldStart + hunk.oldLines;
+ } // Apply patch hunks
+
+
+ var diffOffset = 0;
+
+ for (var _i = 0; _i < hunks.length; _i++) {
+ var _hunk = hunks[_i],
+ _toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1;
+
+ diffOffset += _hunk.newLines - _hunk.oldLines;
+
+ for (var j = 0; j < _hunk.lines.length; j++) {
+ var line = _hunk.lines[j],
+ operation = line.length > 0 ? line[0] : ' ',
+ content = line.length > 0 ? line.substr(1) : line,
+ delimiter = _hunk.linedelimiters[j];
+
+ if (operation === ' ') {
+ _toPos++;
+ } else if (operation === '-') {
+ lines.splice(_toPos, 1);
+ delimiters.splice(_toPos, 1);
+ /* istanbul ignore else */
+ } else if (operation === '+') {
+ lines.splice(_toPos, 0, content);
+ delimiters.splice(_toPos, 0, delimiter);
+ _toPos++;
+ } else if (operation === '\\') {
+ var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null;
+
+ if (previousOperation === '+') {
+ removeEOFNL = true;
+ } else if (previousOperation === '-') {
+ addEOFNL = true;
+ }
+ }
+ }
+ } // Handle EOFNL insertion/removal
+
+
+ if (removeEOFNL) {
+ while (!lines[lines.length - 1]) {
+ lines.pop();
+ delimiters.pop();
+ }
+ } else if (addEOFNL) {
+ lines.push('');
+ delimiters.push('\n');
+ }
+
+ for (var _k = 0; _k < lines.length - 1; _k++) {
+ lines[_k] = lines[_k] + delimiters[_k];
+ }
+
+ return lines.join('');
+ } // Wrapper that supports multiple file patches via callbacks.
+
+
+ function applyPatches(uniDiff, options) {
+ if (typeof uniDiff === 'string') {
+ uniDiff = parsePatch(uniDiff);
+ }
+
+ var currentIndex = 0;
+
+ function processIndex() {
+ var index = uniDiff[currentIndex++];
+
+ if (!index) {
+ return options.complete();
+ }
+
+ options.loadFile(index, function (err, data) {
+ if (err) {
+ return options.complete(err);
+ }
+
+ var updatedContent = applyPatch(data, index, options);
+ options.patched(index, updatedContent, function (err) {
+ if (err) {
+ return options.complete(err);
+ }
+
+ processIndex();
+ });
+ });
+ }
+
+ processIndex();
+ }
+
+ function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {
+ if (!options) {
+ options = {};
+ }
+
+ if (typeof options.context === 'undefined') {
+ options.context = 4;
+ }
+
+ var diff = diffLines(oldStr, newStr, options);
+ diff.push({
+ value: '',
+ lines: []
+ }); // Append an empty value to make cleanup easier
+
+ function contextLines(lines) {
+ return lines.map(function (entry) {
+ return ' ' + entry;
+ });
+ }
+
+ var hunks = [];
+ var oldRangeStart = 0,
+ newRangeStart = 0,
+ curRange = [],
+ oldLine = 1,
+ newLine = 1;
+
+ var _loop = function _loop(i) {
+ var current = diff[i],
+ lines = current.lines || current.value.replace(/\n$/, '').split('\n');
+ current.lines = lines;
+
+ if (current.added || current.removed) {
+ var _curRange; // If we have previous context, start with that
+
+
+ if (!oldRangeStart) {
+ var prev = diff[i - 1];
+ oldRangeStart = oldLine;
+ newRangeStart = newLine;
+
+ if (prev) {
+ curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : [];
+ oldRangeStart -= curRange.length;
+ newRangeStart -= curRange.length;
+ }
+ } // Output our changes
+
+
+ (_curRange = curRange).push.apply(_curRange, _toConsumableArray(lines.map(function (entry) {
+ return (current.added ? '+' : '-') + entry;
+ }))); // Track the updated file position
+
+
+ if (current.added) {
+ newLine += lines.length;
+ } else {
+ oldLine += lines.length;
+ }
+ } else {
+ // Identical context lines. Track line changes
+ if (oldRangeStart) {
+ // Close out any changes that have been output (or join overlapping)
+ if (lines.length <= options.context * 2 && i < diff.length - 2) {
+ var _curRange2; // Overlapping
+
+
+ (_curRange2 = curRange).push.apply(_curRange2, _toConsumableArray(contextLines(lines)));
+ } else {
+ var _curRange3; // end the range and output
+
+
+ var contextSize = Math.min(lines.length, options.context);
+
+ (_curRange3 = curRange).push.apply(_curRange3, _toConsumableArray(contextLines(lines.slice(0, contextSize))));
+
+ var hunk = {
+ oldStart: oldRangeStart,
+ oldLines: oldLine - oldRangeStart + contextSize,
+ newStart: newRangeStart,
+ newLines: newLine - newRangeStart + contextSize,
+ lines: curRange
+ };
+
+ if (i >= diff.length - 2 && lines.length <= options.context) {
+ // EOF is inside this hunk
+ var oldEOFNewline = /\n$/.test(oldStr);
+ var newEOFNewline = /\n$/.test(newStr);
+ var noNlBeforeAdds = lines.length == 0 && curRange.length > hunk.oldLines;
+
+ if (!oldEOFNewline && noNlBeforeAdds && oldStr.length > 0) {
+ // special case: old has no eol and no trailing context; no-nl can end up before adds
+ // however, if the old file is empty, do not output the no-nl line
+ curRange.splice(hunk.oldLines, 0, '\\ No newline at end of file');
+ }
+
+ if (!oldEOFNewline && !noNlBeforeAdds || !newEOFNewline) {
+ curRange.push('\\ No newline at end of file');
+ }
+ }
+
+ hunks.push(hunk);
+ oldRangeStart = 0;
+ newRangeStart = 0;
+ curRange = [];
+ }
+ }
+
+ oldLine += lines.length;
+ newLine += lines.length;
+ }
+ };
+
+ for (var i = 0; i < diff.length; i++) {
+ _loop(i);
+ }
+
+ return {
+ oldFileName: oldFileName,
+ newFileName: newFileName,
+ oldHeader: oldHeader,
+ newHeader: newHeader,
+ hunks: hunks
+ };
+ }
+
+ function formatPatch(diff) {
+ var ret = [];
+
+ if (diff.oldFileName == diff.newFileName) {
+ ret.push('Index: ' + diff.oldFileName);
+ }
+
+ ret.push('===================================================================');
+ ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\t' + diff.oldHeader));
+ ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\t' + diff.newHeader));
+
+ for (var i = 0; i < diff.hunks.length; i++) {
+ var hunk = diff.hunks[i]; // Unified Diff Format quirk: If the chunk size is 0,
+ // the first number is one lower than one would expect.
+ // https://www.artima.com/weblogs/viewpost.jsp?thread=164293
+
+ if (hunk.oldLines === 0) {
+ hunk.oldStart -= 1;
+ }
+
+ if (hunk.newLines === 0) {
+ hunk.newStart -= 1;
+ }
+
+ ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@');
+ ret.push.apply(ret, hunk.lines);
+ }
+
+ return ret.join('\n') + '\n';
+ }
+
+ function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) {
+ return formatPatch(structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options));
+ }
+
+ function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) {
+ return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options);
+ }
+
+ function arrayEqual(a, b) {
+ if (a.length !== b.length) {
+ return false;
+ }
+
+ return arrayStartsWith(a, b);
+ }
+
+ function arrayStartsWith(array, start) {
+ if (start.length > array.length) {
+ return false;
+ }
+
+ for (var i = 0; i < start.length; i++) {
+ if (start[i] !== array[i]) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ function calcLineCount(hunk) {
+ var _calcOldNewLineCount = calcOldNewLineCount(hunk.lines),
+ oldLines = _calcOldNewLineCount.oldLines,
+ newLines = _calcOldNewLineCount.newLines;
+
+ if (oldLines !== undefined) {
+ hunk.oldLines = oldLines;
+ } else {
+ delete hunk.oldLines;
+ }
+
+ if (newLines !== undefined) {
+ hunk.newLines = newLines;
+ } else {
+ delete hunk.newLines;
+ }
+ }
+
+ function merge(mine, theirs, base) {
+ mine = loadPatch(mine, base);
+ theirs = loadPatch(theirs, base);
+ var ret = {}; // For index we just let it pass through as it doesn't have any necessary meaning.
+ // Leaving sanity checks on this to the API consumer that may know more about the
+ // meaning in their own context.
+
+ if (mine.index || theirs.index) {
+ ret.index = mine.index || theirs.index;
+ }
+
+ if (mine.newFileName || theirs.newFileName) {
+ if (!fileNameChanged(mine)) {
+ // No header or no change in ours, use theirs (and ours if theirs does not exist)
+ ret.oldFileName = theirs.oldFileName || mine.oldFileName;
+ ret.newFileName = theirs.newFileName || mine.newFileName;
+ ret.oldHeader = theirs.oldHeader || mine.oldHeader;
+ ret.newHeader = theirs.newHeader || mine.newHeader;
+ } else if (!fileNameChanged(theirs)) {
+ // No header or no change in theirs, use ours
+ ret.oldFileName = mine.oldFileName;
+ ret.newFileName = mine.newFileName;
+ ret.oldHeader = mine.oldHeader;
+ ret.newHeader = mine.newHeader;
+ } else {
+ // Both changed... figure it out
+ ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName);
+ ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName);
+ ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader);
+ ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader);
+ }
+ }
+
+ ret.hunks = [];
+ var mineIndex = 0,
+ theirsIndex = 0,
+ mineOffset = 0,
+ theirsOffset = 0;
+
+ while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) {
+ var mineCurrent = mine.hunks[mineIndex] || {
+ oldStart: Infinity
+ },
+ theirsCurrent = theirs.hunks[theirsIndex] || {
+ oldStart: Infinity
+ };
+
+ if (hunkBefore(mineCurrent, theirsCurrent)) {
+ // This patch does not overlap with any of the others, yay.
+ ret.hunks.push(cloneHunk(mineCurrent, mineOffset));
+ mineIndex++;
+ theirsOffset += mineCurrent.newLines - mineCurrent.oldLines;
+ } else if (hunkBefore(theirsCurrent, mineCurrent)) {
+ // This patch does not overlap with any of the others, yay.
+ ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset));
+ theirsIndex++;
+ mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines;
+ } else {
+ // Overlap, merge as best we can
+ var mergedHunk = {
+ oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart),
+ oldLines: 0,
+ newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset),
+ newLines: 0,
+ lines: []
+ };
+ mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines);
+ theirsIndex++;
+ mineIndex++;
+ ret.hunks.push(mergedHunk);
+ }
+ }
+
+ return ret;
+ }
+
+ function loadPatch(param, base) {
+ if (typeof param === 'string') {
+ if (/^@@/m.test(param) || /^Index:/m.test(param)) {
+ return parsePatch(param)[0];
+ }
+
+ if (!base) {
+ throw new Error('Must provide a base reference or pass in a patch');
+ }
+
+ return structuredPatch(undefined, undefined, base, param);
+ }
+
+ return param;
+ }
+
+ function fileNameChanged(patch) {
+ return patch.newFileName && patch.newFileName !== patch.oldFileName;
+ }
+
+ function selectField(index, mine, theirs) {
+ if (mine === theirs) {
+ return mine;
+ } else {
+ index.conflict = true;
+ return {
+ mine: mine,
+ theirs: theirs
+ };
+ }
+ }
+
+ function hunkBefore(test, check) {
+ return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart;
+ }
+
+ function cloneHunk(hunk, offset) {
+ return {
+ oldStart: hunk.oldStart,
+ oldLines: hunk.oldLines,
+ newStart: hunk.newStart + offset,
+ newLines: hunk.newLines,
+ lines: hunk.lines
+ };
+ }
+
+ function mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) {
+ // This will generally result in a conflicted hunk, but there are cases where the context
+ // is the only overlap where we can successfully merge the content here.
+ var mine = {
+ offset: mineOffset,
+ lines: mineLines,
+ index: 0
+ },
+ their = {
+ offset: theirOffset,
+ lines: theirLines,
+ index: 0
+ }; // Handle any leading content
+
+ insertLeading(hunk, mine, their);
+ insertLeading(hunk, their, mine); // Now in the overlap content. Scan through and select the best changes from each.
+
+ while (mine.index < mine.lines.length && their.index < their.lines.length) {
+ var mineCurrent = mine.lines[mine.index],
+ theirCurrent = their.lines[their.index];
+
+ if ((mineCurrent[0] === '-' || mineCurrent[0] === '+') && (theirCurrent[0] === '-' || theirCurrent[0] === '+')) {
+ // Both modified ...
+ mutualChange(hunk, mine, their);
+ } else if (mineCurrent[0] === '+' && theirCurrent[0] === ' ') {
+ var _hunk$lines; // Mine inserted
+
+
+ (_hunk$lines = hunk.lines).push.apply(_hunk$lines, _toConsumableArray(collectChange(mine)));
+ } else if (theirCurrent[0] === '+' && mineCurrent[0] === ' ') {
+ var _hunk$lines2; // Theirs inserted
+
+
+ (_hunk$lines2 = hunk.lines).push.apply(_hunk$lines2, _toConsumableArray(collectChange(their)));
+ } else if (mineCurrent[0] === '-' && theirCurrent[0] === ' ') {
+ // Mine removed or edited
+ removal(hunk, mine, their);
+ } else if (theirCurrent[0] === '-' && mineCurrent[0] === ' ') {
+ // Their removed or edited
+ removal(hunk, their, mine, true);
+ } else if (mineCurrent === theirCurrent) {
+ // Context identity
+ hunk.lines.push(mineCurrent);
+ mine.index++;
+ their.index++;
+ } else {
+ // Context mismatch
+ conflict(hunk, collectChange(mine), collectChange(their));
+ }
+ } // Now push anything that may be remaining
+
+
+ insertTrailing(hunk, mine);
+ insertTrailing(hunk, their);
+ calcLineCount(hunk);
+ }
+
+ function mutualChange(hunk, mine, their) {
+ var myChanges = collectChange(mine),
+ theirChanges = collectChange(their);
+
+ if (allRemoves(myChanges) && allRemoves(theirChanges)) {
+ // Special case for remove changes that are supersets of one another
+ if (arrayStartsWith(myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) {
+ var _hunk$lines3;
+
+ (_hunk$lines3 = hunk.lines).push.apply(_hunk$lines3, _toConsumableArray(myChanges));
+
+ return;
+ } else if (arrayStartsWith(theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) {
+ var _hunk$lines4;
+
+ (_hunk$lines4 = hunk.lines).push.apply(_hunk$lines4, _toConsumableArray(theirChanges));
+
+ return;
+ }
+ } else if (arrayEqual(myChanges, theirChanges)) {
+ var _hunk$lines5;
+
+ (_hunk$lines5 = hunk.lines).push.apply(_hunk$lines5, _toConsumableArray(myChanges));
+
+ return;
+ }
+
+ conflict(hunk, myChanges, theirChanges);
+ }
+
+ function removal(hunk, mine, their, swap) {
+ var myChanges = collectChange(mine),
+ theirChanges = collectContext(their, myChanges);
+
+ if (theirChanges.merged) {
+ var _hunk$lines6;
+
+ (_hunk$lines6 = hunk.lines).push.apply(_hunk$lines6, _toConsumableArray(theirChanges.merged));
+ } else {
+ conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges);
+ }
+ }
+
+ function conflict(hunk, mine, their) {
+ hunk.conflict = true;
+ hunk.lines.push({
+ conflict: true,
+ mine: mine,
+ theirs: their
+ });
+ }
+
+ function insertLeading(hunk, insert, their) {
+ while (insert.offset < their.offset && insert.index < insert.lines.length) {
+ var line = insert.lines[insert.index++];
+ hunk.lines.push(line);
+ insert.offset++;
+ }
+ }
+
+ function insertTrailing(hunk, insert) {
+ while (insert.index < insert.lines.length) {
+ var line = insert.lines[insert.index++];
+ hunk.lines.push(line);
+ }
+ }
+
+ function collectChange(state) {
+ var ret = [],
+ operation = state.lines[state.index][0];
+
+ while (state.index < state.lines.length) {
+ var line = state.lines[state.index]; // Group additions that are immediately after subtractions and treat them as one "atomic" modify change.
+
+ if (operation === '-' && line[0] === '+') {
+ operation = '+';
+ }
+
+ if (operation === line[0]) {
+ ret.push(line);
+ state.index++;
+ } else {
+ break;
+ }
+ }
+
+ return ret;
+ }
+
+ function collectContext(state, matchChanges) {
+ var changes = [],
+ merged = [],
+ matchIndex = 0,
+ contextChanges = false,
+ conflicted = false;
+
+ while (matchIndex < matchChanges.length && state.index < state.lines.length) {
+ var change = state.lines[state.index],
+ match = matchChanges[matchIndex]; // Once we've hit our add, then we are done
+
+ if (match[0] === '+') {
+ break;
+ }
+
+ contextChanges = contextChanges || change[0] !== ' ';
+ merged.push(match);
+ matchIndex++; // Consume any additions in the other block as a conflict to attempt
+ // to pull in the remaining context after this
+
+ if (change[0] === '+') {
+ conflicted = true;
+
+ while (change[0] === '+') {
+ changes.push(change);
+ change = state.lines[++state.index];
+ }
+ }
+
+ if (match.substr(1) === change.substr(1)) {
+ changes.push(change);
+ state.index++;
+ } else {
+ conflicted = true;
+ }
+ }
+
+ if ((matchChanges[matchIndex] || '')[0] === '+' && contextChanges) {
+ conflicted = true;
+ }
+
+ if (conflicted) {
+ return changes;
+ }
+
+ while (matchIndex < matchChanges.length) {
+ merged.push(matchChanges[matchIndex++]);
+ }
+
+ return {
+ merged: merged,
+ changes: changes
+ };
+ }
+
+ function allRemoves(changes) {
+ return changes.reduce(function (prev, change) {
+ return prev && change[0] === '-';
+ }, true);
+ }
+
+ function skipRemoveSuperset(state, removeChanges, delta) {
+ for (var i = 0; i < delta; i++) {
+ var changeContent = removeChanges[removeChanges.length - delta + i].substr(1);
+
+ if (state.lines[state.index + i] !== ' ' + changeContent) {
+ return false;
+ }
+ }
+
+ state.index += delta;
+ return true;
+ }
+
+ function calcOldNewLineCount(lines) {
+ var oldLines = 0;
+ var newLines = 0;
+ lines.forEach(function (line) {
+ if (typeof line !== 'string') {
+ var myCount = calcOldNewLineCount(line.mine);
+ var theirCount = calcOldNewLineCount(line.theirs);
+
+ if (oldLines !== undefined) {
+ if (myCount.oldLines === theirCount.oldLines) {
+ oldLines += myCount.oldLines;
+ } else {
+ oldLines = undefined;
+ }
+ }
+
+ if (newLines !== undefined) {
+ if (myCount.newLines === theirCount.newLines) {
+ newLines += myCount.newLines;
+ } else {
+ newLines = undefined;
+ }
+ }
+ } else {
+ if (newLines !== undefined && (line[0] === '+' || line[0] === ' ')) {
+ newLines++;
+ }
+
+ if (oldLines !== undefined && (line[0] === '-' || line[0] === ' ')) {
+ oldLines++;
+ }
+ }
+ });
+ return {
+ oldLines: oldLines,
+ newLines: newLines
+ };
+ } // See: http://code.google.com/p/google-diff-match-patch/wiki/API
+
+
+ function convertChangesToDMP(changes) {
+ var ret = [],
+ change,
+ operation;
+
+ for (var i = 0; i < changes.length; i++) {
+ change = changes[i];
+
+ if (change.added) {
+ operation = 1;
+ } else if (change.removed) {
+ operation = -1;
+ } else {
+ operation = 0;
+ }
+
+ ret.push([operation, change.value]);
+ }
+
+ return ret;
+ }
+
+ function convertChangesToXML(changes) {
+ var ret = [];
+
+ for (var i = 0; i < changes.length; i++) {
+ var change = changes[i];
+
+ if (change.added) {
+ ret.push('');
+ } else if (change.removed) {
+ ret.push('');
+ }
+
+ ret.push(escapeHTML(change.value));
+
+ if (change.added) {
+ ret.push(' ');
+ } else if (change.removed) {
+ ret.push('');
+ }
+ }
+
+ return ret.join('');
+ }
+
+ function escapeHTML(s) {
+ var n = s;
+ n = n.replace(/&/g, '&');
+ n = n.replace(//g, '>');
+ n = n.replace(/"/g, '"');
+ return n;
+ }
+
+ exports.Diff = Diff;
+ exports.applyPatch = applyPatch;
+ exports.applyPatches = applyPatches;
+ exports.canonicalize = canonicalize;
+ exports.convertChangesToDMP = convertChangesToDMP;
+ exports.convertChangesToXML = convertChangesToXML;
+ exports.createPatch = createPatch;
+ exports.createTwoFilesPatch = createTwoFilesPatch;
+ exports.diffArrays = diffArrays;
+ exports.diffChars = diffChars;
+ exports.diffCss = diffCss;
+ exports.diffJson = diffJson;
+ exports.diffLines = diffLines;
+ exports.diffSentences = diffSentences;
+ exports.diffTrimmedLines = diffTrimmedLines;
+ exports.diffWords = diffWords;
+ exports.diffWordsWithSpace = diffWordsWithSpace;
+ exports.merge = merge;
+ exports.parsePatch = parsePatch;
+ exports.structuredPatch = structuredPatch;
+ Object.defineProperty(exports, '__esModule', {
+ value: true
+ });
+ });
+ });
+
+ /**
+ * Helpers.
+ */
+ var s$1 = 1000;
+ var m$1 = s$1 * 60;
+ var h$1 = m$1 * 60;
+ var d$1 = h$1 * 24;
+ var w$1 = d$1 * 7;
+ var y$1 = d$1 * 365.25;
+ /**
+ * Parse or format the given `val`.
+ *
+ * Options:
+ *
+ * - `long` verbose formatting [false]
+ *
+ * @param {String|Number} val
+ * @param {Object} [options]
+ * @throws {Error} throw an error if val is not a non-empty string or a number
+ * @return {String|Number}
+ * @api public
+ */
+
+ var ms$1 = function ms(val, options) {
+ options = options || {};
+
+ var type = _typeof(val);
+
+ if (type === 'string' && val.length > 0) {
+ return parse$1(val);
+ } else if (type === 'number' && isFinite(val)) {
+ return options["long"] ? fmtLong$1(val) : fmtShort$1(val);
+ }
+
+ throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val));
+ };
+ /**
+ * Parse the given `str` and return milliseconds.
+ *
+ * @param {String} str
+ * @return {Number}
+ * @api private
+ */
+
+
+ function parse$1(str) {
+ str = String(str);
+
+ if (str.length > 100) {
+ return;
+ }
+
+ var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);
+
+ if (!match) {
+ return;
+ }
+
+ var n = parseFloat(match[1]);
+ var type = (match[2] || 'ms').toLowerCase();
+
+ switch (type) {
+ case 'years':
+ case 'year':
+ case 'yrs':
+ case 'yr':
+ case 'y':
+ return n * y$1;
+
+ case 'weeks':
+ case 'week':
+ case 'w':
+ return n * w$1;
+
+ case 'days':
+ case 'day':
+ case 'd':
+ return n * d$1;
+
+ case 'hours':
+ case 'hour':
+ case 'hrs':
+ case 'hr':
+ case 'h':
+ return n * h$1;
+
+ case 'minutes':
+ case 'minute':
+ case 'mins':
+ case 'min':
+ case 'm':
+ return n * m$1;
+
+ case 'seconds':
+ case 'second':
+ case 'secs':
+ case 'sec':
+ case 's':
+ return n * s$1;
+
+ case 'milliseconds':
+ case 'millisecond':
+ case 'msecs':
+ case 'msec':
+ case 'ms':
+ return n;
+
+ default:
+ return undefined;
+ }
+ }
+ /**
+ * Short format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+
+ function fmtShort$1(ms) {
+ var msAbs = Math.abs(ms);
+
+ if (msAbs >= d$1) {
+ return Math.round(ms / d$1) + 'd';
+ }
+
+ if (msAbs >= h$1) {
+ return Math.round(ms / h$1) + 'h';
+ }
+
+ if (msAbs >= m$1) {
+ return Math.round(ms / m$1) + 'm';
+ }
+
+ if (msAbs >= s$1) {
+ return Math.round(ms / s$1) + 's';
+ }
+
+ return ms + 'ms';
+ }
+ /**
+ * Long format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+
+ function fmtLong$1(ms) {
+ var msAbs = Math.abs(ms);
+
+ if (msAbs >= d$1) {
+ return plural$1(ms, msAbs, d$1, 'day');
+ }
+
+ if (msAbs >= h$1) {
+ return plural$1(ms, msAbs, h$1, 'hour');
+ }
+
+ if (msAbs >= m$1) {
+ return plural$1(ms, msAbs, m$1, 'minute');
+ }
+
+ if (msAbs >= s$1) {
+ return plural$1(ms, msAbs, s$1, 'second');
+ }
+
+ return ms + ' ms';
+ }
+ /**
+ * Pluralization helper.
+ */
+
+
+ function plural$1(ms, msAbs, n, name) {
+ var isPlural = msAbs >= n * 1.5;
+ return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
+ }
+
+ var freezing = !fails(function () {
+ // eslint-disable-next-line es/no-object-isextensible, es/no-object-preventextensions -- required for testing
+ return Object.isExtensible(Object.preventExtensions({}));
+ });
+
+ var internalMetadata = createCommonjsModule(function (module) {
+ var defineProperty = objectDefineProperty.f;
+
+
+
+
+
+ var REQUIRED = false;
+ var METADATA = uid('meta');
+ var id = 0;
+
+ // eslint-disable-next-line es/no-object-isextensible -- safe
+ var isExtensible = Object.isExtensible || function () {
+ return true;
+ };
+
+ var setMetadata = function (it) {
+ defineProperty(it, METADATA, { value: {
+ objectID: 'O' + id++, // object ID
+ weakData: {} // weak collections IDs
+ } });
+ };
+
+ var fastKey = function (it, create) {
+ // return a primitive with prefix
+ if (!isObject$1(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+ if (!has$1(it, METADATA)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return 'F';
+ // not necessary to add metadata
+ if (!create) return 'E';
+ // add missing metadata
+ setMetadata(it);
+ // return object ID
+ } return it[METADATA].objectID;
+ };
+
+ var getWeakData = function (it, create) {
+ if (!has$1(it, METADATA)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return true;
+ // not necessary to add metadata
+ if (!create) return false;
+ // add missing metadata
+ setMetadata(it);
+ // return the store of weak collections IDs
+ } return it[METADATA].weakData;
+ };
+
+ // add metadata on freeze-family methods calling
+ var onFreeze = function (it) {
+ if (freezing && REQUIRED && isExtensible(it) && !has$1(it, METADATA)) setMetadata(it);
+ return it;
+ };
+
+ var enable = function () {
+ meta.enable = function () { /* empty */ };
+ REQUIRED = true;
+ var getOwnPropertyNames = objectGetOwnPropertyNames.f;
+ var splice = [].splice;
+ var test = {};
+ test[METADATA] = 1;
+
+ // prevent exposing of metadata key
+ if (getOwnPropertyNames(test).length) {
+ objectGetOwnPropertyNames.f = function (it) {
+ var result = getOwnPropertyNames(it);
+ for (var i = 0, length = result.length; i < length; i++) {
+ if (result[i] === METADATA) {
+ splice.call(result, i, 1);
+ break;
+ }
+ } return result;
+ };
+
+ _export({ target: 'Object', stat: true, forced: true }, {
+ getOwnPropertyNames: objectGetOwnPropertyNamesExternal.f
+ });
+ }
+ };
+
+ var meta = module.exports = {
+ enable: enable,
+ fastKey: fastKey,
+ getWeakData: getWeakData,
+ onFreeze: onFreeze
+ };
+
+ hiddenKeys$1[METADATA] = true;
+ });
+
+ var collection = function (CONSTRUCTOR_NAME, wrapper, common) {
+ var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;
+ var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;
+ var ADDER = IS_MAP ? 'set' : 'add';
+ var NativeConstructor = global_1[CONSTRUCTOR_NAME];
+ var NativePrototype = NativeConstructor && NativeConstructor.prototype;
+ var Constructor = NativeConstructor;
+ var exported = {};
+
+ var fixMethod = function (KEY) {
+ var nativeMethod = NativePrototype[KEY];
+ redefine(NativePrototype, KEY,
+ KEY == 'add' ? function add(value) {
+ nativeMethod.call(this, value === 0 ? 0 : value);
+ return this;
+ } : KEY == 'delete' ? function (key) {
+ return IS_WEAK && !isObject$1(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);
+ } : KEY == 'get' ? function get(key) {
+ return IS_WEAK && !isObject$1(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);
+ } : KEY == 'has' ? function has(key) {
+ return IS_WEAK && !isObject$1(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);
+ } : function set(key, value) {
+ nativeMethod.call(this, key === 0 ? 0 : key, value);
+ return this;
+ }
+ );
+ };
+
+ var REPLACE = isForced_1(
+ CONSTRUCTOR_NAME,
+ !isCallable(NativeConstructor) || !(IS_WEAK || NativePrototype.forEach && !fails(function () {
+ new NativeConstructor().entries().next();
+ }))
+ );
+
+ if (REPLACE) {
+ // create collection constructor
+ Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);
+ internalMetadata.enable();
+ } else if (isForced_1(CONSTRUCTOR_NAME, true)) {
+ var instance = new Constructor();
+ // early implementations not supports chaining
+ var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;
+ // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false
+ var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });
+ // most early implementations doesn't supports iterables, most modern - not close it correctly
+ // eslint-disable-next-line no-new -- required for testing
+ var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });
+ // for early implementations -0 and +0 not the same
+ var BUGGY_ZERO = !IS_WEAK && fails(function () {
+ // V8 ~ Chromium 42- fails only with 5+ elements
+ var $instance = new NativeConstructor();
+ var index = 5;
+ while (index--) $instance[ADDER](index, index);
+ return !$instance.has(-0);
+ });
+
+ if (!ACCEPT_ITERABLES) {
+ Constructor = wrapper(function (dummy, iterable) {
+ anInstance(dummy, Constructor, CONSTRUCTOR_NAME);
+ var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);
+ if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });
+ return that;
+ });
+ Constructor.prototype = NativePrototype;
+ NativePrototype.constructor = Constructor;
+ }
+
+ if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {
+ fixMethod('delete');
+ fixMethod('has');
+ IS_MAP && fixMethod('get');
+ }
+
+ if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);
+
+ // weak collections should not contains .clear method
+ if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;
+ }
+
+ exported[CONSTRUCTOR_NAME] = Constructor;
+ _export({ global: true, forced: Constructor != NativeConstructor }, exported);
+
+ setToStringTag(Constructor, CONSTRUCTOR_NAME);
+
+ if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);
+
+ return Constructor;
+ };
+
+ var defineProperty$1 = objectDefineProperty.f;
+
+
+
+
+
+
+
+
+ var fastKey = internalMetadata.fastKey;
+
+
+ var setInternalState = internalState.set;
+ var internalStateGetterFor = internalState.getterFor;
+
+ var collectionStrong = {
+ getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {
+ var C = wrapper(function (that, iterable) {
+ anInstance(that, C, CONSTRUCTOR_NAME);
+ setInternalState(that, {
+ type: CONSTRUCTOR_NAME,
+ index: objectCreate(null),
+ first: undefined,
+ last: undefined,
+ size: 0
+ });
+ if (!descriptors) that.size = 0;
+ if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });
+ });
+
+ var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);
+
+ var define = function (that, key, value) {
+ var state = getInternalState(that);
+ var entry = getEntry(that, key);
+ var previous, index;
+ // change existing entry
+ if (entry) {
+ entry.value = value;
+ // create new entry
+ } else {
+ state.last = entry = {
+ index: index = fastKey(key, true),
+ key: key,
+ value: value,
+ previous: previous = state.last,
+ next: undefined,
+ removed: false
+ };
+ if (!state.first) state.first = entry;
+ if (previous) previous.next = entry;
+ if (descriptors) state.size++;
+ else that.size++;
+ // add to index
+ if (index !== 'F') state.index[index] = entry;
+ } return that;
+ };
+
+ var getEntry = function (that, key) {
+ var state = getInternalState(that);
+ // fast case
+ var index = fastKey(key);
+ var entry;
+ if (index !== 'F') return state.index[index];
+ // frozen object case
+ for (entry = state.first; entry; entry = entry.next) {
+ if (entry.key == key) return entry;
+ }
+ };
+
+ redefineAll(C.prototype, {
+ // `{ Map, Set }.prototype.clear()` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.clear
+ // https://tc39.es/ecma262/#sec-set.prototype.clear
+ clear: function clear() {
+ var that = this;
+ var state = getInternalState(that);
+ var data = state.index;
+ var entry = state.first;
+ while (entry) {
+ entry.removed = true;
+ if (entry.previous) entry.previous = entry.previous.next = undefined;
+ delete data[entry.index];
+ entry = entry.next;
+ }
+ state.first = state.last = undefined;
+ if (descriptors) state.size = 0;
+ else that.size = 0;
+ },
+ // `{ Map, Set }.prototype.delete(key)` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.delete
+ // https://tc39.es/ecma262/#sec-set.prototype.delete
+ 'delete': function (key) {
+ var that = this;
+ var state = getInternalState(that);
+ var entry = getEntry(that, key);
+ if (entry) {
+ var next = entry.next;
+ var prev = entry.previous;
+ delete state.index[entry.index];
+ entry.removed = true;
+ if (prev) prev.next = next;
+ if (next) next.previous = prev;
+ if (state.first == entry) state.first = next;
+ if (state.last == entry) state.last = prev;
+ if (descriptors) state.size--;
+ else that.size--;
+ } return !!entry;
+ },
+ // `{ Map, Set }.prototype.forEach(callbackfn, thisArg = undefined)` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.foreach
+ // https://tc39.es/ecma262/#sec-set.prototype.foreach
+ forEach: function forEach(callbackfn /* , that = undefined */) {
+ var state = getInternalState(this);
+ var boundFunction = functionBindContext(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
+ var entry;
+ while (entry = entry ? entry.next : state.first) {
+ boundFunction(entry.value, entry.key, this);
+ // revert to the last existing entry
+ while (entry && entry.removed) entry = entry.previous;
+ }
+ },
+ // `{ Map, Set}.prototype.has(key)` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.has
+ // https://tc39.es/ecma262/#sec-set.prototype.has
+ has: function has(key) {
+ return !!getEntry(this, key);
+ }
+ });
+
+ redefineAll(C.prototype, IS_MAP ? {
+ // `Map.prototype.get(key)` method
+ // https://tc39.es/ecma262/#sec-map.prototype.get
+ get: function get(key) {
+ var entry = getEntry(this, key);
+ return entry && entry.value;
+ },
+ // `Map.prototype.set(key, value)` method
+ // https://tc39.es/ecma262/#sec-map.prototype.set
+ set: function set(key, value) {
+ return define(this, key === 0 ? 0 : key, value);
+ }
+ } : {
+ // `Set.prototype.add(value)` method
+ // https://tc39.es/ecma262/#sec-set.prototype.add
+ add: function add(value) {
+ return define(this, value = value === 0 ? 0 : value, value);
+ }
+ });
+ if (descriptors) defineProperty$1(C.prototype, 'size', {
+ get: function () {
+ return getInternalState(this).size;
+ }
+ });
+ return C;
+ },
+ setStrong: function (C, CONSTRUCTOR_NAME, IS_MAP) {
+ var ITERATOR_NAME = CONSTRUCTOR_NAME + ' Iterator';
+ var getInternalCollectionState = internalStateGetterFor(CONSTRUCTOR_NAME);
+ var getInternalIteratorState = internalStateGetterFor(ITERATOR_NAME);
+ // `{ Map, Set }.prototype.{ keys, values, entries, @@iterator }()` methods
+ // https://tc39.es/ecma262/#sec-map.prototype.entries
+ // https://tc39.es/ecma262/#sec-map.prototype.keys
+ // https://tc39.es/ecma262/#sec-map.prototype.values
+ // https://tc39.es/ecma262/#sec-map.prototype-@@iterator
+ // https://tc39.es/ecma262/#sec-set.prototype.entries
+ // https://tc39.es/ecma262/#sec-set.prototype.keys
+ // https://tc39.es/ecma262/#sec-set.prototype.values
+ // https://tc39.es/ecma262/#sec-set.prototype-@@iterator
+ defineIterator(C, CONSTRUCTOR_NAME, function (iterated, kind) {
+ setInternalState(this, {
+ type: ITERATOR_NAME,
+ target: iterated,
+ state: getInternalCollectionState(iterated),
+ kind: kind,
+ last: undefined
+ });
+ }, function () {
+ var state = getInternalIteratorState(this);
+ var kind = state.kind;
+ var entry = state.last;
+ // revert to the last existing entry
+ while (entry && entry.removed) entry = entry.previous;
+ // get next entry
+ if (!state.target || !(state.last = entry = entry ? entry.next : state.state.first)) {
+ // or finish the iteration
+ state.target = undefined;
+ return { value: undefined, done: true };
+ }
+ // return step by kind
+ if (kind == 'keys') return { value: entry.key, done: false };
+ if (kind == 'values') return { value: entry.value, done: false };
+ return { value: [entry.key, entry.value], done: false };
+ }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);
+
+ // `{ Map, Set }.prototype[@@species]` accessors
+ // https://tc39.es/ecma262/#sec-get-map-@@species
+ // https://tc39.es/ecma262/#sec-get-set-@@species
+ setSpecies(CONSTRUCTOR_NAME);
+ }
+ };
+
+ // `Set` constructor
+ // https://tc39.es/ecma262/#sec-set-objects
+ collection('Set', function (init) {
+ return function Set() { return init(this, arguments.length ? arguments[0] : undefined); };
+ }, collectionStrong);
+
+ // eslint-disable-next-line es/no-object-assign -- safe
+ var $assign = Object.assign;
+ // eslint-disable-next-line es/no-object-defineproperty -- required for testing
+ var defineProperty = Object.defineProperty;
+
+ // `Object.assign` method
+ // https://tc39.es/ecma262/#sec-object.assign
+ var objectAssign = !$assign || fails(function () {
+ // should have correct order of operations (Edge bug)
+ if (descriptors && $assign({ b: 1 }, $assign(defineProperty({}, 'a', {
+ enumerable: true,
+ get: function () {
+ defineProperty(this, 'b', {
+ value: 3,
+ enumerable: false
+ });
+ }
+ }), { b: 2 })).b !== 1) return true;
+ // should work with symbols and should have deterministic property order (V8 bug)
+ var A = {};
+ var B = {};
+ // eslint-disable-next-line es/no-symbol -- safe
+ var symbol = Symbol();
+ var alphabet = 'abcdefghijklmnopqrst';
+ A[symbol] = 7;
+ alphabet.split('').forEach(function (chr) { B[chr] = chr; });
+ return $assign({}, A)[symbol] != 7 || objectKeys($assign({}, B)).join('') != alphabet;
+ }) ? function assign(target, source) { // eslint-disable-line no-unused-vars -- required for `.length`
+ var T = toObject(target);
+ var argumentsLength = arguments.length;
+ var index = 1;
+ var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;
+ var propertyIsEnumerable = objectPropertyIsEnumerable.f;
+ while (argumentsLength > index) {
+ var S = indexedObject(arguments[index++]);
+ var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);
+ var length = keys.length;
+ var j = 0;
+ var key;
+ while (length > j) {
+ key = keys[j++];
+ if (!descriptors || propertyIsEnumerable.call(S, key)) T[key] = S[key];
+ }
+ } return T;
+ } : $assign;
+
+ // `Object.assign` method
+ // https://tc39.es/ecma262/#sec-object.assign
+ // eslint-disable-next-line es/no-object-assign -- required for testing
+ _export({ target: 'Object', stat: true, forced: Object.assign !== objectAssign }, {
+ assign: objectAssign
+ });
+
+ var onFreeze = internalMetadata.onFreeze;
+
+ // eslint-disable-next-line es/no-object-freeze -- safe
+ var $freeze = Object.freeze;
+ var FAILS_ON_PRIMITIVES = fails(function () { $freeze(1); });
+
+ // `Object.freeze` method
+ // https://tc39.es/ecma262/#sec-object.freeze
+ _export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES, sham: !freezing }, {
+ freeze: function freeze(it) {
+ return $freeze && isObject$1(it) ? $freeze(onFreeze(it)) : it;
+ }
+ });
+
+ var browser$2 = true;
+
+ // This alphabet uses `A-Za-z0-9_-` symbols. The genetic algorithm helped
+ // optimize the gzip compression for this alphabet.
+ var urlAlphabet = 'ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW';
+
+ var customAlphabet = function customAlphabet(alphabet, size) {
+ return function () {
+ var id = ''; // A compact alternative for `for (var i = 0; i < step; i++)`.
+
+ var i = size;
+
+ while (i--) {
+ // `| 0` is more compact and faster than `Math.floor()`.
+ id += alphabet[Math.random() * alphabet.length | 0];
+ }
+
+ return id;
+ };
+ };
+
+ var nanoid = function nanoid() {
+ var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 21;
+ var id = ''; // A compact alternative for `for (var i = 0; i < step; i++)`.
+
+ var i = size;
+
+ while (i--) {
+ // `| 0` is more compact and faster than `Math.floor()`.
+ id += urlAlphabet[Math.random() * 64 | 0];
+ }
+
+ return id;
+ };
+
+ var nonSecure = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ nanoid: nanoid,
+ customAlphabet: customAlphabet
+ });
+
+ var he = createCommonjsModule(function (module, exports) {
+
+ (function (root) {
+ // Detect free variables `exports`.
+ var freeExports = exports; // Detect free variable `module`.
+
+ var freeModule = module && module.exports == freeExports && module; // Detect free variable `global`, from Node.js or Browserified code,
+ // and use it as `root`.
+
+ var freeGlobal = _typeof(commonjsGlobal) == 'object' && commonjsGlobal;
+
+ if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
+ root = freeGlobal;
+ }
+ /*--------------------------------------------------------------------------*/
+ // All astral symbols.
+
+
+ var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; // All ASCII symbols (not just printable ASCII) except those listed in the
+ // first column of the overrides table.
+ // https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides
+
+ var regexAsciiWhitelist = /[\x01-\x7F]/g; // All BMP symbols that are not ASCII newlines, printable ASCII symbols, or
+ // code points listed in the first column of the overrides table on
+ // https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides.
+
+ var regexBmpWhitelist = /[\x01-\t\x0B\f\x0E-\x1F\x7F\x81\x8D\x8F\x90\x9D\xA0-\uFFFF]/g;
+ var regexEncodeNonAscii = /<\u20D2|=\u20E5|>\u20D2|\u205F\u200A|\u219D\u0338|\u2202\u0338|\u2220\u20D2|\u2229\uFE00|\u222A\uFE00|\u223C\u20D2|\u223D\u0331|\u223E\u0333|\u2242\u0338|\u224B\u0338|\u224D\u20D2|\u224E\u0338|\u224F\u0338|\u2250\u0338|\u2261\u20E5|\u2264\u20D2|\u2265\u20D2|\u2266\u0338|\u2267\u0338|\u2268\uFE00|\u2269\uFE00|\u226A\u0338|\u226A\u20D2|\u226B\u0338|\u226B\u20D2|\u227F\u0338|\u2282\u20D2|\u2283\u20D2|\u228A\uFE00|\u228B\uFE00|\u228F\u0338|\u2290\u0338|\u2293\uFE00|\u2294\uFE00|\u22B4\u20D2|\u22B5\u20D2|\u22D8\u0338|\u22D9\u0338|\u22DA\uFE00|\u22DB\uFE00|\u22F5\u0338|\u22F9\u0338|\u2933\u0338|\u29CF\u0338|\u29D0\u0338|\u2A6D\u0338|\u2A70\u0338|\u2A7D\u0338|\u2A7E\u0338|\u2AA1\u0338|\u2AA2\u0338|\u2AAC\uFE00|\u2AAD\uFE00|\u2AAF\u0338|\u2AB0\u0338|\u2AC5\u0338|\u2AC6\u0338|\u2ACB\uFE00|\u2ACC\uFE00|\u2AFD\u20E5|[\xA0-\u0113\u0116-\u0122\u0124-\u012B\u012E-\u014D\u0150-\u017E\u0192\u01B5\u01F5\u0237\u02C6\u02C7\u02D8-\u02DD\u0311\u0391-\u03A1\u03A3-\u03A9\u03B1-\u03C9\u03D1\u03D2\u03D5\u03D6\u03DC\u03DD\u03F0\u03F1\u03F5\u03F6\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E\u045F\u2002-\u2005\u2007-\u2010\u2013-\u2016\u2018-\u201A\u201C-\u201E\u2020-\u2022\u2025\u2026\u2030-\u2035\u2039\u203A\u203E\u2041\u2043\u2044\u204F\u2057\u205F-\u2063\u20AC\u20DB\u20DC\u2102\u2105\u210A-\u2113\u2115-\u211E\u2122\u2124\u2127-\u2129\u212C\u212D\u212F-\u2131\u2133-\u2138\u2145-\u2148\u2153-\u215E\u2190-\u219B\u219D-\u21A7\u21A9-\u21AE\u21B0-\u21B3\u21B5-\u21B7\u21BA-\u21DB\u21DD\u21E4\u21E5\u21F5\u21FD-\u2205\u2207-\u2209\u220B\u220C\u220F-\u2214\u2216-\u2218\u221A\u221D-\u2238\u223A-\u2257\u2259\u225A\u225C\u225F-\u2262\u2264-\u228B\u228D-\u229B\u229D-\u22A5\u22A7-\u22B0\u22B2-\u22BB\u22BD-\u22DB\u22DE-\u22E3\u22E6-\u22F7\u22F9-\u22FE\u2305\u2306\u2308-\u2310\u2312\u2313\u2315\u2316\u231C-\u231F\u2322\u2323\u232D\u232E\u2336\u233D\u233F\u237C\u23B0\u23B1\u23B4-\u23B6\u23DC-\u23DF\u23E2\u23E7\u2423\u24C8\u2500\u2502\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C\u2550-\u256C\u2580\u2584\u2588\u2591-\u2593\u25A1\u25AA\u25AB\u25AD\u25AE\u25B1\u25B3-\u25B5\u25B8\u25B9\u25BD-\u25BF\u25C2\u25C3\u25CA\u25CB\u25EC\u25EF\u25F8-\u25FC\u2605\u2606\u260E\u2640\u2642\u2660\u2663\u2665\u2666\u266A\u266D-\u266F\u2713\u2717\u2720\u2736\u2758\u2772\u2773\u27C8\u27C9\u27E6-\u27ED\u27F5-\u27FA\u27FC\u27FF\u2902-\u2905\u290C-\u2913\u2916\u2919-\u2920\u2923-\u292A\u2933\u2935-\u2939\u293C\u293D\u2945\u2948-\u294B\u294E-\u2976\u2978\u2979\u297B-\u297F\u2985\u2986\u298B-\u2996\u299A\u299C\u299D\u29A4-\u29B7\u29B9\u29BB\u29BC\u29BE-\u29C5\u29C9\u29CD-\u29D0\u29DC-\u29DE\u29E3-\u29E5\u29EB\u29F4\u29F6\u2A00-\u2A02\u2A04\u2A06\u2A0C\u2A0D\u2A10-\u2A17\u2A22-\u2A27\u2A29\u2A2A\u2A2D-\u2A31\u2A33-\u2A3C\u2A3F\u2A40\u2A42-\u2A4D\u2A50\u2A53-\u2A58\u2A5A-\u2A5D\u2A5F\u2A66\u2A6A\u2A6D-\u2A75\u2A77-\u2A9A\u2A9D-\u2AA2\u2AA4-\u2AB0\u2AB3-\u2AC8\u2ACB\u2ACC\u2ACF-\u2ADB\u2AE4\u2AE6-\u2AE9\u2AEB-\u2AF3\u2AFD\uFB00-\uFB04]|\uD835[\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDD6B]/g;
+ var encodeMap = {
+ '\xAD': 'shy',
+ "\u200C": 'zwnj',
+ "\u200D": 'zwj',
+ "\u200E": 'lrm',
+ "\u2063": 'ic',
+ "\u2062": 'it',
+ "\u2061": 'af',
+ "\u200F": 'rlm',
+ "\u200B": 'ZeroWidthSpace',
+ "\u2060": 'NoBreak',
+ "\u0311": 'DownBreve',
+ "\u20DB": 'tdot',
+ "\u20DC": 'DotDot',
+ '\t': 'Tab',
+ '\n': 'NewLine',
+ "\u2008": 'puncsp',
+ "\u205F": 'MediumSpace',
+ "\u2009": 'thinsp',
+ "\u200A": 'hairsp',
+ "\u2004": 'emsp13',
+ "\u2002": 'ensp',
+ "\u2005": 'emsp14',
+ "\u2003": 'emsp',
+ "\u2007": 'numsp',
+ '\xA0': 'nbsp',
+ "\u205F\u200A": 'ThickSpace',
+ "\u203E": 'oline',
+ '_': 'lowbar',
+ "\u2010": 'dash',
+ "\u2013": 'ndash',
+ "\u2014": 'mdash',
+ "\u2015": 'horbar',
+ ',': 'comma',
+ ';': 'semi',
+ "\u204F": 'bsemi',
+ ':': 'colon',
+ "\u2A74": 'Colone',
+ '!': 'excl',
+ '\xA1': 'iexcl',
+ '?': 'quest',
+ '\xBF': 'iquest',
+ '.': 'period',
+ "\u2025": 'nldr',
+ "\u2026": 'mldr',
+ '\xB7': 'middot',
+ '\'': 'apos',
+ "\u2018": 'lsquo',
+ "\u2019": 'rsquo',
+ "\u201A": 'sbquo',
+ "\u2039": 'lsaquo',
+ "\u203A": 'rsaquo',
+ '"': 'quot',
+ "\u201C": 'ldquo',
+ "\u201D": 'rdquo',
+ "\u201E": 'bdquo',
+ '\xAB': 'laquo',
+ '\xBB': 'raquo',
+ '(': 'lpar',
+ ')': 'rpar',
+ '[': 'lsqb',
+ ']': 'rsqb',
+ '{': 'lcub',
+ '}': 'rcub',
+ "\u2308": 'lceil',
+ "\u2309": 'rceil',
+ "\u230A": 'lfloor',
+ "\u230B": 'rfloor',
+ "\u2985": 'lopar',
+ "\u2986": 'ropar',
+ "\u298B": 'lbrke',
+ "\u298C": 'rbrke',
+ "\u298D": 'lbrkslu',
+ "\u298E": 'rbrksld',
+ "\u298F": 'lbrksld',
+ "\u2990": 'rbrkslu',
+ "\u2991": 'langd',
+ "\u2992": 'rangd',
+ "\u2993": 'lparlt',
+ "\u2994": 'rpargt',
+ "\u2995": 'gtlPar',
+ "\u2996": 'ltrPar',
+ "\u27E6": 'lobrk',
+ "\u27E7": 'robrk',
+ "\u27E8": 'lang',
+ "\u27E9": 'rang',
+ "\u27EA": 'Lang',
+ "\u27EB": 'Rang',
+ "\u27EC": 'loang',
+ "\u27ED": 'roang',
+ "\u2772": 'lbbrk',
+ "\u2773": 'rbbrk',
+ "\u2016": 'Vert',
+ '\xA7': 'sect',
+ '\xB6': 'para',
+ '@': 'commat',
+ '*': 'ast',
+ '/': 'sol',
+ 'undefined': null,
+ '&': 'amp',
+ '#': 'num',
+ '%': 'percnt',
+ "\u2030": 'permil',
+ "\u2031": 'pertenk',
+ "\u2020": 'dagger',
+ "\u2021": 'Dagger',
+ "\u2022": 'bull',
+ "\u2043": 'hybull',
+ "\u2032": 'prime',
+ "\u2033": 'Prime',
+ "\u2034": 'tprime',
+ "\u2057": 'qprime',
+ "\u2035": 'bprime',
+ "\u2041": 'caret',
+ '`': 'grave',
+ '\xB4': 'acute',
+ "\u02DC": 'tilde',
+ '^': 'Hat',
+ '\xAF': 'macr',
+ "\u02D8": 'breve',
+ "\u02D9": 'dot',
+ '\xA8': 'die',
+ "\u02DA": 'ring',
+ "\u02DD": 'dblac',
+ '\xB8': 'cedil',
+ "\u02DB": 'ogon',
+ "\u02C6": 'circ',
+ "\u02C7": 'caron',
+ '\xB0': 'deg',
+ '\xA9': 'copy',
+ '\xAE': 'reg',
+ "\u2117": 'copysr',
+ "\u2118": 'wp',
+ "\u211E": 'rx',
+ "\u2127": 'mho',
+ "\u2129": 'iiota',
+ "\u2190": 'larr',
+ "\u219A": 'nlarr',
+ "\u2192": 'rarr',
+ "\u219B": 'nrarr',
+ "\u2191": 'uarr',
+ "\u2193": 'darr',
+ "\u2194": 'harr',
+ "\u21AE": 'nharr',
+ "\u2195": 'varr',
+ "\u2196": 'nwarr',
+ "\u2197": 'nearr',
+ "\u2198": 'searr',
+ "\u2199": 'swarr',
+ "\u219D": 'rarrw',
+ "\u219D\u0338": 'nrarrw',
+ "\u219E": 'Larr',
+ "\u219F": 'Uarr',
+ "\u21A0": 'Rarr',
+ "\u21A1": 'Darr',
+ "\u21A2": 'larrtl',
+ "\u21A3": 'rarrtl',
+ "\u21A4": 'mapstoleft',
+ "\u21A5": 'mapstoup',
+ "\u21A6": 'map',
+ "\u21A7": 'mapstodown',
+ "\u21A9": 'larrhk',
+ "\u21AA": 'rarrhk',
+ "\u21AB": 'larrlp',
+ "\u21AC": 'rarrlp',
+ "\u21AD": 'harrw',
+ "\u21B0": 'lsh',
+ "\u21B1": 'rsh',
+ "\u21B2": 'ldsh',
+ "\u21B3": 'rdsh',
+ "\u21B5": 'crarr',
+ "\u21B6": 'cularr',
+ "\u21B7": 'curarr',
+ "\u21BA": 'olarr',
+ "\u21BB": 'orarr',
+ "\u21BC": 'lharu',
+ "\u21BD": 'lhard',
+ "\u21BE": 'uharr',
+ "\u21BF": 'uharl',
+ "\u21C0": 'rharu',
+ "\u21C1": 'rhard',
+ "\u21C2": 'dharr',
+ "\u21C3": 'dharl',
+ "\u21C4": 'rlarr',
+ "\u21C5": 'udarr',
+ "\u21C6": 'lrarr',
+ "\u21C7": 'llarr',
+ "\u21C8": 'uuarr',
+ "\u21C9": 'rrarr',
+ "\u21CA": 'ddarr',
+ "\u21CB": 'lrhar',
+ "\u21CC": 'rlhar',
+ "\u21D0": 'lArr',
+ "\u21CD": 'nlArr',
+ "\u21D1": 'uArr',
+ "\u21D2": 'rArr',
+ "\u21CF": 'nrArr',
+ "\u21D3": 'dArr',
+ "\u21D4": 'iff',
+ "\u21CE": 'nhArr',
+ "\u21D5": 'vArr',
+ "\u21D6": 'nwArr',
+ "\u21D7": 'neArr',
+ "\u21D8": 'seArr',
+ "\u21D9": 'swArr',
+ "\u21DA": 'lAarr',
+ "\u21DB": 'rAarr',
+ "\u21DD": 'zigrarr',
+ "\u21E4": 'larrb',
+ "\u21E5": 'rarrb',
+ "\u21F5": 'duarr',
+ "\u21FD": 'loarr',
+ "\u21FE": 'roarr',
+ "\u21FF": 'hoarr',
+ "\u2200": 'forall',
+ "\u2201": 'comp',
+ "\u2202": 'part',
+ "\u2202\u0338": 'npart',
+ "\u2203": 'exist',
+ "\u2204": 'nexist',
+ "\u2205": 'empty',
+ "\u2207": 'Del',
+ "\u2208": 'in',
+ "\u2209": 'notin',
+ "\u220B": 'ni',
+ "\u220C": 'notni',
+ "\u03F6": 'bepsi',
+ "\u220F": 'prod',
+ "\u2210": 'coprod',
+ "\u2211": 'sum',
+ '+': 'plus',
+ '\xB1': 'pm',
+ '\xF7': 'div',
+ '\xD7': 'times',
+ '<': 'lt',
+ "\u226E": 'nlt',
+ "<\u20D2": 'nvlt',
+ '=': 'equals',
+ "\u2260": 'ne',
+ "=\u20E5": 'bne',
+ "\u2A75": 'Equal',
+ '>': 'gt',
+ "\u226F": 'ngt',
+ ">\u20D2": 'nvgt',
+ '\xAC': 'not',
+ '|': 'vert',
+ '\xA6': 'brvbar',
+ "\u2212": 'minus',
+ "\u2213": 'mp',
+ "\u2214": 'plusdo',
+ "\u2044": 'frasl',
+ "\u2216": 'setmn',
+ "\u2217": 'lowast',
+ "\u2218": 'compfn',
+ "\u221A": 'Sqrt',
+ "\u221D": 'prop',
+ "\u221E": 'infin',
+ "\u221F": 'angrt',
+ "\u2220": 'ang',
+ "\u2220\u20D2": 'nang',
+ "\u2221": 'angmsd',
+ "\u2222": 'angsph',
+ "\u2223": 'mid',
+ "\u2224": 'nmid',
+ "\u2225": 'par',
+ "\u2226": 'npar',
+ "\u2227": 'and',
+ "\u2228": 'or',
+ "\u2229": 'cap',
+ "\u2229\uFE00": 'caps',
+ "\u222A": 'cup',
+ "\u222A\uFE00": 'cups',
+ "\u222B": 'int',
+ "\u222C": 'Int',
+ "\u222D": 'tint',
+ "\u2A0C": 'qint',
+ "\u222E": 'oint',
+ "\u222F": 'Conint',
+ "\u2230": 'Cconint',
+ "\u2231": 'cwint',
+ "\u2232": 'cwconint',
+ "\u2233": 'awconint',
+ "\u2234": 'there4',
+ "\u2235": 'becaus',
+ "\u2236": 'ratio',
+ "\u2237": 'Colon',
+ "\u2238": 'minusd',
+ "\u223A": 'mDDot',
+ "\u223B": 'homtht',
+ "\u223C": 'sim',
+ "\u2241": 'nsim',
+ "\u223C\u20D2": 'nvsim',
+ "\u223D": 'bsim',
+ "\u223D\u0331": 'race',
+ "\u223E": 'ac',
+ "\u223E\u0333": 'acE',
+ "\u223F": 'acd',
+ "\u2240": 'wr',
+ "\u2242": 'esim',
+ "\u2242\u0338": 'nesim',
+ "\u2243": 'sime',
+ "\u2244": 'nsime',
+ "\u2245": 'cong',
+ "\u2247": 'ncong',
+ "\u2246": 'simne',
+ "\u2248": 'ap',
+ "\u2249": 'nap',
+ "\u224A": 'ape',
+ "\u224B": 'apid',
+ "\u224B\u0338": 'napid',
+ "\u224C": 'bcong',
+ "\u224D": 'CupCap',
+ "\u226D": 'NotCupCap',
+ "\u224D\u20D2": 'nvap',
+ "\u224E": 'bump',
+ "\u224E\u0338": 'nbump',
+ "\u224F": 'bumpe',
+ "\u224F\u0338": 'nbumpe',
+ "\u2250": 'doteq',
+ "\u2250\u0338": 'nedot',
+ "\u2251": 'eDot',
+ "\u2252": 'efDot',
+ "\u2253": 'erDot',
+ "\u2254": 'colone',
+ "\u2255": 'ecolon',
+ "\u2256": 'ecir',
+ "\u2257": 'cire',
+ "\u2259": 'wedgeq',
+ "\u225A": 'veeeq',
+ "\u225C": 'trie',
+ "\u225F": 'equest',
+ "\u2261": 'equiv',
+ "\u2262": 'nequiv',
+ "\u2261\u20E5": 'bnequiv',
+ "\u2264": 'le',
+ "\u2270": 'nle',
+ "\u2264\u20D2": 'nvle',
+ "\u2265": 'ge',
+ "\u2271": 'nge',
+ "\u2265\u20D2": 'nvge',
+ "\u2266": 'lE',
+ "\u2266\u0338": 'nlE',
+ "\u2267": 'gE',
+ "\u2267\u0338": 'ngE',
+ "\u2268\uFE00": 'lvnE',
+ "\u2268": 'lnE',
+ "\u2269": 'gnE',
+ "\u2269\uFE00": 'gvnE',
+ "\u226A": 'll',
+ "\u226A\u0338": 'nLtv',
+ "\u226A\u20D2": 'nLt',
+ "\u226B": 'gg',
+ "\u226B\u0338": 'nGtv',
+ "\u226B\u20D2": 'nGt',
+ "\u226C": 'twixt',
+ "\u2272": 'lsim',
+ "\u2274": 'nlsim',
+ "\u2273": 'gsim',
+ "\u2275": 'ngsim',
+ "\u2276": 'lg',
+ "\u2278": 'ntlg',
+ "\u2277": 'gl',
+ "\u2279": 'ntgl',
+ "\u227A": 'pr',
+ "\u2280": 'npr',
+ "\u227B": 'sc',
+ "\u2281": 'nsc',
+ "\u227C": 'prcue',
+ "\u22E0": 'nprcue',
+ "\u227D": 'sccue',
+ "\u22E1": 'nsccue',
+ "\u227E": 'prsim',
+ "\u227F": 'scsim',
+ "\u227F\u0338": 'NotSucceedsTilde',
+ "\u2282": 'sub',
+ "\u2284": 'nsub',
+ "\u2282\u20D2": 'vnsub',
+ "\u2283": 'sup',
+ "\u2285": 'nsup',
+ "\u2283\u20D2": 'vnsup',
+ "\u2286": 'sube',
+ "\u2288": 'nsube',
+ "\u2287": 'supe',
+ "\u2289": 'nsupe',
+ "\u228A\uFE00": 'vsubne',
+ "\u228A": 'subne',
+ "\u228B\uFE00": 'vsupne',
+ "\u228B": 'supne',
+ "\u228D": 'cupdot',
+ "\u228E": 'uplus',
+ "\u228F": 'sqsub',
+ "\u228F\u0338": 'NotSquareSubset',
+ "\u2290": 'sqsup',
+ "\u2290\u0338": 'NotSquareSuperset',
+ "\u2291": 'sqsube',
+ "\u22E2": 'nsqsube',
+ "\u2292": 'sqsupe',
+ "\u22E3": 'nsqsupe',
+ "\u2293": 'sqcap',
+ "\u2293\uFE00": 'sqcaps',
+ "\u2294": 'sqcup',
+ "\u2294\uFE00": 'sqcups',
+ "\u2295": 'oplus',
+ "\u2296": 'ominus',
+ "\u2297": 'otimes',
+ "\u2298": 'osol',
+ "\u2299": 'odot',
+ "\u229A": 'ocir',
+ "\u229B": 'oast',
+ "\u229D": 'odash',
+ "\u229E": 'plusb',
+ "\u229F": 'minusb',
+ "\u22A0": 'timesb',
+ "\u22A1": 'sdotb',
+ "\u22A2": 'vdash',
+ "\u22AC": 'nvdash',
+ "\u22A3": 'dashv',
+ "\u22A4": 'top',
+ "\u22A5": 'bot',
+ "\u22A7": 'models',
+ "\u22A8": 'vDash',
+ "\u22AD": 'nvDash',
+ "\u22A9": 'Vdash',
+ "\u22AE": 'nVdash',
+ "\u22AA": 'Vvdash',
+ "\u22AB": 'VDash',
+ "\u22AF": 'nVDash',
+ "\u22B0": 'prurel',
+ "\u22B2": 'vltri',
+ "\u22EA": 'nltri',
+ "\u22B3": 'vrtri',
+ "\u22EB": 'nrtri',
+ "\u22B4": 'ltrie',
+ "\u22EC": 'nltrie',
+ "\u22B4\u20D2": 'nvltrie',
+ "\u22B5": 'rtrie',
+ "\u22ED": 'nrtrie',
+ "\u22B5\u20D2": 'nvrtrie',
+ "\u22B6": 'origof',
+ "\u22B7": 'imof',
+ "\u22B8": 'mumap',
+ "\u22B9": 'hercon',
+ "\u22BA": 'intcal',
+ "\u22BB": 'veebar',
+ "\u22BD": 'barvee',
+ "\u22BE": 'angrtvb',
+ "\u22BF": 'lrtri',
+ "\u22C0": 'Wedge',
+ "\u22C1": 'Vee',
+ "\u22C2": 'xcap',
+ "\u22C3": 'xcup',
+ "\u22C4": 'diam',
+ "\u22C5": 'sdot',
+ "\u22C6": 'Star',
+ "\u22C7": 'divonx',
+ "\u22C8": 'bowtie',
+ "\u22C9": 'ltimes',
+ "\u22CA": 'rtimes',
+ "\u22CB": 'lthree',
+ "\u22CC": 'rthree',
+ "\u22CD": 'bsime',
+ "\u22CE": 'cuvee',
+ "\u22CF": 'cuwed',
+ "\u22D0": 'Sub',
+ "\u22D1": 'Sup',
+ "\u22D2": 'Cap',
+ "\u22D3": 'Cup',
+ "\u22D4": 'fork',
+ "\u22D5": 'epar',
+ "\u22D6": 'ltdot',
+ "\u22D7": 'gtdot',
+ "\u22D8": 'Ll',
+ "\u22D8\u0338": 'nLl',
+ "\u22D9": 'Gg',
+ "\u22D9\u0338": 'nGg',
+ "\u22DA\uFE00": 'lesg',
+ "\u22DA": 'leg',
+ "\u22DB": 'gel',
+ "\u22DB\uFE00": 'gesl',
+ "\u22DE": 'cuepr',
+ "\u22DF": 'cuesc',
+ "\u22E6": 'lnsim',
+ "\u22E7": 'gnsim',
+ "\u22E8": 'prnsim',
+ "\u22E9": 'scnsim',
+ "\u22EE": 'vellip',
+ "\u22EF": 'ctdot',
+ "\u22F0": 'utdot',
+ "\u22F1": 'dtdot',
+ "\u22F2": 'disin',
+ "\u22F3": 'isinsv',
+ "\u22F4": 'isins',
+ "\u22F5": 'isindot',
+ "\u22F5\u0338": 'notindot',
+ "\u22F6": 'notinvc',
+ "\u22F7": 'notinvb',
+ "\u22F9": 'isinE',
+ "\u22F9\u0338": 'notinE',
+ "\u22FA": 'nisd',
+ "\u22FB": 'xnis',
+ "\u22FC": 'nis',
+ "\u22FD": 'notnivc',
+ "\u22FE": 'notnivb',
+ "\u2305": 'barwed',
+ "\u2306": 'Barwed',
+ "\u230C": 'drcrop',
+ "\u230D": 'dlcrop',
+ "\u230E": 'urcrop',
+ "\u230F": 'ulcrop',
+ "\u2310": 'bnot',
+ "\u2312": 'profline',
+ "\u2313": 'profsurf',
+ "\u2315": 'telrec',
+ "\u2316": 'target',
+ "\u231C": 'ulcorn',
+ "\u231D": 'urcorn',
+ "\u231E": 'dlcorn',
+ "\u231F": 'drcorn',
+ "\u2322": 'frown',
+ "\u2323": 'smile',
+ "\u232D": 'cylcty',
+ "\u232E": 'profalar',
+ "\u2336": 'topbot',
+ "\u233D": 'ovbar',
+ "\u233F": 'solbar',
+ "\u237C": 'angzarr',
+ "\u23B0": 'lmoust',
+ "\u23B1": 'rmoust',
+ "\u23B4": 'tbrk',
+ "\u23B5": 'bbrk',
+ "\u23B6": 'bbrktbrk',
+ "\u23DC": 'OverParenthesis',
+ "\u23DD": 'UnderParenthesis',
+ "\u23DE": 'OverBrace',
+ "\u23DF": 'UnderBrace',
+ "\u23E2": 'trpezium',
+ "\u23E7": 'elinters',
+ "\u2423": 'blank',
+ "\u2500": 'boxh',
+ "\u2502": 'boxv',
+ "\u250C": 'boxdr',
+ "\u2510": 'boxdl',
+ "\u2514": 'boxur',
+ "\u2518": 'boxul',
+ "\u251C": 'boxvr',
+ "\u2524": 'boxvl',
+ "\u252C": 'boxhd',
+ "\u2534": 'boxhu',
+ "\u253C": 'boxvh',
+ "\u2550": 'boxH',
+ "\u2551": 'boxV',
+ "\u2552": 'boxdR',
+ "\u2553": 'boxDr',
+ "\u2554": 'boxDR',
+ "\u2555": 'boxdL',
+ "\u2556": 'boxDl',
+ "\u2557": 'boxDL',
+ "\u2558": 'boxuR',
+ "\u2559": 'boxUr',
+ "\u255A": 'boxUR',
+ "\u255B": 'boxuL',
+ "\u255C": 'boxUl',
+ "\u255D": 'boxUL',
+ "\u255E": 'boxvR',
+ "\u255F": 'boxVr',
+ "\u2560": 'boxVR',
+ "\u2561": 'boxvL',
+ "\u2562": 'boxVl',
+ "\u2563": 'boxVL',
+ "\u2564": 'boxHd',
+ "\u2565": 'boxhD',
+ "\u2566": 'boxHD',
+ "\u2567": 'boxHu',
+ "\u2568": 'boxhU',
+ "\u2569": 'boxHU',
+ "\u256A": 'boxvH',
+ "\u256B": 'boxVh',
+ "\u256C": 'boxVH',
+ "\u2580": 'uhblk',
+ "\u2584": 'lhblk',
+ "\u2588": 'block',
+ "\u2591": 'blk14',
+ "\u2592": 'blk12',
+ "\u2593": 'blk34',
+ "\u25A1": 'squ',
+ "\u25AA": 'squf',
+ "\u25AB": 'EmptyVerySmallSquare',
+ "\u25AD": 'rect',
+ "\u25AE": 'marker',
+ "\u25B1": 'fltns',
+ "\u25B3": 'xutri',
+ "\u25B4": 'utrif',
+ "\u25B5": 'utri',
+ "\u25B8": 'rtrif',
+ "\u25B9": 'rtri',
+ "\u25BD": 'xdtri',
+ "\u25BE": 'dtrif',
+ "\u25BF": 'dtri',
+ "\u25C2": 'ltrif',
+ "\u25C3": 'ltri',
+ "\u25CA": 'loz',
+ "\u25CB": 'cir',
+ "\u25EC": 'tridot',
+ "\u25EF": 'xcirc',
+ "\u25F8": 'ultri',
+ "\u25F9": 'urtri',
+ "\u25FA": 'lltri',
+ "\u25FB": 'EmptySmallSquare',
+ "\u25FC": 'FilledSmallSquare',
+ "\u2605": 'starf',
+ "\u2606": 'star',
+ "\u260E": 'phone',
+ "\u2640": 'female',
+ "\u2642": 'male',
+ "\u2660": 'spades',
+ "\u2663": 'clubs',
+ "\u2665": 'hearts',
+ "\u2666": 'diams',
+ "\u266A": 'sung',
+ "\u2713": 'check',
+ "\u2717": 'cross',
+ "\u2720": 'malt',
+ "\u2736": 'sext',
+ "\u2758": 'VerticalSeparator',
+ "\u27C8": 'bsolhsub',
+ "\u27C9": 'suphsol',
+ "\u27F5": 'xlarr',
+ "\u27F6": 'xrarr',
+ "\u27F7": 'xharr',
+ "\u27F8": 'xlArr',
+ "\u27F9": 'xrArr',
+ "\u27FA": 'xhArr',
+ "\u27FC": 'xmap',
+ "\u27FF": 'dzigrarr',
+ "\u2902": 'nvlArr',
+ "\u2903": 'nvrArr',
+ "\u2904": 'nvHarr',
+ "\u2905": 'Map',
+ "\u290C": 'lbarr',
+ "\u290D": 'rbarr',
+ "\u290E": 'lBarr',
+ "\u290F": 'rBarr',
+ "\u2910": 'RBarr',
+ "\u2911": 'DDotrahd',
+ "\u2912": 'UpArrowBar',
+ "\u2913": 'DownArrowBar',
+ "\u2916": 'Rarrtl',
+ "\u2919": 'latail',
+ "\u291A": 'ratail',
+ "\u291B": 'lAtail',
+ "\u291C": 'rAtail',
+ "\u291D": 'larrfs',
+ "\u291E": 'rarrfs',
+ "\u291F": 'larrbfs',
+ "\u2920": 'rarrbfs',
+ "\u2923": 'nwarhk',
+ "\u2924": 'nearhk',
+ "\u2925": 'searhk',
+ "\u2926": 'swarhk',
+ "\u2927": 'nwnear',
+ "\u2928": 'toea',
+ "\u2929": 'tosa',
+ "\u292A": 'swnwar',
+ "\u2933": 'rarrc',
+ "\u2933\u0338": 'nrarrc',
+ "\u2935": 'cudarrr',
+ "\u2936": 'ldca',
+ "\u2937": 'rdca',
+ "\u2938": 'cudarrl',
+ "\u2939": 'larrpl',
+ "\u293C": 'curarrm',
+ "\u293D": 'cularrp',
+ "\u2945": 'rarrpl',
+ "\u2948": 'harrcir',
+ "\u2949": 'Uarrocir',
+ "\u294A": 'lurdshar',
+ "\u294B": 'ldrushar',
+ "\u294E": 'LeftRightVector',
+ "\u294F": 'RightUpDownVector',
+ "\u2950": 'DownLeftRightVector',
+ "\u2951": 'LeftUpDownVector',
+ "\u2952": 'LeftVectorBar',
+ "\u2953": 'RightVectorBar',
+ "\u2954": 'RightUpVectorBar',
+ "\u2955": 'RightDownVectorBar',
+ "\u2956": 'DownLeftVectorBar',
+ "\u2957": 'DownRightVectorBar',
+ "\u2958": 'LeftUpVectorBar',
+ "\u2959": 'LeftDownVectorBar',
+ "\u295A": 'LeftTeeVector',
+ "\u295B": 'RightTeeVector',
+ "\u295C": 'RightUpTeeVector',
+ "\u295D": 'RightDownTeeVector',
+ "\u295E": 'DownLeftTeeVector',
+ "\u295F": 'DownRightTeeVector',
+ "\u2960": 'LeftUpTeeVector',
+ "\u2961": 'LeftDownTeeVector',
+ "\u2962": 'lHar',
+ "\u2963": 'uHar',
+ "\u2964": 'rHar',
+ "\u2965": 'dHar',
+ "\u2966": 'luruhar',
+ "\u2967": 'ldrdhar',
+ "\u2968": 'ruluhar',
+ "\u2969": 'rdldhar',
+ "\u296A": 'lharul',
+ "\u296B": 'llhard',
+ "\u296C": 'rharul',
+ "\u296D": 'lrhard',
+ "\u296E": 'udhar',
+ "\u296F": 'duhar',
+ "\u2970": 'RoundImplies',
+ "\u2971": 'erarr',
+ "\u2972": 'simrarr',
+ "\u2973": 'larrsim',
+ "\u2974": 'rarrsim',
+ "\u2975": 'rarrap',
+ "\u2976": 'ltlarr',
+ "\u2978": 'gtrarr',
+ "\u2979": 'subrarr',
+ "\u297B": 'suplarr',
+ "\u297C": 'lfisht',
+ "\u297D": 'rfisht',
+ "\u297E": 'ufisht',
+ "\u297F": 'dfisht',
+ "\u299A": 'vzigzag',
+ "\u299C": 'vangrt',
+ "\u299D": 'angrtvbd',
+ "\u29A4": 'ange',
+ "\u29A5": 'range',
+ "\u29A6": 'dwangle',
+ "\u29A7": 'uwangle',
+ "\u29A8": 'angmsdaa',
+ "\u29A9": 'angmsdab',
+ "\u29AA": 'angmsdac',
+ "\u29AB": 'angmsdad',
+ "\u29AC": 'angmsdae',
+ "\u29AD": 'angmsdaf',
+ "\u29AE": 'angmsdag',
+ "\u29AF": 'angmsdah',
+ "\u29B0": 'bemptyv',
+ "\u29B1": 'demptyv',
+ "\u29B2": 'cemptyv',
+ "\u29B3": 'raemptyv',
+ "\u29B4": 'laemptyv',
+ "\u29B5": 'ohbar',
+ "\u29B6": 'omid',
+ "\u29B7": 'opar',
+ "\u29B9": 'operp',
+ "\u29BB": 'olcross',
+ "\u29BC": 'odsold',
+ "\u29BE": 'olcir',
+ "\u29BF": 'ofcir',
+ "\u29C0": 'olt',
+ "\u29C1": 'ogt',
+ "\u29C2": 'cirscir',
+ "\u29C3": 'cirE',
+ "\u29C4": 'solb',
+ "\u29C5": 'bsolb',
+ "\u29C9": 'boxbox',
+ "\u29CD": 'trisb',
+ "\u29CE": 'rtriltri',
+ "\u29CF": 'LeftTriangleBar',
+ "\u29CF\u0338": 'NotLeftTriangleBar',
+ "\u29D0": 'RightTriangleBar',
+ "\u29D0\u0338": 'NotRightTriangleBar',
+ "\u29DC": 'iinfin',
+ "\u29DD": 'infintie',
+ "\u29DE": 'nvinfin',
+ "\u29E3": 'eparsl',
+ "\u29E4": 'smeparsl',
+ "\u29E5": 'eqvparsl',
+ "\u29EB": 'lozf',
+ "\u29F4": 'RuleDelayed',
+ "\u29F6": 'dsol',
+ "\u2A00": 'xodot',
+ "\u2A01": 'xoplus',
+ "\u2A02": 'xotime',
+ "\u2A04": 'xuplus',
+ "\u2A06": 'xsqcup',
+ "\u2A0D": 'fpartint',
+ "\u2A10": 'cirfnint',
+ "\u2A11": 'awint',
+ "\u2A12": 'rppolint',
+ "\u2A13": 'scpolint',
+ "\u2A14": 'npolint',
+ "\u2A15": 'pointint',
+ "\u2A16": 'quatint',
+ "\u2A17": 'intlarhk',
+ "\u2A22": 'pluscir',
+ "\u2A23": 'plusacir',
+ "\u2A24": 'simplus',
+ "\u2A25": 'plusdu',
+ "\u2A26": 'plussim',
+ "\u2A27": 'plustwo',
+ "\u2A29": 'mcomma',
+ "\u2A2A": 'minusdu',
+ "\u2A2D": 'loplus',
+ "\u2A2E": 'roplus',
+ "\u2A2F": 'Cross',
+ "\u2A30": 'timesd',
+ "\u2A31": 'timesbar',
+ "\u2A33": 'smashp',
+ "\u2A34": 'lotimes',
+ "\u2A35": 'rotimes',
+ "\u2A36": 'otimesas',
+ "\u2A37": 'Otimes',
+ "\u2A38": 'odiv',
+ "\u2A39": 'triplus',
+ "\u2A3A": 'triminus',
+ "\u2A3B": 'tritime',
+ "\u2A3C": 'iprod',
+ "\u2A3F": 'amalg',
+ "\u2A40": 'capdot',
+ "\u2A42": 'ncup',
+ "\u2A43": 'ncap',
+ "\u2A44": 'capand',
+ "\u2A45": 'cupor',
+ "\u2A46": 'cupcap',
+ "\u2A47": 'capcup',
+ "\u2A48": 'cupbrcap',
+ "\u2A49": 'capbrcup',
+ "\u2A4A": 'cupcup',
+ "\u2A4B": 'capcap',
+ "\u2A4C": 'ccups',
+ "\u2A4D": 'ccaps',
+ "\u2A50": 'ccupssm',
+ "\u2A53": 'And',
+ "\u2A54": 'Or',
+ "\u2A55": 'andand',
+ "\u2A56": 'oror',
+ "\u2A57": 'orslope',
+ "\u2A58": 'andslope',
+ "\u2A5A": 'andv',
+ "\u2A5B": 'orv',
+ "\u2A5C": 'andd',
+ "\u2A5D": 'ord',
+ "\u2A5F": 'wedbar',
+ "\u2A66": 'sdote',
+ "\u2A6A": 'simdot',
+ "\u2A6D": 'congdot',
+ "\u2A6D\u0338": 'ncongdot',
+ "\u2A6E": 'easter',
+ "\u2A6F": 'apacir',
+ "\u2A70": 'apE',
+ "\u2A70\u0338": 'napE',
+ "\u2A71": 'eplus',
+ "\u2A72": 'pluse',
+ "\u2A73": 'Esim',
+ "\u2A77": 'eDDot',
+ "\u2A78": 'equivDD',
+ "\u2A79": 'ltcir',
+ "\u2A7A": 'gtcir',
+ "\u2A7B": 'ltquest',
+ "\u2A7C": 'gtquest',
+ "\u2A7D": 'les',
+ "\u2A7D\u0338": 'nles',
+ "\u2A7E": 'ges',
+ "\u2A7E\u0338": 'nges',
+ "\u2A7F": 'lesdot',
+ "\u2A80": 'gesdot',
+ "\u2A81": 'lesdoto',
+ "\u2A82": 'gesdoto',
+ "\u2A83": 'lesdotor',
+ "\u2A84": 'gesdotol',
+ "\u2A85": 'lap',
+ "\u2A86": 'gap',
+ "\u2A87": 'lne',
+ "\u2A88": 'gne',
+ "\u2A89": 'lnap',
+ "\u2A8A": 'gnap',
+ "\u2A8B": 'lEg',
+ "\u2A8C": 'gEl',
+ "\u2A8D": 'lsime',
+ "\u2A8E": 'gsime',
+ "\u2A8F": 'lsimg',
+ "\u2A90": 'gsiml',
+ "\u2A91": 'lgE',
+ "\u2A92": 'glE',
+ "\u2A93": 'lesges',
+ "\u2A94": 'gesles',
+ "\u2A95": 'els',
+ "\u2A96": 'egs',
+ "\u2A97": 'elsdot',
+ "\u2A98": 'egsdot',
+ "\u2A99": 'el',
+ "\u2A9A": 'eg',
+ "\u2A9D": 'siml',
+ "\u2A9E": 'simg',
+ "\u2A9F": 'simlE',
+ "\u2AA0": 'simgE',
+ "\u2AA1": 'LessLess',
+ "\u2AA1\u0338": 'NotNestedLessLess',
+ "\u2AA2": 'GreaterGreater',
+ "\u2AA2\u0338": 'NotNestedGreaterGreater',
+ "\u2AA4": 'glj',
+ "\u2AA5": 'gla',
+ "\u2AA6": 'ltcc',
+ "\u2AA7": 'gtcc',
+ "\u2AA8": 'lescc',
+ "\u2AA9": 'gescc',
+ "\u2AAA": 'smt',
+ "\u2AAB": 'lat',
+ "\u2AAC": 'smte',
+ "\u2AAC\uFE00": 'smtes',
+ "\u2AAD": 'late',
+ "\u2AAD\uFE00": 'lates',
+ "\u2AAE": 'bumpE',
+ "\u2AAF": 'pre',
+ "\u2AAF\u0338": 'npre',
+ "\u2AB0": 'sce',
+ "\u2AB0\u0338": 'nsce',
+ "\u2AB3": 'prE',
+ "\u2AB4": 'scE',
+ "\u2AB5": 'prnE',
+ "\u2AB6": 'scnE',
+ "\u2AB7": 'prap',
+ "\u2AB8": 'scap',
+ "\u2AB9": 'prnap',
+ "\u2ABA": 'scnap',
+ "\u2ABB": 'Pr',
+ "\u2ABC": 'Sc',
+ "\u2ABD": 'subdot',
+ "\u2ABE": 'supdot',
+ "\u2ABF": 'subplus',
+ "\u2AC0": 'supplus',
+ "\u2AC1": 'submult',
+ "\u2AC2": 'supmult',
+ "\u2AC3": 'subedot',
+ "\u2AC4": 'supedot',
+ "\u2AC5": 'subE',
+ "\u2AC5\u0338": 'nsubE',
+ "\u2AC6": 'supE',
+ "\u2AC6\u0338": 'nsupE',
+ "\u2AC7": 'subsim',
+ "\u2AC8": 'supsim',
+ "\u2ACB\uFE00": 'vsubnE',
+ "\u2ACB": 'subnE',
+ "\u2ACC\uFE00": 'vsupnE',
+ "\u2ACC": 'supnE',
+ "\u2ACF": 'csub',
+ "\u2AD0": 'csup',
+ "\u2AD1": 'csube',
+ "\u2AD2": 'csupe',
+ "\u2AD3": 'subsup',
+ "\u2AD4": 'supsub',
+ "\u2AD5": 'subsub',
+ "\u2AD6": 'supsup',
+ "\u2AD7": 'suphsub',
+ "\u2AD8": 'supdsub',
+ "\u2AD9": 'forkv',
+ "\u2ADA": 'topfork',
+ "\u2ADB": 'mlcp',
+ "\u2AE4": 'Dashv',
+ "\u2AE6": 'Vdashl',
+ "\u2AE7": 'Barv',
+ "\u2AE8": 'vBar',
+ "\u2AE9": 'vBarv',
+ "\u2AEB": 'Vbar',
+ "\u2AEC": 'Not',
+ "\u2AED": 'bNot',
+ "\u2AEE": 'rnmid',
+ "\u2AEF": 'cirmid',
+ "\u2AF0": 'midcir',
+ "\u2AF1": 'topcir',
+ "\u2AF2": 'nhpar',
+ "\u2AF3": 'parsim',
+ "\u2AFD": 'parsl',
+ "\u2AFD\u20E5": 'nparsl',
+ "\u266D": 'flat',
+ "\u266E": 'natur',
+ "\u266F": 'sharp',
+ '\xA4': 'curren',
+ '\xA2': 'cent',
+ '$': 'dollar',
+ '\xA3': 'pound',
+ '\xA5': 'yen',
+ "\u20AC": 'euro',
+ '\xB9': 'sup1',
+ '\xBD': 'half',
+ "\u2153": 'frac13',
+ '\xBC': 'frac14',
+ "\u2155": 'frac15',
+ "\u2159": 'frac16',
+ "\u215B": 'frac18',
+ '\xB2': 'sup2',
+ "\u2154": 'frac23',
+ "\u2156": 'frac25',
+ '\xB3': 'sup3',
+ '\xBE': 'frac34',
+ "\u2157": 'frac35',
+ "\u215C": 'frac38',
+ "\u2158": 'frac45',
+ "\u215A": 'frac56',
+ "\u215D": 'frac58',
+ "\u215E": 'frac78',
+ "\uD835\uDCB6": 'ascr',
+ "\uD835\uDD52": 'aopf',
+ "\uD835\uDD1E": 'afr',
+ "\uD835\uDD38": 'Aopf',
+ "\uD835\uDD04": 'Afr',
+ "\uD835\uDC9C": 'Ascr',
+ '\xAA': 'ordf',
+ '\xE1': 'aacute',
+ '\xC1': 'Aacute',
+ '\xE0': 'agrave',
+ '\xC0': 'Agrave',
+ "\u0103": 'abreve',
+ "\u0102": 'Abreve',
+ '\xE2': 'acirc',
+ '\xC2': 'Acirc',
+ '\xE5': 'aring',
+ '\xC5': 'angst',
+ '\xE4': 'auml',
+ '\xC4': 'Auml',
+ '\xE3': 'atilde',
+ '\xC3': 'Atilde',
+ "\u0105": 'aogon',
+ "\u0104": 'Aogon',
+ "\u0101": 'amacr',
+ "\u0100": 'Amacr',
+ '\xE6': 'aelig',
+ '\xC6': 'AElig',
+ "\uD835\uDCB7": 'bscr',
+ "\uD835\uDD53": 'bopf',
+ "\uD835\uDD1F": 'bfr',
+ "\uD835\uDD39": 'Bopf',
+ "\u212C": 'Bscr',
+ "\uD835\uDD05": 'Bfr',
+ "\uD835\uDD20": 'cfr',
+ "\uD835\uDCB8": 'cscr',
+ "\uD835\uDD54": 'copf',
+ "\u212D": 'Cfr',
+ "\uD835\uDC9E": 'Cscr',
+ "\u2102": 'Copf',
+ "\u0107": 'cacute',
+ "\u0106": 'Cacute',
+ "\u0109": 'ccirc',
+ "\u0108": 'Ccirc',
+ "\u010D": 'ccaron',
+ "\u010C": 'Ccaron',
+ "\u010B": 'cdot',
+ "\u010A": 'Cdot',
+ '\xE7': 'ccedil',
+ '\xC7': 'Ccedil',
+ "\u2105": 'incare',
+ "\uD835\uDD21": 'dfr',
+ "\u2146": 'dd',
+ "\uD835\uDD55": 'dopf',
+ "\uD835\uDCB9": 'dscr',
+ "\uD835\uDC9F": 'Dscr',
+ "\uD835\uDD07": 'Dfr',
+ "\u2145": 'DD',
+ "\uD835\uDD3B": 'Dopf',
+ "\u010F": 'dcaron',
+ "\u010E": 'Dcaron',
+ "\u0111": 'dstrok',
+ "\u0110": 'Dstrok',
+ '\xF0': 'eth',
+ '\xD0': 'ETH',
+ "\u2147": 'ee',
+ "\u212F": 'escr',
+ "\uD835\uDD22": 'efr',
+ "\uD835\uDD56": 'eopf',
+ "\u2130": 'Escr',
+ "\uD835\uDD08": 'Efr',
+ "\uD835\uDD3C": 'Eopf',
+ '\xE9': 'eacute',
+ '\xC9': 'Eacute',
+ '\xE8': 'egrave',
+ '\xC8': 'Egrave',
+ '\xEA': 'ecirc',
+ '\xCA': 'Ecirc',
+ "\u011B": 'ecaron',
+ "\u011A": 'Ecaron',
+ '\xEB': 'euml',
+ '\xCB': 'Euml',
+ "\u0117": 'edot',
+ "\u0116": 'Edot',
+ "\u0119": 'eogon',
+ "\u0118": 'Eogon',
+ "\u0113": 'emacr',
+ "\u0112": 'Emacr',
+ "\uD835\uDD23": 'ffr',
+ "\uD835\uDD57": 'fopf',
+ "\uD835\uDCBB": 'fscr',
+ "\uD835\uDD09": 'Ffr',
+ "\uD835\uDD3D": 'Fopf',
+ "\u2131": 'Fscr',
+ "\uFB00": 'fflig',
+ "\uFB03": 'ffilig',
+ "\uFB04": 'ffllig',
+ "\uFB01": 'filig',
+ 'fj': 'fjlig',
+ "\uFB02": 'fllig',
+ "\u0192": 'fnof',
+ "\u210A": 'gscr',
+ "\uD835\uDD58": 'gopf',
+ "\uD835\uDD24": 'gfr',
+ "\uD835\uDCA2": 'Gscr',
+ "\uD835\uDD3E": 'Gopf',
+ "\uD835\uDD0A": 'Gfr',
+ "\u01F5": 'gacute',
+ "\u011F": 'gbreve',
+ "\u011E": 'Gbreve',
+ "\u011D": 'gcirc',
+ "\u011C": 'Gcirc',
+ "\u0121": 'gdot',
+ "\u0120": 'Gdot',
+ "\u0122": 'Gcedil',
+ "\uD835\uDD25": 'hfr',
+ "\u210E": 'planckh',
+ "\uD835\uDCBD": 'hscr',
+ "\uD835\uDD59": 'hopf',
+ "\u210B": 'Hscr',
+ "\u210C": 'Hfr',
+ "\u210D": 'Hopf',
+ "\u0125": 'hcirc',
+ "\u0124": 'Hcirc',
+ "\u210F": 'hbar',
+ "\u0127": 'hstrok',
+ "\u0126": 'Hstrok',
+ "\uD835\uDD5A": 'iopf',
+ "\uD835\uDD26": 'ifr',
+ "\uD835\uDCBE": 'iscr',
+ "\u2148": 'ii',
+ "\uD835\uDD40": 'Iopf',
+ "\u2110": 'Iscr',
+ "\u2111": 'Im',
+ '\xED': 'iacute',
+ '\xCD': 'Iacute',
+ '\xEC': 'igrave',
+ '\xCC': 'Igrave',
+ '\xEE': 'icirc',
+ '\xCE': 'Icirc',
+ '\xEF': 'iuml',
+ '\xCF': 'Iuml',
+ "\u0129": 'itilde',
+ "\u0128": 'Itilde',
+ "\u0130": 'Idot',
+ "\u012F": 'iogon',
+ "\u012E": 'Iogon',
+ "\u012B": 'imacr',
+ "\u012A": 'Imacr',
+ "\u0133": 'ijlig',
+ "\u0132": 'IJlig',
+ "\u0131": 'imath',
+ "\uD835\uDCBF": 'jscr',
+ "\uD835\uDD5B": 'jopf',
+ "\uD835\uDD27": 'jfr',
+ "\uD835\uDCA5": 'Jscr',
+ "\uD835\uDD0D": 'Jfr',
+ "\uD835\uDD41": 'Jopf',
+ "\u0135": 'jcirc',
+ "\u0134": 'Jcirc',
+ "\u0237": 'jmath',
+ "\uD835\uDD5C": 'kopf',
+ "\uD835\uDCC0": 'kscr',
+ "\uD835\uDD28": 'kfr',
+ "\uD835\uDCA6": 'Kscr',
+ "\uD835\uDD42": 'Kopf',
+ "\uD835\uDD0E": 'Kfr',
+ "\u0137": 'kcedil',
+ "\u0136": 'Kcedil',
+ "\uD835\uDD29": 'lfr',
+ "\uD835\uDCC1": 'lscr',
+ "\u2113": 'ell',
+ "\uD835\uDD5D": 'lopf',
+ "\u2112": 'Lscr',
+ "\uD835\uDD0F": 'Lfr',
+ "\uD835\uDD43": 'Lopf',
+ "\u013A": 'lacute',
+ "\u0139": 'Lacute',
+ "\u013E": 'lcaron',
+ "\u013D": 'Lcaron',
+ "\u013C": 'lcedil',
+ "\u013B": 'Lcedil',
+ "\u0142": 'lstrok',
+ "\u0141": 'Lstrok',
+ "\u0140": 'lmidot',
+ "\u013F": 'Lmidot',
+ "\uD835\uDD2A": 'mfr',
+ "\uD835\uDD5E": 'mopf',
+ "\uD835\uDCC2": 'mscr',
+ "\uD835\uDD10": 'Mfr',
+ "\uD835\uDD44": 'Mopf',
+ "\u2133": 'Mscr',
+ "\uD835\uDD2B": 'nfr',
+ "\uD835\uDD5F": 'nopf',
+ "\uD835\uDCC3": 'nscr',
+ "\u2115": 'Nopf',
+ "\uD835\uDCA9": 'Nscr',
+ "\uD835\uDD11": 'Nfr',
+ "\u0144": 'nacute',
+ "\u0143": 'Nacute',
+ "\u0148": 'ncaron',
+ "\u0147": 'Ncaron',
+ '\xF1': 'ntilde',
+ '\xD1': 'Ntilde',
+ "\u0146": 'ncedil',
+ "\u0145": 'Ncedil',
+ "\u2116": 'numero',
+ "\u014B": 'eng',
+ "\u014A": 'ENG',
+ "\uD835\uDD60": 'oopf',
+ "\uD835\uDD2C": 'ofr',
+ "\u2134": 'oscr',
+ "\uD835\uDCAA": 'Oscr',
+ "\uD835\uDD12": 'Ofr',
+ "\uD835\uDD46": 'Oopf',
+ '\xBA': 'ordm',
+ '\xF3': 'oacute',
+ '\xD3': 'Oacute',
+ '\xF2': 'ograve',
+ '\xD2': 'Ograve',
+ '\xF4': 'ocirc',
+ '\xD4': 'Ocirc',
+ '\xF6': 'ouml',
+ '\xD6': 'Ouml',
+ "\u0151": 'odblac',
+ "\u0150": 'Odblac',
+ '\xF5': 'otilde',
+ '\xD5': 'Otilde',
+ '\xF8': 'oslash',
+ '\xD8': 'Oslash',
+ "\u014D": 'omacr',
+ "\u014C": 'Omacr',
+ "\u0153": 'oelig',
+ "\u0152": 'OElig',
+ "\uD835\uDD2D": 'pfr',
+ "\uD835\uDCC5": 'pscr',
+ "\uD835\uDD61": 'popf',
+ "\u2119": 'Popf',
+ "\uD835\uDD13": 'Pfr',
+ "\uD835\uDCAB": 'Pscr',
+ "\uD835\uDD62": 'qopf',
+ "\uD835\uDD2E": 'qfr',
+ "\uD835\uDCC6": 'qscr',
+ "\uD835\uDCAC": 'Qscr',
+ "\uD835\uDD14": 'Qfr',
+ "\u211A": 'Qopf',
+ "\u0138": 'kgreen',
+ "\uD835\uDD2F": 'rfr',
+ "\uD835\uDD63": 'ropf',
+ "\uD835\uDCC7": 'rscr',
+ "\u211B": 'Rscr',
+ "\u211C": 'Re',
+ "\u211D": 'Ropf',
+ "\u0155": 'racute',
+ "\u0154": 'Racute',
+ "\u0159": 'rcaron',
+ "\u0158": 'Rcaron',
+ "\u0157": 'rcedil',
+ "\u0156": 'Rcedil',
+ "\uD835\uDD64": 'sopf',
+ "\uD835\uDCC8": 'sscr',
+ "\uD835\uDD30": 'sfr',
+ "\uD835\uDD4A": 'Sopf',
+ "\uD835\uDD16": 'Sfr',
+ "\uD835\uDCAE": 'Sscr',
+ "\u24C8": 'oS',
+ "\u015B": 'sacute',
+ "\u015A": 'Sacute',
+ "\u015D": 'scirc',
+ "\u015C": 'Scirc',
+ "\u0161": 'scaron',
+ "\u0160": 'Scaron',
+ "\u015F": 'scedil',
+ "\u015E": 'Scedil',
+ '\xDF': 'szlig',
+ "\uD835\uDD31": 'tfr',
+ "\uD835\uDCC9": 'tscr',
+ "\uD835\uDD65": 'topf',
+ "\uD835\uDCAF": 'Tscr',
+ "\uD835\uDD17": 'Tfr',
+ "\uD835\uDD4B": 'Topf',
+ "\u0165": 'tcaron',
+ "\u0164": 'Tcaron',
+ "\u0163": 'tcedil',
+ "\u0162": 'Tcedil',
+ "\u2122": 'trade',
+ "\u0167": 'tstrok',
+ "\u0166": 'Tstrok',
+ "\uD835\uDCCA": 'uscr',
+ "\uD835\uDD66": 'uopf',
+ "\uD835\uDD32": 'ufr',
+ "\uD835\uDD4C": 'Uopf',
+ "\uD835\uDD18": 'Ufr',
+ "\uD835\uDCB0": 'Uscr',
+ '\xFA': 'uacute',
+ '\xDA': 'Uacute',
+ '\xF9': 'ugrave',
+ '\xD9': 'Ugrave',
+ "\u016D": 'ubreve',
+ "\u016C": 'Ubreve',
+ '\xFB': 'ucirc',
+ '\xDB': 'Ucirc',
+ "\u016F": 'uring',
+ "\u016E": 'Uring',
+ '\xFC': 'uuml',
+ '\xDC': 'Uuml',
+ "\u0171": 'udblac',
+ "\u0170": 'Udblac',
+ "\u0169": 'utilde',
+ "\u0168": 'Utilde',
+ "\u0173": 'uogon',
+ "\u0172": 'Uogon',
+ "\u016B": 'umacr',
+ "\u016A": 'Umacr',
+ "\uD835\uDD33": 'vfr',
+ "\uD835\uDD67": 'vopf',
+ "\uD835\uDCCB": 'vscr',
+ "\uD835\uDD19": 'Vfr',
+ "\uD835\uDD4D": 'Vopf',
+ "\uD835\uDCB1": 'Vscr',
+ "\uD835\uDD68": 'wopf',
+ "\uD835\uDCCC": 'wscr',
+ "\uD835\uDD34": 'wfr',
+ "\uD835\uDCB2": 'Wscr',
+ "\uD835\uDD4E": 'Wopf',
+ "\uD835\uDD1A": 'Wfr',
+ "\u0175": 'wcirc',
+ "\u0174": 'Wcirc',
+ "\uD835\uDD35": 'xfr',
+ "\uD835\uDCCD": 'xscr',
+ "\uD835\uDD69": 'xopf',
+ "\uD835\uDD4F": 'Xopf',
+ "\uD835\uDD1B": 'Xfr',
+ "\uD835\uDCB3": 'Xscr',
+ "\uD835\uDD36": 'yfr',
+ "\uD835\uDCCE": 'yscr',
+ "\uD835\uDD6A": 'yopf',
+ "\uD835\uDCB4": 'Yscr',
+ "\uD835\uDD1C": 'Yfr',
+ "\uD835\uDD50": 'Yopf',
+ '\xFD': 'yacute',
+ '\xDD': 'Yacute',
+ "\u0177": 'ycirc',
+ "\u0176": 'Ycirc',
+ '\xFF': 'yuml',
+ "\u0178": 'Yuml',
+ "\uD835\uDCCF": 'zscr',
+ "\uD835\uDD37": 'zfr',
+ "\uD835\uDD6B": 'zopf',
+ "\u2128": 'Zfr',
+ "\u2124": 'Zopf',
+ "\uD835\uDCB5": 'Zscr',
+ "\u017A": 'zacute',
+ "\u0179": 'Zacute',
+ "\u017E": 'zcaron',
+ "\u017D": 'Zcaron',
+ "\u017C": 'zdot',
+ "\u017B": 'Zdot',
+ "\u01B5": 'imped',
+ '\xFE': 'thorn',
+ '\xDE': 'THORN',
+ "\u0149": 'napos',
+ "\u03B1": 'alpha',
+ "\u0391": 'Alpha',
+ "\u03B2": 'beta',
+ "\u0392": 'Beta',
+ "\u03B3": 'gamma',
+ "\u0393": 'Gamma',
+ "\u03B4": 'delta',
+ "\u0394": 'Delta',
+ "\u03B5": 'epsi',
+ "\u03F5": 'epsiv',
+ "\u0395": 'Epsilon',
+ "\u03DD": 'gammad',
+ "\u03DC": 'Gammad',
+ "\u03B6": 'zeta',
+ "\u0396": 'Zeta',
+ "\u03B7": 'eta',
+ "\u0397": 'Eta',
+ "\u03B8": 'theta',
+ "\u03D1": 'thetav',
+ "\u0398": 'Theta',
+ "\u03B9": 'iota',
+ "\u0399": 'Iota',
+ "\u03BA": 'kappa',
+ "\u03F0": 'kappav',
+ "\u039A": 'Kappa',
+ "\u03BB": 'lambda',
+ "\u039B": 'Lambda',
+ "\u03BC": 'mu',
+ '\xB5': 'micro',
+ "\u039C": 'Mu',
+ "\u03BD": 'nu',
+ "\u039D": 'Nu',
+ "\u03BE": 'xi',
+ "\u039E": 'Xi',
+ "\u03BF": 'omicron',
+ "\u039F": 'Omicron',
+ "\u03C0": 'pi',
+ "\u03D6": 'piv',
+ "\u03A0": 'Pi',
+ "\u03C1": 'rho',
+ "\u03F1": 'rhov',
+ "\u03A1": 'Rho',
+ "\u03C3": 'sigma',
+ "\u03A3": 'Sigma',
+ "\u03C2": 'sigmaf',
+ "\u03C4": 'tau',
+ "\u03A4": 'Tau',
+ "\u03C5": 'upsi',
+ "\u03A5": 'Upsilon',
+ "\u03D2": 'Upsi',
+ "\u03C6": 'phi',
+ "\u03D5": 'phiv',
+ "\u03A6": 'Phi',
+ "\u03C7": 'chi',
+ "\u03A7": 'Chi',
+ "\u03C8": 'psi',
+ "\u03A8": 'Psi',
+ "\u03C9": 'omega',
+ "\u03A9": 'ohm',
+ "\u0430": 'acy',
+ "\u0410": 'Acy',
+ "\u0431": 'bcy',
+ "\u0411": 'Bcy',
+ "\u0432": 'vcy',
+ "\u0412": 'Vcy',
+ "\u0433": 'gcy',
+ "\u0413": 'Gcy',
+ "\u0453": 'gjcy',
+ "\u0403": 'GJcy',
+ "\u0434": 'dcy',
+ "\u0414": 'Dcy',
+ "\u0452": 'djcy',
+ "\u0402": 'DJcy',
+ "\u0435": 'iecy',
+ "\u0415": 'IEcy',
+ "\u0451": 'iocy',
+ "\u0401": 'IOcy',
+ "\u0454": 'jukcy',
+ "\u0404": 'Jukcy',
+ "\u0436": 'zhcy',
+ "\u0416": 'ZHcy',
+ "\u0437": 'zcy',
+ "\u0417": 'Zcy',
+ "\u0455": 'dscy',
+ "\u0405": 'DScy',
+ "\u0438": 'icy',
+ "\u0418": 'Icy',
+ "\u0456": 'iukcy',
+ "\u0406": 'Iukcy',
+ "\u0457": 'yicy',
+ "\u0407": 'YIcy',
+ "\u0439": 'jcy',
+ "\u0419": 'Jcy',
+ "\u0458": 'jsercy',
+ "\u0408": 'Jsercy',
+ "\u043A": 'kcy',
+ "\u041A": 'Kcy',
+ "\u045C": 'kjcy',
+ "\u040C": 'KJcy',
+ "\u043B": 'lcy',
+ "\u041B": 'Lcy',
+ "\u0459": 'ljcy',
+ "\u0409": 'LJcy',
+ "\u043C": 'mcy',
+ "\u041C": 'Mcy',
+ "\u043D": 'ncy',
+ "\u041D": 'Ncy',
+ "\u045A": 'njcy',
+ "\u040A": 'NJcy',
+ "\u043E": 'ocy',
+ "\u041E": 'Ocy',
+ "\u043F": 'pcy',
+ "\u041F": 'Pcy',
+ "\u0440": 'rcy',
+ "\u0420": 'Rcy',
+ "\u0441": 'scy',
+ "\u0421": 'Scy',
+ "\u0442": 'tcy',
+ "\u0422": 'Tcy',
+ "\u045B": 'tshcy',
+ "\u040B": 'TSHcy',
+ "\u0443": 'ucy',
+ "\u0423": 'Ucy',
+ "\u045E": 'ubrcy',
+ "\u040E": 'Ubrcy',
+ "\u0444": 'fcy',
+ "\u0424": 'Fcy',
+ "\u0445": 'khcy',
+ "\u0425": 'KHcy',
+ "\u0446": 'tscy',
+ "\u0426": 'TScy',
+ "\u0447": 'chcy',
+ "\u0427": 'CHcy',
+ "\u045F": 'dzcy',
+ "\u040F": 'DZcy',
+ "\u0448": 'shcy',
+ "\u0428": 'SHcy',
+ "\u0449": 'shchcy',
+ "\u0429": 'SHCHcy',
+ "\u044A": 'hardcy',
+ "\u042A": 'HARDcy',
+ "\u044B": 'ycy',
+ "\u042B": 'Ycy',
+ "\u044C": 'softcy',
+ "\u042C": 'SOFTcy',
+ "\u044D": 'ecy',
+ "\u042D": 'Ecy',
+ "\u044E": 'yucy',
+ "\u042E": 'YUcy',
+ "\u044F": 'yacy',
+ "\u042F": 'YAcy',
+ "\u2135": 'aleph',
+ "\u2136": 'beth',
+ "\u2137": 'gimel',
+ "\u2138": 'daleth'
+ };
+ var regexEscape = /["&'<>`]/g;
+ var escapeMap = {
+ '"': '"',
+ '&': '&',
+ '\'': ''',
+ '<': '<',
+ // See https://mathiasbynens.be/notes/ambiguous-ampersands: in HTML, the
+ // following is not strictly necessary unless it’s part of a tag or an
+ // unquoted attribute value. We’re only escaping it to support those
+ // situations, and for XML support.
+ '>': '>',
+ // In Internet Explorer ≤ 8, the backtick character can be used
+ // to break out of (un)quoted attribute values or HTML comments.
+ // See http://html5sec.org/#102, http://html5sec.org/#108, and
+ // http://html5sec.org/#133.
+ '`': '`'
+ };
+ var regexInvalidEntity = /(?:[xX][^a-fA-F0-9]|[^0-9xX])/;
+ var regexInvalidRawCodePoint = /[\0-\x08\x0B\x0E-\x1F\x7F-\x9F\uFDD0-\uFDEF\uFFFE\uFFFF]|[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
+ var regexDecode = /&(CounterClockwiseContourIntegral|DoubleLongLeftRightArrow|ClockwiseContourIntegral|NotNestedGreaterGreater|NotSquareSupersetEqual|DiacriticalDoubleAcute|NotRightTriangleEqual|NotSucceedsSlantEqual|NotPrecedesSlantEqual|CloseCurlyDoubleQuote|NegativeVeryThinSpace|DoubleContourIntegral|FilledVerySmallSquare|CapitalDifferentialD|OpenCurlyDoubleQuote|EmptyVerySmallSquare|NestedGreaterGreater|DoubleLongRightArrow|NotLeftTriangleEqual|NotGreaterSlantEqual|ReverseUpEquilibrium|DoubleLeftRightArrow|NotSquareSubsetEqual|NotDoubleVerticalBar|RightArrowLeftArrow|NotGreaterFullEqual|NotRightTriangleBar|SquareSupersetEqual|DownLeftRightVector|DoubleLongLeftArrow|leftrightsquigarrow|LeftArrowRightArrow|NegativeMediumSpace|blacktriangleright|RightDownVectorBar|PrecedesSlantEqual|RightDoubleBracket|SucceedsSlantEqual|NotLeftTriangleBar|RightTriangleEqual|SquareIntersection|RightDownTeeVector|ReverseEquilibrium|NegativeThickSpace|longleftrightarrow|Longleftrightarrow|LongLeftRightArrow|DownRightTeeVector|DownRightVectorBar|GreaterSlantEqual|SquareSubsetEqual|LeftDownVectorBar|LeftDoubleBracket|VerticalSeparator|rightleftharpoons|NotGreaterGreater|NotSquareSuperset|blacktriangleleft|blacktriangledown|NegativeThinSpace|LeftDownTeeVector|NotLessSlantEqual|leftrightharpoons|DoubleUpDownArrow|DoubleVerticalBar|LeftTriangleEqual|FilledSmallSquare|twoheadrightarrow|NotNestedLessLess|DownLeftTeeVector|DownLeftVectorBar|RightAngleBracket|NotTildeFullEqual|NotReverseElement|RightUpDownVector|DiacriticalTilde|NotSucceedsTilde|circlearrowright|NotPrecedesEqual|rightharpoondown|DoubleRightArrow|NotSucceedsEqual|NonBreakingSpace|NotRightTriangle|LessEqualGreater|RightUpTeeVector|LeftAngleBracket|GreaterFullEqual|DownArrowUpArrow|RightUpVectorBar|twoheadleftarrow|GreaterEqualLess|downharpoonright|RightTriangleBar|ntrianglerighteq|NotSupersetEqual|LeftUpDownVector|DiacriticalAcute|rightrightarrows|vartriangleright|UpArrowDownArrow|DiacriticalGrave|UnderParenthesis|EmptySmallSquare|LeftUpVectorBar|leftrightarrows|DownRightVector|downharpoonleft|trianglerighteq|ShortRightArrow|OverParenthesis|DoubleLeftArrow|DoubleDownArrow|NotSquareSubset|bigtriangledown|ntrianglelefteq|UpperRightArrow|curvearrowright|vartriangleleft|NotLeftTriangle|nleftrightarrow|LowerRightArrow|NotHumpDownHump|NotGreaterTilde|rightthreetimes|LeftUpTeeVector|NotGreaterEqual|straightepsilon|LeftTriangleBar|rightsquigarrow|ContourIntegral|rightleftarrows|CloseCurlyQuote|RightDownVector|LeftRightVector|nLeftrightarrow|leftharpoondown|circlearrowleft|SquareSuperset|OpenCurlyQuote|hookrightarrow|HorizontalLine|DiacriticalDot|NotLessGreater|ntriangleright|DoubleRightTee|InvisibleComma|InvisibleTimes|LowerLeftArrow|DownLeftVector|NotSubsetEqual|curvearrowleft|trianglelefteq|NotVerticalBar|TildeFullEqual|downdownarrows|NotGreaterLess|RightTeeVector|ZeroWidthSpace|looparrowright|LongRightArrow|doublebarwedge|ShortLeftArrow|ShortDownArrow|RightVectorBar|GreaterGreater|ReverseElement|rightharpoonup|LessSlantEqual|leftthreetimes|upharpoonright|rightarrowtail|LeftDownVector|Longrightarrow|NestedLessLess|UpperLeftArrow|nshortparallel|leftleftarrows|leftrightarrow|Leftrightarrow|LeftRightArrow|longrightarrow|upharpoonleft|RightArrowBar|ApplyFunction|LeftTeeVector|leftarrowtail|NotEqualTilde|varsubsetneqq|varsupsetneqq|RightTeeArrow|SucceedsEqual|SucceedsTilde|LeftVectorBar|SupersetEqual|hookleftarrow|DifferentialD|VerticalTilde|VeryThinSpace|blacktriangle|bigtriangleup|LessFullEqual|divideontimes|leftharpoonup|UpEquilibrium|ntriangleleft|RightTriangle|measuredangle|shortparallel|longleftarrow|Longleftarrow|LongLeftArrow|DoubleLeftTee|Poincareplane|PrecedesEqual|triangleright|DoubleUpArrow|RightUpVector|fallingdotseq|looparrowleft|PrecedesTilde|NotTildeEqual|NotTildeTilde|smallsetminus|Proportional|triangleleft|triangledown|UnderBracket|NotHumpEqual|exponentiale|ExponentialE|NotLessTilde|HilbertSpace|RightCeiling|blacklozenge|varsupsetneq|HumpDownHump|GreaterEqual|VerticalLine|LeftTeeArrow|NotLessEqual|DownTeeArrow|LeftTriangle|varsubsetneq|Intersection|NotCongruent|DownArrowBar|LeftUpVector|LeftArrowBar|risingdotseq|GreaterTilde|RoundImplies|SquareSubset|ShortUpArrow|NotSuperset|quaternions|precnapprox|backepsilon|preccurlyeq|OverBracket|blacksquare|MediumSpace|VerticalBar|circledcirc|circleddash|CircleMinus|CircleTimes|LessGreater|curlyeqprec|curlyeqsucc|diamondsuit|UpDownArrow|Updownarrow|RuleDelayed|Rrightarrow|updownarrow|RightVector|nRightarrow|nrightarrow|eqslantless|LeftCeiling|Equilibrium|SmallCircle|expectation|NotSucceeds|thickapprox|GreaterLess|SquareUnion|NotPrecedes|NotLessLess|straightphi|succnapprox|succcurlyeq|SubsetEqual|sqsupseteq|Proportion|Laplacetrf|ImaginaryI|supsetneqq|NotGreater|gtreqqless|NotElement|ThickSpace|TildeEqual|TildeTilde|Fouriertrf|rmoustache|EqualTilde|eqslantgtr|UnderBrace|LeftVector|UpArrowBar|nLeftarrow|nsubseteqq|subsetneqq|nsupseteqq|nleftarrow|succapprox|lessapprox|UpTeeArrow|upuparrows|curlywedge|lesseqqgtr|varepsilon|varnothing|RightFloor|complement|CirclePlus|sqsubseteq|Lleftarrow|circledast|RightArrow|Rightarrow|rightarrow|lmoustache|Bernoullis|precapprox|mapstoleft|mapstodown|longmapsto|dotsquare|downarrow|DoubleDot|nsubseteq|supsetneq|leftarrow|nsupseteq|subsetneq|ThinSpace|ngeqslant|subseteqq|HumpEqual|NotSubset|triangleq|NotCupCap|lesseqgtr|heartsuit|TripleDot|Leftarrow|Coproduct|Congruent|varpropto|complexes|gvertneqq|LeftArrow|LessTilde|supseteqq|MinusPlus|CircleDot|nleqslant|NotExists|gtreqless|nparallel|UnionPlus|LeftFloor|checkmark|CenterDot|centerdot|Mellintrf|gtrapprox|bigotimes|OverBrace|spadesuit|therefore|pitchfork|rationals|PlusMinus|Backslash|Therefore|DownBreve|backsimeq|backprime|DownArrow|nshortmid|Downarrow|lvertneqq|eqvparsl|imagline|imagpart|infintie|integers|Integral|intercal|LessLess|Uarrocir|intlarhk|sqsupset|angmsdaf|sqsubset|llcorner|vartheta|cupbrcap|lnapprox|Superset|SuchThat|succnsim|succneqq|angmsdag|biguplus|curlyvee|trpezium|Succeeds|NotTilde|bigwedge|angmsdah|angrtvbd|triminus|cwconint|fpartint|lrcorner|smeparsl|subseteq|urcorner|lurdshar|laemptyv|DDotrahd|approxeq|ldrushar|awconint|mapstoup|backcong|shortmid|triangle|geqslant|gesdotol|timesbar|circledR|circledS|setminus|multimap|naturals|scpolint|ncongdot|RightTee|boxminus|gnapprox|boxtimes|andslope|thicksim|angmsdaa|varsigma|cirfnint|rtriltri|angmsdab|rppolint|angmsdac|barwedge|drbkarow|clubsuit|thetasym|bsolhsub|capbrcup|dzigrarr|doteqdot|DotEqual|dotminus|UnderBar|NotEqual|realpart|otimesas|ulcorner|hksearow|hkswarow|parallel|PartialD|elinters|emptyset|plusacir|bbrktbrk|angmsdad|pointint|bigoplus|angmsdae|Precedes|bigsqcup|varkappa|notindot|supseteq|precneqq|precnsim|profalar|profline|profsurf|leqslant|lesdotor|raemptyv|subplus|notnivb|notnivc|subrarr|zigrarr|vzigzag|submult|subedot|Element|between|cirscir|larrbfs|larrsim|lotimes|lbrksld|lbrkslu|lozenge|ldrdhar|dbkarow|bigcirc|epsilon|simrarr|simplus|ltquest|Epsilon|luruhar|gtquest|maltese|npolint|eqcolon|npreceq|bigodot|ddagger|gtrless|bnequiv|harrcir|ddotseq|equivDD|backsim|demptyv|nsqsube|nsqsupe|Upsilon|nsubset|upsilon|minusdu|nsucceq|swarrow|nsupset|coloneq|searrow|boxplus|napprox|natural|asympeq|alefsym|congdot|nearrow|bigstar|diamond|supplus|tritime|LeftTee|nvinfin|triplus|NewLine|nvltrie|nvrtrie|nwarrow|nexists|Diamond|ruluhar|Implies|supmult|angzarr|suplarr|suphsub|questeq|because|digamma|Because|olcross|bemptyv|omicron|Omicron|rotimes|NoBreak|intprod|angrtvb|orderof|uwangle|suphsol|lesdoto|orslope|DownTee|realine|cudarrl|rdldhar|OverBar|supedot|lessdot|supdsub|topfork|succsim|rbrkslu|rbrksld|pertenk|cudarrr|isindot|planckh|lessgtr|pluscir|gesdoto|plussim|plustwo|lesssim|cularrp|rarrsim|Cayleys|notinva|notinvb|notinvc|UpArrow|Uparrow|uparrow|NotLess|dwangle|precsim|Product|curarrm|Cconint|dotplus|rarrbfs|ccupssm|Cedilla|cemptyv|notniva|quatint|frac35|frac38|frac45|frac56|frac58|frac78|tridot|xoplus|gacute|gammad|Gammad|lfisht|lfloor|bigcup|sqsupe|gbreve|Gbreve|lharul|sqsube|sqcups|Gcedil|apacir|llhard|lmidot|Lmidot|lmoust|andand|sqcaps|approx|Abreve|spades|circeq|tprime|divide|topcir|Assign|topbot|gesdot|divonx|xuplus|timesd|gesles|atilde|solbar|SOFTcy|loplus|timesb|lowast|lowbar|dlcorn|dlcrop|softcy|dollar|lparlt|thksim|lrhard|Atilde|lsaquo|smashp|bigvee|thinsp|wreath|bkarow|lsquor|lstrok|Lstrok|lthree|ltimes|ltlarr|DotDot|simdot|ltrPar|weierp|xsqcup|angmsd|sigmav|sigmaf|zeetrf|Zcaron|zcaron|mapsto|vsupne|thetav|cirmid|marker|mcomma|Zacute|vsubnE|there4|gtlPar|vsubne|bottom|gtrarr|SHCHcy|shchcy|midast|midcir|middot|minusb|minusd|gtrdot|bowtie|sfrown|mnplus|models|colone|seswar|Colone|mstpos|searhk|gtrsim|nacute|Nacute|boxbox|telrec|hairsp|Tcedil|nbumpe|scnsim|ncaron|Ncaron|ncedil|Ncedil|hamilt|Scedil|nearhk|hardcy|HARDcy|tcedil|Tcaron|commat|nequiv|nesear|tcaron|target|hearts|nexist|varrho|scedil|Scaron|scaron|hellip|Sacute|sacute|hercon|swnwar|compfn|rtimes|rthree|rsquor|rsaquo|zacute|wedgeq|homtht|barvee|barwed|Barwed|rpargt|horbar|conint|swarhk|roplus|nltrie|hslash|hstrok|Hstrok|rmoust|Conint|bprime|hybull|hyphen|iacute|Iacute|supsup|supsub|supsim|varphi|coprod|brvbar|agrave|Supset|supset|igrave|Igrave|notinE|Agrave|iiiint|iinfin|copysr|wedbar|Verbar|vangrt|becaus|incare|verbar|inodot|bullet|drcorn|intcal|drcrop|cularr|vellip|Utilde|bumpeq|cupcap|dstrok|Dstrok|CupCap|cupcup|cupdot|eacute|Eacute|supdot|iquest|easter|ecaron|Ecaron|ecolon|isinsv|utilde|itilde|Itilde|curarr|succeq|Bumpeq|cacute|ulcrop|nparsl|Cacute|nprcue|egrave|Egrave|nrarrc|nrarrw|subsup|subsub|nrtrie|jsercy|nsccue|Jsercy|kappav|kcedil|Kcedil|subsim|ulcorn|nsimeq|egsdot|veebar|kgreen|capand|elsdot|Subset|subset|curren|aacute|lacute|Lacute|emptyv|ntilde|Ntilde|lagran|lambda|Lambda|capcap|Ugrave|langle|subdot|emsp13|numero|emsp14|nvdash|nvDash|nVdash|nVDash|ugrave|ufisht|nvHarr|larrfs|nvlArr|larrhk|larrlp|larrpl|nvrArr|Udblac|nwarhk|larrtl|nwnear|oacute|Oacute|latail|lAtail|sstarf|lbrace|odblac|Odblac|lbrack|udblac|odsold|eparsl|lcaron|Lcaron|ograve|Ograve|lcedil|Lcedil|Aacute|ssmile|ssetmn|squarf|ldquor|capcup|ominus|cylcty|rharul|eqcirc|dagger|rfloor|rfisht|Dagger|daleth|equals|origof|capdot|equest|dcaron|Dcaron|rdquor|oslash|Oslash|otilde|Otilde|otimes|Otimes|urcrop|Ubreve|ubreve|Yacute|Uacute|uacute|Rcedil|rcedil|urcorn|parsim|Rcaron|Vdashl|rcaron|Tstrok|percnt|period|permil|Exists|yacute|rbrack|rbrace|phmmat|ccaron|Ccaron|planck|ccedil|plankv|tstrok|female|plusdo|plusdu|ffilig|plusmn|ffllig|Ccedil|rAtail|dfisht|bernou|ratail|Rarrtl|rarrtl|angsph|rarrpl|rarrlp|rarrhk|xwedge|xotime|forall|ForAll|Vvdash|vsupnE|preceq|bigcap|frac12|frac13|frac14|primes|rarrfs|prnsim|frac15|Square|frac16|square|lesdot|frac18|frac23|propto|prurel|rarrap|rangle|puncsp|frac25|Racute|qprime|racute|lesges|frac34|abreve|AElig|eqsim|utdot|setmn|urtri|Equal|Uring|seArr|uring|searr|dashv|Dashv|mumap|nabla|iogon|Iogon|sdote|sdotb|scsim|napid|napos|equiv|natur|Acirc|dblac|erarr|nbump|iprod|erDot|ucirc|awint|esdot|angrt|ncong|isinE|scnap|Scirc|scirc|ndash|isins|Ubrcy|nearr|neArr|isinv|nedot|ubrcy|acute|Ycirc|iukcy|Iukcy|xutri|nesim|caret|jcirc|Jcirc|caron|twixt|ddarr|sccue|exist|jmath|sbquo|ngeqq|angst|ccaps|lceil|ngsim|UpTee|delta|Delta|rtrif|nharr|nhArr|nhpar|rtrie|jukcy|Jukcy|kappa|rsquo|Kappa|nlarr|nlArr|TSHcy|rrarr|aogon|Aogon|fflig|xrarr|tshcy|ccirc|nleqq|filig|upsih|nless|dharl|nlsim|fjlig|ropar|nltri|dharr|robrk|roarr|fllig|fltns|roang|rnmid|subnE|subne|lAarr|trisb|Ccirc|acirc|ccups|blank|VDash|forkv|Vdash|langd|cedil|blk12|blk14|laquo|strns|diams|notin|vDash|larrb|blk34|block|disin|uplus|vdash|vBarv|aelig|starf|Wedge|check|xrArr|lates|lbarr|lBarr|notni|lbbrk|bcong|frasl|lbrke|frown|vrtri|vprop|vnsup|gamma|Gamma|wedge|xodot|bdquo|srarr|doteq|ldquo|boxdl|boxdL|gcirc|Gcirc|boxDl|boxDL|boxdr|boxdR|boxDr|TRADE|trade|rlhar|boxDR|vnsub|npart|vltri|rlarr|boxhd|boxhD|nprec|gescc|nrarr|nrArr|boxHd|boxHD|boxhu|boxhU|nrtri|boxHu|clubs|boxHU|times|colon|Colon|gimel|xlArr|Tilde|nsime|tilde|nsmid|nspar|THORN|thorn|xlarr|nsube|nsubE|thkap|xhArr|comma|nsucc|boxul|boxuL|nsupe|nsupE|gneqq|gnsim|boxUl|boxUL|grave|boxur|boxuR|boxUr|boxUR|lescc|angle|bepsi|boxvh|varpi|boxvH|numsp|Theta|gsime|gsiml|theta|boxVh|boxVH|boxvl|gtcir|gtdot|boxvL|boxVl|boxVL|crarr|cross|Cross|nvsim|boxvr|nwarr|nwArr|sqsup|dtdot|Uogon|lhard|lharu|dtrif|ocirc|Ocirc|lhblk|duarr|odash|sqsub|Hacek|sqcup|llarr|duhar|oelig|OElig|ofcir|boxvR|uogon|lltri|boxVr|csube|uuarr|ohbar|csupe|ctdot|olarr|olcir|harrw|oline|sqcap|omacr|Omacr|omega|Omega|boxVR|aleph|lneqq|lnsim|loang|loarr|rharu|lobrk|hcirc|operp|oplus|rhard|Hcirc|orarr|Union|order|ecirc|Ecirc|cuepr|szlig|cuesc|breve|reals|eDDot|Breve|hoarr|lopar|utrif|rdquo|Umacr|umacr|efDot|swArr|ultri|alpha|rceil|ovbar|swarr|Wcirc|wcirc|smtes|smile|bsemi|lrarr|aring|parsl|lrhar|bsime|uhblk|lrtri|cupor|Aring|uharr|uharl|slarr|rbrke|bsolb|lsime|rbbrk|RBarr|lsimg|phone|rBarr|rbarr|icirc|lsquo|Icirc|emacr|Emacr|ratio|simne|plusb|simlE|simgE|simeq|pluse|ltcir|ltdot|empty|xharr|xdtri|iexcl|Alpha|ltrie|rarrw|pound|ltrif|xcirc|bumpe|prcue|bumpE|asymp|amacr|cuvee|Sigma|sigma|iiint|udhar|iiota|ijlig|IJlig|supnE|imacr|Imacr|prime|Prime|image|prnap|eogon|Eogon|rarrc|mdash|mDDot|cuwed|imath|supne|imped|Amacr|udarr|prsim|micro|rarrb|cwint|raquo|infin|eplus|range|rangd|Ucirc|radic|minus|amalg|veeeq|rAarr|epsiv|ycirc|quest|sharp|quot|zwnj|Qscr|race|qscr|Qopf|qopf|qint|rang|Rang|Zscr|zscr|Zopf|zopf|rarr|rArr|Rarr|Pscr|pscr|prop|prod|prnE|prec|ZHcy|zhcy|prap|Zeta|zeta|Popf|popf|Zdot|plus|zdot|Yuml|yuml|phiv|YUcy|yucy|Yscr|yscr|perp|Yopf|yopf|part|para|YIcy|Ouml|rcub|yicy|YAcy|rdca|ouml|osol|Oscr|rdsh|yacy|real|oscr|xvee|andd|rect|andv|Xscr|oror|ordm|ordf|xscr|ange|aopf|Aopf|rHar|Xopf|opar|Oopf|xopf|xnis|rhov|oopf|omid|xmap|oint|apid|apos|ogon|ascr|Ascr|odot|odiv|xcup|xcap|ocir|oast|nvlt|nvle|nvgt|nvge|nvap|Wscr|wscr|auml|ntlg|ntgl|nsup|nsub|nsim|Nscr|nscr|nsce|Wopf|ring|npre|wopf|npar|Auml|Barv|bbrk|Nopf|nopf|nmid|nLtv|beta|ropf|Ropf|Beta|beth|nles|rpar|nleq|bnot|bNot|nldr|NJcy|rscr|Rscr|Vscr|vscr|rsqb|njcy|bopf|nisd|Bopf|rtri|Vopf|nGtv|ngtr|vopf|boxh|boxH|boxv|nges|ngeq|boxV|bscr|scap|Bscr|bsim|Vert|vert|bsol|bull|bump|caps|cdot|ncup|scnE|ncap|nbsp|napE|Cdot|cent|sdot|Vbar|nang|vBar|chcy|Mscr|mscr|sect|semi|CHcy|Mopf|mopf|sext|circ|cire|mldr|mlcp|cirE|comp|shcy|SHcy|vArr|varr|cong|copf|Copf|copy|COPY|malt|male|macr|lvnE|cscr|ltri|sime|ltcc|simg|Cscr|siml|csub|Uuml|lsqb|lsim|uuml|csup|Lscr|lscr|utri|smid|lpar|cups|smte|lozf|darr|Lopf|Uscr|solb|lopf|sopf|Sopf|lneq|uscr|spar|dArr|lnap|Darr|dash|Sqrt|LJcy|ljcy|lHar|dHar|Upsi|upsi|diam|lesg|djcy|DJcy|leqq|dopf|Dopf|dscr|Dscr|dscy|ldsh|ldca|squf|DScy|sscr|Sscr|dsol|lcub|late|star|Star|Uopf|Larr|lArr|larr|uopf|dtri|dzcy|sube|subE|Lang|lang|Kscr|kscr|Kopf|kopf|KJcy|kjcy|KHcy|khcy|DZcy|ecir|edot|eDot|Jscr|jscr|succ|Jopf|jopf|Edot|uHar|emsp|ensp|Iuml|iuml|eopf|isin|Iscr|iscr|Eopf|epar|sung|epsi|escr|sup1|sup2|sup3|Iota|iota|supe|supE|Iopf|iopf|IOcy|iocy|Escr|esim|Esim|imof|Uarr|QUOT|uArr|uarr|euml|IEcy|iecy|Idot|Euml|euro|excl|Hscr|hscr|Hopf|hopf|TScy|tscy|Tscr|hbar|tscr|flat|tbrk|fnof|hArr|harr|half|fopf|Fopf|tdot|gvnE|fork|trie|gtcc|fscr|Fscr|gdot|gsim|Gscr|gscr|Gopf|gopf|gneq|Gdot|tosa|gnap|Topf|topf|geqq|toea|GJcy|gjcy|tint|gesl|mid|Sfr|ggg|top|ges|gla|glE|glj|geq|gne|gEl|gel|gnE|Gcy|gcy|gap|Tfr|tfr|Tcy|tcy|Hat|Tau|Ffr|tau|Tab|hfr|Hfr|ffr|Fcy|fcy|icy|Icy|iff|ETH|eth|ifr|Ifr|Eta|eta|int|Int|Sup|sup|ucy|Ucy|Sum|sum|jcy|ENG|ufr|Ufr|eng|Jcy|jfr|els|ell|egs|Efr|efr|Jfr|uml|kcy|Kcy|Ecy|ecy|kfr|Kfr|lap|Sub|sub|lat|lcy|Lcy|leg|Dot|dot|lEg|leq|les|squ|div|die|lfr|Lfr|lgE|Dfr|dfr|Del|deg|Dcy|dcy|lne|lnE|sol|loz|smt|Cup|lrm|cup|lsh|Lsh|sim|shy|map|Map|mcy|Mcy|mfr|Mfr|mho|gfr|Gfr|sfr|cir|Chi|chi|nap|Cfr|vcy|Vcy|cfr|Scy|scy|ncy|Ncy|vee|Vee|Cap|cap|nfr|scE|sce|Nfr|nge|ngE|nGg|vfr|Vfr|ngt|bot|nGt|nis|niv|Rsh|rsh|nle|nlE|bne|Bfr|bfr|nLl|nlt|nLt|Bcy|bcy|not|Not|rlm|wfr|Wfr|npr|nsc|num|ocy|ast|Ocy|ofr|xfr|Xfr|Ofr|ogt|ohm|apE|olt|Rho|ape|rho|Rfr|rfr|ord|REG|ang|reg|orv|And|and|AMP|Rcy|amp|Afr|ycy|Ycy|yen|yfr|Yfr|rcy|par|pcy|Pcy|pfr|Pfr|phi|Phi|afr|Acy|acy|zcy|Zcy|piv|acE|acd|zfr|Zfr|pre|prE|psi|Psi|qfr|Qfr|zwj|Or|ge|Gg|gt|gg|el|oS|lt|Lt|LT|Re|lg|gl|eg|ne|Im|it|le|DD|wp|wr|nu|Nu|dd|lE|Sc|sc|pi|Pi|ee|af|ll|Ll|rx|gE|xi|pm|Xi|ic|pr|Pr|in|ni|mp|mu|ac|Mu|or|ap|Gt|GT|ii);|&(Aacute|Agrave|Atilde|Ccedil|Eacute|Egrave|Iacute|Igrave|Ntilde|Oacute|Ograve|Oslash|Otilde|Uacute|Ugrave|Yacute|aacute|agrave|atilde|brvbar|ccedil|curren|divide|eacute|egrave|frac12|frac14|frac34|iacute|igrave|iquest|middot|ntilde|oacute|ograve|oslash|otilde|plusmn|uacute|ugrave|yacute|AElig|Acirc|Aring|Ecirc|Icirc|Ocirc|THORN|Ucirc|acirc|acute|aelig|aring|cedil|ecirc|icirc|iexcl|laquo|micro|ocirc|pound|raquo|szlig|thorn|times|ucirc|Auml|COPY|Euml|Iuml|Ouml|QUOT|Uuml|auml|cent|copy|euml|iuml|macr|nbsp|ordf|ordm|ouml|para|quot|sect|sup1|sup2|sup3|uuml|yuml|AMP|ETH|REG|amp|deg|eth|not|reg|shy|uml|yen|GT|LT|gt|lt)(?!;)([=a-zA-Z0-9]?)|([0-9]+)(;?)|[xX]([a-fA-F0-9]+)(;?)|&([0-9a-zA-Z]+)/g;
+ var decodeMap = {
+ 'aacute': '\xE1',
+ 'Aacute': '\xC1',
+ 'abreve': "\u0103",
+ 'Abreve': "\u0102",
+ 'ac': "\u223E",
+ 'acd': "\u223F",
+ 'acE': "\u223E\u0333",
+ 'acirc': '\xE2',
+ 'Acirc': '\xC2',
+ 'acute': '\xB4',
+ 'acy': "\u0430",
+ 'Acy': "\u0410",
+ 'aelig': '\xE6',
+ 'AElig': '\xC6',
+ 'af': "\u2061",
+ 'afr': "\uD835\uDD1E",
+ 'Afr': "\uD835\uDD04",
+ 'agrave': '\xE0',
+ 'Agrave': '\xC0',
+ 'alefsym': "\u2135",
+ 'aleph': "\u2135",
+ 'alpha': "\u03B1",
+ 'Alpha': "\u0391",
+ 'amacr': "\u0101",
+ 'Amacr': "\u0100",
+ 'amalg': "\u2A3F",
+ 'amp': '&',
+ 'AMP': '&',
+ 'and': "\u2227",
+ 'And': "\u2A53",
+ 'andand': "\u2A55",
+ 'andd': "\u2A5C",
+ 'andslope': "\u2A58",
+ 'andv': "\u2A5A",
+ 'ang': "\u2220",
+ 'ange': "\u29A4",
+ 'angle': "\u2220",
+ 'angmsd': "\u2221",
+ 'angmsdaa': "\u29A8",
+ 'angmsdab': "\u29A9",
+ 'angmsdac': "\u29AA",
+ 'angmsdad': "\u29AB",
+ 'angmsdae': "\u29AC",
+ 'angmsdaf': "\u29AD",
+ 'angmsdag': "\u29AE",
+ 'angmsdah': "\u29AF",
+ 'angrt': "\u221F",
+ 'angrtvb': "\u22BE",
+ 'angrtvbd': "\u299D",
+ 'angsph': "\u2222",
+ 'angst': '\xC5',
+ 'angzarr': "\u237C",
+ 'aogon': "\u0105",
+ 'Aogon': "\u0104",
+ 'aopf': "\uD835\uDD52",
+ 'Aopf': "\uD835\uDD38",
+ 'ap': "\u2248",
+ 'apacir': "\u2A6F",
+ 'ape': "\u224A",
+ 'apE': "\u2A70",
+ 'apid': "\u224B",
+ 'apos': '\'',
+ 'ApplyFunction': "\u2061",
+ 'approx': "\u2248",
+ 'approxeq': "\u224A",
+ 'aring': '\xE5',
+ 'Aring': '\xC5',
+ 'ascr': "\uD835\uDCB6",
+ 'Ascr': "\uD835\uDC9C",
+ 'Assign': "\u2254",
+ 'ast': '*',
+ 'asymp': "\u2248",
+ 'asympeq': "\u224D",
+ 'atilde': '\xE3',
+ 'Atilde': '\xC3',
+ 'auml': '\xE4',
+ 'Auml': '\xC4',
+ 'awconint': "\u2233",
+ 'awint': "\u2A11",
+ 'backcong': "\u224C",
+ 'backepsilon': "\u03F6",
+ 'backprime': "\u2035",
+ 'backsim': "\u223D",
+ 'backsimeq': "\u22CD",
+ 'Backslash': "\u2216",
+ 'Barv': "\u2AE7",
+ 'barvee': "\u22BD",
+ 'barwed': "\u2305",
+ 'Barwed': "\u2306",
+ 'barwedge': "\u2305",
+ 'bbrk': "\u23B5",
+ 'bbrktbrk': "\u23B6",
+ 'bcong': "\u224C",
+ 'bcy': "\u0431",
+ 'Bcy': "\u0411",
+ 'bdquo': "\u201E",
+ 'becaus': "\u2235",
+ 'because': "\u2235",
+ 'Because': "\u2235",
+ 'bemptyv': "\u29B0",
+ 'bepsi': "\u03F6",
+ 'bernou': "\u212C",
+ 'Bernoullis': "\u212C",
+ 'beta': "\u03B2",
+ 'Beta': "\u0392",
+ 'beth': "\u2136",
+ 'between': "\u226C",
+ 'bfr': "\uD835\uDD1F",
+ 'Bfr': "\uD835\uDD05",
+ 'bigcap': "\u22C2",
+ 'bigcirc': "\u25EF",
+ 'bigcup': "\u22C3",
+ 'bigodot': "\u2A00",
+ 'bigoplus': "\u2A01",
+ 'bigotimes': "\u2A02",
+ 'bigsqcup': "\u2A06",
+ 'bigstar': "\u2605",
+ 'bigtriangledown': "\u25BD",
+ 'bigtriangleup': "\u25B3",
+ 'biguplus': "\u2A04",
+ 'bigvee': "\u22C1",
+ 'bigwedge': "\u22C0",
+ 'bkarow': "\u290D",
+ 'blacklozenge': "\u29EB",
+ 'blacksquare': "\u25AA",
+ 'blacktriangle': "\u25B4",
+ 'blacktriangledown': "\u25BE",
+ 'blacktriangleleft': "\u25C2",
+ 'blacktriangleright': "\u25B8",
+ 'blank': "\u2423",
+ 'blk12': "\u2592",
+ 'blk14': "\u2591",
+ 'blk34': "\u2593",
+ 'block': "\u2588",
+ 'bne': "=\u20E5",
+ 'bnequiv': "\u2261\u20E5",
+ 'bnot': "\u2310",
+ 'bNot': "\u2AED",
+ 'bopf': "\uD835\uDD53",
+ 'Bopf': "\uD835\uDD39",
+ 'bot': "\u22A5",
+ 'bottom': "\u22A5",
+ 'bowtie': "\u22C8",
+ 'boxbox': "\u29C9",
+ 'boxdl': "\u2510",
+ 'boxdL': "\u2555",
+ 'boxDl': "\u2556",
+ 'boxDL': "\u2557",
+ 'boxdr': "\u250C",
+ 'boxdR': "\u2552",
+ 'boxDr': "\u2553",
+ 'boxDR': "\u2554",
+ 'boxh': "\u2500",
+ 'boxH': "\u2550",
+ 'boxhd': "\u252C",
+ 'boxhD': "\u2565",
+ 'boxHd': "\u2564",
+ 'boxHD': "\u2566",
+ 'boxhu': "\u2534",
+ 'boxhU': "\u2568",
+ 'boxHu': "\u2567",
+ 'boxHU': "\u2569",
+ 'boxminus': "\u229F",
+ 'boxplus': "\u229E",
+ 'boxtimes': "\u22A0",
+ 'boxul': "\u2518",
+ 'boxuL': "\u255B",
+ 'boxUl': "\u255C",
+ 'boxUL': "\u255D",
+ 'boxur': "\u2514",
+ 'boxuR': "\u2558",
+ 'boxUr': "\u2559",
+ 'boxUR': "\u255A",
+ 'boxv': "\u2502",
+ 'boxV': "\u2551",
+ 'boxvh': "\u253C",
+ 'boxvH': "\u256A",
+ 'boxVh': "\u256B",
+ 'boxVH': "\u256C",
+ 'boxvl': "\u2524",
+ 'boxvL': "\u2561",
+ 'boxVl': "\u2562",
+ 'boxVL': "\u2563",
+ 'boxvr': "\u251C",
+ 'boxvR': "\u255E",
+ 'boxVr': "\u255F",
+ 'boxVR': "\u2560",
+ 'bprime': "\u2035",
+ 'breve': "\u02D8",
+ 'Breve': "\u02D8",
+ 'brvbar': '\xA6',
+ 'bscr': "\uD835\uDCB7",
+ 'Bscr': "\u212C",
+ 'bsemi': "\u204F",
+ 'bsim': "\u223D",
+ 'bsime': "\u22CD",
+ 'bsol': '\\',
+ 'bsolb': "\u29C5",
+ 'bsolhsub': "\u27C8",
+ 'bull': "\u2022",
+ 'bullet': "\u2022",
+ 'bump': "\u224E",
+ 'bumpe': "\u224F",
+ 'bumpE': "\u2AAE",
+ 'bumpeq': "\u224F",
+ 'Bumpeq': "\u224E",
+ 'cacute': "\u0107",
+ 'Cacute': "\u0106",
+ 'cap': "\u2229",
+ 'Cap': "\u22D2",
+ 'capand': "\u2A44",
+ 'capbrcup': "\u2A49",
+ 'capcap': "\u2A4B",
+ 'capcup': "\u2A47",
+ 'capdot': "\u2A40",
+ 'CapitalDifferentialD': "\u2145",
+ 'caps': "\u2229\uFE00",
+ 'caret': "\u2041",
+ 'caron': "\u02C7",
+ 'Cayleys': "\u212D",
+ 'ccaps': "\u2A4D",
+ 'ccaron': "\u010D",
+ 'Ccaron': "\u010C",
+ 'ccedil': '\xE7',
+ 'Ccedil': '\xC7',
+ 'ccirc': "\u0109",
+ 'Ccirc': "\u0108",
+ 'Cconint': "\u2230",
+ 'ccups': "\u2A4C",
+ 'ccupssm': "\u2A50",
+ 'cdot': "\u010B",
+ 'Cdot': "\u010A",
+ 'cedil': '\xB8',
+ 'Cedilla': '\xB8',
+ 'cemptyv': "\u29B2",
+ 'cent': '\xA2',
+ 'centerdot': '\xB7',
+ 'CenterDot': '\xB7',
+ 'cfr': "\uD835\uDD20",
+ 'Cfr': "\u212D",
+ 'chcy': "\u0447",
+ 'CHcy': "\u0427",
+ 'check': "\u2713",
+ 'checkmark': "\u2713",
+ 'chi': "\u03C7",
+ 'Chi': "\u03A7",
+ 'cir': "\u25CB",
+ 'circ': "\u02C6",
+ 'circeq': "\u2257",
+ 'circlearrowleft': "\u21BA",
+ 'circlearrowright': "\u21BB",
+ 'circledast': "\u229B",
+ 'circledcirc': "\u229A",
+ 'circleddash': "\u229D",
+ 'CircleDot': "\u2299",
+ 'circledR': '\xAE',
+ 'circledS': "\u24C8",
+ 'CircleMinus': "\u2296",
+ 'CirclePlus': "\u2295",
+ 'CircleTimes': "\u2297",
+ 'cire': "\u2257",
+ 'cirE': "\u29C3",
+ 'cirfnint': "\u2A10",
+ 'cirmid': "\u2AEF",
+ 'cirscir': "\u29C2",
+ 'ClockwiseContourIntegral': "\u2232",
+ 'CloseCurlyDoubleQuote': "\u201D",
+ 'CloseCurlyQuote': "\u2019",
+ 'clubs': "\u2663",
+ 'clubsuit': "\u2663",
+ 'colon': ':',
+ 'Colon': "\u2237",
+ 'colone': "\u2254",
+ 'Colone': "\u2A74",
+ 'coloneq': "\u2254",
+ 'comma': ',',
+ 'commat': '@',
+ 'comp': "\u2201",
+ 'compfn': "\u2218",
+ 'complement': "\u2201",
+ 'complexes': "\u2102",
+ 'cong': "\u2245",
+ 'congdot': "\u2A6D",
+ 'Congruent': "\u2261",
+ 'conint': "\u222E",
+ 'Conint': "\u222F",
+ 'ContourIntegral': "\u222E",
+ 'copf': "\uD835\uDD54",
+ 'Copf': "\u2102",
+ 'coprod': "\u2210",
+ 'Coproduct': "\u2210",
+ 'copy': '\xA9',
+ 'COPY': '\xA9',
+ 'copysr': "\u2117",
+ 'CounterClockwiseContourIntegral': "\u2233",
+ 'crarr': "\u21B5",
+ 'cross': "\u2717",
+ 'Cross': "\u2A2F",
+ 'cscr': "\uD835\uDCB8",
+ 'Cscr': "\uD835\uDC9E",
+ 'csub': "\u2ACF",
+ 'csube': "\u2AD1",
+ 'csup': "\u2AD0",
+ 'csupe': "\u2AD2",
+ 'ctdot': "\u22EF",
+ 'cudarrl': "\u2938",
+ 'cudarrr': "\u2935",
+ 'cuepr': "\u22DE",
+ 'cuesc': "\u22DF",
+ 'cularr': "\u21B6",
+ 'cularrp': "\u293D",
+ 'cup': "\u222A",
+ 'Cup': "\u22D3",
+ 'cupbrcap': "\u2A48",
+ 'cupcap': "\u2A46",
+ 'CupCap': "\u224D",
+ 'cupcup': "\u2A4A",
+ 'cupdot': "\u228D",
+ 'cupor': "\u2A45",
+ 'cups': "\u222A\uFE00",
+ 'curarr': "\u21B7",
+ 'curarrm': "\u293C",
+ 'curlyeqprec': "\u22DE",
+ 'curlyeqsucc': "\u22DF",
+ 'curlyvee': "\u22CE",
+ 'curlywedge': "\u22CF",
+ 'curren': '\xA4',
+ 'curvearrowleft': "\u21B6",
+ 'curvearrowright': "\u21B7",
+ 'cuvee': "\u22CE",
+ 'cuwed': "\u22CF",
+ 'cwconint': "\u2232",
+ 'cwint': "\u2231",
+ 'cylcty': "\u232D",
+ 'dagger': "\u2020",
+ 'Dagger': "\u2021",
+ 'daleth': "\u2138",
+ 'darr': "\u2193",
+ 'dArr': "\u21D3",
+ 'Darr': "\u21A1",
+ 'dash': "\u2010",
+ 'dashv': "\u22A3",
+ 'Dashv': "\u2AE4",
+ 'dbkarow': "\u290F",
+ 'dblac': "\u02DD",
+ 'dcaron': "\u010F",
+ 'Dcaron': "\u010E",
+ 'dcy': "\u0434",
+ 'Dcy': "\u0414",
+ 'dd': "\u2146",
+ 'DD': "\u2145",
+ 'ddagger': "\u2021",
+ 'ddarr': "\u21CA",
+ 'DDotrahd': "\u2911",
+ 'ddotseq': "\u2A77",
+ 'deg': '\xB0',
+ 'Del': "\u2207",
+ 'delta': "\u03B4",
+ 'Delta': "\u0394",
+ 'demptyv': "\u29B1",
+ 'dfisht': "\u297F",
+ 'dfr': "\uD835\uDD21",
+ 'Dfr': "\uD835\uDD07",
+ 'dHar': "\u2965",
+ 'dharl': "\u21C3",
+ 'dharr': "\u21C2",
+ 'DiacriticalAcute': '\xB4',
+ 'DiacriticalDot': "\u02D9",
+ 'DiacriticalDoubleAcute': "\u02DD",
+ 'DiacriticalGrave': '`',
+ 'DiacriticalTilde': "\u02DC",
+ 'diam': "\u22C4",
+ 'diamond': "\u22C4",
+ 'Diamond': "\u22C4",
+ 'diamondsuit': "\u2666",
+ 'diams': "\u2666",
+ 'die': '\xA8',
+ 'DifferentialD': "\u2146",
+ 'digamma': "\u03DD",
+ 'disin': "\u22F2",
+ 'div': '\xF7',
+ 'divide': '\xF7',
+ 'divideontimes': "\u22C7",
+ 'divonx': "\u22C7",
+ 'djcy': "\u0452",
+ 'DJcy': "\u0402",
+ 'dlcorn': "\u231E",
+ 'dlcrop': "\u230D",
+ 'dollar': '$',
+ 'dopf': "\uD835\uDD55",
+ 'Dopf': "\uD835\uDD3B",
+ 'dot': "\u02D9",
+ 'Dot': '\xA8',
+ 'DotDot': "\u20DC",
+ 'doteq': "\u2250",
+ 'doteqdot': "\u2251",
+ 'DotEqual': "\u2250",
+ 'dotminus': "\u2238",
+ 'dotplus': "\u2214",
+ 'dotsquare': "\u22A1",
+ 'doublebarwedge': "\u2306",
+ 'DoubleContourIntegral': "\u222F",
+ 'DoubleDot': '\xA8',
+ 'DoubleDownArrow': "\u21D3",
+ 'DoubleLeftArrow': "\u21D0",
+ 'DoubleLeftRightArrow': "\u21D4",
+ 'DoubleLeftTee': "\u2AE4",
+ 'DoubleLongLeftArrow': "\u27F8",
+ 'DoubleLongLeftRightArrow': "\u27FA",
+ 'DoubleLongRightArrow': "\u27F9",
+ 'DoubleRightArrow': "\u21D2",
+ 'DoubleRightTee': "\u22A8",
+ 'DoubleUpArrow': "\u21D1",
+ 'DoubleUpDownArrow': "\u21D5",
+ 'DoubleVerticalBar': "\u2225",
+ 'downarrow': "\u2193",
+ 'Downarrow': "\u21D3",
+ 'DownArrow': "\u2193",
+ 'DownArrowBar': "\u2913",
+ 'DownArrowUpArrow': "\u21F5",
+ 'DownBreve': "\u0311",
+ 'downdownarrows': "\u21CA",
+ 'downharpoonleft': "\u21C3",
+ 'downharpoonright': "\u21C2",
+ 'DownLeftRightVector': "\u2950",
+ 'DownLeftTeeVector': "\u295E",
+ 'DownLeftVector': "\u21BD",
+ 'DownLeftVectorBar': "\u2956",
+ 'DownRightTeeVector': "\u295F",
+ 'DownRightVector': "\u21C1",
+ 'DownRightVectorBar': "\u2957",
+ 'DownTee': "\u22A4",
+ 'DownTeeArrow': "\u21A7",
+ 'drbkarow': "\u2910",
+ 'drcorn': "\u231F",
+ 'drcrop': "\u230C",
+ 'dscr': "\uD835\uDCB9",
+ 'Dscr': "\uD835\uDC9F",
+ 'dscy': "\u0455",
+ 'DScy': "\u0405",
+ 'dsol': "\u29F6",
+ 'dstrok': "\u0111",
+ 'Dstrok': "\u0110",
+ 'dtdot': "\u22F1",
+ 'dtri': "\u25BF",
+ 'dtrif': "\u25BE",
+ 'duarr': "\u21F5",
+ 'duhar': "\u296F",
+ 'dwangle': "\u29A6",
+ 'dzcy': "\u045F",
+ 'DZcy': "\u040F",
+ 'dzigrarr': "\u27FF",
+ 'eacute': '\xE9',
+ 'Eacute': '\xC9',
+ 'easter': "\u2A6E",
+ 'ecaron': "\u011B",
+ 'Ecaron': "\u011A",
+ 'ecir': "\u2256",
+ 'ecirc': '\xEA',
+ 'Ecirc': '\xCA',
+ 'ecolon': "\u2255",
+ 'ecy': "\u044D",
+ 'Ecy': "\u042D",
+ 'eDDot': "\u2A77",
+ 'edot': "\u0117",
+ 'eDot': "\u2251",
+ 'Edot': "\u0116",
+ 'ee': "\u2147",
+ 'efDot': "\u2252",
+ 'efr': "\uD835\uDD22",
+ 'Efr': "\uD835\uDD08",
+ 'eg': "\u2A9A",
+ 'egrave': '\xE8',
+ 'Egrave': '\xC8',
+ 'egs': "\u2A96",
+ 'egsdot': "\u2A98",
+ 'el': "\u2A99",
+ 'Element': "\u2208",
+ 'elinters': "\u23E7",
+ 'ell': "\u2113",
+ 'els': "\u2A95",
+ 'elsdot': "\u2A97",
+ 'emacr': "\u0113",
+ 'Emacr': "\u0112",
+ 'empty': "\u2205",
+ 'emptyset': "\u2205",
+ 'EmptySmallSquare': "\u25FB",
+ 'emptyv': "\u2205",
+ 'EmptyVerySmallSquare': "\u25AB",
+ 'emsp': "\u2003",
+ 'emsp13': "\u2004",
+ 'emsp14': "\u2005",
+ 'eng': "\u014B",
+ 'ENG': "\u014A",
+ 'ensp': "\u2002",
+ 'eogon': "\u0119",
+ 'Eogon': "\u0118",
+ 'eopf': "\uD835\uDD56",
+ 'Eopf': "\uD835\uDD3C",
+ 'epar': "\u22D5",
+ 'eparsl': "\u29E3",
+ 'eplus': "\u2A71",
+ 'epsi': "\u03B5",
+ 'epsilon': "\u03B5",
+ 'Epsilon': "\u0395",
+ 'epsiv': "\u03F5",
+ 'eqcirc': "\u2256",
+ 'eqcolon': "\u2255",
+ 'eqsim': "\u2242",
+ 'eqslantgtr': "\u2A96",
+ 'eqslantless': "\u2A95",
+ 'Equal': "\u2A75",
+ 'equals': '=',
+ 'EqualTilde': "\u2242",
+ 'equest': "\u225F",
+ 'Equilibrium': "\u21CC",
+ 'equiv': "\u2261",
+ 'equivDD': "\u2A78",
+ 'eqvparsl': "\u29E5",
+ 'erarr': "\u2971",
+ 'erDot': "\u2253",
+ 'escr': "\u212F",
+ 'Escr': "\u2130",
+ 'esdot': "\u2250",
+ 'esim': "\u2242",
+ 'Esim': "\u2A73",
+ 'eta': "\u03B7",
+ 'Eta': "\u0397",
+ 'eth': '\xF0',
+ 'ETH': '\xD0',
+ 'euml': '\xEB',
+ 'Euml': '\xCB',
+ 'euro': "\u20AC",
+ 'excl': '!',
+ 'exist': "\u2203",
+ 'Exists': "\u2203",
+ 'expectation': "\u2130",
+ 'exponentiale': "\u2147",
+ 'ExponentialE': "\u2147",
+ 'fallingdotseq': "\u2252",
+ 'fcy': "\u0444",
+ 'Fcy': "\u0424",
+ 'female': "\u2640",
+ 'ffilig': "\uFB03",
+ 'fflig': "\uFB00",
+ 'ffllig': "\uFB04",
+ 'ffr': "\uD835\uDD23",
+ 'Ffr': "\uD835\uDD09",
+ 'filig': "\uFB01",
+ 'FilledSmallSquare': "\u25FC",
+ 'FilledVerySmallSquare': "\u25AA",
+ 'fjlig': 'fj',
+ 'flat': "\u266D",
+ 'fllig': "\uFB02",
+ 'fltns': "\u25B1",
+ 'fnof': "\u0192",
+ 'fopf': "\uD835\uDD57",
+ 'Fopf': "\uD835\uDD3D",
+ 'forall': "\u2200",
+ 'ForAll': "\u2200",
+ 'fork': "\u22D4",
+ 'forkv': "\u2AD9",
+ 'Fouriertrf': "\u2131",
+ 'fpartint': "\u2A0D",
+ 'frac12': '\xBD',
+ 'frac13': "\u2153",
+ 'frac14': '\xBC',
+ 'frac15': "\u2155",
+ 'frac16': "\u2159",
+ 'frac18': "\u215B",
+ 'frac23': "\u2154",
+ 'frac25': "\u2156",
+ 'frac34': '\xBE',
+ 'frac35': "\u2157",
+ 'frac38': "\u215C",
+ 'frac45': "\u2158",
+ 'frac56': "\u215A",
+ 'frac58': "\u215D",
+ 'frac78': "\u215E",
+ 'frasl': "\u2044",
+ 'frown': "\u2322",
+ 'fscr': "\uD835\uDCBB",
+ 'Fscr': "\u2131",
+ 'gacute': "\u01F5",
+ 'gamma': "\u03B3",
+ 'Gamma': "\u0393",
+ 'gammad': "\u03DD",
+ 'Gammad': "\u03DC",
+ 'gap': "\u2A86",
+ 'gbreve': "\u011F",
+ 'Gbreve': "\u011E",
+ 'Gcedil': "\u0122",
+ 'gcirc': "\u011D",
+ 'Gcirc': "\u011C",
+ 'gcy': "\u0433",
+ 'Gcy': "\u0413",
+ 'gdot': "\u0121",
+ 'Gdot': "\u0120",
+ 'ge': "\u2265",
+ 'gE': "\u2267",
+ 'gel': "\u22DB",
+ 'gEl': "\u2A8C",
+ 'geq': "\u2265",
+ 'geqq': "\u2267",
+ 'geqslant': "\u2A7E",
+ 'ges': "\u2A7E",
+ 'gescc': "\u2AA9",
+ 'gesdot': "\u2A80",
+ 'gesdoto': "\u2A82",
+ 'gesdotol': "\u2A84",
+ 'gesl': "\u22DB\uFE00",
+ 'gesles': "\u2A94",
+ 'gfr': "\uD835\uDD24",
+ 'Gfr': "\uD835\uDD0A",
+ 'gg': "\u226B",
+ 'Gg': "\u22D9",
+ 'ggg': "\u22D9",
+ 'gimel': "\u2137",
+ 'gjcy': "\u0453",
+ 'GJcy': "\u0403",
+ 'gl': "\u2277",
+ 'gla': "\u2AA5",
+ 'glE': "\u2A92",
+ 'glj': "\u2AA4",
+ 'gnap': "\u2A8A",
+ 'gnapprox': "\u2A8A",
+ 'gne': "\u2A88",
+ 'gnE': "\u2269",
+ 'gneq': "\u2A88",
+ 'gneqq': "\u2269",
+ 'gnsim': "\u22E7",
+ 'gopf': "\uD835\uDD58",
+ 'Gopf': "\uD835\uDD3E",
+ 'grave': '`',
+ 'GreaterEqual': "\u2265",
+ 'GreaterEqualLess': "\u22DB",
+ 'GreaterFullEqual': "\u2267",
+ 'GreaterGreater': "\u2AA2",
+ 'GreaterLess': "\u2277",
+ 'GreaterSlantEqual': "\u2A7E",
+ 'GreaterTilde': "\u2273",
+ 'gscr': "\u210A",
+ 'Gscr': "\uD835\uDCA2",
+ 'gsim': "\u2273",
+ 'gsime': "\u2A8E",
+ 'gsiml': "\u2A90",
+ 'gt': '>',
+ 'Gt': "\u226B",
+ 'GT': '>',
+ 'gtcc': "\u2AA7",
+ 'gtcir': "\u2A7A",
+ 'gtdot': "\u22D7",
+ 'gtlPar': "\u2995",
+ 'gtquest': "\u2A7C",
+ 'gtrapprox': "\u2A86",
+ 'gtrarr': "\u2978",
+ 'gtrdot': "\u22D7",
+ 'gtreqless': "\u22DB",
+ 'gtreqqless': "\u2A8C",
+ 'gtrless': "\u2277",
+ 'gtrsim': "\u2273",
+ 'gvertneqq': "\u2269\uFE00",
+ 'gvnE': "\u2269\uFE00",
+ 'Hacek': "\u02C7",
+ 'hairsp': "\u200A",
+ 'half': '\xBD',
+ 'hamilt': "\u210B",
+ 'hardcy': "\u044A",
+ 'HARDcy': "\u042A",
+ 'harr': "\u2194",
+ 'hArr': "\u21D4",
+ 'harrcir': "\u2948",
+ 'harrw': "\u21AD",
+ 'Hat': '^',
+ 'hbar': "\u210F",
+ 'hcirc': "\u0125",
+ 'Hcirc': "\u0124",
+ 'hearts': "\u2665",
+ 'heartsuit': "\u2665",
+ 'hellip': "\u2026",
+ 'hercon': "\u22B9",
+ 'hfr': "\uD835\uDD25",
+ 'Hfr': "\u210C",
+ 'HilbertSpace': "\u210B",
+ 'hksearow': "\u2925",
+ 'hkswarow': "\u2926",
+ 'hoarr': "\u21FF",
+ 'homtht': "\u223B",
+ 'hookleftarrow': "\u21A9",
+ 'hookrightarrow': "\u21AA",
+ 'hopf': "\uD835\uDD59",
+ 'Hopf': "\u210D",
+ 'horbar': "\u2015",
+ 'HorizontalLine': "\u2500",
+ 'hscr': "\uD835\uDCBD",
+ 'Hscr': "\u210B",
+ 'hslash': "\u210F",
+ 'hstrok': "\u0127",
+ 'Hstrok': "\u0126",
+ 'HumpDownHump': "\u224E",
+ 'HumpEqual': "\u224F",
+ 'hybull': "\u2043",
+ 'hyphen': "\u2010",
+ 'iacute': '\xED',
+ 'Iacute': '\xCD',
+ 'ic': "\u2063",
+ 'icirc': '\xEE',
+ 'Icirc': '\xCE',
+ 'icy': "\u0438",
+ 'Icy': "\u0418",
+ 'Idot': "\u0130",
+ 'iecy': "\u0435",
+ 'IEcy': "\u0415",
+ 'iexcl': '\xA1',
+ 'iff': "\u21D4",
+ 'ifr': "\uD835\uDD26",
+ 'Ifr': "\u2111",
+ 'igrave': '\xEC',
+ 'Igrave': '\xCC',
+ 'ii': "\u2148",
+ 'iiiint': "\u2A0C",
+ 'iiint': "\u222D",
+ 'iinfin': "\u29DC",
+ 'iiota': "\u2129",
+ 'ijlig': "\u0133",
+ 'IJlig': "\u0132",
+ 'Im': "\u2111",
+ 'imacr': "\u012B",
+ 'Imacr': "\u012A",
+ 'image': "\u2111",
+ 'ImaginaryI': "\u2148",
+ 'imagline': "\u2110",
+ 'imagpart': "\u2111",
+ 'imath': "\u0131",
+ 'imof': "\u22B7",
+ 'imped': "\u01B5",
+ 'Implies': "\u21D2",
+ 'in': "\u2208",
+ 'incare': "\u2105",
+ 'infin': "\u221E",
+ 'infintie': "\u29DD",
+ 'inodot': "\u0131",
+ 'int': "\u222B",
+ 'Int': "\u222C",
+ 'intcal': "\u22BA",
+ 'integers': "\u2124",
+ 'Integral': "\u222B",
+ 'intercal': "\u22BA",
+ 'Intersection': "\u22C2",
+ 'intlarhk': "\u2A17",
+ 'intprod': "\u2A3C",
+ 'InvisibleComma': "\u2063",
+ 'InvisibleTimes': "\u2062",
+ 'iocy': "\u0451",
+ 'IOcy': "\u0401",
+ 'iogon': "\u012F",
+ 'Iogon': "\u012E",
+ 'iopf': "\uD835\uDD5A",
+ 'Iopf': "\uD835\uDD40",
+ 'iota': "\u03B9",
+ 'Iota': "\u0399",
+ 'iprod': "\u2A3C",
+ 'iquest': '\xBF',
+ 'iscr': "\uD835\uDCBE",
+ 'Iscr': "\u2110",
+ 'isin': "\u2208",
+ 'isindot': "\u22F5",
+ 'isinE': "\u22F9",
+ 'isins': "\u22F4",
+ 'isinsv': "\u22F3",
+ 'isinv': "\u2208",
+ 'it': "\u2062",
+ 'itilde': "\u0129",
+ 'Itilde': "\u0128",
+ 'iukcy': "\u0456",
+ 'Iukcy': "\u0406",
+ 'iuml': '\xEF',
+ 'Iuml': '\xCF',
+ 'jcirc': "\u0135",
+ 'Jcirc': "\u0134",
+ 'jcy': "\u0439",
+ 'Jcy': "\u0419",
+ 'jfr': "\uD835\uDD27",
+ 'Jfr': "\uD835\uDD0D",
+ 'jmath': "\u0237",
+ 'jopf': "\uD835\uDD5B",
+ 'Jopf': "\uD835\uDD41",
+ 'jscr': "\uD835\uDCBF",
+ 'Jscr': "\uD835\uDCA5",
+ 'jsercy': "\u0458",
+ 'Jsercy': "\u0408",
+ 'jukcy': "\u0454",
+ 'Jukcy': "\u0404",
+ 'kappa': "\u03BA",
+ 'Kappa': "\u039A",
+ 'kappav': "\u03F0",
+ 'kcedil': "\u0137",
+ 'Kcedil': "\u0136",
+ 'kcy': "\u043A",
+ 'Kcy': "\u041A",
+ 'kfr': "\uD835\uDD28",
+ 'Kfr': "\uD835\uDD0E",
+ 'kgreen': "\u0138",
+ 'khcy': "\u0445",
+ 'KHcy': "\u0425",
+ 'kjcy': "\u045C",
+ 'KJcy': "\u040C",
+ 'kopf': "\uD835\uDD5C",
+ 'Kopf': "\uD835\uDD42",
+ 'kscr': "\uD835\uDCC0",
+ 'Kscr': "\uD835\uDCA6",
+ 'lAarr': "\u21DA",
+ 'lacute': "\u013A",
+ 'Lacute': "\u0139",
+ 'laemptyv': "\u29B4",
+ 'lagran': "\u2112",
+ 'lambda': "\u03BB",
+ 'Lambda': "\u039B",
+ 'lang': "\u27E8",
+ 'Lang': "\u27EA",
+ 'langd': "\u2991",
+ 'langle': "\u27E8",
+ 'lap': "\u2A85",
+ 'Laplacetrf': "\u2112",
+ 'laquo': '\xAB',
+ 'larr': "\u2190",
+ 'lArr': "\u21D0",
+ 'Larr': "\u219E",
+ 'larrb': "\u21E4",
+ 'larrbfs': "\u291F",
+ 'larrfs': "\u291D",
+ 'larrhk': "\u21A9",
+ 'larrlp': "\u21AB",
+ 'larrpl': "\u2939",
+ 'larrsim': "\u2973",
+ 'larrtl': "\u21A2",
+ 'lat': "\u2AAB",
+ 'latail': "\u2919",
+ 'lAtail': "\u291B",
+ 'late': "\u2AAD",
+ 'lates': "\u2AAD\uFE00",
+ 'lbarr': "\u290C",
+ 'lBarr': "\u290E",
+ 'lbbrk': "\u2772",
+ 'lbrace': '{',
+ 'lbrack': '[',
+ 'lbrke': "\u298B",
+ 'lbrksld': "\u298F",
+ 'lbrkslu': "\u298D",
+ 'lcaron': "\u013E",
+ 'Lcaron': "\u013D",
+ 'lcedil': "\u013C",
+ 'Lcedil': "\u013B",
+ 'lceil': "\u2308",
+ 'lcub': '{',
+ 'lcy': "\u043B",
+ 'Lcy': "\u041B",
+ 'ldca': "\u2936",
+ 'ldquo': "\u201C",
+ 'ldquor': "\u201E",
+ 'ldrdhar': "\u2967",
+ 'ldrushar': "\u294B",
+ 'ldsh': "\u21B2",
+ 'le': "\u2264",
+ 'lE': "\u2266",
+ 'LeftAngleBracket': "\u27E8",
+ 'leftarrow': "\u2190",
+ 'Leftarrow': "\u21D0",
+ 'LeftArrow': "\u2190",
+ 'LeftArrowBar': "\u21E4",
+ 'LeftArrowRightArrow': "\u21C6",
+ 'leftarrowtail': "\u21A2",
+ 'LeftCeiling': "\u2308",
+ 'LeftDoubleBracket': "\u27E6",
+ 'LeftDownTeeVector': "\u2961",
+ 'LeftDownVector': "\u21C3",
+ 'LeftDownVectorBar': "\u2959",
+ 'LeftFloor': "\u230A",
+ 'leftharpoondown': "\u21BD",
+ 'leftharpoonup': "\u21BC",
+ 'leftleftarrows': "\u21C7",
+ 'leftrightarrow': "\u2194",
+ 'Leftrightarrow': "\u21D4",
+ 'LeftRightArrow': "\u2194",
+ 'leftrightarrows': "\u21C6",
+ 'leftrightharpoons': "\u21CB",
+ 'leftrightsquigarrow': "\u21AD",
+ 'LeftRightVector': "\u294E",
+ 'LeftTee': "\u22A3",
+ 'LeftTeeArrow': "\u21A4",
+ 'LeftTeeVector': "\u295A",
+ 'leftthreetimes': "\u22CB",
+ 'LeftTriangle': "\u22B2",
+ 'LeftTriangleBar': "\u29CF",
+ 'LeftTriangleEqual': "\u22B4",
+ 'LeftUpDownVector': "\u2951",
+ 'LeftUpTeeVector': "\u2960",
+ 'LeftUpVector': "\u21BF",
+ 'LeftUpVectorBar': "\u2958",
+ 'LeftVector': "\u21BC",
+ 'LeftVectorBar': "\u2952",
+ 'leg': "\u22DA",
+ 'lEg': "\u2A8B",
+ 'leq': "\u2264",
+ 'leqq': "\u2266",
+ 'leqslant': "\u2A7D",
+ 'les': "\u2A7D",
+ 'lescc': "\u2AA8",
+ 'lesdot': "\u2A7F",
+ 'lesdoto': "\u2A81",
+ 'lesdotor': "\u2A83",
+ 'lesg': "\u22DA\uFE00",
+ 'lesges': "\u2A93",
+ 'lessapprox': "\u2A85",
+ 'lessdot': "\u22D6",
+ 'lesseqgtr': "\u22DA",
+ 'lesseqqgtr': "\u2A8B",
+ 'LessEqualGreater': "\u22DA",
+ 'LessFullEqual': "\u2266",
+ 'LessGreater': "\u2276",
+ 'lessgtr': "\u2276",
+ 'LessLess': "\u2AA1",
+ 'lesssim': "\u2272",
+ 'LessSlantEqual': "\u2A7D",
+ 'LessTilde': "\u2272",
+ 'lfisht': "\u297C",
+ 'lfloor': "\u230A",
+ 'lfr': "\uD835\uDD29",
+ 'Lfr': "\uD835\uDD0F",
+ 'lg': "\u2276",
+ 'lgE': "\u2A91",
+ 'lHar': "\u2962",
+ 'lhard': "\u21BD",
+ 'lharu': "\u21BC",
+ 'lharul': "\u296A",
+ 'lhblk': "\u2584",
+ 'ljcy': "\u0459",
+ 'LJcy': "\u0409",
+ 'll': "\u226A",
+ 'Ll': "\u22D8",
+ 'llarr': "\u21C7",
+ 'llcorner': "\u231E",
+ 'Lleftarrow': "\u21DA",
+ 'llhard': "\u296B",
+ 'lltri': "\u25FA",
+ 'lmidot': "\u0140",
+ 'Lmidot': "\u013F",
+ 'lmoust': "\u23B0",
+ 'lmoustache': "\u23B0",
+ 'lnap': "\u2A89",
+ 'lnapprox': "\u2A89",
+ 'lne': "\u2A87",
+ 'lnE': "\u2268",
+ 'lneq': "\u2A87",
+ 'lneqq': "\u2268",
+ 'lnsim': "\u22E6",
+ 'loang': "\u27EC",
+ 'loarr': "\u21FD",
+ 'lobrk': "\u27E6",
+ 'longleftarrow': "\u27F5",
+ 'Longleftarrow': "\u27F8",
+ 'LongLeftArrow': "\u27F5",
+ 'longleftrightarrow': "\u27F7",
+ 'Longleftrightarrow': "\u27FA",
+ 'LongLeftRightArrow': "\u27F7",
+ 'longmapsto': "\u27FC",
+ 'longrightarrow': "\u27F6",
+ 'Longrightarrow': "\u27F9",
+ 'LongRightArrow': "\u27F6",
+ 'looparrowleft': "\u21AB",
+ 'looparrowright': "\u21AC",
+ 'lopar': "\u2985",
+ 'lopf': "\uD835\uDD5D",
+ 'Lopf': "\uD835\uDD43",
+ 'loplus': "\u2A2D",
+ 'lotimes': "\u2A34",
+ 'lowast': "\u2217",
+ 'lowbar': '_',
+ 'LowerLeftArrow': "\u2199",
+ 'LowerRightArrow': "\u2198",
+ 'loz': "\u25CA",
+ 'lozenge': "\u25CA",
+ 'lozf': "\u29EB",
+ 'lpar': '(',
+ 'lparlt': "\u2993",
+ 'lrarr': "\u21C6",
+ 'lrcorner': "\u231F",
+ 'lrhar': "\u21CB",
+ 'lrhard': "\u296D",
+ 'lrm': "\u200E",
+ 'lrtri': "\u22BF",
+ 'lsaquo': "\u2039",
+ 'lscr': "\uD835\uDCC1",
+ 'Lscr': "\u2112",
+ 'lsh': "\u21B0",
+ 'Lsh': "\u21B0",
+ 'lsim': "\u2272",
+ 'lsime': "\u2A8D",
+ 'lsimg': "\u2A8F",
+ 'lsqb': '[',
+ 'lsquo': "\u2018",
+ 'lsquor': "\u201A",
+ 'lstrok': "\u0142",
+ 'Lstrok': "\u0141",
+ 'lt': '<',
+ 'Lt': "\u226A",
+ 'LT': '<',
+ 'ltcc': "\u2AA6",
+ 'ltcir': "\u2A79",
+ 'ltdot': "\u22D6",
+ 'lthree': "\u22CB",
+ 'ltimes': "\u22C9",
+ 'ltlarr': "\u2976",
+ 'ltquest': "\u2A7B",
+ 'ltri': "\u25C3",
+ 'ltrie': "\u22B4",
+ 'ltrif': "\u25C2",
+ 'ltrPar': "\u2996",
+ 'lurdshar': "\u294A",
+ 'luruhar': "\u2966",
+ 'lvertneqq': "\u2268\uFE00",
+ 'lvnE': "\u2268\uFE00",
+ 'macr': '\xAF',
+ 'male': "\u2642",
+ 'malt': "\u2720",
+ 'maltese': "\u2720",
+ 'map': "\u21A6",
+ 'Map': "\u2905",
+ 'mapsto': "\u21A6",
+ 'mapstodown': "\u21A7",
+ 'mapstoleft': "\u21A4",
+ 'mapstoup': "\u21A5",
+ 'marker': "\u25AE",
+ 'mcomma': "\u2A29",
+ 'mcy': "\u043C",
+ 'Mcy': "\u041C",
+ 'mdash': "\u2014",
+ 'mDDot': "\u223A",
+ 'measuredangle': "\u2221",
+ 'MediumSpace': "\u205F",
+ 'Mellintrf': "\u2133",
+ 'mfr': "\uD835\uDD2A",
+ 'Mfr': "\uD835\uDD10",
+ 'mho': "\u2127",
+ 'micro': '\xB5',
+ 'mid': "\u2223",
+ 'midast': '*',
+ 'midcir': "\u2AF0",
+ 'middot': '\xB7',
+ 'minus': "\u2212",
+ 'minusb': "\u229F",
+ 'minusd': "\u2238",
+ 'minusdu': "\u2A2A",
+ 'MinusPlus': "\u2213",
+ 'mlcp': "\u2ADB",
+ 'mldr': "\u2026",
+ 'mnplus': "\u2213",
+ 'models': "\u22A7",
+ 'mopf': "\uD835\uDD5E",
+ 'Mopf': "\uD835\uDD44",
+ 'mp': "\u2213",
+ 'mscr': "\uD835\uDCC2",
+ 'Mscr': "\u2133",
+ 'mstpos': "\u223E",
+ 'mu': "\u03BC",
+ 'Mu': "\u039C",
+ 'multimap': "\u22B8",
+ 'mumap': "\u22B8",
+ 'nabla': "\u2207",
+ 'nacute': "\u0144",
+ 'Nacute': "\u0143",
+ 'nang': "\u2220\u20D2",
+ 'nap': "\u2249",
+ 'napE': "\u2A70\u0338",
+ 'napid': "\u224B\u0338",
+ 'napos': "\u0149",
+ 'napprox': "\u2249",
+ 'natur': "\u266E",
+ 'natural': "\u266E",
+ 'naturals': "\u2115",
+ 'nbsp': '\xA0',
+ 'nbump': "\u224E\u0338",
+ 'nbumpe': "\u224F\u0338",
+ 'ncap': "\u2A43",
+ 'ncaron': "\u0148",
+ 'Ncaron': "\u0147",
+ 'ncedil': "\u0146",
+ 'Ncedil': "\u0145",
+ 'ncong': "\u2247",
+ 'ncongdot': "\u2A6D\u0338",
+ 'ncup': "\u2A42",
+ 'ncy': "\u043D",
+ 'Ncy': "\u041D",
+ 'ndash': "\u2013",
+ 'ne': "\u2260",
+ 'nearhk': "\u2924",
+ 'nearr': "\u2197",
+ 'neArr': "\u21D7",
+ 'nearrow': "\u2197",
+ 'nedot': "\u2250\u0338",
+ 'NegativeMediumSpace': "\u200B",
+ 'NegativeThickSpace': "\u200B",
+ 'NegativeThinSpace': "\u200B",
+ 'NegativeVeryThinSpace': "\u200B",
+ 'nequiv': "\u2262",
+ 'nesear': "\u2928",
+ 'nesim': "\u2242\u0338",
+ 'NestedGreaterGreater': "\u226B",
+ 'NestedLessLess': "\u226A",
+ 'NewLine': '\n',
+ 'nexist': "\u2204",
+ 'nexists': "\u2204",
+ 'nfr': "\uD835\uDD2B",
+ 'Nfr': "\uD835\uDD11",
+ 'nge': "\u2271",
+ 'ngE': "\u2267\u0338",
+ 'ngeq': "\u2271",
+ 'ngeqq': "\u2267\u0338",
+ 'ngeqslant': "\u2A7E\u0338",
+ 'nges': "\u2A7E\u0338",
+ 'nGg': "\u22D9\u0338",
+ 'ngsim': "\u2275",
+ 'ngt': "\u226F",
+ 'nGt': "\u226B\u20D2",
+ 'ngtr': "\u226F",
+ 'nGtv': "\u226B\u0338",
+ 'nharr': "\u21AE",
+ 'nhArr': "\u21CE",
+ 'nhpar': "\u2AF2",
+ 'ni': "\u220B",
+ 'nis': "\u22FC",
+ 'nisd': "\u22FA",
+ 'niv': "\u220B",
+ 'njcy': "\u045A",
+ 'NJcy': "\u040A",
+ 'nlarr': "\u219A",
+ 'nlArr': "\u21CD",
+ 'nldr': "\u2025",
+ 'nle': "\u2270",
+ 'nlE': "\u2266\u0338",
+ 'nleftarrow': "\u219A",
+ 'nLeftarrow': "\u21CD",
+ 'nleftrightarrow': "\u21AE",
+ 'nLeftrightarrow': "\u21CE",
+ 'nleq': "\u2270",
+ 'nleqq': "\u2266\u0338",
+ 'nleqslant': "\u2A7D\u0338",
+ 'nles': "\u2A7D\u0338",
+ 'nless': "\u226E",
+ 'nLl': "\u22D8\u0338",
+ 'nlsim': "\u2274",
+ 'nlt': "\u226E",
+ 'nLt': "\u226A\u20D2",
+ 'nltri': "\u22EA",
+ 'nltrie': "\u22EC",
+ 'nLtv': "\u226A\u0338",
+ 'nmid': "\u2224",
+ 'NoBreak': "\u2060",
+ 'NonBreakingSpace': '\xA0',
+ 'nopf': "\uD835\uDD5F",
+ 'Nopf': "\u2115",
+ 'not': '\xAC',
+ 'Not': "\u2AEC",
+ 'NotCongruent': "\u2262",
+ 'NotCupCap': "\u226D",
+ 'NotDoubleVerticalBar': "\u2226",
+ 'NotElement': "\u2209",
+ 'NotEqual': "\u2260",
+ 'NotEqualTilde': "\u2242\u0338",
+ 'NotExists': "\u2204",
+ 'NotGreater': "\u226F",
+ 'NotGreaterEqual': "\u2271",
+ 'NotGreaterFullEqual': "\u2267\u0338",
+ 'NotGreaterGreater': "\u226B\u0338",
+ 'NotGreaterLess': "\u2279",
+ 'NotGreaterSlantEqual': "\u2A7E\u0338",
+ 'NotGreaterTilde': "\u2275",
+ 'NotHumpDownHump': "\u224E\u0338",
+ 'NotHumpEqual': "\u224F\u0338",
+ 'notin': "\u2209",
+ 'notindot': "\u22F5\u0338",
+ 'notinE': "\u22F9\u0338",
+ 'notinva': "\u2209",
+ 'notinvb': "\u22F7",
+ 'notinvc': "\u22F6",
+ 'NotLeftTriangle': "\u22EA",
+ 'NotLeftTriangleBar': "\u29CF\u0338",
+ 'NotLeftTriangleEqual': "\u22EC",
+ 'NotLess': "\u226E",
+ 'NotLessEqual': "\u2270",
+ 'NotLessGreater': "\u2278",
+ 'NotLessLess': "\u226A\u0338",
+ 'NotLessSlantEqual': "\u2A7D\u0338",
+ 'NotLessTilde': "\u2274",
+ 'NotNestedGreaterGreater': "\u2AA2\u0338",
+ 'NotNestedLessLess': "\u2AA1\u0338",
+ 'notni': "\u220C",
+ 'notniva': "\u220C",
+ 'notnivb': "\u22FE",
+ 'notnivc': "\u22FD",
+ 'NotPrecedes': "\u2280",
+ 'NotPrecedesEqual': "\u2AAF\u0338",
+ 'NotPrecedesSlantEqual': "\u22E0",
+ 'NotReverseElement': "\u220C",
+ 'NotRightTriangle': "\u22EB",
+ 'NotRightTriangleBar': "\u29D0\u0338",
+ 'NotRightTriangleEqual': "\u22ED",
+ 'NotSquareSubset': "\u228F\u0338",
+ 'NotSquareSubsetEqual': "\u22E2",
+ 'NotSquareSuperset': "\u2290\u0338",
+ 'NotSquareSupersetEqual': "\u22E3",
+ 'NotSubset': "\u2282\u20D2",
+ 'NotSubsetEqual': "\u2288",
+ 'NotSucceeds': "\u2281",
+ 'NotSucceedsEqual': "\u2AB0\u0338",
+ 'NotSucceedsSlantEqual': "\u22E1",
+ 'NotSucceedsTilde': "\u227F\u0338",
+ 'NotSuperset': "\u2283\u20D2",
+ 'NotSupersetEqual': "\u2289",
+ 'NotTilde': "\u2241",
+ 'NotTildeEqual': "\u2244",
+ 'NotTildeFullEqual': "\u2247",
+ 'NotTildeTilde': "\u2249",
+ 'NotVerticalBar': "\u2224",
+ 'npar': "\u2226",
+ 'nparallel': "\u2226",
+ 'nparsl': "\u2AFD\u20E5",
+ 'npart': "\u2202\u0338",
+ 'npolint': "\u2A14",
+ 'npr': "\u2280",
+ 'nprcue': "\u22E0",
+ 'npre': "\u2AAF\u0338",
+ 'nprec': "\u2280",
+ 'npreceq': "\u2AAF\u0338",
+ 'nrarr': "\u219B",
+ 'nrArr': "\u21CF",
+ 'nrarrc': "\u2933\u0338",
+ 'nrarrw': "\u219D\u0338",
+ 'nrightarrow': "\u219B",
+ 'nRightarrow': "\u21CF",
+ 'nrtri': "\u22EB",
+ 'nrtrie': "\u22ED",
+ 'nsc': "\u2281",
+ 'nsccue': "\u22E1",
+ 'nsce': "\u2AB0\u0338",
+ 'nscr': "\uD835\uDCC3",
+ 'Nscr': "\uD835\uDCA9",
+ 'nshortmid': "\u2224",
+ 'nshortparallel': "\u2226",
+ 'nsim': "\u2241",
+ 'nsime': "\u2244",
+ 'nsimeq': "\u2244",
+ 'nsmid': "\u2224",
+ 'nspar': "\u2226",
+ 'nsqsube': "\u22E2",
+ 'nsqsupe': "\u22E3",
+ 'nsub': "\u2284",
+ 'nsube': "\u2288",
+ 'nsubE': "\u2AC5\u0338",
+ 'nsubset': "\u2282\u20D2",
+ 'nsubseteq': "\u2288",
+ 'nsubseteqq': "\u2AC5\u0338",
+ 'nsucc': "\u2281",
+ 'nsucceq': "\u2AB0\u0338",
+ 'nsup': "\u2285",
+ 'nsupe': "\u2289",
+ 'nsupE': "\u2AC6\u0338",
+ 'nsupset': "\u2283\u20D2",
+ 'nsupseteq': "\u2289",
+ 'nsupseteqq': "\u2AC6\u0338",
+ 'ntgl': "\u2279",
+ 'ntilde': '\xF1',
+ 'Ntilde': '\xD1',
+ 'ntlg': "\u2278",
+ 'ntriangleleft': "\u22EA",
+ 'ntrianglelefteq': "\u22EC",
+ 'ntriangleright': "\u22EB",
+ 'ntrianglerighteq': "\u22ED",
+ 'nu': "\u03BD",
+ 'Nu': "\u039D",
+ 'num': '#',
+ 'numero': "\u2116",
+ 'numsp': "\u2007",
+ 'nvap': "\u224D\u20D2",
+ 'nvdash': "\u22AC",
+ 'nvDash': "\u22AD",
+ 'nVdash': "\u22AE",
+ 'nVDash': "\u22AF",
+ 'nvge': "\u2265\u20D2",
+ 'nvgt': ">\u20D2",
+ 'nvHarr': "\u2904",
+ 'nvinfin': "\u29DE",
+ 'nvlArr': "\u2902",
+ 'nvle': "\u2264\u20D2",
+ 'nvlt': "<\u20D2",
+ 'nvltrie': "\u22B4\u20D2",
+ 'nvrArr': "\u2903",
+ 'nvrtrie': "\u22B5\u20D2",
+ 'nvsim': "\u223C\u20D2",
+ 'nwarhk': "\u2923",
+ 'nwarr': "\u2196",
+ 'nwArr': "\u21D6",
+ 'nwarrow': "\u2196",
+ 'nwnear': "\u2927",
+ 'oacute': '\xF3',
+ 'Oacute': '\xD3',
+ 'oast': "\u229B",
+ 'ocir': "\u229A",
+ 'ocirc': '\xF4',
+ 'Ocirc': '\xD4',
+ 'ocy': "\u043E",
+ 'Ocy': "\u041E",
+ 'odash': "\u229D",
+ 'odblac': "\u0151",
+ 'Odblac': "\u0150",
+ 'odiv': "\u2A38",
+ 'odot': "\u2299",
+ 'odsold': "\u29BC",
+ 'oelig': "\u0153",
+ 'OElig': "\u0152",
+ 'ofcir': "\u29BF",
+ 'ofr': "\uD835\uDD2C",
+ 'Ofr': "\uD835\uDD12",
+ 'ogon': "\u02DB",
+ 'ograve': '\xF2',
+ 'Ograve': '\xD2',
+ 'ogt': "\u29C1",
+ 'ohbar': "\u29B5",
+ 'ohm': "\u03A9",
+ 'oint': "\u222E",
+ 'olarr': "\u21BA",
+ 'olcir': "\u29BE",
+ 'olcross': "\u29BB",
+ 'oline': "\u203E",
+ 'olt': "\u29C0",
+ 'omacr': "\u014D",
+ 'Omacr': "\u014C",
+ 'omega': "\u03C9",
+ 'Omega': "\u03A9",
+ 'omicron': "\u03BF",
+ 'Omicron': "\u039F",
+ 'omid': "\u29B6",
+ 'ominus': "\u2296",
+ 'oopf': "\uD835\uDD60",
+ 'Oopf': "\uD835\uDD46",
+ 'opar': "\u29B7",
+ 'OpenCurlyDoubleQuote': "\u201C",
+ 'OpenCurlyQuote': "\u2018",
+ 'operp': "\u29B9",
+ 'oplus': "\u2295",
+ 'or': "\u2228",
+ 'Or': "\u2A54",
+ 'orarr': "\u21BB",
+ 'ord': "\u2A5D",
+ 'order': "\u2134",
+ 'orderof': "\u2134",
+ 'ordf': '\xAA',
+ 'ordm': '\xBA',
+ 'origof': "\u22B6",
+ 'oror': "\u2A56",
+ 'orslope': "\u2A57",
+ 'orv': "\u2A5B",
+ 'oS': "\u24C8",
+ 'oscr': "\u2134",
+ 'Oscr': "\uD835\uDCAA",
+ 'oslash': '\xF8',
+ 'Oslash': '\xD8',
+ 'osol': "\u2298",
+ 'otilde': '\xF5',
+ 'Otilde': '\xD5',
+ 'otimes': "\u2297",
+ 'Otimes': "\u2A37",
+ 'otimesas': "\u2A36",
+ 'ouml': '\xF6',
+ 'Ouml': '\xD6',
+ 'ovbar': "\u233D",
+ 'OverBar': "\u203E",
+ 'OverBrace': "\u23DE",
+ 'OverBracket': "\u23B4",
+ 'OverParenthesis': "\u23DC",
+ 'par': "\u2225",
+ 'para': '\xB6',
+ 'parallel': "\u2225",
+ 'parsim': "\u2AF3",
+ 'parsl': "\u2AFD",
+ 'part': "\u2202",
+ 'PartialD': "\u2202",
+ 'pcy': "\u043F",
+ 'Pcy': "\u041F",
+ 'percnt': '%',
+ 'period': '.',
+ 'permil': "\u2030",
+ 'perp': "\u22A5",
+ 'pertenk': "\u2031",
+ 'pfr': "\uD835\uDD2D",
+ 'Pfr': "\uD835\uDD13",
+ 'phi': "\u03C6",
+ 'Phi': "\u03A6",
+ 'phiv': "\u03D5",
+ 'phmmat': "\u2133",
+ 'phone': "\u260E",
+ 'pi': "\u03C0",
+ 'Pi': "\u03A0",
+ 'pitchfork': "\u22D4",
+ 'piv': "\u03D6",
+ 'planck': "\u210F",
+ 'planckh': "\u210E",
+ 'plankv': "\u210F",
+ 'plus': '+',
+ 'plusacir': "\u2A23",
+ 'plusb': "\u229E",
+ 'pluscir': "\u2A22",
+ 'plusdo': "\u2214",
+ 'plusdu': "\u2A25",
+ 'pluse': "\u2A72",
+ 'PlusMinus': '\xB1',
+ 'plusmn': '\xB1',
+ 'plussim': "\u2A26",
+ 'plustwo': "\u2A27",
+ 'pm': '\xB1',
+ 'Poincareplane': "\u210C",
+ 'pointint': "\u2A15",
+ 'popf': "\uD835\uDD61",
+ 'Popf': "\u2119",
+ 'pound': '\xA3',
+ 'pr': "\u227A",
+ 'Pr': "\u2ABB",
+ 'prap': "\u2AB7",
+ 'prcue': "\u227C",
+ 'pre': "\u2AAF",
+ 'prE': "\u2AB3",
+ 'prec': "\u227A",
+ 'precapprox': "\u2AB7",
+ 'preccurlyeq': "\u227C",
+ 'Precedes': "\u227A",
+ 'PrecedesEqual': "\u2AAF",
+ 'PrecedesSlantEqual': "\u227C",
+ 'PrecedesTilde': "\u227E",
+ 'preceq': "\u2AAF",
+ 'precnapprox': "\u2AB9",
+ 'precneqq': "\u2AB5",
+ 'precnsim': "\u22E8",
+ 'precsim': "\u227E",
+ 'prime': "\u2032",
+ 'Prime': "\u2033",
+ 'primes': "\u2119",
+ 'prnap': "\u2AB9",
+ 'prnE': "\u2AB5",
+ 'prnsim': "\u22E8",
+ 'prod': "\u220F",
+ 'Product': "\u220F",
+ 'profalar': "\u232E",
+ 'profline': "\u2312",
+ 'profsurf': "\u2313",
+ 'prop': "\u221D",
+ 'Proportion': "\u2237",
+ 'Proportional': "\u221D",
+ 'propto': "\u221D",
+ 'prsim': "\u227E",
+ 'prurel': "\u22B0",
+ 'pscr': "\uD835\uDCC5",
+ 'Pscr': "\uD835\uDCAB",
+ 'psi': "\u03C8",
+ 'Psi': "\u03A8",
+ 'puncsp': "\u2008",
+ 'qfr': "\uD835\uDD2E",
+ 'Qfr': "\uD835\uDD14",
+ 'qint': "\u2A0C",
+ 'qopf': "\uD835\uDD62",
+ 'Qopf': "\u211A",
+ 'qprime': "\u2057",
+ 'qscr': "\uD835\uDCC6",
+ 'Qscr': "\uD835\uDCAC",
+ 'quaternions': "\u210D",
+ 'quatint': "\u2A16",
+ 'quest': '?',
+ 'questeq': "\u225F",
+ 'quot': '"',
+ 'QUOT': '"',
+ 'rAarr': "\u21DB",
+ 'race': "\u223D\u0331",
+ 'racute': "\u0155",
+ 'Racute': "\u0154",
+ 'radic': "\u221A",
+ 'raemptyv': "\u29B3",
+ 'rang': "\u27E9",
+ 'Rang': "\u27EB",
+ 'rangd': "\u2992",
+ 'range': "\u29A5",
+ 'rangle': "\u27E9",
+ 'raquo': '\xBB',
+ 'rarr': "\u2192",
+ 'rArr': "\u21D2",
+ 'Rarr': "\u21A0",
+ 'rarrap': "\u2975",
+ 'rarrb': "\u21E5",
+ 'rarrbfs': "\u2920",
+ 'rarrc': "\u2933",
+ 'rarrfs': "\u291E",
+ 'rarrhk': "\u21AA",
+ 'rarrlp': "\u21AC",
+ 'rarrpl': "\u2945",
+ 'rarrsim': "\u2974",
+ 'rarrtl': "\u21A3",
+ 'Rarrtl': "\u2916",
+ 'rarrw': "\u219D",
+ 'ratail': "\u291A",
+ 'rAtail': "\u291C",
+ 'ratio': "\u2236",
+ 'rationals': "\u211A",
+ 'rbarr': "\u290D",
+ 'rBarr': "\u290F",
+ 'RBarr': "\u2910",
+ 'rbbrk': "\u2773",
+ 'rbrace': '}',
+ 'rbrack': ']',
+ 'rbrke': "\u298C",
+ 'rbrksld': "\u298E",
+ 'rbrkslu': "\u2990",
+ 'rcaron': "\u0159",
+ 'Rcaron': "\u0158",
+ 'rcedil': "\u0157",
+ 'Rcedil': "\u0156",
+ 'rceil': "\u2309",
+ 'rcub': '}',
+ 'rcy': "\u0440",
+ 'Rcy': "\u0420",
+ 'rdca': "\u2937",
+ 'rdldhar': "\u2969",
+ 'rdquo': "\u201D",
+ 'rdquor': "\u201D",
+ 'rdsh': "\u21B3",
+ 'Re': "\u211C",
+ 'real': "\u211C",
+ 'realine': "\u211B",
+ 'realpart': "\u211C",
+ 'reals': "\u211D",
+ 'rect': "\u25AD",
+ 'reg': '\xAE',
+ 'REG': '\xAE',
+ 'ReverseElement': "\u220B",
+ 'ReverseEquilibrium': "\u21CB",
+ 'ReverseUpEquilibrium': "\u296F",
+ 'rfisht': "\u297D",
+ 'rfloor': "\u230B",
+ 'rfr': "\uD835\uDD2F",
+ 'Rfr': "\u211C",
+ 'rHar': "\u2964",
+ 'rhard': "\u21C1",
+ 'rharu': "\u21C0",
+ 'rharul': "\u296C",
+ 'rho': "\u03C1",
+ 'Rho': "\u03A1",
+ 'rhov': "\u03F1",
+ 'RightAngleBracket': "\u27E9",
+ 'rightarrow': "\u2192",
+ 'Rightarrow': "\u21D2",
+ 'RightArrow': "\u2192",
+ 'RightArrowBar': "\u21E5",
+ 'RightArrowLeftArrow': "\u21C4",
+ 'rightarrowtail': "\u21A3",
+ 'RightCeiling': "\u2309",
+ 'RightDoubleBracket': "\u27E7",
+ 'RightDownTeeVector': "\u295D",
+ 'RightDownVector': "\u21C2",
+ 'RightDownVectorBar': "\u2955",
+ 'RightFloor': "\u230B",
+ 'rightharpoondown': "\u21C1",
+ 'rightharpoonup': "\u21C0",
+ 'rightleftarrows': "\u21C4",
+ 'rightleftharpoons': "\u21CC",
+ 'rightrightarrows': "\u21C9",
+ 'rightsquigarrow': "\u219D",
+ 'RightTee': "\u22A2",
+ 'RightTeeArrow': "\u21A6",
+ 'RightTeeVector': "\u295B",
+ 'rightthreetimes': "\u22CC",
+ 'RightTriangle': "\u22B3",
+ 'RightTriangleBar': "\u29D0",
+ 'RightTriangleEqual': "\u22B5",
+ 'RightUpDownVector': "\u294F",
+ 'RightUpTeeVector': "\u295C",
+ 'RightUpVector': "\u21BE",
+ 'RightUpVectorBar': "\u2954",
+ 'RightVector': "\u21C0",
+ 'RightVectorBar': "\u2953",
+ 'ring': "\u02DA",
+ 'risingdotseq': "\u2253",
+ 'rlarr': "\u21C4",
+ 'rlhar': "\u21CC",
+ 'rlm': "\u200F",
+ 'rmoust': "\u23B1",
+ 'rmoustache': "\u23B1",
+ 'rnmid': "\u2AEE",
+ 'roang': "\u27ED",
+ 'roarr': "\u21FE",
+ 'robrk': "\u27E7",
+ 'ropar': "\u2986",
+ 'ropf': "\uD835\uDD63",
+ 'Ropf': "\u211D",
+ 'roplus': "\u2A2E",
+ 'rotimes': "\u2A35",
+ 'RoundImplies': "\u2970",
+ 'rpar': ')',
+ 'rpargt': "\u2994",
+ 'rppolint': "\u2A12",
+ 'rrarr': "\u21C9",
+ 'Rrightarrow': "\u21DB",
+ 'rsaquo': "\u203A",
+ 'rscr': "\uD835\uDCC7",
+ 'Rscr': "\u211B",
+ 'rsh': "\u21B1",
+ 'Rsh': "\u21B1",
+ 'rsqb': ']',
+ 'rsquo': "\u2019",
+ 'rsquor': "\u2019",
+ 'rthree': "\u22CC",
+ 'rtimes': "\u22CA",
+ 'rtri': "\u25B9",
+ 'rtrie': "\u22B5",
+ 'rtrif': "\u25B8",
+ 'rtriltri': "\u29CE",
+ 'RuleDelayed': "\u29F4",
+ 'ruluhar': "\u2968",
+ 'rx': "\u211E",
+ 'sacute': "\u015B",
+ 'Sacute': "\u015A",
+ 'sbquo': "\u201A",
+ 'sc': "\u227B",
+ 'Sc': "\u2ABC",
+ 'scap': "\u2AB8",
+ 'scaron': "\u0161",
+ 'Scaron': "\u0160",
+ 'sccue': "\u227D",
+ 'sce': "\u2AB0",
+ 'scE': "\u2AB4",
+ 'scedil': "\u015F",
+ 'Scedil': "\u015E",
+ 'scirc': "\u015D",
+ 'Scirc': "\u015C",
+ 'scnap': "\u2ABA",
+ 'scnE': "\u2AB6",
+ 'scnsim': "\u22E9",
+ 'scpolint': "\u2A13",
+ 'scsim': "\u227F",
+ 'scy': "\u0441",
+ 'Scy': "\u0421",
+ 'sdot': "\u22C5",
+ 'sdotb': "\u22A1",
+ 'sdote': "\u2A66",
+ 'searhk': "\u2925",
+ 'searr': "\u2198",
+ 'seArr': "\u21D8",
+ 'searrow': "\u2198",
+ 'sect': '\xA7',
+ 'semi': ';',
+ 'seswar': "\u2929",
+ 'setminus': "\u2216",
+ 'setmn': "\u2216",
+ 'sext': "\u2736",
+ 'sfr': "\uD835\uDD30",
+ 'Sfr': "\uD835\uDD16",
+ 'sfrown': "\u2322",
+ 'sharp': "\u266F",
+ 'shchcy': "\u0449",
+ 'SHCHcy': "\u0429",
+ 'shcy': "\u0448",
+ 'SHcy': "\u0428",
+ 'ShortDownArrow': "\u2193",
+ 'ShortLeftArrow': "\u2190",
+ 'shortmid': "\u2223",
+ 'shortparallel': "\u2225",
+ 'ShortRightArrow': "\u2192",
+ 'ShortUpArrow': "\u2191",
+ 'shy': '\xAD',
+ 'sigma': "\u03C3",
+ 'Sigma': "\u03A3",
+ 'sigmaf': "\u03C2",
+ 'sigmav': "\u03C2",
+ 'sim': "\u223C",
+ 'simdot': "\u2A6A",
+ 'sime': "\u2243",
+ 'simeq': "\u2243",
+ 'simg': "\u2A9E",
+ 'simgE': "\u2AA0",
+ 'siml': "\u2A9D",
+ 'simlE': "\u2A9F",
+ 'simne': "\u2246",
+ 'simplus': "\u2A24",
+ 'simrarr': "\u2972",
+ 'slarr': "\u2190",
+ 'SmallCircle': "\u2218",
+ 'smallsetminus': "\u2216",
+ 'smashp': "\u2A33",
+ 'smeparsl': "\u29E4",
+ 'smid': "\u2223",
+ 'smile': "\u2323",
+ 'smt': "\u2AAA",
+ 'smte': "\u2AAC",
+ 'smtes': "\u2AAC\uFE00",
+ 'softcy': "\u044C",
+ 'SOFTcy': "\u042C",
+ 'sol': '/',
+ 'solb': "\u29C4",
+ 'solbar': "\u233F",
+ 'sopf': "\uD835\uDD64",
+ 'Sopf': "\uD835\uDD4A",
+ 'spades': "\u2660",
+ 'spadesuit': "\u2660",
+ 'spar': "\u2225",
+ 'sqcap': "\u2293",
+ 'sqcaps': "\u2293\uFE00",
+ 'sqcup': "\u2294",
+ 'sqcups': "\u2294\uFE00",
+ 'Sqrt': "\u221A",
+ 'sqsub': "\u228F",
+ 'sqsube': "\u2291",
+ 'sqsubset': "\u228F",
+ 'sqsubseteq': "\u2291",
+ 'sqsup': "\u2290",
+ 'sqsupe': "\u2292",
+ 'sqsupset': "\u2290",
+ 'sqsupseteq': "\u2292",
+ 'squ': "\u25A1",
+ 'square': "\u25A1",
+ 'Square': "\u25A1",
+ 'SquareIntersection': "\u2293",
+ 'SquareSubset': "\u228F",
+ 'SquareSubsetEqual': "\u2291",
+ 'SquareSuperset': "\u2290",
+ 'SquareSupersetEqual': "\u2292",
+ 'SquareUnion': "\u2294",
+ 'squarf': "\u25AA",
+ 'squf': "\u25AA",
+ 'srarr': "\u2192",
+ 'sscr': "\uD835\uDCC8",
+ 'Sscr': "\uD835\uDCAE",
+ 'ssetmn': "\u2216",
+ 'ssmile': "\u2323",
+ 'sstarf': "\u22C6",
+ 'star': "\u2606",
+ 'Star': "\u22C6",
+ 'starf': "\u2605",
+ 'straightepsilon': "\u03F5",
+ 'straightphi': "\u03D5",
+ 'strns': '\xAF',
+ 'sub': "\u2282",
+ 'Sub': "\u22D0",
+ 'subdot': "\u2ABD",
+ 'sube': "\u2286",
+ 'subE': "\u2AC5",
+ 'subedot': "\u2AC3",
+ 'submult': "\u2AC1",
+ 'subne': "\u228A",
+ 'subnE': "\u2ACB",
+ 'subplus': "\u2ABF",
+ 'subrarr': "\u2979",
+ 'subset': "\u2282",
+ 'Subset': "\u22D0",
+ 'subseteq': "\u2286",
+ 'subseteqq': "\u2AC5",
+ 'SubsetEqual': "\u2286",
+ 'subsetneq': "\u228A",
+ 'subsetneqq': "\u2ACB",
+ 'subsim': "\u2AC7",
+ 'subsub': "\u2AD5",
+ 'subsup': "\u2AD3",
+ 'succ': "\u227B",
+ 'succapprox': "\u2AB8",
+ 'succcurlyeq': "\u227D",
+ 'Succeeds': "\u227B",
+ 'SucceedsEqual': "\u2AB0",
+ 'SucceedsSlantEqual': "\u227D",
+ 'SucceedsTilde': "\u227F",
+ 'succeq': "\u2AB0",
+ 'succnapprox': "\u2ABA",
+ 'succneqq': "\u2AB6",
+ 'succnsim': "\u22E9",
+ 'succsim': "\u227F",
+ 'SuchThat': "\u220B",
+ 'sum': "\u2211",
+ 'Sum': "\u2211",
+ 'sung': "\u266A",
+ 'sup': "\u2283",
+ 'Sup': "\u22D1",
+ 'sup1': '\xB9',
+ 'sup2': '\xB2',
+ 'sup3': '\xB3',
+ 'supdot': "\u2ABE",
+ 'supdsub': "\u2AD8",
+ 'supe': "\u2287",
+ 'supE': "\u2AC6",
+ 'supedot': "\u2AC4",
+ 'Superset': "\u2283",
+ 'SupersetEqual': "\u2287",
+ 'suphsol': "\u27C9",
+ 'suphsub': "\u2AD7",
+ 'suplarr': "\u297B",
+ 'supmult': "\u2AC2",
+ 'supne': "\u228B",
+ 'supnE': "\u2ACC",
+ 'supplus': "\u2AC0",
+ 'supset': "\u2283",
+ 'Supset': "\u22D1",
+ 'supseteq': "\u2287",
+ 'supseteqq': "\u2AC6",
+ 'supsetneq': "\u228B",
+ 'supsetneqq': "\u2ACC",
+ 'supsim': "\u2AC8",
+ 'supsub': "\u2AD4",
+ 'supsup': "\u2AD6",
+ 'swarhk': "\u2926",
+ 'swarr': "\u2199",
+ 'swArr': "\u21D9",
+ 'swarrow': "\u2199",
+ 'swnwar': "\u292A",
+ 'szlig': '\xDF',
+ 'Tab': '\t',
+ 'target': "\u2316",
+ 'tau': "\u03C4",
+ 'Tau': "\u03A4",
+ 'tbrk': "\u23B4",
+ 'tcaron': "\u0165",
+ 'Tcaron': "\u0164",
+ 'tcedil': "\u0163",
+ 'Tcedil': "\u0162",
+ 'tcy': "\u0442",
+ 'Tcy': "\u0422",
+ 'tdot': "\u20DB",
+ 'telrec': "\u2315",
+ 'tfr': "\uD835\uDD31",
+ 'Tfr': "\uD835\uDD17",
+ 'there4': "\u2234",
+ 'therefore': "\u2234",
+ 'Therefore': "\u2234",
+ 'theta': "\u03B8",
+ 'Theta': "\u0398",
+ 'thetasym': "\u03D1",
+ 'thetav': "\u03D1",
+ 'thickapprox': "\u2248",
+ 'thicksim': "\u223C",
+ 'ThickSpace': "\u205F\u200A",
+ 'thinsp': "\u2009",
+ 'ThinSpace': "\u2009",
+ 'thkap': "\u2248",
+ 'thksim': "\u223C",
+ 'thorn': '\xFE',
+ 'THORN': '\xDE',
+ 'tilde': "\u02DC",
+ 'Tilde': "\u223C",
+ 'TildeEqual': "\u2243",
+ 'TildeFullEqual': "\u2245",
+ 'TildeTilde': "\u2248",
+ 'times': '\xD7',
+ 'timesb': "\u22A0",
+ 'timesbar': "\u2A31",
+ 'timesd': "\u2A30",
+ 'tint': "\u222D",
+ 'toea': "\u2928",
+ 'top': "\u22A4",
+ 'topbot': "\u2336",
+ 'topcir': "\u2AF1",
+ 'topf': "\uD835\uDD65",
+ 'Topf': "\uD835\uDD4B",
+ 'topfork': "\u2ADA",
+ 'tosa': "\u2929",
+ 'tprime': "\u2034",
+ 'trade': "\u2122",
+ 'TRADE': "\u2122",
+ 'triangle': "\u25B5",
+ 'triangledown': "\u25BF",
+ 'triangleleft': "\u25C3",
+ 'trianglelefteq': "\u22B4",
+ 'triangleq': "\u225C",
+ 'triangleright': "\u25B9",
+ 'trianglerighteq': "\u22B5",
+ 'tridot': "\u25EC",
+ 'trie': "\u225C",
+ 'triminus': "\u2A3A",
+ 'TripleDot': "\u20DB",
+ 'triplus': "\u2A39",
+ 'trisb': "\u29CD",
+ 'tritime': "\u2A3B",
+ 'trpezium': "\u23E2",
+ 'tscr': "\uD835\uDCC9",
+ 'Tscr': "\uD835\uDCAF",
+ 'tscy': "\u0446",
+ 'TScy': "\u0426",
+ 'tshcy': "\u045B",
+ 'TSHcy': "\u040B",
+ 'tstrok': "\u0167",
+ 'Tstrok': "\u0166",
+ 'twixt': "\u226C",
+ 'twoheadleftarrow': "\u219E",
+ 'twoheadrightarrow': "\u21A0",
+ 'uacute': '\xFA',
+ 'Uacute': '\xDA',
+ 'uarr': "\u2191",
+ 'uArr': "\u21D1",
+ 'Uarr': "\u219F",
+ 'Uarrocir': "\u2949",
+ 'ubrcy': "\u045E",
+ 'Ubrcy': "\u040E",
+ 'ubreve': "\u016D",
+ 'Ubreve': "\u016C",
+ 'ucirc': '\xFB',
+ 'Ucirc': '\xDB',
+ 'ucy': "\u0443",
+ 'Ucy': "\u0423",
+ 'udarr': "\u21C5",
+ 'udblac': "\u0171",
+ 'Udblac': "\u0170",
+ 'udhar': "\u296E",
+ 'ufisht': "\u297E",
+ 'ufr': "\uD835\uDD32",
+ 'Ufr': "\uD835\uDD18",
+ 'ugrave': '\xF9',
+ 'Ugrave': '\xD9',
+ 'uHar': "\u2963",
+ 'uharl': "\u21BF",
+ 'uharr': "\u21BE",
+ 'uhblk': "\u2580",
+ 'ulcorn': "\u231C",
+ 'ulcorner': "\u231C",
+ 'ulcrop': "\u230F",
+ 'ultri': "\u25F8",
+ 'umacr': "\u016B",
+ 'Umacr': "\u016A",
+ 'uml': '\xA8',
+ 'UnderBar': '_',
+ 'UnderBrace': "\u23DF",
+ 'UnderBracket': "\u23B5",
+ 'UnderParenthesis': "\u23DD",
+ 'Union': "\u22C3",
+ 'UnionPlus': "\u228E",
+ 'uogon': "\u0173",
+ 'Uogon': "\u0172",
+ 'uopf': "\uD835\uDD66",
+ 'Uopf': "\uD835\uDD4C",
+ 'uparrow': "\u2191",
+ 'Uparrow': "\u21D1",
+ 'UpArrow': "\u2191",
+ 'UpArrowBar': "\u2912",
+ 'UpArrowDownArrow': "\u21C5",
+ 'updownarrow': "\u2195",
+ 'Updownarrow': "\u21D5",
+ 'UpDownArrow': "\u2195",
+ 'UpEquilibrium': "\u296E",
+ 'upharpoonleft': "\u21BF",
+ 'upharpoonright': "\u21BE",
+ 'uplus': "\u228E",
+ 'UpperLeftArrow': "\u2196",
+ 'UpperRightArrow': "\u2197",
+ 'upsi': "\u03C5",
+ 'Upsi': "\u03D2",
+ 'upsih': "\u03D2",
+ 'upsilon': "\u03C5",
+ 'Upsilon': "\u03A5",
+ 'UpTee': "\u22A5",
+ 'UpTeeArrow': "\u21A5",
+ 'upuparrows': "\u21C8",
+ 'urcorn': "\u231D",
+ 'urcorner': "\u231D",
+ 'urcrop': "\u230E",
+ 'uring': "\u016F",
+ 'Uring': "\u016E",
+ 'urtri': "\u25F9",
+ 'uscr': "\uD835\uDCCA",
+ 'Uscr': "\uD835\uDCB0",
+ 'utdot': "\u22F0",
+ 'utilde': "\u0169",
+ 'Utilde': "\u0168",
+ 'utri': "\u25B5",
+ 'utrif': "\u25B4",
+ 'uuarr': "\u21C8",
+ 'uuml': '\xFC',
+ 'Uuml': '\xDC',
+ 'uwangle': "\u29A7",
+ 'vangrt': "\u299C",
+ 'varepsilon': "\u03F5",
+ 'varkappa': "\u03F0",
+ 'varnothing': "\u2205",
+ 'varphi': "\u03D5",
+ 'varpi': "\u03D6",
+ 'varpropto': "\u221D",
+ 'varr': "\u2195",
+ 'vArr': "\u21D5",
+ 'varrho': "\u03F1",
+ 'varsigma': "\u03C2",
+ 'varsubsetneq': "\u228A\uFE00",
+ 'varsubsetneqq': "\u2ACB\uFE00",
+ 'varsupsetneq': "\u228B\uFE00",
+ 'varsupsetneqq': "\u2ACC\uFE00",
+ 'vartheta': "\u03D1",
+ 'vartriangleleft': "\u22B2",
+ 'vartriangleright': "\u22B3",
+ 'vBar': "\u2AE8",
+ 'Vbar': "\u2AEB",
+ 'vBarv': "\u2AE9",
+ 'vcy': "\u0432",
+ 'Vcy': "\u0412",
+ 'vdash': "\u22A2",
+ 'vDash': "\u22A8",
+ 'Vdash': "\u22A9",
+ 'VDash': "\u22AB",
+ 'Vdashl': "\u2AE6",
+ 'vee': "\u2228",
+ 'Vee': "\u22C1",
+ 'veebar': "\u22BB",
+ 'veeeq': "\u225A",
+ 'vellip': "\u22EE",
+ 'verbar': '|',
+ 'Verbar': "\u2016",
+ 'vert': '|',
+ 'Vert': "\u2016",
+ 'VerticalBar': "\u2223",
+ 'VerticalLine': '|',
+ 'VerticalSeparator': "\u2758",
+ 'VerticalTilde': "\u2240",
+ 'VeryThinSpace': "\u200A",
+ 'vfr': "\uD835\uDD33",
+ 'Vfr': "\uD835\uDD19",
+ 'vltri': "\u22B2",
+ 'vnsub': "\u2282\u20D2",
+ 'vnsup': "\u2283\u20D2",
+ 'vopf': "\uD835\uDD67",
+ 'Vopf': "\uD835\uDD4D",
+ 'vprop': "\u221D",
+ 'vrtri': "\u22B3",
+ 'vscr': "\uD835\uDCCB",
+ 'Vscr': "\uD835\uDCB1",
+ 'vsubne': "\u228A\uFE00",
+ 'vsubnE': "\u2ACB\uFE00",
+ 'vsupne': "\u228B\uFE00",
+ 'vsupnE': "\u2ACC\uFE00",
+ 'Vvdash': "\u22AA",
+ 'vzigzag': "\u299A",
+ 'wcirc': "\u0175",
+ 'Wcirc': "\u0174",
+ 'wedbar': "\u2A5F",
+ 'wedge': "\u2227",
+ 'Wedge': "\u22C0",
+ 'wedgeq': "\u2259",
+ 'weierp': "\u2118",
+ 'wfr': "\uD835\uDD34",
+ 'Wfr': "\uD835\uDD1A",
+ 'wopf': "\uD835\uDD68",
+ 'Wopf': "\uD835\uDD4E",
+ 'wp': "\u2118",
+ 'wr': "\u2240",
+ 'wreath': "\u2240",
+ 'wscr': "\uD835\uDCCC",
+ 'Wscr': "\uD835\uDCB2",
+ 'xcap': "\u22C2",
+ 'xcirc': "\u25EF",
+ 'xcup': "\u22C3",
+ 'xdtri': "\u25BD",
+ 'xfr': "\uD835\uDD35",
+ 'Xfr': "\uD835\uDD1B",
+ 'xharr': "\u27F7",
+ 'xhArr': "\u27FA",
+ 'xi': "\u03BE",
+ 'Xi': "\u039E",
+ 'xlarr': "\u27F5",
+ 'xlArr': "\u27F8",
+ 'xmap': "\u27FC",
+ 'xnis': "\u22FB",
+ 'xodot': "\u2A00",
+ 'xopf': "\uD835\uDD69",
+ 'Xopf': "\uD835\uDD4F",
+ 'xoplus': "\u2A01",
+ 'xotime': "\u2A02",
+ 'xrarr': "\u27F6",
+ 'xrArr': "\u27F9",
+ 'xscr': "\uD835\uDCCD",
+ 'Xscr': "\uD835\uDCB3",
+ 'xsqcup': "\u2A06",
+ 'xuplus': "\u2A04",
+ 'xutri': "\u25B3",
+ 'xvee': "\u22C1",
+ 'xwedge': "\u22C0",
+ 'yacute': '\xFD',
+ 'Yacute': '\xDD',
+ 'yacy': "\u044F",
+ 'YAcy': "\u042F",
+ 'ycirc': "\u0177",
+ 'Ycirc': "\u0176",
+ 'ycy': "\u044B",
+ 'Ycy': "\u042B",
+ 'yen': '\xA5',
+ 'yfr': "\uD835\uDD36",
+ 'Yfr': "\uD835\uDD1C",
+ 'yicy': "\u0457",
+ 'YIcy': "\u0407",
+ 'yopf': "\uD835\uDD6A",
+ 'Yopf': "\uD835\uDD50",
+ 'yscr': "\uD835\uDCCE",
+ 'Yscr': "\uD835\uDCB4",
+ 'yucy': "\u044E",
+ 'YUcy': "\u042E",
+ 'yuml': '\xFF',
+ 'Yuml': "\u0178",
+ 'zacute': "\u017A",
+ 'Zacute': "\u0179",
+ 'zcaron': "\u017E",
+ 'Zcaron': "\u017D",
+ 'zcy': "\u0437",
+ 'Zcy': "\u0417",
+ 'zdot': "\u017C",
+ 'Zdot': "\u017B",
+ 'zeetrf': "\u2128",
+ 'ZeroWidthSpace': "\u200B",
+ 'zeta': "\u03B6",
+ 'Zeta': "\u0396",
+ 'zfr': "\uD835\uDD37",
+ 'Zfr': "\u2128",
+ 'zhcy': "\u0436",
+ 'ZHcy': "\u0416",
+ 'zigrarr': "\u21DD",
+ 'zopf': "\uD835\uDD6B",
+ 'Zopf': "\u2124",
+ 'zscr': "\uD835\uDCCF",
+ 'Zscr': "\uD835\uDCB5",
+ 'zwj': "\u200D",
+ 'zwnj': "\u200C"
+ };
+ var decodeMapLegacy = {
+ 'aacute': '\xE1',
+ 'Aacute': '\xC1',
+ 'acirc': '\xE2',
+ 'Acirc': '\xC2',
+ 'acute': '\xB4',
+ 'aelig': '\xE6',
+ 'AElig': '\xC6',
+ 'agrave': '\xE0',
+ 'Agrave': '\xC0',
+ 'amp': '&',
+ 'AMP': '&',
+ 'aring': '\xE5',
+ 'Aring': '\xC5',
+ 'atilde': '\xE3',
+ 'Atilde': '\xC3',
+ 'auml': '\xE4',
+ 'Auml': '\xC4',
+ 'brvbar': '\xA6',
+ 'ccedil': '\xE7',
+ 'Ccedil': '\xC7',
+ 'cedil': '\xB8',
+ 'cent': '\xA2',
+ 'copy': '\xA9',
+ 'COPY': '\xA9',
+ 'curren': '\xA4',
+ 'deg': '\xB0',
+ 'divide': '\xF7',
+ 'eacute': '\xE9',
+ 'Eacute': '\xC9',
+ 'ecirc': '\xEA',
+ 'Ecirc': '\xCA',
+ 'egrave': '\xE8',
+ 'Egrave': '\xC8',
+ 'eth': '\xF0',
+ 'ETH': '\xD0',
+ 'euml': '\xEB',
+ 'Euml': '\xCB',
+ 'frac12': '\xBD',
+ 'frac14': '\xBC',
+ 'frac34': '\xBE',
+ 'gt': '>',
+ 'GT': '>',
+ 'iacute': '\xED',
+ 'Iacute': '\xCD',
+ 'icirc': '\xEE',
+ 'Icirc': '\xCE',
+ 'iexcl': '\xA1',
+ 'igrave': '\xEC',
+ 'Igrave': '\xCC',
+ 'iquest': '\xBF',
+ 'iuml': '\xEF',
+ 'Iuml': '\xCF',
+ 'laquo': '\xAB',
+ 'lt': '<',
+ 'LT': '<',
+ 'macr': '\xAF',
+ 'micro': '\xB5',
+ 'middot': '\xB7',
+ 'nbsp': '\xA0',
+ 'not': '\xAC',
+ 'ntilde': '\xF1',
+ 'Ntilde': '\xD1',
+ 'oacute': '\xF3',
+ 'Oacute': '\xD3',
+ 'ocirc': '\xF4',
+ 'Ocirc': '\xD4',
+ 'ograve': '\xF2',
+ 'Ograve': '\xD2',
+ 'ordf': '\xAA',
+ 'ordm': '\xBA',
+ 'oslash': '\xF8',
+ 'Oslash': '\xD8',
+ 'otilde': '\xF5',
+ 'Otilde': '\xD5',
+ 'ouml': '\xF6',
+ 'Ouml': '\xD6',
+ 'para': '\xB6',
+ 'plusmn': '\xB1',
+ 'pound': '\xA3',
+ 'quot': '"',
+ 'QUOT': '"',
+ 'raquo': '\xBB',
+ 'reg': '\xAE',
+ 'REG': '\xAE',
+ 'sect': '\xA7',
+ 'shy': '\xAD',
+ 'sup1': '\xB9',
+ 'sup2': '\xB2',
+ 'sup3': '\xB3',
+ 'szlig': '\xDF',
+ 'thorn': '\xFE',
+ 'THORN': '\xDE',
+ 'times': '\xD7',
+ 'uacute': '\xFA',
+ 'Uacute': '\xDA',
+ 'ucirc': '\xFB',
+ 'Ucirc': '\xDB',
+ 'ugrave': '\xF9',
+ 'Ugrave': '\xD9',
+ 'uml': '\xA8',
+ 'uuml': '\xFC',
+ 'Uuml': '\xDC',
+ 'yacute': '\xFD',
+ 'Yacute': '\xDD',
+ 'yen': '\xA5',
+ 'yuml': '\xFF'
+ };
+ var decodeMapNumeric = {
+ '0': "\uFFFD",
+ '128': "\u20AC",
+ '130': "\u201A",
+ '131': "\u0192",
+ '132': "\u201E",
+ '133': "\u2026",
+ '134': "\u2020",
+ '135': "\u2021",
+ '136': "\u02C6",
+ '137': "\u2030",
+ '138': "\u0160",
+ '139': "\u2039",
+ '140': "\u0152",
+ '142': "\u017D",
+ '145': "\u2018",
+ '146': "\u2019",
+ '147': "\u201C",
+ '148': "\u201D",
+ '149': "\u2022",
+ '150': "\u2013",
+ '151': "\u2014",
+ '152': "\u02DC",
+ '153': "\u2122",
+ '154': "\u0161",
+ '155': "\u203A",
+ '156': "\u0153",
+ '158': "\u017E",
+ '159': "\u0178"
+ };
+ var invalidReferenceCodePoints = [1, 2, 3, 4, 5, 6, 7, 8, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 64976, 64977, 64978, 64979, 64980, 64981, 64982, 64983, 64984, 64985, 64986, 64987, 64988, 64989, 64990, 64991, 64992, 64993, 64994, 64995, 64996, 64997, 64998, 64999, 65000, 65001, 65002, 65003, 65004, 65005, 65006, 65007, 65534, 65535, 131070, 131071, 196606, 196607, 262142, 262143, 327678, 327679, 393214, 393215, 458750, 458751, 524286, 524287, 589822, 589823, 655358, 655359, 720894, 720895, 786430, 786431, 851966, 851967, 917502, 917503, 983038, 983039, 1048574, 1048575, 1114110, 1114111];
+ /*--------------------------------------------------------------------------*/
+
+ var stringFromCharCode = String.fromCharCode;
+ var object = {};
+ var hasOwnProperty = object.hasOwnProperty;
+
+ var has = function has(object, propertyName) {
+ return hasOwnProperty.call(object, propertyName);
+ };
+
+ var contains = function contains(array, value) {
+ var index = -1;
+ var length = array.length;
+
+ while (++index < length) {
+ if (array[index] == value) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+
+ var merge = function merge(options, defaults) {
+ if (!options) {
+ return defaults;
+ }
+
+ var result = {};
+ var key;
+
+ for (key in defaults) {
+ // A `hasOwnProperty` check is not needed here, since only recognized
+ // option names are used anyway. Any others are ignored.
+ result[key] = has(options, key) ? options[key] : defaults[key];
+ }
+
+ return result;
+ }; // Modified version of `ucs2encode`; see https://mths.be/punycode.
+
+
+ var codePointToSymbol = function codePointToSymbol(codePoint, strict) {
+ var output = '';
+
+ if (codePoint >= 0xD800 && codePoint <= 0xDFFF || codePoint > 0x10FFFF) {
+ // See issue #4:
+ // “Otherwise, if the number is in the range 0xD800 to 0xDFFF or is
+ // greater than 0x10FFFF, then this is a parse error. Return a U+FFFD
+ // REPLACEMENT CHARACTER.”
+ if (strict) {
+ parseError('character reference outside the permissible Unicode range');
+ }
+
+ return "\uFFFD";
+ }
+
+ if (has(decodeMapNumeric, codePoint)) {
+ if (strict) {
+ parseError('disallowed character reference');
+ }
+
+ return decodeMapNumeric[codePoint];
+ }
+
+ if (strict && contains(invalidReferenceCodePoints, codePoint)) {
+ parseError('disallowed character reference');
+ }
+
+ if (codePoint > 0xFFFF) {
+ codePoint -= 0x10000;
+ output += stringFromCharCode(codePoint >>> 10 & 0x3FF | 0xD800);
+ codePoint = 0xDC00 | codePoint & 0x3FF;
+ }
+
+ output += stringFromCharCode(codePoint);
+ return output;
+ };
+
+ var hexEscape = function hexEscape(codePoint) {
+ return '' + codePoint.toString(16).toUpperCase() + ';';
+ };
+
+ var decEscape = function decEscape(codePoint) {
+ return '' + codePoint + ';';
+ };
+
+ var parseError = function parseError(message) {
+ throw Error('Parse error: ' + message);
+ };
+ /*--------------------------------------------------------------------------*/
+
+
+ var encode = function encode(string, options) {
+ options = merge(options, encode.options);
+ var strict = options.strict;
+
+ if (strict && regexInvalidRawCodePoint.test(string)) {
+ parseError('forbidden code point');
+ }
+
+ var encodeEverything = options.encodeEverything;
+ var useNamedReferences = options.useNamedReferences;
+ var allowUnsafeSymbols = options.allowUnsafeSymbols;
+ var escapeCodePoint = options.decimal ? decEscape : hexEscape;
+
+ var escapeBmpSymbol = function escapeBmpSymbol(symbol) {
+ return escapeCodePoint(symbol.charCodeAt(0));
+ };
+
+ if (encodeEverything) {
+ // Encode ASCII symbols.
+ string = string.replace(regexAsciiWhitelist, function (symbol) {
+ // Use named references if requested & possible.
+ if (useNamedReferences && has(encodeMap, symbol)) {
+ return '&' + encodeMap[symbol] + ';';
+ }
+
+ return escapeBmpSymbol(symbol);
+ }); // Shorten a few escapes that represent two symbols, of which at least one
+ // is within the ASCII range.
+
+ if (useNamedReferences) {
+ string = string.replace(/>\u20D2/g, '>⃒').replace(/<\u20D2/g, '<⃒').replace(/fj/g, 'fj');
+ } // Encode non-ASCII symbols.
+
+
+ if (useNamedReferences) {
+ // Encode non-ASCII symbols that can be replaced with a named reference.
+ string = string.replace(regexEncodeNonAscii, function (string) {
+ // Note: there is no need to check `has(encodeMap, string)` here.
+ return '&' + encodeMap[string] + ';';
+ });
+ } // Note: any remaining non-ASCII symbols are handled outside of the `if`.
+
+ } else if (useNamedReferences) {
+ // Apply named character references.
+ // Encode `<>"'&` using named character references.
+ if (!allowUnsafeSymbols) {
+ string = string.replace(regexEscape, function (string) {
+ return '&' + encodeMap[string] + ';'; // no need to check `has()` here
+ });
+ } // Shorten escapes that represent two symbols, of which at least one is
+ // `<>"'&`.
+
+
+ string = string.replace(/>\u20D2/g, '>⃒').replace(/<\u20D2/g, '<⃒'); // Encode non-ASCII symbols that can be replaced with a named reference.
+
+ string = string.replace(regexEncodeNonAscii, function (string) {
+ // Note: there is no need to check `has(encodeMap, string)` here.
+ return '&' + encodeMap[string] + ';';
+ });
+ } else if (!allowUnsafeSymbols) {
+ // Encode `<>"'&` using hexadecimal escapes, now that they’re not handled
+ // using named character references.
+ string = string.replace(regexEscape, escapeBmpSymbol);
+ }
+
+ return string // Encode astral symbols.
+ .replace(regexAstralSymbols, function ($0) {
+ // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
+ var high = $0.charCodeAt(0);
+ var low = $0.charCodeAt(1);
+ var codePoint = (high - 0xD800) * 0x400 + low - 0xDC00 + 0x10000;
+ return escapeCodePoint(codePoint);
+ }) // Encode any remaining BMP symbols that are not printable ASCII symbols
+ // using a hexadecimal escape.
+ .replace(regexBmpWhitelist, escapeBmpSymbol);
+ }; // Expose default options (so they can be overridden globally).
+
+
+ encode.options = {
+ 'allowUnsafeSymbols': false,
+ 'encodeEverything': false,
+ 'strict': false,
+ 'useNamedReferences': false,
+ 'decimal': false
+ };
+
+ var decode = function decode(html, options) {
+ options = merge(options, decode.options);
+ var strict = options.strict;
+
+ if (strict && regexInvalidEntity.test(html)) {
+ parseError('malformed character reference');
+ }
+
+ return html.replace(regexDecode, function ($0, $1, $2, $3, $4, $5, $6, $7, $8) {
+ var codePoint;
+ var semicolon;
+ var decDigits;
+ var hexDigits;
+ var reference;
+ var next;
+
+ if ($1) {
+ reference = $1; // Note: there is no need to check `has(decodeMap, reference)`.
+
+ return decodeMap[reference];
+ }
+
+ if ($2) {
+ // Decode named character references without trailing `;`, e.g. `&`.
+ // This is only a parse error if it gets converted to `&`, or if it is
+ // followed by `=` in an attribute context.
+ reference = $2;
+ next = $3;
+
+ if (next && options.isAttributeValue) {
+ if (strict && next == '=') {
+ parseError('`&` did not start a character reference');
+ }
+
+ return $0;
+ } else {
+ if (strict) {
+ parseError('named character reference was not terminated by a semicolon');
+ } // Note: there is no need to check `has(decodeMapLegacy, reference)`.
+
+
+ return decodeMapLegacy[reference] + (next || '');
+ }
+ }
+
+ if ($4) {
+ // Decode decimal escapes, e.g. `𝌆`.
+ decDigits = $4;
+ semicolon = $5;
+
+ if (strict && !semicolon) {
+ parseError('character reference was not terminated by a semicolon');
+ }
+
+ codePoint = parseInt(decDigits, 10);
+ return codePointToSymbol(codePoint, strict);
+ }
+
+ if ($6) {
+ // Decode hexadecimal escapes, e.g. `𝌆`.
+ hexDigits = $6;
+ semicolon = $7;
+
+ if (strict && !semicolon) {
+ parseError('character reference was not terminated by a semicolon');
+ }
+
+ codePoint = parseInt(hexDigits, 16);
+ return codePointToSymbol(codePoint, strict);
+ } // If we’re still here, `if ($7)` is implied; it’s an ambiguous
+ // ampersand for sure. https://mths.be/notes/ambiguous-ampersands
+
+
+ if (strict) {
+ parseError('named character reference was not terminated by a semicolon');
+ }
+
+ return $0;
+ });
+ }; // Expose default options (so they can be overridden globally).
+
+
+ decode.options = {
+ 'isAttributeValue': false,
+ 'strict': false
+ };
+
+ var escape = function escape(string) {
+ return string.replace(regexEscape, function ($0) {
+ // Note: there is no need to check `has(escapeMap, $0)` here.
+ return escapeMap[$0];
+ });
+ };
+ /*--------------------------------------------------------------------------*/
+
+
+ var he = {
+ 'version': '1.2.0',
+ 'encode': encode,
+ 'decode': decode,
+ 'escape': escape,
+ 'unescape': decode
+ }; // Some AMD build optimizers, like r.js, check for specific condition patterns
+ // like the following:
+
+ if (freeExports && !freeExports.nodeType) {
+ if (freeModule) {
+ // in Node.js, io.js, or RingoJS v0.8.0+
+ freeModule.exports = he;
+ } else {
+ // in Narwhal or RingoJS v0.7.0-
+ for (var key in he) {
+ has(he, key) && (freeExports[key] = he[key]);
+ }
+ }
+ } else {
+ // in Rhino or a web browser
+ root.he = he;
+ }
+ })(commonjsGlobal);
+ });
+
+ var utils = createCommonjsModule(function (module, exports) {
+ /**
+ * Various utility functions used throughout Mocha's codebase.
+ * @module utils
+ */
+
+ /**
+ * Module dependencies.
+ */
+
+ var nanoid = nonSecure.nanoid;
+ var MOCHA_ID_PROP_NAME = '__mocha_id__';
+ /**
+ * Inherit the prototype methods from one constructor into another.
+ *
+ * @param {function} ctor - Constructor function which needs to inherit the
+ * prototype.
+ * @param {function} superCtor - Constructor function to inherit prototype from.
+ * @throws {TypeError} if either constructor is null, or if super constructor
+ * lacks a prototype.
+ */
+
+ exports.inherits = util.inherits;
+ /**
+ * Escape special characters in the given string of html.
+ *
+ * @private
+ * @param {string} html
+ * @return {string}
+ */
+
+ exports.escape = function (html) {
+ return he.encode(String(html), {
+ useNamedReferences: false
+ });
+ };
+ /**
+ * Test if the given obj is type of string.
+ *
+ * @private
+ * @param {Object} obj
+ * @return {boolean}
+ */
+
+
+ exports.isString = function (obj) {
+ return typeof obj === 'string';
+ };
+ /**
+ * Compute a slug from the given `str`.
+ *
+ * @private
+ * @param {string} str
+ * @return {string}
+ */
+
+
+ exports.slug = function (str) {
+ return str.toLowerCase().replace(/\s+/g, '-').replace(/[^-\w]/g, '').replace(/-{2,}/g, '-');
+ };
+ /**
+ * Strip the function definition from `str`, and re-indent for pre whitespace.
+ *
+ * @param {string} str
+ * @return {string}
+ */
+
+
+ exports.clean = function (str) {
+ str = str.replace(/\r\n?|[\n\u2028\u2029]/g, '\n').replace(/^\uFEFF/, '') // (traditional)-> space/name parameters body (lambda)-> parameters body multi-statement/single keep body content
+ .replace(/^function(?:\s*|\s+[^(]*)\([^)]*\)\s*\{((?:.|\n)*?)\s*\}$|^\([^)]*\)\s*=>\s*(?:\{((?:.|\n)*?)\s*\}|((?:.|\n)*))$/, '$1$2$3');
+ var spaces = str.match(/^\n?( *)/)[1].length;
+ var tabs = str.match(/^\n?(\t*)/)[1].length;
+ var re = new RegExp('^\n?' + (tabs ? '\t' : ' ') + '{' + (tabs || spaces) + '}', 'gm');
+ str = str.replace(re, '');
+ return str.trim();
+ };
+ /**
+ * If a value could have properties, and has none, this function is called,
+ * which returns a string representation of the empty value.
+ *
+ * Functions w/ no properties return `'[Function]'`
+ * Arrays w/ length === 0 return `'[]'`
+ * Objects w/ no properties return `'{}'`
+ * All else: return result of `value.toString()`
+ *
+ * @private
+ * @param {*} value The value to inspect.
+ * @param {string} typeHint The type of the value
+ * @returns {string}
+ */
+
+
+ function emptyRepresentation(value, typeHint) {
+ switch (typeHint) {
+ case 'function':
+ return '[Function]';
+
+ case 'object':
+ return '{}';
+
+ case 'array':
+ return '[]';
+
+ default:
+ return value.toString();
+ }
+ }
+ /**
+ * Takes some variable and asks `Object.prototype.toString()` what it thinks it
+ * is.
+ *
+ * @private
+ * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
+ * @param {*} value The value to test.
+ * @returns {string} Computed type
+ * @example
+ * canonicalType({}) // 'object'
+ * canonicalType([]) // 'array'
+ * canonicalType(1) // 'number'
+ * canonicalType(false) // 'boolean'
+ * canonicalType(Infinity) // 'number'
+ * canonicalType(null) // 'null'
+ * canonicalType(new Date()) // 'date'
+ * canonicalType(/foo/) // 'regexp'
+ * canonicalType('type') // 'string'
+ * canonicalType(global) // 'global'
+ * canonicalType(new String('foo') // 'object'
+ * canonicalType(async function() {}) // 'asyncfunction'
+ * canonicalType(await import(name)) // 'module'
+ */
+
+
+ var canonicalType = exports.canonicalType = function canonicalType(value) {
+ if (value === undefined) {
+ return 'undefined';
+ } else if (value === null) {
+ return 'null';
+ } else if (isBuffer$2(value)) {
+ return 'buffer';
+ }
+
+ return Object.prototype.toString.call(value).replace(/^\[.+\s(.+?)]$/, '$1').toLowerCase();
+ };
+ /**
+ *
+ * Returns a general type or data structure of a variable
+ * @private
+ * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
+ * @param {*} value The value to test.
+ * @returns {string} One of undefined, boolean, number, string, bigint, symbol, object
+ * @example
+ * type({}) // 'object'
+ * type([]) // 'array'
+ * type(1) // 'number'
+ * type(false) // 'boolean'
+ * type(Infinity) // 'number'
+ * type(null) // 'null'
+ * type(new Date()) // 'object'
+ * type(/foo/) // 'object'
+ * type('type') // 'string'
+ * type(global) // 'object'
+ * type(new String('foo') // 'string'
+ */
+
+
+ exports.type = function type(value) {
+ // Null is special
+ if (value === null) return 'null';
+ var primitives = new Set(['undefined', 'boolean', 'number', 'string', 'bigint', 'symbol']);
+
+ var _type = _typeof(value);
+
+ if (_type === 'function') return _type;
+ if (primitives.has(_type)) return _type;
+ if (value instanceof String) return 'string';
+ if (value instanceof Error) return 'error';
+ if (Array.isArray(value)) return 'array';
+ return _type;
+ };
+ /**
+ * Stringify `value`. Different behavior depending on type of value:
+ *
+ * - If `value` is undefined or null, return `'[undefined]'` or `'[null]'`, respectively.
+ * - If `value` is not an object, function or array, return result of `value.toString()` wrapped in double-quotes.
+ * - If `value` is an *empty* object, function, or array, return result of function
+ * {@link emptyRepresentation}.
+ * - If `value` has properties, call {@link exports.canonicalize} on it, then return result of
+ * JSON.stringify().
+ *
+ * @private
+ * @see exports.type
+ * @param {*} value
+ * @return {string}
+ */
+
+
+ exports.stringify = function (value) {
+ var typeHint = canonicalType(value);
+
+ if (!~['object', 'array', 'function'].indexOf(typeHint)) {
+ if (typeHint === 'buffer') {
+ var json = Buffer$1.prototype.toJSON.call(value); // Based on the toJSON result
+
+ return jsonStringify(json.data && json.type ? json.data : json, 2).replace(/,(\n|$)/g, '$1');
+ } // IE7/IE8 has a bizarre String constructor; needs to be coerced
+ // into an array and back to obj.
+
+
+ if (typeHint === 'string' && _typeof(value) === 'object') {
+ value = value.split('').reduce(function (acc, _char, idx) {
+ acc[idx] = _char;
+ return acc;
+ }, {});
+ typeHint = 'object';
+ } else {
+ return jsonStringify(value);
+ }
+ }
+
+ for (var prop in value) {
+ if (Object.prototype.hasOwnProperty.call(value, prop)) {
+ return jsonStringify(exports.canonicalize(value, null, typeHint), 2).replace(/,(\n|$)/g, '$1');
+ }
+ }
+
+ return emptyRepresentation(value, typeHint);
+ };
+ /**
+ * like JSON.stringify but more sense.
+ *
+ * @private
+ * @param {Object} object
+ * @param {number=} spaces
+ * @param {number=} depth
+ * @returns {*}
+ */
+
+
+ function jsonStringify(object, spaces, depth) {
+ if (typeof spaces === 'undefined') {
+ // primitive types
+ return _stringify(object);
+ }
+
+ depth = depth || 1;
+ var space = spaces * depth;
+ var str = Array.isArray(object) ? '[' : '{';
+ var end = Array.isArray(object) ? ']' : '}';
+ var length = typeof object.length === 'number' ? object.length : Object.keys(object).length; // `.repeat()` polyfill
+
+ function repeat(s, n) {
+ return new Array(n).join(s);
+ }
+
+ function _stringify(val) {
+ switch (canonicalType(val)) {
+ case 'null':
+ case 'undefined':
+ val = '[' + val + ']';
+ break;
+
+ case 'array':
+ case 'object':
+ val = jsonStringify(val, spaces, depth + 1);
+ break;
+
+ case 'boolean':
+ case 'regexp':
+ case 'symbol':
+ case 'number':
+ val = val === 0 && 1 / val === -Infinity // `-0`
+ ? '-0' : val.toString();
+ break;
+
+ case 'bigint':
+ val = val.toString() + 'n';
+ break;
+
+ case 'date':
+ var sDate = isNaN(val.getTime()) ? val.toString() : val.toISOString();
+ val = '[Date: ' + sDate + ']';
+ break;
+
+ case 'buffer':
+ var json = val.toJSON(); // Based on the toJSON result
+
+ json = json.data && json.type ? json.data : json;
+ val = '[Buffer: ' + jsonStringify(json, 2, depth + 1) + ']';
+ break;
+
+ default:
+ val = val === '[Function]' || val === '[Circular]' ? val : JSON.stringify(val);
+ // string
+ }
+
+ return val;
+ }
+
+ for (var i in object) {
+ if (!Object.prototype.hasOwnProperty.call(object, i)) {
+ continue; // not my business
+ }
+
+ --length;
+ str += '\n ' + repeat(' ', space) + (Array.isArray(object) ? '' : '"' + i + '": ') + // key
+ _stringify(object[i]) + (length ? ',' : ''); // comma
+ }
+
+ return str + (str.length !== 1 ? '\n' + repeat(' ', --space) + end : end);
+ }
+ /**
+ * Return a new Thing that has the keys in sorted order. Recursive.
+ *
+ * If the Thing...
+ * - has already been seen, return string `'[Circular]'`
+ * - is `undefined`, return string `'[undefined]'`
+ * - is `null`, return value `null`
+ * - is some other primitive, return the value
+ * - is not a primitive or an `Array`, `Object`, or `Function`, return the value of the Thing's `toString()` method
+ * - is a non-empty `Array`, `Object`, or `Function`, return the result of calling this function again.
+ * - is an empty `Array`, `Object`, or `Function`, return the result of calling `emptyRepresentation()`
+ *
+ * @private
+ * @see {@link exports.stringify}
+ * @param {*} value Thing to inspect. May or may not have properties.
+ * @param {Array} [stack=[]] Stack of seen values
+ * @param {string} [typeHint] Type hint
+ * @return {(Object|Array|Function|string|undefined)}
+ */
+
+
+ exports.canonicalize = function canonicalize(value, stack, typeHint) {
+ var canonicalizedObj;
+ /* eslint-disable no-unused-vars */
+
+ var prop;
+ /* eslint-enable no-unused-vars */
+
+ typeHint = typeHint || canonicalType(value);
+
+ function withStack(value, fn) {
+ stack.push(value);
+ fn();
+ stack.pop();
+ }
+
+ stack = stack || [];
+
+ if (stack.indexOf(value) !== -1) {
+ return '[Circular]';
+ }
+
+ switch (typeHint) {
+ case 'undefined':
+ case 'buffer':
+ case 'null':
+ canonicalizedObj = value;
+ break;
+
+ case 'array':
+ withStack(value, function () {
+ canonicalizedObj = value.map(function (item) {
+ return exports.canonicalize(item, stack);
+ });
+ });
+ break;
+
+ case 'function':
+ /* eslint-disable-next-line no-unused-vars, no-unreachable-loop */
+ for (prop in value) {
+ canonicalizedObj = {};
+ break;
+ }
+ /* eslint-enable guard-for-in */
+
+
+ if (!canonicalizedObj) {
+ canonicalizedObj = emptyRepresentation(value, typeHint);
+ break;
+ }
+
+ /* falls through */
+
+ case 'object':
+ canonicalizedObj = canonicalizedObj || {};
+ withStack(value, function () {
+ Object.keys(value).sort().forEach(function (key) {
+ canonicalizedObj[key] = exports.canonicalize(value[key], stack);
+ });
+ });
+ break;
+
+ case 'date':
+ case 'number':
+ case 'regexp':
+ case 'boolean':
+ case 'symbol':
+ canonicalizedObj = value;
+ break;
+
+ default:
+ canonicalizedObj = value + '';
+ }
+
+ return canonicalizedObj;
+ };
+ /**
+ * @summary
+ * This Filter based on `mocha-clean` module.(see: `github.com/rstacruz/mocha-clean`)
+ * @description
+ * When invoking this function you get a filter function that get the Error.stack as an input,
+ * and return a prettify output.
+ * (i.e: strip Mocha and internal node functions from stack trace).
+ * @returns {Function}
+ */
+
+
+ exports.stackTraceFilter = function () {
+ // TODO: Replace with `process.browser`
+ var is = typeof document === 'undefined' ? {
+ node: true
+ } : {
+ browser: true
+ };
+ var slash = path.sep;
+ var cwd;
+
+ if (is.node) {
+ cwd = exports.cwd() + slash;
+ } else {
+ cwd = (typeof location === 'undefined' ? window.location : location).href.replace(/\/[^/]*$/, '/');
+ slash = '/';
+ }
+
+ function isMochaInternal(line) {
+ return ~line.indexOf('node_modules' + slash + 'mocha' + slash) || ~line.indexOf(slash + 'mocha.js') || ~line.indexOf(slash + 'mocha.min.js');
+ }
+
+ function isNodeInternal(line) {
+ return ~line.indexOf('(timers.js:') || ~line.indexOf('(events.js:') || ~line.indexOf('(node.js:') || ~line.indexOf('(module.js:') || ~line.indexOf('GeneratorFunctionPrototype.next (native)') || false;
+ }
+
+ return function (stack) {
+ stack = stack.split('\n');
+ stack = stack.reduce(function (list, line) {
+ if (isMochaInternal(line)) {
+ return list;
+ }
+
+ if (is.node && isNodeInternal(line)) {
+ return list;
+ } // Clean up cwd(absolute)
+
+
+ if (/:\d+:\d+\)?$/.test(line)) {
+ line = line.replace('(' + cwd, '(');
+ }
+
+ list.push(line);
+ return list;
+ }, []);
+ return stack.join('\n');
+ };
+ };
+ /**
+ * Crude, but effective.
+ * @public
+ * @param {*} value
+ * @returns {boolean} Whether or not `value` is a Promise
+ */
+
+
+ exports.isPromise = function isPromise(value) {
+ return _typeof(value) === 'object' && value !== null && typeof value.then === 'function';
+ };
+ /**
+ * Clamps a numeric value to an inclusive range.
+ *
+ * @param {number} value - Value to be clamped.
+ * @param {number[]} range - Two element array specifying [min, max] range.
+ * @returns {number} clamped value
+ */
+
+
+ exports.clamp = function clamp(value, range) {
+ return Math.min(Math.max(value, range[0]), range[1]);
+ };
+ /**
+ * It's a noop.
+ * @public
+ */
+
+
+ exports.noop = function () {};
+ /**
+ * Creates a map-like object.
+ *
+ * @description
+ * A "map" is an object with no prototype, for our purposes. In some cases
+ * this would be more appropriate than a `Map`, especially if your environment
+ * doesn't support it. Recommended for use in Mocha's public APIs.
+ *
+ * @public
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#Custom_and_Null_objects|MDN:Map}
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Custom_and_Null_objects|MDN:Object.create - Custom objects}
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Custom_and_Null_objects|MDN:Object.assign}
+ * @param {...*} [obj] - Arguments to `Object.assign()`.
+ * @returns {Object} An object with no prototype, having `...obj` properties
+ */
+
+
+ exports.createMap = function (obj) {
+ return Object.assign.apply(null, [Object.create(null)].concat(Array.prototype.slice.call(arguments)));
+ };
+ /**
+ * Creates a read-only map-like object.
+ *
+ * @description
+ * This differs from {@link module:utils.createMap createMap} only in that
+ * the argument must be non-empty, because the result is frozen.
+ *
+ * @see {@link module:utils.createMap createMap}
+ * @param {...*} [obj] - Arguments to `Object.assign()`.
+ * @returns {Object} A frozen object with no prototype, having `...obj` properties
+ * @throws {TypeError} if argument is not a non-empty object.
+ */
+
+
+ exports.defineConstants = function (obj) {
+ if (canonicalType(obj) !== 'object' || !Object.keys(obj).length) {
+ throw new TypeError('Invalid argument; expected a non-empty object');
+ }
+
+ return Object.freeze(exports.createMap(obj));
+ };
+ /**
+ * Returns current working directory
+ *
+ * Wrapper around `process.cwd()` for isolation
+ * @private
+ */
+
+
+ exports.cwd = function cwd() {
+ return process$4.cwd();
+ };
+ /**
+ * Returns `true` if Mocha is running in a browser.
+ * Checks for `process.browser`.
+ * @returns {boolean}
+ * @private
+ */
+
+
+ exports.isBrowser = function isBrowser() {
+ return Boolean(browser$2);
+ };
+ /*
+ * Casts `value` to an array; useful for optionally accepting array parameters
+ *
+ * It follows these rules, depending on `value`. If `value` is...
+ * 1. `undefined`: return an empty Array
+ * 2. `null`: return an array with a single `null` element
+ * 3. Any other object: return the value of `Array.from()` _if_ the object is iterable
+ * 4. otherwise: return an array with a single element, `value`
+ * @param {*} value - Something to cast to an Array
+ * @returns {Array<*>}
+ */
+
+
+ exports.castArray = function castArray(value) {
+ if (value === undefined) {
+ return [];
+ }
+
+ if (value === null) {
+ return [null];
+ }
+
+ if (_typeof(value) === 'object' && (typeof value[Symbol.iterator] === 'function' || value.length !== undefined)) {
+ return Array.from(value);
+ }
+
+ return [value];
+ };
+
+ exports.constants = exports.defineConstants({
+ MOCHA_ID_PROP_NAME: MOCHA_ID_PROP_NAME
+ });
+ /**
+ * Creates a new unique identifier
+ * @returns {string} Unique identifier
+ */
+
+ exports.uniqueID = function () {
+ return nanoid();
+ };
+
+ exports.assignNewMochaID = function (obj) {
+ var id = exports.uniqueID();
+ Object.defineProperty(obj, MOCHA_ID_PROP_NAME, {
+ get: function get() {
+ return id;
+ }
+ });
+ return obj;
+ };
+ /**
+ * Retrieves a Mocha ID from an object, if present.
+ * @param {*} [obj] - Object
+ * @returns {string|void}
+ */
+
+
+ exports.getMochaID = function (obj) {
+ return obj && _typeof(obj) === 'object' ? obj[MOCHA_ID_PROP_NAME] : undefined;
+ };
+ });
+
+ var _nodeResolve_empty = {};
+
+ var _nodeResolve_empty$1 = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ 'default': _nodeResolve_empty
+ });
+
+ var browser$1 = {
+ info: 'ℹ️',
+ success: '✅',
+ warning: '⚠️',
+ error: '❌️'
+ };
+
+ // `Map` constructor
+ // https://tc39.es/ecma262/#sec-map-objects
+ collection('Map', function (init) {
+ return function Map() { return init(this, arguments.length ? arguments[0] : undefined); };
+ }, collectionStrong);
+
+ /**
+ @module Pending
+ */
+
+ var pending = Pending;
+ /**
+ * Initialize a new `Pending` error with the given message.
+ *
+ * @param {string} message
+ */
+
+ function Pending(message) {
+ this.message = message;
+ }
+
+ /**
+ * Helpers.
+ */
+ var s = 1000;
+ var m = s * 60;
+ var h = m * 60;
+ var d = h * 24;
+ var w = d * 7;
+ var y = d * 365.25;
+ /**
+ * Parse or format the given `val`.
+ *
+ * Options:
+ *
+ * - `long` verbose formatting [false]
+ *
+ * @param {String|Number} val
+ * @param {Object} [options]
+ * @throws {Error} throw an error if val is not a non-empty string or a number
+ * @return {String|Number}
+ * @api public
+ */
+
+ var ms = function ms(val, options) {
+ options = options || {};
+
+ var type = _typeof(val);
+
+ if (type === 'string' && val.length > 0) {
+ return parse(val);
+ } else if (type === 'number' && isFinite(val)) {
+ return options["long"] ? fmtLong(val) : fmtShort(val);
+ }
+
+ throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val));
+ };
+ /**
+ * Parse the given `str` and return milliseconds.
+ *
+ * @param {String} str
+ * @return {Number}
+ * @api private
+ */
+
+
+ function parse(str) {
+ str = String(str);
+
+ if (str.length > 100) {
+ return;
+ }
+
+ var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);
+
+ if (!match) {
+ return;
+ }
+
+ var n = parseFloat(match[1]);
+ var type = (match[2] || 'ms').toLowerCase();
+
+ switch (type) {
+ case 'years':
+ case 'year':
+ case 'yrs':
+ case 'yr':
+ case 'y':
+ return n * y;
+
+ case 'weeks':
+ case 'week':
+ case 'w':
+ return n * w;
+
+ case 'days':
+ case 'day':
+ case 'd':
+ return n * d;
+
+ case 'hours':
+ case 'hour':
+ case 'hrs':
+ case 'hr':
+ case 'h':
+ return n * h;
+
+ case 'minutes':
+ case 'minute':
+ case 'mins':
+ case 'min':
+ case 'm':
+ return n * m;
+
+ case 'seconds':
+ case 'second':
+ case 'secs':
+ case 'sec':
+ case 's':
+ return n * s;
+
+ case 'milliseconds':
+ case 'millisecond':
+ case 'msecs':
+ case 'msec':
+ case 'ms':
+ return n;
+
+ default:
+ return undefined;
+ }
+ }
+ /**
+ * Short format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+
+ function fmtShort(ms) {
+ var msAbs = Math.abs(ms);
+
+ if (msAbs >= d) {
+ return Math.round(ms / d) + 'd';
+ }
+
+ if (msAbs >= h) {
+ return Math.round(ms / h) + 'h';
+ }
+
+ if (msAbs >= m) {
+ return Math.round(ms / m) + 'm';
+ }
+
+ if (msAbs >= s) {
+ return Math.round(ms / s) + 's';
+ }
+
+ return ms + 'ms';
+ }
+ /**
+ * Long format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+
+ function fmtLong(ms) {
+ var msAbs = Math.abs(ms);
+
+ if (msAbs >= d) {
+ return plural(ms, msAbs, d, 'day');
+ }
+
+ if (msAbs >= h) {
+ return plural(ms, msAbs, h, 'hour');
+ }
+
+ if (msAbs >= m) {
+ return plural(ms, msAbs, m, 'minute');
+ }
+
+ if (msAbs >= s) {
+ return plural(ms, msAbs, s, 'second');
+ }
+
+ return ms + ' ms';
+ }
+ /**
+ * Pluralization helper.
+ */
+
+
+ function plural(ms, msAbs, n, name) {
+ var isPlural = msAbs >= n * 1.5;
+ return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
+ }
+
+ /**
+ * This is the common logic for both the Node.js and web browser
+ * implementations of `debug()`.
+ */
+
+ function setup(env) {
+ createDebug.debug = createDebug;
+ createDebug["default"] = createDebug;
+ createDebug.coerce = coerce;
+ createDebug.disable = disable;
+ createDebug.enable = enable;
+ createDebug.enabled = enabled;
+ createDebug.humanize = ms;
+ createDebug.destroy = destroy;
+ Object.keys(env).forEach(function (key) {
+ createDebug[key] = env[key];
+ });
+ /**
+ * The currently active debug mode names, and names to skip.
+ */
+
+ createDebug.names = [];
+ createDebug.skips = [];
+ /**
+ * Map of special "%n" handling functions, for the debug "format" argument.
+ *
+ * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
+ */
+
+ createDebug.formatters = {};
+ /**
+ * Selects a color for a debug namespace
+ * @param {String} namespace The namespace string for the for the debug instance to be colored
+ * @return {Number|String} An ANSI color code for the given namespace
+ * @api private
+ */
+
+ function selectColor(namespace) {
+ var hash = 0;
+
+ for (var i = 0; i < namespace.length; i++) {
+ hash = (hash << 5) - hash + namespace.charCodeAt(i);
+ hash |= 0; // Convert to 32bit integer
+ }
+
+ return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
+ }
+
+ createDebug.selectColor = selectColor;
+ /**
+ * Create a debugger with the given `namespace`.
+ *
+ * @param {String} namespace
+ * @return {Function}
+ * @api public
+ */
+
+ function createDebug(namespace) {
+ var prevTime;
+ var enableOverride = null;
+ var namespacesCache;
+ var enabledCache;
+
+ function debug() {
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ // Disabled?
+ if (!debug.enabled) {
+ return;
+ }
+
+ var self = debug; // Set `diff` timestamp
+
+ var curr = Number(new Date());
+ var ms = curr - (prevTime || curr);
+ self.diff = ms;
+ self.prev = prevTime;
+ self.curr = curr;
+ prevTime = curr;
+ args[0] = createDebug.coerce(args[0]);
+
+ if (typeof args[0] !== 'string') {
+ // Anything else let's inspect with %O
+ args.unshift('%O');
+ } // Apply any `formatters` transformations
+
+
+ var index = 0;
+ args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) {
+ // If we encounter an escaped % then don't increase the array index
+ if (match === '%%') {
+ return '%';
+ }
+
+ index++;
+ var formatter = createDebug.formatters[format];
+
+ if (typeof formatter === 'function') {
+ var val = args[index];
+ match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format`
+
+ args.splice(index, 1);
+ index--;
+ }
+
+ return match;
+ }); // Apply env-specific formatting (colors, etc.)
+
+ createDebug.formatArgs.call(self, args);
+ var logFn = self.log || createDebug.log;
+ logFn.apply(self, args);
+ }
+
+ debug.namespace = namespace;
+ debug.useColors = createDebug.useColors();
+ debug.color = createDebug.selectColor(namespace);
+ debug.extend = extend;
+ debug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.
+
+ Object.defineProperty(debug, 'enabled', {
+ enumerable: true,
+ configurable: false,
+ get: function get() {
+ if (enableOverride !== null) {
+ return enableOverride;
+ }
+
+ if (namespacesCache !== createDebug.namespaces) {
+ namespacesCache = createDebug.namespaces;
+ enabledCache = createDebug.enabled(namespace);
+ }
+
+ return enabledCache;
+ },
+ set: function set(v) {
+ enableOverride = v;
+ }
+ }); // Env-specific initialization logic for debug instances
+
+ if (typeof createDebug.init === 'function') {
+ createDebug.init(debug);
+ }
+
+ return debug;
+ }
+
+ function extend(namespace, delimiter) {
+ var newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
+ newDebug.log = this.log;
+ return newDebug;
+ }
+ /**
+ * Enables a debug mode by namespaces. This can include modes
+ * separated by a colon and wildcards.
+ *
+ * @param {String} namespaces
+ * @api public
+ */
+
+
+ function enable(namespaces) {
+ createDebug.save(namespaces);
+ createDebug.namespaces = namespaces;
+ createDebug.names = [];
+ createDebug.skips = [];
+ var i;
+ var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
+ var len = split.length;
+
+ for (i = 0; i < len; i++) {
+ if (!split[i]) {
+ // ignore empty strings
+ continue;
+ }
+
+ namespaces = split[i].replace(/\*/g, '.*?');
+
+ if (namespaces[0] === '-') {
+ createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
+ } else {
+ createDebug.names.push(new RegExp('^' + namespaces + '$'));
+ }
+ }
+ }
+ /**
+ * Disable debug output.
+ *
+ * @return {String} namespaces
+ * @api public
+ */
+
+
+ function disable() {
+ var namespaces = [].concat(_toConsumableArray(createDebug.names.map(toNamespace)), _toConsumableArray(createDebug.skips.map(toNamespace).map(function (namespace) {
+ return '-' + namespace;
+ }))).join(',');
+ createDebug.enable('');
+ return namespaces;
+ }
+ /**
+ * Returns true if the given mode name is enabled, false otherwise.
+ *
+ * @param {String} name
+ * @return {Boolean}
+ * @api public
+ */
+
+
+ function enabled(name) {
+ if (name[name.length - 1] === '*') {
+ return true;
+ }
+
+ var i;
+ var len;
+
+ for (i = 0, len = createDebug.skips.length; i < len; i++) {
+ if (createDebug.skips[i].test(name)) {
+ return false;
+ }
+ }
+
+ for (i = 0, len = createDebug.names.length; i < len; i++) {
+ if (createDebug.names[i].test(name)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+ /**
+ * Convert regexp to namespace
+ *
+ * @param {RegExp} regxep
+ * @return {String} namespace
+ * @api private
+ */
+
+
+ function toNamespace(regexp) {
+ return regexp.toString().substring(2, regexp.toString().length - 2).replace(/\.\*\?$/, '*');
+ }
+ /**
+ * Coerce `val`.
+ *
+ * @param {Mixed} val
+ * @return {Mixed}
+ * @api private
+ */
+
+
+ function coerce(val) {
+ if (val instanceof Error) {
+ return val.stack || val.message;
+ }
+
+ return val;
+ }
+ /**
+ * XXX DO NOT USE. This is a temporary stub function.
+ * XXX It WILL be removed in the next major release.
+ */
+
+
+ function destroy() {
+ console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
+ }
+
+ createDebug.enable(createDebug.load());
+ return createDebug;
+ }
+
+ var common$1 = setup;
+
+ var browser = createCommonjsModule(function (module, exports) {
+ /* eslint-env browser */
+
+ /**
+ * This is the web browser implementation of `debug()`.
+ */
+ exports.formatArgs = formatArgs;
+ exports.save = save;
+ exports.load = load;
+ exports.useColors = useColors;
+ exports.storage = localstorage();
+
+ exports.destroy = function () {
+ var warned = false;
+ return function () {
+ if (!warned) {
+ warned = true;
+ console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');
+ }
+ };
+ }();
+ /**
+ * Colors.
+ */
+
+
+ exports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'];
+ /**
+ * Currently only WebKit-based Web Inspectors, Firefox >= v31,
+ * and the Firebug extension (any Firefox version) are known
+ * to support "%c" CSS customizations.
+ *
+ * TODO: add a `localStorage` variable to explicitly enable/disable colors
+ */
+ // eslint-disable-next-line complexity
+
+ function useColors() {
+ // NB: In an Electron preload script, document will be defined but not fully
+ // initialized. Since we know we're in Chrome, we'll just detect this case
+ // explicitly
+ if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
+ return true;
+ } // Internet Explorer and Edge do not support colors.
+
+
+ if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
+ return false;
+ } // Is webkit? http://stackoverflow.com/a/16459606/376773
+ // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
+
+
+ return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
+ }
+ /**
+ * Colorize log arguments if enabled.
+ *
+ * @api public
+ */
+
+
+ function formatArgs(args) {
+ args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff);
+
+ if (!this.useColors) {
+ return;
+ }
+
+ var c = 'color: ' + this.color;
+ args.splice(1, 0, c, 'color: inherit'); // The final "%c" is somewhat tricky, because there could be other
+ // arguments passed either before or after the %c, so we need to
+ // figure out the correct index to insert the CSS into
+
+ var index = 0;
+ var lastC = 0;
+ args[0].replace(/%[a-zA-Z%]/g, function (match) {
+ if (match === '%%') {
+ return;
+ }
+
+ index++;
+
+ if (match === '%c') {
+ // We only are interested in the *last* %c
+ // (the user may have provided their own)
+ lastC = index;
+ }
+ });
+ args.splice(lastC, 0, c);
+ }
+ /**
+ * Invokes `console.debug()` when available.
+ * No-op when `console.debug` is not a "function".
+ * If `console.debug` is not available, falls back
+ * to `console.log`.
+ *
+ * @api public
+ */
+
+
+ exports.log = console.debug || console.log || function () {};
+ /**
+ * Save `namespaces`.
+ *
+ * @param {String} namespaces
+ * @api private
+ */
+
+
+ function save(namespaces) {
+ try {
+ if (namespaces) {
+ exports.storage.setItem('debug', namespaces);
+ } else {
+ exports.storage.removeItem('debug');
+ }
+ } catch (error) {// Swallow
+ // XXX (@Qix-) should we be logging these?
+ }
+ }
+ /**
+ * Load `namespaces`.
+ *
+ * @return {String} returns the previously persisted debug modes
+ * @api private
+ */
+
+
+ function load() {
+ var r;
+
+ try {
+ r = exports.storage.getItem('debug');
+ } catch (error) {// Swallow
+ // XXX (@Qix-) should we be logging these?
+ } // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
+
+
+ if (!r && typeof process$4 !== 'undefined' && 'env' in process$4) {
+ r = process$4.env.DEBUG;
+ }
+
+ return r;
+ }
+ /**
+ * Localstorage attempts to return the localstorage.
+ *
+ * This is necessary because safari throws
+ * when a user disables cookies/localstorage
+ * and you attempt to access it.
+ *
+ * @return {LocalStorage}
+ * @api private
+ */
+
+
+ function localstorage() {
+ try {
+ // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
+ // The Browser also has localStorage in the global context.
+ return localStorage;
+ } catch (error) {// Swallow
+ // XXX (@Qix-) should we be logging these?
+ }
+ }
+
+ module.exports = common$1(exports);
+ var formatters = module.exports.formatters;
+ /**
+ * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
+ */
+
+ formatters.j = function (v) {
+ try {
+ return JSON.stringify(v);
+ } catch (error) {
+ return '[UnexpectedJSONParseError]: ' + error.message;
+ }
+ };
+ });
+
+ var propertyIsEnumerable = objectPropertyIsEnumerable.f;
+
+ // `Object.{ entries, values }` methods implementation
+ var createMethod = function (TO_ENTRIES) {
+ return function (it) {
+ var O = toIndexedObject(it);
+ var keys = objectKeys(O);
+ var length = keys.length;
+ var i = 0;
+ var result = [];
+ var key;
+ while (length > i) {
+ key = keys[i++];
+ if (!descriptors || propertyIsEnumerable.call(O, key)) {
+ result.push(TO_ENTRIES ? [key, O[key]] : O[key]);
+ }
+ }
+ return result;
+ };
+ };
+
+ var objectToArray = {
+ // `Object.entries` method
+ // https://tc39.es/ecma262/#sec-object.entries
+ entries: createMethod(true),
+ // `Object.values` method
+ // https://tc39.es/ecma262/#sec-object.values
+ values: createMethod(false)
+ };
+
+ var $values = objectToArray.values;
+
+ // `Object.values` method
+ // https://tc39.es/ecma262/#sec-object.values
+ _export({ target: 'Object', stat: true }, {
+ values: function values(O) {
+ return $values(O);
+ }
+ });
+
+ var format = util.format;
+ /**
+ * Contains error codes, factory functions to create throwable error objects,
+ * and warning/deprecation functions.
+ * @module
+ */
+
+ /**
+ * process.emitWarning or a polyfill
+ * @see https://nodejs.org/api/process.html#process_process_emitwarning_warning_options
+ * @ignore
+ */
+
+ var emitWarning = function emitWarning(msg, type) {
+ if (process$4.emitWarning) {
+ process$4.emitWarning(msg, type);
+ } else {
+ /* istanbul ignore next */
+ nextTick$1(function () {
+ console.warn(type + ': ' + msg);
+ });
+ }
+ };
+ /**
+ * Show a deprecation warning. Each distinct message is only displayed once.
+ * Ignores empty messages.
+ *
+ * @param {string} [msg] - Warning to print
+ * @private
+ */
+
+
+ var deprecate = function deprecate(msg) {
+ msg = String(msg);
+
+ if (msg && !deprecate.cache[msg]) {
+ deprecate.cache[msg] = true;
+ emitWarning(msg, 'DeprecationWarning');
+ }
+ };
+
+ deprecate.cache = {};
+ /**
+ * Show a generic warning.
+ * Ignores empty messages.
+ *
+ * @param {string} [msg] - Warning to print
+ * @private
+ */
+
+ var warn = function warn(msg) {
+ if (msg) {
+ emitWarning(msg);
+ }
+ };
+ /**
+ * When Mocha throws exceptions (or rejects `Promise`s), it attempts to assign a `code` property to the `Error` object, for easier handling. These are the potential values of `code`.
+ * @public
+ * @namespace
+ * @memberof module:lib/errors
+ */
+
+
+ var constants$4 = {
+ /**
+ * An unrecoverable error.
+ * @constant
+ * @default
+ */
+ FATAL: 'ERR_MOCHA_FATAL',
+
+ /**
+ * The type of an argument to a function call is invalid
+ * @constant
+ * @default
+ */
+ INVALID_ARG_TYPE: 'ERR_MOCHA_INVALID_ARG_TYPE',
+
+ /**
+ * The value of an argument to a function call is invalid
+ * @constant
+ * @default
+ */
+ INVALID_ARG_VALUE: 'ERR_MOCHA_INVALID_ARG_VALUE',
+
+ /**
+ * Something was thrown, but it wasn't an `Error`
+ * @constant
+ * @default
+ */
+ INVALID_EXCEPTION: 'ERR_MOCHA_INVALID_EXCEPTION',
+
+ /**
+ * An interface (e.g., `Mocha.interfaces`) is unknown or invalid
+ * @constant
+ * @default
+ */
+ INVALID_INTERFACE: 'ERR_MOCHA_INVALID_INTERFACE',
+
+ /**
+ * A reporter (.e.g, `Mocha.reporters`) is unknown or invalid
+ * @constant
+ * @default
+ */
+ INVALID_REPORTER: 'ERR_MOCHA_INVALID_REPORTER',
+
+ /**
+ * `done()` was called twice in a `Test` or `Hook` callback
+ * @constant
+ * @default
+ */
+ MULTIPLE_DONE: 'ERR_MOCHA_MULTIPLE_DONE',
+
+ /**
+ * No files matched the pattern provided by the user
+ * @constant
+ * @default
+ */
+ NO_FILES_MATCH_PATTERN: 'ERR_MOCHA_NO_FILES_MATCH_PATTERN',
+
+ /**
+ * Known, but unsupported behavior of some kind
+ * @constant
+ * @default
+ */
+ UNSUPPORTED: 'ERR_MOCHA_UNSUPPORTED',
+
+ /**
+ * Invalid state transition occurring in `Mocha` instance
+ * @constant
+ * @default
+ */
+ INSTANCE_ALREADY_RUNNING: 'ERR_MOCHA_INSTANCE_ALREADY_RUNNING',
+
+ /**
+ * Invalid state transition occurring in `Mocha` instance
+ * @constant
+ * @default
+ */
+ INSTANCE_ALREADY_DISPOSED: 'ERR_MOCHA_INSTANCE_ALREADY_DISPOSED',
+
+ /**
+ * Use of `only()` w/ `--forbid-only` results in this error.
+ * @constant
+ * @default
+ */
+ FORBIDDEN_EXCLUSIVITY: 'ERR_MOCHA_FORBIDDEN_EXCLUSIVITY',
+
+ /**
+ * To be thrown when a user-defined plugin implementation (e.g., `mochaHooks`) is invalid
+ * @constant
+ * @default
+ */
+ INVALID_PLUGIN_IMPLEMENTATION: 'ERR_MOCHA_INVALID_PLUGIN_IMPLEMENTATION',
+
+ /**
+ * To be thrown when a builtin or third-party plugin definition (the _definition_ of `mochaHooks`) is invalid
+ * @constant
+ * @default
+ */
+ INVALID_PLUGIN_DEFINITION: 'ERR_MOCHA_INVALID_PLUGIN_DEFINITION',
+
+ /**
+ * When a runnable exceeds its allowed run time.
+ * @constant
+ * @default
+ */
+ TIMEOUT: 'ERR_MOCHA_TIMEOUT',
+
+ /**
+ * Input file is not able to be parsed
+ * @constant
+ * @default
+ */
+ UNPARSABLE_FILE: 'ERR_MOCHA_UNPARSABLE_FILE'
+ };
+ /**
+ * A set containing all string values of all Mocha error constants, for use by {@link isMochaError}.
+ * @private
+ */
+
+ var MOCHA_ERRORS = new Set(Object.values(constants$4));
+ /**
+ * Creates an error object to be thrown when no files to be tested could be found using specified pattern.
+ *
+ * @public
+ * @static
+ * @param {string} message - Error message to be displayed.
+ * @param {string} pattern - User-specified argument value.
+ * @returns {Error} instance detailing the error condition
+ */
+
+ function createNoFilesMatchPatternError(message, pattern) {
+ var err = new Error(message);
+ err.code = constants$4.NO_FILES_MATCH_PATTERN;
+ err.pattern = pattern;
+ return err;
+ }
+ /**
+ * Creates an error object to be thrown when the reporter specified in the options was not found.
+ *
+ * @public
+ * @param {string} message - Error message to be displayed.
+ * @param {string} reporter - User-specified reporter value.
+ * @returns {Error} instance detailing the error condition
+ */
+
+
+ function createInvalidReporterError(message, reporter) {
+ var err = new TypeError(message);
+ err.code = constants$4.INVALID_REPORTER;
+ err.reporter = reporter;
+ return err;
+ }
+ /**
+ * Creates an error object to be thrown when the interface specified in the options was not found.
+ *
+ * @public
+ * @static
+ * @param {string} message - Error message to be displayed.
+ * @param {string} ui - User-specified interface value.
+ * @returns {Error} instance detailing the error condition
+ */
+
+
+ function createInvalidInterfaceError(message, ui) {
+ var err = new Error(message);
+ err.code = constants$4.INVALID_INTERFACE;
+ err["interface"] = ui;
+ return err;
+ }
+ /**
+ * Creates an error object to be thrown when a behavior, option, or parameter is unsupported.
+ *
+ * @public
+ * @static
+ * @param {string} message - Error message to be displayed.
+ * @returns {Error} instance detailing the error condition
+ */
+
+
+ function createUnsupportedError$2(message) {
+ var err = new Error(message);
+ err.code = constants$4.UNSUPPORTED;
+ return err;
+ }
+ /**
+ * Creates an error object to be thrown when an argument is missing.
+ *
+ * @public
+ * @static
+ * @param {string} message - Error message to be displayed.
+ * @param {string} argument - Argument name.
+ * @param {string} expected - Expected argument datatype.
+ * @returns {Error} instance detailing the error condition
+ */
+
+
+ function createMissingArgumentError$1(message, argument, expected) {
+ return createInvalidArgumentTypeError$1(message, argument, expected);
+ }
+ /**
+ * Creates an error object to be thrown when an argument did not use the supported type
+ *
+ * @public
+ * @static
+ * @param {string} message - Error message to be displayed.
+ * @param {string} argument - Argument name.
+ * @param {string} expected - Expected argument datatype.
+ * @returns {Error} instance detailing the error condition
+ */
+
+
+ function createInvalidArgumentTypeError$1(message, argument, expected) {
+ var err = new TypeError(message);
+ err.code = constants$4.INVALID_ARG_TYPE;
+ err.argument = argument;
+ err.expected = expected;
+ err.actual = _typeof(argument);
+ return err;
+ }
+ /**
+ * Creates an error object to be thrown when an argument did not use the supported value
+ *
+ * @public
+ * @static
+ * @param {string} message - Error message to be displayed.
+ * @param {string} argument - Argument name.
+ * @param {string} value - Argument value.
+ * @param {string} [reason] - Why value is invalid.
+ * @returns {Error} instance detailing the error condition
+ */
+
+
+ function createInvalidArgumentValueError(message, argument, value, reason) {
+ var err = new TypeError(message);
+ err.code = constants$4.INVALID_ARG_VALUE;
+ err.argument = argument;
+ err.value = value;
+ err.reason = typeof reason !== 'undefined' ? reason : 'is invalid';
+ return err;
+ }
+ /**
+ * Creates an error object to be thrown when an exception was caught, but the `Error` is falsy or undefined.
+ *
+ * @public
+ * @static
+ * @param {string} message - Error message to be displayed.
+ * @returns {Error} instance detailing the error condition
+ */
+
+
+ function createInvalidExceptionError$2(message, value) {
+ var err = new Error(message);
+ err.code = constants$4.INVALID_EXCEPTION;
+ err.valueType = _typeof(value);
+ err.value = value;
+ return err;
+ }
+ /**
+ * Creates an error object to be thrown when an unrecoverable error occurs.
+ *
+ * @public
+ * @static
+ * @param {string} message - Error message to be displayed.
+ * @returns {Error} instance detailing the error condition
+ */
+
+
+ function createFatalError$1(message, value) {
+ var err = new Error(message);
+ err.code = constants$4.FATAL;
+ err.valueType = _typeof(value);
+ err.value = value;
+ return err;
+ }
+ /**
+ * Dynamically creates a plugin-type-specific error based on plugin type
+ * @param {string} message - Error message
+ * @param {"reporter"|"ui"} pluginType - Plugin type. Future: expand as needed
+ * @param {string} [pluginId] - Name/path of plugin, if any
+ * @throws When `pluginType` is not known
+ * @public
+ * @static
+ * @returns {Error}
+ */
+
+
+ function createInvalidLegacyPluginError(message, pluginType, pluginId) {
+ switch (pluginType) {
+ case 'reporter':
+ return createInvalidReporterError(message, pluginId);
+
+ case 'ui':
+ return createInvalidInterfaceError(message, pluginId);
+
+ default:
+ throw new Error('unknown pluginType "' + pluginType + '"');
+ }
+ }
+ /**
+ * **DEPRECATED**. Use {@link createInvalidLegacyPluginError} instead Dynamically creates a plugin-type-specific error based on plugin type
+ * @deprecated
+ * @param {string} message - Error message
+ * @param {"reporter"|"interface"} pluginType - Plugin type. Future: expand as needed
+ * @param {string} [pluginId] - Name/path of plugin, if any
+ * @throws When `pluginType` is not known
+ * @public
+ * @static
+ * @returns {Error}
+ */
+
+
+ function createInvalidPluginError() {
+ deprecate('Use createInvalidLegacyPluginError() instead');
+ return createInvalidLegacyPluginError.apply(void 0, arguments);
+ }
+ /**
+ * Creates an error object to be thrown when a mocha object's `run` method is executed while it is already disposed.
+ * @param {string} message The error message to be displayed.
+ * @param {boolean} cleanReferencesAfterRun the value of `cleanReferencesAfterRun`
+ * @param {Mocha} instance the mocha instance that throw this error
+ * @static
+ */
+
+
+ function createMochaInstanceAlreadyDisposedError(message, cleanReferencesAfterRun, instance) {
+ var err = new Error(message);
+ err.code = constants$4.INSTANCE_ALREADY_DISPOSED;
+ err.cleanReferencesAfterRun = cleanReferencesAfterRun;
+ err.instance = instance;
+ return err;
+ }
+ /**
+ * Creates an error object to be thrown when a mocha object's `run` method is called while a test run is in progress.
+ * @param {string} message The error message to be displayed.
+ * @static
+ * @public
+ */
+
+
+ function createMochaInstanceAlreadyRunningError(message, instance) {
+ var err = new Error(message);
+ err.code = constants$4.INSTANCE_ALREADY_RUNNING;
+ err.instance = instance;
+ return err;
+ }
+ /**
+ * Creates an error object to be thrown when done() is called multiple times in a test
+ *
+ * @public
+ * @param {Runnable} runnable - Original runnable
+ * @param {Error} [originalErr] - Original error, if any
+ * @returns {Error} instance detailing the error condition
+ * @static
+ */
+
+
+ function createMultipleDoneError$1(runnable, originalErr) {
+ var title;
+
+ try {
+ title = format('<%s>', runnable.fullTitle());
+
+ if (runnable.parent.root) {
+ title += ' (of root suite)';
+ }
+ } catch (ignored) {
+ title = format('<%s> (of unknown suite)', runnable.title);
+ }
+
+ var message = format('done() called multiple times in %s %s', runnable.type ? runnable.type : 'unknown runnable', title);
+
+ if (runnable.file) {
+ message += format(' of file %s', runnable.file);
+ }
+
+ if (originalErr) {
+ message += format('; in addition, done() received error: %s', originalErr);
+ }
+
+ var err = new Error(message);
+ err.code = constants$4.MULTIPLE_DONE;
+ err.valueType = _typeof(originalErr);
+ err.value = originalErr;
+ return err;
+ }
+ /**
+ * Creates an error object to be thrown when `.only()` is used with
+ * `--forbid-only`.
+ * @static
+ * @public
+ * @param {Mocha} mocha - Mocha instance
+ * @returns {Error} Error with code {@link constants.FORBIDDEN_EXCLUSIVITY}
+ */
+
+
+ function createForbiddenExclusivityError$1(mocha) {
+ var err = new Error(mocha.isWorker ? '`.only` is not supported in parallel mode' : '`.only` forbidden by --forbid-only');
+ err.code = constants$4.FORBIDDEN_EXCLUSIVITY;
+ return err;
+ }
+ /**
+ * Creates an error object to be thrown when a plugin definition is invalid
+ * @static
+ * @param {string} msg - Error message
+ * @param {PluginDefinition} [pluginDef] - Problematic plugin definition
+ * @public
+ * @returns {Error} Error with code {@link constants.INVALID_PLUGIN_DEFINITION}
+ */
+
+
+ function createInvalidPluginDefinitionError(msg, pluginDef) {
+ var err = new Error(msg);
+ err.code = constants$4.INVALID_PLUGIN_DEFINITION;
+ err.pluginDef = pluginDef;
+ return err;
+ }
+ /**
+ * Creates an error object to be thrown when a plugin implementation (user code) is invalid
+ * @static
+ * @param {string} msg - Error message
+ * @param {Object} [opts] - Plugin definition and user-supplied implementation
+ * @param {PluginDefinition} [opts.pluginDef] - Plugin Definition
+ * @param {*} [opts.pluginImpl] - Plugin Implementation (user-supplied)
+ * @public
+ * @returns {Error} Error with code {@link constants.INVALID_PLUGIN_DEFINITION}
+ */
+
+
+ function createInvalidPluginImplementationError(msg) {
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+ pluginDef = _ref.pluginDef,
+ pluginImpl = _ref.pluginImpl;
+
+ var err = new Error(msg);
+ err.code = constants$4.INVALID_PLUGIN_IMPLEMENTATION;
+ err.pluginDef = pluginDef;
+ err.pluginImpl = pluginImpl;
+ return err;
+ }
+ /**
+ * Creates an error object to be thrown when a runnable exceeds its allowed run time.
+ * @static
+ * @param {string} msg - Error message
+ * @param {number} [timeout] - Timeout in ms
+ * @param {string} [file] - File, if given
+ * @returns {MochaTimeoutError}
+ */
+
+
+ function createTimeoutError$1(msg, timeout, file) {
+ var err = new Error(msg);
+ err.code = constants$4.TIMEOUT;
+ err.timeout = timeout;
+ err.file = file;
+ return err;
+ }
+ /**
+ * Creates an error object to be thrown when file is unparsable
+ * @public
+ * @static
+ * @param {string} message - Error message to be displayed.
+ * @param {string} filename - File name
+ * @returns {Error} Error with code {@link constants.UNPARSABLE_FILE}
+ */
+
+
+ function createUnparsableFileError(message, filename) {
+ var err = new Error(message);
+ err.code = constants$4.UNPARSABLE_FILE;
+ return err;
+ }
+ /**
+ * Returns `true` if an error came out of Mocha.
+ * _Can suffer from false negatives, but not false positives._
+ * @static
+ * @public
+ * @param {*} err - Error, or anything
+ * @returns {boolean}
+ */
+
+
+ var isMochaError$1 = function isMochaError(err) {
+ return Boolean(err && _typeof(err) === 'object' && MOCHA_ERRORS.has(err.code));
+ };
+
+ var errors = {
+ constants: constants$4,
+ createFatalError: createFatalError$1,
+ createForbiddenExclusivityError: createForbiddenExclusivityError$1,
+ createInvalidArgumentTypeError: createInvalidArgumentTypeError$1,
+ createInvalidArgumentValueError: createInvalidArgumentValueError,
+ createInvalidExceptionError: createInvalidExceptionError$2,
+ createInvalidInterfaceError: createInvalidInterfaceError,
+ createInvalidLegacyPluginError: createInvalidLegacyPluginError,
+ createInvalidPluginDefinitionError: createInvalidPluginDefinitionError,
+ createInvalidPluginError: createInvalidPluginError,
+ createInvalidPluginImplementationError: createInvalidPluginImplementationError,
+ createInvalidReporterError: createInvalidReporterError,
+ createMissingArgumentError: createMissingArgumentError$1,
+ createMochaInstanceAlreadyDisposedError: createMochaInstanceAlreadyDisposedError,
+ createMochaInstanceAlreadyRunningError: createMochaInstanceAlreadyRunningError,
+ createMultipleDoneError: createMultipleDoneError$1,
+ createNoFilesMatchPatternError: createNoFilesMatchPatternError,
+ createTimeoutError: createTimeoutError$1,
+ createUnparsableFileError: createUnparsableFileError,
+ createUnsupportedError: createUnsupportedError$2,
+ deprecate: deprecate,
+ isMochaError: isMochaError$1,
+ warn: warn
+ };
+
+ var EventEmitter$1 = EventEmitter$2.EventEmitter;
+ var debug$1 = browser('mocha:runnable');
+ var createInvalidExceptionError$1 = errors.createInvalidExceptionError,
+ createMultipleDoneError = errors.createMultipleDoneError,
+ createTimeoutError = errors.createTimeoutError;
+ /**
+ * Save timer references to avoid Sinon interfering (see GH-237).
+ * @private
+ */
+
+ var Date$4 = commonjsGlobal.Date;
+ var setTimeout$3 = commonjsGlobal.setTimeout;
+ var clearTimeout$1 = commonjsGlobal.clearTimeout;
+ var toString = Object.prototype.toString;
+ var runnable = Runnable;
+ /**
+ * Initialize a new `Runnable` with the given `title` and callback `fn`.
+ *
+ * @class
+ * @extends external:EventEmitter
+ * @public
+ * @param {String} title
+ * @param {Function} fn
+ */
+
+ function Runnable(title, fn) {
+ this.title = title;
+ this.fn = fn;
+ this.body = (fn || '').toString();
+ this.async = fn && fn.length;
+ this.sync = !this.async;
+ this._timeout = 2000;
+ this._slow = 75;
+ this._retries = -1;
+ utils.assignNewMochaID(this);
+ Object.defineProperty(this, 'id', {
+ get: function get() {
+ return utils.getMochaID(this);
+ }
+ });
+ this.reset();
+ }
+ /**
+ * Inherit from `EventEmitter.prototype`.
+ */
+
+
+ utils.inherits(Runnable, EventEmitter$1);
+ /**
+ * Resets the state initially or for a next run.
+ */
+
+ Runnable.prototype.reset = function () {
+ this.timedOut = false;
+ this._currentRetry = 0;
+ this.pending = false;
+ delete this.state;
+ delete this.err;
+ };
+ /**
+ * Get current timeout value in msecs.
+ *
+ * @private
+ * @returns {number} current timeout threshold value
+ */
+
+ /**
+ * @summary
+ * Set timeout threshold value (msecs).
+ *
+ * @description
+ * A string argument can use shorthand (e.g., "2s") and will be converted.
+ * The value will be clamped to range [0
, 2^31 -1
].
+ * If clamped value matches either range endpoint, timeouts will be disabled.
+ *
+ * @private
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout#Maximum_delay_value}
+ * @param {number|string} ms - Timeout threshold value.
+ * @returns {Runnable} this
+ * @chainable
+ */
+
+
+ Runnable.prototype.timeout = function (ms) {
+ if (!arguments.length) {
+ return this._timeout;
+ }
+
+ if (typeof ms === 'string') {
+ ms = ms$1(ms);
+ } // Clamp to range
+
+
+ var INT_MAX = Math.pow(2, 31) - 1;
+ var range = [0, INT_MAX];
+ ms = utils.clamp(ms, range); // see #1652 for reasoning
+
+ if (ms === range[0] || ms === range[1]) {
+ this._timeout = 0;
+ } else {
+ this._timeout = ms;
+ }
+
+ debug$1('timeout %d', this._timeout);
+
+ if (this.timer) {
+ this.resetTimeout();
+ }
+
+ return this;
+ };
+ /**
+ * Set or get slow `ms`.
+ *
+ * @private
+ * @param {number|string} ms
+ * @return {Runnable|number} ms or Runnable instance.
+ */
+
+
+ Runnable.prototype.slow = function (ms) {
+ if (!arguments.length || typeof ms === 'undefined') {
+ return this._slow;
+ }
+
+ if (typeof ms === 'string') {
+ ms = ms$1(ms);
+ }
+
+ debug$1('slow %d', ms);
+ this._slow = ms;
+ return this;
+ };
+ /**
+ * Halt and mark as pending.
+ *
+ * @memberof Mocha.Runnable
+ * @public
+ */
+
+
+ Runnable.prototype.skip = function () {
+ this.pending = true;
+ throw new pending('sync skip; aborting execution');
+ };
+ /**
+ * Check if this runnable or its parent suite is marked as pending.
+ *
+ * @private
+ */
+
+
+ Runnable.prototype.isPending = function () {
+ return this.pending || this.parent && this.parent.isPending();
+ };
+ /**
+ * Return `true` if this Runnable has failed.
+ * @return {boolean}
+ * @private
+ */
+
+
+ Runnable.prototype.isFailed = function () {
+ return !this.isPending() && this.state === constants$3.STATE_FAILED;
+ };
+ /**
+ * Return `true` if this Runnable has passed.
+ * @return {boolean}
+ * @private
+ */
+
+
+ Runnable.prototype.isPassed = function () {
+ return !this.isPending() && this.state === constants$3.STATE_PASSED;
+ };
+ /**
+ * Set or get number of retries.
+ *
+ * @private
+ */
+
+
+ Runnable.prototype.retries = function (n) {
+ if (!arguments.length) {
+ return this._retries;
+ }
+
+ this._retries = n;
+ };
+ /**
+ * Set or get current retry
+ *
+ * @private
+ */
+
+
+ Runnable.prototype.currentRetry = function (n) {
+ if (!arguments.length) {
+ return this._currentRetry;
+ }
+
+ this._currentRetry = n;
+ };
+ /**
+ * Return the full title generated by recursively concatenating the parent's
+ * full title.
+ *
+ * @memberof Mocha.Runnable
+ * @public
+ * @return {string}
+ */
+
+
+ Runnable.prototype.fullTitle = function () {
+ return this.titlePath().join(' ');
+ };
+ /**
+ * Return the title path generated by concatenating the parent's title path with the title.
+ *
+ * @memberof Mocha.Runnable
+ * @public
+ * @return {string}
+ */
+
+
+ Runnable.prototype.titlePath = function () {
+ return this.parent.titlePath().concat([this.title]);
+ };
+ /**
+ * Clear the timeout.
+ *
+ * @private
+ */
+
+
+ Runnable.prototype.clearTimeout = function () {
+ clearTimeout$1(this.timer);
+ };
+ /**
+ * Reset the timeout.
+ *
+ * @private
+ */
+
+
+ Runnable.prototype.resetTimeout = function () {
+ var self = this;
+ var ms = this.timeout();
+
+ if (ms === 0) {
+ return;
+ }
+
+ this.clearTimeout();
+ this.timer = setTimeout$3(function () {
+ if (self.timeout() === 0) {
+ return;
+ }
+
+ self.callback(self._timeoutError(ms));
+ self.timedOut = true;
+ }, ms);
+ };
+ /**
+ * Set or get a list of whitelisted globals for this test run.
+ *
+ * @private
+ * @param {string[]} globals
+ */
+
+
+ Runnable.prototype.globals = function (globals) {
+ if (!arguments.length) {
+ return this._allowedGlobals;
+ }
+
+ this._allowedGlobals = globals;
+ };
+ /**
+ * Run the test and invoke `fn(err)`.
+ *
+ * @param {Function} fn
+ * @private
+ */
+
+
+ Runnable.prototype.run = function (fn) {
+ var self = this;
+ var start = new Date$4();
+ var ctx = this.ctx;
+ var finished;
+ var errorWasHandled = false;
+ if (this.isPending()) return fn(); // Sometimes the ctx exists, but it is not runnable
+
+ if (ctx && ctx.runnable) {
+ ctx.runnable(this);
+ } // called multiple times
+
+
+ function multiple(err) {
+ if (errorWasHandled) {
+ return;
+ }
+
+ errorWasHandled = true;
+ self.emit('error', createMultipleDoneError(self, err));
+ } // finished
+
+
+ function done(err) {
+ var ms = self.timeout();
+
+ if (self.timedOut) {
+ return;
+ }
+
+ if (finished) {
+ return multiple(err);
+ }
+
+ self.clearTimeout();
+ self.duration = new Date$4() - start;
+ finished = true;
+
+ if (!err && self.duration > ms && ms > 0) {
+ err = self._timeoutError(ms);
+ }
+
+ fn(err);
+ } // for .resetTimeout() and Runner#uncaught()
+
+
+ this.callback = done;
+
+ if (this.fn && typeof this.fn.call !== 'function') {
+ done(new TypeError('A runnable must be passed a function as its second argument.'));
+ return;
+ } // explicit async with `done` argument
+
+
+ if (this.async) {
+ this.resetTimeout(); // allows skip() to be used in an explicit async context
+
+ this.skip = function asyncSkip() {
+ this.pending = true;
+ done(); // halt execution, the uncaught handler will ignore the failure.
+
+ throw new pending('async skip; aborting execution');
+ };
+
+ try {
+ callFnAsync(this.fn);
+ } catch (err) {
+ // handles async runnables which actually run synchronously
+ errorWasHandled = true;
+
+ if (err instanceof pending) {
+ return; // done() is already called in this.skip()
+ } else if (this.allowUncaught) {
+ throw err;
+ }
+
+ done(Runnable.toValueOrError(err));
+ }
+
+ return;
+ } // sync or promise-returning
+
+
+ try {
+ callFn(this.fn);
+ } catch (err) {
+ errorWasHandled = true;
+
+ if (err instanceof pending) {
+ return done();
+ } else if (this.allowUncaught) {
+ throw err;
+ }
+
+ done(Runnable.toValueOrError(err));
+ }
+
+ function callFn(fn) {
+ var result = fn.call(ctx);
+
+ if (result && typeof result.then === 'function') {
+ self.resetTimeout();
+ result.then(function () {
+ done(); // Return null so libraries like bluebird do not warn about
+ // subsequently constructed Promises.
+
+ return null;
+ }, function (reason) {
+ done(reason || new Error('Promise rejected with no or falsy reason'));
+ });
+ } else {
+ if (self.asyncOnly) {
+ return done(new Error('--async-only option in use without declaring `done()` or returning a promise'));
+ }
+
+ done();
+ }
+ }
+
+ function callFnAsync(fn) {
+ var result = fn.call(ctx, function (err) {
+ if (err instanceof Error || toString.call(err) === '[object Error]') {
+ return done(err);
+ }
+
+ if (err) {
+ if (Object.prototype.toString.call(err) === '[object Object]') {
+ return done(new Error('done() invoked with non-Error: ' + JSON.stringify(err)));
+ }
+
+ return done(new Error('done() invoked with non-Error: ' + err));
+ }
+
+ if (result && utils.isPromise(result)) {
+ return done(new Error('Resolution method is overspecified. Specify a callback *or* return a Promise; not both.'));
+ }
+
+ done();
+ });
+ }
+ };
+ /**
+ * Instantiates a "timeout" error
+ *
+ * @param {number} ms - Timeout (in milliseconds)
+ * @returns {Error} a "timeout" error
+ * @private
+ */
+
+
+ Runnable.prototype._timeoutError = function (ms) {
+ var msg = "Timeout of ".concat(ms, "ms exceeded. For async tests and hooks, ensure \"done()\" is called; if returning a Promise, ensure it resolves.");
+
+ if (this.file) {
+ msg += ' (' + this.file + ')';
+ }
+
+ return createTimeoutError(msg, ms, this.file);
+ };
+
+ var constants$3 = utils.defineConstants(
+ /**
+ * {@link Runnable}-related constants.
+ * @public
+ * @memberof Runnable
+ * @readonly
+ * @static
+ * @alias constants
+ * @enum {string}
+ */
+ {
+ /**
+ * Value of `state` prop when a `Runnable` has failed
+ */
+ STATE_FAILED: 'failed',
+
+ /**
+ * Value of `state` prop when a `Runnable` has passed
+ */
+ STATE_PASSED: 'passed',
+
+ /**
+ * Value of `state` prop when a `Runnable` has been skipped by user
+ */
+ STATE_PENDING: 'pending'
+ });
+ /**
+ * Given `value`, return identity if truthy, otherwise create an "invalid exception" error and return that.
+ * @param {*} [value] - Value to return, if present
+ * @returns {*|Error} `value`, otherwise an `Error`
+ * @private
+ */
+
+ Runnable.toValueOrError = function (value) {
+ return value || createInvalidExceptionError$1('Runnable failed with falsy or undefined exception. Please throw an Error instead.', value);
+ };
+
+ Runnable.constants = constants$3;
+
+ var inherits = utils.inherits,
+ constants$2 = utils.constants;
+ var MOCHA_ID_PROP_NAME$1 = constants$2.MOCHA_ID_PROP_NAME;
+ /**
+ * Expose `Hook`.
+ */
+
+ var hook = Hook;
+ /**
+ * Initialize a new `Hook` with the given `title` and callback `fn`
+ *
+ * @class
+ * @extends Runnable
+ * @param {String} title
+ * @param {Function} fn
+ */
+
+ function Hook(title, fn) {
+ runnable.call(this, title, fn);
+ this.type = 'hook';
+ }
+ /**
+ * Inherit from `Runnable.prototype`.
+ */
+
+
+ inherits(Hook, runnable);
+ /**
+ * Resets the state for a next run.
+ */
+
+ Hook.prototype.reset = function () {
+ runnable.prototype.reset.call(this);
+ delete this._error;
+ };
+ /**
+ * Get or set the test `err`.
+ *
+ * @memberof Hook
+ * @public
+ * @param {Error} err
+ * @return {Error}
+ */
+
+
+ Hook.prototype.error = function (err) {
+ if (!arguments.length) {
+ err = this._error;
+ this._error = null;
+ return err;
+ }
+
+ this._error = err;
+ };
+ /**
+ * Returns an object suitable for IPC.
+ * Functions are represented by keys beginning with `$$`.
+ * @private
+ * @returns {Object}
+ */
+
+
+ Hook.prototype.serialize = function serialize() {
+ return _defineProperty({
+ $$currentRetry: this.currentRetry(),
+ $$fullTitle: this.fullTitle(),
+ $$isPending: Boolean(this.isPending()),
+ $$titlePath: this.titlePath(),
+ ctx: this.ctx && this.ctx.currentTest ? {
+ currentTest: _defineProperty({
+ title: this.ctx.currentTest.title
+ }, MOCHA_ID_PROP_NAME$1, this.ctx.currentTest.id)
+ } : {},
+ duration: this.duration,
+ file: this.file,
+ parent: _defineProperty({
+ $$fullTitle: this.parent.fullTitle()
+ }, MOCHA_ID_PROP_NAME$1, this.parent.id),
+ state: this.state,
+ title: this.title,
+ type: this.type
+ }, MOCHA_ID_PROP_NAME$1, this.id);
+ };
+
+ var suite = createCommonjsModule(function (module, exports) {
+ /**
+ * Module dependencies.
+ * @private
+ */
+
+ var EventEmitter = EventEmitter$2.EventEmitter;
+ var assignNewMochaID = utils.assignNewMochaID,
+ clamp = utils.clamp,
+ utilsConstants = utils.constants,
+ createMap = utils.createMap,
+ defineConstants = utils.defineConstants,
+ getMochaID = utils.getMochaID,
+ inherits = utils.inherits,
+ isString = utils.isString;
+ var debug = browser('mocha:suite');
+ var MOCHA_ID_PROP_NAME = utilsConstants.MOCHA_ID_PROP_NAME;
+ /**
+ * Expose `Suite`.
+ */
+
+ module.exports = Suite;
+ /**
+ * Create a new `Suite` with the given `title` and parent `Suite`.
+ *
+ * @public
+ * @param {Suite} parent - Parent suite (required!)
+ * @param {string} title - Title
+ * @return {Suite}
+ */
+
+ Suite.create = function (parent, title) {
+ var suite = new Suite(title, parent.ctx);
+ suite.parent = parent;
+ title = suite.fullTitle();
+ parent.addSuite(suite);
+ return suite;
+ };
+ /**
+ * Constructs a new `Suite` instance with the given `title`, `ctx`, and `isRoot`.
+ *
+ * @public
+ * @class
+ * @extends EventEmitter
+ * @see {@link https://nodejs.org/api/events.html#events_class_eventemitter|EventEmitter}
+ * @param {string} title - Suite title.
+ * @param {Context} parentContext - Parent context instance.
+ * @param {boolean} [isRoot=false] - Whether this is the root suite.
+ */
+
+
+ function Suite(title, parentContext, isRoot) {
+ if (!isString(title)) {
+ throw errors.createInvalidArgumentTypeError('Suite argument "title" must be a string. Received type "' + _typeof(title) + '"', 'title', 'string');
+ }
+
+ this.title = title;
+
+ function Context() {}
+
+ Context.prototype = parentContext;
+ this.ctx = new Context();
+ this.suites = [];
+ this.tests = [];
+ this.root = isRoot === true;
+ this.pending = false;
+ this._retries = -1;
+ this._beforeEach = [];
+ this._beforeAll = [];
+ this._afterEach = [];
+ this._afterAll = [];
+ this._timeout = 2000;
+ this._slow = 75;
+ this._bail = false;
+ this._onlyTests = [];
+ this._onlySuites = [];
+ assignNewMochaID(this);
+ Object.defineProperty(this, 'id', {
+ get: function get() {
+ return getMochaID(this);
+ }
+ });
+ this.reset();
+ this.on('newListener', function (event) {
+ if (deprecatedEvents[event]) {
+ errors.deprecate('Event "' + event + '" is deprecated. Please let the Mocha team know about your use case: https://git.io/v6Lwm');
+ }
+ });
+ }
+ /**
+ * Inherit from `EventEmitter.prototype`.
+ */
+
+
+ inherits(Suite, EventEmitter);
+ /**
+ * Resets the state initially or for a next run.
+ */
+
+ Suite.prototype.reset = function () {
+ this.delayed = false;
+
+ function doReset(thingToReset) {
+ thingToReset.reset();
+ }
+
+ this.suites.forEach(doReset);
+ this.tests.forEach(doReset);
+
+ this._beforeEach.forEach(doReset);
+
+ this._afterEach.forEach(doReset);
+
+ this._beforeAll.forEach(doReset);
+
+ this._afterAll.forEach(doReset);
+ };
+ /**
+ * Return a clone of this `Suite`.
+ *
+ * @private
+ * @return {Suite}
+ */
+
+
+ Suite.prototype.clone = function () {
+ var suite = new Suite(this.title);
+ debug('clone');
+ suite.ctx = this.ctx;
+ suite.root = this.root;
+ suite.timeout(this.timeout());
+ suite.retries(this.retries());
+ suite.slow(this.slow());
+ suite.bail(this.bail());
+ return suite;
+ };
+ /**
+ * Set or get timeout `ms` or short-hand such as "2s".
+ *
+ * @private
+ * @todo Do not attempt to set value if `ms` is undefined
+ * @param {number|string} ms
+ * @return {Suite|number} for chaining
+ */
+
+
+ Suite.prototype.timeout = function (ms) {
+ if (!arguments.length) {
+ return this._timeout;
+ }
+
+ if (typeof ms === 'string') {
+ ms = ms$1(ms);
+ } // Clamp to range
+
+
+ var INT_MAX = Math.pow(2, 31) - 1;
+ var range = [0, INT_MAX];
+ ms = clamp(ms, range);
+ debug('timeout %d', ms);
+ this._timeout = parseInt(ms, 10);
+ return this;
+ };
+ /**
+ * Set or get number of times to retry a failed test.
+ *
+ * @private
+ * @param {number|string} n
+ * @return {Suite|number} for chaining
+ */
+
+
+ Suite.prototype.retries = function (n) {
+ if (!arguments.length) {
+ return this._retries;
+ }
+
+ debug('retries %d', n);
+ this._retries = parseInt(n, 10) || 0;
+ return this;
+ };
+ /**
+ * Set or get slow `ms` or short-hand such as "2s".
+ *
+ * @private
+ * @param {number|string} ms
+ * @return {Suite|number} for chaining
+ */
+
+
+ Suite.prototype.slow = function (ms) {
+ if (!arguments.length) {
+ return this._slow;
+ }
+
+ if (typeof ms === 'string') {
+ ms = ms$1(ms);
+ }
+
+ debug('slow %d', ms);
+ this._slow = ms;
+ return this;
+ };
+ /**
+ * Set or get whether to bail after first error.
+ *
+ * @private
+ * @param {boolean} bail
+ * @return {Suite|number} for chaining
+ */
+
+
+ Suite.prototype.bail = function (bail) {
+ if (!arguments.length) {
+ return this._bail;
+ }
+
+ debug('bail %s', bail);
+ this._bail = bail;
+ return this;
+ };
+ /**
+ * Check if this suite or its parent suite is marked as pending.
+ *
+ * @private
+ */
+
+
+ Suite.prototype.isPending = function () {
+ return this.pending || this.parent && this.parent.isPending();
+ };
+ /**
+ * Generic hook-creator.
+ * @private
+ * @param {string} title - Title of hook
+ * @param {Function} fn - Hook callback
+ * @returns {Hook} A new hook
+ */
+
+
+ Suite.prototype._createHook = function (title, fn) {
+ var hook$1 = new hook(title, fn);
+ hook$1.parent = this;
+ hook$1.timeout(this.timeout());
+ hook$1.retries(this.retries());
+ hook$1.slow(this.slow());
+ hook$1.ctx = this.ctx;
+ hook$1.file = this.file;
+ return hook$1;
+ };
+ /**
+ * Run `fn(test[, done])` before running tests.
+ *
+ * @private
+ * @param {string} title
+ * @param {Function} fn
+ * @return {Suite} for chaining
+ */
+
+
+ Suite.prototype.beforeAll = function (title, fn) {
+ if (this.isPending()) {
+ return this;
+ }
+
+ if (typeof title === 'function') {
+ fn = title;
+ title = fn.name;
+ }
+
+ title = '"before all" hook' + (title ? ': ' + title : '');
+
+ var hook = this._createHook(title, fn);
+
+ this._beforeAll.push(hook);
+
+ this.emit(constants.EVENT_SUITE_ADD_HOOK_BEFORE_ALL, hook);
+ return this;
+ };
+ /**
+ * Run `fn(test[, done])` after running tests.
+ *
+ * @private
+ * @param {string} title
+ * @param {Function} fn
+ * @return {Suite} for chaining
+ */
+
+
+ Suite.prototype.afterAll = function (title, fn) {
+ if (this.isPending()) {
+ return this;
+ }
+
+ if (typeof title === 'function') {
+ fn = title;
+ title = fn.name;
+ }
+
+ title = '"after all" hook' + (title ? ': ' + title : '');
+
+ var hook = this._createHook(title, fn);
+
+ this._afterAll.push(hook);
+
+ this.emit(constants.EVENT_SUITE_ADD_HOOK_AFTER_ALL, hook);
+ return this;
+ };
+ /**
+ * Run `fn(test[, done])` before each test case.
+ *
+ * @private
+ * @param {string} title
+ * @param {Function} fn
+ * @return {Suite} for chaining
+ */
+
+
+ Suite.prototype.beforeEach = function (title, fn) {
+ if (this.isPending()) {
+ return this;
+ }
+
+ if (typeof title === 'function') {
+ fn = title;
+ title = fn.name;
+ }
+
+ title = '"before each" hook' + (title ? ': ' + title : '');
+
+ var hook = this._createHook(title, fn);
+
+ this._beforeEach.push(hook);
+
+ this.emit(constants.EVENT_SUITE_ADD_HOOK_BEFORE_EACH, hook);
+ return this;
+ };
+ /**
+ * Run `fn(test[, done])` after each test case.
+ *
+ * @private
+ * @param {string} title
+ * @param {Function} fn
+ * @return {Suite} for chaining
+ */
+
+
+ Suite.prototype.afterEach = function (title, fn) {
+ if (this.isPending()) {
+ return this;
+ }
+
+ if (typeof title === 'function') {
+ fn = title;
+ title = fn.name;
+ }
+
+ title = '"after each" hook' + (title ? ': ' + title : '');
+
+ var hook = this._createHook(title, fn);
+
+ this._afterEach.push(hook);
+
+ this.emit(constants.EVENT_SUITE_ADD_HOOK_AFTER_EACH, hook);
+ return this;
+ };
+ /**
+ * Add a test `suite`.
+ *
+ * @private
+ * @param {Suite} suite
+ * @return {Suite} for chaining
+ */
+
+
+ Suite.prototype.addSuite = function (suite) {
+ suite.parent = this;
+ suite.root = false;
+ suite.timeout(this.timeout());
+ suite.retries(this.retries());
+ suite.slow(this.slow());
+ suite.bail(this.bail());
+ this.suites.push(suite);
+ this.emit(constants.EVENT_SUITE_ADD_SUITE, suite);
+ return this;
+ };
+ /**
+ * Add a `test` to this suite.
+ *
+ * @private
+ * @param {Test} test
+ * @return {Suite} for chaining
+ */
+
+
+ Suite.prototype.addTest = function (test) {
+ test.parent = this;
+ test.timeout(this.timeout());
+ test.retries(this.retries());
+ test.slow(this.slow());
+ test.ctx = this.ctx;
+ this.tests.push(test);
+ this.emit(constants.EVENT_SUITE_ADD_TEST, test);
+ return this;
+ };
+ /**
+ * Return the full title generated by recursively concatenating the parent's
+ * full title.
+ *
+ * @memberof Suite
+ * @public
+ * @return {string}
+ */
+
+
+ Suite.prototype.fullTitle = function () {
+ return this.titlePath().join(' ');
+ };
+ /**
+ * Return the title path generated by recursively concatenating the parent's
+ * title path.
+ *
+ * @memberof Suite
+ * @public
+ * @return {string}
+ */
+
+
+ Suite.prototype.titlePath = function () {
+ var result = [];
+
+ if (this.parent) {
+ result = result.concat(this.parent.titlePath());
+ }
+
+ if (!this.root) {
+ result.push(this.title);
+ }
+
+ return result;
+ };
+ /**
+ * Return the total number of tests.
+ *
+ * @memberof Suite
+ * @public
+ * @return {number}
+ */
+
+
+ Suite.prototype.total = function () {
+ return this.suites.reduce(function (sum, suite) {
+ return sum + suite.total();
+ }, 0) + this.tests.length;
+ };
+ /**
+ * Iterates through each suite recursively to find all tests. Applies a
+ * function in the format `fn(test)`.
+ *
+ * @private
+ * @param {Function} fn
+ * @return {Suite}
+ */
+
+
+ Suite.prototype.eachTest = function (fn) {
+ this.tests.forEach(fn);
+ this.suites.forEach(function (suite) {
+ suite.eachTest(fn);
+ });
+ return this;
+ };
+ /**
+ * This will run the root suite if we happen to be running in delayed mode.
+ * @private
+ */
+
+
+ Suite.prototype.run = function run() {
+ if (this.root) {
+ this.emit(constants.EVENT_ROOT_SUITE_RUN);
+ }
+ };
+ /**
+ * Determines whether a suite has an `only` test or suite as a descendant.
+ *
+ * @private
+ * @returns {Boolean}
+ */
+
+
+ Suite.prototype.hasOnly = function hasOnly() {
+ return this._onlyTests.length > 0 || this._onlySuites.length > 0 || this.suites.some(function (suite) {
+ return suite.hasOnly();
+ });
+ };
+ /**
+ * Filter suites based on `isOnly` logic.
+ *
+ * @private
+ * @returns {Boolean}
+ */
+
+
+ Suite.prototype.filterOnly = function filterOnly() {
+ if (this._onlyTests.length) {
+ // If the suite contains `only` tests, run those and ignore any nested suites.
+ this.tests = this._onlyTests;
+ this.suites = [];
+ } else {
+ // Otherwise, do not run any of the tests in this suite.
+ this.tests = [];
+
+ this._onlySuites.forEach(function (onlySuite) {
+ // If there are other `only` tests/suites nested in the current `only` suite, then filter that `only` suite.
+ // Otherwise, all of the tests on this `only` suite should be run, so don't filter it.
+ if (onlySuite.hasOnly()) {
+ onlySuite.filterOnly();
+ }
+ }); // Run the `only` suites, as well as any other suites that have `only` tests/suites as descendants.
+
+
+ var onlySuites = this._onlySuites;
+ this.suites = this.suites.filter(function (childSuite) {
+ return onlySuites.indexOf(childSuite) !== -1 || childSuite.filterOnly();
+ });
+ } // Keep the suite only if there is something to run
+
+
+ return this.tests.length > 0 || this.suites.length > 0;
+ };
+ /**
+ * Adds a suite to the list of subsuites marked `only`.
+ *
+ * @private
+ * @param {Suite} suite
+ */
+
+
+ Suite.prototype.appendOnlySuite = function (suite) {
+ this._onlySuites.push(suite);
+ };
+ /**
+ * Marks a suite to be `only`.
+ *
+ * @private
+ */
+
+
+ Suite.prototype.markOnly = function () {
+ this.parent && this.parent.appendOnlySuite(this);
+ };
+ /**
+ * Adds a test to the list of tests marked `only`.
+ *
+ * @private
+ * @param {Test} test
+ */
+
+
+ Suite.prototype.appendOnlyTest = function (test) {
+ this._onlyTests.push(test);
+ };
+ /**
+ * Returns the array of hooks by hook name; see `HOOK_TYPE_*` constants.
+ * @private
+ */
+
+
+ Suite.prototype.getHooks = function getHooks(name) {
+ return this['_' + name];
+ };
+ /**
+ * cleans all references from this suite and all child suites.
+ */
+
+
+ Suite.prototype.dispose = function () {
+ this.suites.forEach(function (suite) {
+ suite.dispose();
+ });
+ this.cleanReferences();
+ };
+ /**
+ * Cleans up the references to all the deferred functions
+ * (before/after/beforeEach/afterEach) and tests of a Suite.
+ * These must be deleted otherwise a memory leak can happen,
+ * as those functions may reference variables from closures,
+ * thus those variables can never be garbage collected as long
+ * as the deferred functions exist.
+ *
+ * @private
+ */
+
+
+ Suite.prototype.cleanReferences = function cleanReferences() {
+ function cleanArrReferences(arr) {
+ for (var i = 0; i < arr.length; i++) {
+ delete arr[i].fn;
+ }
+ }
+
+ if (Array.isArray(this._beforeAll)) {
+ cleanArrReferences(this._beforeAll);
+ }
+
+ if (Array.isArray(this._beforeEach)) {
+ cleanArrReferences(this._beforeEach);
+ }
+
+ if (Array.isArray(this._afterAll)) {
+ cleanArrReferences(this._afterAll);
+ }
+
+ if (Array.isArray(this._afterEach)) {
+ cleanArrReferences(this._afterEach);
+ }
+
+ for (var i = 0; i < this.tests.length; i++) {
+ delete this.tests[i].fn;
+ }
+ };
+ /**
+ * Returns an object suitable for IPC.
+ * Functions are represented by keys beginning with `$$`.
+ * @private
+ * @returns {Object}
+ */
+
+
+ Suite.prototype.serialize = function serialize() {
+ var _ref2;
+
+ return _ref2 = {
+ _bail: this._bail,
+ $$fullTitle: this.fullTitle(),
+ $$isPending: Boolean(this.isPending()),
+ root: this.root,
+ title: this.title
+ }, _defineProperty(_ref2, MOCHA_ID_PROP_NAME, this.id), _defineProperty(_ref2, "parent", this.parent ? _defineProperty({}, MOCHA_ID_PROP_NAME, this.parent.id) : null), _ref2;
+ };
+
+ var constants = defineConstants(
+ /**
+ * {@link Suite}-related constants.
+ * @public
+ * @memberof Suite
+ * @alias constants
+ * @readonly
+ * @static
+ * @enum {string}
+ */
+ {
+ /**
+ * Event emitted after a test file has been loaded Not emitted in browser.
+ */
+ EVENT_FILE_POST_REQUIRE: 'post-require',
+
+ /**
+ * Event emitted before a test file has been loaded. In browser, this is emitted once an interface has been selected.
+ */
+ EVENT_FILE_PRE_REQUIRE: 'pre-require',
+
+ /**
+ * Event emitted immediately after a test file has been loaded. Not emitted in browser.
+ */
+ EVENT_FILE_REQUIRE: 'require',
+
+ /**
+ * Event emitted when `global.run()` is called (use with `delay` option)
+ */
+ EVENT_ROOT_SUITE_RUN: 'run',
+
+ /**
+ * Namespace for collection of a `Suite`'s "after all" hooks
+ */
+ HOOK_TYPE_AFTER_ALL: 'afterAll',
+
+ /**
+ * Namespace for collection of a `Suite`'s "after each" hooks
+ */
+ HOOK_TYPE_AFTER_EACH: 'afterEach',
+
+ /**
+ * Namespace for collection of a `Suite`'s "before all" hooks
+ */
+ HOOK_TYPE_BEFORE_ALL: 'beforeAll',
+
+ /**
+ * Namespace for collection of a `Suite`'s "before all" hooks
+ */
+ HOOK_TYPE_BEFORE_EACH: 'beforeEach',
+ // the following events are all deprecated
+
+ /**
+ * Emitted after an "after all" `Hook` has been added to a `Suite`. Deprecated
+ */
+ EVENT_SUITE_ADD_HOOK_AFTER_ALL: 'afterAll',
+
+ /**
+ * Emitted after an "after each" `Hook` has been added to a `Suite` Deprecated
+ */
+ EVENT_SUITE_ADD_HOOK_AFTER_EACH: 'afterEach',
+
+ /**
+ * Emitted after an "before all" `Hook` has been added to a `Suite` Deprecated
+ */
+ EVENT_SUITE_ADD_HOOK_BEFORE_ALL: 'beforeAll',
+
+ /**
+ * Emitted after an "before each" `Hook` has been added to a `Suite` Deprecated
+ */
+ EVENT_SUITE_ADD_HOOK_BEFORE_EACH: 'beforeEach',
+
+ /**
+ * Emitted after a child `Suite` has been added to a `Suite`. Deprecated
+ */
+ EVENT_SUITE_ADD_SUITE: 'suite',
+
+ /**
+ * Emitted after a `Test` has been added to a `Suite`. Deprecated
+ */
+ EVENT_SUITE_ADD_TEST: 'test'
+ });
+ /**
+ * @summary There are no known use cases for these events.
+ * @desc This is a `Set`-like object having all keys being the constant's string value and the value being `true`.
+ * @todo Remove eventually
+ * @type {Object}
+ * @ignore
+ */
+
+ var deprecatedEvents = Object.keys(constants).filter(function (constant) {
+ return constant.substring(0, 15) === 'EVENT_SUITE_ADD';
+ }).reduce(function (acc, constant) {
+ acc[constants[constant]] = true;
+ return acc;
+ }, createMap());
+ Suite.constants = constants;
+ });
+
+ /**
+ * Module dependencies.
+ * @private
+ */
+
+
+ var EventEmitter = EventEmitter$2.EventEmitter;
+ var debug = browser('mocha:runner');
+ var HOOK_TYPE_BEFORE_EACH = suite.constants.HOOK_TYPE_BEFORE_EACH;
+ var HOOK_TYPE_AFTER_EACH = suite.constants.HOOK_TYPE_AFTER_EACH;
+ var HOOK_TYPE_AFTER_ALL = suite.constants.HOOK_TYPE_AFTER_ALL;
+ var HOOK_TYPE_BEFORE_ALL = suite.constants.HOOK_TYPE_BEFORE_ALL;
+ var EVENT_ROOT_SUITE_RUN = suite.constants.EVENT_ROOT_SUITE_RUN;
+ var STATE_FAILED = runnable.constants.STATE_FAILED;
+ var STATE_PASSED = runnable.constants.STATE_PASSED;
+ var STATE_PENDING = runnable.constants.STATE_PENDING;
+ var stackFilter = utils.stackTraceFilter();
+ var stringify = utils.stringify;
+ var createInvalidExceptionError = errors.createInvalidExceptionError,
+ createUnsupportedError$1 = errors.createUnsupportedError,
+ createFatalError = errors.createFatalError,
+ isMochaError = errors.isMochaError,
+ errorConstants = errors.constants;
+ /**
+ * Non-enumerable globals.
+ * @private
+ * @readonly
+ */
+
+ var globals = ['setTimeout', 'clearTimeout', 'setInterval', 'clearInterval', 'XMLHttpRequest', 'Date', 'setImmediate', 'clearImmediate'];
+ var constants$1 = utils.defineConstants(
+ /**
+ * {@link Runner}-related constants.
+ * @public
+ * @memberof Runner
+ * @readonly
+ * @alias constants
+ * @static
+ * @enum {string}
+ */
+ {
+ /**
+ * Emitted when {@link Hook} execution begins
+ */
+ EVENT_HOOK_BEGIN: 'hook',
+
+ /**
+ * Emitted when {@link Hook} execution ends
+ */
+ EVENT_HOOK_END: 'hook end',
+
+ /**
+ * Emitted when Root {@link Suite} execution begins (all files have been parsed and hooks/tests are ready for execution)
+ */
+ EVENT_RUN_BEGIN: 'start',
+
+ /**
+ * Emitted when Root {@link Suite} execution has been delayed via `delay` option
+ */
+ EVENT_DELAY_BEGIN: 'waiting',
+
+ /**
+ * Emitted when delayed Root {@link Suite} execution is triggered by user via `global.run()`
+ */
+ EVENT_DELAY_END: 'ready',
+
+ /**
+ * Emitted when Root {@link Suite} execution ends
+ */
+ EVENT_RUN_END: 'end',
+
+ /**
+ * Emitted when {@link Suite} execution begins
+ */
+ EVENT_SUITE_BEGIN: 'suite',
+
+ /**
+ * Emitted when {@link Suite} execution ends
+ */
+ EVENT_SUITE_END: 'suite end',
+
+ /**
+ * Emitted when {@link Test} execution begins
+ */
+ EVENT_TEST_BEGIN: 'test',
+
+ /**
+ * Emitted when {@link Test} execution ends
+ */
+ EVENT_TEST_END: 'test end',
+
+ /**
+ * Emitted when {@link Test} execution fails
+ */
+ EVENT_TEST_FAIL: 'fail',
+
+ /**
+ * Emitted when {@link Test} execution succeeds
+ */
+ EVENT_TEST_PASS: 'pass',
+
+ /**
+ * Emitted when {@link Test} becomes pending
+ */
+ EVENT_TEST_PENDING: 'pending',
+
+ /**
+ * Emitted when {@link Test} execution has failed, but will retry
+ */
+ EVENT_TEST_RETRY: 'retry',
+
+ /**
+ * Initial state of Runner
+ */
+ STATE_IDLE: 'idle',
+
+ /**
+ * State set to this value when the Runner has started running
+ */
+ STATE_RUNNING: 'running',
+
+ /**
+ * State set to this value when the Runner has stopped
+ */
+ STATE_STOPPED: 'stopped'
+ });
+
+ var Runner = /*#__PURE__*/function (_EventEmitter) {
+ _inherits(Runner, _EventEmitter);
+
+ var _super = _createSuper(Runner);
+
+ /**
+ * Initialize a `Runner` at the Root {@link Suite}, which represents a hierarchy of {@link Suite|Suites} and {@link Test|Tests}.
+ *
+ * @extends external:EventEmitter
+ * @public
+ * @class
+ * @param {Suite} suite - Root suite
+ * @param {Object|boolean} [opts] - Options. If `boolean` (deprecated), whether to delay execution of root suite until ready.
+ * @param {boolean} [opts.cleanReferencesAfterRun] - Whether to clean references to test fns and hooks when a suite is done.
+ * @param {boolean} [opts.delay] - Whether to delay execution of root suite until ready.
+ * @param {boolean} [opts.dryRun] - Whether to report tests without running them.
+ * @param {boolean} [options.failZero] - Whether to fail test run if zero tests encountered.
+ */
+ function Runner(suite, opts) {
+ var _this;
+
+ _classCallCheck(this, Runner);
+
+ _this = _super.call(this);
+
+ if (opts === undefined) {
+ opts = {};
+ }
+
+ if (typeof opts === 'boolean') {
+ // TODO: remove this
+ errors.deprecate('"Runner(suite: Suite, delay: boolean)" is deprecated. Use "Runner(suite: Suite, {delay: boolean})" instead.');
+ _this._delay = opts;
+ opts = {};
+ } else {
+ _this._delay = opts.delay;
+ }
+
+ var self = _assertThisInitialized(_this);
+
+ _this._globals = [];
+ _this._abort = false;
+ _this.suite = suite;
+ _this._opts = opts;
+ _this.state = constants$1.STATE_IDLE;
+ _this.total = suite.total();
+ _this.failures = 0;
+ /**
+ * @type {Map>>}
+ */
+
+ _this._eventListeners = new Map();
+
+ _this.on(constants$1.EVENT_TEST_END, function (test) {
+ if (test.type === 'test' && test.retriedTest() && test.parent) {
+ var idx = test.parent.tests && test.parent.tests.indexOf(test.retriedTest());
+ if (idx > -1) test.parent.tests[idx] = test;
+ }
+
+ self.checkGlobals(test);
+ });
+
+ _this.on(constants$1.EVENT_HOOK_END, function (hook) {
+ self.checkGlobals(hook);
+ });
+
+ _this._defaultGrep = /.*/;
+
+ _this.grep(_this._defaultGrep);
+
+ _this.globals(_this.globalProps());
+
+ _this.uncaught = _this._uncaught.bind(_assertThisInitialized(_this));
+
+ _this.unhandled = function (reason, promise) {
+ if (isMochaError(reason)) {
+ debug('trapped unhandled rejection coming out of Mocha; forwarding to uncaught handler:', reason);
+
+ _this.uncaught(reason);
+ } else {
+ debug('trapped unhandled rejection from (probably) user code; re-emitting on process');
+
+ _this._removeEventListener(process$4, 'unhandledRejection', _this.unhandled);
+
+ try {
+ process$4.emit('unhandledRejection', reason, promise);
+ } finally {
+ _this._addEventListener(process$4, 'unhandledRejection', _this.unhandled);
+ }
+ }
+ };
+
+ return _this;
+ }
+
+ return Runner;
+ }(EventEmitter);
+ /**
+ * Wrapper for setImmediate, process.nextTick, or browser polyfill.
+ *
+ * @param {Function} fn
+ * @private
+ */
+
+
+ Runner.immediately = commonjsGlobal.setImmediate || nextTick$1;
+ /**
+ * Replacement for `target.on(eventName, listener)` that does bookkeeping to remove them when this runner instance is disposed.
+ * @param {EventEmitter} target - The `EventEmitter`
+ * @param {string} eventName - The event name
+ * @param {string} fn - Listener function
+ * @private
+ */
+
+ Runner.prototype._addEventListener = function (target, eventName, listener) {
+ debug('_addEventListener(): adding for event %s; %d current listeners', eventName, target.listenerCount(eventName));
+ /* istanbul ignore next */
+
+ if (this._eventListeners.has(target) && this._eventListeners.get(target).has(eventName) && this._eventListeners.get(target).get(eventName).has(listener)) {
+ debug('warning: tried to attach duplicate event listener for %s', eventName);
+ return;
+ }
+
+ target.on(eventName, listener);
+ var targetListeners = this._eventListeners.has(target) ? this._eventListeners.get(target) : new Map();
+ var targetEventListeners = targetListeners.has(eventName) ? targetListeners.get(eventName) : new Set();
+ targetEventListeners.add(listener);
+ targetListeners.set(eventName, targetEventListeners);
+
+ this._eventListeners.set(target, targetListeners);
+ };
+ /**
+ * Replacement for `target.removeListener(eventName, listener)` that also updates the bookkeeping.
+ * @param {EventEmitter} target - The `EventEmitter`
+ * @param {string} eventName - The event name
+ * @param {function} listener - Listener function
+ * @private
+ */
+
+
+ Runner.prototype._removeEventListener = function (target, eventName, listener) {
+ target.removeListener(eventName, listener);
+
+ if (this._eventListeners.has(target)) {
+ var targetListeners = this._eventListeners.get(target);
+
+ if (targetListeners.has(eventName)) {
+ var targetEventListeners = targetListeners.get(eventName);
+ targetEventListeners["delete"](listener);
+
+ if (!targetEventListeners.size) {
+ targetListeners["delete"](eventName);
+ }
+ }
+
+ if (!targetListeners.size) {
+ this._eventListeners["delete"](target);
+ }
+ } else {
+ debug('trying to remove listener for untracked object %s', target);
+ }
+ };
+ /**
+ * Removes all event handlers set during a run on this instance.
+ * Remark: this does _not_ clean/dispose the tests or suites themselves.
+ */
+
+
+ Runner.prototype.dispose = function () {
+ this.removeAllListeners();
+
+ this._eventListeners.forEach(function (targetListeners, target) {
+ targetListeners.forEach(function (targetEventListeners, eventName) {
+ targetEventListeners.forEach(function (listener) {
+ target.removeListener(eventName, listener);
+ });
+ });
+ });
+
+ this._eventListeners.clear();
+ };
+ /**
+ * Run tests with full titles matching `re`. Updates runner.total
+ * with number of tests matched.
+ *
+ * @public
+ * @memberof Runner
+ * @param {RegExp} re
+ * @param {boolean} invert
+ * @return {Runner} Runner instance.
+ */
+
+
+ Runner.prototype.grep = function (re, invert) {
+ debug('grep(): setting to %s', re);
+ this._grep = re;
+ this._invert = invert;
+ this.total = this.grepTotal(this.suite);
+ return this;
+ };
+ /**
+ * Returns the number of tests matching the grep search for the
+ * given suite.
+ *
+ * @memberof Runner
+ * @public
+ * @param {Suite} suite
+ * @return {number}
+ */
+
+
+ Runner.prototype.grepTotal = function (suite) {
+ var self = this;
+ var total = 0;
+ suite.eachTest(function (test) {
+ var match = self._grep.test(test.fullTitle());
+
+ if (self._invert) {
+ match = !match;
+ }
+
+ if (match) {
+ total++;
+ }
+ });
+ return total;
+ };
+ /**
+ * Return a list of global properties.
+ *
+ * @return {Array}
+ * @private
+ */
+
+
+ Runner.prototype.globalProps = function () {
+ var props = Object.keys(commonjsGlobal); // non-enumerables
+
+ for (var i = 0; i < globals.length; ++i) {
+ if (~props.indexOf(globals[i])) {
+ continue;
+ }
+
+ props.push(globals[i]);
+ }
+
+ return props;
+ };
+ /**
+ * Allow the given `arr` of globals.
+ *
+ * @public
+ * @memberof Runner
+ * @param {Array} arr
+ * @return {Runner} Runner instance.
+ */
+
+
+ Runner.prototype.globals = function (arr) {
+ if (!arguments.length) {
+ return this._globals;
+ }
+
+ debug('globals(): setting to %O', arr);
+ this._globals = this._globals.concat(arr);
+ return this;
+ };
+ /**
+ * Check for global variable leaks.
+ *
+ * @private
+ */
+
+
+ Runner.prototype.checkGlobals = function (test) {
+ if (!this.checkLeaks) {
+ return;
+ }
+
+ var ok = this._globals;
+ var globals = this.globalProps();
+ var leaks;
+
+ if (test) {
+ ok = ok.concat(test._allowedGlobals || []);
+ }
+
+ if (this.prevGlobalsLength === globals.length) {
+ return;
+ }
+
+ this.prevGlobalsLength = globals.length;
+ leaks = filterLeaks(ok, globals);
+ this._globals = this._globals.concat(leaks);
+
+ if (leaks.length) {
+ var msg = "global leak(s) detected: ".concat(leaks.map(function (e) {
+ return "'".concat(e, "'");
+ }).join(', '));
+ this.fail(test, new Error(msg));
+ }
+ };
+ /**
+ * Fail the given `test`.
+ *
+ * If `test` is a hook, failures work in the following pattern:
+ * - If bail, run corresponding `after each` and `after` hooks,
+ * then exit
+ * - Failed `before` hook skips all tests in a suite and subsuites,
+ * but jumps to corresponding `after` hook
+ * - Failed `before each` hook skips remaining tests in a
+ * suite and jumps to corresponding `after each` hook,
+ * which is run only once
+ * - Failed `after` hook does not alter execution order
+ * - Failed `after each` hook skips remaining tests in a
+ * suite and subsuites, but executes other `after each`
+ * hooks
+ *
+ * @private
+ * @param {Runnable} test
+ * @param {Error} err
+ * @param {boolean} [force=false] - Whether to fail a pending test.
+ */
+
+
+ Runner.prototype.fail = function (test, err, force) {
+ force = force === true;
+
+ if (test.isPending() && !force) {
+ return;
+ }
+
+ if (this.state === constants$1.STATE_STOPPED) {
+ if (err.code === errorConstants.MULTIPLE_DONE) {
+ throw err;
+ }
+
+ throw createFatalError('Test failed after root suite execution completed!', err);
+ }
+
+ ++this.failures;
+ debug('total number of failures: %d', this.failures);
+ test.state = STATE_FAILED;
+
+ if (!isError(err)) {
+ err = thrown2Error(err);
+ }
+
+ try {
+ err.stack = this.fullStackTrace || !err.stack ? err.stack : stackFilter(err.stack);
+ } catch (ignore) {// some environments do not take kindly to monkeying with the stack
+ }
+
+ this.emit(constants$1.EVENT_TEST_FAIL, test, err);
+ };
+ /**
+ * Run hook `name` callbacks and then invoke `fn()`.
+ *
+ * @private
+ * @param {string} name
+ * @param {Function} fn
+ */
+
+
+ Runner.prototype.hook = function (name, fn) {
+ if (this._opts.dryRun) return fn();
+ var suite = this.suite;
+ var hooks = suite.getHooks(name);
+ var self = this;
+
+ function next(i) {
+ var hook = hooks[i];
+
+ if (!hook) {
+ return fn();
+ }
+
+ self.currentRunnable = hook;
+
+ if (name === HOOK_TYPE_BEFORE_ALL) {
+ hook.ctx.currentTest = hook.parent.tests[0];
+ } else if (name === HOOK_TYPE_AFTER_ALL) {
+ hook.ctx.currentTest = hook.parent.tests[hook.parent.tests.length - 1];
+ } else {
+ hook.ctx.currentTest = self.test;
+ }
+
+ setHookTitle(hook);
+ hook.allowUncaught = self.allowUncaught;
+ self.emit(constants$1.EVENT_HOOK_BEGIN, hook);
+
+ if (!hook.listeners('error').length) {
+ self._addEventListener(hook, 'error', function (err) {
+ self.fail(hook, err);
+ });
+ }
+
+ hook.run(function cbHookRun(err) {
+ var testError = hook.error();
+
+ if (testError) {
+ self.fail(self.test, testError);
+ } // conditional skip
+
+
+ if (hook.pending) {
+ if (name === HOOK_TYPE_AFTER_EACH) {
+ // TODO define and implement use case
+ if (self.test) {
+ self.test.pending = true;
+ }
+ } else if (name === HOOK_TYPE_BEFORE_EACH) {
+ if (self.test) {
+ self.test.pending = true;
+ }
+
+ self.emit(constants$1.EVENT_HOOK_END, hook);
+ hook.pending = false; // activates hook for next test
+
+ return fn(new Error('abort hookDown'));
+ } else if (name === HOOK_TYPE_BEFORE_ALL) {
+ suite.tests.forEach(function (test) {
+ test.pending = true;
+ });
+ suite.suites.forEach(function (suite) {
+ suite.pending = true;
+ });
+ hooks = [];
+ } else {
+ hook.pending = false;
+ var errForbid = createUnsupportedError$1('`this.skip` forbidden');
+ self.fail(hook, errForbid);
+ return fn(errForbid);
+ }
+ } else if (err) {
+ self.fail(hook, err); // stop executing hooks, notify callee of hook err
+
+ return fn(err);
+ }
+
+ self.emit(constants$1.EVENT_HOOK_END, hook);
+ delete hook.ctx.currentTest;
+ setHookTitle(hook);
+ next(++i);
+ });
+
+ function setHookTitle(hook) {
+ hook.originalTitle = hook.originalTitle || hook.title;
+
+ if (hook.ctx && hook.ctx.currentTest) {
+ hook.title = "".concat(hook.originalTitle, " for \"").concat(hook.ctx.currentTest.title, "\"");
+ } else {
+ var parentTitle;
+
+ if (hook.parent.title) {
+ parentTitle = hook.parent.title;
+ } else {
+ parentTitle = hook.parent.root ? '{root}' : '';
+ }
+
+ hook.title = "".concat(hook.originalTitle, " in \"").concat(parentTitle, "\"");
+ }
+ }
+ }
+
+ Runner.immediately(function () {
+ next(0);
+ });
+ };
+ /**
+ * Run hook `name` for the given array of `suites`
+ * in order, and callback `fn(err, errSuite)`.
+ *
+ * @private
+ * @param {string} name
+ * @param {Array} suites
+ * @param {Function} fn
+ */
+
+
+ Runner.prototype.hooks = function (name, suites, fn) {
+ var self = this;
+ var orig = this.suite;
+
+ function next(suite) {
+ self.suite = suite;
+
+ if (!suite) {
+ self.suite = orig;
+ return fn();
+ }
+
+ self.hook(name, function (err) {
+ if (err) {
+ var errSuite = self.suite;
+ self.suite = orig;
+ return fn(err, errSuite);
+ }
+
+ next(suites.pop());
+ });
+ }
+
+ next(suites.pop());
+ };
+ /**
+ * Run 'afterEach' hooks from bottom up.
+ *
+ * @param {String} name
+ * @param {Function} fn
+ * @private
+ */
+
+
+ Runner.prototype.hookUp = function (name, fn) {
+ var suites = [this.suite].concat(this.parents()).reverse();
+ this.hooks(name, suites, fn);
+ };
+ /**
+ * Run 'beforeEach' hooks from top level down.
+ *
+ * @param {String} name
+ * @param {Function} fn
+ * @private
+ */
+
+
+ Runner.prototype.hookDown = function (name, fn) {
+ var suites = [this.suite].concat(this.parents());
+ this.hooks(name, suites, fn);
+ };
+ /**
+ * Return an array of parent Suites from
+ * closest to furthest.
+ *
+ * @return {Array}
+ * @private
+ */
+
+
+ Runner.prototype.parents = function () {
+ var suite = this.suite;
+ var suites = [];
+
+ while (suite.parent) {
+ suite = suite.parent;
+ suites.push(suite);
+ }
+
+ return suites;
+ };
+ /**
+ * Run the current test and callback `fn(err)`.
+ *
+ * @param {Function} fn
+ * @private
+ */
+
+
+ Runner.prototype.runTest = function (fn) {
+ if (this._opts.dryRun) return fn();
+ var self = this;
+ var test = this.test;
+
+ if (!test) {
+ return;
+ }
+
+ if (this.asyncOnly) {
+ test.asyncOnly = true;
+ }
+
+ this._addEventListener(test, 'error', function (err) {
+ self.fail(test, err);
+ });
+
+ if (this.allowUncaught) {
+ test.allowUncaught = true;
+ return test.run(fn);
+ }
+
+ try {
+ test.run(fn);
+ } catch (err) {
+ fn(err);
+ }
+ };
+ /**
+ * Run tests in the given `suite` and invoke the callback `fn()` when complete.
+ *
+ * @private
+ * @param {Suite} suite
+ * @param {Function} fn
+ */
+
+
+ Runner.prototype.runTests = function (suite, fn) {
+ var self = this;
+ var tests = suite.tests.slice();
+ var test;
+
+ function hookErr(_, errSuite, after) {
+ // before/after Each hook for errSuite failed:
+ var orig = self.suite; // for failed 'after each' hook start from errSuite parent,
+ // otherwise start from errSuite itself
+
+ self.suite = after ? errSuite.parent : errSuite;
+
+ if (self.suite) {
+ self.hookUp(HOOK_TYPE_AFTER_EACH, function (err2, errSuite2) {
+ self.suite = orig; // some hooks may fail even now
+
+ if (err2) {
+ return hookErr(err2, errSuite2, true);
+ } // report error suite
+
+
+ fn(errSuite);
+ });
+ } else {
+ // there is no need calling other 'after each' hooks
+ self.suite = orig;
+ fn(errSuite);
+ }
+ }
+
+ function next(err, errSuite) {
+ // if we bail after first err
+ if (self.failures && suite._bail) {
+ tests = [];
+ }
+
+ if (self._abort) {
+ return fn();
+ }
+
+ if (err) {
+ return hookErr(err, errSuite, true);
+ } // next test
+
+
+ test = tests.shift(); // all done
+
+ if (!test) {
+ return fn();
+ } // grep
+
+
+ var match = self._grep.test(test.fullTitle());
+
+ if (self._invert) {
+ match = !match;
+ }
+
+ if (!match) {
+ // Run immediately only if we have defined a grep. When we
+ // define a grep — It can cause maximum callstack error if
+ // the grep is doing a large recursive loop by neglecting
+ // all tests. The run immediately function also comes with
+ // a performance cost. So we don't want to run immediately
+ // if we run the whole test suite, because running the whole
+ // test suite don't do any immediate recursive loops. Thus,
+ // allowing a JS runtime to breathe.
+ if (self._grep !== self._defaultGrep) {
+ Runner.immediately(next);
+ } else {
+ next();
+ }
+
+ return;
+ } // static skip, no hooks are executed
+
+
+ if (test.isPending()) {
+ if (self.forbidPending) {
+ self.fail(test, new Error('Pending test forbidden'), true);
+ } else {
+ test.state = STATE_PENDING;
+ self.emit(constants$1.EVENT_TEST_PENDING, test);
+ }
+
+ self.emit(constants$1.EVENT_TEST_END, test);
+ return next();
+ } // execute test and hook(s)
+
+
+ self.emit(constants$1.EVENT_TEST_BEGIN, self.test = test);
+ self.hookDown(HOOK_TYPE_BEFORE_EACH, function (err, errSuite) {
+ // conditional skip within beforeEach
+ if (test.isPending()) {
+ if (self.forbidPending) {
+ self.fail(test, new Error('Pending test forbidden'), true);
+ } else {
+ test.state = STATE_PENDING;
+ self.emit(constants$1.EVENT_TEST_PENDING, test);
+ }
+
+ self.emit(constants$1.EVENT_TEST_END, test); // skip inner afterEach hooks below errSuite level
+
+ var origSuite = self.suite;
+ self.suite = errSuite || self.suite;
+ return self.hookUp(HOOK_TYPE_AFTER_EACH, function (e, eSuite) {
+ self.suite = origSuite;
+ next(e, eSuite);
+ });
+ }
+
+ if (err) {
+ return hookErr(err, errSuite, false);
+ }
+
+ self.currentRunnable = self.test;
+ self.runTest(function (err) {
+ test = self.test; // conditional skip within it
+
+ if (test.pending) {
+ if (self.forbidPending) {
+ self.fail(test, new Error('Pending test forbidden'), true);
+ } else {
+ test.state = STATE_PENDING;
+ self.emit(constants$1.EVENT_TEST_PENDING, test);
+ }
+
+ self.emit(constants$1.EVENT_TEST_END, test);
+ return self.hookUp(HOOK_TYPE_AFTER_EACH, next);
+ } else if (err) {
+ var retry = test.currentRetry();
+
+ if (retry < test.retries()) {
+ var clonedTest = test.clone();
+ clonedTest.currentRetry(retry + 1);
+ tests.unshift(clonedTest);
+ self.emit(constants$1.EVENT_TEST_RETRY, test, err); // Early return + hook trigger so that it doesn't
+ // increment the count wrong
+
+ return self.hookUp(HOOK_TYPE_AFTER_EACH, next);
+ } else {
+ self.fail(test, err);
+ }
+
+ self.emit(constants$1.EVENT_TEST_END, test);
+ return self.hookUp(HOOK_TYPE_AFTER_EACH, next);
+ }
+
+ test.state = STATE_PASSED;
+ self.emit(constants$1.EVENT_TEST_PASS, test);
+ self.emit(constants$1.EVENT_TEST_END, test);
+ self.hookUp(HOOK_TYPE_AFTER_EACH, next);
+ });
+ });
+ }
+
+ this.next = next;
+ this.hookErr = hookErr;
+ next();
+ };
+ /**
+ * Run the given `suite` and invoke the callback `fn()` when complete.
+ *
+ * @private
+ * @param {Suite} suite
+ * @param {Function} fn
+ */
+
+
+ Runner.prototype.runSuite = function (suite, fn) {
+ var i = 0;
+ var self = this;
+ var total = this.grepTotal(suite);
+ debug('runSuite(): running %s', suite.fullTitle());
+
+ if (!total || self.failures && suite._bail) {
+ debug('runSuite(): bailing');
+ return fn();
+ }
+
+ this.emit(constants$1.EVENT_SUITE_BEGIN, this.suite = suite);
+
+ function next(errSuite) {
+ if (errSuite) {
+ // current suite failed on a hook from errSuite
+ if (errSuite === suite) {
+ // if errSuite is current suite
+ // continue to the next sibling suite
+ return done();
+ } // errSuite is among the parents of current suite
+ // stop execution of errSuite and all sub-suites
+
+
+ return done(errSuite);
+ }
+
+ if (self._abort) {
+ return done();
+ }
+
+ var curr = suite.suites[i++];
+
+ if (!curr) {
+ return done();
+ } // Avoid grep neglecting large number of tests causing a
+ // huge recursive loop and thus a maximum call stack error.
+ // See comment in `this.runTests()` for more information.
+
+
+ if (self._grep !== self._defaultGrep) {
+ Runner.immediately(function () {
+ self.runSuite(curr, next);
+ });
+ } else {
+ self.runSuite(curr, next);
+ }
+ }
+
+ function done(errSuite) {
+ self.suite = suite;
+ self.nextSuite = next; // remove reference to test
+
+ delete self.test;
+ self.hook(HOOK_TYPE_AFTER_ALL, function () {
+ self.emit(constants$1.EVENT_SUITE_END, suite);
+ fn(errSuite);
+ });
+ }
+
+ this.nextSuite = next;
+ this.hook(HOOK_TYPE_BEFORE_ALL, function (err) {
+ if (err) {
+ return done();
+ }
+
+ self.runTests(suite, next);
+ });
+ };
+ /**
+ * Handle uncaught exceptions within runner.
+ *
+ * This function is bound to the instance as `Runner#uncaught` at instantiation
+ * time. It's intended to be listening on the `Process.uncaughtException` event.
+ * In order to not leak EE listeners, we need to ensure no more than a single
+ * `uncaughtException` listener exists per `Runner`. The only way to do
+ * this--because this function needs the context (and we don't have lambdas)--is
+ * to use `Function.prototype.bind`. We need strict equality to unregister and
+ * _only_ unregister the _one_ listener we set from the
+ * `Process.uncaughtException` event; would be poor form to just remove
+ * everything. See {@link Runner#run} for where the event listener is registered
+ * and unregistered.
+ * @param {Error} err - Some uncaught error
+ * @private
+ */
+
+
+ Runner.prototype._uncaught = function (err) {
+ // this is defensive to prevent future developers from mis-calling this function.
+ // it's more likely that it'd be called with the incorrect context--say, the global
+ // `process` object--than it would to be called with a context that is not a "subclass"
+ // of `Runner`.
+ if (!(this instanceof Runner)) {
+ throw createFatalError('Runner#uncaught() called with invalid context', this);
+ }
+
+ if (err instanceof pending) {
+ debug('uncaught(): caught a Pending');
+ return;
+ } // browser does not exit script when throwing in global.onerror()
+
+
+ if (this.allowUncaught && !utils.isBrowser()) {
+ debug('uncaught(): bubbling exception due to --allow-uncaught');
+ throw err;
+ }
+
+ if (this.state === constants$1.STATE_STOPPED) {
+ debug('uncaught(): throwing after run has completed!');
+ throw err;
+ }
+
+ if (err) {
+ debug('uncaught(): got truthy exception %O', err);
+ } else {
+ debug('uncaught(): undefined/falsy exception');
+ err = createInvalidExceptionError('Caught falsy/undefined exception which would otherwise be uncaught. No stack trace found; try a debugger', err);
+ }
+
+ if (!isError(err)) {
+ err = thrown2Error(err);
+ debug('uncaught(): converted "error" %o to Error', err);
+ }
+
+ err.uncaught = true;
+ var runnable$1 = this.currentRunnable;
+
+ if (!runnable$1) {
+ runnable$1 = new runnable('Uncaught error outside test suite');
+ debug('uncaught(): no current Runnable; created a phony one');
+ runnable$1.parent = this.suite;
+
+ if (this.state === constants$1.STATE_RUNNING) {
+ debug('uncaught(): failing gracefully');
+ this.fail(runnable$1, err);
+ } else {
+ // Can't recover from this failure
+ debug('uncaught(): test run has not yet started; unrecoverable');
+ this.emit(constants$1.EVENT_RUN_BEGIN);
+ this.fail(runnable$1, err);
+ this.emit(constants$1.EVENT_RUN_END);
+ }
+
+ return;
+ }
+
+ runnable$1.clearTimeout();
+
+ if (runnable$1.isFailed()) {
+ debug('uncaught(): Runnable has already failed'); // Ignore error if already failed
+
+ return;
+ } else if (runnable$1.isPending()) {
+ debug('uncaught(): pending Runnable wound up failing!'); // report 'pending test' retrospectively as failed
+
+ this.fail(runnable$1, err, true);
+ return;
+ } // we cannot recover gracefully if a Runnable has already passed
+ // then fails asynchronously
+
+
+ if (runnable$1.isPassed()) {
+ debug('uncaught(): Runnable has already passed; bailing gracefully');
+ this.fail(runnable$1, err);
+ this.abort();
+ } else {
+ debug('uncaught(): forcing Runnable to complete with Error');
+ return runnable$1.callback(err);
+ }
+ };
+ /**
+ * Run the root suite and invoke `fn(failures)`
+ * on completion.
+ *
+ * @public
+ * @memberof Runner
+ * @param {Function} fn - Callback when finished
+ * @param {{files: string[], options: Options}} [opts] - For subclasses
+ * @returns {Runner} Runner instance.
+ */
+
+
+ Runner.prototype.run = function (fn) {
+ var _this2 = this;
+
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ var rootSuite = this.suite;
+ var options = opts.options || {};
+ debug('run(): got options: %O', options);
+
+ fn = fn || function () {};
+
+ var end = function end() {
+ if (!_this2.total && _this2._opts.failZero) _this2.failures = 1;
+ debug('run(): root suite completed; emitting %s', constants$1.EVENT_RUN_END);
+
+ _this2.emit(constants$1.EVENT_RUN_END);
+ };
+
+ var begin = function begin() {
+ debug('run(): emitting %s', constants$1.EVENT_RUN_BEGIN);
+
+ _this2.emit(constants$1.EVENT_RUN_BEGIN);
+
+ debug('run(): emitted %s', constants$1.EVENT_RUN_BEGIN);
+
+ _this2.runSuite(rootSuite, end);
+ };
+
+ var prepare = function prepare() {
+ debug('run(): starting'); // If there is an `only` filter
+
+ if (rootSuite.hasOnly()) {
+ rootSuite.filterOnly();
+ debug('run(): filtered exclusive Runnables');
+ }
+
+ _this2.state = constants$1.STATE_RUNNING;
+
+ if (_this2._delay) {
+ _this2.emit(constants$1.EVENT_DELAY_END);
+
+ debug('run(): "delay" ended');
+ }
+
+ return begin();
+ }; // references cleanup to avoid memory leaks
+
+
+ if (this._opts.cleanReferencesAfterRun) {
+ this.on(constants$1.EVENT_SUITE_END, function (suite) {
+ suite.cleanReferences();
+ });
+ } // callback
+
+
+ this.on(constants$1.EVENT_RUN_END, function () {
+ this.state = constants$1.STATE_STOPPED;
+ debug('run(): emitted %s', constants$1.EVENT_RUN_END);
+ fn(this.failures);
+ });
+
+ this._removeEventListener(process$4, 'uncaughtException', this.uncaught);
+
+ this._removeEventListener(process$4, 'unhandledRejection', this.unhandled);
+
+ this._addEventListener(process$4, 'uncaughtException', this.uncaught);
+
+ this._addEventListener(process$4, 'unhandledRejection', this.unhandled);
+
+ if (this._delay) {
+ // for reporters, I guess.
+ // might be nice to debounce some dots while we wait.
+ this.emit(constants$1.EVENT_DELAY_BEGIN, rootSuite);
+ rootSuite.once(EVENT_ROOT_SUITE_RUN, prepare);
+ debug('run(): waiting for green light due to --delay');
+ } else {
+ Runner.immediately(prepare);
+ }
+
+ return this;
+ };
+ /**
+ * Toggle partial object linking behavior; used for building object references from
+ * unique ID's. Does nothing in serial mode, because the object references already exist.
+ * Subclasses can implement this (e.g., `ParallelBufferedRunner`)
+ * @abstract
+ * @param {boolean} [value] - If `true`, enable partial object linking, otherwise disable
+ * @returns {Runner}
+ * @chainable
+ * @public
+ * @example
+ * // this reporter needs proper object references when run in parallel mode
+ * class MyReporter() {
+ * constructor(runner) {
+ * this.runner.linkPartialObjects(true)
+ * .on(EVENT_SUITE_BEGIN, suite => {
+ // this Suite may be the same object...
+ * })
+ * .on(EVENT_TEST_BEGIN, test => {
+ * // ...as the `test.parent` property
+ * });
+ * }
+ * }
+ */
+
+
+ Runner.prototype.linkPartialObjects = function (value) {
+ return this;
+ };
+ /*
+ * Like {@link Runner#run}, but does not accept a callback and returns a `Promise` instead of a `Runner`.
+ * This function cannot reject; an `unhandledRejection` event will bubble up to the `process` object instead.
+ * @public
+ * @memberof Runner
+ * @param {Object} [opts] - Options for {@link Runner#run}
+ * @returns {Promise} Failure count
+ */
+
+
+ Runner.prototype.runAsync = /*#__PURE__*/function () {
+ var _runAsync = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
+ var _this3 = this;
+
+ var opts,
+ _args = arguments;
+ return regeneratorRuntime.wrap(function _callee$(_context) {
+ while (1) {
+ switch (_context.prev = _context.next) {
+ case 0:
+ opts = _args.length > 0 && _args[0] !== undefined ? _args[0] : {};
+ return _context.abrupt("return", new Promise(function (resolve) {
+ _this3.run(resolve, opts);
+ }));
+
+ case 2:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee);
+ }));
+
+ function runAsync() {
+ return _runAsync.apply(this, arguments);
+ }
+
+ return runAsync;
+ }();
+ /**
+ * Cleanly abort execution.
+ *
+ * @memberof Runner
+ * @public
+ * @return {Runner} Runner instance.
+ */
+
+
+ Runner.prototype.abort = function () {
+ debug('abort(): aborting');
+ this._abort = true;
+ return this;
+ };
+ /**
+ * Returns `true` if Mocha is running in parallel mode. For reporters.
+ *
+ * Subclasses should return an appropriate value.
+ * @public
+ * @returns {false}
+ */
+
+
+ Runner.prototype.isParallelMode = function isParallelMode() {
+ return false;
+ };
+ /**
+ * Configures an alternate reporter for worker processes to use. Subclasses
+ * using worker processes should implement this.
+ * @public
+ * @param {string} path - Absolute path to alternate reporter for worker processes to use
+ * @returns {Runner}
+ * @throws When in serial mode
+ * @chainable
+ * @abstract
+ */
+
+
+ Runner.prototype.workerReporter = function () {
+ throw createUnsupportedError$1('workerReporter() not supported in serial mode');
+ };
+ /**
+ * Filter leaks with the given globals flagged as `ok`.
+ *
+ * @private
+ * @param {Array} ok
+ * @param {Array} globals
+ * @return {Array}
+ */
+
+
+ function filterLeaks(ok, globals) {
+ return globals.filter(function (key) {
+ // Firefox and Chrome exposes iframes as index inside the window object
+ if (/^\d+/.test(key)) {
+ return false;
+ } // in firefox
+ // if runner runs in an iframe, this iframe's window.getInterface method
+ // not init at first it is assigned in some seconds
+
+
+ if (commonjsGlobal.navigator && /^getInterface/.test(key)) {
+ return false;
+ } // an iframe could be approached by window[iframeIndex]
+ // in ie6,7,8 and opera, iframeIndex is enumerable, this could cause leak
+
+
+ if (commonjsGlobal.navigator && /^\d+/.test(key)) {
+ return false;
+ } // Opera and IE expose global variables for HTML element IDs (issue #243)
+
+
+ if (/^mocha-/.test(key)) {
+ return false;
+ }
+
+ var matched = ok.filter(function (ok) {
+ if (~ok.indexOf('*')) {
+ return key.indexOf(ok.split('*')[0]) === 0;
+ }
+
+ return key === ok;
+ });
+ return !matched.length && (!commonjsGlobal.navigator || key !== 'onerror');
+ });
+ }
+ /**
+ * Check if argument is an instance of Error object or a duck-typed equivalent.
+ *
+ * @private
+ * @param {Object} err - object to check
+ * @param {string} err.message - error message
+ * @returns {boolean}
+ */
+
+
+ function isError(err) {
+ return err instanceof Error || err && typeof err.message === 'string';
+ }
+ /**
+ *
+ * Converts thrown non-extensible type into proper Error.
+ *
+ * @private
+ * @param {*} thrown - Non-extensible type thrown by code
+ * @return {Error}
+ */
+
+
+ function thrown2Error(err) {
+ return new Error("the ".concat(utils.canonicalType(err), " ").concat(stringify(err), " was thrown, throw an Error :)"));
+ }
+
+ Runner.constants = constants$1;
+ /**
+ * Node.js' `EventEmitter`
+ * @external EventEmitter
+ * @see {@link https://nodejs.org/api/events.html#events_class_eventemitter}
+ */
+
+ var runner = Runner;
+
+ var require$$10 = getCjsExportFromNamespace(_nodeResolve_empty$1);
+
+ var base = createCommonjsModule(function (module, exports) {
+ /**
+ * @module Base
+ */
+
+ /**
+ * Module dependencies.
+ */
+
+ var constants = runner.constants;
+ var EVENT_TEST_PASS = constants.EVENT_TEST_PASS;
+ var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL;
+ var isBrowser = utils.isBrowser();
+
+ function getBrowserWindowSize() {
+ if ('innerHeight' in commonjsGlobal) {
+ return [commonjsGlobal.innerHeight, commonjsGlobal.innerWidth];
+ } // In a Web Worker, the DOM Window is not available.
+
+
+ return [640, 480];
+ }
+ /**
+ * Expose `Base`.
+ */
+
+
+ exports = module.exports = Base;
+ /**
+ * Check if both stdio streams are associated with a tty.
+ */
+
+ var isatty = isBrowser || process$4.stdout.isTTY && process$4.stderr.isTTY;
+ /**
+ * Save log references to avoid tests interfering (see GH-3604).
+ */
+
+ var consoleLog = console.log;
+ /**
+ * Enable coloring by default, except in the browser interface.
+ */
+
+ exports.useColors = !isBrowser && (require$$10.stdout || process$4.env.MOCHA_COLORS !== undefined);
+ /**
+ * Inline diffs instead of +/-
+ */
+
+ exports.inlineDiffs = false;
+ /**
+ * Default color map.
+ */
+
+ exports.colors = {
+ pass: 90,
+ fail: 31,
+ 'bright pass': 92,
+ 'bright fail': 91,
+ 'bright yellow': 93,
+ pending: 36,
+ suite: 0,
+ 'error title': 0,
+ 'error message': 31,
+ 'error stack': 90,
+ checkmark: 32,
+ fast: 90,
+ medium: 33,
+ slow: 31,
+ green: 32,
+ light: 90,
+ 'diff gutter': 90,
+ 'diff added': 32,
+ 'diff removed': 31,
+ 'diff added inline': '30;42',
+ 'diff removed inline': '30;41'
+ };
+ /**
+ * Default symbol map.
+ */
+
+ exports.symbols = {
+ ok: browser$1.success,
+ err: browser$1.error,
+ dot: '.',
+ comma: ',',
+ bang: '!'
+ };
+ /**
+ * Color `str` with the given `type`,
+ * allowing colors to be disabled,
+ * as well as user-defined color
+ * schemes.
+ *
+ * @private
+ * @param {string} type
+ * @param {string} str
+ * @return {string}
+ */
+
+ var color = exports.color = function (type, str) {
+ if (!exports.useColors) {
+ return String(str);
+ }
+
+ return "\x1B[" + exports.colors[type] + 'm' + str + "\x1B[0m";
+ };
+ /**
+ * Expose term window size, with some defaults for when stderr is not a tty.
+ */
+
+
+ exports.window = {
+ width: 75
+ };
+
+ if (isatty) {
+ if (isBrowser) {
+ exports.window.width = getBrowserWindowSize()[1];
+ } else {
+ exports.window.width = process$4.stdout.getWindowSize(1)[0];
+ }
+ }
+ /**
+ * Expose some basic cursor interactions that are common among reporters.
+ */
+
+
+ exports.cursor = {
+ hide: function hide() {
+ isatty && process$4.stdout.write("\x1B[?25l");
+ },
+ show: function show() {
+ isatty && process$4.stdout.write("\x1B[?25h");
+ },
+ deleteLine: function deleteLine() {
+ isatty && process$4.stdout.write("\x1B[2K");
+ },
+ beginningOfLine: function beginningOfLine() {
+ isatty && process$4.stdout.write("\x1B[0G");
+ },
+ CR: function CR() {
+ if (isatty) {
+ exports.cursor.deleteLine();
+ exports.cursor.beginningOfLine();
+ } else {
+ process$4.stdout.write('\r');
+ }
+ }
+ };
+
+ var showDiff = exports.showDiff = function (err) {
+ return err && err.showDiff !== false && sameType(err.actual, err.expected) && err.expected !== undefined;
+ };
+
+ function stringifyDiffObjs(err) {
+ if (!utils.isString(err.actual) || !utils.isString(err.expected)) {
+ err.actual = utils.stringify(err.actual);
+ err.expected = utils.stringify(err.expected);
+ }
+ }
+ /**
+ * Returns a diff between 2 strings with coloured ANSI output.
+ *
+ * @description
+ * The diff will be either inline or unified dependent on the value
+ * of `Base.inlineDiff`.
+ *
+ * @param {string} actual
+ * @param {string} expected
+ * @return {string} Diff
+ */
+
+
+ var generateDiff = exports.generateDiff = function (actual, expected) {
+ try {
+ var diffSize = 2048;
+
+ if (actual.length > diffSize) {
+ actual = actual.substring(0, diffSize) + ' ... Lines skipped';
+ }
+
+ if (expected.length > diffSize) {
+ expected = expected.substring(0, diffSize) + ' ... Lines skipped';
+ }
+
+ return exports.inlineDiffs ? inlineDiff(actual, expected) : unifiedDiff(actual, expected);
+ } catch (err) {
+ var msg = '\n ' + color('diff added', '+ expected') + ' ' + color('diff removed', '- actual: failed to generate Mocha diff') + '\n';
+ return msg;
+ }
+ };
+ /**
+ * Outputs the given `failures` as a list.
+ *
+ * @public
+ * @memberof Mocha.reporters.Base
+ * @variation 1
+ * @param {Object[]} failures - Each is Test instance with corresponding
+ * Error property
+ */
+
+
+ exports.list = function (failures) {
+ var multipleErr, multipleTest;
+ Base.consoleLog();
+ failures.forEach(function (test, i) {
+ // format
+ var fmt = color('error title', ' %s) %s:\n') + color('error message', ' %s') + color('error stack', '\n%s\n'); // msg
+
+ var msg;
+ var err;
+
+ if (test.err && test.err.multiple) {
+ if (multipleTest !== test) {
+ multipleTest = test;
+ multipleErr = [test.err].concat(test.err.multiple);
+ }
+
+ err = multipleErr.shift();
+ } else {
+ err = test.err;
+ }
+
+ var message;
+
+ if (typeof err.inspect === 'function') {
+ message = err.inspect() + '';
+ } else if (err.message && typeof err.message.toString === 'function') {
+ message = err.message + '';
+ } else {
+ message = '';
+ }
+
+ var stack = err.stack || message;
+ var index = message ? stack.indexOf(message) : -1;
+
+ if (index === -1) {
+ msg = message;
+ } else {
+ index += message.length;
+ msg = stack.slice(0, index); // remove msg from stack
+
+ stack = stack.slice(index + 1);
+ } // uncaught
+
+
+ if (err.uncaught) {
+ msg = 'Uncaught ' + msg;
+ } // explicitly show diff
+
+
+ if (!exports.hideDiff && showDiff(err)) {
+ stringifyDiffObjs(err);
+ fmt = color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n');
+ var match = message.match(/^([^:]+): expected/);
+ msg = '\n ' + color('error message', match ? match[1] : msg);
+ msg += generateDiff(err.actual, err.expected);
+ } // indent stack trace
+
+
+ stack = stack.replace(/^/gm, ' '); // indented test title
+
+ var testTitle = '';
+ test.titlePath().forEach(function (str, index) {
+ if (index !== 0) {
+ testTitle += '\n ';
+ }
+
+ for (var i = 0; i < index; i++) {
+ testTitle += ' ';
+ }
+
+ testTitle += str;
+ });
+ Base.consoleLog(fmt, i + 1, testTitle, msg, stack);
+ });
+ };
+ /**
+ * Constructs a new `Base` reporter instance.
+ *
+ * @description
+ * All other reporters generally inherit from this reporter.
+ *
+ * @public
+ * @class
+ * @memberof Mocha.reporters
+ * @param {Runner} runner - Instance triggers reporter actions.
+ * @param {Object} [options] - runner options
+ */
+
+
+ function Base(runner, options) {
+ var failures = this.failures = [];
+
+ if (!runner) {
+ throw new TypeError('Missing runner argument');
+ }
+
+ this.options = options || {};
+ this.runner = runner;
+ this.stats = runner.stats; // assigned so Reporters keep a closer reference
+
+ runner.on(EVENT_TEST_PASS, function (test) {
+ if (test.duration > test.slow()) {
+ test.speed = 'slow';
+ } else if (test.duration > test.slow() / 2) {
+ test.speed = 'medium';
+ } else {
+ test.speed = 'fast';
+ }
+ });
+ runner.on(EVENT_TEST_FAIL, function (test, err) {
+ if (showDiff(err)) {
+ stringifyDiffObjs(err);
+ } // more than one error per test
+
+
+ if (test.err && err instanceof Error) {
+ test.err.multiple = (test.err.multiple || []).concat(err);
+ } else {
+ test.err = err;
+ }
+
+ failures.push(test);
+ });
+ }
+ /**
+ * Outputs common epilogue used by many of the bundled reporters.
+ *
+ * @public
+ * @memberof Mocha.reporters
+ */
+
+
+ Base.prototype.epilogue = function () {
+ var stats = this.stats;
+ var fmt;
+ Base.consoleLog(); // passes
+
+ fmt = color('bright pass', ' ') + color('green', ' %d passing') + color('light', ' (%s)');
+ Base.consoleLog(fmt, stats.passes || 0, ms$1(stats.duration)); // pending
+
+ if (stats.pending) {
+ fmt = color('pending', ' ') + color('pending', ' %d pending');
+ Base.consoleLog(fmt, stats.pending);
+ } // failures
+
+
+ if (stats.failures) {
+ fmt = color('fail', ' %d failing');
+ Base.consoleLog(fmt, stats.failures);
+ Base.list(this.failures);
+ Base.consoleLog();
+ }
+
+ Base.consoleLog();
+ };
+ /**
+ * Pads the given `str` to `len`.
+ *
+ * @private
+ * @param {string} str
+ * @param {string} len
+ * @return {string}
+ */
+
+
+ function pad(str, len) {
+ str = String(str);
+ return Array(len - str.length + 1).join(' ') + str;
+ }
+ /**
+ * Returns inline diff between 2 strings with coloured ANSI output.
+ *
+ * @private
+ * @param {String} actual
+ * @param {String} expected
+ * @return {string} Diff
+ */
+
+
+ function inlineDiff(actual, expected) {
+ var msg = errorDiff(actual, expected); // linenos
+
+ var lines = msg.split('\n');
+
+ if (lines.length > 4) {
+ var width = String(lines.length).length;
+ msg = lines.map(function (str, i) {
+ return pad(++i, width) + ' |' + ' ' + str;
+ }).join('\n');
+ } // legend
+
+
+ msg = '\n' + color('diff removed inline', 'actual') + ' ' + color('diff added inline', 'expected') + '\n\n' + msg + '\n'; // indent
+
+ msg = msg.replace(/^/gm, ' ');
+ return msg;
+ }
+ /**
+ * Returns unified diff between two strings with coloured ANSI output.
+ *
+ * @private
+ * @param {String} actual
+ * @param {String} expected
+ * @return {string} The diff.
+ */
+
+
+ function unifiedDiff(actual, expected) {
+ var indent = ' ';
+
+ function cleanUp(line) {
+ if (line[0] === '+') {
+ return indent + colorLines('diff added', line);
+ }
+
+ if (line[0] === '-') {
+ return indent + colorLines('diff removed', line);
+ }
+
+ if (line.match(/@@/)) {
+ return '--';
+ }
+
+ if (line.match(/\\ No newline/)) {
+ return null;
+ }
+
+ return indent + line;
+ }
+
+ function notBlank(line) {
+ return typeof line !== 'undefined' && line !== null;
+ }
+
+ var msg = diff$1.createPatch('string', actual, expected);
+ var lines = msg.split('\n').splice(5);
+ return '\n ' + colorLines('diff added', '+ expected') + ' ' + colorLines('diff removed', '- actual') + '\n\n' + lines.map(cleanUp).filter(notBlank).join('\n');
+ }
+ /**
+ * Returns character diff for `err`.
+ *
+ * @private
+ * @param {String} actual
+ * @param {String} expected
+ * @return {string} the diff
+ */
+
+
+ function errorDiff(actual, expected) {
+ return diff$1.diffWordsWithSpace(actual, expected).map(function (str) {
+ if (str.added) {
+ return colorLines('diff added inline', str.value);
+ }
+
+ if (str.removed) {
+ return colorLines('diff removed inline', str.value);
+ }
+
+ return str.value;
+ }).join('');
+ }
+ /**
+ * Colors lines for `str`, using the color `name`.
+ *
+ * @private
+ * @param {string} name
+ * @param {string} str
+ * @return {string}
+ */
+
+
+ function colorLines(name, str) {
+ return str.split('\n').map(function (str) {
+ return color(name, str);
+ }).join('\n');
+ }
+ /**
+ * Object#toString reference.
+ */
+
+
+ var objToString = Object.prototype.toString;
+ /**
+ * Checks that a / b have the same type.
+ *
+ * @private
+ * @param {Object} a
+ * @param {Object} b
+ * @return {boolean}
+ */
+
+ function sameType(a, b) {
+ return objToString.call(a) === objToString.call(b);
+ }
+
+ Base.consoleLog = consoleLog;
+ Base["abstract"] = true;
+ });
+
+ var dot = createCommonjsModule(function (module, exports) {
+ /**
+ * @module Dot
+ */
+
+ /**
+ * Module dependencies.
+ */
+
+ var inherits = utils.inherits;
+ var constants = runner.constants;
+ var EVENT_TEST_PASS = constants.EVENT_TEST_PASS;
+ var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL;
+ var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN;
+ var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING;
+ var EVENT_RUN_END = constants.EVENT_RUN_END;
+ /**
+ * Expose `Dot`.
+ */
+
+ module.exports = Dot;
+ /**
+ * Constructs a new `Dot` reporter instance.
+ *
+ * @public
+ * @class
+ * @memberof Mocha.reporters
+ * @extends Mocha.reporters.Base
+ * @param {Runner} runner - Instance triggers reporter actions.
+ * @param {Object} [options] - runner options
+ */
+
+ function Dot(runner, options) {
+ base.call(this, runner, options);
+ var self = this;
+ var width = base.window.width * 0.75 | 0;
+ var n = -1;
+ runner.on(EVENT_RUN_BEGIN, function () {
+ process$4.stdout.write('\n');
+ });
+ runner.on(EVENT_TEST_PENDING, function () {
+ if (++n % width === 0) {
+ process$4.stdout.write('\n ');
+ }
+
+ process$4.stdout.write(base.color('pending', base.symbols.comma));
+ });
+ runner.on(EVENT_TEST_PASS, function (test) {
+ if (++n % width === 0) {
+ process$4.stdout.write('\n ');
+ }
+
+ if (test.speed === 'slow') {
+ process$4.stdout.write(base.color('bright yellow', base.symbols.dot));
+ } else {
+ process$4.stdout.write(base.color(test.speed, base.symbols.dot));
+ }
+ });
+ runner.on(EVENT_TEST_FAIL, function () {
+ if (++n % width === 0) {
+ process$4.stdout.write('\n ');
+ }
+
+ process$4.stdout.write(base.color('fail', base.symbols.bang));
+ });
+ runner.once(EVENT_RUN_END, function () {
+ process$4.stdout.write('\n');
+ self.epilogue();
+ });
+ }
+ /**
+ * Inherit from `Base.prototype`.
+ */
+
+
+ inherits(Dot, base);
+ Dot.description = 'dot matrix representation';
+ });
+
+ var doc = createCommonjsModule(function (module, exports) {
+ /**
+ * @module Doc
+ */
+
+ /**
+ * Module dependencies.
+ */
+
+ var constants = runner.constants;
+ var EVENT_TEST_PASS = constants.EVENT_TEST_PASS;
+ var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL;
+ var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN;
+ var EVENT_SUITE_END = constants.EVENT_SUITE_END;
+ /**
+ * Expose `Doc`.
+ */
+
+ module.exports = Doc;
+ /**
+ * Constructs a new `Doc` reporter instance.
+ *
+ * @public
+ * @class
+ * @memberof Mocha.reporters
+ * @extends Mocha.reporters.Base
+ * @param {Runner} runner - Instance triggers reporter actions.
+ * @param {Object} [options] - runner options
+ */
+
+ function Doc(runner, options) {
+ base.call(this, runner, options);
+ var indents = 2;
+
+ function indent() {
+ return Array(indents).join(' ');
+ }
+
+ runner.on(EVENT_SUITE_BEGIN, function (suite) {
+ if (suite.root) {
+ return;
+ }
+
+ ++indents;
+ base.consoleLog('%s', indent());
+ ++indents;
+ base.consoleLog('%s%s ', indent(), utils.escape(suite.title));
+ base.consoleLog('%s', indent());
+ });
+ runner.on(EVENT_SUITE_END, function (suite) {
+ if (suite.root) {
+ return;
+ }
+
+ base.consoleLog('%s ', indent());
+ --indents;
+ base.consoleLog('%s ', indent());
+ --indents;
+ });
+ runner.on(EVENT_TEST_PASS, function (test) {
+ base.consoleLog('%s %s ', indent(), utils.escape(test.title));
+ base.consoleLog('%s %s ', indent(), utils.escape(test.file));
+ var code = utils.escape(utils.clean(test.body));
+ base.consoleLog('%s %s
', indent(), code);
+ });
+ runner.on(EVENT_TEST_FAIL, function (test, err) {
+ base.consoleLog('%s %s ', indent(), utils.escape(test.title));
+ base.consoleLog('%s %s ', indent(), utils.escape(test.file));
+ var code = utils.escape(utils.clean(test.body));
+ base.consoleLog('%s %s
', indent(), code);
+ base.consoleLog('%s %s ', indent(), utils.escape(err));
+ });
+ }
+
+ Doc.description = 'HTML documentation';
+ });
+
+ var tap = createCommonjsModule(function (module, exports) {
+ /**
+ * @module TAP
+ */
+
+ /**
+ * Module dependencies.
+ */
+
+ var constants = runner.constants;
+ var EVENT_TEST_PASS = constants.EVENT_TEST_PASS;
+ var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL;
+ var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN;
+ var EVENT_RUN_END = constants.EVENT_RUN_END;
+ var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING;
+ var EVENT_TEST_END = constants.EVENT_TEST_END;
+ var inherits = utils.inherits;
+ var sprintf = util.format;
+ /**
+ * Expose `TAP`.
+ */
+
+ module.exports = TAP;
+ /**
+ * Constructs a new `TAP` reporter instance.
+ *
+ * @public
+ * @class
+ * @memberof Mocha.reporters
+ * @extends Mocha.reporters.Base
+ * @param {Runner} runner - Instance triggers reporter actions.
+ * @param {Object} [options] - runner options
+ */
+
+ function TAP(runner, options) {
+ base.call(this, runner, options);
+ var self = this;
+ var n = 1;
+ var tapVersion = '12';
+
+ if (options && options.reporterOptions) {
+ if (options.reporterOptions.tapVersion) {
+ tapVersion = options.reporterOptions.tapVersion.toString();
+ }
+ }
+
+ this._producer = createProducer(tapVersion);
+ runner.once(EVENT_RUN_BEGIN, function () {
+ self._producer.writeVersion();
+ });
+ runner.on(EVENT_TEST_END, function () {
+ ++n;
+ });
+ runner.on(EVENT_TEST_PENDING, function (test) {
+ self._producer.writePending(n, test);
+ });
+ runner.on(EVENT_TEST_PASS, function (test) {
+ self._producer.writePass(n, test);
+ });
+ runner.on(EVENT_TEST_FAIL, function (test, err) {
+ self._producer.writeFail(n, test, err);
+ });
+ runner.once(EVENT_RUN_END, function () {
+ self._producer.writeEpilogue(runner.stats);
+ });
+ }
+ /**
+ * Inherit from `Base.prototype`.
+ */
+
+
+ inherits(TAP, base);
+ /**
+ * Returns a TAP-safe title of `test`.
+ *
+ * @private
+ * @param {Test} test - Test instance.
+ * @return {String} title with any hash character removed
+ */
+
+ function title(test) {
+ return test.fullTitle().replace(/#/g, '');
+ }
+ /**
+ * Writes newline-terminated formatted string to reporter output stream.
+ *
+ * @private
+ * @param {string} format - `printf`-like format string
+ * @param {...*} [varArgs] - Format string arguments
+ */
+
+
+ function println(format, varArgs) {
+ var vargs = Array.from(arguments);
+ vargs[0] += '\n';
+ process$4.stdout.write(sprintf.apply(null, vargs));
+ }
+ /**
+ * Returns a `tapVersion`-appropriate TAP producer instance, if possible.
+ *
+ * @private
+ * @param {string} tapVersion - Version of TAP specification to produce.
+ * @returns {TAPProducer} specification-appropriate instance
+ * @throws {Error} if specification version has no associated producer.
+ */
+
+
+ function createProducer(tapVersion) {
+ var producers = {
+ '12': new TAP12Producer(),
+ '13': new TAP13Producer()
+ };
+ var producer = producers[tapVersion];
+
+ if (!producer) {
+ throw new Error('invalid or unsupported TAP version: ' + JSON.stringify(tapVersion));
+ }
+
+ return producer;
+ }
+ /**
+ * @summary
+ * Constructs a new TAPProducer.
+ *
+ * @description
+ * Only to be used as an abstract base class.
+ *
+ * @private
+ * @constructor
+ */
+
+
+ function TAPProducer() {}
+ /**
+ * Writes the TAP version to reporter output stream.
+ *
+ * @abstract
+ */
+
+
+ TAPProducer.prototype.writeVersion = function () {};
+ /**
+ * Writes the plan to reporter output stream.
+ *
+ * @abstract
+ * @param {number} ntests - Number of tests that are planned to run.
+ */
+
+
+ TAPProducer.prototype.writePlan = function (ntests) {
+ println('%d..%d', 1, ntests);
+ };
+ /**
+ * Writes that test passed to reporter output stream.
+ *
+ * @abstract
+ * @param {number} n - Index of test that passed.
+ * @param {Test} test - Instance containing test information.
+ */
+
+
+ TAPProducer.prototype.writePass = function (n, test) {
+ println('ok %d %s', n, title(test));
+ };
+ /**
+ * Writes that test was skipped to reporter output stream.
+ *
+ * @abstract
+ * @param {number} n - Index of test that was skipped.
+ * @param {Test} test - Instance containing test information.
+ */
+
+
+ TAPProducer.prototype.writePending = function (n, test) {
+ println('ok %d %s # SKIP -', n, title(test));
+ };
+ /**
+ * Writes that test failed to reporter output stream.
+ *
+ * @abstract
+ * @param {number} n - Index of test that failed.
+ * @param {Test} test - Instance containing test information.
+ * @param {Error} err - Reason the test failed.
+ */
+
+
+ TAPProducer.prototype.writeFail = function (n, test, err) {
+ println('not ok %d %s', n, title(test));
+ };
+ /**
+ * Writes the summary epilogue to reporter output stream.
+ *
+ * @abstract
+ * @param {Object} stats - Object containing run statistics.
+ */
+
+
+ TAPProducer.prototype.writeEpilogue = function (stats) {
+ // :TBD: Why is this not counting pending tests?
+ println('# tests ' + (stats.passes + stats.failures));
+ println('# pass ' + stats.passes); // :TBD: Why are we not showing pending results?
+
+ println('# fail ' + stats.failures);
+ this.writePlan(stats.passes + stats.failures + stats.pending);
+ };
+ /**
+ * @summary
+ * Constructs a new TAP12Producer.
+ *
+ * @description
+ * Produces output conforming to the TAP12 specification.
+ *
+ * @private
+ * @constructor
+ * @extends TAPProducer
+ * @see {@link https://testanything.org/tap-specification.html|Specification}
+ */
+
+
+ function TAP12Producer() {
+ /**
+ * Writes that test failed to reporter output stream, with error formatting.
+ * @override
+ */
+ this.writeFail = function (n, test, err) {
+ TAPProducer.prototype.writeFail.call(this, n, test, err);
+
+ if (err.message) {
+ println(err.message.replace(/^/gm, ' '));
+ }
+
+ if (err.stack) {
+ println(err.stack.replace(/^/gm, ' '));
+ }
+ };
+ }
+ /**
+ * Inherit from `TAPProducer.prototype`.
+ */
+
+
+ inherits(TAP12Producer, TAPProducer);
+ /**
+ * @summary
+ * Constructs a new TAP13Producer.
+ *
+ * @description
+ * Produces output conforming to the TAP13 specification.
+ *
+ * @private
+ * @constructor
+ * @extends TAPProducer
+ * @see {@link https://testanything.org/tap-version-13-specification.html|Specification}
+ */
+
+ function TAP13Producer() {
+ /**
+ * Writes the TAP version to reporter output stream.
+ * @override
+ */
+ this.writeVersion = function () {
+ println('TAP version 13');
+ };
+ /**
+ * Writes that test failed to reporter output stream, with error formatting.
+ * @override
+ */
+
+
+ this.writeFail = function (n, test, err) {
+ TAPProducer.prototype.writeFail.call(this, n, test, err);
+ var emitYamlBlock = err.message != null || err.stack != null;
+
+ if (emitYamlBlock) {
+ println(indent(1) + '---');
+
+ if (err.message) {
+ println(indent(2) + 'message: |-');
+ println(err.message.replace(/^/gm, indent(3)));
+ }
+
+ if (err.stack) {
+ println(indent(2) + 'stack: |-');
+ println(err.stack.replace(/^/gm, indent(3)));
+ }
+
+ println(indent(1) + '...');
+ }
+ };
+
+ function indent(level) {
+ return Array(level + 1).join(' ');
+ }
+ }
+ /**
+ * Inherit from `TAPProducer.prototype`.
+ */
+
+
+ inherits(TAP13Producer, TAPProducer);
+ TAP.description = 'TAP-compatible output';
+ });
+
+ var fs = {};
+
+ var json = createCommonjsModule(function (module, exports) {
+ /**
+ * @module JSON
+ */
+
+ /**
+ * Module dependencies.
+ */
+
+ var createUnsupportedError = errors.createUnsupportedError;
+ var constants = runner.constants;
+ var EVENT_TEST_PASS = constants.EVENT_TEST_PASS;
+ var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING;
+ var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL;
+ var EVENT_TEST_END = constants.EVENT_TEST_END;
+ var EVENT_RUN_END = constants.EVENT_RUN_END;
+ /**
+ * Expose `JSON`.
+ */
+
+ module.exports = JSONReporter;
+ /**
+ * Constructs a new `JSON` reporter instance.
+ *
+ * @public
+ * @class JSON
+ * @memberof Mocha.reporters
+ * @extends Mocha.reporters.Base
+ * @param {Runner} runner - Instance triggers reporter actions.
+ * @param {Object} [options] - runner options
+ */
+
+ function JSONReporter(runner) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ base.call(this, runner, options);
+ var self = this;
+ var tests = [];
+ var pending = [];
+ var failures = [];
+ var passes = [];
+ var output;
+
+ if (options.reporterOption && options.reporterOption.output) {
+ if (utils.isBrowser()) {
+ throw createUnsupportedError('file output not supported in browser');
+ }
+
+ output = options.reporterOption.output;
+ }
+
+ runner.on(EVENT_TEST_END, function (test) {
+ tests.push(test);
+ });
+ runner.on(EVENT_TEST_PASS, function (test) {
+ passes.push(test);
+ });
+ runner.on(EVENT_TEST_FAIL, function (test) {
+ failures.push(test);
+ });
+ runner.on(EVENT_TEST_PENDING, function (test) {
+ pending.push(test);
+ });
+ runner.once(EVENT_RUN_END, function () {
+ var obj = {
+ stats: self.stats,
+ tests: tests.map(clean),
+ pending: pending.map(clean),
+ failures: failures.map(clean),
+ passes: passes.map(clean)
+ };
+ runner.testResults = obj;
+ var json = JSON.stringify(obj, null, 2);
+
+ if (output) {
+ try {
+ fs.mkdirSync(path.dirname(output), {
+ recursive: true
+ });
+ fs.writeFileSync(output, json);
+ } catch (err) {
+ console.error("".concat(base.symbols.err, " [mocha] writing output to \"").concat(output, "\" failed: ").concat(err.message, "\n"));
+ process$4.stdout.write(json);
+ }
+ } else {
+ process$4.stdout.write(json);
+ }
+ });
+ }
+ /**
+ * Return a plain-object representation of `test`
+ * free of cyclic properties etc.
+ *
+ * @private
+ * @param {Object} test
+ * @return {Object}
+ */
+
+
+ function clean(test) {
+ var err = test.err || {};
+
+ if (err instanceof Error) {
+ err = errorJSON(err);
+ }
+
+ return {
+ title: test.title,
+ fullTitle: test.fullTitle(),
+ file: test.file,
+ duration: test.duration,
+ currentRetry: test.currentRetry(),
+ speed: test.speed,
+ err: cleanCycles(err)
+ };
+ }
+ /**
+ * Replaces any circular references inside `obj` with '[object Object]'
+ *
+ * @private
+ * @param {Object} obj
+ * @return {Object}
+ */
+
+
+ function cleanCycles(obj) {
+ var cache = [];
+ return JSON.parse(JSON.stringify(obj, function (key, value) {
+ if (_typeof(value) === 'object' && value !== null) {
+ if (cache.indexOf(value) !== -1) {
+ // Instead of going in a circle, we'll print [object Object]
+ return '' + value;
+ }
+
+ cache.push(value);
+ }
+
+ return value;
+ }));
+ }
+ /**
+ * Transform an Error object into a JSON object.
+ *
+ * @private
+ * @param {Error} err
+ * @return {Object}
+ */
+
+
+ function errorJSON(err) {
+ var res = {};
+ Object.getOwnPropertyNames(err).forEach(function (key) {
+ res[key] = err[key];
+ }, err);
+ return res;
+ }
+
+ JSONReporter.description = 'single JSON object';
+ });
+
+ var valueOf = 1.0.valueOf;
+
+ // `thisNumberValue` abstract operation
+ // https://tc39.es/ecma262/#sec-thisnumbervalue
+ var thisNumberValue = function (value) {
+ return valueOf.call(value);
+ };
+
+ // `String.prototype.repeat` method implementation
+ // https://tc39.es/ecma262/#sec-string.prototype.repeat
+ var stringRepeat = function repeat(count) {
+ var str = toString_1(requireObjectCoercible(this));
+ var result = '';
+ var n = toInteger(count);
+ if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');
+ for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;
+ return result;
+ };
+
+ var nativeToFixed = 1.0.toFixed;
+ var floor = Math.floor;
+
+ var pow = function (x, n, acc) {
+ return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);
+ };
+
+ var log = function (x) {
+ var n = 0;
+ var x2 = x;
+ while (x2 >= 4096) {
+ n += 12;
+ x2 /= 4096;
+ }
+ while (x2 >= 2) {
+ n += 1;
+ x2 /= 2;
+ } return n;
+ };
+
+ var multiply = function (data, n, c) {
+ var index = -1;
+ var c2 = c;
+ while (++index < 6) {
+ c2 += n * data[index];
+ data[index] = c2 % 1e7;
+ c2 = floor(c2 / 1e7);
+ }
+ };
+
+ var divide = function (data, n) {
+ var index = 6;
+ var c = 0;
+ while (--index >= 0) {
+ c += data[index];
+ data[index] = floor(c / n);
+ c = (c % n) * 1e7;
+ }
+ };
+
+ var dataToString = function (data) {
+ var index = 6;
+ var s = '';
+ while (--index >= 0) {
+ if (s !== '' || index === 0 || data[index] !== 0) {
+ var t = String(data[index]);
+ s = s === '' ? t : s + stringRepeat.call('0', 7 - t.length) + t;
+ }
+ } return s;
+ };
+
+ var FORCED = nativeToFixed && (
+ 0.00008.toFixed(3) !== '0.000' ||
+ 0.9.toFixed(0) !== '1' ||
+ 1.255.toFixed(2) !== '1.25' ||
+ 1000000000000000128.0.toFixed(0) !== '1000000000000000128'
+ ) || !fails(function () {
+ // V8 ~ Android 4.3-
+ nativeToFixed.call({});
+ });
+
+ // `Number.prototype.toFixed` method
+ // https://tc39.es/ecma262/#sec-number.prototype.tofixed
+ _export({ target: 'Number', proto: true, forced: FORCED }, {
+ toFixed: function toFixed(fractionDigits) {
+ var number = thisNumberValue(this);
+ var fractDigits = toInteger(fractionDigits);
+ var data = [0, 0, 0, 0, 0, 0];
+ var sign = '';
+ var result = '0';
+ var e, z, j, k;
+
+ if (fractDigits < 0 || fractDigits > 20) throw RangeError('Incorrect fraction digits');
+ // eslint-disable-next-line no-self-compare -- NaN check
+ if (number != number) return 'NaN';
+ if (number <= -1e21 || number >= 1e21) return String(number);
+ if (number < 0) {
+ sign = '-';
+ number = -number;
+ }
+ if (number > 1e-21) {
+ e = log(number * pow(2, 69, 1)) - 69;
+ z = e < 0 ? number * pow(2, -e, 1) : number / pow(2, e, 1);
+ z *= 0x10000000000000;
+ e = 52 - e;
+ if (e > 0) {
+ multiply(data, 0, z);
+ j = fractDigits;
+ while (j >= 7) {
+ multiply(data, 1e7, 0);
+ j -= 7;
+ }
+ multiply(data, pow(10, j, 1), 0);
+ j = e - 1;
+ while (j >= 23) {
+ divide(data, 1 << 23);
+ j -= 23;
+ }
+ divide(data, 1 << j);
+ multiply(data, 1, 1);
+ divide(data, 2);
+ result = dataToString(data);
+ } else {
+ multiply(data, 0, z);
+ multiply(data, 1 << -e, 0);
+ result = dataToString(data) + stringRepeat.call('0', fractDigits);
+ }
+ }
+ if (fractDigits > 0) {
+ k = result.length;
+ result = sign + (k <= fractDigits
+ ? '0.' + stringRepeat.call('0', fractDigits - k) + result
+ : result.slice(0, k - fractDigits) + '.' + result.slice(k - fractDigits));
+ } else {
+ result = sign + result;
+ } return result;
+ }
+ });
+
+ /**
+ @module browser/Progress
+ */
+
+ /**
+ * Expose `Progress`.
+ */
+
+ var progress$1 = Progress;
+ /**
+ * Initialize a new `Progress` indicator.
+ */
+
+ function Progress() {
+ this.percent = 0;
+ this.size(0);
+ this.fontSize(11);
+ this.font('helvetica, arial, sans-serif');
+ }
+ /**
+ * Set progress size to `size`.
+ *
+ * @public
+ * @param {number} size
+ * @return {Progress} Progress instance.
+ */
+
+
+ Progress.prototype.size = function (size) {
+ this._size = size;
+ return this;
+ };
+ /**
+ * Set text to `text`.
+ *
+ * @public
+ * @param {string} text
+ * @return {Progress} Progress instance.
+ */
+
+
+ Progress.prototype.text = function (text) {
+ this._text = text;
+ return this;
+ };
+ /**
+ * Set font size to `size`.
+ *
+ * @public
+ * @param {number} size
+ * @return {Progress} Progress instance.
+ */
+
+
+ Progress.prototype.fontSize = function (size) {
+ this._fontSize = size;
+ return this;
+ };
+ /**
+ * Set font to `family`.
+ *
+ * @param {string} family
+ * @return {Progress} Progress instance.
+ */
+
+
+ Progress.prototype.font = function (family) {
+ this._font = family;
+ return this;
+ };
+ /**
+ * Update percentage to `n`.
+ *
+ * @param {number} n
+ * @return {Progress} Progress instance.
+ */
+
+
+ Progress.prototype.update = function (n) {
+ this.percent = n;
+ return this;
+ };
+ /**
+ * Draw on `ctx`.
+ *
+ * @param {CanvasRenderingContext2d} ctx
+ * @return {Progress} Progress instance.
+ */
+
+
+ Progress.prototype.draw = function (ctx) {
+ try {
+ var percent = Math.min(this.percent, 100);
+ var size = this._size;
+ var half = size / 2;
+ var x = half;
+ var y = half;
+ var rad = half - 1;
+ var fontSize = this._fontSize;
+ ctx.font = fontSize + 'px ' + this._font;
+ var angle = Math.PI * 2 * (percent / 100);
+ ctx.clearRect(0, 0, size, size); // outer circle
+
+ ctx.strokeStyle = '#9f9f9f';
+ ctx.beginPath();
+ ctx.arc(x, y, rad, 0, angle, false);
+ ctx.stroke(); // inner circle
+
+ ctx.strokeStyle = '#eee';
+ ctx.beginPath();
+ ctx.arc(x, y, rad - 1, 0, angle, true);
+ ctx.stroke(); // text
+
+ var text = this._text || (percent | 0) + '%';
+ var w = ctx.measureText(text).width;
+ ctx.fillText(text, x - w / 2 + 1, y + fontSize / 2 - 1);
+ } catch (ignore) {// don't fail if we can't render progress
+ }
+
+ return this;
+ };
+
+ var html = createCommonjsModule(function (module, exports) {
+ /* eslint-env browser */
+
+ /**
+ * @module HTML
+ */
+
+ /**
+ * Module dependencies.
+ */
+
+ var constants = runner.constants;
+ var EVENT_TEST_PASS = constants.EVENT_TEST_PASS;
+ var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL;
+ var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN;
+ var EVENT_SUITE_END = constants.EVENT_SUITE_END;
+ var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING;
+ var escape = utils.escape;
+ /**
+ * Save timer references to avoid Sinon interfering (see GH-237).
+ */
+
+ var Date = commonjsGlobal.Date;
+ /**
+ * Expose `HTML`.
+ */
+
+ module.exports = HTML;
+ /**
+ * Stats template.
+ */
+
+ var statsTemplate = '';
+ var playIcon = '‣';
+ /**
+ * Constructs a new `HTML` reporter instance.
+ *
+ * @public
+ * @class
+ * @memberof Mocha.reporters
+ * @extends Mocha.reporters.Base
+ * @param {Runner} runner - Instance triggers reporter actions.
+ * @param {Object} [options] - runner options
+ */
+
+ function HTML(runner, options) {
+ base.call(this, runner, options);
+ var self = this;
+ var stats = this.stats;
+ var stat = fragment(statsTemplate);
+ var items = stat.getElementsByTagName('li');
+ var passes = items[1].getElementsByTagName('em')[0];
+ var passesLink = items[1].getElementsByTagName('a')[0];
+ var failures = items[2].getElementsByTagName('em')[0];
+ var failuresLink = items[2].getElementsByTagName('a')[0];
+ var duration = items[3].getElementsByTagName('em')[0];
+ var canvas = stat.getElementsByTagName('canvas')[0];
+ var report = fragment('');
+ var stack = [report];
+ var progress;
+ var ctx;
+ var root = document.getElementById('mocha');
+
+ if (canvas.getContext) {
+ var ratio = window.devicePixelRatio || 1;
+ canvas.style.width = canvas.width;
+ canvas.style.height = canvas.height;
+ canvas.width *= ratio;
+ canvas.height *= ratio;
+ ctx = canvas.getContext('2d');
+ ctx.scale(ratio, ratio);
+ progress = new progress$1();
+ }
+
+ if (!root) {
+ return error('#mocha div missing, add it to your document');
+ } // pass toggle
+
+
+ on(passesLink, 'click', function (evt) {
+ evt.preventDefault();
+ unhide();
+ var name = /pass/.test(report.className) ? '' : ' pass';
+ report.className = report.className.replace(/fail|pass/g, '') + name;
+
+ if (report.className.trim()) {
+ hideSuitesWithout('test pass');
+ }
+ }); // failure toggle
+
+ on(failuresLink, 'click', function (evt) {
+ evt.preventDefault();
+ unhide();
+ var name = /fail/.test(report.className) ? '' : ' fail';
+ report.className = report.className.replace(/fail|pass/g, '') + name;
+
+ if (report.className.trim()) {
+ hideSuitesWithout('test fail');
+ }
+ });
+ root.appendChild(stat);
+ root.appendChild(report);
+
+ if (progress) {
+ progress.size(40);
+ }
+
+ runner.on(EVENT_SUITE_BEGIN, function (suite) {
+ if (suite.root) {
+ return;
+ } // suite
+
+
+ var url = self.suiteURL(suite);
+ var el = fragment(' ', url, escape(suite.title)); // container
+
+ stack[0].appendChild(el);
+ stack.unshift(document.createElement('ul'));
+ el.appendChild(stack[0]);
+ });
+ runner.on(EVENT_SUITE_END, function (suite) {
+ if (suite.root) {
+ updateStats();
+ return;
+ }
+
+ stack.shift();
+ });
+ runner.on(EVENT_TEST_PASS, function (test) {
+ var url = self.testURL(test);
+ var markup = ' ';
+ var el = fragment(markup, test.speed, test.title, test.duration, url);
+ self.addCodeToggle(el, test.body);
+ appendToStack(el);
+ updateStats();
+ });
+ runner.on(EVENT_TEST_FAIL, function (test) {
+ var el = fragment(' ', test.title, self.testURL(test));
+ var stackString; // Note: Includes leading newline
+
+ var message = test.err.toString(); // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we
+ // check for the result of the stringifying.
+
+ if (message === '[object Error]') {
+ message = test.err.message;
+ }
+
+ if (test.err.stack) {
+ var indexOfMessage = test.err.stack.indexOf(test.err.message);
+
+ if (indexOfMessage === -1) {
+ stackString = test.err.stack;
+ } else {
+ stackString = test.err.stack.substr(test.err.message.length + indexOfMessage);
+ }
+ } else if (test.err.sourceURL && test.err.line !== undefined) {
+ // Safari doesn't give you a stack. Let's at least provide a source line.
+ stackString = '\n(' + test.err.sourceURL + ':' + test.err.line + ')';
+ }
+
+ stackString = stackString || '';
+
+ if (test.err.htmlMessage && stackString) {
+ el.appendChild(fragment('', test.err.htmlMessage, stackString));
+ } else if (test.err.htmlMessage) {
+ el.appendChild(fragment('%s
', test.err.htmlMessage));
+ } else {
+ el.appendChild(fragment('%e%e ', message, stackString));
+ }
+
+ self.addCodeToggle(el, test.body);
+ appendToStack(el);
+ updateStats();
+ });
+ runner.on(EVENT_TEST_PENDING, function (test) {
+ var el = fragment('%e ', test.title);
+ appendToStack(el);
+ updateStats();
+ });
+
+ function appendToStack(el) {
+ // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack.
+ if (stack[0]) {
+ stack[0].appendChild(el);
+ }
+ }
+
+ function updateStats() {
+ // TODO: add to stats
+ var percent = stats.tests / runner.total * 100 | 0;
+
+ if (progress) {
+ progress.update(percent).draw(ctx);
+ } // update stats
+
+
+ var ms = new Date() - stats.start;
+ text(passes, stats.passes);
+ text(failures, stats.failures);
+ text(duration, (ms / 1000).toFixed(2));
+ }
+ }
+ /**
+ * Makes a URL, preserving querystring ("search") parameters.
+ *
+ * @param {string} s
+ * @return {string} A new URL.
+ */
+
+
+ function makeUrl(s) {
+ var search = window.location.search; // Remove previous grep query parameter if present
+
+ if (search) {
+ search = search.replace(/[?&]grep=[^&\s]*/g, '').replace(/^&/, '?');
+ }
+
+ return window.location.pathname + (search ? search + '&' : '?') + 'grep=' + encodeURIComponent(escapeStringRegexp(s));
+ }
+ /**
+ * Provide suite URL.
+ *
+ * @param {Object} [suite]
+ */
+
+
+ HTML.prototype.suiteURL = function (suite) {
+ return makeUrl(suite.fullTitle());
+ };
+ /**
+ * Provide test URL.
+ *
+ * @param {Object} [test]
+ */
+
+
+ HTML.prototype.testURL = function (test) {
+ return makeUrl(test.fullTitle());
+ };
+ /**
+ * Adds code toggle functionality for the provided test's list element.
+ *
+ * @param {HTMLLIElement} el
+ * @param {string} contents
+ */
+
+
+ HTML.prototype.addCodeToggle = function (el, contents) {
+ var h2 = el.getElementsByTagName('h2')[0];
+ on(h2, 'click', function () {
+ pre.style.display = pre.style.display === 'none' ? 'block' : 'none';
+ });
+ var pre = fragment('%e
', utils.clean(contents));
+ el.appendChild(pre);
+ pre.style.display = 'none';
+ };
+ /**
+ * Display error `msg`.
+ *
+ * @param {string} msg
+ */
+
+
+ function error(msg) {
+ document.body.appendChild(fragment('%s
', msg));
+ }
+ /**
+ * Return a DOM fragment from `html`.
+ *
+ * @param {string} html
+ */
+
+
+ function fragment(html) {
+ var args = arguments;
+ var div = document.createElement('div');
+ var i = 1;
+ div.innerHTML = html.replace(/%([se])/g, function (_, type) {
+ switch (type) {
+ case 's':
+ return String(args[i++]);
+
+ case 'e':
+ return escape(args[i++]);
+ // no default
+ }
+ });
+ return div.firstChild;
+ }
+ /**
+ * Check for suites that do not have elements
+ * with `classname`, and hide them.
+ *
+ * @param {text} classname
+ */
+
+
+ function hideSuitesWithout(classname) {
+ var suites = document.getElementsByClassName('suite');
+
+ for (var i = 0; i < suites.length; i++) {
+ var els = suites[i].getElementsByClassName(classname);
+
+ if (!els.length) {
+ suites[i].className += ' hidden';
+ }
+ }
+ }
+ /**
+ * Unhide .hidden suites.
+ */
+
+
+ function unhide() {
+ var els = document.getElementsByClassName('suite hidden');
+
+ while (els.length > 0) {
+ els[0].className = els[0].className.replace('suite hidden', 'suite');
+ }
+ }
+ /**
+ * Set an element's text contents.
+ *
+ * @param {HTMLElement} el
+ * @param {string} contents
+ */
+
+
+ function text(el, contents) {
+ if (el.textContent) {
+ el.textContent = contents;
+ } else {
+ el.innerText = contents;
+ }
+ }
+ /**
+ * Listen on `event` with callback `fn`.
+ */
+
+
+ function on(el, event, fn) {
+ if (el.addEventListener) {
+ el.addEventListener(event, fn, false);
+ } else {
+ el.attachEvent('on' + event, fn);
+ }
+ }
+
+ HTML.browserOnly = true;
+ });
+
+ var list = createCommonjsModule(function (module, exports) {
+ /**
+ * @module List
+ */
+
+ /**
+ * Module dependencies.
+ */
+
+ var inherits = utils.inherits;
+ var constants = runner.constants;
+ var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN;
+ var EVENT_RUN_END = constants.EVENT_RUN_END;
+ var EVENT_TEST_BEGIN = constants.EVENT_TEST_BEGIN;
+ var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL;
+ var EVENT_TEST_PASS = constants.EVENT_TEST_PASS;
+ var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING;
+ var color = base.color;
+ var cursor = base.cursor;
+ /**
+ * Expose `List`.
+ */
+
+ module.exports = List;
+ /**
+ * Constructs a new `List` reporter instance.
+ *
+ * @public
+ * @class
+ * @memberof Mocha.reporters
+ * @extends Mocha.reporters.Base
+ * @param {Runner} runner - Instance triggers reporter actions.
+ * @param {Object} [options] - runner options
+ */
+
+ function List(runner, options) {
+ base.call(this, runner, options);
+ var self = this;
+ var n = 0;
+ runner.on(EVENT_RUN_BEGIN, function () {
+ base.consoleLog();
+ });
+ runner.on(EVENT_TEST_BEGIN, function (test) {
+ process$4.stdout.write(color('pass', ' ' + test.fullTitle() + ': '));
+ });
+ runner.on(EVENT_TEST_PENDING, function (test) {
+ var fmt = color('checkmark', ' -') + color('pending', ' %s');
+ base.consoleLog(fmt, test.fullTitle());
+ });
+ runner.on(EVENT_TEST_PASS, function (test) {
+ var fmt = color('checkmark', ' ' + base.symbols.ok) + color('pass', ' %s: ') + color(test.speed, '%dms');
+ cursor.CR();
+ base.consoleLog(fmt, test.fullTitle(), test.duration);
+ });
+ runner.on(EVENT_TEST_FAIL, function (test) {
+ cursor.CR();
+ base.consoleLog(color('fail', ' %d) %s'), ++n, test.fullTitle());
+ });
+ runner.once(EVENT_RUN_END, self.epilogue.bind(self));
+ }
+ /**
+ * Inherit from `Base.prototype`.
+ */
+
+
+ inherits(List, base);
+ List.description = 'like "spec" reporter but flat';
+ });
+
+ var min = createCommonjsModule(function (module, exports) {
+ /**
+ * @module Min
+ */
+
+ /**
+ * Module dependencies.
+ */
+
+ var inherits = utils.inherits;
+ var constants = runner.constants;
+ var EVENT_RUN_END = constants.EVENT_RUN_END;
+ var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN;
+ /**
+ * Expose `Min`.
+ */
+
+ module.exports = Min;
+ /**
+ * Constructs a new `Min` reporter instance.
+ *
+ * @description
+ * This minimal test reporter is best used with '--watch'.
+ *
+ * @public
+ * @class
+ * @memberof Mocha.reporters
+ * @extends Mocha.reporters.Base
+ * @param {Runner} runner - Instance triggers reporter actions.
+ * @param {Object} [options] - runner options
+ */
+
+ function Min(runner, options) {
+ base.call(this, runner, options);
+ runner.on(EVENT_RUN_BEGIN, function () {
+ // clear screen
+ process$4.stdout.write("\x1B[2J"); // set cursor position
+
+ process$4.stdout.write("\x1B[1;3H");
+ });
+ runner.once(EVENT_RUN_END, this.epilogue.bind(this));
+ }
+ /**
+ * Inherit from `Base.prototype`.
+ */
+
+
+ inherits(Min, base);
+ Min.description = 'essentially just a summary';
+ });
+
+ var spec = createCommonjsModule(function (module, exports) {
+ /**
+ * @module Spec
+ */
+
+ /**
+ * Module dependencies.
+ */
+
+ var constants = runner.constants;
+ var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN;
+ var EVENT_RUN_END = constants.EVENT_RUN_END;
+ var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN;
+ var EVENT_SUITE_END = constants.EVENT_SUITE_END;
+ var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL;
+ var EVENT_TEST_PASS = constants.EVENT_TEST_PASS;
+ var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING;
+ var inherits = utils.inherits;
+ var color = base.color;
+ /**
+ * Expose `Spec`.
+ */
+
+ module.exports = Spec;
+ /**
+ * Constructs a new `Spec` reporter instance.
+ *
+ * @public
+ * @class
+ * @memberof Mocha.reporters
+ * @extends Mocha.reporters.Base
+ * @param {Runner} runner - Instance triggers reporter actions.
+ * @param {Object} [options] - runner options
+ */
+
+ function Spec(runner, options) {
+ base.call(this, runner, options);
+ var self = this;
+ var indents = 0;
+ var n = 0;
+
+ function indent() {
+ return Array(indents).join(' ');
+ }
+
+ runner.on(EVENT_RUN_BEGIN, function () {
+ base.consoleLog();
+ });
+ runner.on(EVENT_SUITE_BEGIN, function (suite) {
+ ++indents;
+ base.consoleLog(color('suite', '%s%s'), indent(), suite.title);
+ });
+ runner.on(EVENT_SUITE_END, function () {
+ --indents;
+
+ if (indents === 1) {
+ base.consoleLog();
+ }
+ });
+ runner.on(EVENT_TEST_PENDING, function (test) {
+ var fmt = indent() + color('pending', ' - %s');
+ base.consoleLog(fmt, test.title);
+ });
+ runner.on(EVENT_TEST_PASS, function (test) {
+ var fmt;
+
+ if (test.speed === 'fast') {
+ fmt = indent() + color('checkmark', ' ' + base.symbols.ok) + color('pass', ' %s');
+ base.consoleLog(fmt, test.title);
+ } else {
+ fmt = indent() + color('checkmark', ' ' + base.symbols.ok) + color('pass', ' %s') + color(test.speed, ' (%dms)');
+ base.consoleLog(fmt, test.title, test.duration);
+ }
+ });
+ runner.on(EVENT_TEST_FAIL, function (test) {
+ base.consoleLog(indent() + color('fail', ' %d) %s'), ++n, test.title);
+ });
+ runner.once(EVENT_RUN_END, self.epilogue.bind(self));
+ }
+ /**
+ * Inherit from `Base.prototype`.
+ */
+
+
+ inherits(Spec, base);
+ Spec.description = 'hierarchical & verbose [default]';
+ });
+
+ var nyan = createCommonjsModule(function (module, exports) {
+ /**
+ * @module Nyan
+ */
+
+ /**
+ * Module dependencies.
+ */
+
+ var constants = runner.constants;
+ var inherits = utils.inherits;
+ var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN;
+ var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING;
+ var EVENT_TEST_PASS = constants.EVENT_TEST_PASS;
+ var EVENT_RUN_END = constants.EVENT_RUN_END;
+ var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL;
+ /**
+ * Expose `Dot`.
+ */
+
+ module.exports = NyanCat;
+ /**
+ * Constructs a new `Nyan` reporter instance.
+ *
+ * @public
+ * @class Nyan
+ * @memberof Mocha.reporters
+ * @extends Mocha.reporters.Base
+ * @param {Runner} runner - Instance triggers reporter actions.
+ * @param {Object} [options] - runner options
+ */
+
+ function NyanCat(runner, options) {
+ base.call(this, runner, options);
+ var self = this;
+ var width = base.window.width * 0.75 | 0;
+ var nyanCatWidth = this.nyanCatWidth = 11;
+ this.colorIndex = 0;
+ this.numberOfLines = 4;
+ this.rainbowColors = self.generateColors();
+ this.scoreboardWidth = 5;
+ this.tick = 0;
+ this.trajectories = [[], [], [], []];
+ this.trajectoryWidthMax = width - nyanCatWidth;
+ runner.on(EVENT_RUN_BEGIN, function () {
+ base.cursor.hide();
+ self.draw();
+ });
+ runner.on(EVENT_TEST_PENDING, function () {
+ self.draw();
+ });
+ runner.on(EVENT_TEST_PASS, function () {
+ self.draw();
+ });
+ runner.on(EVENT_TEST_FAIL, function () {
+ self.draw();
+ });
+ runner.once(EVENT_RUN_END, function () {
+ base.cursor.show();
+
+ for (var i = 0; i < self.numberOfLines; i++) {
+ write('\n');
+ }
+
+ self.epilogue();
+ });
+ }
+ /**
+ * Inherit from `Base.prototype`.
+ */
+
+
+ inherits(NyanCat, base);
+ /**
+ * Draw the nyan cat
+ *
+ * @private
+ */
+
+ NyanCat.prototype.draw = function () {
+ this.appendRainbow();
+ this.drawScoreboard();
+ this.drawRainbow();
+ this.drawNyanCat();
+ this.tick = !this.tick;
+ };
+ /**
+ * Draw the "scoreboard" showing the number
+ * of passes, failures and pending tests.
+ *
+ * @private
+ */
+
+
+ NyanCat.prototype.drawScoreboard = function () {
+ var stats = this.stats;
+
+ function draw(type, n) {
+ write(' ');
+ write(base.color(type, n));
+ write('\n');
+ }
+
+ draw('green', stats.passes);
+ draw('fail', stats.failures);
+ draw('pending', stats.pending);
+ write('\n');
+ this.cursorUp(this.numberOfLines);
+ };
+ /**
+ * Append the rainbow.
+ *
+ * @private
+ */
+
+
+ NyanCat.prototype.appendRainbow = function () {
+ var segment = this.tick ? '_' : '-';
+ var rainbowified = this.rainbowify(segment);
+
+ for (var index = 0; index < this.numberOfLines; index++) {
+ var trajectory = this.trajectories[index];
+
+ if (trajectory.length >= this.trajectoryWidthMax) {
+ trajectory.shift();
+ }
+
+ trajectory.push(rainbowified);
+ }
+ };
+ /**
+ * Draw the rainbow.
+ *
+ * @private
+ */
+
+
+ NyanCat.prototype.drawRainbow = function () {
+ var self = this;
+ this.trajectories.forEach(function (line) {
+ write("\x1B[" + self.scoreboardWidth + 'C');
+ write(line.join(''));
+ write('\n');
+ });
+ this.cursorUp(this.numberOfLines);
+ };
+ /**
+ * Draw the nyan cat
+ *
+ * @private
+ */
+
+
+ NyanCat.prototype.drawNyanCat = function () {
+ var self = this;
+ var startWidth = this.scoreboardWidth + this.trajectories[0].length;
+ var dist = "\x1B[" + startWidth + 'C';
+ var padding = '';
+ write(dist);
+ write('_,------,');
+ write('\n');
+ write(dist);
+ padding = self.tick ? ' ' : ' ';
+ write('_|' + padding + '/\\_/\\ ');
+ write('\n');
+ write(dist);
+ padding = self.tick ? '_' : '__';
+ var tail = self.tick ? '~' : '^';
+ write(tail + '|' + padding + this.face() + ' ');
+ write('\n');
+ write(dist);
+ padding = self.tick ? ' ' : ' ';
+ write(padding + '"" "" ');
+ write('\n');
+ this.cursorUp(this.numberOfLines);
+ };
+ /**
+ * Draw nyan cat face.
+ *
+ * @private
+ * @return {string}
+ */
+
+
+ NyanCat.prototype.face = function () {
+ var stats = this.stats;
+
+ if (stats.failures) {
+ return '( x .x)';
+ } else if (stats.pending) {
+ return '( o .o)';
+ } else if (stats.passes) {
+ return '( ^ .^)';
+ }
+
+ return '( - .-)';
+ };
+ /**
+ * Move cursor up `n`.
+ *
+ * @private
+ * @param {number} n
+ */
+
+
+ NyanCat.prototype.cursorUp = function (n) {
+ write("\x1B[" + n + 'A');
+ };
+ /**
+ * Move cursor down `n`.
+ *
+ * @private
+ * @param {number} n
+ */
+
+
+ NyanCat.prototype.cursorDown = function (n) {
+ write("\x1B[" + n + 'B');
+ };
+ /**
+ * Generate rainbow colors.
+ *
+ * @private
+ * @return {Array}
+ */
+
+
+ NyanCat.prototype.generateColors = function () {
+ var colors = [];
+
+ for (var i = 0; i < 6 * 7; i++) {
+ var pi3 = Math.floor(Math.PI / 3);
+ var n = i * (1.0 / 6);
+ var r = Math.floor(3 * Math.sin(n) + 3);
+ var g = Math.floor(3 * Math.sin(n + 2 * pi3) + 3);
+ var b = Math.floor(3 * Math.sin(n + 4 * pi3) + 3);
+ colors.push(36 * r + 6 * g + b + 16);
+ }
+
+ return colors;
+ };
+ /**
+ * Apply rainbow to the given `str`.
+ *
+ * @private
+ * @param {string} str
+ * @return {string}
+ */
+
+
+ NyanCat.prototype.rainbowify = function (str) {
+ if (!base.useColors) {
+ return str;
+ }
+
+ var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length];
+ this.colorIndex += 1;
+ return "\x1B[38;5;" + color + 'm' + str + "\x1B[0m";
+ };
+ /**
+ * Stdout helper.
+ *
+ * @param {string} string A message to write to stdout.
+ */
+
+
+ function write(string) {
+ process$4.stdout.write(string);
+ }
+
+ NyanCat.description = '"nyan cat"';
+ });
+
+ var xunit = createCommonjsModule(function (module, exports) {
+ /**
+ * @module XUnit
+ */
+
+ /**
+ * Module dependencies.
+ */
+
+ var createUnsupportedError = errors.createUnsupportedError;
+ var constants = runner.constants;
+ var EVENT_TEST_PASS = constants.EVENT_TEST_PASS;
+ var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL;
+ var EVENT_RUN_END = constants.EVENT_RUN_END;
+ var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING;
+ var STATE_FAILED = runnable.constants.STATE_FAILED;
+ var inherits = utils.inherits;
+ var escape = utils.escape;
+ /**
+ * Save timer references to avoid Sinon interfering (see GH-237).
+ */
+
+ var Date = commonjsGlobal.Date;
+ /**
+ * Expose `XUnit`.
+ */
+
+ module.exports = XUnit;
+ /**
+ * Constructs a new `XUnit` reporter instance.
+ *
+ * @public
+ * @class
+ * @memberof Mocha.reporters
+ * @extends Mocha.reporters.Base
+ * @param {Runner} runner - Instance triggers reporter actions.
+ * @param {Object} [options] - runner options
+ */
+
+ function XUnit(runner, options) {
+ base.call(this, runner, options);
+ var stats = this.stats;
+ var tests = [];
+ var self = this; // the name of the test suite, as it will appear in the resulting XML file
+
+ var suiteName; // the default name of the test suite if none is provided
+
+ var DEFAULT_SUITE_NAME = 'Mocha Tests';
+
+ if (options && options.reporterOptions) {
+ if (options.reporterOptions.output) {
+ {
+ throw createUnsupportedError('file output not supported in browser');
+ }
+ } // get the suite name from the reporter options (if provided)
+
+
+ suiteName = options.reporterOptions.suiteName;
+ } // fall back to the default suite name
+
+
+ suiteName = suiteName || DEFAULT_SUITE_NAME;
+ runner.on(EVENT_TEST_PENDING, function (test) {
+ tests.push(test);
+ });
+ runner.on(EVENT_TEST_PASS, function (test) {
+ tests.push(test);
+ });
+ runner.on(EVENT_TEST_FAIL, function (test) {
+ tests.push(test);
+ });
+ runner.once(EVENT_RUN_END, function () {
+ self.write(tag('testsuite', {
+ name: suiteName,
+ tests: stats.tests,
+ failures: 0,
+ errors: stats.failures,
+ skipped: stats.tests - stats.failures - stats.passes,
+ timestamp: new Date().toUTCString(),
+ time: stats.duration / 1000 || 0
+ }, false));
+ tests.forEach(function (t) {
+ self.test(t);
+ });
+ self.write('');
+ });
+ }
+ /**
+ * Inherit from `Base.prototype`.
+ */
+
+
+ inherits(XUnit, base);
+ /**
+ * Override done to close the stream (if it's a file).
+ *
+ * @param failures
+ * @param {Function} fn
+ */
+
+ XUnit.prototype.done = function (failures, fn) {
+ if (this.fileStream) {
+ this.fileStream.end(function () {
+ fn(failures);
+ });
+ } else {
+ fn(failures);
+ }
+ };
+ /**
+ * Write out the given line.
+ *
+ * @param {string} line
+ */
+
+
+ XUnit.prototype.write = function (line) {
+ if (this.fileStream) {
+ this.fileStream.write(line + '\n');
+ } else if (_typeof(process$4) === 'object' && process$4.stdout) {
+ process$4.stdout.write(line + '\n');
+ } else {
+ base.consoleLog(line);
+ }
+ };
+ /**
+ * Output tag for the given `test.`
+ *
+ * @param {Test} test
+ */
+
+
+ XUnit.prototype.test = function (test) {
+ base.useColors = false;
+ var attrs = {
+ classname: test.parent.fullTitle(),
+ name: test.title,
+ time: test.duration / 1000 || 0
+ };
+
+ if (test.state === STATE_FAILED) {
+ var err = test.err;
+ var diff = !base.hideDiff && base.showDiff(err) ? '\n' + base.generateDiff(err.actual, err.expected) : '';
+ this.write(tag('testcase', attrs, false, tag('failure', {}, false, escape(err.message) + escape(diff) + '\n' + escape(err.stack))));
+ } else if (test.isPending()) {
+ this.write(tag('testcase', attrs, false, tag('skipped', {}, true)));
+ } else {
+ this.write(tag('testcase', attrs, true));
+ }
+ };
+ /**
+ * HTML tag helper.
+ *
+ * @param name
+ * @param attrs
+ * @param close
+ * @param content
+ * @return {string}
+ */
+
+
+ function tag(name, attrs, close, content) {
+ var end = close ? '/>' : '>';
+ var pairs = [];
+ var tag;
+
+ for (var key in attrs) {
+ if (Object.prototype.hasOwnProperty.call(attrs, key)) {
+ pairs.push(key + '="' + escape(attrs[key]) + '"');
+ }
+ }
+
+ tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end;
+
+ if (content) {
+ tag += content + '' + name + end;
+ }
+
+ return tag;
+ }
+
+ XUnit.description = 'XUnit-compatible XML output';
+ });
+
+ var markdown = createCommonjsModule(function (module, exports) {
+ /**
+ * @module Markdown
+ */
+
+ /**
+ * Module dependencies.
+ */
+
+ var constants = runner.constants;
+ var EVENT_RUN_END = constants.EVENT_RUN_END;
+ var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN;
+ var EVENT_SUITE_END = constants.EVENT_SUITE_END;
+ var EVENT_TEST_PASS = constants.EVENT_TEST_PASS;
+ /**
+ * Constants
+ */
+
+ var SUITE_PREFIX = '$';
+ /**
+ * Expose `Markdown`.
+ */
+
+ module.exports = Markdown;
+ /**
+ * Constructs a new `Markdown` reporter instance.
+ *
+ * @public
+ * @class
+ * @memberof Mocha.reporters
+ * @extends Mocha.reporters.Base
+ * @param {Runner} runner - Instance triggers reporter actions.
+ * @param {Object} [options] - runner options
+ */
+
+ function Markdown(runner, options) {
+ base.call(this, runner, options);
+ var level = 0;
+ var buf = '';
+
+ function title(str) {
+ return Array(level).join('#') + ' ' + str;
+ }
+
+ function mapTOC(suite, obj) {
+ var ret = obj;
+ var key = SUITE_PREFIX + suite.title;
+ obj = obj[key] = obj[key] || {
+ suite: suite
+ };
+ suite.suites.forEach(function (suite) {
+ mapTOC(suite, obj);
+ });
+ return ret;
+ }
+
+ function stringifyTOC(obj, level) {
+ ++level;
+ var buf = '';
+ var link;
+
+ for (var key in obj) {
+ if (key === 'suite') {
+ continue;
+ }
+
+ if (key !== SUITE_PREFIX) {
+ link = ' - [' + key.substring(1) + ']';
+ link += '(#' + utils.slug(obj[key].suite.fullTitle()) + ')\n';
+ buf += Array(level).join(' ') + link;
+ }
+
+ buf += stringifyTOC(obj[key], level);
+ }
+
+ return buf;
+ }
+
+ function generateTOC(suite) {
+ var obj = mapTOC(suite, {});
+ return stringifyTOC(obj, 0);
+ }
+
+ generateTOC(runner.suite);
+ runner.on(EVENT_SUITE_BEGIN, function (suite) {
+ ++level;
+ var slug = utils.slug(suite.fullTitle());
+ buf += ' ' + '\n';
+ buf += title(suite.title) + '\n';
+ });
+ runner.on(EVENT_SUITE_END, function () {
+ --level;
+ });
+ runner.on(EVENT_TEST_PASS, function (test) {
+ var code = utils.clean(test.body);
+ buf += test.title + '.\n';
+ buf += '\n```js\n';
+ buf += code + '\n';
+ buf += '```\n\n';
+ });
+ runner.once(EVENT_RUN_END, function () {
+ process$4.stdout.write('# TOC\n');
+ process$4.stdout.write(generateTOC(runner.suite));
+ process$4.stdout.write(buf);
+ });
+ }
+
+ Markdown.description = 'GitHub Flavored Markdown';
+ });
+
+ var progress = createCommonjsModule(function (module, exports) {
+ /**
+ * @module Progress
+ */
+
+ /**
+ * Module dependencies.
+ */
+
+ var constants = runner.constants;
+ var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN;
+ var EVENT_TEST_END = constants.EVENT_TEST_END;
+ var EVENT_RUN_END = constants.EVENT_RUN_END;
+ var inherits = utils.inherits;
+ var color = base.color;
+ var cursor = base.cursor;
+ /**
+ * Expose `Progress`.
+ */
+
+ module.exports = Progress;
+ /**
+ * General progress bar color.
+ */
+
+ base.colors.progress = 90;
+ /**
+ * Constructs a new `Progress` reporter instance.
+ *
+ * @public
+ * @class
+ * @memberof Mocha.reporters
+ * @extends Mocha.reporters.Base
+ * @param {Runner} runner - Instance triggers reporter actions.
+ * @param {Object} [options] - runner options
+ */
+
+ function Progress(runner, options) {
+ base.call(this, runner, options);
+ var self = this;
+ var width = base.window.width * 0.5 | 0;
+ var total = runner.total;
+ var complete = 0;
+ var lastN = -1; // default chars
+
+ options = options || {};
+ var reporterOptions = options.reporterOptions || {};
+ options.open = reporterOptions.open || '[';
+ options.complete = reporterOptions.complete || '▬';
+ options.incomplete = reporterOptions.incomplete || base.symbols.dot;
+ options.close = reporterOptions.close || ']';
+ options.verbose = reporterOptions.verbose || false; // tests started
+
+ runner.on(EVENT_RUN_BEGIN, function () {
+ process$4.stdout.write('\n');
+ cursor.hide();
+ }); // tests complete
+
+ runner.on(EVENT_TEST_END, function () {
+ complete++;
+ var percent = complete / total;
+ var n = width * percent | 0;
+ var i = width - n;
+
+ if (n === lastN && !options.verbose) {
+ // Don't re-render the line if it hasn't changed
+ return;
+ }
+
+ lastN = n;
+ cursor.CR();
+ process$4.stdout.write("\x1B[J");
+ process$4.stdout.write(color('progress', ' ' + options.open));
+ process$4.stdout.write(Array(n).join(options.complete));
+ process$4.stdout.write(Array(i).join(options.incomplete));
+ process$4.stdout.write(color('progress', options.close));
+
+ if (options.verbose) {
+ process$4.stdout.write(color('progress', ' ' + complete + ' of ' + total));
+ }
+ }); // tests are complete, output some stats
+ // and the failures if any
+
+ runner.once(EVENT_RUN_END, function () {
+ cursor.show();
+ process$4.stdout.write('\n');
+ self.epilogue();
+ });
+ }
+ /**
+ * Inherit from `Base.prototype`.
+ */
+
+
+ inherits(Progress, base);
+ Progress.description = 'a progress bar';
+ });
+
+ var landing = createCommonjsModule(function (module, exports) {
+ /**
+ * @module Landing
+ */
+
+ /**
+ * Module dependencies.
+ */
+
+ var inherits = utils.inherits;
+ var constants = runner.constants;
+ var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN;
+ var EVENT_RUN_END = constants.EVENT_RUN_END;
+ var EVENT_TEST_END = constants.EVENT_TEST_END;
+ var STATE_FAILED = runnable.constants.STATE_FAILED;
+ var cursor = base.cursor;
+ var color = base.color;
+ /**
+ * Expose `Landing`.
+ */
+
+ module.exports = Landing;
+ /**
+ * Airplane color.
+ */
+
+ base.colors.plane = 0;
+ /**
+ * Airplane crash color.
+ */
+
+ base.colors['plane crash'] = 31;
+ /**
+ * Runway color.
+ */
+
+ base.colors.runway = 90;
+ /**
+ * Constructs a new `Landing` reporter instance.
+ *
+ * @public
+ * @class
+ * @memberof Mocha.reporters
+ * @extends Mocha.reporters.Base
+ * @param {Runner} runner - Instance triggers reporter actions.
+ * @param {Object} [options] - runner options
+ */
+
+ function Landing(runner, options) {
+ base.call(this, runner, options);
+ var self = this;
+ var width = base.window.width * 0.75 | 0;
+ var stream = process$4.stdout;
+ var plane = color('plane', '✈');
+ var crashed = -1;
+ var n = 0;
+ var total = 0;
+
+ function runway() {
+ var buf = Array(width).join('-');
+ return ' ' + color('runway', buf);
+ }
+
+ runner.on(EVENT_RUN_BEGIN, function () {
+ stream.write('\n\n\n ');
+ cursor.hide();
+ });
+ runner.on(EVENT_TEST_END, function (test) {
+ // check if the plane crashed
+ var col = crashed === -1 ? width * ++n / ++total | 0 : crashed; // show the crash
+
+ if (test.state === STATE_FAILED) {
+ plane = color('plane crash', '✈');
+ crashed = col;
+ } // render landing strip
+
+
+ stream.write("\x1B[" + (width + 1) + "D\x1B[2A");
+ stream.write(runway());
+ stream.write('\n ');
+ stream.write(color('runway', Array(col).join('⋅')));
+ stream.write(plane);
+ stream.write(color('runway', Array(width - col).join('⋅') + '\n'));
+ stream.write(runway());
+ stream.write("\x1B[0m");
+ });
+ runner.once(EVENT_RUN_END, function () {
+ cursor.show();
+ process$4.stdout.write('\n');
+ self.epilogue();
+ }); // if cursor is hidden when we ctrl-C, then it will remain hidden unless...
+
+ process$4.once('SIGINT', function () {
+ cursor.show();
+ nextTick$1(function () {
+ process$4.kill(process$4.pid, 'SIGINT');
+ });
+ });
+ }
+ /**
+ * Inherit from `Base.prototype`.
+ */
+
+
+ inherits(Landing, base);
+ Landing.description = 'Unicode landing strip';
+ });
+
+ var jsonStream = createCommonjsModule(function (module, exports) {
+ /**
+ * @module JSONStream
+ */
+
+ /**
+ * Module dependencies.
+ */
+
+ var constants = runner.constants;
+ var EVENT_TEST_PASS = constants.EVENT_TEST_PASS;
+ var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL;
+ var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN;
+ var EVENT_RUN_END = constants.EVENT_RUN_END;
+ /**
+ * Expose `JSONStream`.
+ */
+
+ module.exports = JSONStream;
+ /**
+ * Constructs a new `JSONStream` reporter instance.
+ *
+ * @public
+ * @class
+ * @memberof Mocha.reporters
+ * @extends Mocha.reporters.Base
+ * @param {Runner} runner - Instance triggers reporter actions.
+ * @param {Object} [options] - runner options
+ */
+
+ function JSONStream(runner, options) {
+ base.call(this, runner, options);
+ var self = this;
+ var total = runner.total;
+ runner.once(EVENT_RUN_BEGIN, function () {
+ writeEvent(['start', {
+ total: total
+ }]);
+ });
+ runner.on(EVENT_TEST_PASS, function (test) {
+ writeEvent(['pass', clean(test)]);
+ });
+ runner.on(EVENT_TEST_FAIL, function (test, err) {
+ test = clean(test);
+ test.err = err.message;
+ test.stack = err.stack || null;
+ writeEvent(['fail', test]);
+ });
+ runner.once(EVENT_RUN_END, function () {
+ writeEvent(['end', self.stats]);
+ });
+ }
+ /**
+ * Mocha event to be written to the output stream.
+ * @typedef {Array} JSONStream~MochaEvent
+ */
+
+ /**
+ * Writes Mocha event to reporter output stream.
+ *
+ * @private
+ * @param {JSONStream~MochaEvent} event - Mocha event to be output.
+ */
+
+
+ function writeEvent(event) {
+ process$4.stdout.write(JSON.stringify(event) + '\n');
+ }
+ /**
+ * Returns an object literal representation of `test`
+ * free of cyclic properties, etc.
+ *
+ * @private
+ * @param {Test} test - Instance used as data source.
+ * @return {Object} object containing pared-down test instance data
+ */
+
+
+ function clean(test) {
+ return {
+ title: test.title,
+ fullTitle: test.fullTitle(),
+ file: test.file,
+ duration: test.duration,
+ currentRetry: test.currentRetry(),
+ speed: test.speed
+ };
+ }
+
+ JSONStream.description = 'newline delimited JSON events';
+ });
+
+ var reporters = createCommonjsModule(function (module, exports) {
+ // for dynamic (try/catch) requires, which Browserify doesn't handle.
+
+ exports.Base = exports.base = base;
+ exports.Dot = exports.dot = dot;
+ exports.Doc = exports.doc = doc;
+ exports.TAP = exports.tap = tap;
+ exports.JSON = exports.json = json;
+ exports.HTML = exports.html = html;
+ exports.List = exports.list = list;
+ exports.Min = exports.min = min;
+ exports.Spec = exports.spec = spec;
+ exports.Nyan = exports.nyan = nyan;
+ exports.XUnit = exports.xunit = xunit;
+ exports.Markdown = exports.markdown = markdown;
+ exports.Progress = exports.progress = progress;
+ exports.Landing = exports.landing = landing;
+ exports.JSONStream = exports['json-stream'] = jsonStream;
+ });
+
+ var name = "mocha";
+ var version = "9.1.2";
+ var homepage = "https://mochajs.org/";
+ var notifyLogo = "https://ibin.co/4QuRuGjXvl36.png";
+ var _package = {
+ name: name,
+ version: version,
+ homepage: homepage,
+ notifyLogo: notifyLogo
+ };
+
+ var _package$1 = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ name: name,
+ version: version,
+ homepage: homepage,
+ notifyLogo: notifyLogo,
+ 'default': _package
+ });
+
+ var require$$9 = getCjsExportFromNamespace(_package$1);
+
+ /**
+ * Web Notifications module.
+ * @module Growl
+ */
+
+ /**
+ * Save timer references to avoid Sinon interfering (see GH-237).
+ */
+
+
+ var Date$3 = commonjsGlobal.Date;
+ var setTimeout$2 = commonjsGlobal.setTimeout;
+ var EVENT_RUN_END$1 = runner.constants.EVENT_RUN_END;
+ var isBrowser = utils.isBrowser;
+ /**
+ * Checks if browser notification support exists.
+ *
+ * @public
+ * @see {@link https://caniuse.com/#feat=notifications|Browser support (notifications)}
+ * @see {@link https://caniuse.com/#feat=promises|Browser support (promises)}
+ * @see {@link Mocha#growl}
+ * @see {@link Mocha#isGrowlCapable}
+ * @return {boolean} whether browser notification support exists
+ */
+
+ var isCapable = function isCapable() {
+ var hasNotificationSupport = ('Notification' in window);
+ var hasPromiseSupport = typeof Promise === 'function';
+ return isBrowser() && hasNotificationSupport && hasPromiseSupport;
+ };
+ /**
+ * Implements browser notifications as a pseudo-reporter.
+ *
+ * @public
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/notification|Notification API}
+ * @see {@link https://developers.google.com/web/fundamentals/push-notifications/display-a-notification|Displaying a Notification}
+ * @see {@link Growl#isPermitted}
+ * @see {@link Mocha#_growl}
+ * @param {Runner} runner - Runner instance.
+ */
+
+
+ var notify = function notify(runner) {
+ var promise = isPermitted();
+ /**
+ * Attempt notification.
+ */
+
+ var sendNotification = function sendNotification() {
+ // If user hasn't responded yet... "No notification for you!" (Seinfeld)
+ Promise.race([promise, Promise.resolve(undefined)]).then(canNotify).then(function () {
+ display(runner);
+ })["catch"](notPermitted);
+ };
+
+ runner.once(EVENT_RUN_END$1, sendNotification);
+ };
+ /**
+ * Checks if browser notification is permitted by user.
+ *
+ * @private
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Notification/permission|Notification.permission}
+ * @see {@link Mocha#growl}
+ * @see {@link Mocha#isGrowlPermitted}
+ * @returns {Promise} promise determining if browser notification
+ * permissible when fulfilled.
+ */
+
+
+ function isPermitted() {
+ var permitted = {
+ granted: function allow() {
+ return Promise.resolve(true);
+ },
+ denied: function deny() {
+ return Promise.resolve(false);
+ },
+ "default": function ask() {
+ return Notification.requestPermission().then(function (permission) {
+ return permission === 'granted';
+ });
+ }
+ };
+ return permitted[Notification.permission]();
+ }
+ /**
+ * @summary
+ * Determines if notification should proceed.
+ *
+ * @description
+ * Notification shall not proceed unless `value` is true.
+ *
+ * `value` will equal one of:
+ *
+ * true
(from `isPermitted`)
+ * false
(from `isPermitted`)
+ * undefined
(from `Promise.race`)
+ *
+ *
+ * @private
+ * @param {boolean|undefined} value - Determines if notification permissible.
+ * @returns {Promise} Notification can proceed
+ */
+
+
+ function canNotify(value) {
+ if (!value) {
+ var why = value === false ? 'blocked' : 'unacknowledged';
+ var reason = 'not permitted by user (' + why + ')';
+ return Promise.reject(new Error(reason));
+ }
+
+ return Promise.resolve();
+ }
+ /**
+ * Displays the notification.
+ *
+ * @private
+ * @param {Runner} runner - Runner instance.
+ */
+
+
+ function display(runner) {
+ var stats = runner.stats;
+ var symbol = {
+ cross: "\u274C",
+ tick: "\u2705"
+ };
+ var logo = require$$9.notifyLogo;
+
+ var _message;
+
+ var message;
+ var title;
+
+ if (stats.failures) {
+ _message = stats.failures + ' of ' + stats.tests + ' tests failed';
+ message = symbol.cross + ' ' + _message;
+ title = 'Failed';
+ } else {
+ _message = stats.passes + ' tests passed in ' + stats.duration + 'ms';
+ message = symbol.tick + ' ' + _message;
+ title = 'Passed';
+ } // Send notification
+
+
+ var options = {
+ badge: logo,
+ body: message,
+ dir: 'ltr',
+ icon: logo,
+ lang: 'en-US',
+ name: 'mocha',
+ requireInteraction: false,
+ timestamp: Date$3.now()
+ };
+ var notification = new Notification(title, options); // Autoclose after brief delay (makes various browsers act same)
+
+ var FORCE_DURATION = 4000;
+ setTimeout$2(notification.close.bind(notification), FORCE_DURATION);
+ }
+ /**
+ * As notifications are tangential to our purpose, just log the error.
+ *
+ * @private
+ * @param {Error} err - Why notification didn't happen.
+ */
+
+
+ function notPermitted(err) {
+ console.error('notification error:', err.message);
+ }
+
+ var growl = {
+ isCapable: isCapable,
+ notify: notify
+ };
+
+ var diff = true;
+ var extension = [
+ "js",
+ "cjs",
+ "mjs"
+ ];
+ var reporter = "spec";
+ var slow = 75;
+ var timeout = 2000;
+ var ui = "bdd";
+ var mocharc$1 = {
+ diff: diff,
+ extension: extension,
+ "package": "./package.json",
+ reporter: reporter,
+ slow: slow,
+ timeout: timeout,
+ ui: ui,
+ "watch-ignore": [
+ "node_modules",
+ ".git"
+ ]
+ };
+
+ var mocharc$2 = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ diff: diff,
+ extension: extension,
+ reporter: reporter,
+ slow: slow,
+ timeout: timeout,
+ ui: ui,
+ 'default': mocharc$1
+ });
+
+ /**
+ * Provides a factory function for a {@link StatsCollector} object.
+ * @module
+ */
+
+
+ var constants = runner.constants;
+ var EVENT_TEST_PASS = constants.EVENT_TEST_PASS;
+ var EVENT_TEST_FAIL = constants.EVENT_TEST_FAIL;
+ var EVENT_SUITE_BEGIN = constants.EVENT_SUITE_BEGIN;
+ var EVENT_RUN_BEGIN = constants.EVENT_RUN_BEGIN;
+ var EVENT_TEST_PENDING = constants.EVENT_TEST_PENDING;
+ var EVENT_RUN_END = constants.EVENT_RUN_END;
+ var EVENT_TEST_END = constants.EVENT_TEST_END;
+ /**
+ * Test statistics collector.
+ *
+ * @public
+ * @typedef {Object} StatsCollector
+ * @property {number} suites - integer count of suites run.
+ * @property {number} tests - integer count of tests run.
+ * @property {number} passes - integer count of passing tests.
+ * @property {number} pending - integer count of pending tests.
+ * @property {number} failures - integer count of failed tests.
+ * @property {Date} start - time when testing began.
+ * @property {Date} end - time when testing concluded.
+ * @property {number} duration - number of msecs that testing took.
+ */
+
+ var Date$2 = commonjsGlobal.Date;
+ /**
+ * Provides stats such as test duration, number of tests passed / failed etc., by listening for events emitted by `runner`.
+ *
+ * @private
+ * @param {Runner} runner - Runner instance
+ * @throws {TypeError} If falsy `runner`
+ */
+
+ function createStatsCollector(runner) {
+ /**
+ * @type StatsCollector
+ */
+ var stats = {
+ suites: 0,
+ tests: 0,
+ passes: 0,
+ pending: 0,
+ failures: 0
+ };
+
+ if (!runner) {
+ throw new TypeError('Missing runner argument');
+ }
+
+ runner.stats = stats;
+ runner.once(EVENT_RUN_BEGIN, function () {
+ stats.start = new Date$2();
+ });
+ runner.on(EVENT_SUITE_BEGIN, function (suite) {
+ suite.root || stats.suites++;
+ });
+ runner.on(EVENT_TEST_PASS, function () {
+ stats.passes++;
+ });
+ runner.on(EVENT_TEST_FAIL, function () {
+ stats.failures++;
+ });
+ runner.on(EVENT_TEST_PENDING, function () {
+ stats.pending++;
+ });
+ runner.on(EVENT_TEST_END, function () {
+ stats.tests++;
+ });
+ runner.once(EVENT_RUN_END, function () {
+ stats.end = new Date$2();
+ stats.duration = stats.end - stats.start;
+ });
+ }
+
+ var statsCollector = createStatsCollector;
+
+ var createInvalidArgumentTypeError = errors.createInvalidArgumentTypeError;
+ var isString = utils.isString;
+ var MOCHA_ID_PROP_NAME = utils.constants.MOCHA_ID_PROP_NAME;
+ var test = Test;
+ /**
+ * Initialize a new `Test` with the given `title` and callback `fn`.
+ *
+ * @public
+ * @class
+ * @extends Runnable
+ * @param {String} title - Test title (required)
+ * @param {Function} [fn] - Test callback. If omitted, the Test is considered "pending"
+ */
+
+ function Test(title, fn) {
+ if (!isString(title)) {
+ throw createInvalidArgumentTypeError('Test argument "title" should be a string. Received type "' + _typeof(title) + '"', 'title', 'string');
+ }
+
+ this.type = 'test';
+ runnable.call(this, title, fn);
+ this.reset();
+ }
+ /**
+ * Inherit from `Runnable.prototype`.
+ */
+
+
+ utils.inherits(Test, runnable);
+ /**
+ * Resets the state initially or for a next run.
+ */
+
+ Test.prototype.reset = function () {
+ runnable.prototype.reset.call(this);
+ this.pending = !this.fn;
+ delete this.state;
+ };
+ /**
+ * Set or get retried test
+ *
+ * @private
+ */
+
+
+ Test.prototype.retriedTest = function (n) {
+ if (!arguments.length) {
+ return this._retriedTest;
+ }
+
+ this._retriedTest = n;
+ };
+ /**
+ * Add test to the list of tests marked `only`.
+ *
+ * @private
+ */
+
+
+ Test.prototype.markOnly = function () {
+ this.parent.appendOnlyTest(this);
+ };
+
+ Test.prototype.clone = function () {
+ var test = new Test(this.title, this.fn);
+ test.timeout(this.timeout());
+ test.slow(this.slow());
+ test.retries(this.retries());
+ test.currentRetry(this.currentRetry());
+ test.retriedTest(this.retriedTest() || this);
+ test.globals(this.globals());
+ test.parent = this.parent;
+ test.file = this.file;
+ test.ctx = this.ctx;
+ return test;
+ };
+ /**
+ * Returns an minimal object suitable for transmission over IPC.
+ * Functions are represented by keys beginning with `$$`.
+ * @private
+ * @returns {Object}
+ */
+
+
+ Test.prototype.serialize = function serialize() {
+ return _defineProperty({
+ $$currentRetry: this._currentRetry,
+ $$fullTitle: this.fullTitle(),
+ $$isPending: Boolean(this.pending),
+ $$retriedTest: this._retriedTest || null,
+ $$slow: this._slow,
+ $$titlePath: this.titlePath(),
+ body: this.body,
+ duration: this.duration,
+ err: this.err,
+ parent: _defineProperty({
+ $$fullTitle: this.parent.fullTitle()
+ }, MOCHA_ID_PROP_NAME, this.parent.id),
+ speed: this.speed,
+ state: this.state,
+ title: this.title,
+ type: this.type,
+ file: this.file
+ }, MOCHA_ID_PROP_NAME, this.id);
+ };
+
+ /**
+ @module interfaces/common
+ */
+
+
+ var createMissingArgumentError = errors.createMissingArgumentError;
+ var createUnsupportedError = errors.createUnsupportedError;
+ var createForbiddenExclusivityError = errors.createForbiddenExclusivityError;
+ /**
+ * Functions common to more than one interface.
+ *
+ * @private
+ * @param {Suite[]} suites
+ * @param {Context} context
+ * @param {Mocha} mocha
+ * @return {Object} An object containing common functions.
+ */
+
+ var common = function common(suites, context, mocha) {
+ /**
+ * Check if the suite should be tested.
+ *
+ * @private
+ * @param {Suite} suite - suite to check
+ * @returns {boolean}
+ */
+ function shouldBeTested(suite) {
+ return !mocha.options.grep || mocha.options.grep && mocha.options.grep.test(suite.fullTitle()) && !mocha.options.invert;
+ }
+
+ return {
+ /**
+ * This is only present if flag --delay is passed into Mocha. It triggers
+ * root suite execution.
+ *
+ * @param {Suite} suite The root suite.
+ * @return {Function} A function which runs the root suite
+ */
+ runWithSuite: function runWithSuite(suite) {
+ return function run() {
+ suite.run();
+ };
+ },
+
+ /**
+ * Execute before running tests.
+ *
+ * @param {string} name
+ * @param {Function} fn
+ */
+ before: function before(name, fn) {
+ suites[0].beforeAll(name, fn);
+ },
+
+ /**
+ * Execute after running tests.
+ *
+ * @param {string} name
+ * @param {Function} fn
+ */
+ after: function after(name, fn) {
+ suites[0].afterAll(name, fn);
+ },
+
+ /**
+ * Execute before each test case.
+ *
+ * @param {string} name
+ * @param {Function} fn
+ */
+ beforeEach: function beforeEach(name, fn) {
+ suites[0].beforeEach(name, fn);
+ },
+
+ /**
+ * Execute after each test case.
+ *
+ * @param {string} name
+ * @param {Function} fn
+ */
+ afterEach: function afterEach(name, fn) {
+ suites[0].afterEach(name, fn);
+ },
+ suite: {
+ /**
+ * Create an exclusive Suite; convenience function
+ * See docstring for create() below.
+ *
+ * @param {Object} opts
+ * @returns {Suite}
+ */
+ only: function only(opts) {
+ if (mocha.options.forbidOnly) {
+ throw createForbiddenExclusivityError(mocha);
+ }
+
+ opts.isOnly = true;
+ return this.create(opts);
+ },
+
+ /**
+ * Create a Suite, but skip it; convenience function
+ * See docstring for create() below.
+ *
+ * @param {Object} opts
+ * @returns {Suite}
+ */
+ skip: function skip(opts) {
+ opts.pending = true;
+ return this.create(opts);
+ },
+
+ /**
+ * Creates a suite.
+ *
+ * @param {Object} opts Options
+ * @param {string} opts.title Title of Suite
+ * @param {Function} [opts.fn] Suite Function (not always applicable)
+ * @param {boolean} [opts.pending] Is Suite pending?
+ * @param {string} [opts.file] Filepath where this Suite resides
+ * @param {boolean} [opts.isOnly] Is Suite exclusive?
+ * @returns {Suite}
+ */
+ create: function create(opts) {
+ var suite$1 = suite.create(suites[0], opts.title);
+ suite$1.pending = Boolean(opts.pending);
+ suite$1.file = opts.file;
+ suites.unshift(suite$1);
+
+ if (opts.isOnly) {
+ suite$1.markOnly();
+ }
+
+ if (suite$1.pending && mocha.options.forbidPending && shouldBeTested(suite$1)) {
+ throw createUnsupportedError('Pending test forbidden');
+ }
+
+ if (typeof opts.fn === 'function') {
+ opts.fn.call(suite$1);
+ suites.shift();
+ } else if (typeof opts.fn === 'undefined' && !suite$1.pending) {
+ throw createMissingArgumentError('Suite "' + suite$1.fullTitle() + '" was defined but no callback was supplied. ' + 'Supply a callback or explicitly skip the suite.', 'callback', 'function');
+ } else if (!opts.fn && suite$1.pending) {
+ suites.shift();
+ }
+
+ return suite$1;
+ }
+ },
+ test: {
+ /**
+ * Exclusive test-case.
+ *
+ * @param {Object} mocha
+ * @param {Function} test
+ * @returns {*}
+ */
+ only: function only(mocha, test) {
+ if (mocha.options.forbidOnly) {
+ throw createForbiddenExclusivityError(mocha);
+ }
+
+ test.markOnly();
+ return test;
+ },
+
+ /**
+ * Pending test case.
+ *
+ * @param {string} title
+ */
+ skip: function skip(title) {
+ context.test(title);
+ }
+ }
+ };
+ };
+
+ var EVENT_FILE_PRE_REQUIRE$2 = suite.constants.EVENT_FILE_PRE_REQUIRE;
+ /**
+ * BDD-style interface:
+ *
+ * describe('Array', function() {
+ * describe('#indexOf()', function() {
+ * it('should return -1 when not present', function() {
+ * // ...
+ * });
+ *
+ * it('should return the index when present', function() {
+ * // ...
+ * });
+ * });
+ * });
+ *
+ * @param {Suite} suite Root suite.
+ */
+
+ var bdd$1 = function bddInterface(suite) {
+ var suites = [suite];
+ suite.on(EVENT_FILE_PRE_REQUIRE$2, function (context, file, mocha) {
+ var common$1 = common(suites, context, mocha);
+ context.before = common$1.before;
+ context.after = common$1.after;
+ context.beforeEach = common$1.beforeEach;
+ context.afterEach = common$1.afterEach;
+ context.run = mocha.options.delay && common$1.runWithSuite(suite);
+ /**
+ * Describe a "suite" with the given `title`
+ * and callback `fn` containing nested suites
+ * and/or tests.
+ */
+
+ context.describe = context.context = function (title, fn) {
+ return common$1.suite.create({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+ /**
+ * Pending describe.
+ */
+
+
+ context.xdescribe = context.xcontext = context.describe.skip = function (title, fn) {
+ return common$1.suite.skip({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+ /**
+ * Exclusive suite.
+ */
+
+
+ context.describe.only = function (title, fn) {
+ return common$1.suite.only({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+ /**
+ * Describe a specification or test-case
+ * with the given `title` and callback `fn`
+ * acting as a thunk.
+ */
+
+
+ context.it = context.specify = function (title, fn) {
+ var suite = suites[0];
+
+ if (suite.isPending()) {
+ fn = null;
+ }
+
+ var test$1 = new test(title, fn);
+ test$1.file = file;
+ suite.addTest(test$1);
+ return test$1;
+ };
+ /**
+ * Exclusive test-case.
+ */
+
+
+ context.it.only = function (title, fn) {
+ return common$1.test.only(mocha, context.it(title, fn));
+ };
+ /**
+ * Pending test case.
+ */
+
+
+ context.xit = context.xspecify = context.it.skip = function (title) {
+ return context.it(title);
+ };
+ });
+ };
+
+ var description$3 = 'BDD or RSpec style [default]';
+ bdd$1.description = description$3;
+
+ var EVENT_FILE_PRE_REQUIRE$1 = suite.constants.EVENT_FILE_PRE_REQUIRE;
+ /**
+ * TDD-style interface:
+ *
+ * suite('Array', function() {
+ * suite('#indexOf()', function() {
+ * suiteSetup(function() {
+ *
+ * });
+ *
+ * test('should return -1 when not present', function() {
+ *
+ * });
+ *
+ * test('should return the index when present', function() {
+ *
+ * });
+ *
+ * suiteTeardown(function() {
+ *
+ * });
+ * });
+ * });
+ *
+ * @param {Suite} suite Root suite.
+ */
+
+ var tdd$1 = function tdd(suite) {
+ var suites = [suite];
+ suite.on(EVENT_FILE_PRE_REQUIRE$1, function (context, file, mocha) {
+ var common$1 = common(suites, context, mocha);
+ context.setup = common$1.beforeEach;
+ context.teardown = common$1.afterEach;
+ context.suiteSetup = common$1.before;
+ context.suiteTeardown = common$1.after;
+ context.run = mocha.options.delay && common$1.runWithSuite(suite);
+ /**
+ * Describe a "suite" with the given `title` and callback `fn` containing
+ * nested suites and/or tests.
+ */
+
+ context.suite = function (title, fn) {
+ return common$1.suite.create({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+ /**
+ * Pending suite.
+ */
+
+
+ context.suite.skip = function (title, fn) {
+ return common$1.suite.skip({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+ /**
+ * Exclusive test-case.
+ */
+
+
+ context.suite.only = function (title, fn) {
+ return common$1.suite.only({
+ title: title,
+ file: file,
+ fn: fn
+ });
+ };
+ /**
+ * Describe a specification or test-case with the given `title` and
+ * callback `fn` acting as a thunk.
+ */
+
+
+ context.test = function (title, fn) {
+ var suite = suites[0];
+
+ if (suite.isPending()) {
+ fn = null;
+ }
+
+ var test$1 = new test(title, fn);
+ test$1.file = file;
+ suite.addTest(test$1);
+ return test$1;
+ };
+ /**
+ * Exclusive test-case.
+ */
+
+
+ context.test.only = function (title, fn) {
+ return common$1.test.only(mocha, context.test(title, fn));
+ };
+
+ context.test.skip = common$1.test.skip;
+ });
+ };
+
+ var description$2 = 'traditional "suite"/"test" instead of BDD\'s "describe"/"it"';
+ tdd$1.description = description$2;
+
+ var EVENT_FILE_PRE_REQUIRE = suite.constants.EVENT_FILE_PRE_REQUIRE;
+ /**
+ * QUnit-style interface:
+ *
+ * suite('Array');
+ *
+ * test('#length', function() {
+ * var arr = [1,2,3];
+ * ok(arr.length == 3);
+ * });
+ *
+ * test('#indexOf()', function() {
+ * var arr = [1,2,3];
+ * ok(arr.indexOf(1) == 0);
+ * ok(arr.indexOf(2) == 1);
+ * ok(arr.indexOf(3) == 2);
+ * });
+ *
+ * suite('String');
+ *
+ * test('#length', function() {
+ * ok('foo'.length == 3);
+ * });
+ *
+ * @param {Suite} suite Root suite.
+ */
+
+ var qunit$1 = function qUnitInterface(suite) {
+ var suites = [suite];
+ suite.on(EVENT_FILE_PRE_REQUIRE, function (context, file, mocha) {
+ var common$1 = common(suites, context, mocha);
+ context.before = common$1.before;
+ context.after = common$1.after;
+ context.beforeEach = common$1.beforeEach;
+ context.afterEach = common$1.afterEach;
+ context.run = mocha.options.delay && common$1.runWithSuite(suite);
+ /**
+ * Describe a "suite" with the given `title`.
+ */
+
+ context.suite = function (title) {
+ if (suites.length > 1) {
+ suites.shift();
+ }
+
+ return common$1.suite.create({
+ title: title,
+ file: file,
+ fn: false
+ });
+ };
+ /**
+ * Exclusive Suite.
+ */
+
+
+ context.suite.only = function (title) {
+ if (suites.length > 1) {
+ suites.shift();
+ }
+
+ return common$1.suite.only({
+ title: title,
+ file: file,
+ fn: false
+ });
+ };
+ /**
+ * Describe a specification or test-case
+ * with the given `title` and callback `fn`
+ * acting as a thunk.
+ */
+
+
+ context.test = function (title, fn) {
+ var test$1 = new test(title, fn);
+ test$1.file = file;
+ suites[0].addTest(test$1);
+ return test$1;
+ };
+ /**
+ * Exclusive test-case.
+ */
+
+
+ context.test.only = function (title, fn) {
+ return common$1.test.only(mocha, context.test(title, fn));
+ };
+
+ context.test.skip = common$1.test.skip;
+ });
+ };
+
+ var description$1 = 'QUnit style';
+ qunit$1.description = description$1;
+
+ /**
+ * Exports-style (as Node.js module) interface:
+ *
+ * exports.Array = {
+ * '#indexOf()': {
+ * 'should return -1 when the value is not present': function() {
+ *
+ * },
+ *
+ * 'should return the correct index when the value is present': function() {
+ *
+ * }
+ * }
+ * };
+ *
+ * @param {Suite} suite Root suite.
+ */
+
+
+ var exports$2 = function exports(suite$1) {
+ var suites = [suite$1];
+ suite$1.on(suite.constants.EVENT_FILE_REQUIRE, visit);
+
+ function visit(obj, file) {
+ var suite$1;
+
+ for (var key in obj) {
+ if (typeof obj[key] === 'function') {
+ var fn = obj[key];
+
+ switch (key) {
+ case 'before':
+ suites[0].beforeAll(fn);
+ break;
+
+ case 'after':
+ suites[0].afterAll(fn);
+ break;
+
+ case 'beforeEach':
+ suites[0].beforeEach(fn);
+ break;
+
+ case 'afterEach':
+ suites[0].afterEach(fn);
+ break;
+
+ default:
+ var test$1 = new test(key, fn);
+ test$1.file = file;
+ suites[0].addTest(test$1);
+ }
+ } else {
+ suite$1 = suite.create(suites[0], key);
+ suites.unshift(suite$1);
+ visit(obj[key], file);
+ suites.shift();
+ }
+ }
+ }
+ };
+
+ var description = 'Node.js module ("exports") style';
+ exports$2.description = description;
+
+ var bdd = bdd$1;
+ var tdd = tdd$1;
+ var qunit = qunit$1;
+ var exports$1 = exports$2;
+ var interfaces = {
+ bdd: bdd,
+ tdd: tdd,
+ qunit: qunit,
+ exports: exports$1
+ };
+
+ /**
+ * @module Context
+ */
+
+ /**
+ * Expose `Context`.
+ */
+
+ var context = Context;
+ /**
+ * Initialize a new `Context`.
+ *
+ * @private
+ */
+
+ function Context() {}
+ /**
+ * Set or get the context `Runnable` to `runnable`.
+ *
+ * @private
+ * @param {Runnable} runnable
+ * @return {Context} context
+ */
+
+
+ Context.prototype.runnable = function (runnable) {
+ if (!arguments.length) {
+ return this._runnable;
+ }
+
+ this.test = this._runnable = runnable;
+ return this;
+ };
+ /**
+ * Set or get test timeout `ms`.
+ *
+ * @private
+ * @param {number} ms
+ * @return {Context} self
+ */
+
+
+ Context.prototype.timeout = function (ms) {
+ if (!arguments.length) {
+ return this.runnable().timeout();
+ }
+
+ this.runnable().timeout(ms);
+ return this;
+ };
+ /**
+ * Set or get test slowness threshold `ms`.
+ *
+ * @private
+ * @param {number} ms
+ * @return {Context} self
+ */
+
+
+ Context.prototype.slow = function (ms) {
+ if (!arguments.length) {
+ return this.runnable().slow();
+ }
+
+ this.runnable().slow(ms);
+ return this;
+ };
+ /**
+ * Mark a test as skipped.
+ *
+ * @private
+ * @throws Pending
+ */
+
+
+ Context.prototype.skip = function () {
+ this.runnable().skip();
+ };
+ /**
+ * Set or get a number of allowed retries on failed tests
+ *
+ * @private
+ * @param {number} n
+ * @return {Context} self
+ */
+
+
+ Context.prototype.retries = function (n) {
+ if (!arguments.length) {
+ return this.runnable().retries();
+ }
+
+ this.runnable().retries(n);
+ return this;
+ };
+
+ var mocharc = getCjsExportFromNamespace(mocharc$2);
+
+ var mocha$1 = createCommonjsModule(function (module, exports) {
+ /*!
+ * mocha
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+ var warn = errors.warn,
+ createInvalidReporterError = errors.createInvalidReporterError,
+ createInvalidInterfaceError = errors.createInvalidInterfaceError,
+ createMochaInstanceAlreadyDisposedError = errors.createMochaInstanceAlreadyDisposedError,
+ createMochaInstanceAlreadyRunningError = errors.createMochaInstanceAlreadyRunningError,
+ createUnsupportedError = errors.createUnsupportedError;
+ var _Suite$constants = suite.constants,
+ EVENT_FILE_PRE_REQUIRE = _Suite$constants.EVENT_FILE_PRE_REQUIRE,
+ EVENT_FILE_POST_REQUIRE = _Suite$constants.EVENT_FILE_POST_REQUIRE,
+ EVENT_FILE_REQUIRE = _Suite$constants.EVENT_FILE_REQUIRE;
+ var debug = browser('mocha:mocha');
+ exports = module.exports = Mocha;
+ /**
+ * A Mocha instance is a finite state machine.
+ * These are the states it can be in.
+ * @private
+ */
+
+ var mochaStates = utils.defineConstants({
+ /**
+ * Initial state of the mocha instance
+ * @private
+ */
+ INIT: 'init',
+
+ /**
+ * Mocha instance is running tests
+ * @private
+ */
+ RUNNING: 'running',
+
+ /**
+ * Mocha instance is done running tests and references to test functions and hooks are cleaned.
+ * You can reset this state by unloading the test files.
+ * @private
+ */
+ REFERENCES_CLEANED: 'referencesCleaned',
+
+ /**
+ * Mocha instance is disposed and can no longer be used.
+ * @private
+ */
+ DISPOSED: 'disposed'
+ });
+ /**
+ * To require local UIs and reporters when running in node.
+ */
+
+ if (!utils.isBrowser() && typeof module.paths !== 'undefined') {
+ var cwd = utils.cwd();
+ module.paths.push(cwd, path.join(cwd, 'node_modules'));
+ }
+ /**
+ * Expose internals.
+ * @private
+ */
+
+
+ exports.utils = utils;
+ exports.interfaces = interfaces;
+ /**
+ * @public
+ * @memberof Mocha
+ */
+
+ exports.reporters = reporters;
+ exports.Runnable = runnable;
+ exports.Context = context;
+ /**
+ *
+ * @memberof Mocha
+ */
+
+ exports.Runner = runner;
+ exports.Suite = suite;
+ exports.Hook = hook;
+ exports.Test = test;
+ var currentContext;
+
+ exports.afterEach = function () {
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ return (currentContext.afterEach || currentContext.teardown).apply(this, args);
+ };
+
+ exports.after = function () {
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ return (currentContext.after || currentContext.suiteTeardown).apply(this, args);
+ };
+
+ exports.beforeEach = function () {
+ for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ args[_key3] = arguments[_key3];
+ }
+
+ return (currentContext.beforeEach || currentContext.setup).apply(this, args);
+ };
+
+ exports.before = function () {
+ for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+ args[_key4] = arguments[_key4];
+ }
+
+ return (currentContext.before || currentContext.suiteSetup).apply(this, args);
+ };
+
+ exports.describe = function () {
+ for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
+ args[_key5] = arguments[_key5];
+ }
+
+ return (currentContext.describe || currentContext.suite).apply(this, args);
+ };
+
+ exports.describe.only = function () {
+ for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
+ args[_key6] = arguments[_key6];
+ }
+
+ return (currentContext.describe || currentContext.suite).only.apply(this, args);
+ };
+
+ exports.describe.skip = function () {
+ for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
+ args[_key7] = arguments[_key7];
+ }
+
+ return (currentContext.describe || currentContext.suite).skip.apply(this, args);
+ };
+
+ exports.it = function () {
+ for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
+ args[_key8] = arguments[_key8];
+ }
+
+ return (currentContext.it || currentContext.test).apply(this, args);
+ };
+
+ exports.it.only = function () {
+ for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
+ args[_key9] = arguments[_key9];
+ }
+
+ return (currentContext.it || currentContext.test).only.apply(this, args);
+ };
+
+ exports.it.skip = function () {
+ for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
+ args[_key10] = arguments[_key10];
+ }
+
+ return (currentContext.it || currentContext.test).skip.apply(this, args);
+ };
+
+ exports.xdescribe = exports.describe.skip;
+ exports.xit = exports.it.skip;
+ exports.setup = exports.beforeEach;
+ exports.suiteSetup = exports.before;
+ exports.suiteTeardown = exports.after;
+ exports.suite = exports.describe;
+ exports.teardown = exports.afterEach;
+ exports.test = exports.it;
+
+ exports.run = function () {
+ for (var _len11 = arguments.length, args = new Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
+ args[_key11] = arguments[_key11];
+ }
+
+ return currentContext.run.apply(this, args);
+ };
+ /**
+ * Constructs a new Mocha instance with `options`.
+ *
+ * @public
+ * @class Mocha
+ * @param {Object} [options] - Settings object.
+ * @param {boolean} [options.allowUncaught] - Propagate uncaught errors?
+ * @param {boolean} [options.asyncOnly] - Force `done` callback or promise?
+ * @param {boolean} [options.bail] - Bail after first test failure?
+ * @param {boolean} [options.checkLeaks] - Check for global variable leaks?
+ * @param {boolean} [options.color] - Color TTY output from reporter?
+ * @param {boolean} [options.delay] - Delay root suite execution?
+ * @param {boolean} [options.diff] - Show diff on failure?
+ * @param {boolean} [options.dryRun] - Report tests without running them?
+ * @param {boolean} [options.failZero] - Fail test run if zero tests?
+ * @param {string} [options.fgrep] - Test filter given string.
+ * @param {boolean} [options.forbidOnly] - Tests marked `only` fail the suite?
+ * @param {boolean} [options.forbidPending] - Pending tests fail the suite?
+ * @param {boolean} [options.fullTrace] - Full stacktrace upon failure?
+ * @param {string[]} [options.global] - Variables expected in global scope.
+ * @param {RegExp|string} [options.grep] - Test filter given regular expression.
+ * @param {boolean} [options.growl] - Enable desktop notifications?
+ * @param {boolean} [options.inlineDiffs] - Display inline diffs?
+ * @param {boolean} [options.invert] - Invert test filter matches?
+ * @param {boolean} [options.noHighlighting] - Disable syntax highlighting?
+ * @param {string|constructor} [options.reporter] - Reporter name or constructor.
+ * @param {Object} [options.reporterOption] - Reporter settings object.
+ * @param {number} [options.retries] - Number of times to retry failed tests.
+ * @param {number} [options.slow] - Slow threshold value.
+ * @param {number|string} [options.timeout] - Timeout threshold value.
+ * @param {string} [options.ui] - Interface name.
+ * @param {boolean} [options.parallel] - Run jobs in parallel.
+ * @param {number} [options.jobs] - Max number of worker processes for parallel runs.
+ * @param {MochaRootHookObject} [options.rootHooks] - Hooks to bootstrap the root suite with.
+ * @param {string[]} [options.require] - Pathname of `rootHooks` plugin for parallel runs.
+ * @param {boolean} [options.isWorker] - Should be `true` if `Mocha` process is running in a worker process.
+ */
+
+
+ function Mocha() {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+ options = _objectSpread2(_objectSpread2({}, mocharc), options);
+ this.files = [];
+ this.options = options; // root suite
+
+ this.suite = new exports.Suite('', new exports.Context(), true);
+ this._cleanReferencesAfterRun = true;
+ this._state = mochaStates.INIT;
+ this.grep(options.grep).fgrep(options.fgrep).ui(options.ui).reporter(options.reporter, options.reporterOption || options.reporterOptions // for backwards compability
+ ).slow(options.slow).global(options.global); // this guard exists because Suite#timeout does not consider `undefined` to be valid input
+
+ if (typeof options.timeout !== 'undefined') {
+ this.timeout(options.timeout === false ? 0 : options.timeout);
+ }
+
+ if ('retries' in options) {
+ this.retries(options.retries);
+ }
+
+ ['allowUncaught', 'asyncOnly', 'bail', 'checkLeaks', 'color', 'delay', 'diff', 'dryRun', 'failZero', 'forbidOnly', 'forbidPending', 'fullTrace', 'growl', 'inlineDiffs', 'invert'].forEach(function (opt) {
+ if (options[opt]) {
+ this[opt]();
+ }
+ }, this);
+
+ if (options.rootHooks) {
+ this.rootHooks(options.rootHooks);
+ }
+ /**
+ * The class which we'll instantiate in {@link Mocha#run}. Defaults to
+ * {@link Runner} in serial mode; changes in parallel mode.
+ * @memberof Mocha
+ * @private
+ */
+
+
+ this._runnerClass = exports.Runner;
+ /**
+ * Whether or not to call {@link Mocha#loadFiles} implicitly when calling
+ * {@link Mocha#run}. If this is `true`, then it's up to the consumer to call
+ * {@link Mocha#loadFiles} _or_ {@link Mocha#loadFilesAsync}.
+ * @private
+ * @memberof Mocha
+ */
+
+ this._lazyLoadFiles = false;
+ /**
+ * It's useful for a Mocha instance to know if it's running in a worker process.
+ * We could derive this via other means, but it's helpful to have a flag to refer to.
+ * @memberof Mocha
+ * @private
+ */
+
+ this.isWorker = Boolean(options.isWorker);
+ this.globalSetup(options.globalSetup).globalTeardown(options.globalTeardown).enableGlobalSetup(options.enableGlobalSetup).enableGlobalTeardown(options.enableGlobalTeardown);
+
+ if (options.parallel && (typeof options.jobs === 'undefined' || options.jobs > 1)) {
+ debug('attempting to enable parallel mode');
+ this.parallelMode(true);
+ }
+ }
+ /**
+ * Enables or disables bailing on the first failure.
+ *
+ * @public
+ * @see [CLI option](../#-bail-b)
+ * @param {boolean} [bail=true] - Whether to bail on first error.
+ * @returns {Mocha} this
+ * @chainable
+ */
+
+
+ Mocha.prototype.bail = function (bail) {
+ this.suite.bail(bail !== false);
+ return this;
+ };
+ /**
+ * @summary
+ * Adds `file` to be loaded for execution.
+ *
+ * @description
+ * Useful for generic setup code that must be included within test suite.
+ *
+ * @public
+ * @see [CLI option](../#-file-filedirectoryglob)
+ * @param {string} file - Pathname of file to be loaded.
+ * @returns {Mocha} this
+ * @chainable
+ */
+
+
+ Mocha.prototype.addFile = function (file) {
+ this.files.push(file);
+ return this;
+ };
+ /**
+ * Sets reporter to `reporter`, defaults to "spec".
+ *
+ * @public
+ * @see [CLI option](../#-reporter-name-r-name)
+ * @see [Reporters](../#reporters)
+ * @param {String|Function} reporterName - Reporter name or constructor.
+ * @param {Object} [reporterOptions] - Options used to configure the reporter.
+ * @returns {Mocha} this
+ * @chainable
+ * @throws {Error} if requested reporter cannot be loaded
+ * @example
+ *
+ * // Use XUnit reporter and direct its output to file
+ * mocha.reporter('xunit', { output: '/path/to/testspec.xunit.xml' });
+ */
+
+
+ Mocha.prototype.reporter = function (reporterName, reporterOptions) {
+ if (typeof reporterName === 'function') {
+ this._reporter = reporterName;
+ } else {
+ reporterName = reporterName || 'spec';
+ var reporter; // Try to load a built-in reporter.
+
+ if (reporters[reporterName]) {
+ reporter = reporters[reporterName];
+ } // Try to load reporters from process.cwd() and node_modules
+
+
+ if (!reporter) {
+ try {
+ reporter = commonjsRequire(reporterName);
+ } catch (err) {
+ if (err.code === 'MODULE_NOT_FOUND') {
+ // Try to load reporters from a path (absolute or relative)
+ try {
+ reporter = commonjsRequire(path.resolve(utils.cwd(), reporterName));
+ } catch (_err) {
+ _err.code === 'MODULE_NOT_FOUND' ? warn("'".concat(reporterName, "' reporter not found")) : warn("'".concat(reporterName, "' reporter blew up with error:\n ").concat(err.stack));
+ }
+ } else {
+ warn("'".concat(reporterName, "' reporter blew up with error:\n ").concat(err.stack));
+ }
+ }
+ }
+
+ if (!reporter) {
+ throw createInvalidReporterError("invalid reporter '".concat(reporterName, "'"), reporterName);
+ }
+
+ this._reporter = reporter;
+ }
+
+ this.options.reporterOption = reporterOptions; // alias option name is used in public reporters xunit/tap/progress
+
+ this.options.reporterOptions = reporterOptions;
+ return this;
+ };
+ /**
+ * Sets test UI `name`, defaults to "bdd".
+ *
+ * @public
+ * @see [CLI option](../#-ui-name-u-name)
+ * @see [Interface DSLs](../#interfaces)
+ * @param {string|Function} [ui=bdd] - Interface name or class.
+ * @returns {Mocha} this
+ * @chainable
+ * @throws {Error} if requested interface cannot be loaded
+ */
+
+
+ Mocha.prototype.ui = function (ui) {
+ var bindInterface;
+
+ if (typeof ui === 'function') {
+ bindInterface = ui;
+ } else {
+ ui = ui || 'bdd';
+ bindInterface = exports.interfaces[ui];
+
+ if (!bindInterface) {
+ try {
+ bindInterface = commonjsRequire(ui);
+ } catch (err) {
+ throw createInvalidInterfaceError("invalid interface '".concat(ui, "'"), ui);
+ }
+ }
+ }
+
+ bindInterface(this.suite);
+ this.suite.on(EVENT_FILE_PRE_REQUIRE, function (context) {
+ currentContext = context;
+ });
+ return this;
+ };
+ /**
+ * Loads `files` prior to execution. Does not support ES Modules.
+ *
+ * @description
+ * The implementation relies on Node's `require` to execute
+ * the test interface functions and will be subject to its cache.
+ * Supports only CommonJS modules. To load ES modules, use Mocha#loadFilesAsync.
+ *
+ * @private
+ * @see {@link Mocha#addFile}
+ * @see {@link Mocha#run}
+ * @see {@link Mocha#unloadFiles}
+ * @see {@link Mocha#loadFilesAsync}
+ * @param {Function} [fn] - Callback invoked upon completion.
+ */
+
+
+ Mocha.prototype.loadFiles = function (fn) {
+ var self = this;
+ var suite = this.suite;
+ this.files.forEach(function (file) {
+ file = path.resolve(file);
+ suite.emit(EVENT_FILE_PRE_REQUIRE, commonjsGlobal, file, self);
+ suite.emit(EVENT_FILE_REQUIRE, commonjsRequire(), file, self);
+ suite.emit(EVENT_FILE_POST_REQUIRE, commonjsGlobal, file, self);
+ });
+ fn && fn();
+ };
+ /**
+ * Loads `files` prior to execution. Supports Node ES Modules.
+ *
+ * @description
+ * The implementation relies on Node's `require` and `import` to execute
+ * the test interface functions and will be subject to its cache.
+ * Supports both CJS and ESM modules.
+ *
+ * @public
+ * @see {@link Mocha#addFile}
+ * @see {@link Mocha#run}
+ * @see {@link Mocha#unloadFiles}
+ * @returns {Promise}
+ * @example
+ *
+ * // loads ESM (and CJS) test files asynchronously, then runs root suite
+ * mocha.loadFilesAsync()
+ * .then(() => mocha.run(failures => process.exitCode = failures ? 1 : 0))
+ * .catch(() => process.exitCode = 1);
+ */
+
+
+ Mocha.prototype.loadFilesAsync = function () {
+ var self = this;
+ var suite = this.suite;
+ this.lazyLoadFiles(true);
+ return require$$10.loadFilesAsync(this.files, function (file) {
+ suite.emit(EVENT_FILE_PRE_REQUIRE, commonjsGlobal, file, self);
+ }, function (file, resultModule) {
+ suite.emit(EVENT_FILE_REQUIRE, resultModule, file, self);
+ suite.emit(EVENT_FILE_POST_REQUIRE, commonjsGlobal, file, self);
+ });
+ };
+ /**
+ * Removes a previously loaded file from Node's `require` cache.
+ *
+ * @private
+ * @static
+ * @see {@link Mocha#unloadFiles}
+ * @param {string} file - Pathname of file to be unloaded.
+ */
+
+
+ Mocha.unloadFile = function (file) {
+ if (utils.isBrowser()) {
+ throw createUnsupportedError('unloadFile() is only suported in a Node.js environment');
+ }
+
+ return require$$10.unloadFile(file);
+ };
+ /**
+ * Unloads `files` from Node's `require` cache.
+ *
+ * @description
+ * This allows required files to be "freshly" reloaded, providing the ability
+ * to reuse a Mocha instance programmatically.
+ * Note: does not clear ESM module files from the cache
+ *
+ * Intended for consumers — not used internally
+ *
+ * @public
+ * @see {@link Mocha#run}
+ * @returns {Mocha} this
+ * @chainable
+ */
+
+
+ Mocha.prototype.unloadFiles = function () {
+ if (this._state === mochaStates.DISPOSED) {
+ throw createMochaInstanceAlreadyDisposedError('Mocha instance is already disposed, it cannot be used again.', this._cleanReferencesAfterRun, this);
+ }
+
+ this.files.forEach(function (file) {
+ Mocha.unloadFile(file);
+ });
+ this._state = mochaStates.INIT;
+ return this;
+ };
+ /**
+ * Sets `grep` filter after escaping RegExp special characters.
+ *
+ * @public
+ * @see {@link Mocha#grep}
+ * @param {string} str - Value to be converted to a regexp.
+ * @returns {Mocha} this
+ * @chainable
+ * @example
+ *
+ * // Select tests whose full title begins with `"foo"` followed by a period
+ * mocha.fgrep('foo.');
+ */
+
+
+ Mocha.prototype.fgrep = function (str) {
+ if (!str) {
+ return this;
+ }
+
+ return this.grep(new RegExp(escapeStringRegexp(str)));
+ };
+ /**
+ * @summary
+ * Sets `grep` filter used to select specific tests for execution.
+ *
+ * @description
+ * If `re` is a regexp-like string, it will be converted to regexp.
+ * The regexp is tested against the full title of each test (i.e., the
+ * name of the test preceded by titles of each its ancestral suites).
+ * As such, using an exact-match fixed pattern against the
+ * test name itself will not yield any matches.
+ *
+ * Previous filter value will be overwritten on each call!
+ *
+ * @public
+ * @see [CLI option](../#-grep-regexp-g-regexp)
+ * @see {@link Mocha#fgrep}
+ * @see {@link Mocha#invert}
+ * @param {RegExp|String} re - Regular expression used to select tests.
+ * @return {Mocha} this
+ * @chainable
+ * @example
+ *
+ * // Select tests whose full title contains `"match"`, ignoring case
+ * mocha.grep(/match/i);
+ * @example
+ *
+ * // Same as above but with regexp-like string argument
+ * mocha.grep('/match/i');
+ * @example
+ *
+ * // ## Anti-example
+ * // Given embedded test `it('only-this-test')`...
+ * mocha.grep('/^only-this-test$/'); // NO! Use `.only()` to do this!
+ */
+
+
+ Mocha.prototype.grep = function (re) {
+ if (utils.isString(re)) {
+ // extract args if it's regex-like, i.e: [string, pattern, flag]
+ var arg = re.match(/^\/(.*)\/([gimy]{0,4})$|.*/);
+ this.options.grep = new RegExp(arg[1] || arg[0], arg[2]);
+ } else {
+ this.options.grep = re;
+ }
+
+ return this;
+ };
+ /**
+ * Inverts `grep` matches.
+ *
+ * @public
+ * @see {@link Mocha#grep}
+ * @return {Mocha} this
+ * @chainable
+ * @example
+ *
+ * // Select tests whose full title does *not* contain `"match"`, ignoring case
+ * mocha.grep(/match/i).invert();
+ */
+
+
+ Mocha.prototype.invert = function () {
+ this.options.invert = true;
+ return this;
+ };
+ /**
+ * Enables or disables checking for global variables leaked while running tests.
+ *
+ * @public
+ * @see [CLI option](../#-check-leaks)
+ * @param {boolean} [checkLeaks=true] - Whether to check for global variable leaks.
+ * @return {Mocha} this
+ * @chainable
+ */
+
+
+ Mocha.prototype.checkLeaks = function (checkLeaks) {
+ this.options.checkLeaks = checkLeaks !== false;
+ return this;
+ };
+ /**
+ * Enables or disables whether or not to dispose after each test run.
+ * Disable this to ensure you can run the test suite multiple times.
+ * If disabled, be sure to dispose mocha when you're done to prevent memory leaks.
+ * @public
+ * @see {@link Mocha#dispose}
+ * @param {boolean} cleanReferencesAfterRun
+ * @return {Mocha} this
+ * @chainable
+ */
+
+
+ Mocha.prototype.cleanReferencesAfterRun = function (cleanReferencesAfterRun) {
+ this._cleanReferencesAfterRun = cleanReferencesAfterRun !== false;
+ return this;
+ };
+ /**
+ * Manually dispose this mocha instance. Mark this instance as `disposed` and unable to run more tests.
+ * It also removes function references to tests functions and hooks, so variables trapped in closures can be cleaned by the garbage collector.
+ * @public
+ */
+
+
+ Mocha.prototype.dispose = function () {
+ if (this._state === mochaStates.RUNNING) {
+ throw createMochaInstanceAlreadyRunningError('Cannot dispose while the mocha instance is still running tests.');
+ }
+
+ this.unloadFiles();
+ this._previousRunner && this._previousRunner.dispose();
+ this.suite.dispose();
+ this._state = mochaStates.DISPOSED;
+ };
+ /**
+ * Displays full stack trace upon test failure.
+ *
+ * @public
+ * @see [CLI option](../#-full-trace)
+ * @param {boolean} [fullTrace=true] - Whether to print full stacktrace upon failure.
+ * @return {Mocha} this
+ * @chainable
+ */
+
+
+ Mocha.prototype.fullTrace = function (fullTrace) {
+ this.options.fullTrace = fullTrace !== false;
+ return this;
+ };
+ /**
+ * Enables desktop notification support if prerequisite software installed.
+ *
+ * @public
+ * @see [CLI option](../#-growl-g)
+ * @return {Mocha} this
+ * @chainable
+ */
+
+
+ Mocha.prototype.growl = function () {
+ this.options.growl = this.isGrowlCapable();
+
+ if (!this.options.growl) {
+ var detail = utils.isBrowser() ? 'notification support not available in this browser...' : 'notification support prerequisites not installed...';
+ console.error(detail + ' cannot enable!');
+ }
+
+ return this;
+ };
+ /**
+ * @summary
+ * Determines if Growl support seems likely.
+ *
+ * @description
+ * Not available when run in browser.
+ *
+ * @private
+ * @see {@link Growl#isCapable}
+ * @see {@link Mocha#growl}
+ * @return {boolean} whether Growl support can be expected
+ */
+
+
+ Mocha.prototype.isGrowlCapable = growl.isCapable;
+ /**
+ * Implements desktop notifications using a pseudo-reporter.
+ *
+ * @private
+ * @see {@link Mocha#growl}
+ * @see {@link Growl#notify}
+ * @param {Runner} runner - Runner instance.
+ */
+
+ Mocha.prototype._growl = growl.notify;
+ /**
+ * Specifies whitelist of variable names to be expected in global scope.
+ *
+ * @public
+ * @see [CLI option](../#-global-variable-name)
+ * @see {@link Mocha#checkLeaks}
+ * @param {String[]|String} global - Accepted global variable name(s).
+ * @return {Mocha} this
+ * @chainable
+ * @example
+ *
+ * // Specify variables to be expected in global scope
+ * mocha.global(['jQuery', 'MyLib']);
+ */
+
+ Mocha.prototype.global = function (global) {
+ this.options.global = (this.options.global || []).concat(global).filter(Boolean).filter(function (elt, idx, arr) {
+ return arr.indexOf(elt) === idx;
+ });
+ return this;
+ }; // for backwards compability, 'globals' is an alias of 'global'
+
+
+ Mocha.prototype.globals = Mocha.prototype.global;
+ /**
+ * Enables or disables TTY color output by screen-oriented reporters.
+ *
+ * @public
+ * @see [CLI option](../#-color-c-colors)
+ * @param {boolean} [color=true] - Whether to enable color output.
+ * @return {Mocha} this
+ * @chainable
+ */
+
+ Mocha.prototype.color = function (color) {
+ this.options.color = color !== false;
+ return this;
+ };
+ /**
+ * Enables or disables reporter to use inline diffs (rather than +/-)
+ * in test failure output.
+ *
+ * @public
+ * @see [CLI option](../#-inline-diffs)
+ * @param {boolean} [inlineDiffs=true] - Whether to use inline diffs.
+ * @return {Mocha} this
+ * @chainable
+ */
+
+
+ Mocha.prototype.inlineDiffs = function (inlineDiffs) {
+ this.options.inlineDiffs = inlineDiffs !== false;
+ return this;
+ };
+ /**
+ * Enables or disables reporter to include diff in test failure output.
+ *
+ * @public
+ * @see [CLI option](../#-diff)
+ * @param {boolean} [diff=true] - Whether to show diff on failure.
+ * @return {Mocha} this
+ * @chainable
+ */
+
+
+ Mocha.prototype.diff = function (diff) {
+ this.options.diff = diff !== false;
+ return this;
+ };
+ /**
+ * @summary
+ * Sets timeout threshold value.
+ *
+ * @description
+ * A string argument can use shorthand (such as "2s") and will be converted.
+ * If the value is `0`, timeouts will be disabled.
+ *
+ * @public
+ * @see [CLI option](../#-timeout-ms-t-ms)
+ * @see [Timeouts](../#timeouts)
+ * @param {number|string} msecs - Timeout threshold value.
+ * @return {Mocha} this
+ * @chainable
+ * @example
+ *
+ * // Sets timeout to one second
+ * mocha.timeout(1000);
+ * @example
+ *
+ * // Same as above but using string argument
+ * mocha.timeout('1s');
+ */
+
+
+ Mocha.prototype.timeout = function (msecs) {
+ this.suite.timeout(msecs);
+ return this;
+ };
+ /**
+ * Sets the number of times to retry failed tests.
+ *
+ * @public
+ * @see [CLI option](../#-retries-n)
+ * @see [Retry Tests](../#retry-tests)
+ * @param {number} retry - Number of times to retry failed tests.
+ * @return {Mocha} this
+ * @chainable
+ * @example
+ *
+ * // Allow any failed test to retry one more time
+ * mocha.retries(1);
+ */
+
+
+ Mocha.prototype.retries = function (retry) {
+ this.suite.retries(retry);
+ return this;
+ };
+ /**
+ * Sets slowness threshold value.
+ *
+ * @public
+ * @see [CLI option](../#-slow-ms-s-ms)
+ * @param {number} msecs - Slowness threshold value.
+ * @return {Mocha} this
+ * @chainable
+ * @example
+ *
+ * // Sets "slow" threshold to half a second
+ * mocha.slow(500);
+ * @example
+ *
+ * // Same as above but using string argument
+ * mocha.slow('0.5s');
+ */
+
+
+ Mocha.prototype.slow = function (msecs) {
+ this.suite.slow(msecs);
+ return this;
+ };
+ /**
+ * Forces all tests to either accept a `done` callback or return a promise.
+ *
+ * @public
+ * @see [CLI option](../#-async-only-a)
+ * @param {boolean} [asyncOnly=true] - Whether to force `done` callback or promise.
+ * @return {Mocha} this
+ * @chainable
+ */
+
+
+ Mocha.prototype.asyncOnly = function (asyncOnly) {
+ this.options.asyncOnly = asyncOnly !== false;
+ return this;
+ };
+ /**
+ * Disables syntax highlighting (in browser).
+ *
+ * @public
+ * @return {Mocha} this
+ * @chainable
+ */
+
+
+ Mocha.prototype.noHighlighting = function () {
+ this.options.noHighlighting = true;
+ return this;
+ };
+ /**
+ * Enables or disables uncaught errors to propagate.
+ *
+ * @public
+ * @see [CLI option](../#-allow-uncaught)
+ * @param {boolean} [allowUncaught=true] - Whether to propagate uncaught errors.
+ * @return {Mocha} this
+ * @chainable
+ */
+
+
+ Mocha.prototype.allowUncaught = function (allowUncaught) {
+ this.options.allowUncaught = allowUncaught !== false;
+ return this;
+ };
+ /**
+ * @summary
+ * Delays root suite execution.
+ *
+ * @description
+ * Used to perform async operations before any suites are run.
+ *
+ * @public
+ * @see [delayed root suite](../#delayed-root-suite)
+ * @returns {Mocha} this
+ * @chainable
+ */
+
+
+ Mocha.prototype.delay = function delay() {
+ this.options.delay = true;
+ return this;
+ };
+ /**
+ * Enables or disables running tests in dry-run mode.
+ *
+ * @public
+ * @see [CLI option](../#-dry-run)
+ * @param {boolean} [dryRun=true] - Whether to activate dry-run mode.
+ * @return {Mocha} this
+ * @chainable
+ */
+
+
+ Mocha.prototype.dryRun = function (dryRun) {
+ this.options.dryRun = dryRun !== false;
+ return this;
+ };
+ /**
+ * Fails test run if no tests encountered with exit-code 1.
+ *
+ * @public
+ * @see [CLI option](../#-fail-zero)
+ * @param {boolean} [failZero=true] - Whether to fail test run.
+ * @return {Mocha} this
+ * @chainable
+ */
+
+
+ Mocha.prototype.failZero = function (failZero) {
+ this.options.failZero = failZero !== false;
+ return this;
+ };
+ /**
+ * Causes tests marked `only` to fail the suite.
+ *
+ * @public
+ * @see [CLI option](../#-forbid-only)
+ * @param {boolean} [forbidOnly=true] - Whether tests marked `only` fail the suite.
+ * @returns {Mocha} this
+ * @chainable
+ */
+
+
+ Mocha.prototype.forbidOnly = function (forbidOnly) {
+ this.options.forbidOnly = forbidOnly !== false;
+ return this;
+ };
+ /**
+ * Causes pending tests and tests marked `skip` to fail the suite.
+ *
+ * @public
+ * @see [CLI option](../#-forbid-pending)
+ * @param {boolean} [forbidPending=true] - Whether pending tests fail the suite.
+ * @returns {Mocha} this
+ * @chainable
+ */
+
+
+ Mocha.prototype.forbidPending = function (forbidPending) {
+ this.options.forbidPending = forbidPending !== false;
+ return this;
+ };
+ /**
+ * Throws an error if mocha is in the wrong state to be able to transition to a "running" state.
+ * @private
+ */
+
+
+ Mocha.prototype._guardRunningStateTransition = function () {
+ if (this._state === mochaStates.RUNNING) {
+ throw createMochaInstanceAlreadyRunningError('Mocha instance is currently running tests, cannot start a next test run until this one is done', this);
+ }
+
+ if (this._state === mochaStates.DISPOSED || this._state === mochaStates.REFERENCES_CLEANED) {
+ throw createMochaInstanceAlreadyDisposedError('Mocha instance is already disposed, cannot start a new test run. Please create a new mocha instance. Be sure to set disable `cleanReferencesAfterRun` when you want to reuse the same mocha instance for multiple test runs.', this._cleanReferencesAfterRun, this);
+ }
+ };
+ /**
+ * Mocha version as specified by "package.json".
+ *
+ * @name Mocha#version
+ * @type string
+ * @readonly
+ */
+
+
+ Object.defineProperty(Mocha.prototype, 'version', {
+ value: require$$9.version,
+ configurable: false,
+ enumerable: true,
+ writable: false
+ });
+ /**
+ * Callback to be invoked when test execution is complete.
+ *
+ * @private
+ * @callback DoneCB
+ * @param {number} failures - Number of failures that occurred.
+ */
+
+ /**
+ * Runs root suite and invokes `fn()` when complete.
+ *
+ * @description
+ * To run tests multiple times (or to run tests in files that are
+ * already in the `require` cache), make sure to clear them from
+ * the cache first!
+ *
+ * @public
+ * @see {@link Mocha#unloadFiles}
+ * @see {@link Runner#run}
+ * @param {DoneCB} [fn] - Callback invoked when test execution completed.
+ * @returns {Runner} runner instance
+ * @example
+ *
+ * // exit with non-zero status if there were test failures
+ * mocha.run(failures => process.exitCode = failures ? 1 : 0);
+ */
+
+ Mocha.prototype.run = function (fn) {
+ var _this = this;
+
+ this._guardRunningStateTransition();
+
+ this._state = mochaStates.RUNNING;
+
+ if (this._previousRunner) {
+ this._previousRunner.dispose();
+
+ this.suite.reset();
+ }
+
+ if (this.files.length && !this._lazyLoadFiles) {
+ this.loadFiles();
+ }
+
+ var suite = this.suite;
+ var options = this.options;
+ options.files = this.files;
+ var runner = new this._runnerClass(suite, {
+ cleanReferencesAfterRun: this._cleanReferencesAfterRun,
+ delay: options.delay,
+ dryRun: options.dryRun,
+ failZero: options.failZero
+ });
+ statsCollector(runner);
+ var reporter = new this._reporter(runner, options);
+ runner.checkLeaks = options.checkLeaks === true;
+ runner.fullStackTrace = options.fullTrace;
+ runner.asyncOnly = options.asyncOnly;
+ runner.allowUncaught = options.allowUncaught;
+ runner.forbidOnly = options.forbidOnly;
+ runner.forbidPending = options.forbidPending;
+
+ if (options.grep) {
+ runner.grep(options.grep, options.invert);
+ }
+
+ if (options.global) {
+ runner.globals(options.global);
+ }
+
+ if (options.growl) {
+ this._growl(runner);
+ }
+
+ if (options.color !== undefined) {
+ exports.reporters.Base.useColors = options.color;
+ }
+
+ exports.reporters.Base.inlineDiffs = options.inlineDiffs;
+ exports.reporters.Base.hideDiff = !options.diff;
+
+ var done = function done(failures) {
+ _this._previousRunner = runner;
+ _this._state = _this._cleanReferencesAfterRun ? mochaStates.REFERENCES_CLEANED : mochaStates.INIT;
+ fn = fn || utils.noop;
+
+ if (typeof reporter.done === 'function') {
+ reporter.done(failures, fn);
+ } else {
+ fn(failures);
+ }
+ };
+
+ var runAsync = /*#__PURE__*/function () {
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(runner) {
+ var context, failureCount;
+ return regeneratorRuntime.wrap(function _callee$(_context) {
+ while (1) {
+ switch (_context.prev = _context.next) {
+ case 0:
+ if (!(_this.options.enableGlobalSetup && _this.hasGlobalSetupFixtures())) {
+ _context.next = 6;
+ break;
+ }
+
+ _context.next = 3;
+ return _this.runGlobalSetup(runner);
+
+ case 3:
+ _context.t0 = _context.sent;
+ _context.next = 7;
+ break;
+
+ case 6:
+ _context.t0 = {};
+
+ case 7:
+ context = _context.t0;
+ _context.next = 10;
+ return runner.runAsync({
+ files: _this.files,
+ options: options
+ });
+
+ case 10:
+ failureCount = _context.sent;
+
+ if (!(_this.options.enableGlobalTeardown && _this.hasGlobalTeardownFixtures())) {
+ _context.next = 14;
+ break;
+ }
+
+ _context.next = 14;
+ return _this.runGlobalTeardown(runner, {
+ context: context
+ });
+
+ case 14:
+ return _context.abrupt("return", failureCount);
+
+ case 15:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee);
+ }));
+
+ return function runAsync(_x) {
+ return _ref.apply(this, arguments);
+ };
+ }(); // no "catch" here is intentional. errors coming out of
+ // Runner#run are considered uncaught/unhandled and caught
+ // by the `process` event listeners.
+ // also: returning anything other than `runner` would be a breaking
+ // change
+
+
+ runAsync(runner).then(done);
+ return runner;
+ };
+ /**
+ * Assigns hooks to the root suite
+ * @param {MochaRootHookObject} [hooks] - Hooks to assign to root suite
+ * @chainable
+ */
+
+
+ Mocha.prototype.rootHooks = function rootHooks() {
+ var _this2 = this;
+
+ var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+ _ref2$beforeAll = _ref2.beforeAll,
+ beforeAll = _ref2$beforeAll === void 0 ? [] : _ref2$beforeAll,
+ _ref2$beforeEach = _ref2.beforeEach,
+ beforeEach = _ref2$beforeEach === void 0 ? [] : _ref2$beforeEach,
+ _ref2$afterAll = _ref2.afterAll,
+ afterAll = _ref2$afterAll === void 0 ? [] : _ref2$afterAll,
+ _ref2$afterEach = _ref2.afterEach,
+ afterEach = _ref2$afterEach === void 0 ? [] : _ref2$afterEach;
+
+ beforeAll = utils.castArray(beforeAll);
+ beforeEach = utils.castArray(beforeEach);
+ afterAll = utils.castArray(afterAll);
+ afterEach = utils.castArray(afterEach);
+ beforeAll.forEach(function (hook) {
+ _this2.suite.beforeAll(hook);
+ });
+ beforeEach.forEach(function (hook) {
+ _this2.suite.beforeEach(hook);
+ });
+ afterAll.forEach(function (hook) {
+ _this2.suite.afterAll(hook);
+ });
+ afterEach.forEach(function (hook) {
+ _this2.suite.afterEach(hook);
+ });
+ return this;
+ };
+ /**
+ * Toggles parallel mode.
+ *
+ * Must be run before calling {@link Mocha#run}. Changes the `Runner` class to
+ * use; also enables lazy file loading if not already done so.
+ *
+ * Warning: when passed `false` and lazy loading has been enabled _via any means_ (including calling `parallelMode(true)`), this method will _not_ disable lazy loading. Lazy loading is a prerequisite for parallel
+ * mode, but parallel mode is _not_ a prerequisite for lazy loading!
+ * @param {boolean} [enable] - If `true`, enable; otherwise disable.
+ * @throws If run in browser
+ * @throws If Mocha not in `INIT` state
+ * @returns {Mocha}
+ * @chainable
+ * @public
+ */
+
+
+ Mocha.prototype.parallelMode = function parallelMode() {
+ var enable = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
+
+ if (utils.isBrowser()) {
+ throw createUnsupportedError('parallel mode is only supported in Node.js');
+ }
+
+ var parallel = Boolean(enable);
+
+ if (parallel === this.options.parallel && this._lazyLoadFiles && this._runnerClass !== exports.Runner) {
+ return this;
+ }
+
+ if (this._state !== mochaStates.INIT) {
+ throw createUnsupportedError('cannot change parallel mode after having called run()');
+ }
+
+ this.options.parallel = parallel; // swap Runner class
+
+ this._runnerClass = parallel ? require$$10 : exports.Runner; // lazyLoadFiles may have been set `true` otherwise (for ESM loading),
+ // so keep `true` if so.
+
+ return this.lazyLoadFiles(this._lazyLoadFiles || parallel);
+ };
+ /**
+ * Disables implicit call to {@link Mocha#loadFiles} in {@link Mocha#run}. This
+ * setting is used by watch mode, parallel mode, and for loading ESM files.
+ * @todo This should throw if we've already loaded files; such behavior
+ * necessitates adding a new state.
+ * @param {boolean} [enable] - If `true`, disable eager loading of files in
+ * {@link Mocha#run}
+ * @chainable
+ * @public
+ */
+
+
+ Mocha.prototype.lazyLoadFiles = function lazyLoadFiles(enable) {
+ this._lazyLoadFiles = enable === true;
+ debug('set lazy load to %s', enable);
+ return this;
+ };
+ /**
+ * Configures one or more global setup fixtures.
+ *
+ * If given no parameters, _unsets_ any previously-set fixtures.
+ * @chainable
+ * @public
+ * @param {MochaGlobalFixture|MochaGlobalFixture[]} [setupFns] - Global setup fixture(s)
+ * @returns {Mocha}
+ */
+
+
+ Mocha.prototype.globalSetup = function globalSetup() {
+ var setupFns = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
+ setupFns = utils.castArray(setupFns);
+ this.options.globalSetup = setupFns;
+ debug('configured %d global setup functions', setupFns.length);
+ return this;
+ };
+ /**
+ * Configures one or more global teardown fixtures.
+ *
+ * If given no parameters, _unsets_ any previously-set fixtures.
+ * @chainable
+ * @public
+ * @param {MochaGlobalFixture|MochaGlobalFixture[]} [teardownFns] - Global teardown fixture(s)
+ * @returns {Mocha}
+ */
+
+
+ Mocha.prototype.globalTeardown = function globalTeardown() {
+ var teardownFns = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
+ teardownFns = utils.castArray(teardownFns);
+ this.options.globalTeardown = teardownFns;
+ debug('configured %d global teardown functions', teardownFns.length);
+ return this;
+ };
+ /**
+ * Run any global setup fixtures sequentially, if any.
+ *
+ * This is _automatically called_ by {@link Mocha#run} _unless_ the `runGlobalSetup` option is `false`; see {@link Mocha#enableGlobalSetup}.
+ *
+ * The context object this function resolves with should be consumed by {@link Mocha#runGlobalTeardown}.
+ * @param {object} [context] - Context object if already have one
+ * @public
+ * @returns {Promise} Context object
+ */
+
+
+ Mocha.prototype.runGlobalSetup = /*#__PURE__*/function () {
+ var _runGlobalSetup = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
+ var context,
+ globalSetup,
+ _args2 = arguments;
+ return regeneratorRuntime.wrap(function _callee2$(_context2) {
+ while (1) {
+ switch (_context2.prev = _context2.next) {
+ case 0:
+ context = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : {};
+ globalSetup = this.options.globalSetup;
+
+ if (!(globalSetup && globalSetup.length)) {
+ _context2.next = 7;
+ break;
+ }
+
+ debug('run(): global setup starting');
+ _context2.next = 6;
+ return this._runGlobalFixtures(globalSetup, context);
+
+ case 6:
+ debug('run(): global setup complete');
+
+ case 7:
+ return _context2.abrupt("return", context);
+
+ case 8:
+ case "end":
+ return _context2.stop();
+ }
+ }
+ }, _callee2, this);
+ }));
+
+ function runGlobalSetup() {
+ return _runGlobalSetup.apply(this, arguments);
+ }
+
+ return runGlobalSetup;
+ }();
+ /**
+ * Run any global teardown fixtures sequentially, if any.
+ *
+ * This is _automatically called_ by {@link Mocha#run} _unless_ the `runGlobalTeardown` option is `false`; see {@link Mocha#enableGlobalTeardown}.
+ *
+ * Should be called with context object returned by {@link Mocha#runGlobalSetup}, if applicable.
+ * @param {object} [context] - Context object if already have one
+ * @public
+ * @returns {Promise} Context object
+ */
+
+
+ Mocha.prototype.runGlobalTeardown = /*#__PURE__*/function () {
+ var _runGlobalTeardown = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
+ var context,
+ globalTeardown,
+ _args3 = arguments;
+ return regeneratorRuntime.wrap(function _callee3$(_context3) {
+ while (1) {
+ switch (_context3.prev = _context3.next) {
+ case 0:
+ context = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : {};
+ globalTeardown = this.options.globalTeardown;
+
+ if (!(globalTeardown && globalTeardown.length)) {
+ _context3.next = 6;
+ break;
+ }
+
+ debug('run(): global teardown starting');
+ _context3.next = 6;
+ return this._runGlobalFixtures(globalTeardown, context);
+
+ case 6:
+ debug('run(): global teardown complete');
+ return _context3.abrupt("return", context);
+
+ case 8:
+ case "end":
+ return _context3.stop();
+ }
+ }
+ }, _callee3, this);
+ }));
+
+ function runGlobalTeardown() {
+ return _runGlobalTeardown.apply(this, arguments);
+ }
+
+ return runGlobalTeardown;
+ }();
+ /**
+ * Run global fixtures sequentially with context `context`
+ * @private
+ * @param {MochaGlobalFixture[]} [fixtureFns] - Fixtures to run
+ * @param {object} [context] - context object
+ * @returns {Promise} context object
+ */
+
+
+ Mocha.prototype._runGlobalFixtures = /*#__PURE__*/function () {
+ var _runGlobalFixtures2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {
+ var fixtureFns,
+ context,
+ _iteratorAbruptCompletion,
+ _didIteratorError,
+ _iteratorError,
+ _iterator,
+ _step,
+ fixtureFn,
+ _args4 = arguments;
+
+ return regeneratorRuntime.wrap(function _callee4$(_context4) {
+ while (1) {
+ switch (_context4.prev = _context4.next) {
+ case 0:
+ fixtureFns = _args4.length > 0 && _args4[0] !== undefined ? _args4[0] : [];
+ context = _args4.length > 1 && _args4[1] !== undefined ? _args4[1] : {};
+ _iteratorAbruptCompletion = false;
+ _didIteratorError = false;
+ _context4.prev = 4;
+ _iterator = _asyncIterator(fixtureFns);
+
+ case 6:
+ _context4.next = 8;
+ return _iterator.next();
+
+ case 8:
+ if (!(_iteratorAbruptCompletion = !(_step = _context4.sent).done)) {
+ _context4.next = 15;
+ break;
+ }
+
+ fixtureFn = _step.value;
+ _context4.next = 12;
+ return fixtureFn.call(context);
+
+ case 12:
+ _iteratorAbruptCompletion = false;
+ _context4.next = 6;
+ break;
+
+ case 15:
+ _context4.next = 21;
+ break;
+
+ case 17:
+ _context4.prev = 17;
+ _context4.t0 = _context4["catch"](4);
+ _didIteratorError = true;
+ _iteratorError = _context4.t0;
+
+ case 21:
+ _context4.prev = 21;
+ _context4.prev = 22;
+
+ if (!(_iteratorAbruptCompletion && _iterator["return"] != null)) {
+ _context4.next = 26;
+ break;
+ }
+
+ _context4.next = 26;
+ return _iterator["return"]();
+
+ case 26:
+ _context4.prev = 26;
+
+ if (!_didIteratorError) {
+ _context4.next = 29;
+ break;
+ }
+
+ throw _iteratorError;
+
+ case 29:
+ return _context4.finish(26);
+
+ case 30:
+ return _context4.finish(21);
+
+ case 31:
+ return _context4.abrupt("return", context);
+
+ case 32:
+ case "end":
+ return _context4.stop();
+ }
+ }
+ }, _callee4, null, [[4, 17, 21, 31], [22,, 26, 30]]);
+ }));
+
+ function _runGlobalFixtures() {
+ return _runGlobalFixtures2.apply(this, arguments);
+ }
+
+ return _runGlobalFixtures;
+ }();
+ /**
+ * Toggle execution of any global setup fixture(s)
+ *
+ * @chainable
+ * @public
+ * @param {boolean } [enabled=true] - If `false`, do not run global setup fixture
+ * @returns {Mocha}
+ */
+
+
+ Mocha.prototype.enableGlobalSetup = function enableGlobalSetup() {
+ var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
+ this.options.enableGlobalSetup = Boolean(enabled);
+ return this;
+ };
+ /**
+ * Toggle execution of any global teardown fixture(s)
+ *
+ * @chainable
+ * @public
+ * @param {boolean } [enabled=true] - If `false`, do not run global teardown fixture
+ * @returns {Mocha}
+ */
+
+
+ Mocha.prototype.enableGlobalTeardown = function enableGlobalTeardown() {
+ var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
+ this.options.enableGlobalTeardown = Boolean(enabled);
+ return this;
+ };
+ /**
+ * Returns `true` if one or more global setup fixtures have been supplied.
+ * @public
+ * @returns {boolean}
+ */
+
+
+ Mocha.prototype.hasGlobalSetupFixtures = function hasGlobalSetupFixtures() {
+ return Boolean(this.options.globalSetup.length);
+ };
+ /**
+ * Returns `true` if one or more global teardown fixtures have been supplied.
+ * @public
+ * @returns {boolean}
+ */
+
+
+ Mocha.prototype.hasGlobalTeardownFixtures = function hasGlobalTeardownFixtures() {
+ return Boolean(this.options.globalTeardown.length);
+ };
+ /**
+ * An alternative way to define root hooks that works with parallel runs.
+ * @typedef {Object} MochaRootHookObject
+ * @property {Function|Function[]} [beforeAll] - "Before all" hook(s)
+ * @property {Function|Function[]} [beforeEach] - "Before each" hook(s)
+ * @property {Function|Function[]} [afterAll] - "After all" hook(s)
+ * @property {Function|Function[]} [afterEach] - "After each" hook(s)
+ */
+
+ /**
+ * An function that returns a {@link MochaRootHookObject}, either sync or async.
+ @callback MochaRootHookFunction
+ * @returns {MochaRootHookObject|Promise}
+ */
+
+ /**
+ * A function that's invoked _once_ which is either sync or async.
+ * Can be a "teardown" or "setup". These will all share the same context.
+ * @callback MochaGlobalFixture
+ * @returns {void|Promise}
+ */
+
+ /**
+ * An object making up all necessary parts of a plugin loader and aggregator
+ * @typedef {Object} PluginDefinition
+ * @property {string} exportName - Named export to use
+ * @property {string} [optionName] - Option name for Mocha constructor (use `exportName` if omitted)
+ * @property {PluginValidator} [validate] - Validator function
+ * @property {PluginFinalizer} [finalize] - Finalizer/aggregator function
+ */
+
+ /**
+ * A (sync) function to assert a user-supplied plugin implementation is valid.
+ *
+ * Defined in a {@link PluginDefinition}.
+
+ * @callback PluginValidator
+ * @param {*} value - Value to check
+ * @this {PluginDefinition}
+ * @returns {void}
+ */
+
+ /**
+ * A function to finalize plugins impls of a particular ilk
+ * @callback PluginFinalizer
+ * @param {Array<*>} impls - User-supplied implementations
+ * @returns {Promise<*>|*}
+ */
+
+ });
+
+ /* eslint no-unused-vars: off */
+
+ /* eslint-env commonjs */
+
+ /**
+ * Shim process.stdout.
+ */
+
+
+ process$4.stdout = browserStdout({
+ label: false
+ });
+ /**
+ * Create a Mocha instance.
+ *
+ * @return {undefined}
+ */
+
+ var mocha = new mocha$1({
+ reporter: 'html'
+ });
+ /**
+ * Save timer references to avoid Sinon interfering (see GH-237).
+ */
+
+ var Date$1 = commonjsGlobal.Date;
+ var setTimeout$1 = commonjsGlobal.setTimeout;
+ commonjsGlobal.setInterval;
+ commonjsGlobal.clearTimeout;
+ commonjsGlobal.clearInterval;
+ var uncaughtExceptionHandlers = [];
+ var originalOnerrorHandler = commonjsGlobal.onerror;
+ /**
+ * Remove uncaughtException listener.
+ * Revert to original onerror handler if previously defined.
+ */
+
+ process$4.removeListener = function (e, fn) {
+ if (e === 'uncaughtException') {
+ if (originalOnerrorHandler) {
+ commonjsGlobal.onerror = originalOnerrorHandler;
+ } else {
+ commonjsGlobal.onerror = function () {};
+ }
+
+ var i = uncaughtExceptionHandlers.indexOf(fn);
+
+ if (i !== -1) {
+ uncaughtExceptionHandlers.splice(i, 1);
+ }
+ }
+ };
+ /**
+ * Implements listenerCount for 'uncaughtException'.
+ */
+
+
+ process$4.listenerCount = function (name) {
+ if (name === 'uncaughtException') {
+ return uncaughtExceptionHandlers.length;
+ }
+
+ return 0;
+ };
+ /**
+ * Implements uncaughtException listener.
+ */
+
+
+ process$4.on = function (e, fn) {
+ if (e === 'uncaughtException') {
+ commonjsGlobal.onerror = function (err, url, line) {
+ fn(new Error(err + ' (' + url + ':' + line + ')'));
+ return !mocha.options.allowUncaught;
+ };
+
+ uncaughtExceptionHandlers.push(fn);
+ }
+ };
+
+ process$4.listeners = function (e) {
+ if (e === 'uncaughtException') {
+ return uncaughtExceptionHandlers;
+ }
+
+ return [];
+ }; // The BDD UI is registered by default, but no UI will be functional in the
+ // browser without an explicit call to the overridden `mocha.ui` (see below).
+ // Ensure that this default UI does not expose its methods to the global scope.
+
+
+ mocha.suite.removeAllListeners('pre-require');
+ var immediateQueue = [];
+ var immediateTimeout;
+
+ function timeslice() {
+ var immediateStart = new Date$1().getTime();
+
+ while (immediateQueue.length && new Date$1().getTime() - immediateStart < 100) {
+ immediateQueue.shift()();
+ }
+
+ if (immediateQueue.length) {
+ immediateTimeout = setTimeout$1(timeslice, 0);
+ } else {
+ immediateTimeout = null;
+ }
+ }
+ /**
+ * High-performance override of Runner.immediately.
+ */
+
+
+ mocha$1.Runner.immediately = function (callback) {
+ immediateQueue.push(callback);
+
+ if (!immediateTimeout) {
+ immediateTimeout = setTimeout$1(timeslice, 0);
+ }
+ };
+ /**
+ * Function to allow assertion libraries to throw errors directly into mocha.
+ * This is useful when running tests in a browser because window.onerror will
+ * only receive the 'message' attribute of the Error.
+ */
+
+
+ mocha.throwError = function (err) {
+ uncaughtExceptionHandlers.forEach(function (fn) {
+ fn(err);
+ });
+ throw err;
+ };
+ /**
+ * Override ui to ensure that the ui functions are initialized.
+ * Normally this would happen in Mocha.prototype.loadFiles.
+ */
+
+
+ mocha.ui = function (ui) {
+ mocha$1.prototype.ui.call(this, ui);
+ this.suite.emit('pre-require', commonjsGlobal, null, this);
+ return this;
+ };
+ /**
+ * Setup mocha with the given setting options.
+ */
+
+
+ mocha.setup = function (opts) {
+ if (typeof opts === 'string') {
+ opts = {
+ ui: opts
+ };
+ }
+
+ if (opts.delay === true) {
+ this.delay();
+ }
+
+ var self = this;
+ Object.keys(opts).filter(function (opt) {
+ return opt !== 'delay';
+ }).forEach(function (opt) {
+ if (Object.prototype.hasOwnProperty.call(opts, opt)) {
+ self[opt](opts[opt]);
+ }
+ });
+ return this;
+ };
+ /**
+ * Run mocha, returning the Runner.
+ */
+
+
+ mocha.run = function (fn) {
+ var options = mocha.options;
+ mocha.globals('location');
+ var query = parseQuery(commonjsGlobal.location.search || '');
+
+ if (query.grep) {
+ mocha.grep(query.grep);
+ }
+
+ if (query.fgrep) {
+ mocha.fgrep(query.fgrep);
+ }
+
+ if (query.invert) {
+ mocha.invert();
+ }
+
+ return mocha$1.prototype.run.call(mocha, function (err) {
+ // The DOM Document is not available in Web Workers.
+ var document = commonjsGlobal.document;
+
+ if (document && document.getElementById('mocha') && options.noHighlighting !== true) {
+ highlightTags('code');
+ }
+
+ if (fn) {
+ fn(err);
+ }
+ });
+ };
+ /**
+ * Expose the process shim.
+ * https://github.com/mochajs/mocha/pull/916
+ */
+
+
+ mocha$1.process = process$4;
+ /**
+ * Expose mocha.
+ */
+
+ commonjsGlobal.Mocha = mocha$1;
+ commonjsGlobal.mocha = mocha;
+ var browserEntry = mocha;
+
+ return browserEntry;
+
+}));
+//# sourceMappingURL=mocha.js.map