diff --git a/package.json b/package.json index 5083a24..17a2c62 100644 --- a/package.json +++ b/package.json @@ -18,48 +18,22 @@ "> 1%", "last 2 versions" ], - "xo": { - "env": [ - "node", - "browser", - "es6" - ], - "space": 2, - "rules": { - "operator-linebreak": [ - 2, - "before" - ] - }, - "ignore": [ - "src/js/loadJS.js", - "src/js/sw-registration.js", - "src/service-worker.js", - "public/**/*" - ] - }, "author": "Jakob Anderson", "license": "MIT", "dependencies": { "chai": "^3.5.0", - "localforage": "^1.5.0", - "pjs-problems": "^1.0.3" + "pjs-problems": "^2.0.1" }, "devDependencies": { "autoprefixer": "^6.7.7", - "ava": "^0.18.2", "babel-core": "^6.24.0", "babel-preset-env": "^1.4.0", - "babel-preset-es2015": "^6.24.1", - "babel-preset-es2017": "^6.24.1", - "babel-preset-latest": "^6.24.1", "babelify": "^7.3.0", "browserify": "^14.3.0", "chai": "^3.5.0", "cssnano": "^3.10.0", "dedent": "^0.7.0", "gulp": "^3.9.1", - "gulp-bro": "^1.0.2", "gulp-htmlmin": "^3.0.0", "gulp-image": "^2.8.0", "gulp-livereload": "^3.8.1", @@ -68,18 +42,13 @@ "gulp-sourcemaps": "^2.6.0", "gulp-svgo": "^1.0.3", "gulp-uglify": "^3.0.0", - "gulp-util": "^3.0.8", "http-server": "^0.10.0", "husky": "^0.13.3", - "lint-staged": "^3.4.0", - "localforage": "^1.5.0", - "rollup-stream": "^1.19.0", "sw-precache": "^5.1.1", "uglify-es": "^3.0.15", "uglifyify": "^3.0.4", "vinyl-buffer": "^1.0.0", "vinyl-source-stream": "^1.1.0", - "watchify": "^3.9.0", - "xo": "^0.18.2" + "watchify": "^3.9.0" } } diff --git a/public/dist/js/bundle.min.js b/public/dist/js/bundle.min.js index d2d7b4d..ea2966c 100644 --- a/public/dist/js/bundle.min.js +++ b/public/dist/js/bundle.min.js @@ -1,2 +1,2 @@ -!function e(t,n,o){function r(i,a){if(!n[i]){if(!t[i]){var c="function"==typeof require&&require;if(!a&&c)return c(i,!0);if(s)return s(i,!0);var u=new Error("Cannot find module '"+i+"'");throw u.code="MODULE_NOT_FOUND",u}var l=n[i]={exports:{}};t[i][0].call(l.exports,function(e){var n=t[i][1][e];return r(n||e)},l,l.exports,e,t,n,o)}return n[i].exports}for(var s="function"==typeof require&&require,i=0;ie,"expected #{this} to have a length above #{exp} but got #{act}","expected #{this} to not have a length above #{exp}",e,o)}else this.assert(n>e,"expected #{this} to be above "+e,"expected #{this} to be at most "+e)}function u(e,t){t&&N(this,"message",t);var n=N(this,"object");if(N(this,"doLength")){new S(n,t).to.have.property("length");var o=n.length;this.assert(o>=e,"expected #{this} to have a length at least #{exp} but got #{act}","expected #{this} to have a length below #{exp}",e,o)}else this.assert(n>=e,"expected #{this} to be at least "+e,"expected #{this} to be below "+e)}function l(e,t){t&&N(this,"message",t);var n=N(this,"object");if(N(this,"doLength")){new S(n,t).to.have.property("length");var o=n.length;this.assert(o1)throw new Error(s);break;case"object":if(arguments.length>1)throw new Error(s);e=Object.keys(e);break;default:e=Array.prototype.slice.call(arguments)}if(!e.length)throw new Error("keys required");var i=Object.keys(o),a=e,c=e.length,u=N(this,"any"),l=N(this,"all");if(u||l||(l=!0),u&&(r=a.filter(function(e){return~i.indexOf(e)}).length>0),l&&(r=e.every(function(e){return~i.indexOf(e)}),N(this,"negate")||N(this,"contains")||(r=r&&e.length==i.length)),c>1){var p=(e=e.map(function(e){return t.inspect(e)})).pop();l&&(n=e.join(", ")+", and "+p),u&&(n=e.join(", ")+", or "+p)}else n=t.inspect(e[0]);n=(c>1?"keys ":"key ")+n,n=(N(this,"contains")?"contain ":"have ")+n,this.assert(r,"expected #{this} to "+n,"expected #{this} to not "+n,a.slice(0).sort(),i.sort(),!0)}function v(e,n,o){o&&N(this,"message",o);var r=N(this,"object");new S(r,o).is.a("function");var s=!1,i=null,a=null,c=null;0===arguments.length?(n=null,e=null):e&&(e instanceof RegExp||"string"==typeof e)?(n=e,e=null):e&&e instanceof Error?(i=e,e=null,n=null):"function"==typeof e?(!(a=e.prototype.name)||"Error"===a&&e!==Error)&&(a=e.name||(new e).name):e=null;try{r()}catch(o){if(i)return this.assert(o===i,"expected #{this} to throw #{exp} but #{act} was thrown","expected #{this} to not throw #{exp}",i instanceof Error?i.toString():i,o instanceof Error?o.toString():o),N(this,"object",o),this;if(e&&(this.assert(o instanceof e,"expected #{this} to throw #{exp} but #{act} was thrown","expected #{this} to not throw #{exp} but #{act} was thrown",a,o instanceof Error?o.toString():o),!n))return N(this,"object",o),this;var u="error"===t.type(o)&&"message"in o?o.message:""+o;if(null!=u&&n&&n instanceof RegExp)return this.assert(n.exec(u),"expected #{this} to throw error matching #{exp} but got #{act}","expected #{this} to throw error not matching #{exp}",n,u),N(this,"object",o),this;if(null!=u&&n&&"string"==typeof n)return this.assert(~u.indexOf(n),"expected #{this} to throw error including #{exp} but got #{act}","expected #{this} to throw error not including #{act}",n,u),N(this,"object",o),this;s=!0,c=o}var l="",p=null!==a?a:i?"#{exp}":"an error";s&&(l=" but #{act} was thrown"),this.assert(!0===s,"expected #{this} to throw "+p+l,"expected #{this} to not throw "+p+l,i instanceof Error?i.toString():i,c instanceof Error?c.toString():c),N(this,"object",c)}function w(e,n){n&&N(this,"message",n);var o=N(this,"object"),r=N(this,"itself"),s="function"!==t.type(o)||r?o[e]:o.prototype[e];this.assert("function"==typeof s,"expected #{this} to respond to "+t.inspect(e),"expected #{this} to not respond to "+t.inspect(e))}function x(e,n){n&&N(this,"message",n);var o=e(N(this,"object"));this.assert(o,"expected #{this} to satisfy "+t.objDisplay(e),"expected #{this} to not satisfy"+t.objDisplay(e),!this.negate,o)}function j(e,n,o){o&&N(this,"message",o);var r=N(this,"object");if(new S(r,o).is.a("number"),"number"!==t.type(e)||"number"!==t.type(n))throw new Error("the arguments to closeTo or approximately must be numbers");this.assert(Math.abs(r-e)<=n,"expected #{this} to be close to "+e+" +/- "+n,"expected #{this} not to be close to "+e+" +/- "+n)}function E(e,t,n){return e.every(function(e){return n?t.some(function(t){return n(e,t)}):-1!==t.indexOf(e)})}function O(e,t){t&&N(this,"message",t);var n=N(this,"object");new S(e).to.be.an("array"),this.assert(e.indexOf(n)>-1,"expected #{this} to be one of #{exp}","expected #{this} to not be one of #{exp}",e,n)}function A(e,t,n){n&&N(this,"message",n);var o=N(this,"object");new S(e,n).to.have.property(t),new S(o).is.a("function");var r=e[t];o(),this.assert(r!==e[t],"expected ."+t+" to change","expected ."+t+" to not change")}function P(e,t,n){n&&N(this,"message",n);var o=N(this,"object");new S(e,n).to.have.property(t),new S(o).is.a("function");var r=e[t];o(),this.assert(e[t]-r>0,"expected ."+t+" to increase","expected ."+t+" to not increase")}function M(e,t,n){n&&N(this,"message",n);var o=N(this,"object");new S(e,n).to.have.property(t),new S(o).is.a("function");var r=e[t];o(),this.assert(e[t]-r<0,"expected ."+t+" to decrease","expected ."+t+" to not decrease")}var S=e.Assertion,N=(Object.prototype.toString,t.flag);["to","be","been","is","and","has","have","with","that","which","at","of","same"].forEach(function(e){S.addProperty(e,function(){return this})}),S.addProperty("not",function(){N(this,"negate",!0)}),S.addProperty("deep",function(){N(this,"deep",!0)}),S.addProperty("any",function(){N(this,"any",!0),N(this,"all",!1)}),S.addProperty("all",function(){N(this,"all",!0),N(this,"any",!1)}),S.addChainableMethod("an",n),S.addChainableMethod("a",n),S.addChainableMethod("include",r,o),S.addChainableMethod("contain",r,o),S.addChainableMethod("contains",r,o),S.addChainableMethod("includes",r,o),S.addProperty("ok",function(){this.assert(N(this,"object"),"expected #{this} to be truthy","expected #{this} to be falsy")}),S.addProperty("true",function(){this.assert(!0===N(this,"object"),"expected #{this} to be true","expected #{this} to be false",!this.negate)}),S.addProperty("false",function(){this.assert(!1===N(this,"object"),"expected #{this} to be false","expected #{this} to be true",!!this.negate)}),S.addProperty("null",function(){this.assert(null===N(this,"object"),"expected #{this} to be null","expected #{this} not to be null")}),S.addProperty("undefined",function(){this.assert(void 0===N(this,"object"),"expected #{this} to be undefined","expected #{this} not to be undefined")}),S.addProperty("NaN",function(){this.assert(isNaN(N(this,"object")),"expected #{this} to be NaN","expected #{this} not to be NaN")}),S.addProperty("exist",function(){this.assert(null!=N(this,"object"),"expected #{this} to exist","expected #{this} to not exist")}),S.addProperty("empty",function(){var e=N(this,"object"),t=e;Array.isArray(e)||"string"==typeof object?t=e.length:"object"==typeof e&&(t=Object.keys(e).length),this.assert(!t,"expected #{this} to be empty","expected #{this} not to be empty")}),S.addProperty("arguments",s),S.addProperty("Arguments",s),S.addMethod("equal",i),S.addMethod("equals",i),S.addMethod("eq",i),S.addMethod("eql",a),S.addMethod("eqls",a),S.addMethod("above",c),S.addMethod("gt",c),S.addMethod("greaterThan",c),S.addMethod("least",u),S.addMethod("gte",u),S.addMethod("below",l),S.addMethod("lt",l),S.addMethod("lessThan",l),S.addMethod("most",p),S.addMethod("lte",p),S.addMethod("within",function(e,t,n){n&&N(this,"message",n);var o=N(this,"object"),r=e+".."+t;if(N(this,"doLength")){new S(o,n).to.have.property("length");var s=o.length;this.assert(s>=e&&s<=t,"expected #{this} to have a length within "+r,"expected #{this} to not have a length within "+r)}else this.assert(o>=e&&o<=t,"expected #{this} to be within "+r,"expected #{this} to not be within "+r)}),S.addMethod("instanceof",h),S.addMethod("instanceOf",h),S.addMethod("property",function(e,n,o){o&&N(this,"message",o);var r=!!N(this,"deep"),s=r?"deep property ":"property ",i=N(this,"negate"),a=N(this,"object"),c=r?t.getPathInfo(e,a):null,u=r?c.exists:t.hasProperty(e,a),l=r?c.value:a[e];if(i&&arguments.length>1){if(void 0===l)throw o=null!=o?o+": ":"",new Error(o+t.inspect(a)+" has no "+s+t.inspect(e))}else this.assert(u,"expected #{this} to have a "+s+t.inspect(e),"expected #{this} to not have "+s+t.inspect(e));arguments.length>1&&this.assert(n===l,"expected #{this} to have a "+s+t.inspect(e)+" of #{exp}, but got #{act}","expected #{this} to not have a "+s+t.inspect(e)+" of #{act}",n,l),N(this,"object",l)}),S.addMethod("ownProperty",f),S.addMethod("haveOwnProperty",f),S.addMethod("ownPropertyDescriptor",d),S.addMethod("haveOwnPropertyDescriptor",d),S.addChainableMethod("length",b,g),S.addMethod("lengthOf",b),S.addMethod("match",m),S.addMethod("matches",m),S.addMethod("string",function(e,n){n&&N(this,"message",n);var o=N(this,"object");new S(o,n).is.a("string"),this.assert(~o.indexOf(e),"expected #{this} to contain "+t.inspect(e),"expected #{this} to not contain "+t.inspect(e))}),S.addMethod("keys",y),S.addMethod("key",y),S.addMethod("throw",v),S.addMethod("throws",v),S.addMethod("Throw",v),S.addMethod("respondTo",w),S.addMethod("respondsTo",w),S.addProperty("itself",function(){N(this,"itself",!0)}),S.addMethod("satisfy",x),S.addMethod("satisfies",x),S.addMethod("closeTo",j),S.addMethod("approximately",j),S.addMethod("members",function(e,n){n&&N(this,"message",n);var o=N(this,"object");new S(o).to.be.an("array"),new S(e).to.be.an("array");var r=N(this,"deep")?t.eql:void 0;if(N(this,"contains"))return this.assert(E(e,o,r),"expected #{this} to be a superset of #{act}","expected #{this} to not be a superset of #{act}",o,e);this.assert(E(o,e,r)&&E(e,o,r),"expected #{this} to have the same members as #{act}","expected #{this} to not have the same members as #{act}",o,e)}),S.addMethod("oneOf",O),S.addChainableMethod("change",A),S.addChainableMethod("changes",A),S.addChainableMethod("increase",P),S.addChainableMethod("increases",P),S.addChainableMethod("decrease",M),S.addChainableMethod("decreases",M),S.addProperty("extensible",function(){var e,t=N(this,"object");try{e=Object.isExtensible(t)}catch(t){if(!(t instanceof TypeError))throw t;e=!1}this.assert(e,"expected #{this} to be extensible","expected #{this} to not be extensible")}),S.addProperty("sealed",function(){var e,t=N(this,"object");try{e=Object.isSealed(t)}catch(t){if(!(t instanceof TypeError))throw t;e=!0}this.assert(e,"expected #{this} to be sealed","expected #{this} to not be sealed")}),S.addProperty("frozen",function(){var e,t=N(this,"object");try{e=Object.isFrozen(t)}catch(t){if(!(t instanceof TypeError))throw t;e=!0}this.assert(e,"expected #{this} to be frozen","expected #{this} to not be frozen")})}},{}],7:[function(e,t,n){t.exports=function(e,t){var n=e.Assertion,o=t.flag,r=e.assert=function(t,o){new n(null,null,e.assert).assert(t,o,"[ negation message unavailable ]")};r.fail=function(t,n,o,s){throw o=o||"assert.fail()",new e.AssertionError(o,{actual:t,expected:n,operator:s},r.fail)},r.isOk=function(e,t){new n(e,t).is.ok},r.isNotOk=function(e,t){new n(e,t).is.not.ok},r.equal=function(e,t,s){var i=new n(e,s,r.equal);i.assert(t==o(i,"object"),"expected #{this} to equal #{exp}","expected #{this} to not equal #{act}",t,e)},r.notEqual=function(e,t,s){var i=new n(e,s,r.notEqual);i.assert(t!=o(i,"object"),"expected #{this} to not equal #{exp}","expected #{this} to equal #{act}",t,e)},r.strictEqual=function(e,t,o){new n(e,o).to.equal(t)},r.notStrictEqual=function(e,t,o){new n(e,o).to.not.equal(t)},r.deepEqual=function(e,t,o){new n(e,o).to.eql(t)},r.notDeepEqual=function(e,t,o){new n(e,o).to.not.eql(t)},r.isAbove=function(e,t,o){new n(e,o).to.be.above(t)},r.isAtLeast=function(e,t,o){new n(e,o).to.be.least(t)},r.isBelow=function(e,t,o){new n(e,o).to.be.below(t)},r.isAtMost=function(e,t,o){new n(e,o).to.be.most(t)},r.isTrue=function(e,t){new n(e,t).is.true},r.isNotTrue=function(e,t){new n(e,t).to.not.equal(!0)},r.isFalse=function(e,t){new n(e,t).is.false},r.isNotFalse=function(e,t){new n(e,t).to.not.equal(!1)},r.isNull=function(e,t){new n(e,t).to.equal(null)},r.isNotNull=function(e,t){new n(e,t).to.not.equal(null)},r.isNaN=function(e,t){new n(e,t).to.be.NaN},r.isNotNaN=function(e,t){new n(e,t).not.to.be.NaN},r.isUndefined=function(e,t){new n(e,t).to.equal(void 0)},r.isDefined=function(e,t){new n(e,t).to.not.equal(void 0)},r.isFunction=function(e,t){new n(e,t).to.be.a("function")},r.isNotFunction=function(e,t){new n(e,t).to.not.be.a("function")},r.isObject=function(e,t){new n(e,t).to.be.a("object")},r.isNotObject=function(e,t){new n(e,t).to.not.be.a("object")},r.isArray=function(e,t){new n(e,t).to.be.an("array")},r.isNotArray=function(e,t){new n(e,t).to.not.be.an("array")},r.isString=function(e,t){new n(e,t).to.be.a("string")},r.isNotString=function(e,t){new n(e,t).to.not.be.a("string")},r.isNumber=function(e,t){new n(e,t).to.be.a("number")},r.isNotNumber=function(e,t){new n(e,t).to.not.be.a("number")},r.isBoolean=function(e,t){new n(e,t).to.be.a("boolean")},r.isNotBoolean=function(e,t){new n(e,t).to.not.be.a("boolean")},r.typeOf=function(e,t,o){new n(e,o).to.be.a(t)},r.notTypeOf=function(e,t,o){new n(e,o).to.not.be.a(t)},r.instanceOf=function(e,t,o){new n(e,o).to.be.instanceOf(t)},r.notInstanceOf=function(e,t,o){new n(e,o).to.not.be.instanceOf(t)},r.include=function(e,t,o){new n(e,o,r.include).include(t)},r.notInclude=function(e,t,o){new n(e,o,r.notInclude).not.include(t)},r.match=function(e,t,o){new n(e,o).to.match(t)},r.notMatch=function(e,t,o){new n(e,o).to.not.match(t)},r.property=function(e,t,o){new n(e,o).to.have.property(t)},r.notProperty=function(e,t,o){new n(e,o).to.not.have.property(t)},r.deepProperty=function(e,t,o){new n(e,o).to.have.deep.property(t)},r.notDeepProperty=function(e,t,o){new n(e,o).to.not.have.deep.property(t)},r.propertyVal=function(e,t,o,r){new n(e,r).to.have.property(t,o)},r.propertyNotVal=function(e,t,o,r){new n(e,r).to.not.have.property(t,o)},r.deepPropertyVal=function(e,t,o,r){new n(e,r).to.have.deep.property(t,o)},r.deepPropertyNotVal=function(e,t,o,r){new n(e,r).to.not.have.deep.property(t,o)},r.lengthOf=function(e,t,o){new n(e,o).to.have.length(t)},r.throws=function(e,t,r,s){("string"==typeof t||t instanceof RegExp)&&(r=t,t=null);var i=new n(e,s).to.throw(t,r);return o(i,"object")},r.doesNotThrow=function(e,t,o){"string"==typeof t&&(o=t,t=null),new n(e,o).to.not.Throw(t)},r.operator=function(e,r,s,i){var a;switch(r){case"==":a=e==s;break;case"===":a=e===s;break;case">":a=e>s;break;case">=":a=e>=s;break;case"<":a=e1&&n===t.length-1?"or ":"")+o+" "+e}).join(", ");if(!t.some(function(t){return s(e)===t}))throw new o("object tested must be "+n+", but "+s(e)+" given")}},{"./flag":14,"assertion-error":1,"type-detect":39}],14:[function(e,t,n){t.exports=function(e,t,n){var o=e.__flags||(e.__flags=Object.create(null));if(3!==arguments.length)return o[t];o[t]=n}},{}],15:[function(e,t,n){t.exports=function(e,t){return t.length>4?t[4]:e._obj}},{}],16:[function(e,t,n){t.exports=function(e){var t=[];for(var n in e)t.push(n);return t}},{}],17:[function(e,t,n){var o=e("./flag"),r=e("./getActual"),s=(e("./inspect"),e("./objDisplay"));t.exports=function(e,t){var n=o(e,"negate"),i=o(e,"object"),a=t[3],c=r(e,t),u=n?t[2]:t[1],l=o(e,"message");return"function"==typeof u&&(u=u()),u=u||"",u=u.replace(/#\{this\}/g,function(){return s(i)}).replace(/#\{act\}/g,function(){return s(c)}).replace(/#\{exp\}/g,function(){return s(a)}),l?l+": "+u:u}},{"./flag":14,"./getActual":15,"./inspect":24,"./objDisplay":25}],18:[function(e,t,n){t.exports=function(e){if(e.name)return e.name;var t=/^\s?function ([^(]*)\(/.exec(e);return t&&t[1]?t[1]:""}},{}],19:[function(e,t,n){function o(e){return e.replace(/([^\\])\[/g,"$1.[").match(/(\\\.|[^.]+?)+/g).map(function(e){var t=/^\[(\d+)\]$/.exec(e);return t?{i:parseFloat(t[1])}:{p:e.replace(/\\([.\[\]])/g,"$1")}})}function r(e,t,n){for(var o,r=t,s=0,i=n=void 0===n?e.length:n;s1?r(n,t,n.length-1):t,name:i.p||i.i,value:r(n,t)};return a.exists=s(a.name,a.parent),a}},{"./hasProperty":22}],20:[function(e,t,n){var o=e("./getPathInfo");t.exports=function(e,t){return o(e,t).value}},{"./getPathInfo":19}],21:[function(e,t,n){t.exports=function(e){function t(e){-1===n.indexOf(e)&&n.push(e)}for(var n=Object.getOwnPropertyNames(e),o=Object.getPrototypeOf(e);null!==o;)Object.getOwnPropertyNames(o).forEach(t),o=Object.getPrototypeOf(o);return n}},{}],22:[function(e,t,n){var o=e("type-detect"),r={number:Number,string:String};t.exports=function(e,t){var n=o(t);return"null"!==n&&"undefined"!==n&&(r[n]&&"object"!=typeof t&&(t=new r[n](t)),e in t)}},{"type-detect":39}],23:[function(e,t,n){(n=t.exports={}).test=e("./test"),n.type=e("type-detect"),n.expectTypes=e("./expectTypes"),n.getMessage=e("./getMessage"),n.getActual=e("./getActual"),n.inspect=e("./inspect"),n.objDisplay=e("./objDisplay"),n.flag=e("./flag"),n.transferFlags=e("./transferFlags"),n.eql=e("deep-eql"),n.getPathValue=e("./getPathValue"),n.getPathInfo=e("./getPathInfo"),n.hasProperty=e("./hasProperty"),n.getName=e("./getName"),n.addProperty=e("./addProperty"),n.addMethod=e("./addMethod"),n.overwriteProperty=e("./overwriteProperty"),n.overwriteMethod=e("./overwriteMethod"),n.addChainableMethod=e("./addChainableMethod"),n.overwriteChainableMethod=e("./overwriteChainableMethod")},{"./addChainableMethod":10,"./addMethod":11,"./addProperty":12,"./expectTypes":13,"./flag":14,"./getActual":15,"./getMessage":17,"./getName":18,"./getPathInfo":19,"./getPathValue":20,"./hasProperty":22,"./inspect":24,"./objDisplay":25,"./overwriteChainableMethod":26,"./overwriteMethod":27,"./overwriteProperty":28,"./test":29,"./transferFlags":30,"deep-eql":32,"type-detect":39}],24:[function(e,t,n){function o(e,t,n,o){return r({showHidden:t,seen:[],stylize:function(e){return e}},e,void 0===n?2:n)}function r(e,t,o){if(t&&"function"==typeof t.inspect&&t.inspect!==n.inspect&&(!t.constructor||t.constructor.prototype!==t)){var d=t.inspect(o);return"string"!=typeof d&&(d=r(e,d,o)),d}var v=s(e,t);if(v)return v;if(y(t)){if("outerHTML"in t)return t.outerHTML;try{if(document.xmlVersion)return(new XMLSerializer).serializeToString(t);var w=document.createElementNS("http://www.w3.org/1999/xhtml","_");return w.appendChild(t.cloneNode(!1)),html=w.innerHTML.replace("><",">"+t.innerHTML+"<"),w.innerHTML="",html}catch(e){}}var x=m(t),j=e.showHidden?b(t):x;if(0===j.length||f(t)&&(1===j.length&&"stack"===j[0]||2===j.length&&"description"===j[0]&&"stack"===j[1])){if("function"==typeof t){var E=(M=g(t))?": "+M:"";return e.stylize("[Function"+E+"]","special")}if(p(t))return e.stylize(RegExp.prototype.toString.call(t),"regexp");if(h(t))return e.stylize(Date.prototype.toUTCString.call(t),"date");if(f(t))return i(t)}var O="",A=!1,P=["{","}"];if(l(t)&&(A=!0,P=["[","]"]),"function"==typeof t){var M=g(t);O=" [Function"+(E=M?": "+M:"")+"]"}if(p(t)&&(O=" "+RegExp.prototype.toString.call(t)),h(t)&&(O=" "+Date.prototype.toUTCString.call(t)),f(t))return i(t);if(0===j.length&&(!A||0==t.length))return P[0]+O+P[1];if(o<0)return p(t)?e.stylize(RegExp.prototype.toString.call(t),"regexp"):e.stylize("[Object]","special");e.seen.push(t);var S;return S=A?a(e,t,o,x,j):j.map(function(n){return c(e,t,o,x,n,A)}),e.seen.pop(),u(S,O,P)}function s(e,t){switch(typeof t){case"undefined":return e.stylize("undefined","undefined");case"string":var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string");case"number":return 0===t&&1/t==-1/0?e.stylize("-0","number"):e.stylize(""+t,"number");case"boolean":return e.stylize(""+t,"boolean")}if(null===t)return e.stylize("null","null")}function i(e){return"["+Error.prototype.toString.call(e)+"]"}function a(e,t,n,o,r){for(var s=[],i=0,a=t.length;i-1&&(c=i?c.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+c.split("\n").map(function(e){return" "+e}).join("\n")):c=e.stylize("[Circular]","special")),void 0===a){if(i&&s.match(/^\d+$/))return c;(a=JSON.stringify(""+s)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(a=a.substr(1,a.length-2),a=e.stylize(a,"name")):(a=a.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),a=e.stylize(a,"string"))}return a+": "+c}function u(e,t,n){var o=0;return e.reduce(function(e,t){return o++,t.indexOf("\n")>=0&&o++,e+t.length+1},0)>60?n[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+n[1]:n[0]+t+" "+e.join(", ")+" "+n[1]}function l(e){return Array.isArray(e)||"object"==typeof e&&"[object Array]"===d(e)}function p(e){return"object"==typeof e&&"[object RegExp]"===d(e)}function h(e){return"object"==typeof e&&"[object Date]"===d(e)}function f(e){return"object"==typeof e&&"[object Error]"===d(e)}function d(e){return Object.prototype.toString.call(e)}var g=e("./getName"),b=e("./getProperties"),m=e("./getEnumerableProperties");t.exports=o;var y=function(e){return"object"==typeof HTMLElement?e instanceof HTMLElement:e&&"object"==typeof e&&1===e.nodeType&&"string"==typeof e.nodeName}},{"./getEnumerableProperties":16,"./getName":18,"./getProperties":21}],25:[function(e,t,n){var o=e("./inspect"),r=e("../config");t.exports=function(e){var t=o(e),n=Object.prototype.toString.call(e);if(r.truncateThreshold&&t.length>=r.truncateThreshold){if("[object Function]"===n)return e.name&&""!==e.name?"[Function: "+e.name+"]":"[Function]";if("[object Array]"===n)return"[ Array("+e.length+") ]";if("[object Object]"===n){var s=Object.keys(e);return"{ Object ("+(s.length>2?s.splice(0,2).join(", ")+", ...":s.join(", "))+") }"}return t}return t}},{"../config":5,"./inspect":24}],26:[function(e,t,n){t.exports=function(e,t,n,o){var r=e.__methods[t],s=r.chainingBehavior;r.chainingBehavior=function(){var e=o(s).call(this);return void 0===e?this:e};var i=r.method;r.method=function(){var e=n(i).apply(this,arguments);return void 0===e?this:e}}},{}],27:[function(e,t,n){t.exports=function(e,t,n){var o=e[t],r=function(){return this};o&&"function"==typeof o&&(r=o),e[t]=function(){var e=n(r).apply(this,arguments);return void 0===e?this:e}}},{}],28:[function(e,t,n){t.exports=function(e,t,n){var o=Object.getOwnPropertyDescriptor(e,t),r=function(){};o&&"function"==typeof o.get&&(r=o.get),Object.defineProperty(e,t,{get:function(){var e=n(r).call(this);return void 0===e?this:e},configurable:!0})}},{}],29:[function(e,t,n){var o=e("./flag");t.exports=function(e,t){var n=o(e,"negate"),r=t[0];return n?!r:r}},{"./flag":14}],30:[function(e,t,n){t.exports=function(e,t,n){var o=e.__flags||(e.__flags=Object.create(null));t.__flags||(t.__flags=Object.create(null)),n=3!==arguments.length||n;for(var r in o)(n||"object"!==r&&"ssfi"!==r&&"message"!=r)&&(t.__flags[r]=o[r])}},{}],31:[function(e,t,n){"use strict";function o(e){var t=void 0;t="string"==typeof e?[e]:e.raw;for(var n="",o=0;o=0;r--)if(a=s[r],!o(e[a],t[a],n))return!1;return!0}var d,g=e("type-detect");try{d=e("buffer").Buffer}catch(e){(d={}).isBuffer=function(){return!1}}t.exports=o},{buffer:void 0,"type-detect":37}],34:[function(e,t,n){const o=e("./problems/initial"),r=e("./problems/arrays");t.exports={initial:o,arrays:r}},{"./problems/arrays":35,"./problems/initial":36}],35:[function(e,t,n){t.exports=[{name:"Access Array by index (first)",time:10,prompt:"Return the first value of the Array",given:`const fruits = ['apple', 'banana'];\r`,answer:`const fruits = ['apple', 'banana'];\n return fruits[0];`,tests:[{name:"Correct output",test:"assert.deepEqual(output, 'apple') === undefined"},{name:"Returns a String",test:"assert.isString(output) === undefined"}]},{name:"Access Array by index (last)",time:10,prompt:"Return the last value of the Array",given:`const fruits = ['apple', 'banana', 'orange'];\r`,answer:`const fruits = ['apple', 'banana', 'orange'];\n return fruits[fruits.length - 1];`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 'orange') === undefined;`},{name:"Returns a String",test:`assert.isString(output) === undefined;`}]},{name:"Access Array by index (second)",time:10,prompt:"Return the second value of the Array",given:`const fruits = ['apple', 'banana'];\r`,answer:`const fruits = ['apple', 'banana'];\n return fruits[1];`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 'banana') === undefined;`},{name:"Returns a String",test:`assert.isString(output) === undefined;`}]},{name:"Array.forEach()",time:20,prompt:"Loop over the array, add an 'x' to the end of each name, push each fruit into a new array, then return the new array.",given:`const fruits = ['apple', 'banana'];\r`,answer:`const fruits = ['apple', 'banana'];\n const newFruits = [];\n fruits.forEach(function(item) {\n newFruits.push(item+'x');\n });\n return newFruits;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, ['applex', 'bananax']) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 2 items",test:`assert.lengthOf(output, 2) === undefined;`}]},{name:"Array.push()",time:10,prompt:`Add 'orange' to the end of the 'fruits' array and return 'fruits'.`,given:`const fruits = ['apple', 'banana'];\r`,answer:`const fruits = ['apple', 'banana'];\n fruits.push('orange');\n return fruits;`,tests:[{name:"Correct output",test:`(assert.deepEqual(output, ['apple', 'banana', 'orange']) === undefined);`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 3 items",test:`assert.lengthOf(output, 3) === undefined;`}]},{name:"Array.shift()",time:10,prompt:`Remove 'apple' from the front of the 'fruits' array and return 'fruits'.`,given:`const fruits = ['apple', 'banana', 'orange'];\r`,answer:`const fruits = ['apple', 'banana', 'orange'];\n fruits.shift();\n return fruits;`,tests:[{name:"Output must be correct",test:`assert.deepEqual(output, ['banana', 'orange']) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 2 items",test:`assert.lengthOf(output, 2) === undefined;`}]},{name:"Array.unshift()",time:10,prompt:`Add 'strawberry' to the front of the 'fruits' array and return 'fruits'.`,given:`const fruits = ['apple', 'banana', 'orange'];\r`,answer:`const fruits = ['apple', 'banana', 'orange'];\n fruits.unshift('strawberry');\n return fruits;`,tests:[{name:"Output must be correct",test:`(assert.deepEqual(output, [\n 'strawberry',\n 'apple',\n 'banana',\n 'orange'\n ]) === undefined)`},{name:"Must return an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 4 items",test:`assert.lengthOf(output, 4) === undefined;`}]},{name:"Array.indexOf()",time:10,prompt:`Return the index of 'banana' in the Array.`,given:`const fruits = ['strawberry', 'banana', 'mango'];\r`,answer:`const fruits = ['strawberry', 'banana', 'mango'];\n const ind = fruits.indexOf('banana');\n return ind;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 1) === undefined;`},{name:"Returns a Number",test:`assert.isNumber(output) === undefined;`}]},{name:"Array.concat()",time:10,prompt:`Merge the two arrays using Array's 'concat()' method. Return the resulting array.`,given:`const fruits = ['strawberry', 'banana'];\rconst otherFruits = ['pear','peach'];\r`,answer:`const fruits = ['strawberry', 'banana'];\n const otherFruits = ['pear','peach'];\n const allTheFruits = fruits.concat(otherFruits);\n return allTheFruits;\r`,tests:[{name:"Correct output",test:`(assert.deepEqual(output, [\n 'strawberry',\n 'banana',\n 'pear',\n 'peach'\n ]) === undefined\n );`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 4 items",test:`assert.lengthOf(output, 4) === undefined;`}]},{name:"Array.join()",time:10,prompt:`Mix the two flavors with a '-' using Array's 'join' method. Return the resulting hybrid flavor.`,given:`const fruits = ['strawberry', 'banana'];\r`,answer:`const fruits = ['strawberry', 'banana'];\n const hybrid = fruits.join('-');\n return hybrid;\r`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 'strawberry-banana') === undefined;`},{name:"Returns a String",test:`assert.isString(output) === undefined;`}]},{name:"Array.slice()",time:20,prompt:`Return just the citrus fruits from the 'fruits' array using 'Array.slice()'`,given:`const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\r`,answer:`const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const citrus = fruits.slice(1, 3);\n return citrus;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, ['orange', 'lemon']) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 2 items",test:`assert.lengthOf(output, 2) === undefined;`}]},{name:"Array.reverse()",time:10,prompt:`Reverse the order of the 'fruit' array using 'Array.reverse()'`,given:`const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\r`,answer:`const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const stiurf = fruits.reverse();\n return stiurf;`,tests:[{name:"Correct output",test:`(assert.deepEqual(output, [\n 'banana',\n 'lemon',\n 'orange',\n 'strawberry'\n ]) === undefined);`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 4 items",test:`assert.lengthOf(output, 4) === undefined;`},{name:`First item is 'banana'`,test:`assert.deepEqual(output[0], 'banana') === undefined;`}]},{name:"Array.sort()",time:10,prompt:`Return the 'fruits' Array after sorting them using 'Array.sort()'.`,given:`const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\r`,answer:`const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const orderlyFruit = fruits.sort();\n return orderlyFruit;`,tests:[{name:"Correct output",test:`(assert.deepEqual(output, [\n 'banana',\n 'lemon',\n 'orange',\n 'strawberry'\n ]) === undefined);`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 4 items",test:`assert.lengthOf(output, 4) === undefined;`},{name:`First item is 'banana'`,test:`assert.deepEqual(output[0], 'banana') === undefined;`}]},{name:"Array.lastIndexOf()",time:10,prompt:`Return the index of the last 'peach' instance in the 'fruit' array using 'Array.lastIndexOf()'`,given:`const fruits = ['peach', 'orange', 'lemon', 'peach'];\r`,answer:`const fruits = ['peach', 'orange', 'lemon', 'peach'];\n const wheresTheLastPeach = fruits.lastIndexOf('peach');\n return wheresTheLastPeach;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 3) === undefined;`},{name:"Returns a Number",test:`assert.isNumber(output) === undefined;`}]},{name:"Array.filter()",time:10,prompt:`Return an array of the numbers greater than 5 in 'numbers' using 'Array.filter()'`,given:`const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\r`,answer:`const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\n const overFive = numbers.filter(num => num > 5);\n return overFive;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, [8, 13, 21]) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 3 items",test:`assert.lengthOf(output, 3) === undefined;`},{name:`First item is 8`,test:`assert.deepEqual(output[0], 8) === undefined;`}]},{name:"Array.map()",time:10,prompt:`Return an array of 'numbers' array's square roots, using 'Array.map()' and 'Math.sqrt()'`,given:`const numbers = [25, 121, 169];\r`,answer:`const numbers = [25, 121, 169];\n const roots = numbers.map(num => Math.sqrt(num));\n return roots;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, [5, 11, 13]) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 3 items",test:`assert.lengthOf(output, 3) === undefined;`},{name:`First item is 5`,test:`assert.deepEqual(output[0], 5) === undefined;`},{name:`Last item is 13`,test:`assert.deepEqual(output[output.length - 1], 13) === undefined;`}]},{name:"Array.every()",time:10,prompt:`Return object that returns whether each array contains all even numbers using Array.every().`,given:`const evenNumbers = [2, 4, 6, 8];\n const someOddNumbers = [2, 5, 6, 8];\n function isEven(element) {\n \n }\n return {\n evenNumbers: evenNumbers.,\n someOddNumbers: someOddNumbers.\n };`,answer:`const evenNumbers = [2, 4, 6, 8];\n const someOddNumbers = [2, 5, 6, 8];\n function isEven(element) {\n return element % 2 === 0\n }\n return {\n evenNumbers: evenNumbers.every(isEven),\n someOddNumbers: someOddNumbers.every(isEven)\n };`,tests:[{name:"Correct output",test:`assert.deepEqual(output, {\n evenNumbers: true,\n someOddNumbers: false\n }) === undefined;`},{name:"Returns an Object",test:`assert.isObject(output) === undefined;`},{name:"Object has 2 items",test:`assert.lengthOf(Object.keys(output), 2) === undefined;`},{name:`First value is true`,test:`assert.isTrue(output.evenNumbers) === undefined;`},{name:`Second value is false`,test:`assert.isFalse(output.someOddNumbers) === undefined;`}]},{name:"Array.some()",time:10,prompt:`Return 'Object' that returns whether each array contains some odd numbers using 'Array.some()'.`,given:`const evenNumbers = [2, 4, 6, 8];\n const someOddNumbers = [2, 4, 7, 8];\n function isOdd(element) {\n \n }\n return {\n evenNumbers: evenNumbers.,\n someOddNumbers: someOddNumbers.\n };`,answer:`const evenNumbers = [1, 3, 5, 7];\n const someOddNumbers = [1, 3, 6, 7];\n function isOdd(element) {\n return element % 2 !== 0;\n }\n return {\n evenNumbers: evenNumbers.some(isOdd),\n someOddNumbers: someOddNumbers.some(isOdd)\n };`,tests:[{name:"Correct output",test:`assert.deepEqual(output, {\n evenNumbers: false,\n someOddNumbers: true\n }) === undefined;`},{name:"Returns an Object",test:`assert.isObject(output) === undefined;`},{name:"Object has 2 items",test:`assert.lengthOf(Object.keys(output), 2) === undefined;`},{name:`First value is false`,test:`assert.isFalse(output.evenNumbers) === undefined;`},{name:`Second value is true`,test:`assert.isTrue(output.someOddNumbers) === undefined;`}]}]},{}],36:[function(e,t,n){t.exports=[{name:"Create Array",time:10,prompt:"Create and return an array that contains 'apple' and 'banana'",given:`const fruits = [];\rreturn fruits;`,answer:`const fruits = ['apple', 'banana'];\n return fruits;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, ['apple', 'banana']) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 2 items",test:`assert.lengthOf(output, 2) === undefined;`}]},{name:"Array.pop()",time:10,prompt:`Remove 'orange' from the end of the 'fruits' array and return 'fruits'.`,given:`const fruits = ['apple', 'banana', 'orange'];\r`,answer:`const fruits = ['apple', 'banana', 'orange'];\n fruits.pop();\n return fruits;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, ['apple', 'banana']) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 2 items",test:`assert.lengthOf(output, 2) === undefined;`}]}]},{}],37:[function(e,t,n){t.exports=e("./lib/type")},{"./lib/type":38}],38:[function(e,t,n){function o(e){var t=Object.prototype.toString.call(e);return s[t]?s[t]:null===e?"null":void 0===e?"undefined":e===Object(e)?"object":typeof e}function r(){this.tests={}}var s={"[object Array]":"array","[object RegExp]":"regexp","[object Function]":"function","[object Arguments]":"arguments","[object Date]":"date"};(t.exports=o).Library=r,r.prototype.of=o,r.prototype.define=function(e,t){return 1===arguments.length?this.tests[e]:(this.tests[e]=t,this)},r.prototype.test=function(e,t){if(t===o(e))return!0;var n=this.tests[t];if(n&&"regexp"===o(n))return n.test(e);if(n&&"function"===o(n))return n(e);throw new ReferenceError('Type test "'+t+'" not defined or invalid.')}},{}],39:[function(e,t,n){arguments[4][37][0].apply(n,arguments)},{"./lib/type":40,dup:37}],40:[function(e,t,n){function o(e){var t=Object.prototype.toString.call(e).match(s)[1].toLowerCase();return"function"==typeof Promise&&e instanceof Promise?"promise":null===e?"null":void 0===e?"undefined":t}function r(){if(!(this instanceof r))return new r;this.tests={}}var s=/^\[object (.*)\]$/;(t.exports=o).Library=r,r.prototype.of=o,r.prototype.define=function(e,t){return 1===arguments.length?this.tests[e]:(this.tests[e]=t,this)},r.prototype.test=function(e,t){if(t===o(e))return!0;var n=this.tests[t];if(n&&"regexp"===o(n))return n.test(e);if(n&&"function"===o(n))return n(e);throw new ReferenceError('Type test "'+t+'" not defined or invalid.')}},{}],41:[function(require,module,exports){"use strict";function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t=e.length-1||t<0?0:t+1}function getCurrentProblem(e){return e[config.currentIndex]}function previousProblem(){console.log("previousProblem!"),previousProblemButtonEl.classList.add("active"),config.currentIndex=config.shuffle?getRandomIndex(problems):getPreviousIndex(problems),updateLocalstore(config).then(function(){window.location.reload()})}function nextProblem(){console.log("nextProblem!"),nextProblemButtonEl.classList.add("active"),config.currentIndex=config.shuffle?getRandomIndex(problems):getNextIndex(problems),updateLocalstore(config).then(function(){window.location.reload()})}function toggleShuffle(){console.log("toggle shuffle!"),config.shuffle=!config.shuffle,shuffleProblemsButtonEl.classList.toggle("active"),previousProblemButtonEl.parentNode.classList.toggle("hidden"),updateLocalstore(config)}function loadProblem(e){state.currentProblem=e,problemEl.innerText=e.prompt,e.given&&(codeEl.value=e.given),testSuite(null,!0)}function updateTests(e,t){!0===t&&buildTests(state.currentProblem.tests),updateTestStatus(e)}function buildTests(e){if(e){var t=e.map(function(e){return'
\n
[✘]
\n
'+e.name+"
\n
"}).join("");testSuiteEl.innerHTML=t}}function updateTestStatus(e){if(!e)throw new Error("No testStatuses provided.");var t=!0;e.forEach(function(e){!0!==e&&(t=!1)}),[].slice.call(testSuiteEl.querySelectorAll(".test-state")).forEach(function(t,n){!0===e[n]?(t.innerHTML="[✓]",t.classList.remove("fail"),t.classList.add("pass")):(t.innerHTML="[✘]",t.classList.remove("pass"),t.classList.add("fail"))}),!0===t?(testTotalEl.innerText="PASS",testTotalEl.classList.remove("fail"),testTotalEl.classList.add("pass")):(testTotalEl.innerText="FAIL",testTotalEl.classList.remove("pass"),testTotalEl.classList.add("fail"))}function printAssertError(e){var t="";null!==e&&(t='\n
\n Expected: '+JSON.stringify(e.expected)+"\n Actual: "+JSON.stringify(e.actual)+"\n
"),assertConsoleEl.innerHTML=t}function printEvalOutput(e,t){var n="";e&&void 0!==e.message?n='\n
\n Syntax Error: '+JSON.stringify(e.message)+"\n
":t&&(n='\n
\n Output: '+JSON.stringify(t)+"\n
"),evalConsoleEl.innerHTML=n}function testSuite(e){testTotalEl.classList.toggle("working");var t=runTests(getOutput(codeEl.value));testTotalEl.classList.toggle("working"),updateTests(t,e)}function getOutput(code){var evald=!1;try{evald=eval("(function(){"+code+"})()"),printEvalOutput(null,evald)}catch(e){printEvalOutput(e)}return evald}function runTests(output){var tested=!1;return tested=state.currentProblem.tests.map(function(test){var testOutcome=!1;try{output&&(testOutcome=eval(test.test)),printAssertError(null)}catch(e){printAssertError(e)}return testOutcome})}function loadApp(e){function t(t){!1===e.shuffle&&13===t.keyCode&&t.shiftKey&&(t.metaKey||t.ctrlKey)?previousProblem():13!==t.keyCode||t.shiftKey||!t.metaKey&&!t.ctrlKey||nextProblem()}console.log("loading app!"),!0===e.shuffle&&(shuffleProblemsButtonEl.classList.add("active"),previousProblemButtonEl.parentNode.classList.add("hidden"));var n=debounce(function(e){-1===ignoreKeyCodes.indexOf(e.keyCode)&&testSuite()},200);codeEl.addEventListener("keydown",n),document.addEventListener("keydown",t),shuffleProblemsButtonEl.addEventListener("click",toggleShuffle),previousProblemButtonEl.addEventListener("click",previousProblem),nextProblemButtonEl.addEventListener("click",nextProblem),loadProblem(getCurrentProblem(problems)),testSuite(!0)}var probs=require("pjs-problems"),dedent=require("dedent"),assert=require("chai").assert,problems=[];Object.keys(probs).forEach(function(e){var t;(t=problems).push.apply(t,_toConsumableArray(probs[e]))}),problems=dedentStrings(problems);var currentProblem=void 0,ignoreKeyCodes=[9,37,39,38,40],config={shuffle:!0,timer:!1,currentIndex:0},state={currentProblem:getCurrentProblem(problems)},problemEl=document.getElementById("problem"),codeEl=document.getElementById("code"),testSuiteEl=document.getElementById("test-suite"),testTotalEl=document.getElementById("test-total"),evalConsoleEl=document.getElementById("eval-output"),assertConsoleEl=document.getElementById("assert-output"),shuffleProblemsButtonEl=document.getElementById("shuffle-problems"),previousProblemButtonEl=document.getElementById("prev-problem"),nextProblemButtonEl=document.getElementById("next-problem");if(window.localStorage){var localConfig=localStorage.getItem("js_practice_config");if(localConfig)try{config=JSON.parse(localConfig),loadApp(config)}catch(e){console.log("LOCAL_CONFIG PARSE ERR:",e)}else console.log("LOCAL_CONFIG: No local config"),loadApp(config)}}(document,window)},{chai:2,dedent:31,"pjs-problems":34}]},{},[41]); +!function e(t,n,r){function s(o,i){if(!n[o]){if(!t[o]){var u="function"==typeof require&&require;if(!i&&u)return u(o,!0);if(a)return a(o,!0);var c=new Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[o]={exports:{}};t[o][0].call(p.exports,function(e){var n=t[o][1][e];return s(n||e)},p,p.exports,e,t,n,r)}return n[o].exports}for(var a="function"==typeof require&&require,o=0;oe,"expected #{this} to have a length above #{exp} but got #{act}","expected #{this} to not have a length above #{exp}",e,r)}else this.assert(n>e,"expected #{this} to be above "+e,"expected #{this} to be at most "+e)}function c(e,t){t&&S(this,"message",t);var n=S(this,"object");if(S(this,"doLength")){new C(n,t).to.have.property("length");var r=n.length;this.assert(r>=e,"expected #{this} to have a length at least #{exp} but got #{act}","expected #{this} to have a length below #{exp}",e,r)}else this.assert(n>=e,"expected #{this} to be at least "+e,"expected #{this} to be below "+e)}function p(e,t){t&&S(this,"message",t);var n=S(this,"object");if(S(this,"doLength")){new C(n,t).to.have.property("length");var r=n.length;this.assert(r1)throw new Error(a);break;case"object":if(arguments.length>1)throw new Error(a);e=Object.keys(e);break;default:e=Array.prototype.slice.call(arguments)}if(!e.length)throw new Error("keys required");var o=Object.keys(r),i=e,u=e.length,c=S(this,"any"),p=S(this,"all");if(c||p||(p=!0),c&&(s=i.filter(function(e){return~o.indexOf(e)}).length>0),p&&(s=e.every(function(e){return~o.indexOf(e)}),S(this,"negate")||S(this,"contains")||(s=s&&e.length==o.length)),u>1){var d=(e=e.map(function(e){return t.inspect(e)})).pop();p&&(n=e.join(", ")+", and "+d),c&&(n=e.join(", ")+", or "+d)}else n=t.inspect(e[0]);n=(u>1?"keys ":"key ")+n,n=(S(this,"contains")?"contain ":"have ")+n,this.assert(s,"expected #{this} to "+n,"expected #{this} to not "+n,i.slice(0).sort(),o.sort(),!0)}function v(e,n,r){r&&S(this,"message",r);var s=S(this,"object");new C(s,r).is.a("function");var a=!1,o=null,i=null,u=null;0===arguments.length?(n=null,e=null):e&&(e instanceof RegExp||"string"==typeof e)?(n=e,e=null):e&&e instanceof Error?(o=e,e=null,n=null):"function"==typeof e?(!(i=e.prototype.name)||"Error"===i&&e!==Error)&&(i=e.name||(new e).name):e=null;try{s()}catch(r){if(o)return this.assert(r===o,"expected #{this} to throw #{exp} but #{act} was thrown","expected #{this} to not throw #{exp}",o instanceof Error?o.toString():o,r instanceof Error?r.toString():r),S(this,"object",r),this;if(e&&(this.assert(r instanceof e,"expected #{this} to throw #{exp} but #{act} was thrown","expected #{this} to not throw #{exp} but #{act} was thrown",i,r instanceof Error?r.toString():r),!n))return S(this,"object",r),this;var c="error"===t.type(r)&&"message"in r?r.message:""+r;if(null!=c&&n&&n instanceof RegExp)return this.assert(n.exec(c),"expected #{this} to throw error matching #{exp} but got #{act}","expected #{this} to throw error not matching #{exp}",n,c),S(this,"object",r),this;if(null!=c&&n&&"string"==typeof n)return this.assert(~c.indexOf(n),"expected #{this} to throw error including #{exp} but got #{act}","expected #{this} to throw error not including #{act}",n,c),S(this,"object",r),this;a=!0,u=r}var p="",d=null!==i?i:o?"#{exp}":"an error";a&&(p=" but #{act} was thrown"),this.assert(!0===a,"expected #{this} to throw "+d+p,"expected #{this} to not throw "+d+p,o instanceof Error?o.toString():o,u instanceof Error?u.toString():u),S(this,"object",u)}function w(e,n){n&&S(this,"message",n);var r=S(this,"object"),s=S(this,"itself"),a="function"!==t.type(r)||s?r[e]:r.prototype[e];this.assert("function"==typeof a,"expected #{this} to respond to "+t.inspect(e),"expected #{this} to not respond to "+t.inspect(e))}function x(e,n){n&&S(this,"message",n);var r=e(S(this,"object"));this.assert(r,"expected #{this} to satisfy "+t.objDisplay(e),"expected #{this} to not satisfy"+t.objDisplay(e),!this.negate,r)}function A(e,n,r){r&&S(this,"message",r);var s=S(this,"object");if(new C(s,r).is.a("number"),"number"!==t.type(e)||"number"!==t.type(n))throw new Error("the arguments to closeTo or approximately must be numbers");this.assert(Math.abs(s-e)<=n,"expected #{this} to be close to "+e+" +/- "+n,"expected #{this} not to be close to "+e+" +/- "+n)}function O(e,t,n){return e.every(function(e){return n?t.some(function(t){return n(e,t)}):-1!==t.indexOf(e)})}function E(e,t){t&&S(this,"message",t);var n=S(this,"object");new C(e).to.be.an("array"),this.assert(e.indexOf(n)>-1,"expected #{this} to be one of #{exp}","expected #{this} to not be one of #{exp}",e,n)}function j(e,t,n){n&&S(this,"message",n);var r=S(this,"object");new C(e,n).to.have.property(t),new C(r).is.a("function");var s=e[t];r(),this.assert(s!==e[t],"expected ."+t+" to change","expected ."+t+" to not change")}function N(e,t,n){n&&S(this,"message",n);var r=S(this,"object");new C(e,n).to.have.property(t),new C(r).is.a("function");var s=e[t];r(),this.assert(e[t]-s>0,"expected ."+t+" to increase","expected ."+t+" to not increase")}function R(e,t,n){n&&S(this,"message",n);var r=S(this,"object");new C(e,n).to.have.property(t),new C(r).is.a("function");var s=e[t];r(),this.assert(e[t]-s<0,"expected ."+t+" to decrease","expected ."+t+" to not decrease")}var C=e.Assertion,S=(Object.prototype.toString,t.flag);["to","be","been","is","and","has","have","with","that","which","at","of","same"].forEach(function(e){C.addProperty(e,function(){return this})}),C.addProperty("not",function(){S(this,"negate",!0)}),C.addProperty("deep",function(){S(this,"deep",!0)}),C.addProperty("any",function(){S(this,"any",!0),S(this,"all",!1)}),C.addProperty("all",function(){S(this,"all",!0),S(this,"any",!1)}),C.addChainableMethod("an",n),C.addChainableMethod("a",n),C.addChainableMethod("include",s,r),C.addChainableMethod("contain",s,r),C.addChainableMethod("contains",s,r),C.addChainableMethod("includes",s,r),C.addProperty("ok",function(){this.assert(S(this,"object"),"expected #{this} to be truthy","expected #{this} to be falsy")}),C.addProperty("true",function(){this.assert(!0===S(this,"object"),"expected #{this} to be true","expected #{this} to be false",!this.negate)}),C.addProperty("false",function(){this.assert(!1===S(this,"object"),"expected #{this} to be false","expected #{this} to be true",!!this.negate)}),C.addProperty("null",function(){this.assert(null===S(this,"object"),"expected #{this} to be null","expected #{this} not to be null")}),C.addProperty("undefined",function(){this.assert(void 0===S(this,"object"),"expected #{this} to be undefined","expected #{this} not to be undefined")}),C.addProperty("NaN",function(){this.assert(isNaN(S(this,"object")),"expected #{this} to be NaN","expected #{this} not to be NaN")}),C.addProperty("exist",function(){this.assert(null!=S(this,"object"),"expected #{this} to exist","expected #{this} to not exist")}),C.addProperty("empty",function(){var e=S(this,"object"),t=e;Array.isArray(e)||"string"==typeof object?t=e.length:"object"==typeof e&&(t=Object.keys(e).length),this.assert(!t,"expected #{this} to be empty","expected #{this} not to be empty")}),C.addProperty("arguments",a),C.addProperty("Arguments",a),C.addMethod("equal",o),C.addMethod("equals",o),C.addMethod("eq",o),C.addMethod("eql",i),C.addMethod("eqls",i),C.addMethod("above",u),C.addMethod("gt",u),C.addMethod("greaterThan",u),C.addMethod("least",c),C.addMethod("gte",c),C.addMethod("below",p),C.addMethod("lt",p),C.addMethod("lessThan",p),C.addMethod("most",d),C.addMethod("lte",d),C.addMethod("within",function(e,t,n){n&&S(this,"message",n);var r=S(this,"object"),s=e+".."+t;if(S(this,"doLength")){new C(r,n).to.have.property("length");var a=r.length;this.assert(a>=e&&a<=t,"expected #{this} to have a length within "+s,"expected #{this} to not have a length within "+s)}else this.assert(r>=e&&r<=t,"expected #{this} to be within "+s,"expected #{this} to not be within "+s)}),C.addMethod("instanceof",l),C.addMethod("instanceOf",l),C.addMethod("property",function(e,n,r){r&&S(this,"message",r);var s=!!S(this,"deep"),a=s?"deep property ":"property ",o=S(this,"negate"),i=S(this,"object"),u=s?t.getPathInfo(e,i):null,c=s?u.exists:t.hasProperty(e,i),p=s?u.value:i[e];if(o&&arguments.length>1){if(void 0===p)throw r=null!=r?r+": ":"",new Error(r+t.inspect(i)+" has no "+a+t.inspect(e))}else this.assert(c,"expected #{this} to have a "+a+t.inspect(e),"expected #{this} to not have "+a+t.inspect(e));arguments.length>1&&this.assert(n===p,"expected #{this} to have a "+a+t.inspect(e)+" of #{exp}, but got #{act}","expected #{this} to not have a "+a+t.inspect(e)+" of #{act}",n,p),S(this,"object",p)}),C.addMethod("ownProperty",f),C.addMethod("haveOwnProperty",f),C.addMethod("ownPropertyDescriptor",m),C.addMethod("haveOwnPropertyDescriptor",m),C.addChainableMethod("length",y,h),C.addMethod("lengthOf",y),C.addMethod("match",g),C.addMethod("matches",g),C.addMethod("string",function(e,n){n&&S(this,"message",n);var r=S(this,"object");new C(r,n).is.a("string"),this.assert(~r.indexOf(e),"expected #{this} to contain "+t.inspect(e),"expected #{this} to not contain "+t.inspect(e))}),C.addMethod("keys",b),C.addMethod("key",b),C.addMethod("throw",v),C.addMethod("throws",v),C.addMethod("Throw",v),C.addMethod("respondTo",w),C.addMethod("respondsTo",w),C.addProperty("itself",function(){S(this,"itself",!0)}),C.addMethod("satisfy",x),C.addMethod("satisfies",x),C.addMethod("closeTo",A),C.addMethod("approximately",A),C.addMethod("members",function(e,n){n&&S(this,"message",n);var r=S(this,"object");new C(r).to.be.an("array"),new C(e).to.be.an("array");var s=S(this,"deep")?t.eql:void 0;if(S(this,"contains"))return this.assert(O(e,r,s),"expected #{this} to be a superset of #{act}","expected #{this} to not be a superset of #{act}",r,e);this.assert(O(r,e,s)&&O(e,r,s),"expected #{this} to have the same members as #{act}","expected #{this} to not have the same members as #{act}",r,e)}),C.addMethod("oneOf",E),C.addChainableMethod("change",j),C.addChainableMethod("changes",j),C.addChainableMethod("increase",N),C.addChainableMethod("increases",N),C.addChainableMethod("decrease",R),C.addChainableMethod("decreases",R),C.addProperty("extensible",function(){var e,t=S(this,"object");try{e=Object.isExtensible(t)}catch(t){if(!(t instanceof TypeError))throw t;e=!1}this.assert(e,"expected #{this} to be extensible","expected #{this} to not be extensible")}),C.addProperty("sealed",function(){var e,t=S(this,"object");try{e=Object.isSealed(t)}catch(t){if(!(t instanceof TypeError))throw t;e=!0}this.assert(e,"expected #{this} to be sealed","expected #{this} to not be sealed")}),C.addProperty("frozen",function(){var e,t=S(this,"object");try{e=Object.isFrozen(t)}catch(t){if(!(t instanceof TypeError))throw t;e=!0}this.assert(e,"expected #{this} to be frozen","expected #{this} to not be frozen")})}},{}],7:[function(e,t,n){t.exports=function(e,t){var n=e.Assertion,r=t.flag,s=e.assert=function(t,r){new n(null,null,e.assert).assert(t,r,"[ negation message unavailable ]")};s.fail=function(t,n,r,a){throw r=r||"assert.fail()",new e.AssertionError(r,{actual:t,expected:n,operator:a},s.fail)},s.isOk=function(e,t){new n(e,t).is.ok},s.isNotOk=function(e,t){new n(e,t).is.not.ok},s.equal=function(e,t,a){var o=new n(e,a,s.equal);o.assert(t==r(o,"object"),"expected #{this} to equal #{exp}","expected #{this} to not equal #{act}",t,e)},s.notEqual=function(e,t,a){var o=new n(e,a,s.notEqual);o.assert(t!=r(o,"object"),"expected #{this} to not equal #{exp}","expected #{this} to equal #{act}",t,e)},s.strictEqual=function(e,t,r){new n(e,r).to.equal(t)},s.notStrictEqual=function(e,t,r){new n(e,r).to.not.equal(t)},s.deepEqual=function(e,t,r){new n(e,r).to.eql(t)},s.notDeepEqual=function(e,t,r){new n(e,r).to.not.eql(t)},s.isAbove=function(e,t,r){new n(e,r).to.be.above(t)},s.isAtLeast=function(e,t,r){new n(e,r).to.be.least(t)},s.isBelow=function(e,t,r){new n(e,r).to.be.below(t)},s.isAtMost=function(e,t,r){new n(e,r).to.be.most(t)},s.isTrue=function(e,t){new n(e,t).is.true},s.isNotTrue=function(e,t){new n(e,t).to.not.equal(!0)},s.isFalse=function(e,t){new n(e,t).is.false},s.isNotFalse=function(e,t){new n(e,t).to.not.equal(!1)},s.isNull=function(e,t){new n(e,t).to.equal(null)},s.isNotNull=function(e,t){new n(e,t).to.not.equal(null)},s.isNaN=function(e,t){new n(e,t).to.be.NaN},s.isNotNaN=function(e,t){new n(e,t).not.to.be.NaN},s.isUndefined=function(e,t){new n(e,t).to.equal(void 0)},s.isDefined=function(e,t){new n(e,t).to.not.equal(void 0)},s.isFunction=function(e,t){new n(e,t).to.be.a("function")},s.isNotFunction=function(e,t){new n(e,t).to.not.be.a("function")},s.isObject=function(e,t){new n(e,t).to.be.a("object")},s.isNotObject=function(e,t){new n(e,t).to.not.be.a("object")},s.isArray=function(e,t){new n(e,t).to.be.an("array")},s.isNotArray=function(e,t){new n(e,t).to.not.be.an("array")},s.isString=function(e,t){new n(e,t).to.be.a("string")},s.isNotString=function(e,t){new n(e,t).to.not.be.a("string")},s.isNumber=function(e,t){new n(e,t).to.be.a("number")},s.isNotNumber=function(e,t){new n(e,t).to.not.be.a("number")},s.isBoolean=function(e,t){new n(e,t).to.be.a("boolean")},s.isNotBoolean=function(e,t){new n(e,t).to.not.be.a("boolean")},s.typeOf=function(e,t,r){new n(e,r).to.be.a(t)},s.notTypeOf=function(e,t,r){new n(e,r).to.not.be.a(t)},s.instanceOf=function(e,t,r){new n(e,r).to.be.instanceOf(t)},s.notInstanceOf=function(e,t,r){new n(e,r).to.not.be.instanceOf(t)},s.include=function(e,t,r){new n(e,r,s.include).include(t)},s.notInclude=function(e,t,r){new n(e,r,s.notInclude).not.include(t)},s.match=function(e,t,r){new n(e,r).to.match(t)},s.notMatch=function(e,t,r){new n(e,r).to.not.match(t)},s.property=function(e,t,r){new n(e,r).to.have.property(t)},s.notProperty=function(e,t,r){new n(e,r).to.not.have.property(t)},s.deepProperty=function(e,t,r){new n(e,r).to.have.deep.property(t)},s.notDeepProperty=function(e,t,r){new n(e,r).to.not.have.deep.property(t)},s.propertyVal=function(e,t,r,s){new n(e,s).to.have.property(t,r)},s.propertyNotVal=function(e,t,r,s){new n(e,s).to.not.have.property(t,r)},s.deepPropertyVal=function(e,t,r,s){new n(e,s).to.have.deep.property(t,r)},s.deepPropertyNotVal=function(e,t,r,s){new n(e,s).to.not.have.deep.property(t,r)},s.lengthOf=function(e,t,r){new n(e,r).to.have.length(t)},s.throws=function(e,t,s,a){("string"==typeof t||t instanceof RegExp)&&(s=t,t=null);var o=new n(e,a).to.throw(t,s);return r(o,"object")},s.doesNotThrow=function(e,t,r){"string"==typeof t&&(r=t,t=null),new n(e,r).to.not.Throw(t)},s.operator=function(e,s,a,o){var i;switch(s){case"==":i=e==a;break;case"===":i=e===a;break;case">":i=e>a;break;case">=":i=e>=a;break;case"<":i=e1&&n===t.length-1?"or ":"")+r+" "+e}).join(", ");if(!t.some(function(t){return a(e)===t}))throw new r("object tested must be "+n+", but "+a(e)+" given")}},{"./flag":14,"assertion-error":1,"type-detect":41}],14:[function(e,t,n){t.exports=function(e,t,n){var r=e.__flags||(e.__flags=Object.create(null));if(3!==arguments.length)return r[t];r[t]=n}},{}],15:[function(e,t,n){t.exports=function(e,t){return t.length>4?t[4]:e._obj}},{}],16:[function(e,t,n){t.exports=function(e){var t=[];for(var n in e)t.push(n);return t}},{}],17:[function(e,t,n){var r=e("./flag"),s=e("./getActual"),a=(e("./inspect"),e("./objDisplay"));t.exports=function(e,t){var n=r(e,"negate"),o=r(e,"object"),i=t[3],u=s(e,t),c=n?t[2]:t[1],p=r(e,"message");return"function"==typeof c&&(c=c()),c=c||"",c=c.replace(/#\{this\}/g,function(){return a(o)}).replace(/#\{act\}/g,function(){return a(u)}).replace(/#\{exp\}/g,function(){return a(i)}),p?p+": "+c:c}},{"./flag":14,"./getActual":15,"./inspect":24,"./objDisplay":25}],18:[function(e,t,n){t.exports=function(e){if(e.name)return e.name;var t=/^\s?function ([^(]*)\(/.exec(e);return t&&t[1]?t[1]:""}},{}],19:[function(e,t,n){function r(e){return e.replace(/([^\\])\[/g,"$1.[").match(/(\\\.|[^.]+?)+/g).map(function(e){var t=/^\[(\d+)\]$/.exec(e);return t?{i:parseFloat(t[1])}:{p:e.replace(/\\([.\[\]])/g,"$1")}})}function s(e,t,n){for(var r,s=t,a=0,o=n=void 0===n?e.length:n;a1?s(n,t,n.length-1):t,name:o.p||o.i,value:s(n,t)};return i.exists=a(i.name,i.parent),i}},{"./hasProperty":22}],20:[function(e,t,n){var r=e("./getPathInfo");t.exports=function(e,t){return r(e,t).value}},{"./getPathInfo":19}],21:[function(e,t,n){t.exports=function(e){function t(e){-1===n.indexOf(e)&&n.push(e)}for(var n=Object.getOwnPropertyNames(e),r=Object.getPrototypeOf(e);null!==r;)Object.getOwnPropertyNames(r).forEach(t),r=Object.getPrototypeOf(r);return n}},{}],22:[function(e,t,n){var r=e("type-detect"),s={number:Number,string:String};t.exports=function(e,t){var n=r(t);return"null"!==n&&"undefined"!==n&&(s[n]&&"object"!=typeof t&&(t=new s[n](t)),e in t)}},{"type-detect":41}],23:[function(e,t,n){(n=t.exports={}).test=e("./test"),n.type=e("type-detect"),n.expectTypes=e("./expectTypes"),n.getMessage=e("./getMessage"),n.getActual=e("./getActual"),n.inspect=e("./inspect"),n.objDisplay=e("./objDisplay"),n.flag=e("./flag"),n.transferFlags=e("./transferFlags"),n.eql=e("deep-eql"),n.getPathValue=e("./getPathValue"),n.getPathInfo=e("./getPathInfo"),n.hasProperty=e("./hasProperty"),n.getName=e("./getName"),n.addProperty=e("./addProperty"),n.addMethod=e("./addMethod"),n.overwriteProperty=e("./overwriteProperty"),n.overwriteMethod=e("./overwriteMethod"),n.addChainableMethod=e("./addChainableMethod"),n.overwriteChainableMethod=e("./overwriteChainableMethod")},{"./addChainableMethod":10,"./addMethod":11,"./addProperty":12,"./expectTypes":13,"./flag":14,"./getActual":15,"./getMessage":17,"./getName":18,"./getPathInfo":19,"./getPathValue":20,"./hasProperty":22,"./inspect":24,"./objDisplay":25,"./overwriteChainableMethod":26,"./overwriteMethod":27,"./overwriteProperty":28,"./test":29,"./transferFlags":30,"deep-eql":32,"type-detect":41}],24:[function(e,t,n){function r(e,t,n,r){return s({showHidden:t,seen:[],stylize:function(e){return e}},e,void 0===n?2:n)}function s(e,t,r){if(t&&"function"==typeof t.inspect&&t.inspect!==n.inspect&&(!t.constructor||t.constructor.prototype!==t)){var m=t.inspect(r);return"string"!=typeof m&&(m=s(e,m,r)),m}var v=a(e,t);if(v)return v;if(b(t)){if("outerHTML"in t)return t.outerHTML;try{if(document.xmlVersion)return(new XMLSerializer).serializeToString(t);var w=document.createElementNS("http://www.w3.org/1999/xhtml","_");return w.appendChild(t.cloneNode(!1)),html=w.innerHTML.replace("><",">"+t.innerHTML+"<"),w.innerHTML="",html}catch(e){}}var x=g(t),A=e.showHidden?y(t):x;if(0===A.length||f(t)&&(1===A.length&&"stack"===A[0]||2===A.length&&"description"===A[0]&&"stack"===A[1])){if("function"==typeof t){var O=(R=h(t))?": "+R:"";return e.stylize("[Function"+O+"]","special")}if(d(t))return e.stylize(RegExp.prototype.toString.call(t),"regexp");if(l(t))return e.stylize(Date.prototype.toUTCString.call(t),"date");if(f(t))return o(t)}var E="",j=!1,N=["{","}"];if(p(t)&&(j=!0,N=["[","]"]),"function"==typeof t){var R=h(t);E=" [Function"+(O=R?": "+R:"")+"]"}if(d(t)&&(E=" "+RegExp.prototype.toString.call(t)),l(t)&&(E=" "+Date.prototype.toUTCString.call(t)),f(t))return o(t);if(0===A.length&&(!j||0==t.length))return N[0]+E+N[1];if(r<0)return d(t)?e.stylize(RegExp.prototype.toString.call(t),"regexp"):e.stylize("[Object]","special");e.seen.push(t);var C;return C=j?i(e,t,r,x,A):A.map(function(n){return u(e,t,r,x,n,j)}),e.seen.pop(),c(C,E,N)}function a(e,t){switch(typeof t){case"undefined":return e.stylize("undefined","undefined");case"string":var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string");case"number":return 0===t&&1/t==-1/0?e.stylize("-0","number"):e.stylize(""+t,"number");case"boolean":return e.stylize(""+t,"boolean")}if(null===t)return e.stylize("null","null")}function o(e){return"["+Error.prototype.toString.call(e)+"]"}function i(e,t,n,r,s){for(var a=[],o=0,i=t.length;o-1&&(u=o?u.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+u.split("\n").map(function(e){return" "+e}).join("\n")):u=e.stylize("[Circular]","special")),void 0===i){if(o&&a.match(/^\d+$/))return u;(i=JSON.stringify(""+a)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(i=i.substr(1,i.length-2),i=e.stylize(i,"name")):(i=i.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),i=e.stylize(i,"string"))}return i+": "+u}function c(e,t,n){var r=0;return e.reduce(function(e,t){return r++,t.indexOf("\n")>=0&&r++,e+t.length+1},0)>60?n[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+n[1]:n[0]+t+" "+e.join(", ")+" "+n[1]}function p(e){return Array.isArray(e)||"object"==typeof e&&"[object Array]"===m(e)}function d(e){return"object"==typeof e&&"[object RegExp]"===m(e)}function l(e){return"object"==typeof e&&"[object Date]"===m(e)}function f(e){return"object"==typeof e&&"[object Error]"===m(e)}function m(e){return Object.prototype.toString.call(e)}var h=e("./getName"),y=e("./getProperties"),g=e("./getEnumerableProperties");t.exports=r;var b=function(e){return"object"==typeof HTMLElement?e instanceof HTMLElement:e&&"object"==typeof e&&1===e.nodeType&&"string"==typeof e.nodeName}},{"./getEnumerableProperties":16,"./getName":18,"./getProperties":21}],25:[function(e,t,n){var r=e("./inspect"),s=e("../config");t.exports=function(e){var t=r(e),n=Object.prototype.toString.call(e);if(s.truncateThreshold&&t.length>=s.truncateThreshold){if("[object Function]"===n)return e.name&&""!==e.name?"[Function: "+e.name+"]":"[Function]";if("[object Array]"===n)return"[ Array("+e.length+") ]";if("[object Object]"===n){var a=Object.keys(e);return"{ Object ("+(a.length>2?a.splice(0,2).join(", ")+", ...":a.join(", "))+") }"}return t}return t}},{"../config":5,"./inspect":24}],26:[function(e,t,n){t.exports=function(e,t,n,r){var s=e.__methods[t],a=s.chainingBehavior;s.chainingBehavior=function(){var e=r(a).call(this);return void 0===e?this:e};var o=s.method;s.method=function(){var e=n(o).apply(this,arguments);return void 0===e?this:e}}},{}],27:[function(e,t,n){t.exports=function(e,t,n){var r=e[t],s=function(){return this};r&&"function"==typeof r&&(s=r),e[t]=function(){var e=n(s).apply(this,arguments);return void 0===e?this:e}}},{}],28:[function(e,t,n){t.exports=function(e,t,n){var r=Object.getOwnPropertyDescriptor(e,t),s=function(){};r&&"function"==typeof r.get&&(s=r.get),Object.defineProperty(e,t,{get:function(){var e=n(s).call(this);return void 0===e?this:e},configurable:!0})}},{}],29:[function(e,t,n){var r=e("./flag");t.exports=function(e,t){var n=r(e,"negate"),s=t[0];return n?!s:s}},{"./flag":14}],30:[function(e,t,n){t.exports=function(e,t,n){var r=e.__flags||(e.__flags=Object.create(null));t.__flags||(t.__flags=Object.create(null)),n=3!==arguments.length||n;for(var s in r)(n||"object"!==s&&"ssfi"!==s&&"message"!=s)&&(t.__flags[s]=r[s])}},{}],31:[function(e,t,n){"use strict";function r(e){var t=void 0;t="string"==typeof e?[e]:e.raw;for(var n="",r=0;r=0;s--)if(i=a[s],!r(e[i],t[i],n))return!1;return!0}var m,h=e("type-detect");try{m=e("buffer").Buffer}catch(e){(m={}).isBuffer=function(){return!1}}t.exports=r},{buffer:void 0,"type-detect":34}],34:[function(e,t,n){t.exports=e("./lib/type")},{"./lib/type":35}],35:[function(e,t,n){function r(e){var t=Object.prototype.toString.call(e);return a[t]?a[t]:null===e?"null":void 0===e?"undefined":e===Object(e)?"object":typeof e}function s(){this.tests={}}var a={"[object Array]":"array","[object RegExp]":"regexp","[object Function]":"function","[object Arguments]":"arguments","[object Date]":"date"};(t.exports=r).Library=s,s.prototype.of=r,s.prototype.define=function(e,t){return 1===arguments.length?this.tests[e]:(this.tests[e]=t,this)},s.prototype.test=function(e,t){if(t===r(e))return!0;var n=this.tests[t];if(n&&"regexp"===r(n))return n.test(e);if(n&&"function"===r(n))return n(e);throw new ReferenceError('Type test "'+t+'" not defined or invalid.')}},{}],36:[function(e,t,n){"use strict";t.exports=[{name:"Access Array by index (first)",time:10,prompt:"Return the first value of the Array",given:"const fruits = ['apple', 'banana'];\r",answer:"const fruits = ['apple', 'banana'];\n return fruits[0];",tests:[{name:"Correct output",test:"assert.deepEqual(output, 'apple') === undefined"},{name:"Returns a String",test:"assert.isString(output) === undefined"}]},{name:"Access Array by index (first)",time:10,prompt:"Return the first value of the Array",given:"const animals = ['chipmunk', 'chimpanzee'];\n ",answer:"const animals = ['chipmunk', 'chimpanzee'];\n return animals[0];",tests:[{name:"Correct output",test:"assert.deepEqual(output, 'chipmunk') === undefined"},{name:"Returns a String",test:"assert.isString(output) === undefined"}]},{name:"Access Array by index (last)",time:10,prompt:"Return the last value of the Array",given:"const fruits = ['apple', 'banana', 'orange'];\r",answer:"const fruits = ['apple', 'banana', 'orange'];\n return fruits[fruits.length - 1];",tests:[{name:"Correct output",test:"assert.deepEqual(output, 'orange') === undefined;"},{name:"Returns a String",test:"assert.isString(output) === undefined;"}]},{name:"Access Array by index (last)",time:10,prompt:"Return the last value of the Array",given:"const animals = ['dog', 'hamster', 'lion'];\n ",answer:"const animals = ['dog', 'hamster', 'lion'];\n return animals[animals.length - 1];",tests:[{name:"Correct output",test:"assert.deepEqual(output, 'lion') === undefined;"},{name:"Returns a String",test:"assert.isString(output) === undefined;"}]},{name:"Access Array by index (second)",time:10,prompt:"Return the second value of the Array",given:"const fruits = ['apple', 'banana'];\r",answer:"const fruits = ['apple', 'banana'];\n return fruits[1];",tests:[{name:"Correct output",test:"assert.deepEqual(output, 'banana') === undefined;"},{name:"Returns a String",test:"assert.isString(output) === undefined;"}]},{name:"Access Array by index (second)",time:10,prompt:"Return the second value of the Array",given:"const animals = ['kitten', 'monkey'];\n ",answer:"const animals = ['kitten', 'monkey'];\n return animals[1];",tests:[{name:"Correct output",test:"assert.deepEqual(output, 'monkey') === undefined;"},{name:"Returns a String",test:"assert.isString(output) === undefined;"}]},{name:"Array.forEach()",time:20,prompt:"Iterate through the array, add an 'x' to the end of each fruit, return the array.",given:"const fruits = ['apple', 'banana'];\r",answer:"const fruits = ['apple', 'banana'];\n const newFruits = [];\n fruits.forEach(function(item) {\n newFruits.push(item+'x');\n });\n return newFruits;",tests:[{name:"Correct output",test:"assert.deepEqual(output, ['applex', 'bananax']) === undefined;"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 2 items",test:"assert.lengthOf(output, 2) === undefined;"}]},{name:"Array.forEach()",time:20,prompt:"Iterate through the array, add a 'ty' to the end of each animal, return the array.",given:"const animals = ['parrot', 'bat'];\n ",answer:"const animals = ['parrot', 'bat'];\n const newAnimals = [];\n animals.forEach(function(item) {\n newAnimals.push(item+'ty');\n });\n return newAnimals;",tests:[{name:"Correct output",test:"assert.deepEqual(output, ['parrotty', 'batty']) === undefined;"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 2 items",test:"assert.lengthOf(output, 2) === undefined;"}]},{name:"Array.push()",time:10,prompt:"Add 'orange' to the end of the 'fruits' array and return 'fruits'.",given:"const fruits = ['apple', 'banana'];\r",answer:"const fruits = ['apple', 'banana'];\n fruits.push('orange');\n return fruits;",tests:[{name:"Correct output",test:"(assert.deepEqual(output, ['apple', 'banana', 'orange']) === undefined);"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 3 items",test:"assert.lengthOf(output, 3) === undefined;"}]},{name:"Array.push()",time:10,prompt:"Add 'sloth' to the end of the 'animals' array and return 'animals'.",given:"const animals = ['crow', 'ox'];\r",answer:"const animals = ['crow', 'ox'];\n animals.push('sloth');\n return animals;",tests:[{name:"Correct output",test:"(assert.deepEqual(output, ['crow', 'ox', 'sloth']) === undefined);"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 3 items",test:"assert.lengthOf(output, 3) === undefined;"}]},{name:"Array.shift()",time:10,prompt:"Remove 'apple' from the front of the 'fruits' array and return 'fruits'.",given:"const fruits = ['apple', 'banana', 'orange'];\r",answer:"const fruits = ['apple', 'banana', 'orange'];\n fruits.shift();\n return fruits;",tests:[{name:"Output must be correct",test:"assert.deepEqual(output, ['banana', 'orange']) === undefined;"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 2 items",test:"assert.lengthOf(output, 2) === undefined;"}]},{name:"Array.shift()",time:10,prompt:"Remove 'lemur' from the front of the 'animals' array and return 'animals'.",given:"const animals = ['lemur', 'crocodile', 'cat'];\r",answer:"const animals = ['lemur', 'crocodile', 'cat'];\n animals.shift();\n return animals;",tests:[{name:"Output must be correct",test:"assert.deepEqual(output, ['crocodile', 'cat']) === undefined;"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 2 items",test:"assert.lengthOf(output, 2) === undefined;"}]},{name:"Array.unshift()",time:10,prompt:"Add 'strawberry' to the front of the 'fruits' array and return 'fruits'.",given:"const fruits = ['apple', 'banana', 'orange'];\r",answer:"const fruits = ['apple', 'banana', 'orange'];\n fruits.unshift('strawberry');\n return fruits;",tests:[{name:"Output must be correct",test:"(assert.deepEqual(output, [\n 'strawberry',\n 'apple',\n 'banana',\n 'orange'\n ]) === undefined)"},{name:"Must return an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 4 items",test:"assert.lengthOf(output, 4) === undefined;"}]},{name:"Array.unshift()",time:10,prompt:"Add 'octopus' to the front of the 'animals' array and return 'animals'.",given:"const animals = ['pig', 'colt', 'antelope'];\r",answer:"const animals = ['pig', 'colt', 'antelope'];\n animals.unshift('octopus');\n return animals;",tests:[{name:"Output must be correct",test:"(assert.deepEqual(output, [\n 'octopus',\n 'pig',\n 'colt',\n 'antelope'\n ]) === undefined)"},{name:"Must return an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 4 items",test:"assert.lengthOf(output, 4) === undefined;"}]},{name:"Array.indexOf()",time:10,prompt:"Return the index of 'banana' in the Array.",given:"const fruits = ['strawberry', 'banana', 'mango'];\r",answer:"const fruits = ['strawberry', 'banana', 'mango'];\n const ind = fruits.indexOf('banana');\n return ind;",tests:[{name:"Correct output",test:"assert.deepEqual(output, 1) === undefined;"},{name:"Returns a Number",test:"assert.isNumber(output) === undefined;"}]},{name:"Array.indexOf()",time:10,prompt:"Return the index of 'fox' in the Array.",given:"const animals = ['kangaroo', 'fox', 'bison'];\r",answer:"const animals = ['kangaroo', 'fox', 'bison'];\n const ind = animals.indexOf('fox');\n return ind;",tests:[{name:"Correct output",test:"assert.deepEqual(output, 1) === undefined;"},{name:"Returns a Number",test:"assert.isNumber(output) === undefined;"}]},{name:"Array.concat()",time:10,prompt:"Merge the two arrays using Array's 'concat()' method. Return the resulting array.",given:"const fruits = ['strawberry', 'banana'];\rconst otherFruits = ['pear','peach'];\r",answer:"const fruits = ['strawberry', 'banana'];\n const otherFruits = ['pear','peach'];\n const allTheFruits = fruits.concat(otherFruits);\n return allTheFruits;\r",tests:[{name:"Correct output",test:"(assert.deepEqual(output, [\n 'strawberry',\n 'banana',\n 'pear',\n 'peach'\n ]) === undefined\n );"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 4 items",test:"assert.lengthOf(output, 4) === undefined;"}]},{name:"Array.concat()",time:10,prompt:"Merge the two arrays using Array's 'concat()' method. Return the resulting array.",given:"const adjectives = ['giant', 'chunky'];\n const verbs = ['turn','whisper'];\n ",answer:"const adjectives = ['giant', 'chunky'];\n const verbs = ['turn','whisper'];\n const words = adjectives.concat(verbs);\n return words;",tests:[{name:"Correct output",test:"(assert.deepEqual(output, [\n 'giant',\n 'chunky',\n 'turn',\n 'whisper'\n ]) === undefined\n );"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 4 items",test:"assert.lengthOf(output, 4) === undefined;"}]},{name:"Array.join()",time:10,prompt:"Mix the two flavors with a '-' using Array's 'join' method. Return the resulting hybrid flavor.",given:"const fruits = ['strawberry', 'banana'];\r",answer:"const fruits = ['strawberry', 'banana'];\n const hybrid = fruits.join('-');\n return hybrid;\r",tests:[{name:"Correct output",test:"assert.deepEqual(output, 'strawberry-banana') === undefined;"},{name:"Returns a String",test:"assert.isString(output) === undefined;"}]},{name:"Array.join()",time:10,prompt:"Mix the two animals with a '-' using Array's 'join' method. Return the resulting hybrid animal.",given:"const animals = ['alligator', 'deer'];\r",answer:"const animals = ['alligator', 'deer'];\n const hybrid = animals.join('-');\n return hybrid;\r",tests:[{name:"Correct output",test:"assert.deepEqual(output, 'alligator-deer') === undefined;"},{name:"Returns a String",test:"assert.isString(output) === undefined;"}]},{name:"Array.slice()",time:20,prompt:"Return just the citrus fruits from the 'fruits' array using 'Array.slice()'",given:"const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\r",answer:"const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const citrus = fruits.slice(1, 3);\n return citrus;",tests:[{name:"Correct output",test:"assert.deepEqual(output, ['orange', 'lemon']) === undefined;"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 2 items",test:"assert.lengthOf(output, 2) === undefined;"}]},{name:"Array.slice()",time:20,prompt:"Return just the birds from the 'animals' array using 'Array.slice()'",given:"const animals = ['hyena', 'koala', 'parrot', 'canary'];\n ",answer:"const animals = ['hyena', 'koala', 'parrot', 'canary'];\n const birds = animals.slice(2, 4);\n return birds;",tests:[{name:"Correct output",test:"assert.deepEqual(output, ['parrot', 'canary']) === undefined;"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 2 items",test:"assert.lengthOf(output, 2) === undefined;"}]},{name:"Array.reverse()",time:10,prompt:"Reverse the order of the 'fruit' array using 'Array.reverse()'",given:"const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\r",answer:"const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const stiurf = fruits.reverse();\n return stiurf;",tests:[{name:"Correct output",test:"(assert.deepEqual(output, [\n 'banana',\n 'lemon',\n 'orange',\n 'strawberry'\n ]) === undefined);"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 4 items",test:"assert.lengthOf(output, 4) === undefined;"},{name:"First item is 'banana'",test:"assert.deepEqual(output[0], 'banana') === undefined;"}]},{name:"Array.reverse()",time:10,prompt:"Reverse the order of the 'animals' array using 'Array.reverse()'",given:"const animals = ['mongoose', 'warthog', 'elk', 'baboon'];\r",answer:"const animals = ['mongoose', 'warthog', 'elk', 'baboon'];\n return animals.reverse();",tests:[{name:"Correct output",test:"(assert.deepEqual(output, [\n 'baboon',\n 'elk',\n 'warthog',\n 'mongoose'\n ]) === undefined);"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 4 items",test:"assert.lengthOf(output, 4) === undefined;"},{name:"First item is 'baboon'",test:"assert.deepEqual(output[0], 'baboon') === undefined;"}]},{name:"Array.sort()",time:10,prompt:"Return the 'fruits' Array after sorting them using 'Array.sort()'.",given:"const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\r",answer:"const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const orderlyFruit = fruits.sort();\n return orderlyFruit;",tests:[{name:"Correct output",test:"(assert.deepEqual(output, [\n 'banana',\n 'lemon',\n 'orange',\n 'strawberry'\n ]) === undefined);"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 4 items",test:"assert.lengthOf(output, 4) === undefined;"},{name:"First item is 'banana'",test:"assert.deepEqual(output[0], 'banana') === undefined;"}]},{name:"Array.sort()",time:10,prompt:"Return the 'animals' Array after sorting them using 'Array.sort()'.",given:"const animals = ['pig', 'duck', 'sheep', 'cow'];\r",answer:"const animals = ['pig', 'duck', 'sheep', 'cow'];\n return animals.sort();",tests:[{name:"Correct output",test:"(assert.deepEqual(output, [\n 'cow',\n 'duck',\n 'pig',\n 'sheep'\n ]) === undefined);"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 4 items",test:"assert.lengthOf(output, 4) === undefined;"},{name:"First item is 'cow'",test:"assert.deepEqual(output[0], 'cow') === undefined;"}]},{name:"Array.lastIndexOf()",time:10,prompt:"Return the index of the last 'peach' instance in the 'fruit' array using 'Array.lastIndexOf()'",given:"const fruits = ['peach', 'orange', 'lemon', 'peach'];\r",answer:"const fruits = ['peach', 'orange', 'lemon', 'peach'];\n const wheresTheLastPeach = fruits.lastIndexOf('peach');\n return wheresTheLastPeach;",tests:[{name:"Correct output",test:"assert.deepEqual(output, 3) === undefined;"},{name:"Returns a Number",test:"assert.isNumber(output) === undefined;"}]},{name:"Array.lastIndexOf()",time:10,prompt:"Return the index of the last 'lynx' instance in the 'animals' array using 'Array.lastIndexOf()'",given:"const animals = ['lynx', 'rabbit', 'lynx', 'wombat'];\r",answer:"const animals = ['lynx', 'rabbit', 'lynx', 'wombat'];\n return animals.lastIndexOf('lynx');",tests:[{name:"Correct output",test:"assert.deepEqual(output, 2) === undefined;"},{name:"Returns a Number",test:"assert.isNumber(output) === undefined;"}]},{name:"Array.filter()",time:10,prompt:"Return an array of the numbers greater than 5 in 'numbers' using 'Array.filter()'",given:"const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\r",answer:"const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\n const overFive = numbers.filter(num => num > 5);\n return overFive;",tests:[{name:"Correct output",test:"assert.deepEqual(output, [8, 13, 21]) === undefined;"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 3 items",test:"assert.lengthOf(output, 3) === undefined;"},{name:"First item is 8",test:"assert.deepEqual(output[0], 8) === undefined;"}]},{name:"Array.filter()",time:10,prompt:"Return an array of the numbers less than 12 or greater than 20 in 'numbers' using 'Array.filter()'",given:"const numbers = [12, 10, 20, 3, 15, 8, 130, 25];\n ",answer:"const numbers = [12, 10, 20, 3, 15, 8, 130, 25];\n return numbers.filter(num => (num < 12 || num > 20));",tests:[{name:"Correct output",test:"assert.deepEqual(output, [ 10, 3, 8, 130, 25 ]) === undefined;"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 3 items",test:"assert.lengthOf(output, 5) === undefined;"},{name:"First item is 8",test:"assert.deepEqual(output[0], 10) === undefined;"}]},{name:"Array.map()",time:10,prompt:"Return an array of 'numbers' array's square roots, using 'Array.map()' and 'Math.sqrt()'",given:"const numbers = [25, 121, 169];\r",answer:"const numbers = [25, 121, 169];\n const roots = numbers.map(num => Math.sqrt(num));\n return roots;",tests:[{name:"Correct output",test:"assert.deepEqual(output, [5, 11, 13]) === undefined;"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 3 items",test:"assert.lengthOf(output, 3) === undefined;"},{name:"First item is 5",test:"assert.deepEqual(output[0], 5) === undefined;"},{name:"Last item is 13",test:"assert.deepEqual(output[output.length - 1], 13) === undefined;"}]},{name:"Array.map()",time:10,prompt:"Return an array of 'numbers' array's numbers squared using 'Array.map()'",given:"const numbers = [8, 21, 32, 11];\n ",answer:"const numbers = [8, 21, 32, 11];\n return numbers.map(num => num * num));",tests:[{name:"Correct output",test:"assert.deepEqual(output, [64, 441, 1024, 121]) === undefined;"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 4 items",test:"assert.lengthOf(output, 4) === undefined;"},{name:"First item is 64",test:"assert.deepEqual(output[0], 64) === undefined;"},{name:"Last item is 121",test:"assert.deepEqual(output[output.length - 1], 121) === undefined;"}]},{name:"Array.every()",time:10,prompt:"Return object that returns whether each array contains all even numbers using Array.every().",given:"const evenNumbers = [2, 4, 6, 8];\n const someOddNumbers = [2, 5, 6, 8];\n function isEven(num) {\n\n }\n return {\n evenNumbers: evenNumbers.,\n someOddNumbers: someOddNumbers.\n };",answer:"const evenNumbers = [2, 4, 6, 8];\n const someOddNumbers = [2, 5, 6, 8];\n function isEven(num) {\n return num % 2 === 0\n }\n return {\n evenNumbers: evenNumbers.every(isEven),\n someOddNumbers: someOddNumbers.every(isEven)\n };",tests:[{name:"Correct output",test:"assert.deepEqual(output, {\n evenNumbers: true,\n someOddNumbers: false\n }) === undefined;"},{name:"Returns an Object",test:"assert.isObject(output) === undefined;"},{name:"Object has 2 items",test:"assert.lengthOf(Object.keys(output), 2) === undefined;"},{name:"First value is true",test:"assert.isTrue(output.evenNumbers) === undefined;"},{name:"Second value is false",test:"assert.isFalse(output.someOddNumbers) === undefined;"}]},{name:"Array.some()",time:10,prompt:"Return 'Object' that returns whether each array contains some odd numbers using 'Array.some()'.",given:"const evenNumbers = [2, 4, 6, 8];\n const someOddNumbers = [2, 4, 7, 8];\n function isOdd(num) {\n\n }\n return {\n evenNumbers: evenNumbers.,\n someOddNumbers: someOddNumbers.\n };",answer:"const evenNumbers = [1, 3, 5, 7];\n const someOddNumbers = [1, 3, 6, 7];\n function isOdd(num) {\n return num % 2 !== 0;\n }\n return {\n evenNumbers: evenNumbers.some(isOdd),\n someOddNumbers: someOddNumbers.some(isOdd)\n };",tests:[{name:"Correct output",test:"assert.deepEqual(output, {\n evenNumbers: false,\n someOddNumbers: true\n }) === undefined;"},{name:"Returns an Object",test:"assert.isObject(output) === undefined;"},{name:"Object has 2 items",test:"assert.lengthOf(Object.keys(output), 2) === undefined;"},{name:"First value is false",test:"assert.isFalse(output.evenNumbers) === undefined;"},{name:"Second value is true",test:"assert.isTrue(output.someOddNumbers) === undefined;"}]},{name:"Array.reduce()",time:10,prompt:"Return the sum of the values in the 'numbers' array using 'Array.reduce()'",given:"const numbers = [34, 12, 47, 112];\n ",answer:"const numbers = [34, 12, 47, 112];\n return numbers.reduce((accumulator, currentValue) => {\n return accumulator + currentValue;\n } 0);",tests:[{name:"Correct output",test:"assert.deepEqual(output, 205) === undefined;"},{name:"Returns a Number",test:"assert.isNumber(output) === undefined;"}]},{name:"Array.reduce() and Array.concat()",time:40,prompt:"Return a flattened array using 'Array.reduce() and Array.concat()'",given:"const numbers = [[51, 2], [23, 5, 6], 78];\n ",answer:"const numbers = [[51, 2], [23, 5, 6], 78];\n const flatten = arr => arr.reduce(\n (acc, val) => acc.concat(\n Array.isArray(val) ? flatten(val) : val\n ),\n []\n );\n return flatten(numbers)",tests:[{name:"Correct output",test:"assert.deepEqual(output, [ 51, 2, 23, 5, 6, 78 ]) === undefined;"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 6 items",test:"assert.lengthOf(output, 6) === undefined;"},{name:"First item is 51",test:"assert.deepEqual(output[0], 51) === undefined;"},{name:"Last item is 78",test:"assert.deepEqual(output[output.length - 1], 78) === undefined;"}]},{name:"Array.reduce() and Math.max()",time:40,prompt:"Return the highest number in the array using Array.reduce() and Math.max()'",given:"const numbers = [4, 12, 3, 15, 7];\n ",answer:"const numbers = [4, 12, 3, 15, 7];\n return numbers.reduce((max, current) => Math.max( max, current ));",tests:[{name:"Correct output",test:"assert.deepEqual(output, 15) === undefined;"},{name:"Returns a Number",test:"assert.isNumber(output) === undefined;"}]}]},{}],37:[function(e,t,n){"use strict";t.exports=[{name:"Create Array",time:10,prompt:"Create and return an array that contains 'apple' and 'banana'",given:"const fruits = [];\rreturn fruits;",answer:"const fruits = ['apple', 'banana'];\n return fruits;",tests:[{name:"Correct output",test:"assert.deepEqual(output, ['apple', 'banana']) === undefined;"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 2 items",test:"assert.lengthOf(output, 2) === undefined;"}]},{name:"Array.pop()",time:10,prompt:"Remove 'orange' from the end of the 'fruits' array and return 'fruits'.",given:"const fruits = ['apple', 'banana', 'orange'];\r",answer:"const fruits = ['apple', 'banana', 'orange'];\n fruits.pop();\n return fruits;",tests:[{name:"Correct output",test:"assert.deepEqual(output, ['apple', 'banana']) === undefined;"},{name:"Returns an Array",test:"assert.isArray(output) === undefined;"},{name:"Array has 2 items",test:"assert.lengthOf(output, 2) === undefined;"}]}]},{}],38:[function(e,t,n){const r={initial:e("./problems/initial"),arrays:e("./problems/arrays")},s={initialES5:e("./es5/problems/initial"),arraysES5:e("./es5/problems/arrays")};t.exports={default:r,es5:s}},{"./es5/problems/arrays":36,"./es5/problems/initial":37,"./problems/arrays":39,"./problems/initial":40}],39:[function(e,t,n){t.exports=[{name:"Access Array by index (first)",time:10,prompt:"Return the first value of the Array",given:`const fruits = ['apple', 'banana'];\r`,answer:`const fruits = ['apple', 'banana'];\n return fruits[0];`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 'apple') === undefined`},{name:"Returns a String",test:"assert.isString(output) === undefined"}]},{name:"Access Array by index (first)",time:10,prompt:"Return the first value of the Array",given:`const animals = ['chipmunk', 'chimpanzee'];\n `,answer:`const animals = ['chipmunk', 'chimpanzee'];\n return animals[0];`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 'chipmunk') === undefined`},{name:"Returns a String",test:"assert.isString(output) === undefined"}]},{name:"Access Array by index (last)",time:10,prompt:"Return the last value of the Array",given:`const fruits = ['apple', 'banana', 'orange'];\r`,answer:`const fruits = ['apple', 'banana', 'orange'];\n return fruits[fruits.length - 1];`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 'orange') === undefined;`},{name:"Returns a String",test:`assert.isString(output) === undefined;`}]},{name:"Access Array by index (last)",time:10,prompt:"Return the last value of the Array",given:`const animals = ['dog', 'hamster', 'lion'];\n `,answer:`const animals = ['dog', 'hamster', 'lion'];\n return animals[animals.length - 1];`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 'lion') === undefined;`},{name:"Returns a String",test:`assert.isString(output) === undefined;`}]},{name:"Access Array by index (second)",time:10,prompt:"Return the second value of the Array",given:`const fruits = ['apple', 'banana'];\r`,answer:`const fruits = ['apple', 'banana'];\n return fruits[1];`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 'banana') === undefined;`},{name:"Returns a String",test:`assert.isString(output) === undefined;`}]},{name:"Access Array by index (second)",time:10,prompt:"Return the second value of the Array",given:`const animals = ['kitten', 'monkey'];\n `,answer:`const animals = ['kitten', 'monkey'];\n return animals[1];`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 'monkey') === undefined;`},{name:"Returns a String",test:`assert.isString(output) === undefined;`}]},{name:"Array.forEach()",time:20,prompt:"Iterate through the array, add an 'x' to the end of each fruit, return the array.",given:`const fruits = ['apple', 'banana'];\r`,answer:`const fruits = ['apple', 'banana'];\n const newFruits = [];\n fruits.forEach(function(item) {\n newFruits.push(item+'x');\n });\n return newFruits;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, ['applex', 'bananax']) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 2 items",test:`assert.lengthOf(output, 2) === undefined;`}]},{name:"Array.forEach()",time:20,prompt:`Iterate through the array, add a 'ty' to the end of each animal, return the array.`,given:`const animals = ['parrot', 'bat'];\n `,answer:`const animals = ['parrot', 'bat'];\n const newAnimals = [];\n animals.forEach(function(item) {\n newAnimals.push(item+'ty');\n });\n return newAnimals;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, ['parrotty', 'batty']) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 2 items",test:`assert.lengthOf(output, 2) === undefined;`}]},{name:"Array.push()",time:10,prompt:`Add 'orange' to the end of the 'fruits' array and return 'fruits'.`,given:`const fruits = ['apple', 'banana'];\r`,answer:`const fruits = ['apple', 'banana'];\n fruits.push('orange');\n return fruits;`,tests:[{name:"Correct output",test:`(assert.deepEqual(output, ['apple', 'banana', 'orange']) === undefined);`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 3 items",test:`assert.lengthOf(output, 3) === undefined;`}]},{name:"Array.push()",time:10,prompt:`Add 'sloth' to the end of the 'animals' array and return 'animals'.`,given:`const animals = ['crow', 'ox'];\r`,answer:`const animals = ['crow', 'ox'];\n animals.push('sloth');\n return animals;`,tests:[{name:"Correct output",test:`(assert.deepEqual(output, ['crow', 'ox', 'sloth']) === undefined);`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 3 items",test:`assert.lengthOf(output, 3) === undefined;`}]},{name:"Array.shift()",time:10,prompt:`Remove 'apple' from the front of the 'fruits' array and return 'fruits'.`,given:`const fruits = ['apple', 'banana', 'orange'];\r`,answer:`const fruits = ['apple', 'banana', 'orange'];\n fruits.shift();\n return fruits;`,tests:[{name:"Output must be correct",test:`assert.deepEqual(output, ['banana', 'orange']) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 2 items",test:`assert.lengthOf(output, 2) === undefined;`}]},{name:"Array.shift()",time:10,prompt:`Remove 'lemur' from the front of the 'animals' array and return 'animals'.`,given:`const animals = ['lemur', 'crocodile', 'cat'];\r`,answer:`const animals = ['lemur', 'crocodile', 'cat'];\n animals.shift();\n return animals;`,tests:[{name:"Output must be correct",test:`assert.deepEqual(output, ['crocodile', 'cat']) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 2 items",test:`assert.lengthOf(output, 2) === undefined;`}]},{name:"Array.unshift()",time:10,prompt:`Add 'strawberry' to the front of the 'fruits' array and return 'fruits'.`,given:`const fruits = ['apple', 'banana', 'orange'];\r`,answer:`const fruits = ['apple', 'banana', 'orange'];\n fruits.unshift('strawberry');\n return fruits;`,tests:[{name:"Output must be correct",test:`(assert.deepEqual(output, [\n 'strawberry',\n 'apple',\n 'banana',\n 'orange'\n ]) === undefined)`},{name:"Must return an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 4 items",test:`assert.lengthOf(output, 4) === undefined;`}]},{name:"Array.unshift()",time:10,prompt:`Add 'octopus' to the front of the 'animals' array and return 'animals'.`,given:`const animals = ['pig', 'colt', 'antelope'];\r`,answer:`const animals = ['pig', 'colt', 'antelope'];\n animals.unshift('octopus');\n return animals;`,tests:[{name:"Output must be correct",test:`(assert.deepEqual(output, [\n 'octopus',\n 'pig',\n 'colt',\n 'antelope'\n ]) === undefined)`},{name:"Must return an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 4 items",test:`assert.lengthOf(output, 4) === undefined;`}]},{name:"Array.indexOf()",time:10,prompt:`Return the index of 'banana' in the Array.`,given:`const fruits = ['strawberry', 'banana', 'mango'];\r`,answer:`const fruits = ['strawberry', 'banana', 'mango'];\n const ind = fruits.indexOf('banana');\n return ind;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 1) === undefined;`},{name:"Returns a Number",test:`assert.isNumber(output) === undefined;`}]},{name:"Array.indexOf()",time:10,prompt:`Return the index of 'fox' in the Array.`,given:`const animals = ['kangaroo', 'fox', 'bison'];\r`,answer:`const animals = ['kangaroo', 'fox', 'bison'];\n const ind = animals.indexOf('fox');\n return ind;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 1) === undefined;`},{name:"Returns a Number",test:`assert.isNumber(output) === undefined;`}]},{name:"Array.concat()",time:10,prompt:`Merge the two arrays using Array's 'concat()' method. Return the resulting array.`,given:`const fruits = ['strawberry', 'banana'];\rconst otherFruits = ['pear','peach'];\r`,answer:`const fruits = ['strawberry', 'banana'];\n const otherFruits = ['pear','peach'];\n const allTheFruits = fruits.concat(otherFruits);\n return allTheFruits;\r`,tests:[{name:"Correct output",test:`(assert.deepEqual(output, [\n 'strawberry',\n 'banana',\n 'pear',\n 'peach'\n ]) === undefined\n );`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 4 items",test:`assert.lengthOf(output, 4) === undefined;`}]},{name:"Array.concat()",time:10,prompt:`Merge the two arrays using Array's 'concat()' method. Return the resulting array.`,given:`const adjectives = ['giant', 'chunky'];\n const verbs = ['turn','whisper'];\n `,answer:`const adjectives = ['giant', 'chunky'];\n const verbs = ['turn','whisper'];\n const words = adjectives.concat(verbs);\n return words;`,tests:[{name:"Correct output",test:`(assert.deepEqual(output, [\n 'giant',\n 'chunky',\n 'turn',\n 'whisper'\n ]) === undefined\n );`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 4 items",test:`assert.lengthOf(output, 4) === undefined;`}]},{name:"Array.join()",time:10,prompt:`Mix the two flavors with a '-' using Array's 'join' method. Return the resulting hybrid flavor.`,given:`const fruits = ['strawberry', 'banana'];\r`,answer:`const fruits = ['strawberry', 'banana'];\n const hybrid = fruits.join('-');\n return hybrid;\r`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 'strawberry-banana') === undefined;`},{name:"Returns a String",test:`assert.isString(output) === undefined;`}]},{name:"Array.join()",time:10,prompt:`Mix the two animals with a '-' using Array's 'join' method. Return the resulting hybrid animal.`,given:`const animals = ['alligator', 'deer'];\r`,answer:`const animals = ['alligator', 'deer'];\n const hybrid = animals.join('-');\n return hybrid;\r`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 'alligator-deer') === undefined;`},{name:"Returns a String",test:`assert.isString(output) === undefined;`}]},{name:"Array.slice()",time:20,prompt:`Return just the citrus fruits from the 'fruits' array using 'Array.slice()'`,given:`const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\r`,answer:`const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const citrus = fruits.slice(1, 3);\n return citrus;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, ['orange', 'lemon']) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 2 items",test:`assert.lengthOf(output, 2) === undefined;`}]},{name:"Array.slice()",time:20,prompt:`Return just the birds from the 'animals' array using 'Array.slice()'`,given:`const animals = ['hyena', 'koala', 'parrot', 'canary'];\n `,answer:`const animals = ['hyena', 'koala', 'parrot', 'canary'];\n const birds = animals.slice(2, 4);\n return birds;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, ['parrot', 'canary']) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 2 items",test:`assert.lengthOf(output, 2) === undefined;`}]},{name:"Array.reverse()",time:10,prompt:`Reverse the order of the 'fruit' array using 'Array.reverse()'`,given:`const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\r`,answer:`const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const stiurf = fruits.reverse();\n return stiurf;`,tests:[{name:"Correct output",test:`(assert.deepEqual(output, [\n 'banana',\n 'lemon',\n 'orange',\n 'strawberry'\n ]) === undefined);`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 4 items",test:`assert.lengthOf(output, 4) === undefined;`},{name:`First item is 'banana'`,test:`assert.deepEqual(output[0], 'banana') === undefined;`}]},{name:"Array.reverse()",time:10,prompt:`Reverse the order of the 'animals' array using 'Array.reverse()'`,given:`const animals = ['mongoose', 'warthog', 'elk', 'baboon'];\r`,answer:`const animals = ['mongoose', 'warthog', 'elk', 'baboon'];\n return animals.reverse();`,tests:[{name:"Correct output",test:`(assert.deepEqual(output, [\n 'baboon',\n 'elk',\n 'warthog',\n 'mongoose'\n ]) === undefined);`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 4 items",test:`assert.lengthOf(output, 4) === undefined;`},{name:`First item is 'baboon'`,test:`assert.deepEqual(output[0], 'baboon') === undefined;`}]},{name:"Array.sort()",time:10,prompt:`Return the 'fruits' Array after sorting them using 'Array.sort()'.`,given:`const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\r`,answer:`const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const orderlyFruit = fruits.sort();\n return orderlyFruit;`,tests:[{name:"Correct output",test:`(assert.deepEqual(output, [\n 'banana',\n 'lemon',\n 'orange',\n 'strawberry'\n ]) === undefined);`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 4 items",test:`assert.lengthOf(output, 4) === undefined;`},{name:`First item is 'banana'`,test:`assert.deepEqual(output[0], 'banana') === undefined;`}]},{name:"Array.sort()",time:10,prompt:`Return the 'animals' Array after sorting them using 'Array.sort()'.`,given:`const animals = ['pig', 'duck', 'sheep', 'cow'];\r`,answer:`const animals = ['pig', 'duck', 'sheep', 'cow'];\n return animals.sort();`,tests:[{name:"Correct output",test:`(assert.deepEqual(output, [\n 'cow',\n 'duck',\n 'pig',\n 'sheep'\n ]) === undefined);`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 4 items",test:`assert.lengthOf(output, 4) === undefined;`},{name:`First item is 'cow'`,test:`assert.deepEqual(output[0], 'cow') === undefined;`}]},{name:"Array.lastIndexOf()",time:10,prompt:`Return the index of the last 'peach' instance in the 'fruit' array using 'Array.lastIndexOf()'`,given:`const fruits = ['peach', 'orange', 'lemon', 'peach'];\r`,answer:`const fruits = ['peach', 'orange', 'lemon', 'peach'];\n const wheresTheLastPeach = fruits.lastIndexOf('peach');\n return wheresTheLastPeach;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 3) === undefined;`},{name:"Returns a Number",test:`assert.isNumber(output) === undefined;`}]},{name:"Array.lastIndexOf()",time:10,prompt:`Return the index of the last 'lynx' instance in the 'animals' array using 'Array.lastIndexOf()'`,given:`const animals = ['lynx', 'rabbit', 'lynx', 'wombat'];\r`,answer:`const animals = ['lynx', 'rabbit', 'lynx', 'wombat'];\n return animals.lastIndexOf('lynx');`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 2) === undefined;`},{name:"Returns a Number",test:`assert.isNumber(output) === undefined;`}]},{name:"Array.filter()",time:10,prompt:`Return an array of the numbers greater than 5 in 'numbers' using 'Array.filter()'`,given:`const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\r`,answer:`const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\n const overFive = numbers.filter(num => num > 5);\n return overFive;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, [8, 13, 21]) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 3 items",test:`assert.lengthOf(output, 3) === undefined;`},{name:`First item is 8`,test:`assert.deepEqual(output[0], 8) === undefined;`}]},{name:"Array.filter()",time:10,prompt:`Return an array of the numbers less than 12 or greater than 20 in 'numbers' using 'Array.filter()'`,given:`const numbers = [12, 10, 20, 3, 15, 8, 130, 25];\n `,answer:`const numbers = [12, 10, 20, 3, 15, 8, 130, 25];\n return numbers.filter(num => (num < 12 || num > 20));`,tests:[{name:"Correct output",test:`assert.deepEqual(output, [ 10, 3, 8, 130, 25 ]) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 3 items",test:`assert.lengthOf(output, 5) === undefined;`},{name:`First item is 8`,test:`assert.deepEqual(output[0], 10) === undefined;`}]},{name:"Array.map()",time:10,prompt:`Return an array of 'numbers' array's square roots, using 'Array.map()' and 'Math.sqrt()'`,given:`const numbers = [25, 121, 169];\r`,answer:`const numbers = [25, 121, 169];\n const roots = numbers.map(num => Math.sqrt(num));\n return roots;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, [5, 11, 13]) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 3 items",test:`assert.lengthOf(output, 3) === undefined;`},{name:`First item is 5`,test:`assert.deepEqual(output[0], 5) === undefined;`},{name:`Last item is 13`,test:`assert.deepEqual(output[output.length - 1], 13) === undefined;`}]},{name:"Array.map()",time:10,prompt:`Return an array of 'numbers' array's numbers squared using 'Array.map()'`,given:`const numbers = [8, 21, 32, 11];\n `,answer:`const numbers = [8, 21, 32, 11];\n return numbers.map(num => num * num));`,tests:[{name:"Correct output",test:`assert.deepEqual(output, [64, 441, 1024, 121]) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 4 items",test:`assert.lengthOf(output, 4) === undefined;`},{name:`First item is 64`,test:`assert.deepEqual(output[0], 64) === undefined;`},{name:`Last item is 121`,test:`assert.deepEqual(output[output.length - 1], 121) === undefined;`}]},{name:"Array.every()",time:10,prompt:`Return object that returns whether each array contains all even numbers using Array.every().`,given:`const evenNumbers = [2, 4, 6, 8];\n const someOddNumbers = [2, 5, 6, 8];\n function isEven(num) {\n\n }\n return {\n evenNumbers: evenNumbers.,\n someOddNumbers: someOddNumbers.\n };`,answer:`const evenNumbers = [2, 4, 6, 8];\n const someOddNumbers = [2, 5, 6, 8];\n function isEven(num) {\n return num % 2 === 0\n }\n return {\n evenNumbers: evenNumbers.every(isEven),\n someOddNumbers: someOddNumbers.every(isEven)\n };`,tests:[{name:"Correct output",test:`assert.deepEqual(output, {\n evenNumbers: true,\n someOddNumbers: false\n }) === undefined;`},{name:"Returns an Object",test:`assert.isObject(output) === undefined;`},{name:"Object has 2 items",test:`assert.lengthOf(Object.keys(output), 2) === undefined;`},{name:`First value is true`,test:`assert.isTrue(output.evenNumbers) === undefined;`},{name:`Second value is false`,test:`assert.isFalse(output.someOddNumbers) === undefined;`}]},{name:"Array.some()",time:10,prompt:`Return 'Object' that returns whether each array contains some odd numbers using 'Array.some()'.`,given:`const evenNumbers = [2, 4, 6, 8];\n const someOddNumbers = [2, 4, 7, 8];\n function isOdd(num) {\n\n }\n return {\n evenNumbers: evenNumbers.,\n someOddNumbers: someOddNumbers.\n };`,answer:`const evenNumbers = [1, 3, 5, 7];\n const someOddNumbers = [1, 3, 6, 7];\n function isOdd(num) {\n return num % 2 !== 0;\n }\n return {\n evenNumbers: evenNumbers.some(isOdd),\n someOddNumbers: someOddNumbers.some(isOdd)\n };`,tests:[{name:"Correct output",test:`assert.deepEqual(output, {\n evenNumbers: false,\n someOddNumbers: true\n }) === undefined;`},{name:"Returns an Object",test:`assert.isObject(output) === undefined;`},{name:"Object has 2 items",test:`assert.lengthOf(Object.keys(output), 2) === undefined;`},{name:`First value is false`,test:`assert.isFalse(output.evenNumbers) === undefined;`},{name:`Second value is true`,test:`assert.isTrue(output.someOddNumbers) === undefined;`}]},{name:"Array.reduce()",time:10,prompt:`Return the sum of the values in the 'numbers' array using 'Array.reduce()'`,given:`const numbers = [34, 12, 47, 112];\n `,answer:`const numbers = [34, 12, 47, 112];\n return numbers.reduce((accumulator, currentValue) => {\n return accumulator + currentValue;\n } 0);`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 205) === undefined;`},{name:"Returns a Number",test:`assert.isNumber(output) === undefined;`}]},{name:"Array.reduce() and Array.concat()",time:40,prompt:`Return a flattened array using 'Array.reduce() and Array.concat()'`,given:`const numbers = [[51, 2], [23, 5, 6], 78];\n `,answer:`const numbers = [[51, 2], [23, 5, 6], 78];\n const flatten = arr => arr.reduce(\n (acc, val) => acc.concat(\n Array.isArray(val) ? flatten(val) : val\n ),\n []\n );\n return flatten(numbers)`,tests:[{name:"Correct output",test:`assert.deepEqual(output, [ 51, 2, 23, 5, 6, 78 ]) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 6 items",test:`assert.lengthOf(output, 6) === undefined;`},{name:`First item is 51`,test:`assert.deepEqual(output[0], 51) === undefined;`},{name:`Last item is 78`,test:`assert.deepEqual(output[output.length - 1], 78) === undefined;`}]},{name:"Array.reduce() and Math.max()",time:40,prompt:`Return the highest number in the array using Array.reduce() and Math.max()'`,given:`const numbers = [4, 12, 3, 15, 7];\n `,answer:`const numbers = [4, 12, 3, 15, 7];\n return numbers.reduce((max, current) => Math.max( max, current ));`,tests:[{name:"Correct output",test:`assert.deepEqual(output, 15) === undefined;`},{name:"Returns a Number",test:`assert.isNumber(output) === undefined;`}]}]},{}],40:[function(e,t,n){t.exports=[{name:"Create Array",time:10,prompt:"Create and return an array that contains 'apple' and 'banana'",given:`const fruits = [];\rreturn fruits;`,answer:`const fruits = ['apple', 'banana'];\n return fruits;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, ['apple', 'banana']) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 2 items",test:`assert.lengthOf(output, 2) === undefined;`}]},{name:"Array.pop()",time:10,prompt:`Remove 'orange' from the end of the 'fruits' array and return 'fruits'.`,given:`const fruits = ['apple', 'banana', 'orange'];\r`,answer:`const fruits = ['apple', 'banana', 'orange'];\n fruits.pop();\n return fruits;`,tests:[{name:"Correct output",test:`assert.deepEqual(output, ['apple', 'banana']) === undefined;`},{name:"Returns an Array",test:`assert.isArray(output) === undefined;`},{name:"Array has 2 items",test:`assert.lengthOf(output, 2) === undefined;`}]}]},{}],41:[function(e,t,n){arguments[4][34][0].apply(n,arguments)},{"./lib/type":42,dup:34}],42:[function(e,t,n){function r(e){var t=Object.prototype.toString.call(e).match(a)[1].toLowerCase();return"function"==typeof Promise&&e instanceof Promise?"promise":null===e?"null":void 0===e?"undefined":t}function s(){if(!(this instanceof s))return new s;this.tests={}}var a=/^\[object (.*)\]$/;(t.exports=r).Library=s,s.prototype.of=r,s.prototype.define=function(e,t){return 1===arguments.length?this.tests[e]:(this.tests[e]=t,this)},s.prototype.test=function(e,t){if(t===r(e))return!0;var n=this.tests[t];if(n&&"regexp"===r(n))return n.test(e);if(n&&"function"===r(n))return n(e);throw new ReferenceError('Type test "'+t+'" not defined or invalid.')}},{}],43:[function(require,module,exports){"use strict";function _toConsumableArray(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t=e.length-1||t<0?0:t+1}function getCurrentProblem(e){return e[config.currentIndex]}function previousProblem(){console.log("previousProblem!"),previousProblemButtonEl.classList.add("active"),config.currentIndex=config.shuffle?getRandomIndex(problems):getPreviousIndex(problems),updateLocalstore(config).then(function(){window.location.reload()})}function nextProblem(){console.log("nextProblem!"),nextProblemButtonEl.classList.add("active"),config.currentIndex=config.shuffle?getRandomIndex(problems):getNextIndex(problems),updateLocalstore(config).then(function(){window.location.reload()})}function toggleShuffle(){console.log("toggle shuffle!"),config.shuffle=!config.shuffle,shuffleProblemsButtonEl.classList.toggle("active"),previousProblemButtonEl.parentNode.classList.toggle("hidden"),updateLocalstore(config)}function loadProblem(e){state.currentProblem=e,problemEl.innerText=e.prompt,e.given&&(codeEl.value=e.given),testSuite(null,!0)}function updateTests(e,t){!0===t&&buildTests(state.currentProblem.tests),updateTestStatus(e)}function buildTests(e){if(e){var t=e.map(function(e){return'
\n
[✘]
\n
'+e.name+"
\n
"}).join("");testSuiteEl.innerHTML=t}}function updateTestStatus(e){if(!e)throw new Error("No testStatuses provided.");var t=!0;e.forEach(function(e){!0!==e&&(t=!1)}),[].slice.call(testSuiteEl.querySelectorAll(".test-state")).forEach(function(t,n){!0===e[n]?(t.innerHTML="[✓]",t.classList.remove("fail"),t.classList.add("pass")):(t.innerHTML="[✘]",t.classList.remove("pass"),t.classList.add("fail"))}),!0===t?(testTotalEl.innerText="PASS",testTotalEl.classList.remove("fail"),testTotalEl.classList.add("pass")):(testTotalEl.innerText="FAIL",testTotalEl.classList.remove("pass"),testTotalEl.classList.add("fail"))}function printAssertError(e){var t="";null!==e&&(t='\n
\n Expected: '+JSON.stringify(e.expected)+"\n Actual: "+JSON.stringify(e.actual)+"\n
"),assertConsoleEl.innerHTML=t}function printEvalOutput(e,t){var n="";e&&void 0!==e.message?n='\n
\n Syntax Error: '+JSON.stringify(e.message)+"\n
":t&&(n='\n
\n Output: '+JSON.stringify(t)+"\n
"),evalConsoleEl.innerHTML=n}function testSuite(e){testTotalEl.classList.toggle("working");var t=runTests(getOutput(codeEl.value));testTotalEl.classList.toggle("working"),updateTests(t,e)}function getOutput(code){var evald=!1;try{evald=eval("(function(){"+code+"})()"),printEvalOutput(null,evald)}catch(e){printEvalOutput(e)}return evald}function runTests(output){var tested=!1;return tested=state.currentProblem.tests.map(function(test){var testOutcome=!1;try{output&&(testOutcome=eval(test.test)),printAssertError(null)}catch(e){printAssertError(e)}return testOutcome})}function loadApp(e){function t(t){!1===e.shuffle&&13===t.keyCode&&t.shiftKey&&(t.metaKey||t.ctrlKey)?previousProblem():13!==t.keyCode||t.shiftKey||!t.metaKey&&!t.ctrlKey||nextProblem()}console.log("loading app!"),!0===e.shuffle&&(shuffleProblemsButtonEl.classList.add("active"),previousProblemButtonEl.parentNode.classList.add("hidden"));var n=debounce(function(e){-1===ignoreKeyCodes.indexOf(e.keyCode)&&testSuite()},200);codeEl.addEventListener("keydown",n),document.addEventListener("keydown",t),shuffleProblemsButtonEl.addEventListener("click",toggleShuffle),previousProblemButtonEl.addEventListener("click",previousProblem),nextProblemButtonEl.addEventListener("click",nextProblem),loadProblem(getCurrentProblem(problems)),testSuite(!0)}var probs=require("pjs-problems").es5,dedent=require("dedent"),assert=require("chai").assert,problems=[];Object.keys(probs).forEach(function(e){var t;(t=problems).push.apply(t,_toConsumableArray(probs[e]))}),problems=dedentStrings(problems);var currentProblem=void 0,ignoreKeyCodes=[9,37,39,38,40],config={shuffle:!0,timer:!1,currentIndex:0},state={currentProblem:getCurrentProblem(problems)},problemEl=document.getElementById("problem"),codeEl=document.getElementById("code"),testSuiteEl=document.getElementById("test-suite"),testTotalEl=document.getElementById("test-total"),evalConsoleEl=document.getElementById("eval-output"),assertConsoleEl=document.getElementById("assert-output"),shuffleProblemsButtonEl=document.getElementById("shuffle-problems"),previousProblemButtonEl=document.getElementById("prev-problem"),nextProblemButtonEl=document.getElementById("next-problem");if(window.localStorage){var localConfig=localStorage.getItem("js_practice_config");if(localConfig)try{config=JSON.parse(localConfig),loadApp(config)}catch(e){console.log("LOCAL_CONFIG PARSE ERR:",e)}else console.log("LOCAL_CONFIG: No local config"),loadApp(config)}}(document,window)},{chai:2,dedent:31,"pjs-problems":38}]},{},[43]); //# sourceMappingURL=bundle.min.js.map diff --git a/public/dist/js/bundle.min.js.map b/public/dist/js/bundle.min.js.map index c2e8edf..c0bdea8 100644 --- a/public/dist/js/bundle.min.js.map +++ b/public/dist/js/bundle.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["node_modules/.registry.npmjs.org/browser-pack/6.0.2/node_modules/browser-pack/_prelude.js","node_modules/.registry.npmjs.org/assertion-error/1.0.2/node_modules/assertion-error/index.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/index.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/assertion.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/config.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/core/assertions.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/interface/assert.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/interface/expect.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/interface/should.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/addChainableMethod.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/addMethod.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/addProperty.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/expectTypes.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/flag.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/getActual.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/getEnumerableProperties.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/getMessage.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/getName.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/getPathInfo.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/getPathValue.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/getProperties.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/hasProperty.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/index.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/inspect.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/objDisplay.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/overwriteChainableMethod.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/overwriteMethod.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/overwriteProperty.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/test.js","node_modules/.registry.npmjs.org/chai/3.5.0/node_modules/chai/lib/chai/utils/transferFlags.js","node_modules/.registry.npmjs.org/dedent/0.7.0/node_modules/dedent/dist/dedent.js","node_modules/.registry.npmjs.org/deep-eql/0.1.3/node_modules/deep-eql/index.js","node_modules/.registry.npmjs.org/deep-eql/0.1.3/node_modules/deep-eql/lib/eql.js","node_modules/.registry.npmjs.org/pjs-problems/1.0.3/node_modules/pjs-problems/index.js","node_modules/.registry.npmjs.org/pjs-problems/1.0.3/node_modules/pjs-problems/problems/arrays.js","node_modules/.registry.npmjs.org/pjs-problems/1.0.3/node_modules/pjs-problems/problems/initial.js","node_modules/.registry.npmjs.org/type-detect/0.1.1/node_modules/type-detect/index.js","node_modules/.registry.npmjs.org/type-detect/0.1.1/node_modules/type-detect/lib/type.js","node_modules/.registry.npmjs.org/type-detect/1.0.0/node_modules/type-detect/lib/type.js","src/js/index.js"],"names":["e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length","1","module","exclude","excludeProps","res","obj","Object","keys","forEach","key","excludes","indexOf","slice","arguments","args","AssertionError","message","_props","ssf","props","this","showDiff","callee","captureStackTrace","stack","prototype","create","name","constructor","toJSON","used","version","util","use","fn","push","config","assertion","core","expect","should","assert","_chai","Assertion","msg","flag","defineProperty","get","console","warn","includeStack","set","value","addProperty","addMethod","addChainableMethod","chainingBehavior","overwriteProperty","overwriteMethod","overwriteChainableMethod","expr","negateMsg","expected","_actual","ok","test","getMessage","actual","getActual","val","truncateThreshold","chai","_","an","type","toLowerCase","article","charAt","includeChainingBehavior","include","expectTypes","eql","k","property","subset","undefined","inspect","checkArguments","toString","assertEqual","_obj","assertEql","assertAbove","to","have","len","assertLeast","assertBelow","assertMost","assertInstanceOf","getName","assertOwnProperty","hasOwnProperty","assertOwnPropertyDescriptor","descriptor","actualDescriptor","getOwnPropertyDescriptor","assertLengthChain","assertLength","assertMatch","re","exec","assertKeys","str","mixedArgsMsg","Array","any","all","filter","every","last","map","pop","join","sort","assertThrows","errMsg","is","thrown","desiredError","thrownError","RegExp","err","actuallyGot","expectedThrown","respondTo","method","itself","context","satisfy","matcher","result","objDisplay","negate","closeTo","delta","Math","abs","isSubsetOf","superset","cmp","elem","some","elem2","oneOf","list","be","assertChanges","object","prop","initial","assertIncreases","assertDecreases","chain","isNaN","isArray","start","finish","range","isDeep","pathInfo","getPathInfo","hasProperty","exists","isExtensible","TypeError","isSealed","isFrozen","express","errmsg","fail","operator","isOk","isNotOk","not","equal","act","exp","notEqual","strictEqual","notStrictEqual","deepEqual","notDeepEqual","isAbove","abv","above","isAtLeast","atlst","least","isBelow","blw","below","isAtMost","atmst","most","isTrue","isNotTrue","isFalse","isNotFalse","isNull","isNotNull","NaN","isNotNaN","isUndefined","isDefined","isFunction","isNotFunction","isObject","isNotObject","isNotArray","isString","isNotString","isNumber","isNotNumber","isBoolean","isNotBoolean","typeOf","notTypeOf","instanceOf","notInstanceOf","inc","notInclude","match","notMatch","notProperty","deepProperty","deep","notDeepProperty","propertyVal","propertyNotVal","deepPropertyVal","deepPropertyNotVal","lengthOf","throws","errt","errs","assertErr","throw","doesNotThrow","Throw","val2","approximately","sameMembers","set1","set2","same","members","sameDeepMembers","includeMembers","includeDeepMembers","inList","changes","change","doesNotChange","increases","increase","doesNotIncrease","decreases","decrease","doesNotDecrease","ifError","extensible","isNotExtensible","sealed","isNotSealed","frozen","isNotFrozen","alias","as","loadShould","shouldGetter","String","Number","Boolean","valueOf","shouldSetter","enumerable","configurable","writable","val1","exist","Should","transferFlags","hasProtoSupport","excludeNames","Function","apply","ctx","chainableBehavior","__methods","__proto__","getOwnPropertyNames","asserterName","pd","getter","types","index","art","flags","__flags","flagMsg","replace","func","parsePath","path","mArr","parseFloat","p","_getPathValue","parsed","tmp","part","info","parent","proto","getPrototypeOf","literals","number","string","ot","getPathValue","showHidden","depth","colors","formatValue","seen","stylize","recurseTimes","ret","primitive","formatPrimitive","isDOMElement","outerHTML","document","xmlVersion","XMLSerializer","serializeToString","container","createElementNS","appendChild","cloneNode","html","innerHTML","visibleKeys","getEnumerableProperties","getProperties","isError","nameSuffix","isRegExp","isDate","Date","toUTCString","formatError","base","array","braces","output","formatArray","formatProperty","reduceToSingleString","simple","JSON","stringify","Infinity","__lookupGetter__","__lookupSetter__","split","line","substr","numLinesEst","reduce","prev","cur","ar","objectToString","d","HTMLElement","nodeType","nodeName","splice","_chainingBehavior","_method","_super","_get","includeAll","dedent","strings","raw","lines","mindent","m","indent","min","trim","b","sameValue","dateEqual","regexpEqual","Buffer","isBuffer","bufferEqual","argumentsEqual","typeEqual","objectEqual","getTime","iterableEqual","isValue","ka","kb","ex","arrays","time","prompt","given","answer","tests","getType","natives","Library","[object Array]","[object RegExp]","[object Function]","[object Arguments]","[object Date]","of","define","ReferenceError","objectTypeRegexp","Promise","window","dedentStrings","problems","prob","debounce","wait","immediate","timeout","later","callNow","clearTimeout","setTimeout","updateLocalstore","resolve","reject","localStorage","setItem","log","getRandomIndex","problemsArr","ind","floor","random","currentIndex","getPreviousIndex","getNextIndex","getCurrentProblem","previousProblem","previousProblemButtonEl","classList","add","shuffle","then","location","reload","nextProblem","nextProblemButtonEl","toggleShuffle","shuffleProblemsButtonEl","toggle","parentNode","loadProblem","problemObj","state","currentProblem","problemEl","innerText","codeEl","testSuite","updateTests","testStatus","init","buildTests","updateTestStatus","testsDom","testSuiteEl","testStatuses","allPassed","testPassed","querySelectorAll","testStatusEl","iter","remove","testTotalEl","printAssertError","errObj","inner","assertConsoleEl","printEvalOutput","evalConsoleEl","tested","runTests","getOutput","evald","eval","testOutcome","loadApp","problemNav","keyCode","shiftKey","metaKey","ctrlKey","debouncedInputValidation","ignoreKeyCodes","addEventListener","probs","subject","_problems","_toConsumableArray","timer","getElementById","localConfig","getItem","parse"],"mappings":"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","file":"bundle.min.js","sourcesContent":["(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\n * MIT Licensed\n */\n\n/*!\n * Return a function that will copy properties from\n * one object to another excluding any originally\n * listed. Returned function will create a new `{}`.\n *\n * @param {String} excluded properties ...\n * @return {Function}\n */\n\nfunction exclude () {\n var excludes = [].slice.call(arguments);\n\n function excludeProps (res, obj) {\n Object.keys(obj).forEach(function (key) {\n if (!~excludes.indexOf(key)) res[key] = obj[key];\n });\n }\n\n return function extendExclude () {\n var args = [].slice.call(arguments)\n , i = 0\n , res = {};\n\n for (; i < args.length; i++) {\n excludeProps(res, args[i]);\n }\n\n return res;\n };\n};\n\n/*!\n * Primary Exports\n */\n\nmodule.exports = AssertionError;\n\n/**\n * ### AssertionError\n *\n * An extension of the JavaScript `Error` constructor for\n * assertion and validation scenarios.\n *\n * @param {String} message\n * @param {Object} properties to include (optional)\n * @param {callee} start stack function (optional)\n */\n\nfunction AssertionError (message, _props, ssf) {\n var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON')\n , props = extend(_props || {});\n\n // default values\n this.message = message || 'Unspecified AssertionError';\n this.showDiff = false;\n\n // copy from properties\n for (var key in props) {\n this[key] = props[key];\n }\n\n // capture stack trace\n ssf = ssf || arguments.callee;\n if (ssf && Error.captureStackTrace) {\n Error.captureStackTrace(this, ssf);\n } else {\n try {\n throw new Error();\n } catch(e) {\n this.stack = e.stack;\n }\n }\n}\n\n/*!\n * Inherit from Error.prototype\n */\n\nAssertionError.prototype = Object.create(Error.prototype);\n\n/*!\n * Statically set name\n */\n\nAssertionError.prototype.name = 'AssertionError';\n\n/*!\n * Ensure correct constructor\n */\n\nAssertionError.prototype.constructor = AssertionError;\n\n/**\n * Allow errors to be converted to JSON for static transfer.\n *\n * @param {Boolean} include stack (default: `true`)\n * @return {Object} object that can be `JSON.stringify`\n */\n\nAssertionError.prototype.toJSON = function (stack) {\n var extend = exclude('constructor', 'toJSON', 'stack')\n , props = extend({ name: this.name }, this);\n\n // include stack if exists and not turned off\n if (false !== stack && this.stack) {\n props.stack = this.stack;\n }\n\n return props;\n};\n","module.exports = require('./lib/chai');\n","/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nvar used = []\n , exports = module.exports = {};\n\n/*!\n * Chai version\n */\n\nexports.version = '3.5.0';\n\n/*!\n * Assertion Error\n */\n\nexports.AssertionError = require('assertion-error');\n\n/*!\n * Utils for plugins (not exported)\n */\n\nvar util = require('./chai/utils');\n\n/**\n * # .use(function)\n *\n * Provides a way to extend the internals of Chai\n *\n * @param {Function}\n * @returns {this} for chaining\n * @api public\n */\n\nexports.use = function (fn) {\n if (!~used.indexOf(fn)) {\n fn(this, util);\n used.push(fn);\n }\n\n return this;\n};\n\n/*!\n * Utility Functions\n */\n\nexports.util = util;\n\n/*!\n * Configuration\n */\n\nvar config = require('./chai/config');\nexports.config = config;\n\n/*!\n * Primary `Assertion` prototype\n */\n\nvar assertion = require('./chai/assertion');\nexports.use(assertion);\n\n/*!\n * Core Assertions\n */\n\nvar core = require('./chai/core/assertions');\nexports.use(core);\n\n/*!\n * Expect interface\n */\n\nvar expect = require('./chai/interface/expect');\nexports.use(expect);\n\n/*!\n * Should interface\n */\n\nvar should = require('./chai/interface/should');\nexports.use(should);\n\n/*!\n * Assert interface\n */\n\nvar assert = require('./chai/interface/assert');\nexports.use(assert);\n","/*!\n * chai\n * http://chaijs.com\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nvar config = require('./config');\n\nmodule.exports = function (_chai, util) {\n /*!\n * Module dependencies.\n */\n\n var AssertionError = _chai.AssertionError\n , flag = util.flag;\n\n /*!\n * Module export.\n */\n\n _chai.Assertion = Assertion;\n\n /*!\n * Assertion Constructor\n *\n * Creates object for chaining.\n *\n * @api private\n */\n\n function Assertion (obj, msg, stack) {\n flag(this, 'ssfi', stack || arguments.callee);\n flag(this, 'object', obj);\n flag(this, 'message', msg);\n }\n\n Object.defineProperty(Assertion, 'includeStack', {\n get: function() {\n console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');\n return config.includeStack;\n },\n set: function(value) {\n console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');\n config.includeStack = value;\n }\n });\n\n Object.defineProperty(Assertion, 'showDiff', {\n get: function() {\n console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');\n return config.showDiff;\n },\n set: function(value) {\n console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');\n config.showDiff = value;\n }\n });\n\n Assertion.addProperty = function (name, fn) {\n util.addProperty(this.prototype, name, fn);\n };\n\n Assertion.addMethod = function (name, fn) {\n util.addMethod(this.prototype, name, fn);\n };\n\n Assertion.addChainableMethod = function (name, fn, chainingBehavior) {\n util.addChainableMethod(this.prototype, name, fn, chainingBehavior);\n };\n\n Assertion.overwriteProperty = function (name, fn) {\n util.overwriteProperty(this.prototype, name, fn);\n };\n\n Assertion.overwriteMethod = function (name, fn) {\n util.overwriteMethod(this.prototype, name, fn);\n };\n\n Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) {\n util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior);\n };\n\n /**\n * ### .assert(expression, message, negateMessage, expected, actual, showDiff)\n *\n * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass.\n *\n * @name assert\n * @param {Philosophical} expression to be tested\n * @param {String|Function} message or function that returns message to display if expression fails\n * @param {String|Function} negatedMessage or function that returns negatedMessage to display if negated expression fails\n * @param {Mixed} expected value (remember to check for negation)\n * @param {Mixed} actual (optional) will default to `this.obj`\n * @param {Boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails\n * @api private\n */\n\n Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) {\n var ok = util.test(this, arguments);\n if (true !== showDiff) showDiff = false;\n if (true !== config.showDiff) showDiff = false;\n\n if (!ok) {\n var msg = util.getMessage(this, arguments)\n , actual = util.getActual(this, arguments);\n throw new AssertionError(msg, {\n actual: actual\n , expected: expected\n , showDiff: showDiff\n }, (config.includeStack) ? this.assert : flag(this, 'ssfi'));\n }\n };\n\n /*!\n * ### ._obj\n *\n * Quick reference to stored `actual` value for plugin developers.\n *\n * @api private\n */\n\n Object.defineProperty(Assertion.prototype, '_obj',\n { get: function () {\n return flag(this, 'object');\n }\n , set: function (val) {\n flag(this, 'object', val);\n }\n });\n};\n","module.exports = {\n\n /**\n * ### config.includeStack\n *\n * User configurable property, influences whether stack trace\n * is included in Assertion error message. Default of false\n * suppresses stack trace in the error message.\n *\n * chai.config.includeStack = true; // enable stack on error\n *\n * @param {Boolean}\n * @api public\n */\n\n includeStack: false,\n\n /**\n * ### config.showDiff\n *\n * User configurable property, influences whether or not\n * the `showDiff` flag should be included in the thrown\n * AssertionErrors. `false` will always be `false`; `true`\n * will be true when the assertion has requested a diff\n * be shown.\n *\n * @param {Boolean}\n * @api public\n */\n\n showDiff: true,\n\n /**\n * ### config.truncateThreshold\n *\n * User configurable property, sets length threshold for actual and\n * expected values in assertion errors. If this threshold is exceeded, for\n * example for large data structures, the value is replaced with something\n * like `[ Array(3) ]` or `{ Object (prop1, prop2) }`.\n *\n * Set it to zero if you want to disable truncating altogether.\n *\n * This is especially userful when doing assertions on arrays: having this\n * set to a reasonable large value makes the failure messages readily\n * inspectable.\n *\n * chai.config.truncateThreshold = 0; // disable truncating\n *\n * @param {Number}\n * @api public\n */\n\n truncateThreshold: 40\n\n};\n","/*!\n * chai\n * http://chaijs.com\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nmodule.exports = function (chai, _) {\n var Assertion = chai.Assertion\n , toString = Object.prototype.toString\n , flag = _.flag;\n\n /**\n * ### Language Chains\n *\n * The following are provided as chainable getters to\n * improve the readability of your assertions. They\n * do not provide testing capabilities unless they\n * have been overwritten by a plugin.\n *\n * **Chains**\n *\n * - to\n * - be\n * - been\n * - is\n * - that\n * - which\n * - and\n * - has\n * - have\n * - with\n * - at\n * - of\n * - same\n *\n * @name language chains\n * @namespace BDD\n * @api public\n */\n\n [ 'to', 'be', 'been'\n , 'is', 'and', 'has', 'have'\n , 'with', 'that', 'which', 'at'\n , 'of', 'same' ].forEach(function (chain) {\n Assertion.addProperty(chain, function () {\n return this;\n });\n });\n\n /**\n * ### .not\n *\n * Negates any of assertions following in the chain.\n *\n * expect(foo).to.not.equal('bar');\n * expect(goodFn).to.not.throw(Error);\n * expect({ foo: 'baz' }).to.have.property('foo')\n * .and.not.equal('bar');\n *\n * @name not\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('not', function () {\n flag(this, 'negate', true);\n });\n\n /**\n * ### .deep\n *\n * Sets the `deep` flag, later used by the `equal` and\n * `property` assertions.\n *\n * expect(foo).to.deep.equal({ bar: 'baz' });\n * expect({ foo: { bar: { baz: 'quux' } } })\n * .to.have.deep.property('foo.bar.baz', 'quux');\n *\n * `.deep.property` special characters can be escaped\n * by adding two slashes before the `.` or `[]`.\n *\n * var deepCss = { '.link': { '[target]': 42 }};\n * expect(deepCss).to.have.deep.property('\\\\.link.\\\\[target\\\\]', 42);\n *\n * @name deep\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('deep', function () {\n flag(this, 'deep', true);\n });\n\n /**\n * ### .any\n *\n * Sets the `any` flag, (opposite of the `all` flag)\n * later used in the `keys` assertion.\n *\n * expect(foo).to.have.any.keys('bar', 'baz');\n *\n * @name any\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('any', function () {\n flag(this, 'any', true);\n flag(this, 'all', false)\n });\n\n\n /**\n * ### .all\n *\n * Sets the `all` flag (opposite of the `any` flag)\n * later used by the `keys` assertion.\n *\n * expect(foo).to.have.all.keys('bar', 'baz');\n *\n * @name all\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('all', function () {\n flag(this, 'all', true);\n flag(this, 'any', false);\n });\n\n /**\n * ### .a(type)\n *\n * The `a` and `an` assertions are aliases that can be\n * used either as language chains or to assert a value's\n * type.\n *\n * // typeof\n * expect('test').to.be.a('string');\n * expect({ foo: 'bar' }).to.be.an('object');\n * expect(null).to.be.a('null');\n * expect(undefined).to.be.an('undefined');\n * expect(new Error).to.be.an('error');\n * expect(new Promise).to.be.a('promise');\n * expect(new Float32Array()).to.be.a('float32array');\n * expect(Symbol()).to.be.a('symbol');\n *\n * // es6 overrides\n * expect({[Symbol.toStringTag]:()=>'foo'}).to.be.a('foo');\n *\n * // language chain\n * expect(foo).to.be.an.instanceof(Foo);\n *\n * @name a\n * @alias an\n * @param {String} type\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function an (type, msg) {\n if (msg) flag(this, 'message', msg);\n type = type.toLowerCase();\n var obj = flag(this, 'object')\n , article = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(type.charAt(0)) ? 'an ' : 'a ';\n\n this.assert(\n type === _.type(obj)\n , 'expected #{this} to be ' + article + type\n , 'expected #{this} not to be ' + article + type\n );\n }\n\n Assertion.addChainableMethod('an', an);\n Assertion.addChainableMethod('a', an);\n\n /**\n * ### .include(value)\n *\n * The `include` and `contain` assertions can be used as either property\n * based language chains or as methods to assert the inclusion of an object\n * in an array or a substring in a string. When used as language chains,\n * they toggle the `contains` flag for the `keys` assertion.\n *\n * expect([1,2,3]).to.include(2);\n * expect('foobar').to.contain('foo');\n * expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo');\n *\n * @name include\n * @alias contain\n * @alias includes\n * @alias contains\n * @param {Object|String|Number} obj\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function includeChainingBehavior () {\n flag(this, 'contains', true);\n }\n\n function include (val, msg) {\n _.expectTypes(this, ['array', 'object', 'string']);\n\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n var expected = false;\n\n if (_.type(obj) === 'array' && _.type(val) === 'object') {\n for (var i in obj) {\n if (_.eql(obj[i], val)) {\n expected = true;\n break;\n }\n }\n } else if (_.type(val) === 'object') {\n if (!flag(this, 'negate')) {\n for (var k in val) new Assertion(obj).property(k, val[k]);\n return;\n }\n var subset = {};\n for (var k in val) subset[k] = obj[k];\n expected = _.eql(subset, val);\n } else {\n expected = (obj != undefined) && ~obj.indexOf(val);\n }\n this.assert(\n expected\n , 'expected #{this} to include ' + _.inspect(val)\n , 'expected #{this} to not include ' + _.inspect(val));\n }\n\n Assertion.addChainableMethod('include', include, includeChainingBehavior);\n Assertion.addChainableMethod('contain', include, includeChainingBehavior);\n Assertion.addChainableMethod('contains', include, includeChainingBehavior);\n Assertion.addChainableMethod('includes', include, includeChainingBehavior);\n\n /**\n * ### .ok\n *\n * Asserts that the target is truthy.\n *\n * expect('everything').to.be.ok;\n * expect(1).to.be.ok;\n * expect(false).to.not.be.ok;\n * expect(undefined).to.not.be.ok;\n * expect(null).to.not.be.ok;\n *\n * @name ok\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('ok', function () {\n this.assert(\n flag(this, 'object')\n , 'expected #{this} to be truthy'\n , 'expected #{this} to be falsy');\n });\n\n /**\n * ### .true\n *\n * Asserts that the target is `true`.\n *\n * expect(true).to.be.true;\n * expect(1).to.not.be.true;\n *\n * @name true\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('true', function () {\n this.assert(\n true === flag(this, 'object')\n , 'expected #{this} to be true'\n , 'expected #{this} to be false'\n , this.negate ? false : true\n );\n });\n\n /**\n * ### .false\n *\n * Asserts that the target is `false`.\n *\n * expect(false).to.be.false;\n * expect(0).to.not.be.false;\n *\n * @name false\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('false', function () {\n this.assert(\n false === flag(this, 'object')\n , 'expected #{this} to be false'\n , 'expected #{this} to be true'\n , this.negate ? true : false\n );\n });\n\n /**\n * ### .null\n *\n * Asserts that the target is `null`.\n *\n * expect(null).to.be.null;\n * expect(undefined).to.not.be.null;\n *\n * @name null\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('null', function () {\n this.assert(\n null === flag(this, 'object')\n , 'expected #{this} to be null'\n , 'expected #{this} not to be null'\n );\n });\n\n /**\n * ### .undefined\n *\n * Asserts that the target is `undefined`.\n *\n * expect(undefined).to.be.undefined;\n * expect(null).to.not.be.undefined;\n *\n * @name undefined\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('undefined', function () {\n this.assert(\n undefined === flag(this, 'object')\n , 'expected #{this} to be undefined'\n , 'expected #{this} not to be undefined'\n );\n });\n\n /**\n * ### .NaN\n * Asserts that the target is `NaN`.\n *\n * expect('foo').to.be.NaN;\n * expect(4).not.to.be.NaN;\n *\n * @name NaN\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('NaN', function () {\n this.assert(\n isNaN(flag(this, 'object'))\n , 'expected #{this} to be NaN'\n , 'expected #{this} not to be NaN'\n );\n });\n\n /**\n * ### .exist\n *\n * Asserts that the target is neither `null` nor `undefined`.\n *\n * var foo = 'hi'\n * , bar = null\n * , baz;\n *\n * expect(foo).to.exist;\n * expect(bar).to.not.exist;\n * expect(baz).to.not.exist;\n *\n * @name exist\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('exist', function () {\n this.assert(\n null != flag(this, 'object')\n , 'expected #{this} to exist'\n , 'expected #{this} to not exist'\n );\n });\n\n\n /**\n * ### .empty\n *\n * Asserts that the target's length is `0`. For arrays and strings, it checks\n * the `length` property. For objects, it gets the count of\n * enumerable keys.\n *\n * expect([]).to.be.empty;\n * expect('').to.be.empty;\n * expect({}).to.be.empty;\n *\n * @name empty\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('empty', function () {\n var obj = flag(this, 'object')\n , expected = obj;\n\n if (Array.isArray(obj) || 'string' === typeof object) {\n expected = obj.length;\n } else if (typeof obj === 'object') {\n expected = Object.keys(obj).length;\n }\n\n this.assert(\n !expected\n , 'expected #{this} to be empty'\n , 'expected #{this} not to be empty'\n );\n });\n\n /**\n * ### .arguments\n *\n * Asserts that the target is an arguments object.\n *\n * function test () {\n * expect(arguments).to.be.arguments;\n * }\n *\n * @name arguments\n * @alias Arguments\n * @namespace BDD\n * @api public\n */\n\n function checkArguments () {\n var obj = flag(this, 'object')\n , type = Object.prototype.toString.call(obj);\n this.assert(\n '[object Arguments]' === type\n , 'expected #{this} to be arguments but got ' + type\n , 'expected #{this} to not be arguments'\n );\n }\n\n Assertion.addProperty('arguments', checkArguments);\n Assertion.addProperty('Arguments', checkArguments);\n\n /**\n * ### .equal(value)\n *\n * Asserts that the target is strictly equal (`===`) to `value`.\n * Alternately, if the `deep` flag is set, asserts that\n * the target is deeply equal to `value`.\n *\n * expect('hello').to.equal('hello');\n * expect(42).to.equal(42);\n * expect(1).to.not.equal(true);\n * expect({ foo: 'bar' }).to.not.equal({ foo: 'bar' });\n * expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' });\n *\n * @name equal\n * @alias equals\n * @alias eq\n * @alias deep.equal\n * @param {Mixed} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertEqual (val, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'deep')) {\n return this.eql(val);\n } else {\n this.assert(\n val === obj\n , 'expected #{this} to equal #{exp}'\n , 'expected #{this} to not equal #{exp}'\n , val\n , this._obj\n , true\n );\n }\n }\n\n Assertion.addMethod('equal', assertEqual);\n Assertion.addMethod('equals', assertEqual);\n Assertion.addMethod('eq', assertEqual);\n\n /**\n * ### .eql(value)\n *\n * Asserts that the target is deeply equal to `value`.\n *\n * expect({ foo: 'bar' }).to.eql({ foo: 'bar' });\n * expect([ 1, 2, 3 ]).to.eql([ 1, 2, 3 ]);\n *\n * @name eql\n * @alias eqls\n * @param {Mixed} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertEql(obj, msg) {\n if (msg) flag(this, 'message', msg);\n this.assert(\n _.eql(obj, flag(this, 'object'))\n , 'expected #{this} to deeply equal #{exp}'\n , 'expected #{this} to not deeply equal #{exp}'\n , obj\n , this._obj\n , true\n );\n }\n\n Assertion.addMethod('eql', assertEql);\n Assertion.addMethod('eqls', assertEql);\n\n /**\n * ### .above(value)\n *\n * Asserts that the target is greater than `value`.\n *\n * expect(10).to.be.above(5);\n *\n * Can also be used in conjunction with `length` to\n * assert a minimum length. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.above(2);\n * expect([ 1, 2, 3 ]).to.have.length.above(2);\n *\n * @name above\n * @alias gt\n * @alias greaterThan\n * @param {Number} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertAbove (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len > n\n , 'expected #{this} to have a length above #{exp} but got #{act}'\n , 'expected #{this} to not have a length above #{exp}'\n , n\n , len\n );\n } else {\n this.assert(\n obj > n\n , 'expected #{this} to be above ' + n\n , 'expected #{this} to be at most ' + n\n );\n }\n }\n\n Assertion.addMethod('above', assertAbove);\n Assertion.addMethod('gt', assertAbove);\n Assertion.addMethod('greaterThan', assertAbove);\n\n /**\n * ### .least(value)\n *\n * Asserts that the target is greater than or equal to `value`.\n *\n * expect(10).to.be.at.least(10);\n *\n * Can also be used in conjunction with `length` to\n * assert a minimum length. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.of.at.least(2);\n * expect([ 1, 2, 3 ]).to.have.length.of.at.least(3);\n *\n * @name least\n * @alias gte\n * @param {Number} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertLeast (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len >= n\n , 'expected #{this} to have a length at least #{exp} but got #{act}'\n , 'expected #{this} to have a length below #{exp}'\n , n\n , len\n );\n } else {\n this.assert(\n obj >= n\n , 'expected #{this} to be at least ' + n\n , 'expected #{this} to be below ' + n\n );\n }\n }\n\n Assertion.addMethod('least', assertLeast);\n Assertion.addMethod('gte', assertLeast);\n\n /**\n * ### .below(value)\n *\n * Asserts that the target is less than `value`.\n *\n * expect(5).to.be.below(10);\n *\n * Can also be used in conjunction with `length` to\n * assert a maximum length. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.below(4);\n * expect([ 1, 2, 3 ]).to.have.length.below(4);\n *\n * @name below\n * @alias lt\n * @alias lessThan\n * @param {Number} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertBelow (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len < n\n , 'expected #{this} to have a length below #{exp} but got #{act}'\n , 'expected #{this} to not have a length below #{exp}'\n , n\n , len\n );\n } else {\n this.assert(\n obj < n\n , 'expected #{this} to be below ' + n\n , 'expected #{this} to be at least ' + n\n );\n }\n }\n\n Assertion.addMethod('below', assertBelow);\n Assertion.addMethod('lt', assertBelow);\n Assertion.addMethod('lessThan', assertBelow);\n\n /**\n * ### .most(value)\n *\n * Asserts that the target is less than or equal to `value`.\n *\n * expect(5).to.be.at.most(5);\n *\n * Can also be used in conjunction with `length` to\n * assert a maximum length. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.of.at.most(4);\n * expect([ 1, 2, 3 ]).to.have.length.of.at.most(3);\n *\n * @name most\n * @alias lte\n * @param {Number} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertMost (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len <= n\n , 'expected #{this} to have a length at most #{exp} but got #{act}'\n , 'expected #{this} to have a length above #{exp}'\n , n\n , len\n );\n } else {\n this.assert(\n obj <= n\n , 'expected #{this} to be at most ' + n\n , 'expected #{this} to be above ' + n\n );\n }\n }\n\n Assertion.addMethod('most', assertMost);\n Assertion.addMethod('lte', assertMost);\n\n /**\n * ### .within(start, finish)\n *\n * Asserts that the target is within a range.\n *\n * expect(7).to.be.within(5,10);\n *\n * Can also be used in conjunction with `length` to\n * assert a length range. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.within(2,4);\n * expect([ 1, 2, 3 ]).to.have.length.within(2,4);\n *\n * @name within\n * @param {Number} start lowerbound inclusive\n * @param {Number} finish upperbound inclusive\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('within', function (start, finish, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , range = start + '..' + finish;\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len >= start && len <= finish\n , 'expected #{this} to have a length within ' + range\n , 'expected #{this} to not have a length within ' + range\n );\n } else {\n this.assert(\n obj >= start && obj <= finish\n , 'expected #{this} to be within ' + range\n , 'expected #{this} to not be within ' + range\n );\n }\n });\n\n /**\n * ### .instanceof(constructor)\n *\n * Asserts that the target is an instance of `constructor`.\n *\n * var Tea = function (name) { this.name = name; }\n * , Chai = new Tea('chai');\n *\n * expect(Chai).to.be.an.instanceof(Tea);\n * expect([ 1, 2, 3 ]).to.be.instanceof(Array);\n *\n * @name instanceof\n * @param {Constructor} constructor\n * @param {String} message _optional_\n * @alias instanceOf\n * @namespace BDD\n * @api public\n */\n\n function assertInstanceOf (constructor, msg) {\n if (msg) flag(this, 'message', msg);\n var name = _.getName(constructor);\n this.assert(\n flag(this, 'object') instanceof constructor\n , 'expected #{this} to be an instance of ' + name\n , 'expected #{this} to not be an instance of ' + name\n );\n };\n\n Assertion.addMethod('instanceof', assertInstanceOf);\n Assertion.addMethod('instanceOf', assertInstanceOf);\n\n /**\n * ### .property(name, [value])\n *\n * Asserts that the target has a property `name`, optionally asserting that\n * the value of that property is strictly equal to `value`.\n * If the `deep` flag is set, you can use dot- and bracket-notation for deep\n * references into objects and arrays.\n *\n * // simple referencing\n * var obj = { foo: 'bar' };\n * expect(obj).to.have.property('foo');\n * expect(obj).to.have.property('foo', 'bar');\n *\n * // deep referencing\n * var deepObj = {\n * green: { tea: 'matcha' }\n * , teas: [ 'chai', 'matcha', { tea: 'konacha' } ]\n * };\n *\n * expect(deepObj).to.have.deep.property('green.tea', 'matcha');\n * expect(deepObj).to.have.deep.property('teas[1]', 'matcha');\n * expect(deepObj).to.have.deep.property('teas[2].tea', 'konacha');\n *\n * You can also use an array as the starting point of a `deep.property`\n * assertion, or traverse nested arrays.\n *\n * var arr = [\n * [ 'chai', 'matcha', 'konacha' ]\n * , [ { tea: 'chai' }\n * , { tea: 'matcha' }\n * , { tea: 'konacha' } ]\n * ];\n *\n * expect(arr).to.have.deep.property('[0][1]', 'matcha');\n * expect(arr).to.have.deep.property('[1][2].tea', 'konacha');\n *\n * Furthermore, `property` changes the subject of the assertion\n * to be the value of that property from the original object. This\n * permits for further chainable assertions on that property.\n *\n * expect(obj).to.have.property('foo')\n * .that.is.a('string');\n * expect(deepObj).to.have.property('green')\n * .that.is.an('object')\n * .that.deep.equals({ tea: 'matcha' });\n * expect(deepObj).to.have.property('teas')\n * .that.is.an('array')\n * .with.deep.property('[2]')\n * .that.deep.equals({ tea: 'konacha' });\n *\n * Note that dots and bracket in `name` must be backslash-escaped when\n * the `deep` flag is set, while they must NOT be escaped when the `deep`\n * flag is not set.\n *\n * // simple referencing\n * var css = { '.link[target]': 42 };\n * expect(css).to.have.property('.link[target]', 42);\n *\n * // deep referencing\n * var deepCss = { '.link': { '[target]': 42 }};\n * expect(deepCss).to.have.deep.property('\\\\.link.\\\\[target\\\\]', 42);\n *\n * @name property\n * @alias deep.property\n * @param {String} name\n * @param {Mixed} value (optional)\n * @param {String} message _optional_\n * @returns value of property for chaining\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('property', function (name, val, msg) {\n if (msg) flag(this, 'message', msg);\n\n var isDeep = !!flag(this, 'deep')\n , descriptor = isDeep ? 'deep property ' : 'property '\n , negate = flag(this, 'negate')\n , obj = flag(this, 'object')\n , pathInfo = isDeep ? _.getPathInfo(name, obj) : null\n , hasProperty = isDeep\n ? pathInfo.exists\n : _.hasProperty(name, obj)\n , value = isDeep\n ? pathInfo.value\n : obj[name];\n\n if (negate && arguments.length > 1) {\n if (undefined === value) {\n msg = (msg != null) ? msg + ': ' : '';\n throw new Error(msg + _.inspect(obj) + ' has no ' + descriptor + _.inspect(name));\n }\n } else {\n this.assert(\n hasProperty\n , 'expected #{this} to have a ' + descriptor + _.inspect(name)\n , 'expected #{this} to not have ' + descriptor + _.inspect(name));\n }\n\n if (arguments.length > 1) {\n this.assert(\n val === value\n , 'expected #{this} to have a ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}'\n , 'expected #{this} to not have a ' + descriptor + _.inspect(name) + ' of #{act}'\n , val\n , value\n );\n }\n\n flag(this, 'object', value);\n });\n\n\n /**\n * ### .ownProperty(name)\n *\n * Asserts that the target has an own property `name`.\n *\n * expect('test').to.have.ownProperty('length');\n *\n * @name ownProperty\n * @alias haveOwnProperty\n * @param {String} name\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertOwnProperty (name, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n this.assert(\n obj.hasOwnProperty(name)\n , 'expected #{this} to have own property ' + _.inspect(name)\n , 'expected #{this} to not have own property ' + _.inspect(name)\n );\n }\n\n Assertion.addMethod('ownProperty', assertOwnProperty);\n Assertion.addMethod('haveOwnProperty', assertOwnProperty);\n\n /**\n * ### .ownPropertyDescriptor(name[, descriptor[, message]])\n *\n * Asserts that the target has an own property descriptor `name`, that optionally matches `descriptor`.\n *\n * expect('test').to.have.ownPropertyDescriptor('length');\n * expect('test').to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 4 });\n * expect('test').not.to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 3 });\n * expect('test').ownPropertyDescriptor('length').to.have.property('enumerable', false);\n * expect('test').ownPropertyDescriptor('length').to.have.keys('value');\n *\n * @name ownPropertyDescriptor\n * @alias haveOwnPropertyDescriptor\n * @param {String} name\n * @param {Object} descriptor _optional_\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertOwnPropertyDescriptor (name, descriptor, msg) {\n if (typeof descriptor === 'string') {\n msg = descriptor;\n descriptor = null;\n }\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n var actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name);\n if (actualDescriptor && descriptor) {\n this.assert(\n _.eql(descriptor, actualDescriptor)\n , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to match ' + _.inspect(descriptor) + ', got ' + _.inspect(actualDescriptor)\n , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to not match ' + _.inspect(descriptor)\n , descriptor\n , actualDescriptor\n , true\n );\n } else {\n this.assert(\n actualDescriptor\n , 'expected #{this} to have an own property descriptor for ' + _.inspect(name)\n , 'expected #{this} to not have an own property descriptor for ' + _.inspect(name)\n );\n }\n flag(this, 'object', actualDescriptor);\n }\n\n Assertion.addMethod('ownPropertyDescriptor', assertOwnPropertyDescriptor);\n Assertion.addMethod('haveOwnPropertyDescriptor', assertOwnPropertyDescriptor);\n\n /**\n * ### .length\n *\n * Sets the `doLength` flag later used as a chain precursor to a value\n * comparison for the `length` property.\n *\n * expect('foo').to.have.length.above(2);\n * expect([ 1, 2, 3 ]).to.have.length.above(2);\n * expect('foo').to.have.length.below(4);\n * expect([ 1, 2, 3 ]).to.have.length.below(4);\n * expect('foo').to.have.length.within(2,4);\n * expect([ 1, 2, 3 ]).to.have.length.within(2,4);\n *\n * *Deprecation notice:* Using `length` as an assertion will be deprecated\n * in version 2.4.0 and removed in 3.0.0. Code using the old style of\n * asserting for `length` property value using `length(value)` should be\n * switched to use `lengthOf(value)` instead.\n *\n * @name length\n * @namespace BDD\n * @api public\n */\n\n /**\n * ### .lengthOf(value[, message])\n *\n * Asserts that the target's `length` property has\n * the expected value.\n *\n * expect([ 1, 2, 3]).to.have.lengthOf(3);\n * expect('foobar').to.have.lengthOf(6);\n *\n * @name lengthOf\n * @param {Number} length\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertLengthChain () {\n flag(this, 'doLength', true);\n }\n\n function assertLength (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n\n this.assert(\n len == n\n , 'expected #{this} to have a length of #{exp} but got #{act}'\n , 'expected #{this} to not have a length of #{act}'\n , n\n , len\n );\n }\n\n Assertion.addChainableMethod('length', assertLength, assertLengthChain);\n Assertion.addMethod('lengthOf', assertLength);\n\n /**\n * ### .match(regexp)\n *\n * Asserts that the target matches a regular expression.\n *\n * expect('foobar').to.match(/^foo/);\n *\n * @name match\n * @alias matches\n * @param {RegExp} RegularExpression\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n function assertMatch(re, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n this.assert(\n re.exec(obj)\n , 'expected #{this} to match ' + re\n , 'expected #{this} not to match ' + re\n );\n }\n\n Assertion.addMethod('match', assertMatch);\n Assertion.addMethod('matches', assertMatch);\n\n /**\n * ### .string(string)\n *\n * Asserts that the string target contains another string.\n *\n * expect('foobar').to.have.string('bar');\n *\n * @name string\n * @param {String} string\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('string', function (str, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n new Assertion(obj, msg).is.a('string');\n\n this.assert(\n ~obj.indexOf(str)\n , 'expected #{this} to contain ' + _.inspect(str)\n , 'expected #{this} to not contain ' + _.inspect(str)\n );\n });\n\n\n /**\n * ### .keys(key1, [key2], [...])\n *\n * Asserts that the target contains any or all of the passed-in keys.\n * Use in combination with `any`, `all`, `contains`, or `have` will affect\n * what will pass.\n *\n * When used in conjunction with `any`, at least one key that is passed\n * in must exist in the target object. This is regardless whether or not\n * the `have` or `contain` qualifiers are used. Note, either `any` or `all`\n * should be used in the assertion. If neither are used, the assertion is\n * defaulted to `all`.\n *\n * When both `all` and `contain` are used, the target object must have at\n * least all of the passed-in keys but may have more keys not listed.\n *\n * When both `all` and `have` are used, the target object must both contain\n * all of the passed-in keys AND the number of keys in the target object must\n * match the number of keys passed in (in other words, a target object must\n * have all and only all of the passed-in keys).\n *\n * expect({ foo: 1, bar: 2 }).to.have.any.keys('foo', 'baz');\n * expect({ foo: 1, bar: 2 }).to.have.any.keys('foo');\n * expect({ foo: 1, bar: 2 }).to.contain.any.keys('bar', 'baz');\n * expect({ foo: 1, bar: 2 }).to.contain.any.keys(['foo']);\n * expect({ foo: 1, bar: 2 }).to.contain.any.keys({'foo': 6});\n * expect({ foo: 1, bar: 2 }).to.have.all.keys(['bar', 'foo']);\n * expect({ foo: 1, bar: 2 }).to.have.all.keys({'bar': 6, 'foo': 7});\n * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.all.keys(['bar', 'foo']);\n * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.all.keys({'bar': 6});\n *\n *\n * @name keys\n * @alias key\n * @param {...String|Array|Object} keys\n * @namespace BDD\n * @api public\n */\n\n function assertKeys (keys) {\n var obj = flag(this, 'object')\n , str\n , ok = true\n , mixedArgsMsg = 'keys must be given single argument of Array|Object|String, or multiple String arguments';\n\n switch (_.type(keys)) {\n case \"array\":\n if (arguments.length > 1) throw (new Error(mixedArgsMsg));\n break;\n case \"object\":\n if (arguments.length > 1) throw (new Error(mixedArgsMsg));\n keys = Object.keys(keys);\n break;\n default:\n keys = Array.prototype.slice.call(arguments);\n }\n\n if (!keys.length) throw new Error('keys required');\n\n var actual = Object.keys(obj)\n , expected = keys\n , len = keys.length\n , any = flag(this, 'any')\n , all = flag(this, 'all');\n\n if (!any && !all) {\n all = true;\n }\n\n // Has any\n if (any) {\n var intersection = expected.filter(function(key) {\n return ~actual.indexOf(key);\n });\n ok = intersection.length > 0;\n }\n\n // Has all\n if (all) {\n ok = keys.every(function(key){\n return ~actual.indexOf(key);\n });\n if (!flag(this, 'negate') && !flag(this, 'contains')) {\n ok = ok && keys.length == actual.length;\n }\n }\n\n // Key string\n if (len > 1) {\n keys = keys.map(function(key){\n return _.inspect(key);\n });\n var last = keys.pop();\n if (all) {\n str = keys.join(', ') + ', and ' + last;\n }\n if (any) {\n str = keys.join(', ') + ', or ' + last;\n }\n } else {\n str = _.inspect(keys[0]);\n }\n\n // Form\n str = (len > 1 ? 'keys ' : 'key ') + str;\n\n // Have / include\n str = (flag(this, 'contains') ? 'contain ' : 'have ') + str;\n\n // Assertion\n this.assert(\n ok\n , 'expected #{this} to ' + str\n , 'expected #{this} to not ' + str\n , expected.slice(0).sort()\n , actual.sort()\n , true\n );\n }\n\n Assertion.addMethod('keys', assertKeys);\n Assertion.addMethod('key', assertKeys);\n\n /**\n * ### .throw(constructor)\n *\n * Asserts that the function target will throw a specific error, or specific type of error\n * (as determined using `instanceof`), optionally with a RegExp or string inclusion test\n * for the error's message.\n *\n * var err = new ReferenceError('This is a bad function.');\n * var fn = function () { throw err; }\n * expect(fn).to.throw(ReferenceError);\n * expect(fn).to.throw(Error);\n * expect(fn).to.throw(/bad function/);\n * expect(fn).to.not.throw('good function');\n * expect(fn).to.throw(ReferenceError, /bad function/);\n * expect(fn).to.throw(err);\n *\n * Please note that when a throw expectation is negated, it will check each\n * parameter independently, starting with error constructor type. The appropriate way\n * to check for the existence of a type of error but for a message that does not match\n * is to use `and`.\n *\n * expect(fn).to.throw(ReferenceError)\n * .and.not.throw(/good function/);\n *\n * @name throw\n * @alias throws\n * @alias Throw\n * @param {ErrorConstructor} constructor\n * @param {String|RegExp} expected error message\n * @param {String} message _optional_\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @returns error for chaining (null if no error)\n * @namespace BDD\n * @api public\n */\n\n function assertThrows (constructor, errMsg, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n new Assertion(obj, msg).is.a('function');\n\n var thrown = false\n , desiredError = null\n , name = null\n , thrownError = null;\n\n if (arguments.length === 0) {\n errMsg = null;\n constructor = null;\n } else if (constructor && (constructor instanceof RegExp || 'string' === typeof constructor)) {\n errMsg = constructor;\n constructor = null;\n } else if (constructor && constructor instanceof Error) {\n desiredError = constructor;\n constructor = null;\n errMsg = null;\n } else if (typeof constructor === 'function') {\n name = constructor.prototype.name;\n if (!name || (name === 'Error' && constructor !== Error)) {\n name = constructor.name || (new constructor()).name;\n }\n } else {\n constructor = null;\n }\n\n try {\n obj();\n } catch (err) {\n // first, check desired error\n if (desiredError) {\n this.assert(\n err === desiredError\n , 'expected #{this} to throw #{exp} but #{act} was thrown'\n , 'expected #{this} to not throw #{exp}'\n , (desiredError instanceof Error ? desiredError.toString() : desiredError)\n , (err instanceof Error ? err.toString() : err)\n );\n\n flag(this, 'object', err);\n return this;\n }\n\n // next, check constructor\n if (constructor) {\n this.assert(\n err instanceof constructor\n , 'expected #{this} to throw #{exp} but #{act} was thrown'\n , 'expected #{this} to not throw #{exp} but #{act} was thrown'\n , name\n , (err instanceof Error ? err.toString() : err)\n );\n\n if (!errMsg) {\n flag(this, 'object', err);\n return this;\n }\n }\n\n // next, check message\n var message = 'error' === _.type(err) && \"message\" in err\n ? err.message\n : '' + err;\n\n if ((message != null) && errMsg && errMsg instanceof RegExp) {\n this.assert(\n errMsg.exec(message)\n , 'expected #{this} to throw error matching #{exp} but got #{act}'\n , 'expected #{this} to throw error not matching #{exp}'\n , errMsg\n , message\n );\n\n flag(this, 'object', err);\n return this;\n } else if ((message != null) && errMsg && 'string' === typeof errMsg) {\n this.assert(\n ~message.indexOf(errMsg)\n , 'expected #{this} to throw error including #{exp} but got #{act}'\n , 'expected #{this} to throw error not including #{act}'\n , errMsg\n , message\n );\n\n flag(this, 'object', err);\n return this;\n } else {\n thrown = true;\n thrownError = err;\n }\n }\n\n var actuallyGot = ''\n , expectedThrown = name !== null\n ? name\n : desiredError\n ? '#{exp}' //_.inspect(desiredError)\n : 'an error';\n\n if (thrown) {\n actuallyGot = ' but #{act} was thrown'\n }\n\n this.assert(\n thrown === true\n , 'expected #{this} to throw ' + expectedThrown + actuallyGot\n , 'expected #{this} to not throw ' + expectedThrown + actuallyGot\n , (desiredError instanceof Error ? desiredError.toString() : desiredError)\n , (thrownError instanceof Error ? thrownError.toString() : thrownError)\n );\n\n flag(this, 'object', thrownError);\n };\n\n Assertion.addMethod('throw', assertThrows);\n Assertion.addMethod('throws', assertThrows);\n Assertion.addMethod('Throw', assertThrows);\n\n /**\n * ### .respondTo(method)\n *\n * Asserts that the object or class target will respond to a method.\n *\n * Klass.prototype.bar = function(){};\n * expect(Klass).to.respondTo('bar');\n * expect(obj).to.respondTo('bar');\n *\n * To check if a constructor will respond to a static function,\n * set the `itself` flag.\n *\n * Klass.baz = function(){};\n * expect(Klass).itself.to.respondTo('baz');\n *\n * @name respondTo\n * @alias respondsTo\n * @param {String} method\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function respondTo (method, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , itself = flag(this, 'itself')\n , context = ('function' === _.type(obj) && !itself)\n ? obj.prototype[method]\n : obj[method];\n\n this.assert(\n 'function' === typeof context\n , 'expected #{this} to respond to ' + _.inspect(method)\n , 'expected #{this} to not respond to ' + _.inspect(method)\n );\n }\n\n Assertion.addMethod('respondTo', respondTo);\n Assertion.addMethod('respondsTo', respondTo);\n\n /**\n * ### .itself\n *\n * Sets the `itself` flag, later used by the `respondTo` assertion.\n *\n * function Foo() {}\n * Foo.bar = function() {}\n * Foo.prototype.baz = function() {}\n *\n * expect(Foo).itself.to.respondTo('bar');\n * expect(Foo).itself.not.to.respondTo('baz');\n *\n * @name itself\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('itself', function () {\n flag(this, 'itself', true);\n });\n\n /**\n * ### .satisfy(method)\n *\n * Asserts that the target passes a given truth test.\n *\n * expect(1).to.satisfy(function(num) { return num > 0; });\n *\n * @name satisfy\n * @alias satisfies\n * @param {Function} matcher\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function satisfy (matcher, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n var result = matcher(obj);\n this.assert(\n result\n , 'expected #{this} to satisfy ' + _.objDisplay(matcher)\n , 'expected #{this} to not satisfy' + _.objDisplay(matcher)\n , this.negate ? false : true\n , result\n );\n }\n\n Assertion.addMethod('satisfy', satisfy);\n Assertion.addMethod('satisfies', satisfy);\n\n /**\n * ### .closeTo(expected, delta)\n *\n * Asserts that the target is equal `expected`, to within a +/- `delta` range.\n *\n * expect(1.5).to.be.closeTo(1, 0.5);\n *\n * @name closeTo\n * @alias approximately\n * @param {Number} expected\n * @param {Number} delta\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function closeTo(expected, delta, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n\n new Assertion(obj, msg).is.a('number');\n if (_.type(expected) !== 'number' || _.type(delta) !== 'number') {\n throw new Error('the arguments to closeTo or approximately must be numbers');\n }\n\n this.assert(\n Math.abs(obj - expected) <= delta\n , 'expected #{this} to be close to ' + expected + ' +/- ' + delta\n , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta\n );\n }\n\n Assertion.addMethod('closeTo', closeTo);\n Assertion.addMethod('approximately', closeTo);\n\n function isSubsetOf(subset, superset, cmp) {\n return subset.every(function(elem) {\n if (!cmp) return superset.indexOf(elem) !== -1;\n\n return superset.some(function(elem2) {\n return cmp(elem, elem2);\n });\n })\n }\n\n /**\n * ### .members(set)\n *\n * Asserts that the target is a superset of `set`,\n * or that the target and `set` have the same strictly-equal (===) members.\n * Alternately, if the `deep` flag is set, set members are compared for deep\n * equality.\n *\n * expect([1, 2, 3]).to.include.members([3, 2]);\n * expect([1, 2, 3]).to.not.include.members([3, 2, 8]);\n *\n * expect([4, 2]).to.have.members([2, 4]);\n * expect([5, 2]).to.not.have.members([5, 2, 1]);\n *\n * expect([{ id: 1 }]).to.deep.include.members([{ id: 1 }]);\n *\n * @name members\n * @param {Array} set\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('members', function (subset, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n\n new Assertion(obj).to.be.an('array');\n new Assertion(subset).to.be.an('array');\n\n var cmp = flag(this, 'deep') ? _.eql : undefined;\n\n if (flag(this, 'contains')) {\n return this.assert(\n isSubsetOf(subset, obj, cmp)\n , 'expected #{this} to be a superset of #{act}'\n , 'expected #{this} to not be a superset of #{act}'\n , obj\n , subset\n );\n }\n\n this.assert(\n isSubsetOf(obj, subset, cmp) && isSubsetOf(subset, obj, cmp)\n , 'expected #{this} to have the same members as #{act}'\n , 'expected #{this} to not have the same members as #{act}'\n , obj\n , subset\n );\n });\n\n /**\n * ### .oneOf(list)\n *\n * Assert that a value appears somewhere in the top level of array `list`.\n *\n * expect('a').to.be.oneOf(['a', 'b', 'c']);\n * expect(9).to.not.be.oneOf(['z']);\n * expect([3]).to.not.be.oneOf([1, 2, [3]]);\n *\n * var three = [3];\n * // for object-types, contents are not compared\n * expect(three).to.not.be.oneOf([1, 2, [3]]);\n * // comparing references works\n * expect(three).to.be.oneOf([1, 2, three]);\n *\n * @name oneOf\n * @param {Array<*>} list\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function oneOf (list, msg) {\n if (msg) flag(this, 'message', msg);\n var expected = flag(this, 'object');\n new Assertion(list).to.be.an('array');\n\n this.assert(\n list.indexOf(expected) > -1\n , 'expected #{this} to be one of #{exp}'\n , 'expected #{this} to not be one of #{exp}'\n , list\n , expected\n );\n }\n\n Assertion.addMethod('oneOf', oneOf);\n\n\n /**\n * ### .change(function)\n *\n * Asserts that a function changes an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val += 3 };\n * var noChangeFn = function() { return 'foo' + 'bar'; }\n * expect(fn).to.change(obj, 'val');\n * expect(noChangeFn).to.not.change(obj, 'val')\n *\n * @name change\n * @alias changes\n * @alias Change\n * @param {String} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertChanges (object, prop, msg) {\n if (msg) flag(this, 'message', msg);\n var fn = flag(this, 'object');\n new Assertion(object, msg).to.have.property(prop);\n new Assertion(fn).is.a('function');\n\n var initial = object[prop];\n fn();\n\n this.assert(\n initial !== object[prop]\n , 'expected .' + prop + ' to change'\n , 'expected .' + prop + ' to not change'\n );\n }\n\n Assertion.addChainableMethod('change', assertChanges);\n Assertion.addChainableMethod('changes', assertChanges);\n\n /**\n * ### .increase(function)\n *\n * Asserts that a function increases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 15 };\n * expect(fn).to.increase(obj, 'val');\n *\n * @name increase\n * @alias increases\n * @alias Increase\n * @param {String} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertIncreases (object, prop, msg) {\n if (msg) flag(this, 'message', msg);\n var fn = flag(this, 'object');\n new Assertion(object, msg).to.have.property(prop);\n new Assertion(fn).is.a('function');\n\n var initial = object[prop];\n fn();\n\n this.assert(\n object[prop] - initial > 0\n , 'expected .' + prop + ' to increase'\n , 'expected .' + prop + ' to not increase'\n );\n }\n\n Assertion.addChainableMethod('increase', assertIncreases);\n Assertion.addChainableMethod('increases', assertIncreases);\n\n /**\n * ### .decrease(function)\n *\n * Asserts that a function decreases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 5 };\n * expect(fn).to.decrease(obj, 'val');\n *\n * @name decrease\n * @alias decreases\n * @alias Decrease\n * @param {String} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertDecreases (object, prop, msg) {\n if (msg) flag(this, 'message', msg);\n var fn = flag(this, 'object');\n new Assertion(object, msg).to.have.property(prop);\n new Assertion(fn).is.a('function');\n\n var initial = object[prop];\n fn();\n\n this.assert(\n object[prop] - initial < 0\n , 'expected .' + prop + ' to decrease'\n , 'expected .' + prop + ' to not decrease'\n );\n }\n\n Assertion.addChainableMethod('decrease', assertDecreases);\n Assertion.addChainableMethod('decreases', assertDecreases);\n\n /**\n * ### .extensible\n *\n * Asserts that the target is extensible (can have new properties added to\n * it).\n *\n * var nonExtensibleObject = Object.preventExtensions({});\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.freeze({});\n *\n * expect({}).to.be.extensible;\n * expect(nonExtensibleObject).to.not.be.extensible;\n * expect(sealedObject).to.not.be.extensible;\n * expect(frozenObject).to.not.be.extensible;\n *\n * @name extensible\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('extensible', function() {\n var obj = flag(this, 'object');\n\n // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.\n // In ES6, a non-object argument will be treated as if it was a non-extensible ordinary object, simply return false.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible\n // The following provides ES6 behavior when a TypeError is thrown under ES5.\n\n var isExtensible;\n\n try {\n isExtensible = Object.isExtensible(obj);\n } catch (err) {\n if (err instanceof TypeError) isExtensible = false;\n else throw err;\n }\n\n this.assert(\n isExtensible\n , 'expected #{this} to be extensible'\n , 'expected #{this} to not be extensible'\n );\n });\n\n /**\n * ### .sealed\n *\n * Asserts that the target is sealed (cannot have new properties added to it\n * and its existing properties cannot be removed).\n *\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.freeze({});\n *\n * expect(sealedObject).to.be.sealed;\n * expect(frozenObject).to.be.sealed;\n * expect({}).to.not.be.sealed;\n *\n * @name sealed\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('sealed', function() {\n var obj = flag(this, 'object');\n\n // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.\n // In ES6, a non-object argument will be treated as if it was a sealed ordinary object, simply return true.\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed\n // The following provides ES6 behavior when a TypeError is thrown under ES5.\n\n var isSealed;\n\n try {\n isSealed = Object.isSealed(obj);\n } catch (err) {\n if (err instanceof TypeError) isSealed = true;\n else throw err;\n }\n\n this.assert(\n isSealed\n , 'expected #{this} to be sealed'\n , 'expected #{this} to not be sealed'\n );\n });\n\n /**\n * ### .frozen\n *\n * Asserts that the target is frozen (cannot have new properties added to it\n * and its existing properties cannot be modified).\n *\n * var frozenObject = Object.freeze({});\n *\n * expect(frozenObject).to.be.frozen;\n * expect({}).to.not.be.frozen;\n *\n * @name frozen\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('frozen', function() {\n var obj = flag(this, 'object');\n\n // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.\n // In ES6, a non-object argument will be treated as if it was a frozen ordinary object, simply return true.\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen\n // The following provides ES6 behavior when a TypeError is thrown under ES5.\n\n var isFrozen;\n\n try {\n isFrozen = Object.isFrozen(obj);\n } catch (err) {\n if (err instanceof TypeError) isFrozen = true;\n else throw err;\n }\n\n this.assert(\n isFrozen\n , 'expected #{this} to be frozen'\n , 'expected #{this} to not be frozen'\n );\n });\n};\n","/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\n\nmodule.exports = function (chai, util) {\n\n /*!\n * Chai dependencies.\n */\n\n var Assertion = chai.Assertion\n , flag = util.flag;\n\n /*!\n * Module export.\n */\n\n /**\n * ### assert(expression, message)\n *\n * Write your own test expressions.\n *\n * assert('foo' !== 'bar', 'foo is not bar');\n * assert(Array.isArray([]), 'empty arrays are arrays');\n *\n * @param {Mixed} expression to test for truthiness\n * @param {String} message to display on error\n * @name assert\n * @namespace Assert\n * @api public\n */\n\n var assert = chai.assert = function (express, errmsg) {\n var test = new Assertion(null, null, chai.assert);\n test.assert(\n express\n , errmsg\n , '[ negation message unavailable ]'\n );\n };\n\n /**\n * ### .fail(actual, expected, [message], [operator])\n *\n * Throw a failure. Node.js `assert` module-compatible.\n *\n * @name fail\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @param {String} operator\n * @namespace Assert\n * @api public\n */\n\n assert.fail = function (actual, expected, message, operator) {\n message = message || 'assert.fail()';\n throw new chai.AssertionError(message, {\n actual: actual\n , expected: expected\n , operator: operator\n }, assert.fail);\n };\n\n /**\n * ### .isOk(object, [message])\n *\n * Asserts that `object` is truthy.\n *\n * assert.isOk('everything', 'everything is ok');\n * assert.isOk(false, 'this will fail');\n *\n * @name isOk\n * @alias ok\n * @param {Mixed} object to test\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isOk = function (val, msg) {\n new Assertion(val, msg).is.ok;\n };\n\n /**\n * ### .isNotOk(object, [message])\n *\n * Asserts that `object` is falsy.\n *\n * assert.isNotOk('everything', 'this will fail');\n * assert.isNotOk(false, 'this will pass');\n *\n * @name isNotOk\n * @alias notOk\n * @param {Mixed} object to test\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotOk = function (val, msg) {\n new Assertion(val, msg).is.not.ok;\n };\n\n /**\n * ### .equal(actual, expected, [message])\n *\n * Asserts non-strict equality (`==`) of `actual` and `expected`.\n *\n * assert.equal(3, '3', '== coerces values to strings');\n *\n * @name equal\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.equal = function (act, exp, msg) {\n var test = new Assertion(act, msg, assert.equal);\n\n test.assert(\n exp == flag(test, 'object')\n , 'expected #{this} to equal #{exp}'\n , 'expected #{this} to not equal #{act}'\n , exp\n , act\n );\n };\n\n /**\n * ### .notEqual(actual, expected, [message])\n *\n * Asserts non-strict inequality (`!=`) of `actual` and `expected`.\n *\n * assert.notEqual(3, 4, 'these numbers are not equal');\n *\n * @name notEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notEqual = function (act, exp, msg) {\n var test = new Assertion(act, msg, assert.notEqual);\n\n test.assert(\n exp != flag(test, 'object')\n , 'expected #{this} to not equal #{exp}'\n , 'expected #{this} to equal #{act}'\n , exp\n , act\n );\n };\n\n /**\n * ### .strictEqual(actual, expected, [message])\n *\n * Asserts strict equality (`===`) of `actual` and `expected`.\n *\n * assert.strictEqual(true, true, 'these booleans are strictly equal');\n *\n * @name strictEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.strictEqual = function (act, exp, msg) {\n new Assertion(act, msg).to.equal(exp);\n };\n\n /**\n * ### .notStrictEqual(actual, expected, [message])\n *\n * Asserts strict inequality (`!==`) of `actual` and `expected`.\n *\n * assert.notStrictEqual(3, '3', 'no coercion for strict equality');\n *\n * @name notStrictEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notStrictEqual = function (act, exp, msg) {\n new Assertion(act, msg).to.not.equal(exp);\n };\n\n /**\n * ### .deepEqual(actual, expected, [message])\n *\n * Asserts that `actual` is deeply equal to `expected`.\n *\n * assert.deepEqual({ tea: 'green' }, { tea: 'green' });\n *\n * @name deepEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepEqual = function (act, exp, msg) {\n new Assertion(act, msg).to.eql(exp);\n };\n\n /**\n * ### .notDeepEqual(actual, expected, [message])\n *\n * Assert that `actual` is not deeply equal to `expected`.\n *\n * assert.notDeepEqual({ tea: 'green' }, { tea: 'jasmine' });\n *\n * @name notDeepEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notDeepEqual = function (act, exp, msg) {\n new Assertion(act, msg).to.not.eql(exp);\n };\n\n /**\n * ### .isAbove(valueToCheck, valueToBeAbove, [message])\n *\n * Asserts `valueToCheck` is strictly greater than (>) `valueToBeAbove`\n *\n * assert.isAbove(5, 2, '5 is strictly greater than 2');\n *\n * @name isAbove\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeAbove\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isAbove = function (val, abv, msg) {\n new Assertion(val, msg).to.be.above(abv);\n };\n\n /**\n * ### .isAtLeast(valueToCheck, valueToBeAtLeast, [message])\n *\n * Asserts `valueToCheck` is greater than or equal to (>=) `valueToBeAtLeast`\n *\n * assert.isAtLeast(5, 2, '5 is greater or equal to 2');\n * assert.isAtLeast(3, 3, '3 is greater or equal to 3');\n *\n * @name isAtLeast\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeAtLeast\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isAtLeast = function (val, atlst, msg) {\n new Assertion(val, msg).to.be.least(atlst);\n };\n\n /**\n * ### .isBelow(valueToCheck, valueToBeBelow, [message])\n *\n * Asserts `valueToCheck` is strictly less than (<) `valueToBeBelow`\n *\n * assert.isBelow(3, 6, '3 is strictly less than 6');\n *\n * @name isBelow\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeBelow\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isBelow = function (val, blw, msg) {\n new Assertion(val, msg).to.be.below(blw);\n };\n\n /**\n * ### .isAtMost(valueToCheck, valueToBeAtMost, [message])\n *\n * Asserts `valueToCheck` is less than or equal to (<=) `valueToBeAtMost`\n *\n * assert.isAtMost(3, 6, '3 is less than or equal to 6');\n * assert.isAtMost(4, 4, '4 is less than or equal to 4');\n *\n * @name isAtMost\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeAtMost\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isAtMost = function (val, atmst, msg) {\n new Assertion(val, msg).to.be.most(atmst);\n };\n\n /**\n * ### .isTrue(value, [message])\n *\n * Asserts that `value` is true.\n *\n * var teaServed = true;\n * assert.isTrue(teaServed, 'the tea has been served');\n *\n * @name isTrue\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isTrue = function (val, msg) {\n new Assertion(val, msg).is['true'];\n };\n\n /**\n * ### .isNotTrue(value, [message])\n *\n * Asserts that `value` is not true.\n *\n * var tea = 'tasty chai';\n * assert.isNotTrue(tea, 'great, time for tea!');\n *\n * @name isNotTrue\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotTrue = function (val, msg) {\n new Assertion(val, msg).to.not.equal(true);\n };\n\n /**\n * ### .isFalse(value, [message])\n *\n * Asserts that `value` is false.\n *\n * var teaServed = false;\n * assert.isFalse(teaServed, 'no tea yet? hmm...');\n *\n * @name isFalse\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isFalse = function (val, msg) {\n new Assertion(val, msg).is['false'];\n };\n\n /**\n * ### .isNotFalse(value, [message])\n *\n * Asserts that `value` is not false.\n *\n * var tea = 'tasty chai';\n * assert.isNotFalse(tea, 'great, time for tea!');\n *\n * @name isNotFalse\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotFalse = function (val, msg) {\n new Assertion(val, msg).to.not.equal(false);\n };\n\n /**\n * ### .isNull(value, [message])\n *\n * Asserts that `value` is null.\n *\n * assert.isNull(err, 'there was no error');\n *\n * @name isNull\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNull = function (val, msg) {\n new Assertion(val, msg).to.equal(null);\n };\n\n /**\n * ### .isNotNull(value, [message])\n *\n * Asserts that `value` is not null.\n *\n * var tea = 'tasty chai';\n * assert.isNotNull(tea, 'great, time for tea!');\n *\n * @name isNotNull\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotNull = function (val, msg) {\n new Assertion(val, msg).to.not.equal(null);\n };\n\n /**\n * ### .isNaN\n * Asserts that value is NaN\n *\n * assert.isNaN('foo', 'foo is NaN');\n *\n * @name isNaN\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNaN = function (val, msg) {\n new Assertion(val, msg).to.be.NaN;\n };\n\n /**\n * ### .isNotNaN\n * Asserts that value is not NaN\n *\n * assert.isNotNaN(4, '4 is not NaN');\n *\n * @name isNotNaN\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n assert.isNotNaN = function (val, msg) {\n new Assertion(val, msg).not.to.be.NaN;\n };\n\n /**\n * ### .isUndefined(value, [message])\n *\n * Asserts that `value` is `undefined`.\n *\n * var tea;\n * assert.isUndefined(tea, 'no tea defined');\n *\n * @name isUndefined\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isUndefined = function (val, msg) {\n new Assertion(val, msg).to.equal(undefined);\n };\n\n /**\n * ### .isDefined(value, [message])\n *\n * Asserts that `value` is not `undefined`.\n *\n * var tea = 'cup of chai';\n * assert.isDefined(tea, 'tea has been defined');\n *\n * @name isDefined\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isDefined = function (val, msg) {\n new Assertion(val, msg).to.not.equal(undefined);\n };\n\n /**\n * ### .isFunction(value, [message])\n *\n * Asserts that `value` is a function.\n *\n * function serveTea() { return 'cup of tea'; };\n * assert.isFunction(serveTea, 'great, we can have tea now');\n *\n * @name isFunction\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isFunction = function (val, msg) {\n new Assertion(val, msg).to.be.a('function');\n };\n\n /**\n * ### .isNotFunction(value, [message])\n *\n * Asserts that `value` is _not_ a function.\n *\n * var serveTea = [ 'heat', 'pour', 'sip' ];\n * assert.isNotFunction(serveTea, 'great, we have listed the steps');\n *\n * @name isNotFunction\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotFunction = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('function');\n };\n\n /**\n * ### .isObject(value, [message])\n *\n * Asserts that `value` is an object of type 'Object' (as revealed by `Object.prototype.toString`).\n * _The assertion does not match subclassed objects._\n *\n * var selection = { name: 'Chai', serve: 'with spices' };\n * assert.isObject(selection, 'tea selection is an object');\n *\n * @name isObject\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isObject = function (val, msg) {\n new Assertion(val, msg).to.be.a('object');\n };\n\n /**\n * ### .isNotObject(value, [message])\n *\n * Asserts that `value` is _not_ an object of type 'Object' (as revealed by `Object.prototype.toString`).\n *\n * var selection = 'chai'\n * assert.isNotObject(selection, 'tea selection is not an object');\n * assert.isNotObject(null, 'null is not an object');\n *\n * @name isNotObject\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotObject = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('object');\n };\n\n /**\n * ### .isArray(value, [message])\n *\n * Asserts that `value` is an array.\n *\n * var menu = [ 'green', 'chai', 'oolong' ];\n * assert.isArray(menu, 'what kind of tea do we want?');\n *\n * @name isArray\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isArray = function (val, msg) {\n new Assertion(val, msg).to.be.an('array');\n };\n\n /**\n * ### .isNotArray(value, [message])\n *\n * Asserts that `value` is _not_ an array.\n *\n * var menu = 'green|chai|oolong';\n * assert.isNotArray(menu, 'what kind of tea do we want?');\n *\n * @name isNotArray\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotArray = function (val, msg) {\n new Assertion(val, msg).to.not.be.an('array');\n };\n\n /**\n * ### .isString(value, [message])\n *\n * Asserts that `value` is a string.\n *\n * var teaOrder = 'chai';\n * assert.isString(teaOrder, 'order placed');\n *\n * @name isString\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isString = function (val, msg) {\n new Assertion(val, msg).to.be.a('string');\n };\n\n /**\n * ### .isNotString(value, [message])\n *\n * Asserts that `value` is _not_ a string.\n *\n * var teaOrder = 4;\n * assert.isNotString(teaOrder, 'order placed');\n *\n * @name isNotString\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotString = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('string');\n };\n\n /**\n * ### .isNumber(value, [message])\n *\n * Asserts that `value` is a number.\n *\n * var cups = 2;\n * assert.isNumber(cups, 'how many cups');\n *\n * @name isNumber\n * @param {Number} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNumber = function (val, msg) {\n new Assertion(val, msg).to.be.a('number');\n };\n\n /**\n * ### .isNotNumber(value, [message])\n *\n * Asserts that `value` is _not_ a number.\n *\n * var cups = '2 cups please';\n * assert.isNotNumber(cups, 'how many cups');\n *\n * @name isNotNumber\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotNumber = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('number');\n };\n\n /**\n * ### .isBoolean(value, [message])\n *\n * Asserts that `value` is a boolean.\n *\n * var teaReady = true\n * , teaServed = false;\n *\n * assert.isBoolean(teaReady, 'is the tea ready');\n * assert.isBoolean(teaServed, 'has tea been served');\n *\n * @name isBoolean\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isBoolean = function (val, msg) {\n new Assertion(val, msg).to.be.a('boolean');\n };\n\n /**\n * ### .isNotBoolean(value, [message])\n *\n * Asserts that `value` is _not_ a boolean.\n *\n * var teaReady = 'yep'\n * , teaServed = 'nope';\n *\n * assert.isNotBoolean(teaReady, 'is the tea ready');\n * assert.isNotBoolean(teaServed, 'has tea been served');\n *\n * @name isNotBoolean\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotBoolean = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('boolean');\n };\n\n /**\n * ### .typeOf(value, name, [message])\n *\n * Asserts that `value`'s type is `name`, as determined by\n * `Object.prototype.toString`.\n *\n * assert.typeOf({ tea: 'chai' }, 'object', 'we have an object');\n * assert.typeOf(['chai', 'jasmine'], 'array', 'we have an array');\n * assert.typeOf('tea', 'string', 'we have a string');\n * assert.typeOf(/tea/, 'regexp', 'we have a regular expression');\n * assert.typeOf(null, 'null', 'we have a null');\n * assert.typeOf(undefined, 'undefined', 'we have an undefined');\n *\n * @name typeOf\n * @param {Mixed} value\n * @param {String} name\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.typeOf = function (val, type, msg) {\n new Assertion(val, msg).to.be.a(type);\n };\n\n /**\n * ### .notTypeOf(value, name, [message])\n *\n * Asserts that `value`'s type is _not_ `name`, as determined by\n * `Object.prototype.toString`.\n *\n * assert.notTypeOf('tea', 'number', 'strings are not numbers');\n *\n * @name notTypeOf\n * @param {Mixed} value\n * @param {String} typeof name\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notTypeOf = function (val, type, msg) {\n new Assertion(val, msg).to.not.be.a(type);\n };\n\n /**\n * ### .instanceOf(object, constructor, [message])\n *\n * Asserts that `value` is an instance of `constructor`.\n *\n * var Tea = function (name) { this.name = name; }\n * , chai = new Tea('chai');\n *\n * assert.instanceOf(chai, Tea, 'chai is an instance of tea');\n *\n * @name instanceOf\n * @param {Object} object\n * @param {Constructor} constructor\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.instanceOf = function (val, type, msg) {\n new Assertion(val, msg).to.be.instanceOf(type);\n };\n\n /**\n * ### .notInstanceOf(object, constructor, [message])\n *\n * Asserts `value` is not an instance of `constructor`.\n *\n * var Tea = function (name) { this.name = name; }\n * , chai = new String('chai');\n *\n * assert.notInstanceOf(chai, Tea, 'chai is not an instance of tea');\n *\n * @name notInstanceOf\n * @param {Object} object\n * @param {Constructor} constructor\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notInstanceOf = function (val, type, msg) {\n new Assertion(val, msg).to.not.be.instanceOf(type);\n };\n\n /**\n * ### .include(haystack, needle, [message])\n *\n * Asserts that `haystack` includes `needle`. Works\n * for strings and arrays.\n *\n * assert.include('foobar', 'bar', 'foobar contains string \"bar\"');\n * assert.include([ 1, 2, 3 ], 3, 'array contains value');\n *\n * @name include\n * @param {Array|String} haystack\n * @param {Mixed} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.include = function (exp, inc, msg) {\n new Assertion(exp, msg, assert.include).include(inc);\n };\n\n /**\n * ### .notInclude(haystack, needle, [message])\n *\n * Asserts that `haystack` does not include `needle`. Works\n * for strings and arrays.\n *\n * assert.notInclude('foobar', 'baz', 'string not include substring');\n * assert.notInclude([ 1, 2, 3 ], 4, 'array not include contain value');\n *\n * @name notInclude\n * @param {Array|String} haystack\n * @param {Mixed} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notInclude = function (exp, inc, msg) {\n new Assertion(exp, msg, assert.notInclude).not.include(inc);\n };\n\n /**\n * ### .match(value, regexp, [message])\n *\n * Asserts that `value` matches the regular expression `regexp`.\n *\n * assert.match('foobar', /^foo/, 'regexp matches');\n *\n * @name match\n * @param {Mixed} value\n * @param {RegExp} regexp\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.match = function (exp, re, msg) {\n new Assertion(exp, msg).to.match(re);\n };\n\n /**\n * ### .notMatch(value, regexp, [message])\n *\n * Asserts that `value` does not match the regular expression `regexp`.\n *\n * assert.notMatch('foobar', /^foo/, 'regexp does not match');\n *\n * @name notMatch\n * @param {Mixed} value\n * @param {RegExp} regexp\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notMatch = function (exp, re, msg) {\n new Assertion(exp, msg).to.not.match(re);\n };\n\n /**\n * ### .property(object, property, [message])\n *\n * Asserts that `object` has a property named by `property`.\n *\n * assert.property({ tea: { green: 'matcha' }}, 'tea');\n *\n * @name property\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.property = function (obj, prop, msg) {\n new Assertion(obj, msg).to.have.property(prop);\n };\n\n /**\n * ### .notProperty(object, property, [message])\n *\n * Asserts that `object` does _not_ have a property named by `property`.\n *\n * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee');\n *\n * @name notProperty\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notProperty = function (obj, prop, msg) {\n new Assertion(obj, msg).to.not.have.property(prop);\n };\n\n /**\n * ### .deepProperty(object, property, [message])\n *\n * Asserts that `object` has a property named by `property`, which can be a\n * string using dot- and bracket-notation for deep reference.\n *\n * assert.deepProperty({ tea: { green: 'matcha' }}, 'tea.green');\n *\n * @name deepProperty\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepProperty = function (obj, prop, msg) {\n new Assertion(obj, msg).to.have.deep.property(prop);\n };\n\n /**\n * ### .notDeepProperty(object, property, [message])\n *\n * Asserts that `object` does _not_ have a property named by `property`, which\n * can be a string using dot- and bracket-notation for deep reference.\n *\n * assert.notDeepProperty({ tea: { green: 'matcha' }}, 'tea.oolong');\n *\n * @name notDeepProperty\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notDeepProperty = function (obj, prop, msg) {\n new Assertion(obj, msg).to.not.have.deep.property(prop);\n };\n\n /**\n * ### .propertyVal(object, property, value, [message])\n *\n * Asserts that `object` has a property named by `property` with value given\n * by `value`.\n *\n * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good');\n *\n * @name propertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.propertyVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg).to.have.property(prop, val);\n };\n\n /**\n * ### .propertyNotVal(object, property, value, [message])\n *\n * Asserts that `object` has a property named by `property`, but with a value\n * different from that given by `value`.\n *\n * assert.propertyNotVal({ tea: 'is good' }, 'tea', 'is bad');\n *\n * @name propertyNotVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.propertyNotVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg).to.not.have.property(prop, val);\n };\n\n /**\n * ### .deepPropertyVal(object, property, value, [message])\n *\n * Asserts that `object` has a property named by `property` with value given\n * by `value`. `property` can use dot- and bracket-notation for deep\n * reference.\n *\n * assert.deepPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha');\n *\n * @name deepPropertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepPropertyVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg).to.have.deep.property(prop, val);\n };\n\n /**\n * ### .deepPropertyNotVal(object, property, value, [message])\n *\n * Asserts that `object` has a property named by `property`, but with a value\n * different from that given by `value`. `property` can use dot- and\n * bracket-notation for deep reference.\n *\n * assert.deepPropertyNotVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha');\n *\n * @name deepPropertyNotVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepPropertyNotVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg).to.not.have.deep.property(prop, val);\n };\n\n /**\n * ### .lengthOf(object, length, [message])\n *\n * Asserts that `object` has a `length` property with the expected value.\n *\n * assert.lengthOf([1,2,3], 3, 'array has length of 3');\n * assert.lengthOf('foobar', 6, 'string has length of 6');\n *\n * @name lengthOf\n * @param {Mixed} object\n * @param {Number} length\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.lengthOf = function (exp, len, msg) {\n new Assertion(exp, msg).to.have.length(len);\n };\n\n /**\n * ### .throws(function, [constructor/string/regexp], [string/regexp], [message])\n *\n * Asserts that `function` will throw an error that is an instance of\n * `constructor`, or alternately that it will throw an error with message\n * matching `regexp`.\n *\n * assert.throws(fn, 'function throws a reference error');\n * assert.throws(fn, /function throws a reference error/);\n * assert.throws(fn, ReferenceError);\n * assert.throws(fn, ReferenceError, 'function throws a reference error');\n * assert.throws(fn, ReferenceError, /function throws a reference error/);\n *\n * @name throws\n * @alias throw\n * @alias Throw\n * @param {Function} function\n * @param {ErrorConstructor} constructor\n * @param {RegExp} regexp\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Assert\n * @api public\n */\n\n assert.throws = function (fn, errt, errs, msg) {\n if ('string' === typeof errt || errt instanceof RegExp) {\n errs = errt;\n errt = null;\n }\n\n var assertErr = new Assertion(fn, msg).to.throw(errt, errs);\n return flag(assertErr, 'object');\n };\n\n /**\n * ### .doesNotThrow(function, [constructor/regexp], [message])\n *\n * Asserts that `function` will _not_ throw an error that is an instance of\n * `constructor`, or alternately that it will not throw an error with message\n * matching `regexp`.\n *\n * assert.doesNotThrow(fn, Error, 'function does not throw');\n *\n * @name doesNotThrow\n * @param {Function} function\n * @param {ErrorConstructor} constructor\n * @param {RegExp} regexp\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotThrow = function (fn, type, msg) {\n if ('string' === typeof type) {\n msg = type;\n type = null;\n }\n\n new Assertion(fn, msg).to.not.Throw(type);\n };\n\n /**\n * ### .operator(val1, operator, val2, [message])\n *\n * Compares two values using `operator`.\n *\n * assert.operator(1, '<', 2, 'everything is ok');\n * assert.operator(1, '>', 2, 'this will fail');\n *\n * @name operator\n * @param {Mixed} val1\n * @param {String} operator\n * @param {Mixed} val2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.operator = function (val, operator, val2, msg) {\n var ok;\n switch(operator) {\n case '==':\n ok = val == val2;\n break;\n case '===':\n ok = val === val2;\n break;\n case '>':\n ok = val > val2;\n break;\n case '>=':\n ok = val >= val2;\n break;\n case '<':\n ok = val < val2;\n break;\n case '<=':\n ok = val <= val2;\n break;\n case '!=':\n ok = val != val2;\n break;\n case '!==':\n ok = val !== val2;\n break;\n default:\n throw new Error('Invalid operator \"' + operator + '\"');\n }\n var test = new Assertion(ok, msg);\n test.assert(\n true === flag(test, 'object')\n , 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2)\n , 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2) );\n };\n\n /**\n * ### .closeTo(actual, expected, delta, [message])\n *\n * Asserts that the target is equal `expected`, to within a +/- `delta` range.\n *\n * assert.closeTo(1.5, 1, 0.5, 'numbers are close');\n *\n * @name closeTo\n * @param {Number} actual\n * @param {Number} expected\n * @param {Number} delta\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.closeTo = function (act, exp, delta, msg) {\n new Assertion(act, msg).to.be.closeTo(exp, delta);\n };\n\n /**\n * ### .approximately(actual, expected, delta, [message])\n *\n * Asserts that the target is equal `expected`, to within a +/- `delta` range.\n *\n * assert.approximately(1.5, 1, 0.5, 'numbers are close');\n *\n * @name approximately\n * @param {Number} actual\n * @param {Number} expected\n * @param {Number} delta\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.approximately = function (act, exp, delta, msg) {\n new Assertion(act, msg).to.be.approximately(exp, delta);\n };\n\n /**\n * ### .sameMembers(set1, set2, [message])\n *\n * Asserts that `set1` and `set2` have the same members.\n * Order is not taken into account.\n *\n * assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members');\n *\n * @name sameMembers\n * @param {Array} set1\n * @param {Array} set2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.sameMembers = function (set1, set2, msg) {\n new Assertion(set1, msg).to.have.same.members(set2);\n }\n\n /**\n * ### .sameDeepMembers(set1, set2, [message])\n *\n * Asserts that `set1` and `set2` have the same members - using a deep equality checking.\n * Order is not taken into account.\n *\n * assert.sameDeepMembers([ {b: 3}, {a: 2}, {c: 5} ], [ {c: 5}, {b: 3}, {a: 2} ], 'same deep members');\n *\n * @name sameDeepMembers\n * @param {Array} set1\n * @param {Array} set2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.sameDeepMembers = function (set1, set2, msg) {\n new Assertion(set1, msg).to.have.same.deep.members(set2);\n }\n\n /**\n * ### .includeMembers(superset, subset, [message])\n *\n * Asserts that `subset` is included in `superset`.\n * Order is not taken into account.\n *\n * assert.includeMembers([ 1, 2, 3 ], [ 2, 1 ], 'include members');\n *\n * @name includeMembers\n * @param {Array} superset\n * @param {Array} subset\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.includeMembers = function (superset, subset, msg) {\n new Assertion(superset, msg).to.include.members(subset);\n }\n\n /**\n * ### .includeDeepMembers(superset, subset, [message])\n *\n * Asserts that `subset` is included in `superset` - using deep equality checking.\n * Order is not taken into account.\n * Duplicates are ignored.\n *\n * assert.includeDeepMembers([ {a: 1}, {b: 2}, {c: 3} ], [ {b: 2}, {a: 1}, {b: 2} ], 'include deep members');\n *\n * @name includeDeepMembers\n * @param {Array} superset\n * @param {Array} subset\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.includeDeepMembers = function (superset, subset, msg) {\n new Assertion(superset, msg).to.include.deep.members(subset);\n }\n\n /**\n * ### .oneOf(inList, list, [message])\n *\n * Asserts that non-object, non-array value `inList` appears in the flat array `list`.\n *\n * assert.oneOf(1, [ 2, 1 ], 'Not found in list');\n *\n * @name oneOf\n * @param {*} inList\n * @param {Array<*>} list\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.oneOf = function (inList, list, msg) {\n new Assertion(inList, msg).to.be.oneOf(list);\n }\n\n /**\n * ### .changes(function, object, property)\n *\n * Asserts that a function changes the value of a property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 22 };\n * assert.changes(fn, obj, 'val');\n *\n * @name changes\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.changes = function (fn, obj, prop) {\n new Assertion(fn).to.change(obj, prop);\n }\n\n /**\n * ### .doesNotChange(function, object, property)\n *\n * Asserts that a function does not changes the value of a property\n *\n * var obj = { val: 10 };\n * var fn = function() { console.log('foo'); };\n * assert.doesNotChange(fn, obj, 'val');\n *\n * @name doesNotChange\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotChange = function (fn, obj, prop) {\n new Assertion(fn).to.not.change(obj, prop);\n }\n\n /**\n * ### .increases(function, object, property)\n *\n * Asserts that a function increases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 13 };\n * assert.increases(fn, obj, 'val');\n *\n * @name increases\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.increases = function (fn, obj, prop) {\n new Assertion(fn).to.increase(obj, prop);\n }\n\n /**\n * ### .doesNotIncrease(function, object, property)\n *\n * Asserts that a function does not increase object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 8 };\n * assert.doesNotIncrease(fn, obj, 'val');\n *\n * @name doesNotIncrease\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotIncrease = function (fn, obj, prop) {\n new Assertion(fn).to.not.increase(obj, prop);\n }\n\n /**\n * ### .decreases(function, object, property)\n *\n * Asserts that a function decreases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 5 };\n * assert.decreases(fn, obj, 'val');\n *\n * @name decreases\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.decreases = function (fn, obj, prop) {\n new Assertion(fn).to.decrease(obj, prop);\n }\n\n /**\n * ### .doesNotDecrease(function, object, property)\n *\n * Asserts that a function does not decreases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 15 };\n * assert.doesNotDecrease(fn, obj, 'val');\n *\n * @name doesNotDecrease\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotDecrease = function (fn, obj, prop) {\n new Assertion(fn).to.not.decrease(obj, prop);\n }\n\n /*!\n * ### .ifError(object)\n *\n * Asserts if value is not a false value, and throws if it is a true value.\n * This is added to allow for chai to be a drop-in replacement for Node's\n * assert class.\n *\n * var err = new Error('I am a custom error');\n * assert.ifError(err); // Rethrows err!\n *\n * @name ifError\n * @param {Object} object\n * @namespace Assert\n * @api public\n */\n\n assert.ifError = function (val) {\n if (val) {\n throw(val);\n }\n };\n\n /**\n * ### .isExtensible(object)\n *\n * Asserts that `object` is extensible (can have new properties added to it).\n *\n * assert.isExtensible({});\n *\n * @name isExtensible\n * @alias extensible\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isExtensible = function (obj, msg) {\n new Assertion(obj, msg).to.be.extensible;\n };\n\n /**\n * ### .isNotExtensible(object)\n *\n * Asserts that `object` is _not_ extensible.\n *\n * var nonExtensibleObject = Object.preventExtensions({});\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.freese({});\n *\n * assert.isNotExtensible(nonExtensibleObject);\n * assert.isNotExtensible(sealedObject);\n * assert.isNotExtensible(frozenObject);\n *\n * @name isNotExtensible\n * @alias notExtensible\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isNotExtensible = function (obj, msg) {\n new Assertion(obj, msg).to.not.be.extensible;\n };\n\n /**\n * ### .isSealed(object)\n *\n * Asserts that `object` is sealed (cannot have new properties added to it\n * and its existing properties cannot be removed).\n *\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.seal({});\n *\n * assert.isSealed(sealedObject);\n * assert.isSealed(frozenObject);\n *\n * @name isSealed\n * @alias sealed\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isSealed = function (obj, msg) {\n new Assertion(obj, msg).to.be.sealed;\n };\n\n /**\n * ### .isNotSealed(object)\n *\n * Asserts that `object` is _not_ sealed.\n *\n * assert.isNotSealed({});\n *\n * @name isNotSealed\n * @alias notSealed\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isNotSealed = function (obj, msg) {\n new Assertion(obj, msg).to.not.be.sealed;\n };\n\n /**\n * ### .isFrozen(object)\n *\n * Asserts that `object` is frozen (cannot have new properties added to it\n * and its existing properties cannot be modified).\n *\n * var frozenObject = Object.freeze({});\n * assert.frozen(frozenObject);\n *\n * @name isFrozen\n * @alias frozen\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isFrozen = function (obj, msg) {\n new Assertion(obj, msg).to.be.frozen;\n };\n\n /**\n * ### .isNotFrozen(object)\n *\n * Asserts that `object` is _not_ frozen.\n *\n * assert.isNotFrozen({});\n *\n * @name isNotFrozen\n * @alias notFrozen\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isNotFrozen = function (obj, msg) {\n new Assertion(obj, msg).to.not.be.frozen;\n };\n\n /*!\n * Aliases.\n */\n\n (function alias(name, as){\n assert[as] = assert[name];\n return alias;\n })\n ('isOk', 'ok')\n ('isNotOk', 'notOk')\n ('throws', 'throw')\n ('throws', 'Throw')\n ('isExtensible', 'extensible')\n ('isNotExtensible', 'notExtensible')\n ('isSealed', 'sealed')\n ('isNotSealed', 'notSealed')\n ('isFrozen', 'frozen')\n ('isNotFrozen', 'notFrozen');\n};\n","/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nmodule.exports = function (chai, util) {\n chai.expect = function (val, message) {\n return new chai.Assertion(val, message);\n };\n\n /**\n * ### .fail(actual, expected, [message], [operator])\n *\n * Throw a failure.\n *\n * @name fail\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @param {String} operator\n * @namespace Expect\n * @api public\n */\n\n chai.expect.fail = function (actual, expected, message, operator) {\n message = message || 'expect.fail()';\n throw new chai.AssertionError(message, {\n actual: actual\n , expected: expected\n , operator: operator\n }, chai.expect.fail);\n };\n};\n","/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nmodule.exports = function (chai, util) {\n var Assertion = chai.Assertion;\n\n function loadShould () {\n // explicitly define this method as function as to have it's name to include as `ssfi`\n function shouldGetter() {\n if (this instanceof String || this instanceof Number || this instanceof Boolean ) {\n return new Assertion(this.valueOf(), null, shouldGetter);\n }\n return new Assertion(this, null, shouldGetter);\n }\n function shouldSetter(value) {\n // See https://github.com/chaijs/chai/issues/86: this makes\n // `whatever.should = someValue` actually set `someValue`, which is\n // especially useful for `global.should = require('chai').should()`.\n //\n // Note that we have to use [[DefineProperty]] instead of [[Put]]\n // since otherwise we would trigger this very setter!\n Object.defineProperty(this, 'should', {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n }\n // modify Object.prototype to have `should`\n Object.defineProperty(Object.prototype, 'should', {\n set: shouldSetter\n , get: shouldGetter\n , configurable: true\n });\n\n var should = {};\n\n /**\n * ### .fail(actual, expected, [message], [operator])\n *\n * Throw a failure.\n *\n * @name fail\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @param {String} operator\n * @namespace Should\n * @api public\n */\n\n should.fail = function (actual, expected, message, operator) {\n message = message || 'should.fail()';\n throw new chai.AssertionError(message, {\n actual: actual\n , expected: expected\n , operator: operator\n }, should.fail);\n };\n\n /**\n * ### .equal(actual, expected, [message])\n *\n * Asserts non-strict equality (`==`) of `actual` and `expected`.\n *\n * should.equal(3, '3', '== coerces values to strings');\n *\n * @name equal\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Should\n * @api public\n */\n\n should.equal = function (val1, val2, msg) {\n new Assertion(val1, msg).to.equal(val2);\n };\n\n /**\n * ### .throw(function, [constructor/string/regexp], [string/regexp], [message])\n *\n * Asserts that `function` will throw an error that is an instance of\n * `constructor`, or alternately that it will throw an error with message\n * matching `regexp`.\n *\n * should.throw(fn, 'function throws a reference error');\n * should.throw(fn, /function throws a reference error/);\n * should.throw(fn, ReferenceError);\n * should.throw(fn, ReferenceError, 'function throws a reference error');\n * should.throw(fn, ReferenceError, /function throws a reference error/);\n *\n * @name throw\n * @alias Throw\n * @param {Function} function\n * @param {ErrorConstructor} constructor\n * @param {RegExp} regexp\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Should\n * @api public\n */\n\n should.Throw = function (fn, errt, errs, msg) {\n new Assertion(fn, msg).to.Throw(errt, errs);\n };\n\n /**\n * ### .exist\n *\n * Asserts that the target is neither `null` nor `undefined`.\n *\n * var foo = 'hi';\n *\n * should.exist(foo, 'foo exists');\n *\n * @name exist\n * @namespace Should\n * @api public\n */\n\n should.exist = function (val, msg) {\n new Assertion(val, msg).to.exist;\n }\n\n // negation\n should.not = {}\n\n /**\n * ### .not.equal(actual, expected, [message])\n *\n * Asserts non-strict inequality (`!=`) of `actual` and `expected`.\n *\n * should.not.equal(3, 4, 'these numbers are not equal');\n *\n * @name not.equal\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Should\n * @api public\n */\n\n should.not.equal = function (val1, val2, msg) {\n new Assertion(val1, msg).to.not.equal(val2);\n };\n\n /**\n * ### .throw(function, [constructor/regexp], [message])\n *\n * Asserts that `function` will _not_ throw an error that is an instance of\n * `constructor`, or alternately that it will not throw an error with message\n * matching `regexp`.\n *\n * should.not.throw(fn, Error, 'function does not throw');\n *\n * @name not.throw\n * @alias not.Throw\n * @param {Function} function\n * @param {ErrorConstructor} constructor\n * @param {RegExp} regexp\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Should\n * @api public\n */\n\n should.not.Throw = function (fn, errt, errs, msg) {\n new Assertion(fn, msg).to.not.Throw(errt, errs);\n };\n\n /**\n * ### .not.exist\n *\n * Asserts that the target is neither `null` nor `undefined`.\n *\n * var bar = null;\n *\n * should.not.exist(bar, 'bar does not exist');\n *\n * @name not.exist\n * @namespace Should\n * @api public\n */\n\n should.not.exist = function (val, msg) {\n new Assertion(val, msg).to.not.exist;\n }\n\n should['throw'] = should['Throw'];\n should.not['throw'] = should.not['Throw'];\n\n return should;\n };\n\n chai.should = loadShould;\n chai.Should = loadShould;\n};\n","/*!\n * Chai - addChainingMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependencies\n */\n\nvar transferFlags = require('./transferFlags');\nvar flag = require('./flag');\nvar config = require('../config');\n\n/*!\n * Module variables\n */\n\n// Check whether `__proto__` is supported\nvar hasProtoSupport = '__proto__' in Object;\n\n// Without `__proto__` support, this module will need to add properties to a function.\n// However, some Function.prototype methods cannot be overwritten,\n// and there seems no easy cross-platform way to detect them (@see chaijs/chai/issues/69).\nvar excludeNames = /^(?:length|name|arguments|caller)$/;\n\n// Cache `Function` properties\nvar call = Function.prototype.call,\n apply = Function.prototype.apply;\n\n/**\n * ### addChainableMethod (ctx, name, method, chainingBehavior)\n *\n * Adds a method to an object, such that the method can also be chained.\n *\n * utils.addChainableMethod(chai.Assertion.prototype, 'foo', function (str) {\n * var obj = utils.flag(this, 'object');\n * new chai.Assertion(obj).to.be.equal(str);\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.addChainableMethod('foo', fn, chainingBehavior);\n *\n * The result can then be used as both a method assertion, executing both `method` and\n * `chainingBehavior`, or as a language chain, which only executes `chainingBehavior`.\n *\n * expect(fooStr).to.be.foo('bar');\n * expect(fooStr).to.be.foo.equal('foo');\n *\n * @param {Object} ctx object to which the method is added\n * @param {String} name of method to add\n * @param {Function} method function to be used for `name`, when called\n * @param {Function} chainingBehavior function to be called every time the property is accessed\n * @namespace Utils\n * @name addChainableMethod\n * @api public\n */\n\nmodule.exports = function (ctx, name, method, chainingBehavior) {\n if (typeof chainingBehavior !== 'function') {\n chainingBehavior = function () { };\n }\n\n var chainableBehavior = {\n method: method\n , chainingBehavior: chainingBehavior\n };\n\n // save the methods so we can overwrite them later, if we need to.\n if (!ctx.__methods) {\n ctx.__methods = {};\n }\n ctx.__methods[name] = chainableBehavior;\n\n Object.defineProperty(ctx, name,\n { get: function () {\n chainableBehavior.chainingBehavior.call(this);\n\n var assert = function assert() {\n var old_ssfi = flag(this, 'ssfi');\n if (old_ssfi && config.includeStack === false)\n flag(this, 'ssfi', assert);\n var result = chainableBehavior.method.apply(this, arguments);\n return result === undefined ? this : result;\n };\n\n // Use `__proto__` if available\n if (hasProtoSupport) {\n // Inherit all properties from the object by replacing the `Function` prototype\n var prototype = assert.__proto__ = Object.create(this);\n // Restore the `call` and `apply` methods from `Function`\n prototype.call = call;\n prototype.apply = apply;\n }\n // Otherwise, redefine all properties (slow!)\n else {\n var asserterNames = Object.getOwnPropertyNames(ctx);\n asserterNames.forEach(function (asserterName) {\n if (!excludeNames.test(asserterName)) {\n var pd = Object.getOwnPropertyDescriptor(ctx, asserterName);\n Object.defineProperty(assert, asserterName, pd);\n }\n });\n }\n\n transferFlags(this, assert);\n return assert;\n }\n , configurable: true\n });\n};\n","/*!\n * Chai - addMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar config = require('../config');\n\n/**\n * ### .addMethod (ctx, name, method)\n *\n * Adds a method to the prototype of an object.\n *\n * utils.addMethod(chai.Assertion.prototype, 'foo', function (str) {\n * var obj = utils.flag(this, 'object');\n * new chai.Assertion(obj).to.be.equal(str);\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.addMethod('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(fooStr).to.be.foo('bar');\n *\n * @param {Object} ctx object to which the method is added\n * @param {String} name of method to add\n * @param {Function} method function to be used for name\n * @namespace Utils\n * @name addMethod\n * @api public\n */\nvar flag = require('./flag');\n\nmodule.exports = function (ctx, name, method) {\n ctx[name] = function () {\n var old_ssfi = flag(this, 'ssfi');\n if (old_ssfi && config.includeStack === false)\n flag(this, 'ssfi', ctx[name]);\n var result = method.apply(this, arguments);\n return result === undefined ? this : result;\n };\n};\n","/*!\n * Chai - addProperty utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar config = require('../config');\nvar flag = require('./flag');\n\n/**\n * ### addProperty (ctx, name, getter)\n *\n * Adds a property to the prototype of an object.\n *\n * utils.addProperty(chai.Assertion.prototype, 'foo', function () {\n * var obj = utils.flag(this, 'object');\n * new chai.Assertion(obj).to.be.instanceof(Foo);\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.addProperty('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.be.foo;\n *\n * @param {Object} ctx object to which the property is added\n * @param {String} name of property to add\n * @param {Function} getter function to be used for name\n * @namespace Utils\n * @name addProperty\n * @api public\n */\n\nmodule.exports = function (ctx, name, getter) {\n Object.defineProperty(ctx, name,\n { get: function addProperty() {\n var old_ssfi = flag(this, 'ssfi');\n if (old_ssfi && config.includeStack === false)\n flag(this, 'ssfi', addProperty);\n\n var result = getter.call(this);\n return result === undefined ? this : result;\n }\n , configurable: true\n });\n};\n","/*!\n * Chai - expectTypes utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### expectTypes(obj, types)\n *\n * Ensures that the object being tested against is of a valid type.\n *\n * utils.expectTypes(this, ['array', 'object', 'string']);\n *\n * @param {Mixed} obj constructed Assertion\n * @param {Array} type A list of allowed types for this assertion\n * @namespace Utils\n * @name expectTypes\n * @api public\n */\n\nvar AssertionError = require('assertion-error');\nvar flag = require('./flag');\nvar type = require('type-detect');\n\nmodule.exports = function (obj, types) {\n var obj = flag(obj, 'object');\n types = types.map(function (t) { return t.toLowerCase(); });\n types.sort();\n\n // Transforms ['lorem', 'ipsum'] into 'a lirum, or an ipsum'\n var str = types.map(function (t, index) {\n var art = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(t.charAt(0)) ? 'an' : 'a';\n var or = types.length > 1 && index === types.length - 1 ? 'or ' : '';\n return or + art + ' ' + t;\n }).join(', ');\n\n if (!types.some(function (expected) { return type(obj) === expected; })) {\n throw new AssertionError(\n 'object tested must be ' + str + ', but ' + type(obj) + ' given'\n );\n }\n};\n","/*!\n * Chai - flag utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### flag(object, key, [value])\n *\n * Get or set a flag value on an object. If a\n * value is provided it will be set, else it will\n * return the currently set value or `undefined` if\n * the value is not set.\n *\n * utils.flag(this, 'foo', 'bar'); // setter\n * utils.flag(this, 'foo'); // getter, returns `bar`\n *\n * @param {Object} object constructed Assertion\n * @param {String} key\n * @param {Mixed} value (optional)\n * @namespace Utils\n * @name flag\n * @api private\n */\n\nmodule.exports = function (obj, key, value) {\n var flags = obj.__flags || (obj.__flags = Object.create(null));\n if (arguments.length === 3) {\n flags[key] = value;\n } else {\n return flags[key];\n }\n};\n","/*!\n * Chai - getActual utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * # getActual(object, [actual])\n *\n * Returns the `actual` value for an Assertion\n *\n * @param {Object} object (constructed Assertion)\n * @param {Arguments} chai.Assertion.prototype.assert arguments\n * @namespace Utils\n * @name getActual\n */\n\nmodule.exports = function (obj, args) {\n return args.length > 4 ? args[4] : obj._obj;\n};\n","/*!\n * Chai - getEnumerableProperties utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### .getEnumerableProperties(object)\n *\n * This allows the retrieval of enumerable property names of an object,\n * inherited or not.\n *\n * @param {Object} object\n * @returns {Array}\n * @namespace Utils\n * @name getEnumerableProperties\n * @api public\n */\n\nmodule.exports = function getEnumerableProperties(object) {\n var result = [];\n for (var name in object) {\n result.push(name);\n }\n return result;\n};\n","/*!\n * Chai - message composition utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependancies\n */\n\nvar flag = require('./flag')\n , getActual = require('./getActual')\n , inspect = require('./inspect')\n , objDisplay = require('./objDisplay');\n\n/**\n * ### .getMessage(object, message, negateMessage)\n *\n * Construct the error message based on flags\n * and template tags. Template tags will return\n * a stringified inspection of the object referenced.\n *\n * Message template tags:\n * - `#{this}` current asserted object\n * - `#{act}` actual value\n * - `#{exp}` expected value\n *\n * @param {Object} object (constructed Assertion)\n * @param {Arguments} chai.Assertion.prototype.assert arguments\n * @namespace Utils\n * @name getMessage\n * @api public\n */\n\nmodule.exports = function (obj, args) {\n var negate = flag(obj, 'negate')\n , val = flag(obj, 'object')\n , expected = args[3]\n , actual = getActual(obj, args)\n , msg = negate ? args[2] : args[1]\n , flagMsg = flag(obj, 'message');\n\n if(typeof msg === \"function\") msg = msg();\n msg = msg || '';\n msg = msg\n .replace(/#\\{this\\}/g, function () { return objDisplay(val); })\n .replace(/#\\{act\\}/g, function () { return objDisplay(actual); })\n .replace(/#\\{exp\\}/g, function () { return objDisplay(expected); });\n\n return flagMsg ? flagMsg + ': ' + msg : msg;\n};\n","/*!\n * Chai - getName utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * # getName(func)\n *\n * Gets the name of a function, in a cross-browser way.\n *\n * @param {Function} a function (usually a constructor)\n * @namespace Utils\n * @name getName\n */\n\nmodule.exports = function (func) {\n if (func.name) return func.name;\n\n var match = /^\\s?function ([^(]*)\\(/.exec(func);\n return match && match[1] ? match[1] : \"\";\n};\n","/*!\n * Chai - getPathInfo utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar hasProperty = require('./hasProperty');\n\n/**\n * ### .getPathInfo(path, object)\n *\n * This allows the retrieval of property info in an\n * object given a string path.\n *\n * The path info consists of an object with the\n * following properties:\n *\n * * parent - The parent object of the property referenced by `path`\n * * name - The name of the final property, a number if it was an array indexer\n * * value - The value of the property, if it exists, otherwise `undefined`\n * * exists - Whether the property exists or not\n *\n * @param {String} path\n * @param {Object} object\n * @returns {Object} info\n * @namespace Utils\n * @name getPathInfo\n * @api public\n */\n\nmodule.exports = function getPathInfo(path, obj) {\n var parsed = parsePath(path),\n last = parsed[parsed.length - 1];\n\n var info = {\n parent: parsed.length > 1 ? _getPathValue(parsed, obj, parsed.length - 1) : obj,\n name: last.p || last.i,\n value: _getPathValue(parsed, obj)\n };\n info.exists = hasProperty(info.name, info.parent);\n\n return info;\n};\n\n\n/*!\n * ## parsePath(path)\n *\n * Helper function used to parse string object\n * paths. Use in conjunction with `_getPathValue`.\n *\n * var parsed = parsePath('myobject.property.subprop');\n *\n * ### Paths:\n *\n * * Can be as near infinitely deep and nested\n * * Arrays are also valid using the formal `myobject.document[3].property`.\n * * Literal dots and brackets (not delimiter) must be backslash-escaped.\n *\n * @param {String} path\n * @returns {Object} parsed\n * @api private\n */\n\nfunction parsePath (path) {\n var str = path.replace(/([^\\\\])\\[/g, '$1.[')\n , parts = str.match(/(\\\\\\.|[^.]+?)+/g);\n return parts.map(function (value) {\n var re = /^\\[(\\d+)\\]$/\n , mArr = re.exec(value);\n if (mArr) return { i: parseFloat(mArr[1]) };\n else return { p: value.replace(/\\\\([.\\[\\]])/g, '$1') };\n });\n}\n\n\n/*!\n * ## _getPathValue(parsed, obj)\n *\n * Helper companion function for `.parsePath` that returns\n * the value located at the parsed address.\n *\n * var value = getPathValue(parsed, obj);\n *\n * @param {Object} parsed definition from `parsePath`.\n * @param {Object} object to search against\n * @param {Number} object to search against\n * @returns {Object|Undefined} value\n * @api private\n */\n\nfunction _getPathValue (parsed, obj, index) {\n var tmp = obj\n , res;\n\n index = (index === undefined ? parsed.length : index);\n\n for (var i = 0, l = index; i < l; i++) {\n var part = parsed[i];\n if (tmp) {\n if ('undefined' !== typeof part.p)\n tmp = tmp[part.p];\n else if ('undefined' !== typeof part.i)\n tmp = tmp[part.i];\n if (i == (l - 1)) res = tmp;\n } else {\n res = undefined;\n }\n }\n return res;\n}\n","/*!\n * Chai - getPathValue utility\n * Copyright(c) 2012-2014 Jake Luer \n * @see https://github.com/logicalparadox/filtr\n * MIT Licensed\n */\n\nvar getPathInfo = require('./getPathInfo');\n\n/**\n * ### .getPathValue(path, object)\n *\n * This allows the retrieval of values in an\n * object given a string path.\n *\n * var obj = {\n * prop1: {\n * arr: ['a', 'b', 'c']\n * , str: 'Hello'\n * }\n * , prop2: {\n * arr: [ { nested: 'Universe' } ]\n * , str: 'Hello again!'\n * }\n * }\n *\n * The following would be the results.\n *\n * getPathValue('prop1.str', obj); // Hello\n * getPathValue('prop1.att[2]', obj); // b\n * getPathValue('prop2.arr[0].nested', obj); // Universe\n *\n * @param {String} path\n * @param {Object} object\n * @returns {Object} value or `undefined`\n * @namespace Utils\n * @name getPathValue\n * @api public\n */\nmodule.exports = function(path, obj) {\n var info = getPathInfo(path, obj);\n return info.value;\n};\n","/*!\n * Chai - getProperties utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### .getProperties(object)\n *\n * This allows the retrieval of property names of an object, enumerable or not,\n * inherited or not.\n *\n * @param {Object} object\n * @returns {Array}\n * @namespace Utils\n * @name getProperties\n * @api public\n */\n\nmodule.exports = function getProperties(object) {\n var result = Object.getOwnPropertyNames(object);\n\n function addProperty(property) {\n if (result.indexOf(property) === -1) {\n result.push(property);\n }\n }\n\n var proto = Object.getPrototypeOf(object);\n while (proto !== null) {\n Object.getOwnPropertyNames(proto).forEach(addProperty);\n proto = Object.getPrototypeOf(proto);\n }\n\n return result;\n};\n","/*!\n * Chai - hasProperty utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar type = require('type-detect');\n\n/**\n * ### .hasProperty(object, name)\n *\n * This allows checking whether an object has\n * named property or numeric array index.\n *\n * Basically does the same thing as the `in`\n * operator but works properly with natives\n * and null/undefined values.\n *\n * var obj = {\n * arr: ['a', 'b', 'c']\n * , str: 'Hello'\n * }\n *\n * The following would be the results.\n *\n * hasProperty('str', obj); // true\n * hasProperty('constructor', obj); // true\n * hasProperty('bar', obj); // false\n *\n * hasProperty('length', obj.str); // true\n * hasProperty(1, obj.str); // true\n * hasProperty(5, obj.str); // false\n *\n * hasProperty('length', obj.arr); // true\n * hasProperty(2, obj.arr); // true\n * hasProperty(3, obj.arr); // false\n *\n * @param {Objuect} object\n * @param {String|Number} name\n * @returns {Boolean} whether it exists\n * @namespace Utils\n * @name getPathInfo\n * @api public\n */\n\nvar literals = {\n 'number': Number\n , 'string': String\n};\n\nmodule.exports = function hasProperty(name, obj) {\n var ot = type(obj);\n\n // Bad Object, obviously no props at all\n if(ot === 'null' || ot === 'undefined')\n return false;\n\n // The `in` operator does not work with certain literals\n // box these before the check\n if(literals[ot] && typeof obj !== 'object')\n obj = new literals[ot](obj);\n\n return name in obj;\n};\n","/*!\n * chai\n * Copyright(c) 2011 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Main exports\n */\n\nvar exports = module.exports = {};\n\n/*!\n * test utility\n */\n\nexports.test = require('./test');\n\n/*!\n * type utility\n */\n\nexports.type = require('type-detect');\n\n/*!\n * expectTypes utility\n */\nexports.expectTypes = require('./expectTypes');\n\n/*!\n * message utility\n */\n\nexports.getMessage = require('./getMessage');\n\n/*!\n * actual utility\n */\n\nexports.getActual = require('./getActual');\n\n/*!\n * Inspect util\n */\n\nexports.inspect = require('./inspect');\n\n/*!\n * Object Display util\n */\n\nexports.objDisplay = require('./objDisplay');\n\n/*!\n * Flag utility\n */\n\nexports.flag = require('./flag');\n\n/*!\n * Flag transferring utility\n */\n\nexports.transferFlags = require('./transferFlags');\n\n/*!\n * Deep equal utility\n */\n\nexports.eql = require('deep-eql');\n\n/*!\n * Deep path value\n */\n\nexports.getPathValue = require('./getPathValue');\n\n/*!\n * Deep path info\n */\n\nexports.getPathInfo = require('./getPathInfo');\n\n/*!\n * Check if a property exists\n */\n\nexports.hasProperty = require('./hasProperty');\n\n/*!\n * Function name\n */\n\nexports.getName = require('./getName');\n\n/*!\n * add Property\n */\n\nexports.addProperty = require('./addProperty');\n\n/*!\n * add Method\n */\n\nexports.addMethod = require('./addMethod');\n\n/*!\n * overwrite Property\n */\n\nexports.overwriteProperty = require('./overwriteProperty');\n\n/*!\n * overwrite Method\n */\n\nexports.overwriteMethod = require('./overwriteMethod');\n\n/*!\n * Add a chainable method\n */\n\nexports.addChainableMethod = require('./addChainableMethod');\n\n/*!\n * Overwrite chainable method\n */\n\nexports.overwriteChainableMethod = require('./overwriteChainableMethod');\n","// This is (almost) directly from Node.js utils\n// https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/util.js\n\nvar getName = require('./getName');\nvar getProperties = require('./getProperties');\nvar getEnumerableProperties = require('./getEnumerableProperties');\n\nmodule.exports = inspect;\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Boolean} showHidden Flag that shows hidden (not enumerable)\n * properties of objects.\n * @param {Number} depth Depth in which to descend in object. Default is 2.\n * @param {Boolean} colors Flag to turn on ANSI escape codes to color the\n * output. Default is false (no coloring).\n * @namespace Utils\n * @name inspect\n */\nfunction inspect(obj, showHidden, depth, colors) {\n var ctx = {\n showHidden: showHidden,\n seen: [],\n stylize: function (str) { return str; }\n };\n return formatValue(ctx, obj, (typeof depth === 'undefined' ? 2 : depth));\n}\n\n// Returns true if object is a DOM element.\nvar isDOMElement = function (object) {\n if (typeof HTMLElement === 'object') {\n return object instanceof HTMLElement;\n } else {\n return object &&\n typeof object === 'object' &&\n object.nodeType === 1 &&\n typeof object.nodeName === 'string';\n }\n};\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (value && typeof value.inspect === 'function' &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes);\n if (typeof ret !== 'string') {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // If this is a DOM element, try to get the outer HTML.\n if (isDOMElement(value)) {\n if ('outerHTML' in value) {\n return value.outerHTML;\n // This value does not have an outerHTML attribute,\n // it could still be an XML element\n } else {\n // Attempt to serialize it\n try {\n if (document.xmlVersion) {\n var xmlSerializer = new XMLSerializer();\n return xmlSerializer.serializeToString(value);\n } else {\n // Firefox 11- do not support outerHTML\n // It does, however, support innerHTML\n // Use the following to render the element\n var ns = \"http://www.w3.org/1999/xhtml\";\n var container = document.createElementNS(ns, '_');\n\n container.appendChild(value.cloneNode(false));\n html = container.innerHTML\n .replace('><', '>' + value.innerHTML + '<');\n container.innerHTML = '';\n return html;\n }\n } catch (err) {\n // This could be a non-native DOM implementation,\n // continue with the normal flow:\n // printing the element as if it is an object.\n }\n }\n }\n\n // Look up the keys of the object.\n var visibleKeys = getEnumerableProperties(value);\n var keys = ctx.showHidden ? getProperties(value) : visibleKeys;\n\n // Some type of object without properties can be shortcutted.\n // In IE, errors have a single `stack` property, or if they are vanilla `Error`,\n // a `stack` plus `description` property; ignore those for consistency.\n if (keys.length === 0 || (isError(value) && (\n (keys.length === 1 && keys[0] === 'stack') ||\n (keys.length === 2 && keys[0] === 'description' && keys[1] === 'stack')\n ))) {\n if (typeof value === 'function') {\n var name = getName(value);\n var nameSuffix = name ? ': ' + name : '';\n return ctx.stylize('[Function' + nameSuffix + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toUTCString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (typeof value === 'function') {\n var name = getName(value);\n var nameSuffix = name ? ': ' + name : '';\n base = ' [Function' + nameSuffix + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n return formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n switch (typeof value) {\n case 'undefined':\n return ctx.stylize('undefined', 'undefined');\n\n case 'string':\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n\n case 'number':\n if (value === 0 && (1/value) === -Infinity) {\n return ctx.stylize('-0', 'number');\n }\n return ctx.stylize('' + value, 'number');\n\n case 'boolean':\n return ctx.stylize('' + value, 'boolean');\n }\n // For some reason typeof null is \"object\", so special case here.\n if (value === null) {\n return ctx.stylize('null', 'null');\n }\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (Object.prototype.hasOwnProperty.call(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str;\n if (value.__lookupGetter__) {\n if (value.__lookupGetter__(key)) {\n if (value.__lookupSetter__(key)) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (value.__lookupSetter__(key)) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n }\n if (visibleKeys.indexOf(key) < 0) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(value[key]) < 0) {\n if (recurseTimes === null) {\n str = formatValue(ctx, value[key], null);\n } else {\n str = formatValue(ctx, value[key], recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (typeof name === 'undefined') {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\nfunction isArray(ar) {\n return Array.isArray(ar) ||\n (typeof ar === 'object' && objectToString(ar) === '[object Array]');\n}\n\nfunction isRegExp(re) {\n return typeof re === 'object' && objectToString(re) === '[object RegExp]';\n}\n\nfunction isDate(d) {\n return typeof d === 'object' && objectToString(d) === '[object Date]';\n}\n\nfunction isError(e) {\n return typeof e === 'object' && objectToString(e) === '[object Error]';\n}\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n","/*!\n * Chai - flag utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependancies\n */\n\nvar inspect = require('./inspect');\nvar config = require('../config');\n\n/**\n * ### .objDisplay (object)\n *\n * Determines if an object or an array matches\n * criteria to be inspected in-line for error\n * messages or should be truncated.\n *\n * @param {Mixed} javascript object to inspect\n * @name objDisplay\n * @namespace Utils\n * @api public\n */\n\nmodule.exports = function (obj) {\n var str = inspect(obj)\n , type = Object.prototype.toString.call(obj);\n\n if (config.truncateThreshold && str.length >= config.truncateThreshold) {\n if (type === '[object Function]') {\n return !obj.name || obj.name === ''\n ? '[Function]'\n : '[Function: ' + obj.name + ']';\n } else if (type === '[object Array]') {\n return '[ Array(' + obj.length + ') ]';\n } else if (type === '[object Object]') {\n var keys = Object.keys(obj)\n , kstr = keys.length > 2\n ? keys.splice(0, 2).join(', ') + ', ...'\n : keys.join(', ');\n return '{ Object (' + kstr + ') }';\n } else {\n return str;\n }\n } else {\n return str;\n }\n};\n","/*!\n * Chai - overwriteChainableMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### overwriteChainableMethod (ctx, name, method, chainingBehavior)\n *\n * Overwites an already existing chainable method\n * and provides access to the previous function or\n * property. Must return functions to be used for\n * name.\n *\n * utils.overwriteChainableMethod(chai.Assertion.prototype, 'length',\n * function (_super) {\n * }\n * , function (_super) {\n * }\n * );\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.overwriteChainableMethod('foo', fn, fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.have.length(3);\n * expect(myFoo).to.have.length.above(3);\n *\n * @param {Object} ctx object whose method / property is to be overwritten\n * @param {String} name of method / property to overwrite\n * @param {Function} method function that returns a function to be used for name\n * @param {Function} chainingBehavior function that returns a function to be used for property\n * @namespace Utils\n * @name overwriteChainableMethod\n * @api public\n */\n\nmodule.exports = function (ctx, name, method, chainingBehavior) {\n var chainableBehavior = ctx.__methods[name];\n\n var _chainingBehavior = chainableBehavior.chainingBehavior;\n chainableBehavior.chainingBehavior = function () {\n var result = chainingBehavior(_chainingBehavior).call(this);\n return result === undefined ? this : result;\n };\n\n var _method = chainableBehavior.method;\n chainableBehavior.method = function () {\n var result = method(_method).apply(this, arguments);\n return result === undefined ? this : result;\n };\n};\n","/*!\n * Chai - overwriteMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### overwriteMethod (ctx, name, fn)\n *\n * Overwites an already existing method and provides\n * access to previous function. Must return function\n * to be used for name.\n *\n * utils.overwriteMethod(chai.Assertion.prototype, 'equal', function (_super) {\n * return function (str) {\n * var obj = utils.flag(this, 'object');\n * if (obj instanceof Foo) {\n * new chai.Assertion(obj.value).to.equal(str);\n * } else {\n * _super.apply(this, arguments);\n * }\n * }\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.overwriteMethod('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.equal('bar');\n *\n * @param {Object} ctx object whose method is to be overwritten\n * @param {String} name of method to overwrite\n * @param {Function} method function that returns a function to be used for name\n * @namespace Utils\n * @name overwriteMethod\n * @api public\n */\n\nmodule.exports = function (ctx, name, method) {\n var _method = ctx[name]\n , _super = function () { return this; };\n\n if (_method && 'function' === typeof _method)\n _super = _method;\n\n ctx[name] = function () {\n var result = method(_super).apply(this, arguments);\n return result === undefined ? this : result;\n }\n};\n","/*!\n * Chai - overwriteProperty utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### overwriteProperty (ctx, name, fn)\n *\n * Overwites an already existing property getter and provides\n * access to previous value. Must return function to use as getter.\n *\n * utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super) {\n * return function () {\n * var obj = utils.flag(this, 'object');\n * if (obj instanceof Foo) {\n * new chai.Assertion(obj.name).to.equal('bar');\n * } else {\n * _super.call(this);\n * }\n * }\n * });\n *\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.overwriteProperty('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.be.ok;\n *\n * @param {Object} ctx object whose property is to be overwritten\n * @param {String} name of property to overwrite\n * @param {Function} getter function that returns a getter function to be used for name\n * @namespace Utils\n * @name overwriteProperty\n * @api public\n */\n\nmodule.exports = function (ctx, name, getter) {\n var _get = Object.getOwnPropertyDescriptor(ctx, name)\n , _super = function () {};\n\n if (_get && 'function' === typeof _get.get)\n _super = _get.get\n\n Object.defineProperty(ctx, name,\n { get: function () {\n var result = getter(_super).call(this);\n return result === undefined ? this : result;\n }\n , configurable: true\n });\n};\n","/*!\n * Chai - test utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependancies\n */\n\nvar flag = require('./flag');\n\n/**\n * # test(object, expression)\n *\n * Test and object for expression.\n *\n * @param {Object} object (constructed Assertion)\n * @param {Arguments} chai.Assertion.prototype.assert arguments\n * @namespace Utils\n * @name test\n */\n\nmodule.exports = function (obj, args) {\n var negate = flag(obj, 'negate')\n , expr = args[0];\n return negate ? !expr : expr;\n};\n","/*!\n * Chai - transferFlags utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### transferFlags(assertion, object, includeAll = true)\n *\n * Transfer all the flags for `assertion` to `object`. If\n * `includeAll` is set to `false`, then the base Chai\n * assertion flags (namely `object`, `ssfi`, and `message`)\n * will not be transferred.\n *\n *\n * var newAssertion = new Assertion();\n * utils.transferFlags(assertion, newAssertion);\n *\n * var anotherAsseriton = new Assertion(myObj);\n * utils.transferFlags(assertion, anotherAssertion, false);\n *\n * @param {Assertion} assertion the assertion to transfer the flags from\n * @param {Object} object the object to transfer the flags to; usually a new assertion\n * @param {Boolean} includeAll\n * @namespace Utils\n * @name transferFlags\n * @api private\n */\n\nmodule.exports = function (assertion, object, includeAll) {\n var flags = assertion.__flags || (assertion.__flags = Object.create(null));\n\n if (!object.__flags) {\n object.__flags = Object.create(null);\n }\n\n includeAll = arguments.length === 3 ? includeAll : true;\n\n for (var flag in flags) {\n if (includeAll ||\n (flag !== 'object' && flag !== 'ssfi' && flag != 'message')) {\n object.__flags[flag] = flags[flag];\n }\n }\n};\n","\"use strict\";\n\nfunction dedent(strings) {\n\n var raw = void 0;\n if (typeof strings === \"string\") {\n // dedent can be used as a plain function\n raw = [strings];\n } else {\n raw = strings.raw;\n }\n\n // first, perform interpolation\n var result = \"\";\n for (var i = 0; i < raw.length; i++) {\n result += raw[i].\n // join lines when there is a suppressed newline\n replace(/\\\\\\n[ \\t]*/g, \"\").\n\n // handle escaped backticks\n replace(/\\\\`/g, \"`\");\n\n if (i < (arguments.length <= 1 ? 0 : arguments.length - 1)) {\n result += arguments.length <= i + 1 ? undefined : arguments[i + 1];\n }\n }\n\n // now strip indentation\n var lines = result.split(\"\\n\");\n var mindent = null;\n lines.forEach(function (l) {\n var m = l.match(/^(\\s+)\\S+/);\n if (m) {\n var indent = m[1].length;\n if (!mindent) {\n // this is the first indented line\n mindent = indent;\n } else {\n mindent = Math.min(mindent, indent);\n }\n }\n });\n\n if (mindent !== null) {\n result = lines.map(function (l) {\n return l[0] === \" \" ? l.slice(mindent) : l;\n }).join(\"\\n\");\n }\n\n // dedent eats leading and trailing whitespace too\n result = result.trim();\n\n // handle escaped newlines at the end to ensure they don't get stripped too\n return result.replace(/\\\\n/g, \"\\n\");\n}\n\nif (typeof module !== \"undefined\") {\n module.exports = dedent;\n}\n","module.exports = require('./lib/eql');\n","/*!\n * deep-eql\n * Copyright(c) 2013 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependencies\n */\n\nvar type = require('type-detect');\n\n/*!\n * Buffer.isBuffer browser shim\n */\n\nvar Buffer;\ntry { Buffer = require('buffer').Buffer; }\ncatch(ex) {\n Buffer = {};\n Buffer.isBuffer = function() { return false; }\n}\n\n/*!\n * Primary Export\n */\n\nmodule.exports = deepEqual;\n\n/**\n * Assert super-strict (egal) equality between\n * two objects of any type.\n *\n * @param {Mixed} a\n * @param {Mixed} b\n * @param {Array} memoised (optional)\n * @return {Boolean} equal match\n */\n\nfunction deepEqual(a, b, m) {\n if (sameValue(a, b)) {\n return true;\n } else if ('date' === type(a)) {\n return dateEqual(a, b);\n } else if ('regexp' === type(a)) {\n return regexpEqual(a, b);\n } else if (Buffer.isBuffer(a)) {\n return bufferEqual(a, b);\n } else if ('arguments' === type(a)) {\n return argumentsEqual(a, b, m);\n } else if (!typeEqual(a, b)) {\n return false;\n } else if (('object' !== type(a) && 'object' !== type(b))\n && ('array' !== type(a) && 'array' !== type(b))) {\n return sameValue(a, b);\n } else {\n return objectEqual(a, b, m);\n }\n}\n\n/*!\n * Strict (egal) equality test. Ensures that NaN always\n * equals NaN and `-0` does not equal `+0`.\n *\n * @param {Mixed} a\n * @param {Mixed} b\n * @return {Boolean} equal match\n */\n\nfunction sameValue(a, b) {\n if (a === b) return a !== 0 || 1 / a === 1 / b;\n return a !== a && b !== b;\n}\n\n/*!\n * Compare the types of two given objects and\n * return if they are equal. Note that an Array\n * has a type of `array` (not `object`) and arguments\n * have a type of `arguments` (not `array`/`object`).\n *\n * @param {Mixed} a\n * @param {Mixed} b\n * @return {Boolean} result\n */\n\nfunction typeEqual(a, b) {\n return type(a) === type(b);\n}\n\n/*!\n * Compare two Date objects by asserting that\n * the time values are equal using `saveValue`.\n *\n * @param {Date} a\n * @param {Date} b\n * @return {Boolean} result\n */\n\nfunction dateEqual(a, b) {\n if ('date' !== type(b)) return false;\n return sameValue(a.getTime(), b.getTime());\n}\n\n/*!\n * Compare two regular expressions by converting them\n * to string and checking for `sameValue`.\n *\n * @param {RegExp} a\n * @param {RegExp} b\n * @return {Boolean} result\n */\n\nfunction regexpEqual(a, b) {\n if ('regexp' !== type(b)) return false;\n return sameValue(a.toString(), b.toString());\n}\n\n/*!\n * Assert deep equality of two `arguments` objects.\n * Unfortunately, these must be sliced to arrays\n * prior to test to ensure no bad behavior.\n *\n * @param {Arguments} a\n * @param {Arguments} b\n * @param {Array} memoize (optional)\n * @return {Boolean} result\n */\n\nfunction argumentsEqual(a, b, m) {\n if ('arguments' !== type(b)) return false;\n a = [].slice.call(a);\n b = [].slice.call(b);\n return deepEqual(a, b, m);\n}\n\n/*!\n * Get enumerable properties of a given object.\n *\n * @param {Object} a\n * @return {Array} property names\n */\n\nfunction enumerable(a) {\n var res = [];\n for (var key in a) res.push(key);\n return res;\n}\n\n/*!\n * Simple equality for flat iterable objects\n * such as Arrays or Node.js buffers.\n *\n * @param {Iterable} a\n * @param {Iterable} b\n * @return {Boolean} result\n */\n\nfunction iterableEqual(a, b) {\n if (a.length !== b.length) return false;\n\n var i = 0;\n var match = true;\n\n for (; i < a.length; i++) {\n if (a[i] !== b[i]) {\n match = false;\n break;\n }\n }\n\n return match;\n}\n\n/*!\n * Extension to `iterableEqual` specifically\n * for Node.js Buffers.\n *\n * @param {Buffer} a\n * @param {Mixed} b\n * @return {Boolean} result\n */\n\nfunction bufferEqual(a, b) {\n if (!Buffer.isBuffer(b)) return false;\n return iterableEqual(a, b);\n}\n\n/*!\n * Block for `objectEqual` ensuring non-existing\n * values don't get in.\n *\n * @param {Mixed} object\n * @return {Boolean} result\n */\n\nfunction isValue(a) {\n return a !== null && a !== undefined;\n}\n\n/*!\n * Recursively check the equality of two objects.\n * Once basic sameness has been established it will\n * defer to `deepEqual` for each enumerable key\n * in the object.\n *\n * @param {Mixed} a\n * @param {Mixed} b\n * @return {Boolean} result\n */\n\nfunction objectEqual(a, b, m) {\n if (!isValue(a) || !isValue(b)) {\n return false;\n }\n\n if (a.prototype !== b.prototype) {\n return false;\n }\n\n var i;\n if (m) {\n for (i = 0; i < m.length; i++) {\n if ((m[i][0] === a && m[i][1] === b)\n || (m[i][0] === b && m[i][1] === a)) {\n return true;\n }\n }\n } else {\n m = [];\n }\n\n try {\n var ka = enumerable(a);\n var kb = enumerable(b);\n } catch (ex) {\n return false;\n }\n\n ka.sort();\n kb.sort();\n\n if (!iterableEqual(ka, kb)) {\n return false;\n }\n\n m.push([ a, b ]);\n\n var key;\n for (i = ka.length - 1; i >= 0; i--) {\n key = ka[i];\n if (!deepEqual(a[key], b[key], m)) {\n return false;\n }\n }\n\n return true;\n}\n","const initial = require('./problems/initial');\nconst arrays = require('./problems/arrays');\n\nmodule.exports = {\n initial: initial,\n arrays: arrays\n};\n","module.exports = [\n {\n name: 'Access Array by index (first)',\n time: 10,\n prompt: 'Return the first value of the Array',\n given: `const fruits = ['apple', 'banana'];\\r`,\n answer: `const fruits = ['apple', 'banana'];\n return fruits[0];`,\n tests: [\n {\n name: 'Correct output',\n test: 'assert.deepEqual(output, \\'apple\\') === undefined'\n },\n {\n name: 'Returns a String',\n test: 'assert.isString(output) === undefined'\n }\n ]\n },\n {\n name: 'Access Array by index (last)',\n time: 10,\n prompt: 'Return the last value of the Array',\n given: `const fruits = ['apple', 'banana', 'orange'];\\r`,\n answer: `const fruits = ['apple', 'banana', 'orange'];\n return fruits[fruits.length - 1];`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 'orange') === undefined;`\n },\n {\n name: 'Returns a String',\n test: `assert.isString(output) === undefined;`\n }\n ]\n },\n {\n name: 'Access Array by index (second)',\n time: 10,\n prompt: 'Return the second value of the Array',\n given: `const fruits = ['apple', 'banana'];\\r`,\n answer: `const fruits = ['apple', 'banana'];\n return fruits[1];`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 'banana') === undefined;`\n },\n {\n name: 'Returns a String',\n test: `assert.isString(output) === undefined;`\n }\n ]\n },\n {\n name: 'Array.forEach()',\n time: 20,\n prompt: 'Loop over the array, add an \\'x\\' to the end of each name, push each fruit into a new array, then return the new array.',\n given: `const fruits = ['apple', 'banana'];\\r`,\n answer: `const fruits = ['apple', 'banana'];\n const newFruits = [];\n fruits.forEach(function(item) {\n newFruits.push(item+'x');\n });\n return newFruits;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, ['applex', 'bananax']) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 2 items',\n test: `assert.lengthOf(output, 2) === undefined;`\n }\n ]\n },\n {\n name: 'Array.push()',\n time: 10,\n prompt: `Add 'orange' to the end of the 'fruits' array and return 'fruits'.`,\n given: `const fruits = ['apple', 'banana'];\\r`,\n answer: `const fruits = ['apple', 'banana'];\n fruits.push('orange');\n return fruits;`,\n tests: [\n {\n name: 'Correct output',\n test: `(assert.deepEqual(output, ['apple', 'banana', 'orange']) === undefined);`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 3 items',\n test: `assert.lengthOf(output, 3) === undefined;`\n }\n ]\n },\n {\n name: 'Array.shift()',\n time: 10,\n prompt: `Remove 'apple' from the front of the 'fruits' array and return 'fruits'.`,\n given: `const fruits = ['apple', 'banana', 'orange'];\\r`,\n answer: `const fruits = ['apple', 'banana', 'orange'];\n fruits.shift();\n return fruits;`,\n tests: [\n {\n name: 'Output must be correct',\n test: `assert.deepEqual(output, ['banana', 'orange']) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 2 items',\n test: `assert.lengthOf(output, 2) === undefined;`\n }\n ]\n },\n {\n name: 'Array.unshift()',\n time: 10,\n prompt: `Add 'strawberry' to the front of the 'fruits' array and return 'fruits'.`,\n given: `const fruits = ['apple', 'banana', 'orange'];\\r`,\n answer: `const fruits = ['apple', 'banana', 'orange'];\n fruits.unshift('strawberry');\n return fruits;`,\n tests: [\n {\n name: 'Output must be correct',\n test: `(assert.deepEqual(output, [\n 'strawberry',\n 'apple',\n 'banana',\n 'orange'\n ]) === undefined)`\n },\n {\n name: 'Must return an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 4 items',\n test: `assert.lengthOf(output, 4) === undefined;`\n }\n ]\n },\n {\n name: 'Array.indexOf()',\n time: 10,\n prompt: `Return the index of 'banana' in the Array.`,\n given: `const fruits = ['strawberry', 'banana', 'mango'];\\r`,\n answer: `const fruits = ['strawberry', 'banana', 'mango'];\n const ind = fruits.indexOf('banana');\n return ind;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 1) === undefined;`\n },\n {\n name: 'Returns a Number',\n test: `assert.isNumber(output) === undefined;`\n }\n ]\n },\n {\n name: 'Array.concat()',\n time: 10,\n prompt: `Merge the two arrays using Array's 'concat()' method. Return the resulting array.`,\n given: `const fruits = ['strawberry', 'banana'];\\rconst otherFruits = ['pear','peach'];\\r`,\n answer: `const fruits = ['strawberry', 'banana'];\n const otherFruits = ['pear','peach'];\n const allTheFruits = fruits.concat(otherFruits);\n return allTheFruits;\\r`,\n tests: [\n {\n name: 'Correct output',\n test: `(assert.deepEqual(output, [\n 'strawberry',\n 'banana',\n 'pear',\n 'peach'\n ]) === undefined\n );`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 4 items',\n test: `assert.lengthOf(output, 4) === undefined;`\n }\n ]\n },\n {\n name: 'Array.join()',\n time: 10,\n prompt: `Mix the two flavors with a '-' using Array's 'join' method. Return the resulting hybrid flavor.`,\n given: `const fruits = ['strawberry', 'banana'];\\r`,\n answer: `const fruits = ['strawberry', 'banana'];\n const hybrid = fruits.join('-');\n return hybrid;\\r`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 'strawberry-banana') === undefined;`\n },\n {\n name: 'Returns a String',\n test: `assert.isString(output) === undefined;`\n }\n ]\n },\n {\n name: 'Array.slice()',\n time: 20,\n prompt: `Return just the citrus fruits from the 'fruits' array using 'Array.slice()'`,\n given: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\\r`,\n answer: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const citrus = fruits.slice(1, 3);\n return citrus;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, ['orange', 'lemon']) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 2 items',\n test: `assert.lengthOf(output, 2) === undefined;`\n }\n ]\n },\n {\n name: 'Array.reverse()',\n time: 10,\n prompt: `Reverse the order of the 'fruit' array using 'Array.reverse()'`,\n given: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\\r`,\n answer: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const stiurf = fruits.reverse();\n return stiurf;`,\n tests: [\n {\n name: 'Correct output',\n test: `(assert.deepEqual(output, [\n 'banana',\n 'lemon',\n 'orange',\n 'strawberry'\n ]) === undefined);`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 4 items',\n test: `assert.lengthOf(output, 4) === undefined;`\n },\n {\n name: `First item is 'banana'`,\n test: `assert.deepEqual(output[0], 'banana') === undefined;`\n }\n ]\n },\n {\n name: 'Array.sort()',\n time: 10,\n prompt: `Return the 'fruits' Array after sorting them using 'Array.sort()'.`,\n given: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\\r`,\n answer: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const orderlyFruit = fruits.sort();\n return orderlyFruit;`,\n tests: [\n {\n name: 'Correct output',\n test: `(assert.deepEqual(output, [\n 'banana',\n 'lemon',\n 'orange',\n 'strawberry'\n ]) === undefined);`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 4 items',\n test: `assert.lengthOf(output, 4) === undefined;`\n },\n {\n name: `First item is 'banana'`,\n test: `assert.deepEqual(output[0], 'banana') === undefined;`\n }\n ]\n },\n {\n name: 'Array.lastIndexOf()',\n time: 10,\n prompt: `Return the index of the last 'peach' instance in the 'fruit' array using 'Array.lastIndexOf()'`,\n given: `const fruits = ['peach', 'orange', 'lemon', 'peach'];\\r`,\n answer: `const fruits = ['peach', 'orange', 'lemon', 'peach'];\n const wheresTheLastPeach = fruits.lastIndexOf('peach');\n return wheresTheLastPeach;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 3) === undefined;`\n },\n {\n name: 'Returns a Number',\n test: `assert.isNumber(output) === undefined;`\n }\n ]\n },\n {\n name: 'Array.filter()',\n time: 10,\n prompt: `Return an array of the numbers greater than 5 in 'numbers' using 'Array.filter()'`,\n given: `const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\\r`,\n answer: `const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\n const overFive = numbers.filter(num => num > 5);\n return overFive;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, [8, 13, 21]) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 3 items',\n test: `assert.lengthOf(output, 3) === undefined;`\n },\n {\n name: `First item is 8`,\n test: `assert.deepEqual(output[0], 8) === undefined;`\n }\n ]\n },\n {\n name: 'Array.map()',\n time: 10,\n prompt: `Return an array of 'numbers' array's square roots, using 'Array.map()' and 'Math.sqrt()'`,\n given: `const numbers = [25, 121, 169];\\r`,\n answer: `const numbers = [25, 121, 169];\n const roots = numbers.map(num => Math.sqrt(num));\n return roots;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, [5, 11, 13]) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 3 items',\n test: `assert.lengthOf(output, 3) === undefined;`\n },\n {\n name: `First item is 5`,\n test: `assert.deepEqual(output[0], 5) === undefined;`\n },\n {\n name: `Last item is 13`,\n test: `assert.deepEqual(output[output.length - 1], 13) === undefined;`\n }\n ]\n },\n {\n name: 'Array.every()',\n time: 10,\n prompt: `Return object that returns whether each array contains all even numbers using Array.every().`,\n given: `const evenNumbers = [2, 4, 6, 8];\n const someOddNumbers = [2, 5, 6, 8];\n function isEven(element) {\n \n }\n return {\n evenNumbers: evenNumbers.,\n someOddNumbers: someOddNumbers.\n };`,\n answer: `const evenNumbers = [2, 4, 6, 8];\n const someOddNumbers = [2, 5, 6, 8];\n function isEven(element) {\n return element % 2 === 0\n }\n return {\n evenNumbers: evenNumbers.every(isEven),\n someOddNumbers: someOddNumbers.every(isEven)\n };`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, {\n evenNumbers: true,\n someOddNumbers: false\n }) === undefined;`\n },\n {\n name: 'Returns an Object',\n test: `assert.isObject(output) === undefined;`\n },\n {\n name: 'Object has 2 items',\n test: `assert.lengthOf(Object.keys(output), 2) === undefined;`\n },\n {\n name: `First value is true`,\n test: `assert.isTrue(output.evenNumbers) === undefined;`\n },\n {\n name: `Second value is false`,\n test: `assert.isFalse(output.someOddNumbers) === undefined;`\n }\n ]\n },\n {\n name: 'Array.some()',\n time: 10,\n prompt: `Return 'Object' that returns whether each array contains some odd numbers using 'Array.some()'.`,\n given: `const evenNumbers = [2, 4, 6, 8];\n const someOddNumbers = [2, 4, 7, 8];\n function isOdd(element) {\n \n }\n return {\n evenNumbers: evenNumbers.,\n someOddNumbers: someOddNumbers.\n };`,\n answer: `const evenNumbers = [1, 3, 5, 7];\n const someOddNumbers = [1, 3, 6, 7];\n function isOdd(element) {\n return element % 2 !== 0;\n }\n return {\n evenNumbers: evenNumbers.some(isOdd),\n someOddNumbers: someOddNumbers.some(isOdd)\n };`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, {\n evenNumbers: false,\n someOddNumbers: true\n }) === undefined;`\n },\n {\n name: 'Returns an Object',\n test: `assert.isObject(output) === undefined;`\n },\n {\n name: 'Object has 2 items',\n test: `assert.lengthOf(Object.keys(output), 2) === undefined;`\n },\n {\n name: `First value is false`,\n test: `assert.isFalse(output.evenNumbers) === undefined;`\n },\n {\n name: `Second value is true`,\n test: `assert.isTrue(output.someOddNumbers) === undefined;`\n }\n ]\n }\n // Next problems to create:\n // forEach? fix one above that tried, but can't verify forEach was used\n // some\n // reduce\n // reduceRight\n // Array.from and other ways to turn array-like into array\n];\n","module.exports = [\n {\n name: 'Create Array',\n time: 10,\n prompt: 'Create and return an array that contains \\'apple\\' and \\'banana\\'',\n given: `const fruits = [];\\rreturn fruits;`,\n answer: `const fruits = ['apple', 'banana'];\n return fruits;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, ['apple', 'banana']) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 2 items',\n test: `assert.lengthOf(output, 2) === undefined;`\n }\n ]\n },\n {\n name: 'Array.pop()',\n time: 10,\n prompt: `Remove 'orange' from the end of the 'fruits' array and return 'fruits'.`,\n given: `const fruits = ['apple', 'banana', 'orange'];\\r`,\n answer: `const fruits = ['apple', 'banana', 'orange'];\n fruits.pop();\n return fruits;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, ['apple', 'banana']) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 2 items',\n test: `assert.lengthOf(output, 2) === undefined;`\n }\n ]\n }\n]\n","module.exports = require('./lib/type');\n","/*!\n * type-detect\n * Copyright(c) 2013 jake luer \n * MIT Licensed\n */\n\n/*!\n * Primary Exports\n */\n\nvar exports = module.exports = getType;\n\n/*!\n * Detectable javascript natives\n */\n\nvar natives = {\n '[object Array]': 'array'\n , '[object RegExp]': 'regexp'\n , '[object Function]': 'function'\n , '[object Arguments]': 'arguments'\n , '[object Date]': 'date'\n};\n\n/**\n * ### typeOf (obj)\n *\n * Use several different techniques to determine\n * the type of object being tested.\n *\n *\n * @param {Mixed} object\n * @return {String} object type\n * @api public\n */\n\nfunction getType (obj) {\n var str = Object.prototype.toString.call(obj);\n if (natives[str]) return natives[str];\n if (obj === null) return 'null';\n if (obj === undefined) return 'undefined';\n if (obj === Object(obj)) return 'object';\n return typeof obj;\n}\n\nexports.Library = Library;\n\n/**\n * ### Library\n *\n * Create a repository for custom type detection.\n *\n * ```js\n * var lib = new type.Library;\n * ```\n *\n */\n\nfunction Library () {\n this.tests = {};\n}\n\n/**\n * #### .of (obj)\n *\n * Expose replacement `typeof` detection to the library.\n *\n * ```js\n * if ('string' === lib.of('hello world')) {\n * // ...\n * }\n * ```\n *\n * @param {Mixed} object to test\n * @return {String} type\n */\n\nLibrary.prototype.of = getType;\n\n/**\n * #### .define (type, test)\n *\n * Add a test to for the `.test()` assertion.\n *\n * Can be defined as a regular expression:\n *\n * ```js\n * lib.define('int', /^[0-9]+$/);\n * ```\n *\n * ... or as a function:\n *\n * ```js\n * lib.define('bln', function (obj) {\n * if ('boolean' === lib.of(obj)) return true;\n * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ];\n * if ('string' === lib.of(obj)) obj = obj.toLowerCase();\n * return !! ~blns.indexOf(obj);\n * });\n * ```\n *\n * @param {String} type\n * @param {RegExp|Function} test\n * @api public\n */\n\nLibrary.prototype.define = function (type, test) {\n if (arguments.length === 1) return this.tests[type];\n this.tests[type] = test;\n return this;\n};\n\n/**\n * #### .test (obj, test)\n *\n * Assert that an object is of type. Will first\n * check natives, and if that does not pass it will\n * use the user defined custom tests.\n *\n * ```js\n * assert(lib.test('1', 'int'));\n * assert(lib.test('yes', 'bln'));\n * ```\n *\n * @param {Mixed} object\n * @param {String} type\n * @return {Boolean} result\n * @api public\n */\n\nLibrary.prototype.test = function (obj, type) {\n if (type === getType(obj)) return true;\n var test = this.tests[type];\n\n if (test && 'regexp' === getType(test)) {\n return test.test(obj);\n } else if (test && 'function' === getType(test)) {\n return test(obj);\n } else {\n throw new ReferenceError('Type test \"' + type + '\" not defined or invalid.');\n }\n};\n","/*!\n * type-detect\n * Copyright(c) 2013 jake luer \n * MIT Licensed\n */\n\n/*!\n * Primary Exports\n */\n\nvar exports = module.exports = getType;\n\n/**\n * ### typeOf (obj)\n *\n * Use several different techniques to determine\n * the type of object being tested.\n *\n *\n * @param {Mixed} object\n * @return {String} object type\n * @api public\n */\nvar objectTypeRegexp = /^\\[object (.*)\\]$/;\n\nfunction getType(obj) {\n var type = Object.prototype.toString.call(obj).match(objectTypeRegexp)[1].toLowerCase();\n // Let \"new String('')\" return 'object'\n if (typeof Promise === 'function' && obj instanceof Promise) return 'promise';\n // PhantomJS has type \"DOMWindow\" for null\n if (obj === null) return 'null';\n // PhantomJS has type \"DOMWindow\" for undefined\n if (obj === undefined) return 'undefined';\n return type;\n}\n\nexports.Library = Library;\n\n/**\n * ### Library\n *\n * Create a repository for custom type detection.\n *\n * ```js\n * var lib = new type.Library;\n * ```\n *\n */\n\nfunction Library() {\n if (!(this instanceof Library)) return new Library();\n this.tests = {};\n}\n\n/**\n * #### .of (obj)\n *\n * Expose replacement `typeof` detection to the library.\n *\n * ```js\n * if ('string' === lib.of('hello world')) {\n * // ...\n * }\n * ```\n *\n * @param {Mixed} object to test\n * @return {String} type\n */\n\nLibrary.prototype.of = getType;\n\n/**\n * #### .define (type, test)\n *\n * Add a test to for the `.test()` assertion.\n *\n * Can be defined as a regular expression:\n *\n * ```js\n * lib.define('int', /^[0-9]+$/);\n * ```\n *\n * ... or as a function:\n *\n * ```js\n * lib.define('bln', function (obj) {\n * if ('boolean' === lib.of(obj)) return true;\n * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ];\n * if ('string' === lib.of(obj)) obj = obj.toLowerCase();\n * return !! ~blns.indexOf(obj);\n * });\n * ```\n *\n * @param {String} type\n * @param {RegExp|Function} test\n * @api public\n */\n\nLibrary.prototype.define = function(type, test) {\n if (arguments.length === 1) return this.tests[type];\n this.tests[type] = test;\n return this;\n};\n\n/**\n * #### .test (obj, test)\n *\n * Assert that an object is of type. Will first\n * check natives, and if that does not pass it will\n * use the user defined custom tests.\n *\n * ```js\n * assert(lib.test('1', 'int'));\n * assert(lib.test('yes', 'bln'));\n * ```\n *\n * @param {Mixed} object\n * @param {String} type\n * @return {Boolean} result\n * @api public\n */\n\nLibrary.prototype.test = function(obj, type) {\n if (type === getType(obj)) return true;\n var test = this.tests[type];\n\n if (test && 'regexp' === getType(test)) {\n return test.test(obj);\n } else if (test && 'function' === getType(test)) {\n return test(obj);\n } else {\n throw new ReferenceError('Type test \"' + type + '\" not defined or invalid.');\n }\n};\n","(function (document, window) {\n // DEPENDENCIES\n // ============================================================\n const probs = require('pjs-problems');\n const dedent = require('dedent');\n const assert = require('chai').assert;\n\n // PROBLEM TEMPLATE NICE-IFICATION\n // ============================================================\n\n function dedentStrings(problems) {\n return problems.map(prob => {\n prob.given = dedent(prob.given)\n prob.answer = dedent(prob.answer)\n return prob\n });\n }\n\n\n // PROBLEMS\n // ============================================================\n\n let problems = [];\n Object.keys(probs).forEach(subject => {\n problems.push(...probs[subject]);\n });\n problems = dedentStrings(problems);\n\n\n // CONFIG\n // ============================================================\n\n // Hoist current problem\n let currentProblem;\n\n // Keys to ignore while user is navigating around the textarea but not changing any code\n const ignoreKeyCodes = [\n 9, // Tab\n 37, // Left arrow\n 39, // Right arrow\n 38, // Up arrow\n 40 // Down arrow\n ];\n\n let config = {\n shuffle: true,\n timer: false,\n currentIndex: 0\n };\n\n let state = {\n currentProblem: getCurrentProblem(problems)\n }\n\n\n // HELPERS\n // ============================================================\n\n function debounce(func, wait, immediate) {\n let timeout;\n return function () {\n const context = this;\n const args = arguments;\n const later = function () {\n timeout = null;\n if (!immediate) {\n func.apply(context, args);\n }\n };\n const callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) {\n func.apply(context, args);\n }\n };\n }\n\n // UI\n // ============================================================\n\n // elements\n const problemEl = document.getElementById('problem');\n const codeEl = document.getElementById('code');\n const testSuiteEl = document.getElementById('test-suite');\n const testTotalEl = document.getElementById('test-total');\n const evalConsoleEl = document.getElementById('eval-output');\n const assertConsoleEl = document.getElementById('assert-output');\n const shuffleProblemsButtonEl = document.getElementById('shuffle-problems');\n const previousProblemButtonEl = document.getElementById('prev-problem');\n const nextProblemButtonEl = document.getElementById('next-problem');\n\n // LOCALSTORE\n // --------------------------------------------------------------------------------\n\n // Pull config from localstorage\n if (window.localStorage) {\n const localConfig = localStorage.getItem('js_practice_config');\n if (localConfig) {\n try {\n config = JSON.parse(localConfig);\n loadApp(config);\n } catch (err) {\n console.log('LOCAL_CONFIG PARSE ERR:', err);\n }\n } else {\n console.log('LOCAL_CONFIG: No local config');\n loadApp(config);\n }\n }\n\n function updateLocalstore(config) {\n return new Promise((resolve, reject) => {\n if (window.localStorage) {\n localStorage.setItem('js_practice_config', JSON.stringify(config));\n console.log('Saved config: ', config);\n resolve();\n } else {\n reject();\n }\n });\n }\n\n // Get indexes\n function getRandomIndex(problemsArr) {\n const ind = Math.floor(Math.random() * problemsArr.length);\n config.currentIndex = ind;\n updateLocalstore(config);\n return ind;\n }\n\n function getPreviousIndex(problemsArr) {\n let probInd;\n const currentIndex = config.currentIndex;\n // If at beginning, go to end\n if (currentIndex === 0) {\n probInd = problemsArr.length - 1;\n } else {\n probInd = currentIndex - 1;\n }\n return probInd;\n }\n\n function getNextIndex(problemsArr) {\n let probInd;\n const currentIndex = config.currentIndex;\n // If at end or invalid, restart series\n if (currentIndex >= problemsArr.length - 1 || currentIndex < 0) {\n probInd = 0;\n } else {\n probInd = currentIndex + 1;\n }\n return probInd;\n }\n\n // Get problems\n function getCurrentProblem(problemsArr) {\n return problemsArr[config.currentIndex];\n }\n\n function previousProblem() {\n console.log('previousProblem!');\n // Activate back button, for visual queue of nav feedback\n previousProblemButtonEl.classList.add('active');\n config.currentIndex = config.shuffle\n ? getRandomIndex(problems)\n : getPreviousIndex(problems);\n updateLocalstore(config).then(() => {\n window.location.reload();\n });\n }\n\n function nextProblem() {\n console.log('nextProblem!');\n // Activate next button, for visual queue of nav feedback\n nextProblemButtonEl.classList.add('active');\n config.currentIndex = config.shuffle\n ? getRandomIndex(problems)\n : getNextIndex(problems);\n updateLocalstore(config).then(() => {\n window.location.reload();\n });\n }\n\n function toggleShuffle() {\n console.log('toggle shuffle!');\n config.shuffle = !config.shuffle; // Flip it\n shuffleProblemsButtonEl.classList.toggle('active');\n previousProblemButtonEl.parentNode.classList.toggle('hidden');\n updateLocalstore(config);\n }\n\n function loadProblem(problemObj) {\n state.currentProblem = problemObj;\n // Prob question\n problemEl.innerText = problemObj.prompt;\n // Prob given code\n if (problemObj.given) {\n codeEl.value = problemObj.given;\n }\n // Seed the tests, pass (init = true) as second param\n testSuite(null, true);\n }\n\n // TODO: Build the assert errors into the test dom on each update.\n function updateTests(testStatus, init) {\n if (init === true) {\n buildTests(state.currentProblem.tests);\n }\n updateTestStatus(testStatus);\n }\n\n function buildTests(tests) {\n if (tests) {\n const testsDom = tests\n .map(test => {\n return `
\n
[✘]
\n
${test.name}
\n
`;\n })\n .join('');\n testSuiteEl.innerHTML = testsDom;\n }\n }\n\n function updateTestStatus(testStatuses) {\n if (!testStatuses) {\n throw new Error('No testStatuses provided.');\n }\n // Find out if all tests have passed or not\n let allPassed = true;\n testStatuses.forEach(testPassed => {\n if (testPassed !== true) {\n allPassed = false;\n }\n });\n const testEls = [].slice.call(testSuiteEl.querySelectorAll('.test-state'));\n testEls.forEach((testStatusEl, iter) => {\n if (testStatuses[iter] === true) {\n testStatusEl.innerHTML = '[✓]';\n testStatusEl.classList.remove('fail');\n testStatusEl.classList.add('pass');\n } else {\n testStatusEl.innerHTML = '[✘]';\n testStatusEl.classList.remove('pass');\n testStatusEl.classList.add('fail');\n }\n });\n\n if (allPassed === true) {\n testTotalEl.innerText = 'PASS';\n testTotalEl.classList.remove('fail');\n testTotalEl.classList.add('pass');\n } else {\n testTotalEl.innerText = 'FAIL';\n testTotalEl.classList.remove('pass');\n testTotalEl.classList.add('fail');\n }\n }\n\n function printAssertError(errObj) {\n // Make element string\n let inner = '';\n if (errObj !== null) {\n inner = `\n
\n Expected: ${JSON.stringify(errObj.expected)}\n Actual: ${JSON.stringify(errObj.actual)}\n
`;\n }\n\n // Prepend element\n assertConsoleEl.innerHTML = inner;\n }\n\n function printEvalOutput(errObj, output) {\n // Make element string\n let inner = '';\n if (errObj && errObj.message !== undefined) {\n inner = `\n
\n Syntax Error: ${JSON.stringify(errObj.message)}\n
`;\n } else if (output) {\n inner = `\n
\n Output: ${JSON.stringify(output)}\n
`;\n }\n // Prepend element\n evalConsoleEl.innerHTML = inner;\n }\n\n\n // VERIFICATION LOGIC\n // ============================================================\n\n function testSuite(init) {\n // Show 'working' indicator\n testTotalEl.classList.toggle('working');\n // Run stuff\n const output = getOutput(codeEl.value);\n // Run tests on code, return object/array of test results\n const tested = runTests(output);\n // Hide 'working' indicator\n testTotalEl.classList.toggle('working');\n // Update UI with results\n updateTests(tested, init);\n }\n\n function getOutput(code) {\n let evald = false;\n try {\n evald = eval(`(function(){${code}})()`); // eslint-disable-line no-eval\n printEvalOutput(null, evald); // Print current output\n } catch (err) {\n printEvalOutput(err);\n }\n return evald;\n }\n\n function runTests(output) {\n let tested = false;\n tested = state.currentProblem.tests.map(test => {\n let testOutcome = false;\n try {\n if (output) {\n testOutcome = eval(test.test);\n }\n printAssertError(null);\n } catch (err) {\n printAssertError(err);\n }\n return testOutcome;\n });\n return tested;\n }\n\n // Wrapped to prevent race with local config retrieval\n function loadApp(config) {\n console.log('loading app!');\n\n // Show current toggle state\n if (config.shuffle === true) {\n shuffleProblemsButtonEl.classList.add('active');\n previousProblemButtonEl.parentNode.classList.add('hidden');\n }\n\n // Keybinding stuff\n // ============================================================\n\n // Debounced code validation\n const debouncedInputValidation = debounce(e => {\n // If not arrow keys or other non-character keys\n if (ignoreKeyCodes.indexOf(e.keyCode) === -1) {\n // Run test suite\n testSuite();\n }\n }, 200);\n\n function problemNav(e) {\n // Go to previous problem keybinding\n // If CMD/CTRL + SHIFT + RETURN/ENTER\n if (config.shuffle === false && e.keyCode === 13 && e.shiftKey && (e.metaKey || e.ctrlKey)) {\n // Go to next problem\n previousProblem();\n } else if (e.keyCode === 13 && !e.shiftKey && (e.metaKey || e.ctrlKey)) {\n // Go to next problem keybinding\n // If CMD/CTRL + RETURN/ENTER\n // Go to next problem\n nextProblem();\n }\n }\n\n // Event Bindings\n // ============================================================\n\n // Bind it up\n codeEl.addEventListener('keydown', debouncedInputValidation);\n document.addEventListener('keydown', problemNav);\n shuffleProblemsButtonEl.addEventListener('click', toggleShuffle);\n previousProblemButtonEl.addEventListener('click', previousProblem);\n nextProblemButtonEl.addEventListener('click', nextProblem);\n\n // Start it up!\n // Load current problem\n const currProb = getCurrentProblem(problems);\n loadProblem(currProb);\n // Initalized test suite with starting failures\n testSuite(true);\n }\n})(document, window);\n"]} \ No newline at end of file +{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/assertion-error/index.js","node_modules/chai/index.js","node_modules/chai/lib/chai.js","node_modules/chai/lib/chai/assertion.js","node_modules/chai/lib/chai/config.js","node_modules/chai/lib/chai/core/assertions.js","node_modules/chai/lib/chai/interface/assert.js","node_modules/chai/lib/chai/interface/expect.js","node_modules/chai/lib/chai/interface/should.js","node_modules/chai/lib/chai/utils/addChainableMethod.js","node_modules/chai/lib/chai/utils/addMethod.js","node_modules/chai/lib/chai/utils/addProperty.js","node_modules/chai/lib/chai/utils/expectTypes.js","node_modules/chai/lib/chai/utils/flag.js","node_modules/chai/lib/chai/utils/getActual.js","node_modules/chai/lib/chai/utils/getEnumerableProperties.js","node_modules/chai/lib/chai/utils/getMessage.js","node_modules/chai/lib/chai/utils/getName.js","node_modules/chai/lib/chai/utils/getPathInfo.js","node_modules/chai/lib/chai/utils/getPathValue.js","node_modules/chai/lib/chai/utils/getProperties.js","node_modules/chai/lib/chai/utils/hasProperty.js","node_modules/chai/lib/chai/utils/index.js","node_modules/chai/lib/chai/utils/inspect.js","node_modules/chai/lib/chai/utils/objDisplay.js","node_modules/chai/lib/chai/utils/overwriteChainableMethod.js","node_modules/chai/lib/chai/utils/overwriteMethod.js","node_modules/chai/lib/chai/utils/overwriteProperty.js","node_modules/chai/lib/chai/utils/test.js","node_modules/chai/lib/chai/utils/transferFlags.js","node_modules/dedent/dist/dedent.js","node_modules/deep-eql/index.js","node_modules/deep-eql/lib/eql.js","node_modules/deep-eql/node_modules/type-detect/index.js","node_modules/deep-eql/node_modules/type-detect/lib/type.js","node_modules/pjs-problems/es5/problems/arrays.js","node_modules/pjs-problems/es5/problems/initial.js","node_modules/pjs-problems/index.js","node_modules/pjs-problems/problems/arrays.js","node_modules/pjs-problems/problems/initial.js","node_modules/type-detect/lib/type.js","src/js/index.js"],"names":["e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length","1","module","exclude","excludeProps","res","obj","Object","keys","forEach","key","excludes","indexOf","slice","arguments","args","AssertionError","message","_props","ssf","props","this","showDiff","callee","captureStackTrace","stack","prototype","create","name","constructor","toJSON","used","version","util","use","fn","push","config","assertion","core","expect","should","assert","_chai","Assertion","msg","flag","defineProperty","get","console","warn","includeStack","set","value","addProperty","addMethod","addChainableMethod","chainingBehavior","overwriteProperty","overwriteMethod","overwriteChainableMethod","expr","negateMsg","expected","_actual","ok","test","getMessage","actual","getActual","val","truncateThreshold","chai","_","an","type","toLowerCase","article","charAt","includeChainingBehavior","include","expectTypes","eql","k","property","subset","undefined","inspect","checkArguments","toString","assertEqual","_obj","assertEql","assertAbove","to","have","len","assertLeast","assertBelow","assertMost","assertInstanceOf","getName","assertOwnProperty","hasOwnProperty","assertOwnPropertyDescriptor","descriptor","actualDescriptor","getOwnPropertyDescriptor","assertLengthChain","assertLength","assertMatch","re","exec","assertKeys","str","mixedArgsMsg","Array","any","all","filter","every","last","map","pop","join","sort","assertThrows","errMsg","is","thrown","desiredError","thrownError","RegExp","err","actuallyGot","expectedThrown","respondTo","method","itself","context","satisfy","matcher","result","objDisplay","negate","closeTo","delta","Math","abs","isSubsetOf","superset","cmp","elem","some","elem2","oneOf","list","be","assertChanges","object","prop","initial","assertIncreases","assertDecreases","chain","isNaN","isArray","start","finish","range","isDeep","pathInfo","getPathInfo","hasProperty","exists","isExtensible","TypeError","isSealed","isFrozen","express","errmsg","fail","operator","isOk","isNotOk","not","equal","act","exp","notEqual","strictEqual","notStrictEqual","deepEqual","notDeepEqual","isAbove","abv","above","isAtLeast","atlst","least","isBelow","blw","below","isAtMost","atmst","most","isTrue","isNotTrue","isFalse","isNotFalse","isNull","isNotNull","NaN","isNotNaN","isUndefined","isDefined","isFunction","isNotFunction","isObject","isNotObject","isNotArray","isString","isNotString","isNumber","isNotNumber","isBoolean","isNotBoolean","typeOf","notTypeOf","instanceOf","notInstanceOf","inc","notInclude","match","notMatch","notProperty","deepProperty","deep","notDeepProperty","propertyVal","propertyNotVal","deepPropertyVal","deepPropertyNotVal","lengthOf","throws","errt","errs","assertErr","throw","doesNotThrow","Throw","val2","approximately","sameMembers","set1","set2","same","members","sameDeepMembers","includeMembers","includeDeepMembers","inList","changes","change","doesNotChange","increases","increase","doesNotIncrease","decreases","decrease","doesNotDecrease","ifError","extensible","isNotExtensible","sealed","isNotSealed","frozen","isNotFrozen","alias","as","loadShould","shouldGetter","String","Number","Boolean","valueOf","shouldSetter","enumerable","configurable","writable","val1","exist","Should","transferFlags","hasProtoSupport","excludeNames","Function","apply","ctx","chainableBehavior","__methods","__proto__","getOwnPropertyNames","asserterName","pd","getter","types","index","art","flags","__flags","flagMsg","replace","func","parsePath","path","mArr","parseFloat","p","_getPathValue","parsed","tmp","part","info","parent","proto","getPrototypeOf","literals","number","string","ot","getPathValue","showHidden","depth","colors","formatValue","seen","stylize","recurseTimes","ret","primitive","formatPrimitive","isDOMElement","outerHTML","document","xmlVersion","XMLSerializer","serializeToString","container","createElementNS","appendChild","cloneNode","html","innerHTML","visibleKeys","getEnumerableProperties","getProperties","isError","nameSuffix","isRegExp","isDate","Date","toUTCString","formatError","base","array","braces","output","formatArray","formatProperty","reduceToSingleString","simple","JSON","stringify","Infinity","__lookupGetter__","__lookupSetter__","split","line","substr","numLinesEst","reduce","prev","cur","ar","objectToString","d","HTMLElement","nodeType","nodeName","splice","_chainingBehavior","_method","_super","_get","includeAll","dedent","strings","raw","lines","mindent","m","indent","min","trim","b","sameValue","dateEqual","regexpEqual","Buffer","isBuffer","bufferEqual","argumentsEqual","typeEqual","objectEqual","getTime","iterableEqual","isValue","ka","kb","ex","getType","natives","Library","tests","[object Array]","[object RegExp]","[object Function]","[object Arguments]","[object Date]","of","define","ReferenceError","time","prompt","given","answer","normal","arrays","es5","initialES5","arraysES5","default","objectTypeRegexp","Promise","window","dedentStrings","problems","prob","debounce","wait","immediate","timeout","later","callNow","clearTimeout","setTimeout","updateLocalstore","resolve","reject","localStorage","setItem","log","getRandomIndex","problemsArr","ind","floor","random","currentIndex","getPreviousIndex","getNextIndex","getCurrentProblem","previousProblem","previousProblemButtonEl","classList","add","shuffle","then","location","reload","nextProblem","nextProblemButtonEl","toggleShuffle","shuffleProblemsButtonEl","toggle","parentNode","loadProblem","problemObj","state","currentProblem","problemEl","innerText","codeEl","testSuite","updateTests","testStatus","init","buildTests","updateTestStatus","testsDom","testSuiteEl","testStatuses","allPassed","testPassed","querySelectorAll","testStatusEl","iter","remove","testTotalEl","printAssertError","errObj","inner","assertConsoleEl","printEvalOutput","evalConsoleEl","tested","runTests","getOutput","evald","eval","testOutcome","loadApp","problemNav","keyCode","shiftKey","metaKey","ctrlKey","debouncedInputValidation","ignoreKeyCodes","addEventListener","probs","subject","_problems","_toConsumableArray","timer","getElementById","localConfig","getItem","parse"],"mappings":"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","file":"bundle.min.js","sourcesContent":["(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\n * MIT Licensed\n */\n\n/*!\n * Return a function that will copy properties from\n * one object to another excluding any originally\n * listed. Returned function will create a new `{}`.\n *\n * @param {String} excluded properties ...\n * @return {Function}\n */\n\nfunction exclude () {\n var excludes = [].slice.call(arguments);\n\n function excludeProps (res, obj) {\n Object.keys(obj).forEach(function (key) {\n if (!~excludes.indexOf(key)) res[key] = obj[key];\n });\n }\n\n return function extendExclude () {\n var args = [].slice.call(arguments)\n , i = 0\n , res = {};\n\n for (; i < args.length; i++) {\n excludeProps(res, args[i]);\n }\n\n return res;\n };\n};\n\n/*!\n * Primary Exports\n */\n\nmodule.exports = AssertionError;\n\n/**\n * ### AssertionError\n *\n * An extension of the JavaScript `Error` constructor for\n * assertion and validation scenarios.\n *\n * @param {String} message\n * @param {Object} properties to include (optional)\n * @param {callee} start stack function (optional)\n */\n\nfunction AssertionError (message, _props, ssf) {\n var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON')\n , props = extend(_props || {});\n\n // default values\n this.message = message || 'Unspecified AssertionError';\n this.showDiff = false;\n\n // copy from properties\n for (var key in props) {\n this[key] = props[key];\n }\n\n // capture stack trace\n ssf = ssf || arguments.callee;\n if (ssf && Error.captureStackTrace) {\n Error.captureStackTrace(this, ssf);\n } else {\n try {\n throw new Error();\n } catch(e) {\n this.stack = e.stack;\n }\n }\n}\n\n/*!\n * Inherit from Error.prototype\n */\n\nAssertionError.prototype = Object.create(Error.prototype);\n\n/*!\n * Statically set name\n */\n\nAssertionError.prototype.name = 'AssertionError';\n\n/*!\n * Ensure correct constructor\n */\n\nAssertionError.prototype.constructor = AssertionError;\n\n/**\n * Allow errors to be converted to JSON for static transfer.\n *\n * @param {Boolean} include stack (default: `true`)\n * @return {Object} object that can be `JSON.stringify`\n */\n\nAssertionError.prototype.toJSON = function (stack) {\n var extend = exclude('constructor', 'toJSON', 'stack')\n , props = extend({ name: this.name }, this);\n\n // include stack if exists and not turned off\n if (false !== stack && this.stack) {\n props.stack = this.stack;\n }\n\n return props;\n};\n","module.exports = require('./lib/chai');\n","/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nvar used = []\n , exports = module.exports = {};\n\n/*!\n * Chai version\n */\n\nexports.version = '3.5.0';\n\n/*!\n * Assertion Error\n */\n\nexports.AssertionError = require('assertion-error');\n\n/*!\n * Utils for plugins (not exported)\n */\n\nvar util = require('./chai/utils');\n\n/**\n * # .use(function)\n *\n * Provides a way to extend the internals of Chai\n *\n * @param {Function}\n * @returns {this} for chaining\n * @api public\n */\n\nexports.use = function (fn) {\n if (!~used.indexOf(fn)) {\n fn(this, util);\n used.push(fn);\n }\n\n return this;\n};\n\n/*!\n * Utility Functions\n */\n\nexports.util = util;\n\n/*!\n * Configuration\n */\n\nvar config = require('./chai/config');\nexports.config = config;\n\n/*!\n * Primary `Assertion` prototype\n */\n\nvar assertion = require('./chai/assertion');\nexports.use(assertion);\n\n/*!\n * Core Assertions\n */\n\nvar core = require('./chai/core/assertions');\nexports.use(core);\n\n/*!\n * Expect interface\n */\n\nvar expect = require('./chai/interface/expect');\nexports.use(expect);\n\n/*!\n * Should interface\n */\n\nvar should = require('./chai/interface/should');\nexports.use(should);\n\n/*!\n * Assert interface\n */\n\nvar assert = require('./chai/interface/assert');\nexports.use(assert);\n","/*!\n * chai\n * http://chaijs.com\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nvar config = require('./config');\n\nmodule.exports = function (_chai, util) {\n /*!\n * Module dependencies.\n */\n\n var AssertionError = _chai.AssertionError\n , flag = util.flag;\n\n /*!\n * Module export.\n */\n\n _chai.Assertion = Assertion;\n\n /*!\n * Assertion Constructor\n *\n * Creates object for chaining.\n *\n * @api private\n */\n\n function Assertion (obj, msg, stack) {\n flag(this, 'ssfi', stack || arguments.callee);\n flag(this, 'object', obj);\n flag(this, 'message', msg);\n }\n\n Object.defineProperty(Assertion, 'includeStack', {\n get: function() {\n console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');\n return config.includeStack;\n },\n set: function(value) {\n console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');\n config.includeStack = value;\n }\n });\n\n Object.defineProperty(Assertion, 'showDiff', {\n get: function() {\n console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');\n return config.showDiff;\n },\n set: function(value) {\n console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');\n config.showDiff = value;\n }\n });\n\n Assertion.addProperty = function (name, fn) {\n util.addProperty(this.prototype, name, fn);\n };\n\n Assertion.addMethod = function (name, fn) {\n util.addMethod(this.prototype, name, fn);\n };\n\n Assertion.addChainableMethod = function (name, fn, chainingBehavior) {\n util.addChainableMethod(this.prototype, name, fn, chainingBehavior);\n };\n\n Assertion.overwriteProperty = function (name, fn) {\n util.overwriteProperty(this.prototype, name, fn);\n };\n\n Assertion.overwriteMethod = function (name, fn) {\n util.overwriteMethod(this.prototype, name, fn);\n };\n\n Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) {\n util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior);\n };\n\n /**\n * ### .assert(expression, message, negateMessage, expected, actual, showDiff)\n *\n * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass.\n *\n * @name assert\n * @param {Philosophical} expression to be tested\n * @param {String|Function} message or function that returns message to display if expression fails\n * @param {String|Function} negatedMessage or function that returns negatedMessage to display if negated expression fails\n * @param {Mixed} expected value (remember to check for negation)\n * @param {Mixed} actual (optional) will default to `this.obj`\n * @param {Boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails\n * @api private\n */\n\n Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) {\n var ok = util.test(this, arguments);\n if (true !== showDiff) showDiff = false;\n if (true !== config.showDiff) showDiff = false;\n\n if (!ok) {\n var msg = util.getMessage(this, arguments)\n , actual = util.getActual(this, arguments);\n throw new AssertionError(msg, {\n actual: actual\n , expected: expected\n , showDiff: showDiff\n }, (config.includeStack) ? this.assert : flag(this, 'ssfi'));\n }\n };\n\n /*!\n * ### ._obj\n *\n * Quick reference to stored `actual` value for plugin developers.\n *\n * @api private\n */\n\n Object.defineProperty(Assertion.prototype, '_obj',\n { get: function () {\n return flag(this, 'object');\n }\n , set: function (val) {\n flag(this, 'object', val);\n }\n });\n};\n","module.exports = {\n\n /**\n * ### config.includeStack\n *\n * User configurable property, influences whether stack trace\n * is included in Assertion error message. Default of false\n * suppresses stack trace in the error message.\n *\n * chai.config.includeStack = true; // enable stack on error\n *\n * @param {Boolean}\n * @api public\n */\n\n includeStack: false,\n\n /**\n * ### config.showDiff\n *\n * User configurable property, influences whether or not\n * the `showDiff` flag should be included in the thrown\n * AssertionErrors. `false` will always be `false`; `true`\n * will be true when the assertion has requested a diff\n * be shown.\n *\n * @param {Boolean}\n * @api public\n */\n\n showDiff: true,\n\n /**\n * ### config.truncateThreshold\n *\n * User configurable property, sets length threshold for actual and\n * expected values in assertion errors. If this threshold is exceeded, for\n * example for large data structures, the value is replaced with something\n * like `[ Array(3) ]` or `{ Object (prop1, prop2) }`.\n *\n * Set it to zero if you want to disable truncating altogether.\n *\n * This is especially userful when doing assertions on arrays: having this\n * set to a reasonable large value makes the failure messages readily\n * inspectable.\n *\n * chai.config.truncateThreshold = 0; // disable truncating\n *\n * @param {Number}\n * @api public\n */\n\n truncateThreshold: 40\n\n};\n","/*!\n * chai\n * http://chaijs.com\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nmodule.exports = function (chai, _) {\n var Assertion = chai.Assertion\n , toString = Object.prototype.toString\n , flag = _.flag;\n\n /**\n * ### Language Chains\n *\n * The following are provided as chainable getters to\n * improve the readability of your assertions. They\n * do not provide testing capabilities unless they\n * have been overwritten by a plugin.\n *\n * **Chains**\n *\n * - to\n * - be\n * - been\n * - is\n * - that\n * - which\n * - and\n * - has\n * - have\n * - with\n * - at\n * - of\n * - same\n *\n * @name language chains\n * @namespace BDD\n * @api public\n */\n\n [ 'to', 'be', 'been'\n , 'is', 'and', 'has', 'have'\n , 'with', 'that', 'which', 'at'\n , 'of', 'same' ].forEach(function (chain) {\n Assertion.addProperty(chain, function () {\n return this;\n });\n });\n\n /**\n * ### .not\n *\n * Negates any of assertions following in the chain.\n *\n * expect(foo).to.not.equal('bar');\n * expect(goodFn).to.not.throw(Error);\n * expect({ foo: 'baz' }).to.have.property('foo')\n * .and.not.equal('bar');\n *\n * @name not\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('not', function () {\n flag(this, 'negate', true);\n });\n\n /**\n * ### .deep\n *\n * Sets the `deep` flag, later used by the `equal` and\n * `property` assertions.\n *\n * expect(foo).to.deep.equal({ bar: 'baz' });\n * expect({ foo: { bar: { baz: 'quux' } } })\n * .to.have.deep.property('foo.bar.baz', 'quux');\n *\n * `.deep.property` special characters can be escaped\n * by adding two slashes before the `.` or `[]`.\n *\n * var deepCss = { '.link': { '[target]': 42 }};\n * expect(deepCss).to.have.deep.property('\\\\.link.\\\\[target\\\\]', 42);\n *\n * @name deep\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('deep', function () {\n flag(this, 'deep', true);\n });\n\n /**\n * ### .any\n *\n * Sets the `any` flag, (opposite of the `all` flag)\n * later used in the `keys` assertion.\n *\n * expect(foo).to.have.any.keys('bar', 'baz');\n *\n * @name any\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('any', function () {\n flag(this, 'any', true);\n flag(this, 'all', false)\n });\n\n\n /**\n * ### .all\n *\n * Sets the `all` flag (opposite of the `any` flag)\n * later used by the `keys` assertion.\n *\n * expect(foo).to.have.all.keys('bar', 'baz');\n *\n * @name all\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('all', function () {\n flag(this, 'all', true);\n flag(this, 'any', false);\n });\n\n /**\n * ### .a(type)\n *\n * The `a` and `an` assertions are aliases that can be\n * used either as language chains or to assert a value's\n * type.\n *\n * // typeof\n * expect('test').to.be.a('string');\n * expect({ foo: 'bar' }).to.be.an('object');\n * expect(null).to.be.a('null');\n * expect(undefined).to.be.an('undefined');\n * expect(new Error).to.be.an('error');\n * expect(new Promise).to.be.a('promise');\n * expect(new Float32Array()).to.be.a('float32array');\n * expect(Symbol()).to.be.a('symbol');\n *\n * // es6 overrides\n * expect({[Symbol.toStringTag]:()=>'foo'}).to.be.a('foo');\n *\n * // language chain\n * expect(foo).to.be.an.instanceof(Foo);\n *\n * @name a\n * @alias an\n * @param {String} type\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function an (type, msg) {\n if (msg) flag(this, 'message', msg);\n type = type.toLowerCase();\n var obj = flag(this, 'object')\n , article = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(type.charAt(0)) ? 'an ' : 'a ';\n\n this.assert(\n type === _.type(obj)\n , 'expected #{this} to be ' + article + type\n , 'expected #{this} not to be ' + article + type\n );\n }\n\n Assertion.addChainableMethod('an', an);\n Assertion.addChainableMethod('a', an);\n\n /**\n * ### .include(value)\n *\n * The `include` and `contain` assertions can be used as either property\n * based language chains or as methods to assert the inclusion of an object\n * in an array or a substring in a string. When used as language chains,\n * they toggle the `contains` flag for the `keys` assertion.\n *\n * expect([1,2,3]).to.include(2);\n * expect('foobar').to.contain('foo');\n * expect({ foo: 'bar', hello: 'universe' }).to.include.keys('foo');\n *\n * @name include\n * @alias contain\n * @alias includes\n * @alias contains\n * @param {Object|String|Number} obj\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function includeChainingBehavior () {\n flag(this, 'contains', true);\n }\n\n function include (val, msg) {\n _.expectTypes(this, ['array', 'object', 'string']);\n\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n var expected = false;\n\n if (_.type(obj) === 'array' && _.type(val) === 'object') {\n for (var i in obj) {\n if (_.eql(obj[i], val)) {\n expected = true;\n break;\n }\n }\n } else if (_.type(val) === 'object') {\n if (!flag(this, 'negate')) {\n for (var k in val) new Assertion(obj).property(k, val[k]);\n return;\n }\n var subset = {};\n for (var k in val) subset[k] = obj[k];\n expected = _.eql(subset, val);\n } else {\n expected = (obj != undefined) && ~obj.indexOf(val);\n }\n this.assert(\n expected\n , 'expected #{this} to include ' + _.inspect(val)\n , 'expected #{this} to not include ' + _.inspect(val));\n }\n\n Assertion.addChainableMethod('include', include, includeChainingBehavior);\n Assertion.addChainableMethod('contain', include, includeChainingBehavior);\n Assertion.addChainableMethod('contains', include, includeChainingBehavior);\n Assertion.addChainableMethod('includes', include, includeChainingBehavior);\n\n /**\n * ### .ok\n *\n * Asserts that the target is truthy.\n *\n * expect('everything').to.be.ok;\n * expect(1).to.be.ok;\n * expect(false).to.not.be.ok;\n * expect(undefined).to.not.be.ok;\n * expect(null).to.not.be.ok;\n *\n * @name ok\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('ok', function () {\n this.assert(\n flag(this, 'object')\n , 'expected #{this} to be truthy'\n , 'expected #{this} to be falsy');\n });\n\n /**\n * ### .true\n *\n * Asserts that the target is `true`.\n *\n * expect(true).to.be.true;\n * expect(1).to.not.be.true;\n *\n * @name true\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('true', function () {\n this.assert(\n true === flag(this, 'object')\n , 'expected #{this} to be true'\n , 'expected #{this} to be false'\n , this.negate ? false : true\n );\n });\n\n /**\n * ### .false\n *\n * Asserts that the target is `false`.\n *\n * expect(false).to.be.false;\n * expect(0).to.not.be.false;\n *\n * @name false\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('false', function () {\n this.assert(\n false === flag(this, 'object')\n , 'expected #{this} to be false'\n , 'expected #{this} to be true'\n , this.negate ? true : false\n );\n });\n\n /**\n * ### .null\n *\n * Asserts that the target is `null`.\n *\n * expect(null).to.be.null;\n * expect(undefined).to.not.be.null;\n *\n * @name null\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('null', function () {\n this.assert(\n null === flag(this, 'object')\n , 'expected #{this} to be null'\n , 'expected #{this} not to be null'\n );\n });\n\n /**\n * ### .undefined\n *\n * Asserts that the target is `undefined`.\n *\n * expect(undefined).to.be.undefined;\n * expect(null).to.not.be.undefined;\n *\n * @name undefined\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('undefined', function () {\n this.assert(\n undefined === flag(this, 'object')\n , 'expected #{this} to be undefined'\n , 'expected #{this} not to be undefined'\n );\n });\n\n /**\n * ### .NaN\n * Asserts that the target is `NaN`.\n *\n * expect('foo').to.be.NaN;\n * expect(4).not.to.be.NaN;\n *\n * @name NaN\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('NaN', function () {\n this.assert(\n isNaN(flag(this, 'object'))\n , 'expected #{this} to be NaN'\n , 'expected #{this} not to be NaN'\n );\n });\n\n /**\n * ### .exist\n *\n * Asserts that the target is neither `null` nor `undefined`.\n *\n * var foo = 'hi'\n * , bar = null\n * , baz;\n *\n * expect(foo).to.exist;\n * expect(bar).to.not.exist;\n * expect(baz).to.not.exist;\n *\n * @name exist\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('exist', function () {\n this.assert(\n null != flag(this, 'object')\n , 'expected #{this} to exist'\n , 'expected #{this} to not exist'\n );\n });\n\n\n /**\n * ### .empty\n *\n * Asserts that the target's length is `0`. For arrays and strings, it checks\n * the `length` property. For objects, it gets the count of\n * enumerable keys.\n *\n * expect([]).to.be.empty;\n * expect('').to.be.empty;\n * expect({}).to.be.empty;\n *\n * @name empty\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('empty', function () {\n var obj = flag(this, 'object')\n , expected = obj;\n\n if (Array.isArray(obj) || 'string' === typeof object) {\n expected = obj.length;\n } else if (typeof obj === 'object') {\n expected = Object.keys(obj).length;\n }\n\n this.assert(\n !expected\n , 'expected #{this} to be empty'\n , 'expected #{this} not to be empty'\n );\n });\n\n /**\n * ### .arguments\n *\n * Asserts that the target is an arguments object.\n *\n * function test () {\n * expect(arguments).to.be.arguments;\n * }\n *\n * @name arguments\n * @alias Arguments\n * @namespace BDD\n * @api public\n */\n\n function checkArguments () {\n var obj = flag(this, 'object')\n , type = Object.prototype.toString.call(obj);\n this.assert(\n '[object Arguments]' === type\n , 'expected #{this} to be arguments but got ' + type\n , 'expected #{this} to not be arguments'\n );\n }\n\n Assertion.addProperty('arguments', checkArguments);\n Assertion.addProperty('Arguments', checkArguments);\n\n /**\n * ### .equal(value)\n *\n * Asserts that the target is strictly equal (`===`) to `value`.\n * Alternately, if the `deep` flag is set, asserts that\n * the target is deeply equal to `value`.\n *\n * expect('hello').to.equal('hello');\n * expect(42).to.equal(42);\n * expect(1).to.not.equal(true);\n * expect({ foo: 'bar' }).to.not.equal({ foo: 'bar' });\n * expect({ foo: 'bar' }).to.deep.equal({ foo: 'bar' });\n *\n * @name equal\n * @alias equals\n * @alias eq\n * @alias deep.equal\n * @param {Mixed} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertEqual (val, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'deep')) {\n return this.eql(val);\n } else {\n this.assert(\n val === obj\n , 'expected #{this} to equal #{exp}'\n , 'expected #{this} to not equal #{exp}'\n , val\n , this._obj\n , true\n );\n }\n }\n\n Assertion.addMethod('equal', assertEqual);\n Assertion.addMethod('equals', assertEqual);\n Assertion.addMethod('eq', assertEqual);\n\n /**\n * ### .eql(value)\n *\n * Asserts that the target is deeply equal to `value`.\n *\n * expect({ foo: 'bar' }).to.eql({ foo: 'bar' });\n * expect([ 1, 2, 3 ]).to.eql([ 1, 2, 3 ]);\n *\n * @name eql\n * @alias eqls\n * @param {Mixed} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertEql(obj, msg) {\n if (msg) flag(this, 'message', msg);\n this.assert(\n _.eql(obj, flag(this, 'object'))\n , 'expected #{this} to deeply equal #{exp}'\n , 'expected #{this} to not deeply equal #{exp}'\n , obj\n , this._obj\n , true\n );\n }\n\n Assertion.addMethod('eql', assertEql);\n Assertion.addMethod('eqls', assertEql);\n\n /**\n * ### .above(value)\n *\n * Asserts that the target is greater than `value`.\n *\n * expect(10).to.be.above(5);\n *\n * Can also be used in conjunction with `length` to\n * assert a minimum length. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.above(2);\n * expect([ 1, 2, 3 ]).to.have.length.above(2);\n *\n * @name above\n * @alias gt\n * @alias greaterThan\n * @param {Number} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertAbove (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len > n\n , 'expected #{this} to have a length above #{exp} but got #{act}'\n , 'expected #{this} to not have a length above #{exp}'\n , n\n , len\n );\n } else {\n this.assert(\n obj > n\n , 'expected #{this} to be above ' + n\n , 'expected #{this} to be at most ' + n\n );\n }\n }\n\n Assertion.addMethod('above', assertAbove);\n Assertion.addMethod('gt', assertAbove);\n Assertion.addMethod('greaterThan', assertAbove);\n\n /**\n * ### .least(value)\n *\n * Asserts that the target is greater than or equal to `value`.\n *\n * expect(10).to.be.at.least(10);\n *\n * Can also be used in conjunction with `length` to\n * assert a minimum length. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.of.at.least(2);\n * expect([ 1, 2, 3 ]).to.have.length.of.at.least(3);\n *\n * @name least\n * @alias gte\n * @param {Number} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertLeast (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len >= n\n , 'expected #{this} to have a length at least #{exp} but got #{act}'\n , 'expected #{this} to have a length below #{exp}'\n , n\n , len\n );\n } else {\n this.assert(\n obj >= n\n , 'expected #{this} to be at least ' + n\n , 'expected #{this} to be below ' + n\n );\n }\n }\n\n Assertion.addMethod('least', assertLeast);\n Assertion.addMethod('gte', assertLeast);\n\n /**\n * ### .below(value)\n *\n * Asserts that the target is less than `value`.\n *\n * expect(5).to.be.below(10);\n *\n * Can also be used in conjunction with `length` to\n * assert a maximum length. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.below(4);\n * expect([ 1, 2, 3 ]).to.have.length.below(4);\n *\n * @name below\n * @alias lt\n * @alias lessThan\n * @param {Number} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertBelow (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len < n\n , 'expected #{this} to have a length below #{exp} but got #{act}'\n , 'expected #{this} to not have a length below #{exp}'\n , n\n , len\n );\n } else {\n this.assert(\n obj < n\n , 'expected #{this} to be below ' + n\n , 'expected #{this} to be at least ' + n\n );\n }\n }\n\n Assertion.addMethod('below', assertBelow);\n Assertion.addMethod('lt', assertBelow);\n Assertion.addMethod('lessThan', assertBelow);\n\n /**\n * ### .most(value)\n *\n * Asserts that the target is less than or equal to `value`.\n *\n * expect(5).to.be.at.most(5);\n *\n * Can also be used in conjunction with `length` to\n * assert a maximum length. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.of.at.most(4);\n * expect([ 1, 2, 3 ]).to.have.length.of.at.most(3);\n *\n * @name most\n * @alias lte\n * @param {Number} value\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertMost (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len <= n\n , 'expected #{this} to have a length at most #{exp} but got #{act}'\n , 'expected #{this} to have a length above #{exp}'\n , n\n , len\n );\n } else {\n this.assert(\n obj <= n\n , 'expected #{this} to be at most ' + n\n , 'expected #{this} to be above ' + n\n );\n }\n }\n\n Assertion.addMethod('most', assertMost);\n Assertion.addMethod('lte', assertMost);\n\n /**\n * ### .within(start, finish)\n *\n * Asserts that the target is within a range.\n *\n * expect(7).to.be.within(5,10);\n *\n * Can also be used in conjunction with `length` to\n * assert a length range. The benefit being a\n * more informative error message than if the length\n * was supplied directly.\n *\n * expect('foo').to.have.length.within(2,4);\n * expect([ 1, 2, 3 ]).to.have.length.within(2,4);\n *\n * @name within\n * @param {Number} start lowerbound inclusive\n * @param {Number} finish upperbound inclusive\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('within', function (start, finish, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , range = start + '..' + finish;\n if (flag(this, 'doLength')) {\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n this.assert(\n len >= start && len <= finish\n , 'expected #{this} to have a length within ' + range\n , 'expected #{this} to not have a length within ' + range\n );\n } else {\n this.assert(\n obj >= start && obj <= finish\n , 'expected #{this} to be within ' + range\n , 'expected #{this} to not be within ' + range\n );\n }\n });\n\n /**\n * ### .instanceof(constructor)\n *\n * Asserts that the target is an instance of `constructor`.\n *\n * var Tea = function (name) { this.name = name; }\n * , Chai = new Tea('chai');\n *\n * expect(Chai).to.be.an.instanceof(Tea);\n * expect([ 1, 2, 3 ]).to.be.instanceof(Array);\n *\n * @name instanceof\n * @param {Constructor} constructor\n * @param {String} message _optional_\n * @alias instanceOf\n * @namespace BDD\n * @api public\n */\n\n function assertInstanceOf (constructor, msg) {\n if (msg) flag(this, 'message', msg);\n var name = _.getName(constructor);\n this.assert(\n flag(this, 'object') instanceof constructor\n , 'expected #{this} to be an instance of ' + name\n , 'expected #{this} to not be an instance of ' + name\n );\n };\n\n Assertion.addMethod('instanceof', assertInstanceOf);\n Assertion.addMethod('instanceOf', assertInstanceOf);\n\n /**\n * ### .property(name, [value])\n *\n * Asserts that the target has a property `name`, optionally asserting that\n * the value of that property is strictly equal to `value`.\n * If the `deep` flag is set, you can use dot- and bracket-notation for deep\n * references into objects and arrays.\n *\n * // simple referencing\n * var obj = { foo: 'bar' };\n * expect(obj).to.have.property('foo');\n * expect(obj).to.have.property('foo', 'bar');\n *\n * // deep referencing\n * var deepObj = {\n * green: { tea: 'matcha' }\n * , teas: [ 'chai', 'matcha', { tea: 'konacha' } ]\n * };\n *\n * expect(deepObj).to.have.deep.property('green.tea', 'matcha');\n * expect(deepObj).to.have.deep.property('teas[1]', 'matcha');\n * expect(deepObj).to.have.deep.property('teas[2].tea', 'konacha');\n *\n * You can also use an array as the starting point of a `deep.property`\n * assertion, or traverse nested arrays.\n *\n * var arr = [\n * [ 'chai', 'matcha', 'konacha' ]\n * , [ { tea: 'chai' }\n * , { tea: 'matcha' }\n * , { tea: 'konacha' } ]\n * ];\n *\n * expect(arr).to.have.deep.property('[0][1]', 'matcha');\n * expect(arr).to.have.deep.property('[1][2].tea', 'konacha');\n *\n * Furthermore, `property` changes the subject of the assertion\n * to be the value of that property from the original object. This\n * permits for further chainable assertions on that property.\n *\n * expect(obj).to.have.property('foo')\n * .that.is.a('string');\n * expect(deepObj).to.have.property('green')\n * .that.is.an('object')\n * .that.deep.equals({ tea: 'matcha' });\n * expect(deepObj).to.have.property('teas')\n * .that.is.an('array')\n * .with.deep.property('[2]')\n * .that.deep.equals({ tea: 'konacha' });\n *\n * Note that dots and bracket in `name` must be backslash-escaped when\n * the `deep` flag is set, while they must NOT be escaped when the `deep`\n * flag is not set.\n *\n * // simple referencing\n * var css = { '.link[target]': 42 };\n * expect(css).to.have.property('.link[target]', 42);\n *\n * // deep referencing\n * var deepCss = { '.link': { '[target]': 42 }};\n * expect(deepCss).to.have.deep.property('\\\\.link.\\\\[target\\\\]', 42);\n *\n * @name property\n * @alias deep.property\n * @param {String} name\n * @param {Mixed} value (optional)\n * @param {String} message _optional_\n * @returns value of property for chaining\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('property', function (name, val, msg) {\n if (msg) flag(this, 'message', msg);\n\n var isDeep = !!flag(this, 'deep')\n , descriptor = isDeep ? 'deep property ' : 'property '\n , negate = flag(this, 'negate')\n , obj = flag(this, 'object')\n , pathInfo = isDeep ? _.getPathInfo(name, obj) : null\n , hasProperty = isDeep\n ? pathInfo.exists\n : _.hasProperty(name, obj)\n , value = isDeep\n ? pathInfo.value\n : obj[name];\n\n if (negate && arguments.length > 1) {\n if (undefined === value) {\n msg = (msg != null) ? msg + ': ' : '';\n throw new Error(msg + _.inspect(obj) + ' has no ' + descriptor + _.inspect(name));\n }\n } else {\n this.assert(\n hasProperty\n , 'expected #{this} to have a ' + descriptor + _.inspect(name)\n , 'expected #{this} to not have ' + descriptor + _.inspect(name));\n }\n\n if (arguments.length > 1) {\n this.assert(\n val === value\n , 'expected #{this} to have a ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}'\n , 'expected #{this} to not have a ' + descriptor + _.inspect(name) + ' of #{act}'\n , val\n , value\n );\n }\n\n flag(this, 'object', value);\n });\n\n\n /**\n * ### .ownProperty(name)\n *\n * Asserts that the target has an own property `name`.\n *\n * expect('test').to.have.ownProperty('length');\n *\n * @name ownProperty\n * @alias haveOwnProperty\n * @param {String} name\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertOwnProperty (name, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n this.assert(\n obj.hasOwnProperty(name)\n , 'expected #{this} to have own property ' + _.inspect(name)\n , 'expected #{this} to not have own property ' + _.inspect(name)\n );\n }\n\n Assertion.addMethod('ownProperty', assertOwnProperty);\n Assertion.addMethod('haveOwnProperty', assertOwnProperty);\n\n /**\n * ### .ownPropertyDescriptor(name[, descriptor[, message]])\n *\n * Asserts that the target has an own property descriptor `name`, that optionally matches `descriptor`.\n *\n * expect('test').to.have.ownPropertyDescriptor('length');\n * expect('test').to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 4 });\n * expect('test').not.to.have.ownPropertyDescriptor('length', { enumerable: false, configurable: false, writable: false, value: 3 });\n * expect('test').ownPropertyDescriptor('length').to.have.property('enumerable', false);\n * expect('test').ownPropertyDescriptor('length').to.have.keys('value');\n *\n * @name ownPropertyDescriptor\n * @alias haveOwnPropertyDescriptor\n * @param {String} name\n * @param {Object} descriptor _optional_\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertOwnPropertyDescriptor (name, descriptor, msg) {\n if (typeof descriptor === 'string') {\n msg = descriptor;\n descriptor = null;\n }\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n var actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name);\n if (actualDescriptor && descriptor) {\n this.assert(\n _.eql(descriptor, actualDescriptor)\n , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to match ' + _.inspect(descriptor) + ', got ' + _.inspect(actualDescriptor)\n , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to not match ' + _.inspect(descriptor)\n , descriptor\n , actualDescriptor\n , true\n );\n } else {\n this.assert(\n actualDescriptor\n , 'expected #{this} to have an own property descriptor for ' + _.inspect(name)\n , 'expected #{this} to not have an own property descriptor for ' + _.inspect(name)\n );\n }\n flag(this, 'object', actualDescriptor);\n }\n\n Assertion.addMethod('ownPropertyDescriptor', assertOwnPropertyDescriptor);\n Assertion.addMethod('haveOwnPropertyDescriptor', assertOwnPropertyDescriptor);\n\n /**\n * ### .length\n *\n * Sets the `doLength` flag later used as a chain precursor to a value\n * comparison for the `length` property.\n *\n * expect('foo').to.have.length.above(2);\n * expect([ 1, 2, 3 ]).to.have.length.above(2);\n * expect('foo').to.have.length.below(4);\n * expect([ 1, 2, 3 ]).to.have.length.below(4);\n * expect('foo').to.have.length.within(2,4);\n * expect([ 1, 2, 3 ]).to.have.length.within(2,4);\n *\n * *Deprecation notice:* Using `length` as an assertion will be deprecated\n * in version 2.4.0 and removed in 3.0.0. Code using the old style of\n * asserting for `length` property value using `length(value)` should be\n * switched to use `lengthOf(value)` instead.\n *\n * @name length\n * @namespace BDD\n * @api public\n */\n\n /**\n * ### .lengthOf(value[, message])\n *\n * Asserts that the target's `length` property has\n * the expected value.\n *\n * expect([ 1, 2, 3]).to.have.lengthOf(3);\n * expect('foobar').to.have.lengthOf(6);\n *\n * @name lengthOf\n * @param {Number} length\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertLengthChain () {\n flag(this, 'doLength', true);\n }\n\n function assertLength (n, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n new Assertion(obj, msg).to.have.property('length');\n var len = obj.length;\n\n this.assert(\n len == n\n , 'expected #{this} to have a length of #{exp} but got #{act}'\n , 'expected #{this} to not have a length of #{act}'\n , n\n , len\n );\n }\n\n Assertion.addChainableMethod('length', assertLength, assertLengthChain);\n Assertion.addMethod('lengthOf', assertLength);\n\n /**\n * ### .match(regexp)\n *\n * Asserts that the target matches a regular expression.\n *\n * expect('foobar').to.match(/^foo/);\n *\n * @name match\n * @alias matches\n * @param {RegExp} RegularExpression\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n function assertMatch(re, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n this.assert(\n re.exec(obj)\n , 'expected #{this} to match ' + re\n , 'expected #{this} not to match ' + re\n );\n }\n\n Assertion.addMethod('match', assertMatch);\n Assertion.addMethod('matches', assertMatch);\n\n /**\n * ### .string(string)\n *\n * Asserts that the string target contains another string.\n *\n * expect('foobar').to.have.string('bar');\n *\n * @name string\n * @param {String} string\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('string', function (str, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n new Assertion(obj, msg).is.a('string');\n\n this.assert(\n ~obj.indexOf(str)\n , 'expected #{this} to contain ' + _.inspect(str)\n , 'expected #{this} to not contain ' + _.inspect(str)\n );\n });\n\n\n /**\n * ### .keys(key1, [key2], [...])\n *\n * Asserts that the target contains any or all of the passed-in keys.\n * Use in combination with `any`, `all`, `contains`, or `have` will affect\n * what will pass.\n *\n * When used in conjunction with `any`, at least one key that is passed\n * in must exist in the target object. This is regardless whether or not\n * the `have` or `contain` qualifiers are used. Note, either `any` or `all`\n * should be used in the assertion. If neither are used, the assertion is\n * defaulted to `all`.\n *\n * When both `all` and `contain` are used, the target object must have at\n * least all of the passed-in keys but may have more keys not listed.\n *\n * When both `all` and `have` are used, the target object must both contain\n * all of the passed-in keys AND the number of keys in the target object must\n * match the number of keys passed in (in other words, a target object must\n * have all and only all of the passed-in keys).\n *\n * expect({ foo: 1, bar: 2 }).to.have.any.keys('foo', 'baz');\n * expect({ foo: 1, bar: 2 }).to.have.any.keys('foo');\n * expect({ foo: 1, bar: 2 }).to.contain.any.keys('bar', 'baz');\n * expect({ foo: 1, bar: 2 }).to.contain.any.keys(['foo']);\n * expect({ foo: 1, bar: 2 }).to.contain.any.keys({'foo': 6});\n * expect({ foo: 1, bar: 2 }).to.have.all.keys(['bar', 'foo']);\n * expect({ foo: 1, bar: 2 }).to.have.all.keys({'bar': 6, 'foo': 7});\n * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.all.keys(['bar', 'foo']);\n * expect({ foo: 1, bar: 2, baz: 3 }).to.contain.all.keys({'bar': 6});\n *\n *\n * @name keys\n * @alias key\n * @param {...String|Array|Object} keys\n * @namespace BDD\n * @api public\n */\n\n function assertKeys (keys) {\n var obj = flag(this, 'object')\n , str\n , ok = true\n , mixedArgsMsg = 'keys must be given single argument of Array|Object|String, or multiple String arguments';\n\n switch (_.type(keys)) {\n case \"array\":\n if (arguments.length > 1) throw (new Error(mixedArgsMsg));\n break;\n case \"object\":\n if (arguments.length > 1) throw (new Error(mixedArgsMsg));\n keys = Object.keys(keys);\n break;\n default:\n keys = Array.prototype.slice.call(arguments);\n }\n\n if (!keys.length) throw new Error('keys required');\n\n var actual = Object.keys(obj)\n , expected = keys\n , len = keys.length\n , any = flag(this, 'any')\n , all = flag(this, 'all');\n\n if (!any && !all) {\n all = true;\n }\n\n // Has any\n if (any) {\n var intersection = expected.filter(function(key) {\n return ~actual.indexOf(key);\n });\n ok = intersection.length > 0;\n }\n\n // Has all\n if (all) {\n ok = keys.every(function(key){\n return ~actual.indexOf(key);\n });\n if (!flag(this, 'negate') && !flag(this, 'contains')) {\n ok = ok && keys.length == actual.length;\n }\n }\n\n // Key string\n if (len > 1) {\n keys = keys.map(function(key){\n return _.inspect(key);\n });\n var last = keys.pop();\n if (all) {\n str = keys.join(', ') + ', and ' + last;\n }\n if (any) {\n str = keys.join(', ') + ', or ' + last;\n }\n } else {\n str = _.inspect(keys[0]);\n }\n\n // Form\n str = (len > 1 ? 'keys ' : 'key ') + str;\n\n // Have / include\n str = (flag(this, 'contains') ? 'contain ' : 'have ') + str;\n\n // Assertion\n this.assert(\n ok\n , 'expected #{this} to ' + str\n , 'expected #{this} to not ' + str\n , expected.slice(0).sort()\n , actual.sort()\n , true\n );\n }\n\n Assertion.addMethod('keys', assertKeys);\n Assertion.addMethod('key', assertKeys);\n\n /**\n * ### .throw(constructor)\n *\n * Asserts that the function target will throw a specific error, or specific type of error\n * (as determined using `instanceof`), optionally with a RegExp or string inclusion test\n * for the error's message.\n *\n * var err = new ReferenceError('This is a bad function.');\n * var fn = function () { throw err; }\n * expect(fn).to.throw(ReferenceError);\n * expect(fn).to.throw(Error);\n * expect(fn).to.throw(/bad function/);\n * expect(fn).to.not.throw('good function');\n * expect(fn).to.throw(ReferenceError, /bad function/);\n * expect(fn).to.throw(err);\n *\n * Please note that when a throw expectation is negated, it will check each\n * parameter independently, starting with error constructor type. The appropriate way\n * to check for the existence of a type of error but for a message that does not match\n * is to use `and`.\n *\n * expect(fn).to.throw(ReferenceError)\n * .and.not.throw(/good function/);\n *\n * @name throw\n * @alias throws\n * @alias Throw\n * @param {ErrorConstructor} constructor\n * @param {String|RegExp} expected error message\n * @param {String} message _optional_\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @returns error for chaining (null if no error)\n * @namespace BDD\n * @api public\n */\n\n function assertThrows (constructor, errMsg, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n new Assertion(obj, msg).is.a('function');\n\n var thrown = false\n , desiredError = null\n , name = null\n , thrownError = null;\n\n if (arguments.length === 0) {\n errMsg = null;\n constructor = null;\n } else if (constructor && (constructor instanceof RegExp || 'string' === typeof constructor)) {\n errMsg = constructor;\n constructor = null;\n } else if (constructor && constructor instanceof Error) {\n desiredError = constructor;\n constructor = null;\n errMsg = null;\n } else if (typeof constructor === 'function') {\n name = constructor.prototype.name;\n if (!name || (name === 'Error' && constructor !== Error)) {\n name = constructor.name || (new constructor()).name;\n }\n } else {\n constructor = null;\n }\n\n try {\n obj();\n } catch (err) {\n // first, check desired error\n if (desiredError) {\n this.assert(\n err === desiredError\n , 'expected #{this} to throw #{exp} but #{act} was thrown'\n , 'expected #{this} to not throw #{exp}'\n , (desiredError instanceof Error ? desiredError.toString() : desiredError)\n , (err instanceof Error ? err.toString() : err)\n );\n\n flag(this, 'object', err);\n return this;\n }\n\n // next, check constructor\n if (constructor) {\n this.assert(\n err instanceof constructor\n , 'expected #{this} to throw #{exp} but #{act} was thrown'\n , 'expected #{this} to not throw #{exp} but #{act} was thrown'\n , name\n , (err instanceof Error ? err.toString() : err)\n );\n\n if (!errMsg) {\n flag(this, 'object', err);\n return this;\n }\n }\n\n // next, check message\n var message = 'error' === _.type(err) && \"message\" in err\n ? err.message\n : '' + err;\n\n if ((message != null) && errMsg && errMsg instanceof RegExp) {\n this.assert(\n errMsg.exec(message)\n , 'expected #{this} to throw error matching #{exp} but got #{act}'\n , 'expected #{this} to throw error not matching #{exp}'\n , errMsg\n , message\n );\n\n flag(this, 'object', err);\n return this;\n } else if ((message != null) && errMsg && 'string' === typeof errMsg) {\n this.assert(\n ~message.indexOf(errMsg)\n , 'expected #{this} to throw error including #{exp} but got #{act}'\n , 'expected #{this} to throw error not including #{act}'\n , errMsg\n , message\n );\n\n flag(this, 'object', err);\n return this;\n } else {\n thrown = true;\n thrownError = err;\n }\n }\n\n var actuallyGot = ''\n , expectedThrown = name !== null\n ? name\n : desiredError\n ? '#{exp}' //_.inspect(desiredError)\n : 'an error';\n\n if (thrown) {\n actuallyGot = ' but #{act} was thrown'\n }\n\n this.assert(\n thrown === true\n , 'expected #{this} to throw ' + expectedThrown + actuallyGot\n , 'expected #{this} to not throw ' + expectedThrown + actuallyGot\n , (desiredError instanceof Error ? desiredError.toString() : desiredError)\n , (thrownError instanceof Error ? thrownError.toString() : thrownError)\n );\n\n flag(this, 'object', thrownError);\n };\n\n Assertion.addMethod('throw', assertThrows);\n Assertion.addMethod('throws', assertThrows);\n Assertion.addMethod('Throw', assertThrows);\n\n /**\n * ### .respondTo(method)\n *\n * Asserts that the object or class target will respond to a method.\n *\n * Klass.prototype.bar = function(){};\n * expect(Klass).to.respondTo('bar');\n * expect(obj).to.respondTo('bar');\n *\n * To check if a constructor will respond to a static function,\n * set the `itself` flag.\n *\n * Klass.baz = function(){};\n * expect(Klass).itself.to.respondTo('baz');\n *\n * @name respondTo\n * @alias respondsTo\n * @param {String} method\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function respondTo (method, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object')\n , itself = flag(this, 'itself')\n , context = ('function' === _.type(obj) && !itself)\n ? obj.prototype[method]\n : obj[method];\n\n this.assert(\n 'function' === typeof context\n , 'expected #{this} to respond to ' + _.inspect(method)\n , 'expected #{this} to not respond to ' + _.inspect(method)\n );\n }\n\n Assertion.addMethod('respondTo', respondTo);\n Assertion.addMethod('respondsTo', respondTo);\n\n /**\n * ### .itself\n *\n * Sets the `itself` flag, later used by the `respondTo` assertion.\n *\n * function Foo() {}\n * Foo.bar = function() {}\n * Foo.prototype.baz = function() {}\n *\n * expect(Foo).itself.to.respondTo('bar');\n * expect(Foo).itself.not.to.respondTo('baz');\n *\n * @name itself\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('itself', function () {\n flag(this, 'itself', true);\n });\n\n /**\n * ### .satisfy(method)\n *\n * Asserts that the target passes a given truth test.\n *\n * expect(1).to.satisfy(function(num) { return num > 0; });\n *\n * @name satisfy\n * @alias satisfies\n * @param {Function} matcher\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function satisfy (matcher, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n var result = matcher(obj);\n this.assert(\n result\n , 'expected #{this} to satisfy ' + _.objDisplay(matcher)\n , 'expected #{this} to not satisfy' + _.objDisplay(matcher)\n , this.negate ? false : true\n , result\n );\n }\n\n Assertion.addMethod('satisfy', satisfy);\n Assertion.addMethod('satisfies', satisfy);\n\n /**\n * ### .closeTo(expected, delta)\n *\n * Asserts that the target is equal `expected`, to within a +/- `delta` range.\n *\n * expect(1.5).to.be.closeTo(1, 0.5);\n *\n * @name closeTo\n * @alias approximately\n * @param {Number} expected\n * @param {Number} delta\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function closeTo(expected, delta, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n\n new Assertion(obj, msg).is.a('number');\n if (_.type(expected) !== 'number' || _.type(delta) !== 'number') {\n throw new Error('the arguments to closeTo or approximately must be numbers');\n }\n\n this.assert(\n Math.abs(obj - expected) <= delta\n , 'expected #{this} to be close to ' + expected + ' +/- ' + delta\n , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta\n );\n }\n\n Assertion.addMethod('closeTo', closeTo);\n Assertion.addMethod('approximately', closeTo);\n\n function isSubsetOf(subset, superset, cmp) {\n return subset.every(function(elem) {\n if (!cmp) return superset.indexOf(elem) !== -1;\n\n return superset.some(function(elem2) {\n return cmp(elem, elem2);\n });\n })\n }\n\n /**\n * ### .members(set)\n *\n * Asserts that the target is a superset of `set`,\n * or that the target and `set` have the same strictly-equal (===) members.\n * Alternately, if the `deep` flag is set, set members are compared for deep\n * equality.\n *\n * expect([1, 2, 3]).to.include.members([3, 2]);\n * expect([1, 2, 3]).to.not.include.members([3, 2, 8]);\n *\n * expect([4, 2]).to.have.members([2, 4]);\n * expect([5, 2]).to.not.have.members([5, 2, 1]);\n *\n * expect([{ id: 1 }]).to.deep.include.members([{ id: 1 }]);\n *\n * @name members\n * @param {Array} set\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n Assertion.addMethod('members', function (subset, msg) {\n if (msg) flag(this, 'message', msg);\n var obj = flag(this, 'object');\n\n new Assertion(obj).to.be.an('array');\n new Assertion(subset).to.be.an('array');\n\n var cmp = flag(this, 'deep') ? _.eql : undefined;\n\n if (flag(this, 'contains')) {\n return this.assert(\n isSubsetOf(subset, obj, cmp)\n , 'expected #{this} to be a superset of #{act}'\n , 'expected #{this} to not be a superset of #{act}'\n , obj\n , subset\n );\n }\n\n this.assert(\n isSubsetOf(obj, subset, cmp) && isSubsetOf(subset, obj, cmp)\n , 'expected #{this} to have the same members as #{act}'\n , 'expected #{this} to not have the same members as #{act}'\n , obj\n , subset\n );\n });\n\n /**\n * ### .oneOf(list)\n *\n * Assert that a value appears somewhere in the top level of array `list`.\n *\n * expect('a').to.be.oneOf(['a', 'b', 'c']);\n * expect(9).to.not.be.oneOf(['z']);\n * expect([3]).to.not.be.oneOf([1, 2, [3]]);\n *\n * var three = [3];\n * // for object-types, contents are not compared\n * expect(three).to.not.be.oneOf([1, 2, [3]]);\n * // comparing references works\n * expect(three).to.be.oneOf([1, 2, three]);\n *\n * @name oneOf\n * @param {Array<*>} list\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function oneOf (list, msg) {\n if (msg) flag(this, 'message', msg);\n var expected = flag(this, 'object');\n new Assertion(list).to.be.an('array');\n\n this.assert(\n list.indexOf(expected) > -1\n , 'expected #{this} to be one of #{exp}'\n , 'expected #{this} to not be one of #{exp}'\n , list\n , expected\n );\n }\n\n Assertion.addMethod('oneOf', oneOf);\n\n\n /**\n * ### .change(function)\n *\n * Asserts that a function changes an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val += 3 };\n * var noChangeFn = function() { return 'foo' + 'bar'; }\n * expect(fn).to.change(obj, 'val');\n * expect(noChangeFn).to.not.change(obj, 'val')\n *\n * @name change\n * @alias changes\n * @alias Change\n * @param {String} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertChanges (object, prop, msg) {\n if (msg) flag(this, 'message', msg);\n var fn = flag(this, 'object');\n new Assertion(object, msg).to.have.property(prop);\n new Assertion(fn).is.a('function');\n\n var initial = object[prop];\n fn();\n\n this.assert(\n initial !== object[prop]\n , 'expected .' + prop + ' to change'\n , 'expected .' + prop + ' to not change'\n );\n }\n\n Assertion.addChainableMethod('change', assertChanges);\n Assertion.addChainableMethod('changes', assertChanges);\n\n /**\n * ### .increase(function)\n *\n * Asserts that a function increases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 15 };\n * expect(fn).to.increase(obj, 'val');\n *\n * @name increase\n * @alias increases\n * @alias Increase\n * @param {String} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertIncreases (object, prop, msg) {\n if (msg) flag(this, 'message', msg);\n var fn = flag(this, 'object');\n new Assertion(object, msg).to.have.property(prop);\n new Assertion(fn).is.a('function');\n\n var initial = object[prop];\n fn();\n\n this.assert(\n object[prop] - initial > 0\n , 'expected .' + prop + ' to increase'\n , 'expected .' + prop + ' to not increase'\n );\n }\n\n Assertion.addChainableMethod('increase', assertIncreases);\n Assertion.addChainableMethod('increases', assertIncreases);\n\n /**\n * ### .decrease(function)\n *\n * Asserts that a function decreases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 5 };\n * expect(fn).to.decrease(obj, 'val');\n *\n * @name decrease\n * @alias decreases\n * @alias Decrease\n * @param {String} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace BDD\n * @api public\n */\n\n function assertDecreases (object, prop, msg) {\n if (msg) flag(this, 'message', msg);\n var fn = flag(this, 'object');\n new Assertion(object, msg).to.have.property(prop);\n new Assertion(fn).is.a('function');\n\n var initial = object[prop];\n fn();\n\n this.assert(\n object[prop] - initial < 0\n , 'expected .' + prop + ' to decrease'\n , 'expected .' + prop + ' to not decrease'\n );\n }\n\n Assertion.addChainableMethod('decrease', assertDecreases);\n Assertion.addChainableMethod('decreases', assertDecreases);\n\n /**\n * ### .extensible\n *\n * Asserts that the target is extensible (can have new properties added to\n * it).\n *\n * var nonExtensibleObject = Object.preventExtensions({});\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.freeze({});\n *\n * expect({}).to.be.extensible;\n * expect(nonExtensibleObject).to.not.be.extensible;\n * expect(sealedObject).to.not.be.extensible;\n * expect(frozenObject).to.not.be.extensible;\n *\n * @name extensible\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('extensible', function() {\n var obj = flag(this, 'object');\n\n // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.\n // In ES6, a non-object argument will be treated as if it was a non-extensible ordinary object, simply return false.\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible\n // The following provides ES6 behavior when a TypeError is thrown under ES5.\n\n var isExtensible;\n\n try {\n isExtensible = Object.isExtensible(obj);\n } catch (err) {\n if (err instanceof TypeError) isExtensible = false;\n else throw err;\n }\n\n this.assert(\n isExtensible\n , 'expected #{this} to be extensible'\n , 'expected #{this} to not be extensible'\n );\n });\n\n /**\n * ### .sealed\n *\n * Asserts that the target is sealed (cannot have new properties added to it\n * and its existing properties cannot be removed).\n *\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.freeze({});\n *\n * expect(sealedObject).to.be.sealed;\n * expect(frozenObject).to.be.sealed;\n * expect({}).to.not.be.sealed;\n *\n * @name sealed\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('sealed', function() {\n var obj = flag(this, 'object');\n\n // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.\n // In ES6, a non-object argument will be treated as if it was a sealed ordinary object, simply return true.\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed\n // The following provides ES6 behavior when a TypeError is thrown under ES5.\n\n var isSealed;\n\n try {\n isSealed = Object.isSealed(obj);\n } catch (err) {\n if (err instanceof TypeError) isSealed = true;\n else throw err;\n }\n\n this.assert(\n isSealed\n , 'expected #{this} to be sealed'\n , 'expected #{this} to not be sealed'\n );\n });\n\n /**\n * ### .frozen\n *\n * Asserts that the target is frozen (cannot have new properties added to it\n * and its existing properties cannot be modified).\n *\n * var frozenObject = Object.freeze({});\n *\n * expect(frozenObject).to.be.frozen;\n * expect({}).to.not.be.frozen;\n *\n * @name frozen\n * @namespace BDD\n * @api public\n */\n\n Assertion.addProperty('frozen', function() {\n var obj = flag(this, 'object');\n\n // In ES5, if the argument to this method is not an object (a primitive), then it will cause a TypeError.\n // In ES6, a non-object argument will be treated as if it was a frozen ordinary object, simply return true.\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen\n // The following provides ES6 behavior when a TypeError is thrown under ES5.\n\n var isFrozen;\n\n try {\n isFrozen = Object.isFrozen(obj);\n } catch (err) {\n if (err instanceof TypeError) isFrozen = true;\n else throw err;\n }\n\n this.assert(\n isFrozen\n , 'expected #{this} to be frozen'\n , 'expected #{this} to not be frozen'\n );\n });\n};\n","/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\n\nmodule.exports = function (chai, util) {\n\n /*!\n * Chai dependencies.\n */\n\n var Assertion = chai.Assertion\n , flag = util.flag;\n\n /*!\n * Module export.\n */\n\n /**\n * ### assert(expression, message)\n *\n * Write your own test expressions.\n *\n * assert('foo' !== 'bar', 'foo is not bar');\n * assert(Array.isArray([]), 'empty arrays are arrays');\n *\n * @param {Mixed} expression to test for truthiness\n * @param {String} message to display on error\n * @name assert\n * @namespace Assert\n * @api public\n */\n\n var assert = chai.assert = function (express, errmsg) {\n var test = new Assertion(null, null, chai.assert);\n test.assert(\n express\n , errmsg\n , '[ negation message unavailable ]'\n );\n };\n\n /**\n * ### .fail(actual, expected, [message], [operator])\n *\n * Throw a failure. Node.js `assert` module-compatible.\n *\n * @name fail\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @param {String} operator\n * @namespace Assert\n * @api public\n */\n\n assert.fail = function (actual, expected, message, operator) {\n message = message || 'assert.fail()';\n throw new chai.AssertionError(message, {\n actual: actual\n , expected: expected\n , operator: operator\n }, assert.fail);\n };\n\n /**\n * ### .isOk(object, [message])\n *\n * Asserts that `object` is truthy.\n *\n * assert.isOk('everything', 'everything is ok');\n * assert.isOk(false, 'this will fail');\n *\n * @name isOk\n * @alias ok\n * @param {Mixed} object to test\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isOk = function (val, msg) {\n new Assertion(val, msg).is.ok;\n };\n\n /**\n * ### .isNotOk(object, [message])\n *\n * Asserts that `object` is falsy.\n *\n * assert.isNotOk('everything', 'this will fail');\n * assert.isNotOk(false, 'this will pass');\n *\n * @name isNotOk\n * @alias notOk\n * @param {Mixed} object to test\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotOk = function (val, msg) {\n new Assertion(val, msg).is.not.ok;\n };\n\n /**\n * ### .equal(actual, expected, [message])\n *\n * Asserts non-strict equality (`==`) of `actual` and `expected`.\n *\n * assert.equal(3, '3', '== coerces values to strings');\n *\n * @name equal\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.equal = function (act, exp, msg) {\n var test = new Assertion(act, msg, assert.equal);\n\n test.assert(\n exp == flag(test, 'object')\n , 'expected #{this} to equal #{exp}'\n , 'expected #{this} to not equal #{act}'\n , exp\n , act\n );\n };\n\n /**\n * ### .notEqual(actual, expected, [message])\n *\n * Asserts non-strict inequality (`!=`) of `actual` and `expected`.\n *\n * assert.notEqual(3, 4, 'these numbers are not equal');\n *\n * @name notEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notEqual = function (act, exp, msg) {\n var test = new Assertion(act, msg, assert.notEqual);\n\n test.assert(\n exp != flag(test, 'object')\n , 'expected #{this} to not equal #{exp}'\n , 'expected #{this} to equal #{act}'\n , exp\n , act\n );\n };\n\n /**\n * ### .strictEqual(actual, expected, [message])\n *\n * Asserts strict equality (`===`) of `actual` and `expected`.\n *\n * assert.strictEqual(true, true, 'these booleans are strictly equal');\n *\n * @name strictEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.strictEqual = function (act, exp, msg) {\n new Assertion(act, msg).to.equal(exp);\n };\n\n /**\n * ### .notStrictEqual(actual, expected, [message])\n *\n * Asserts strict inequality (`!==`) of `actual` and `expected`.\n *\n * assert.notStrictEqual(3, '3', 'no coercion for strict equality');\n *\n * @name notStrictEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notStrictEqual = function (act, exp, msg) {\n new Assertion(act, msg).to.not.equal(exp);\n };\n\n /**\n * ### .deepEqual(actual, expected, [message])\n *\n * Asserts that `actual` is deeply equal to `expected`.\n *\n * assert.deepEqual({ tea: 'green' }, { tea: 'green' });\n *\n * @name deepEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepEqual = function (act, exp, msg) {\n new Assertion(act, msg).to.eql(exp);\n };\n\n /**\n * ### .notDeepEqual(actual, expected, [message])\n *\n * Assert that `actual` is not deeply equal to `expected`.\n *\n * assert.notDeepEqual({ tea: 'green' }, { tea: 'jasmine' });\n *\n * @name notDeepEqual\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notDeepEqual = function (act, exp, msg) {\n new Assertion(act, msg).to.not.eql(exp);\n };\n\n /**\n * ### .isAbove(valueToCheck, valueToBeAbove, [message])\n *\n * Asserts `valueToCheck` is strictly greater than (>) `valueToBeAbove`\n *\n * assert.isAbove(5, 2, '5 is strictly greater than 2');\n *\n * @name isAbove\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeAbove\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isAbove = function (val, abv, msg) {\n new Assertion(val, msg).to.be.above(abv);\n };\n\n /**\n * ### .isAtLeast(valueToCheck, valueToBeAtLeast, [message])\n *\n * Asserts `valueToCheck` is greater than or equal to (>=) `valueToBeAtLeast`\n *\n * assert.isAtLeast(5, 2, '5 is greater or equal to 2');\n * assert.isAtLeast(3, 3, '3 is greater or equal to 3');\n *\n * @name isAtLeast\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeAtLeast\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isAtLeast = function (val, atlst, msg) {\n new Assertion(val, msg).to.be.least(atlst);\n };\n\n /**\n * ### .isBelow(valueToCheck, valueToBeBelow, [message])\n *\n * Asserts `valueToCheck` is strictly less than (<) `valueToBeBelow`\n *\n * assert.isBelow(3, 6, '3 is strictly less than 6');\n *\n * @name isBelow\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeBelow\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isBelow = function (val, blw, msg) {\n new Assertion(val, msg).to.be.below(blw);\n };\n\n /**\n * ### .isAtMost(valueToCheck, valueToBeAtMost, [message])\n *\n * Asserts `valueToCheck` is less than or equal to (<=) `valueToBeAtMost`\n *\n * assert.isAtMost(3, 6, '3 is less than or equal to 6');\n * assert.isAtMost(4, 4, '4 is less than or equal to 4');\n *\n * @name isAtMost\n * @param {Mixed} valueToCheck\n * @param {Mixed} valueToBeAtMost\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isAtMost = function (val, atmst, msg) {\n new Assertion(val, msg).to.be.most(atmst);\n };\n\n /**\n * ### .isTrue(value, [message])\n *\n * Asserts that `value` is true.\n *\n * var teaServed = true;\n * assert.isTrue(teaServed, 'the tea has been served');\n *\n * @name isTrue\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isTrue = function (val, msg) {\n new Assertion(val, msg).is['true'];\n };\n\n /**\n * ### .isNotTrue(value, [message])\n *\n * Asserts that `value` is not true.\n *\n * var tea = 'tasty chai';\n * assert.isNotTrue(tea, 'great, time for tea!');\n *\n * @name isNotTrue\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotTrue = function (val, msg) {\n new Assertion(val, msg).to.not.equal(true);\n };\n\n /**\n * ### .isFalse(value, [message])\n *\n * Asserts that `value` is false.\n *\n * var teaServed = false;\n * assert.isFalse(teaServed, 'no tea yet? hmm...');\n *\n * @name isFalse\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isFalse = function (val, msg) {\n new Assertion(val, msg).is['false'];\n };\n\n /**\n * ### .isNotFalse(value, [message])\n *\n * Asserts that `value` is not false.\n *\n * var tea = 'tasty chai';\n * assert.isNotFalse(tea, 'great, time for tea!');\n *\n * @name isNotFalse\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotFalse = function (val, msg) {\n new Assertion(val, msg).to.not.equal(false);\n };\n\n /**\n * ### .isNull(value, [message])\n *\n * Asserts that `value` is null.\n *\n * assert.isNull(err, 'there was no error');\n *\n * @name isNull\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNull = function (val, msg) {\n new Assertion(val, msg).to.equal(null);\n };\n\n /**\n * ### .isNotNull(value, [message])\n *\n * Asserts that `value` is not null.\n *\n * var tea = 'tasty chai';\n * assert.isNotNull(tea, 'great, time for tea!');\n *\n * @name isNotNull\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotNull = function (val, msg) {\n new Assertion(val, msg).to.not.equal(null);\n };\n\n /**\n * ### .isNaN\n * Asserts that value is NaN\n *\n * assert.isNaN('foo', 'foo is NaN');\n *\n * @name isNaN\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNaN = function (val, msg) {\n new Assertion(val, msg).to.be.NaN;\n };\n\n /**\n * ### .isNotNaN\n * Asserts that value is not NaN\n *\n * assert.isNotNaN(4, '4 is not NaN');\n *\n * @name isNotNaN\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n assert.isNotNaN = function (val, msg) {\n new Assertion(val, msg).not.to.be.NaN;\n };\n\n /**\n * ### .isUndefined(value, [message])\n *\n * Asserts that `value` is `undefined`.\n *\n * var tea;\n * assert.isUndefined(tea, 'no tea defined');\n *\n * @name isUndefined\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isUndefined = function (val, msg) {\n new Assertion(val, msg).to.equal(undefined);\n };\n\n /**\n * ### .isDefined(value, [message])\n *\n * Asserts that `value` is not `undefined`.\n *\n * var tea = 'cup of chai';\n * assert.isDefined(tea, 'tea has been defined');\n *\n * @name isDefined\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isDefined = function (val, msg) {\n new Assertion(val, msg).to.not.equal(undefined);\n };\n\n /**\n * ### .isFunction(value, [message])\n *\n * Asserts that `value` is a function.\n *\n * function serveTea() { return 'cup of tea'; };\n * assert.isFunction(serveTea, 'great, we can have tea now');\n *\n * @name isFunction\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isFunction = function (val, msg) {\n new Assertion(val, msg).to.be.a('function');\n };\n\n /**\n * ### .isNotFunction(value, [message])\n *\n * Asserts that `value` is _not_ a function.\n *\n * var serveTea = [ 'heat', 'pour', 'sip' ];\n * assert.isNotFunction(serveTea, 'great, we have listed the steps');\n *\n * @name isNotFunction\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotFunction = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('function');\n };\n\n /**\n * ### .isObject(value, [message])\n *\n * Asserts that `value` is an object of type 'Object' (as revealed by `Object.prototype.toString`).\n * _The assertion does not match subclassed objects._\n *\n * var selection = { name: 'Chai', serve: 'with spices' };\n * assert.isObject(selection, 'tea selection is an object');\n *\n * @name isObject\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isObject = function (val, msg) {\n new Assertion(val, msg).to.be.a('object');\n };\n\n /**\n * ### .isNotObject(value, [message])\n *\n * Asserts that `value` is _not_ an object of type 'Object' (as revealed by `Object.prototype.toString`).\n *\n * var selection = 'chai'\n * assert.isNotObject(selection, 'tea selection is not an object');\n * assert.isNotObject(null, 'null is not an object');\n *\n * @name isNotObject\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotObject = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('object');\n };\n\n /**\n * ### .isArray(value, [message])\n *\n * Asserts that `value` is an array.\n *\n * var menu = [ 'green', 'chai', 'oolong' ];\n * assert.isArray(menu, 'what kind of tea do we want?');\n *\n * @name isArray\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isArray = function (val, msg) {\n new Assertion(val, msg).to.be.an('array');\n };\n\n /**\n * ### .isNotArray(value, [message])\n *\n * Asserts that `value` is _not_ an array.\n *\n * var menu = 'green|chai|oolong';\n * assert.isNotArray(menu, 'what kind of tea do we want?');\n *\n * @name isNotArray\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotArray = function (val, msg) {\n new Assertion(val, msg).to.not.be.an('array');\n };\n\n /**\n * ### .isString(value, [message])\n *\n * Asserts that `value` is a string.\n *\n * var teaOrder = 'chai';\n * assert.isString(teaOrder, 'order placed');\n *\n * @name isString\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isString = function (val, msg) {\n new Assertion(val, msg).to.be.a('string');\n };\n\n /**\n * ### .isNotString(value, [message])\n *\n * Asserts that `value` is _not_ a string.\n *\n * var teaOrder = 4;\n * assert.isNotString(teaOrder, 'order placed');\n *\n * @name isNotString\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotString = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('string');\n };\n\n /**\n * ### .isNumber(value, [message])\n *\n * Asserts that `value` is a number.\n *\n * var cups = 2;\n * assert.isNumber(cups, 'how many cups');\n *\n * @name isNumber\n * @param {Number} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNumber = function (val, msg) {\n new Assertion(val, msg).to.be.a('number');\n };\n\n /**\n * ### .isNotNumber(value, [message])\n *\n * Asserts that `value` is _not_ a number.\n *\n * var cups = '2 cups please';\n * assert.isNotNumber(cups, 'how many cups');\n *\n * @name isNotNumber\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotNumber = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('number');\n };\n\n /**\n * ### .isBoolean(value, [message])\n *\n * Asserts that `value` is a boolean.\n *\n * var teaReady = true\n * , teaServed = false;\n *\n * assert.isBoolean(teaReady, 'is the tea ready');\n * assert.isBoolean(teaServed, 'has tea been served');\n *\n * @name isBoolean\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isBoolean = function (val, msg) {\n new Assertion(val, msg).to.be.a('boolean');\n };\n\n /**\n * ### .isNotBoolean(value, [message])\n *\n * Asserts that `value` is _not_ a boolean.\n *\n * var teaReady = 'yep'\n * , teaServed = 'nope';\n *\n * assert.isNotBoolean(teaReady, 'is the tea ready');\n * assert.isNotBoolean(teaServed, 'has tea been served');\n *\n * @name isNotBoolean\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.isNotBoolean = function (val, msg) {\n new Assertion(val, msg).to.not.be.a('boolean');\n };\n\n /**\n * ### .typeOf(value, name, [message])\n *\n * Asserts that `value`'s type is `name`, as determined by\n * `Object.prototype.toString`.\n *\n * assert.typeOf({ tea: 'chai' }, 'object', 'we have an object');\n * assert.typeOf(['chai', 'jasmine'], 'array', 'we have an array');\n * assert.typeOf('tea', 'string', 'we have a string');\n * assert.typeOf(/tea/, 'regexp', 'we have a regular expression');\n * assert.typeOf(null, 'null', 'we have a null');\n * assert.typeOf(undefined, 'undefined', 'we have an undefined');\n *\n * @name typeOf\n * @param {Mixed} value\n * @param {String} name\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.typeOf = function (val, type, msg) {\n new Assertion(val, msg).to.be.a(type);\n };\n\n /**\n * ### .notTypeOf(value, name, [message])\n *\n * Asserts that `value`'s type is _not_ `name`, as determined by\n * `Object.prototype.toString`.\n *\n * assert.notTypeOf('tea', 'number', 'strings are not numbers');\n *\n * @name notTypeOf\n * @param {Mixed} value\n * @param {String} typeof name\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notTypeOf = function (val, type, msg) {\n new Assertion(val, msg).to.not.be.a(type);\n };\n\n /**\n * ### .instanceOf(object, constructor, [message])\n *\n * Asserts that `value` is an instance of `constructor`.\n *\n * var Tea = function (name) { this.name = name; }\n * , chai = new Tea('chai');\n *\n * assert.instanceOf(chai, Tea, 'chai is an instance of tea');\n *\n * @name instanceOf\n * @param {Object} object\n * @param {Constructor} constructor\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.instanceOf = function (val, type, msg) {\n new Assertion(val, msg).to.be.instanceOf(type);\n };\n\n /**\n * ### .notInstanceOf(object, constructor, [message])\n *\n * Asserts `value` is not an instance of `constructor`.\n *\n * var Tea = function (name) { this.name = name; }\n * , chai = new String('chai');\n *\n * assert.notInstanceOf(chai, Tea, 'chai is not an instance of tea');\n *\n * @name notInstanceOf\n * @param {Object} object\n * @param {Constructor} constructor\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notInstanceOf = function (val, type, msg) {\n new Assertion(val, msg).to.not.be.instanceOf(type);\n };\n\n /**\n * ### .include(haystack, needle, [message])\n *\n * Asserts that `haystack` includes `needle`. Works\n * for strings and arrays.\n *\n * assert.include('foobar', 'bar', 'foobar contains string \"bar\"');\n * assert.include([ 1, 2, 3 ], 3, 'array contains value');\n *\n * @name include\n * @param {Array|String} haystack\n * @param {Mixed} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.include = function (exp, inc, msg) {\n new Assertion(exp, msg, assert.include).include(inc);\n };\n\n /**\n * ### .notInclude(haystack, needle, [message])\n *\n * Asserts that `haystack` does not include `needle`. Works\n * for strings and arrays.\n *\n * assert.notInclude('foobar', 'baz', 'string not include substring');\n * assert.notInclude([ 1, 2, 3 ], 4, 'array not include contain value');\n *\n * @name notInclude\n * @param {Array|String} haystack\n * @param {Mixed} needle\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notInclude = function (exp, inc, msg) {\n new Assertion(exp, msg, assert.notInclude).not.include(inc);\n };\n\n /**\n * ### .match(value, regexp, [message])\n *\n * Asserts that `value` matches the regular expression `regexp`.\n *\n * assert.match('foobar', /^foo/, 'regexp matches');\n *\n * @name match\n * @param {Mixed} value\n * @param {RegExp} regexp\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.match = function (exp, re, msg) {\n new Assertion(exp, msg).to.match(re);\n };\n\n /**\n * ### .notMatch(value, regexp, [message])\n *\n * Asserts that `value` does not match the regular expression `regexp`.\n *\n * assert.notMatch('foobar', /^foo/, 'regexp does not match');\n *\n * @name notMatch\n * @param {Mixed} value\n * @param {RegExp} regexp\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notMatch = function (exp, re, msg) {\n new Assertion(exp, msg).to.not.match(re);\n };\n\n /**\n * ### .property(object, property, [message])\n *\n * Asserts that `object` has a property named by `property`.\n *\n * assert.property({ tea: { green: 'matcha' }}, 'tea');\n *\n * @name property\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.property = function (obj, prop, msg) {\n new Assertion(obj, msg).to.have.property(prop);\n };\n\n /**\n * ### .notProperty(object, property, [message])\n *\n * Asserts that `object` does _not_ have a property named by `property`.\n *\n * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee');\n *\n * @name notProperty\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notProperty = function (obj, prop, msg) {\n new Assertion(obj, msg).to.not.have.property(prop);\n };\n\n /**\n * ### .deepProperty(object, property, [message])\n *\n * Asserts that `object` has a property named by `property`, which can be a\n * string using dot- and bracket-notation for deep reference.\n *\n * assert.deepProperty({ tea: { green: 'matcha' }}, 'tea.green');\n *\n * @name deepProperty\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepProperty = function (obj, prop, msg) {\n new Assertion(obj, msg).to.have.deep.property(prop);\n };\n\n /**\n * ### .notDeepProperty(object, property, [message])\n *\n * Asserts that `object` does _not_ have a property named by `property`, which\n * can be a string using dot- and bracket-notation for deep reference.\n *\n * assert.notDeepProperty({ tea: { green: 'matcha' }}, 'tea.oolong');\n *\n * @name notDeepProperty\n * @param {Object} object\n * @param {String} property\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.notDeepProperty = function (obj, prop, msg) {\n new Assertion(obj, msg).to.not.have.deep.property(prop);\n };\n\n /**\n * ### .propertyVal(object, property, value, [message])\n *\n * Asserts that `object` has a property named by `property` with value given\n * by `value`.\n *\n * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good');\n *\n * @name propertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.propertyVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg).to.have.property(prop, val);\n };\n\n /**\n * ### .propertyNotVal(object, property, value, [message])\n *\n * Asserts that `object` has a property named by `property`, but with a value\n * different from that given by `value`.\n *\n * assert.propertyNotVal({ tea: 'is good' }, 'tea', 'is bad');\n *\n * @name propertyNotVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.propertyNotVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg).to.not.have.property(prop, val);\n };\n\n /**\n * ### .deepPropertyVal(object, property, value, [message])\n *\n * Asserts that `object` has a property named by `property` with value given\n * by `value`. `property` can use dot- and bracket-notation for deep\n * reference.\n *\n * assert.deepPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha');\n *\n * @name deepPropertyVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepPropertyVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg).to.have.deep.property(prop, val);\n };\n\n /**\n * ### .deepPropertyNotVal(object, property, value, [message])\n *\n * Asserts that `object` has a property named by `property`, but with a value\n * different from that given by `value`. `property` can use dot- and\n * bracket-notation for deep reference.\n *\n * assert.deepPropertyNotVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha');\n *\n * @name deepPropertyNotVal\n * @param {Object} object\n * @param {String} property\n * @param {Mixed} value\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.deepPropertyNotVal = function (obj, prop, val, msg) {\n new Assertion(obj, msg).to.not.have.deep.property(prop, val);\n };\n\n /**\n * ### .lengthOf(object, length, [message])\n *\n * Asserts that `object` has a `length` property with the expected value.\n *\n * assert.lengthOf([1,2,3], 3, 'array has length of 3');\n * assert.lengthOf('foobar', 6, 'string has length of 6');\n *\n * @name lengthOf\n * @param {Mixed} object\n * @param {Number} length\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.lengthOf = function (exp, len, msg) {\n new Assertion(exp, msg).to.have.length(len);\n };\n\n /**\n * ### .throws(function, [constructor/string/regexp], [string/regexp], [message])\n *\n * Asserts that `function` will throw an error that is an instance of\n * `constructor`, or alternately that it will throw an error with message\n * matching `regexp`.\n *\n * assert.throws(fn, 'function throws a reference error');\n * assert.throws(fn, /function throws a reference error/);\n * assert.throws(fn, ReferenceError);\n * assert.throws(fn, ReferenceError, 'function throws a reference error');\n * assert.throws(fn, ReferenceError, /function throws a reference error/);\n *\n * @name throws\n * @alias throw\n * @alias Throw\n * @param {Function} function\n * @param {ErrorConstructor} constructor\n * @param {RegExp} regexp\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Assert\n * @api public\n */\n\n assert.throws = function (fn, errt, errs, msg) {\n if ('string' === typeof errt || errt instanceof RegExp) {\n errs = errt;\n errt = null;\n }\n\n var assertErr = new Assertion(fn, msg).to.throw(errt, errs);\n return flag(assertErr, 'object');\n };\n\n /**\n * ### .doesNotThrow(function, [constructor/regexp], [message])\n *\n * Asserts that `function` will _not_ throw an error that is an instance of\n * `constructor`, or alternately that it will not throw an error with message\n * matching `regexp`.\n *\n * assert.doesNotThrow(fn, Error, 'function does not throw');\n *\n * @name doesNotThrow\n * @param {Function} function\n * @param {ErrorConstructor} constructor\n * @param {RegExp} regexp\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotThrow = function (fn, type, msg) {\n if ('string' === typeof type) {\n msg = type;\n type = null;\n }\n\n new Assertion(fn, msg).to.not.Throw(type);\n };\n\n /**\n * ### .operator(val1, operator, val2, [message])\n *\n * Compares two values using `operator`.\n *\n * assert.operator(1, '<', 2, 'everything is ok');\n * assert.operator(1, '>', 2, 'this will fail');\n *\n * @name operator\n * @param {Mixed} val1\n * @param {String} operator\n * @param {Mixed} val2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.operator = function (val, operator, val2, msg) {\n var ok;\n switch(operator) {\n case '==':\n ok = val == val2;\n break;\n case '===':\n ok = val === val2;\n break;\n case '>':\n ok = val > val2;\n break;\n case '>=':\n ok = val >= val2;\n break;\n case '<':\n ok = val < val2;\n break;\n case '<=':\n ok = val <= val2;\n break;\n case '!=':\n ok = val != val2;\n break;\n case '!==':\n ok = val !== val2;\n break;\n default:\n throw new Error('Invalid operator \"' + operator + '\"');\n }\n var test = new Assertion(ok, msg);\n test.assert(\n true === flag(test, 'object')\n , 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2)\n , 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2) );\n };\n\n /**\n * ### .closeTo(actual, expected, delta, [message])\n *\n * Asserts that the target is equal `expected`, to within a +/- `delta` range.\n *\n * assert.closeTo(1.5, 1, 0.5, 'numbers are close');\n *\n * @name closeTo\n * @param {Number} actual\n * @param {Number} expected\n * @param {Number} delta\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.closeTo = function (act, exp, delta, msg) {\n new Assertion(act, msg).to.be.closeTo(exp, delta);\n };\n\n /**\n * ### .approximately(actual, expected, delta, [message])\n *\n * Asserts that the target is equal `expected`, to within a +/- `delta` range.\n *\n * assert.approximately(1.5, 1, 0.5, 'numbers are close');\n *\n * @name approximately\n * @param {Number} actual\n * @param {Number} expected\n * @param {Number} delta\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.approximately = function (act, exp, delta, msg) {\n new Assertion(act, msg).to.be.approximately(exp, delta);\n };\n\n /**\n * ### .sameMembers(set1, set2, [message])\n *\n * Asserts that `set1` and `set2` have the same members.\n * Order is not taken into account.\n *\n * assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members');\n *\n * @name sameMembers\n * @param {Array} set1\n * @param {Array} set2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.sameMembers = function (set1, set2, msg) {\n new Assertion(set1, msg).to.have.same.members(set2);\n }\n\n /**\n * ### .sameDeepMembers(set1, set2, [message])\n *\n * Asserts that `set1` and `set2` have the same members - using a deep equality checking.\n * Order is not taken into account.\n *\n * assert.sameDeepMembers([ {b: 3}, {a: 2}, {c: 5} ], [ {c: 5}, {b: 3}, {a: 2} ], 'same deep members');\n *\n * @name sameDeepMembers\n * @param {Array} set1\n * @param {Array} set2\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.sameDeepMembers = function (set1, set2, msg) {\n new Assertion(set1, msg).to.have.same.deep.members(set2);\n }\n\n /**\n * ### .includeMembers(superset, subset, [message])\n *\n * Asserts that `subset` is included in `superset`.\n * Order is not taken into account.\n *\n * assert.includeMembers([ 1, 2, 3 ], [ 2, 1 ], 'include members');\n *\n * @name includeMembers\n * @param {Array} superset\n * @param {Array} subset\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.includeMembers = function (superset, subset, msg) {\n new Assertion(superset, msg).to.include.members(subset);\n }\n\n /**\n * ### .includeDeepMembers(superset, subset, [message])\n *\n * Asserts that `subset` is included in `superset` - using deep equality checking.\n * Order is not taken into account.\n * Duplicates are ignored.\n *\n * assert.includeDeepMembers([ {a: 1}, {b: 2}, {c: 3} ], [ {b: 2}, {a: 1}, {b: 2} ], 'include deep members');\n *\n * @name includeDeepMembers\n * @param {Array} superset\n * @param {Array} subset\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.includeDeepMembers = function (superset, subset, msg) {\n new Assertion(superset, msg).to.include.deep.members(subset);\n }\n\n /**\n * ### .oneOf(inList, list, [message])\n *\n * Asserts that non-object, non-array value `inList` appears in the flat array `list`.\n *\n * assert.oneOf(1, [ 2, 1 ], 'Not found in list');\n *\n * @name oneOf\n * @param {*} inList\n * @param {Array<*>} list\n * @param {String} message\n * @namespace Assert\n * @api public\n */\n\n assert.oneOf = function (inList, list, msg) {\n new Assertion(inList, msg).to.be.oneOf(list);\n }\n\n /**\n * ### .changes(function, object, property)\n *\n * Asserts that a function changes the value of a property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 22 };\n * assert.changes(fn, obj, 'val');\n *\n * @name changes\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.changes = function (fn, obj, prop) {\n new Assertion(fn).to.change(obj, prop);\n }\n\n /**\n * ### .doesNotChange(function, object, property)\n *\n * Asserts that a function does not changes the value of a property\n *\n * var obj = { val: 10 };\n * var fn = function() { console.log('foo'); };\n * assert.doesNotChange(fn, obj, 'val');\n *\n * @name doesNotChange\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotChange = function (fn, obj, prop) {\n new Assertion(fn).to.not.change(obj, prop);\n }\n\n /**\n * ### .increases(function, object, property)\n *\n * Asserts that a function increases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 13 };\n * assert.increases(fn, obj, 'val');\n *\n * @name increases\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.increases = function (fn, obj, prop) {\n new Assertion(fn).to.increase(obj, prop);\n }\n\n /**\n * ### .doesNotIncrease(function, object, property)\n *\n * Asserts that a function does not increase object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 8 };\n * assert.doesNotIncrease(fn, obj, 'val');\n *\n * @name doesNotIncrease\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotIncrease = function (fn, obj, prop) {\n new Assertion(fn).to.not.increase(obj, prop);\n }\n\n /**\n * ### .decreases(function, object, property)\n *\n * Asserts that a function decreases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 5 };\n * assert.decreases(fn, obj, 'val');\n *\n * @name decreases\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.decreases = function (fn, obj, prop) {\n new Assertion(fn).to.decrease(obj, prop);\n }\n\n /**\n * ### .doesNotDecrease(function, object, property)\n *\n * Asserts that a function does not decreases an object property\n *\n * var obj = { val: 10 };\n * var fn = function() { obj.val = 15 };\n * assert.doesNotDecrease(fn, obj, 'val');\n *\n * @name doesNotDecrease\n * @param {Function} modifier function\n * @param {Object} object\n * @param {String} property name\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.doesNotDecrease = function (fn, obj, prop) {\n new Assertion(fn).to.not.decrease(obj, prop);\n }\n\n /*!\n * ### .ifError(object)\n *\n * Asserts if value is not a false value, and throws if it is a true value.\n * This is added to allow for chai to be a drop-in replacement for Node's\n * assert class.\n *\n * var err = new Error('I am a custom error');\n * assert.ifError(err); // Rethrows err!\n *\n * @name ifError\n * @param {Object} object\n * @namespace Assert\n * @api public\n */\n\n assert.ifError = function (val) {\n if (val) {\n throw(val);\n }\n };\n\n /**\n * ### .isExtensible(object)\n *\n * Asserts that `object` is extensible (can have new properties added to it).\n *\n * assert.isExtensible({});\n *\n * @name isExtensible\n * @alias extensible\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isExtensible = function (obj, msg) {\n new Assertion(obj, msg).to.be.extensible;\n };\n\n /**\n * ### .isNotExtensible(object)\n *\n * Asserts that `object` is _not_ extensible.\n *\n * var nonExtensibleObject = Object.preventExtensions({});\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.freese({});\n *\n * assert.isNotExtensible(nonExtensibleObject);\n * assert.isNotExtensible(sealedObject);\n * assert.isNotExtensible(frozenObject);\n *\n * @name isNotExtensible\n * @alias notExtensible\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isNotExtensible = function (obj, msg) {\n new Assertion(obj, msg).to.not.be.extensible;\n };\n\n /**\n * ### .isSealed(object)\n *\n * Asserts that `object` is sealed (cannot have new properties added to it\n * and its existing properties cannot be removed).\n *\n * var sealedObject = Object.seal({});\n * var frozenObject = Object.seal({});\n *\n * assert.isSealed(sealedObject);\n * assert.isSealed(frozenObject);\n *\n * @name isSealed\n * @alias sealed\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isSealed = function (obj, msg) {\n new Assertion(obj, msg).to.be.sealed;\n };\n\n /**\n * ### .isNotSealed(object)\n *\n * Asserts that `object` is _not_ sealed.\n *\n * assert.isNotSealed({});\n *\n * @name isNotSealed\n * @alias notSealed\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isNotSealed = function (obj, msg) {\n new Assertion(obj, msg).to.not.be.sealed;\n };\n\n /**\n * ### .isFrozen(object)\n *\n * Asserts that `object` is frozen (cannot have new properties added to it\n * and its existing properties cannot be modified).\n *\n * var frozenObject = Object.freeze({});\n * assert.frozen(frozenObject);\n *\n * @name isFrozen\n * @alias frozen\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isFrozen = function (obj, msg) {\n new Assertion(obj, msg).to.be.frozen;\n };\n\n /**\n * ### .isNotFrozen(object)\n *\n * Asserts that `object` is _not_ frozen.\n *\n * assert.isNotFrozen({});\n *\n * @name isNotFrozen\n * @alias notFrozen\n * @param {Object} object\n * @param {String} message _optional_\n * @namespace Assert\n * @api public\n */\n\n assert.isNotFrozen = function (obj, msg) {\n new Assertion(obj, msg).to.not.be.frozen;\n };\n\n /*!\n * Aliases.\n */\n\n (function alias(name, as){\n assert[as] = assert[name];\n return alias;\n })\n ('isOk', 'ok')\n ('isNotOk', 'notOk')\n ('throws', 'throw')\n ('throws', 'Throw')\n ('isExtensible', 'extensible')\n ('isNotExtensible', 'notExtensible')\n ('isSealed', 'sealed')\n ('isNotSealed', 'notSealed')\n ('isFrozen', 'frozen')\n ('isNotFrozen', 'notFrozen');\n};\n","/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nmodule.exports = function (chai, util) {\n chai.expect = function (val, message) {\n return new chai.Assertion(val, message);\n };\n\n /**\n * ### .fail(actual, expected, [message], [operator])\n *\n * Throw a failure.\n *\n * @name fail\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @param {String} operator\n * @namespace Expect\n * @api public\n */\n\n chai.expect.fail = function (actual, expected, message, operator) {\n message = message || 'expect.fail()';\n throw new chai.AssertionError(message, {\n actual: actual\n , expected: expected\n , operator: operator\n }, chai.expect.fail);\n };\n};\n","/*!\n * chai\n * Copyright(c) 2011-2014 Jake Luer \n * MIT Licensed\n */\n\nmodule.exports = function (chai, util) {\n var Assertion = chai.Assertion;\n\n function loadShould () {\n // explicitly define this method as function as to have it's name to include as `ssfi`\n function shouldGetter() {\n if (this instanceof String || this instanceof Number || this instanceof Boolean ) {\n return new Assertion(this.valueOf(), null, shouldGetter);\n }\n return new Assertion(this, null, shouldGetter);\n }\n function shouldSetter(value) {\n // See https://github.com/chaijs/chai/issues/86: this makes\n // `whatever.should = someValue` actually set `someValue`, which is\n // especially useful for `global.should = require('chai').should()`.\n //\n // Note that we have to use [[DefineProperty]] instead of [[Put]]\n // since otherwise we would trigger this very setter!\n Object.defineProperty(this, 'should', {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n }\n // modify Object.prototype to have `should`\n Object.defineProperty(Object.prototype, 'should', {\n set: shouldSetter\n , get: shouldGetter\n , configurable: true\n });\n\n var should = {};\n\n /**\n * ### .fail(actual, expected, [message], [operator])\n *\n * Throw a failure.\n *\n * @name fail\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @param {String} operator\n * @namespace Should\n * @api public\n */\n\n should.fail = function (actual, expected, message, operator) {\n message = message || 'should.fail()';\n throw new chai.AssertionError(message, {\n actual: actual\n , expected: expected\n , operator: operator\n }, should.fail);\n };\n\n /**\n * ### .equal(actual, expected, [message])\n *\n * Asserts non-strict equality (`==`) of `actual` and `expected`.\n *\n * should.equal(3, '3', '== coerces values to strings');\n *\n * @name equal\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Should\n * @api public\n */\n\n should.equal = function (val1, val2, msg) {\n new Assertion(val1, msg).to.equal(val2);\n };\n\n /**\n * ### .throw(function, [constructor/string/regexp], [string/regexp], [message])\n *\n * Asserts that `function` will throw an error that is an instance of\n * `constructor`, or alternately that it will throw an error with message\n * matching `regexp`.\n *\n * should.throw(fn, 'function throws a reference error');\n * should.throw(fn, /function throws a reference error/);\n * should.throw(fn, ReferenceError);\n * should.throw(fn, ReferenceError, 'function throws a reference error');\n * should.throw(fn, ReferenceError, /function throws a reference error/);\n *\n * @name throw\n * @alias Throw\n * @param {Function} function\n * @param {ErrorConstructor} constructor\n * @param {RegExp} regexp\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Should\n * @api public\n */\n\n should.Throw = function (fn, errt, errs, msg) {\n new Assertion(fn, msg).to.Throw(errt, errs);\n };\n\n /**\n * ### .exist\n *\n * Asserts that the target is neither `null` nor `undefined`.\n *\n * var foo = 'hi';\n *\n * should.exist(foo, 'foo exists');\n *\n * @name exist\n * @namespace Should\n * @api public\n */\n\n should.exist = function (val, msg) {\n new Assertion(val, msg).to.exist;\n }\n\n // negation\n should.not = {}\n\n /**\n * ### .not.equal(actual, expected, [message])\n *\n * Asserts non-strict inequality (`!=`) of `actual` and `expected`.\n *\n * should.not.equal(3, 4, 'these numbers are not equal');\n *\n * @name not.equal\n * @param {Mixed} actual\n * @param {Mixed} expected\n * @param {String} message\n * @namespace Should\n * @api public\n */\n\n should.not.equal = function (val1, val2, msg) {\n new Assertion(val1, msg).to.not.equal(val2);\n };\n\n /**\n * ### .throw(function, [constructor/regexp], [message])\n *\n * Asserts that `function` will _not_ throw an error that is an instance of\n * `constructor`, or alternately that it will not throw an error with message\n * matching `regexp`.\n *\n * should.not.throw(fn, Error, 'function does not throw');\n *\n * @name not.throw\n * @alias not.Throw\n * @param {Function} function\n * @param {ErrorConstructor} constructor\n * @param {RegExp} regexp\n * @param {String} message\n * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types\n * @namespace Should\n * @api public\n */\n\n should.not.Throw = function (fn, errt, errs, msg) {\n new Assertion(fn, msg).to.not.Throw(errt, errs);\n };\n\n /**\n * ### .not.exist\n *\n * Asserts that the target is neither `null` nor `undefined`.\n *\n * var bar = null;\n *\n * should.not.exist(bar, 'bar does not exist');\n *\n * @name not.exist\n * @namespace Should\n * @api public\n */\n\n should.not.exist = function (val, msg) {\n new Assertion(val, msg).to.not.exist;\n }\n\n should['throw'] = should['Throw'];\n should.not['throw'] = should.not['Throw'];\n\n return should;\n };\n\n chai.should = loadShould;\n chai.Should = loadShould;\n};\n","/*!\n * Chai - addChainingMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependencies\n */\n\nvar transferFlags = require('./transferFlags');\nvar flag = require('./flag');\nvar config = require('../config');\n\n/*!\n * Module variables\n */\n\n// Check whether `__proto__` is supported\nvar hasProtoSupport = '__proto__' in Object;\n\n// Without `__proto__` support, this module will need to add properties to a function.\n// However, some Function.prototype methods cannot be overwritten,\n// and there seems no easy cross-platform way to detect them (@see chaijs/chai/issues/69).\nvar excludeNames = /^(?:length|name|arguments|caller)$/;\n\n// Cache `Function` properties\nvar call = Function.prototype.call,\n apply = Function.prototype.apply;\n\n/**\n * ### addChainableMethod (ctx, name, method, chainingBehavior)\n *\n * Adds a method to an object, such that the method can also be chained.\n *\n * utils.addChainableMethod(chai.Assertion.prototype, 'foo', function (str) {\n * var obj = utils.flag(this, 'object');\n * new chai.Assertion(obj).to.be.equal(str);\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.addChainableMethod('foo', fn, chainingBehavior);\n *\n * The result can then be used as both a method assertion, executing both `method` and\n * `chainingBehavior`, or as a language chain, which only executes `chainingBehavior`.\n *\n * expect(fooStr).to.be.foo('bar');\n * expect(fooStr).to.be.foo.equal('foo');\n *\n * @param {Object} ctx object to which the method is added\n * @param {String} name of method to add\n * @param {Function} method function to be used for `name`, when called\n * @param {Function} chainingBehavior function to be called every time the property is accessed\n * @namespace Utils\n * @name addChainableMethod\n * @api public\n */\n\nmodule.exports = function (ctx, name, method, chainingBehavior) {\n if (typeof chainingBehavior !== 'function') {\n chainingBehavior = function () { };\n }\n\n var chainableBehavior = {\n method: method\n , chainingBehavior: chainingBehavior\n };\n\n // save the methods so we can overwrite them later, if we need to.\n if (!ctx.__methods) {\n ctx.__methods = {};\n }\n ctx.__methods[name] = chainableBehavior;\n\n Object.defineProperty(ctx, name,\n { get: function () {\n chainableBehavior.chainingBehavior.call(this);\n\n var assert = function assert() {\n var old_ssfi = flag(this, 'ssfi');\n if (old_ssfi && config.includeStack === false)\n flag(this, 'ssfi', assert);\n var result = chainableBehavior.method.apply(this, arguments);\n return result === undefined ? this : result;\n };\n\n // Use `__proto__` if available\n if (hasProtoSupport) {\n // Inherit all properties from the object by replacing the `Function` prototype\n var prototype = assert.__proto__ = Object.create(this);\n // Restore the `call` and `apply` methods from `Function`\n prototype.call = call;\n prototype.apply = apply;\n }\n // Otherwise, redefine all properties (slow!)\n else {\n var asserterNames = Object.getOwnPropertyNames(ctx);\n asserterNames.forEach(function (asserterName) {\n if (!excludeNames.test(asserterName)) {\n var pd = Object.getOwnPropertyDescriptor(ctx, asserterName);\n Object.defineProperty(assert, asserterName, pd);\n }\n });\n }\n\n transferFlags(this, assert);\n return assert;\n }\n , configurable: true\n });\n};\n","/*!\n * Chai - addMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar config = require('../config');\n\n/**\n * ### .addMethod (ctx, name, method)\n *\n * Adds a method to the prototype of an object.\n *\n * utils.addMethod(chai.Assertion.prototype, 'foo', function (str) {\n * var obj = utils.flag(this, 'object');\n * new chai.Assertion(obj).to.be.equal(str);\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.addMethod('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(fooStr).to.be.foo('bar');\n *\n * @param {Object} ctx object to which the method is added\n * @param {String} name of method to add\n * @param {Function} method function to be used for name\n * @namespace Utils\n * @name addMethod\n * @api public\n */\nvar flag = require('./flag');\n\nmodule.exports = function (ctx, name, method) {\n ctx[name] = function () {\n var old_ssfi = flag(this, 'ssfi');\n if (old_ssfi && config.includeStack === false)\n flag(this, 'ssfi', ctx[name]);\n var result = method.apply(this, arguments);\n return result === undefined ? this : result;\n };\n};\n","/*!\n * Chai - addProperty utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar config = require('../config');\nvar flag = require('./flag');\n\n/**\n * ### addProperty (ctx, name, getter)\n *\n * Adds a property to the prototype of an object.\n *\n * utils.addProperty(chai.Assertion.prototype, 'foo', function () {\n * var obj = utils.flag(this, 'object');\n * new chai.Assertion(obj).to.be.instanceof(Foo);\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.addProperty('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.be.foo;\n *\n * @param {Object} ctx object to which the property is added\n * @param {String} name of property to add\n * @param {Function} getter function to be used for name\n * @namespace Utils\n * @name addProperty\n * @api public\n */\n\nmodule.exports = function (ctx, name, getter) {\n Object.defineProperty(ctx, name,\n { get: function addProperty() {\n var old_ssfi = flag(this, 'ssfi');\n if (old_ssfi && config.includeStack === false)\n flag(this, 'ssfi', addProperty);\n\n var result = getter.call(this);\n return result === undefined ? this : result;\n }\n , configurable: true\n });\n};\n","/*!\n * Chai - expectTypes utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### expectTypes(obj, types)\n *\n * Ensures that the object being tested against is of a valid type.\n *\n * utils.expectTypes(this, ['array', 'object', 'string']);\n *\n * @param {Mixed} obj constructed Assertion\n * @param {Array} type A list of allowed types for this assertion\n * @namespace Utils\n * @name expectTypes\n * @api public\n */\n\nvar AssertionError = require('assertion-error');\nvar flag = require('./flag');\nvar type = require('type-detect');\n\nmodule.exports = function (obj, types) {\n var obj = flag(obj, 'object');\n types = types.map(function (t) { return t.toLowerCase(); });\n types.sort();\n\n // Transforms ['lorem', 'ipsum'] into 'a lirum, or an ipsum'\n var str = types.map(function (t, index) {\n var art = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(t.charAt(0)) ? 'an' : 'a';\n var or = types.length > 1 && index === types.length - 1 ? 'or ' : '';\n return or + art + ' ' + t;\n }).join(', ');\n\n if (!types.some(function (expected) { return type(obj) === expected; })) {\n throw new AssertionError(\n 'object tested must be ' + str + ', but ' + type(obj) + ' given'\n );\n }\n};\n","/*!\n * Chai - flag utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### flag(object, key, [value])\n *\n * Get or set a flag value on an object. If a\n * value is provided it will be set, else it will\n * return the currently set value or `undefined` if\n * the value is not set.\n *\n * utils.flag(this, 'foo', 'bar'); // setter\n * utils.flag(this, 'foo'); // getter, returns `bar`\n *\n * @param {Object} object constructed Assertion\n * @param {String} key\n * @param {Mixed} value (optional)\n * @namespace Utils\n * @name flag\n * @api private\n */\n\nmodule.exports = function (obj, key, value) {\n var flags = obj.__flags || (obj.__flags = Object.create(null));\n if (arguments.length === 3) {\n flags[key] = value;\n } else {\n return flags[key];\n }\n};\n","/*!\n * Chai - getActual utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * # getActual(object, [actual])\n *\n * Returns the `actual` value for an Assertion\n *\n * @param {Object} object (constructed Assertion)\n * @param {Arguments} chai.Assertion.prototype.assert arguments\n * @namespace Utils\n * @name getActual\n */\n\nmodule.exports = function (obj, args) {\n return args.length > 4 ? args[4] : obj._obj;\n};\n","/*!\n * Chai - getEnumerableProperties utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### .getEnumerableProperties(object)\n *\n * This allows the retrieval of enumerable property names of an object,\n * inherited or not.\n *\n * @param {Object} object\n * @returns {Array}\n * @namespace Utils\n * @name getEnumerableProperties\n * @api public\n */\n\nmodule.exports = function getEnumerableProperties(object) {\n var result = [];\n for (var name in object) {\n result.push(name);\n }\n return result;\n};\n","/*!\n * Chai - message composition utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependancies\n */\n\nvar flag = require('./flag')\n , getActual = require('./getActual')\n , inspect = require('./inspect')\n , objDisplay = require('./objDisplay');\n\n/**\n * ### .getMessage(object, message, negateMessage)\n *\n * Construct the error message based on flags\n * and template tags. Template tags will return\n * a stringified inspection of the object referenced.\n *\n * Message template tags:\n * - `#{this}` current asserted object\n * - `#{act}` actual value\n * - `#{exp}` expected value\n *\n * @param {Object} object (constructed Assertion)\n * @param {Arguments} chai.Assertion.prototype.assert arguments\n * @namespace Utils\n * @name getMessage\n * @api public\n */\n\nmodule.exports = function (obj, args) {\n var negate = flag(obj, 'negate')\n , val = flag(obj, 'object')\n , expected = args[3]\n , actual = getActual(obj, args)\n , msg = negate ? args[2] : args[1]\n , flagMsg = flag(obj, 'message');\n\n if(typeof msg === \"function\") msg = msg();\n msg = msg || '';\n msg = msg\n .replace(/#\\{this\\}/g, function () { return objDisplay(val); })\n .replace(/#\\{act\\}/g, function () { return objDisplay(actual); })\n .replace(/#\\{exp\\}/g, function () { return objDisplay(expected); });\n\n return flagMsg ? flagMsg + ': ' + msg : msg;\n};\n","/*!\n * Chai - getName utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * # getName(func)\n *\n * Gets the name of a function, in a cross-browser way.\n *\n * @param {Function} a function (usually a constructor)\n * @namespace Utils\n * @name getName\n */\n\nmodule.exports = function (func) {\n if (func.name) return func.name;\n\n var match = /^\\s?function ([^(]*)\\(/.exec(func);\n return match && match[1] ? match[1] : \"\";\n};\n","/*!\n * Chai - getPathInfo utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar hasProperty = require('./hasProperty');\n\n/**\n * ### .getPathInfo(path, object)\n *\n * This allows the retrieval of property info in an\n * object given a string path.\n *\n * The path info consists of an object with the\n * following properties:\n *\n * * parent - The parent object of the property referenced by `path`\n * * name - The name of the final property, a number if it was an array indexer\n * * value - The value of the property, if it exists, otherwise `undefined`\n * * exists - Whether the property exists or not\n *\n * @param {String} path\n * @param {Object} object\n * @returns {Object} info\n * @namespace Utils\n * @name getPathInfo\n * @api public\n */\n\nmodule.exports = function getPathInfo(path, obj) {\n var parsed = parsePath(path),\n last = parsed[parsed.length - 1];\n\n var info = {\n parent: parsed.length > 1 ? _getPathValue(parsed, obj, parsed.length - 1) : obj,\n name: last.p || last.i,\n value: _getPathValue(parsed, obj)\n };\n info.exists = hasProperty(info.name, info.parent);\n\n return info;\n};\n\n\n/*!\n * ## parsePath(path)\n *\n * Helper function used to parse string object\n * paths. Use in conjunction with `_getPathValue`.\n *\n * var parsed = parsePath('myobject.property.subprop');\n *\n * ### Paths:\n *\n * * Can be as near infinitely deep and nested\n * * Arrays are also valid using the formal `myobject.document[3].property`.\n * * Literal dots and brackets (not delimiter) must be backslash-escaped.\n *\n * @param {String} path\n * @returns {Object} parsed\n * @api private\n */\n\nfunction parsePath (path) {\n var str = path.replace(/([^\\\\])\\[/g, '$1.[')\n , parts = str.match(/(\\\\\\.|[^.]+?)+/g);\n return parts.map(function (value) {\n var re = /^\\[(\\d+)\\]$/\n , mArr = re.exec(value);\n if (mArr) return { i: parseFloat(mArr[1]) };\n else return { p: value.replace(/\\\\([.\\[\\]])/g, '$1') };\n });\n}\n\n\n/*!\n * ## _getPathValue(parsed, obj)\n *\n * Helper companion function for `.parsePath` that returns\n * the value located at the parsed address.\n *\n * var value = getPathValue(parsed, obj);\n *\n * @param {Object} parsed definition from `parsePath`.\n * @param {Object} object to search against\n * @param {Number} object to search against\n * @returns {Object|Undefined} value\n * @api private\n */\n\nfunction _getPathValue (parsed, obj, index) {\n var tmp = obj\n , res;\n\n index = (index === undefined ? parsed.length : index);\n\n for (var i = 0, l = index; i < l; i++) {\n var part = parsed[i];\n if (tmp) {\n if ('undefined' !== typeof part.p)\n tmp = tmp[part.p];\n else if ('undefined' !== typeof part.i)\n tmp = tmp[part.i];\n if (i == (l - 1)) res = tmp;\n } else {\n res = undefined;\n }\n }\n return res;\n}\n","/*!\n * Chai - getPathValue utility\n * Copyright(c) 2012-2014 Jake Luer \n * @see https://github.com/logicalparadox/filtr\n * MIT Licensed\n */\n\nvar getPathInfo = require('./getPathInfo');\n\n/**\n * ### .getPathValue(path, object)\n *\n * This allows the retrieval of values in an\n * object given a string path.\n *\n * var obj = {\n * prop1: {\n * arr: ['a', 'b', 'c']\n * , str: 'Hello'\n * }\n * , prop2: {\n * arr: [ { nested: 'Universe' } ]\n * , str: 'Hello again!'\n * }\n * }\n *\n * The following would be the results.\n *\n * getPathValue('prop1.str', obj); // Hello\n * getPathValue('prop1.att[2]', obj); // b\n * getPathValue('prop2.arr[0].nested', obj); // Universe\n *\n * @param {String} path\n * @param {Object} object\n * @returns {Object} value or `undefined`\n * @namespace Utils\n * @name getPathValue\n * @api public\n */\nmodule.exports = function(path, obj) {\n var info = getPathInfo(path, obj);\n return info.value;\n};\n","/*!\n * Chai - getProperties utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### .getProperties(object)\n *\n * This allows the retrieval of property names of an object, enumerable or not,\n * inherited or not.\n *\n * @param {Object} object\n * @returns {Array}\n * @namespace Utils\n * @name getProperties\n * @api public\n */\n\nmodule.exports = function getProperties(object) {\n var result = Object.getOwnPropertyNames(object);\n\n function addProperty(property) {\n if (result.indexOf(property) === -1) {\n result.push(property);\n }\n }\n\n var proto = Object.getPrototypeOf(object);\n while (proto !== null) {\n Object.getOwnPropertyNames(proto).forEach(addProperty);\n proto = Object.getPrototypeOf(proto);\n }\n\n return result;\n};\n","/*!\n * Chai - hasProperty utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\nvar type = require('type-detect');\n\n/**\n * ### .hasProperty(object, name)\n *\n * This allows checking whether an object has\n * named property or numeric array index.\n *\n * Basically does the same thing as the `in`\n * operator but works properly with natives\n * and null/undefined values.\n *\n * var obj = {\n * arr: ['a', 'b', 'c']\n * , str: 'Hello'\n * }\n *\n * The following would be the results.\n *\n * hasProperty('str', obj); // true\n * hasProperty('constructor', obj); // true\n * hasProperty('bar', obj); // false\n *\n * hasProperty('length', obj.str); // true\n * hasProperty(1, obj.str); // true\n * hasProperty(5, obj.str); // false\n *\n * hasProperty('length', obj.arr); // true\n * hasProperty(2, obj.arr); // true\n * hasProperty(3, obj.arr); // false\n *\n * @param {Objuect} object\n * @param {String|Number} name\n * @returns {Boolean} whether it exists\n * @namespace Utils\n * @name getPathInfo\n * @api public\n */\n\nvar literals = {\n 'number': Number\n , 'string': String\n};\n\nmodule.exports = function hasProperty(name, obj) {\n var ot = type(obj);\n\n // Bad Object, obviously no props at all\n if(ot === 'null' || ot === 'undefined')\n return false;\n\n // The `in` operator does not work with certain literals\n // box these before the check\n if(literals[ot] && typeof obj !== 'object')\n obj = new literals[ot](obj);\n\n return name in obj;\n};\n","/*!\n * chai\n * Copyright(c) 2011 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Main exports\n */\n\nvar exports = module.exports = {};\n\n/*!\n * test utility\n */\n\nexports.test = require('./test');\n\n/*!\n * type utility\n */\n\nexports.type = require('type-detect');\n\n/*!\n * expectTypes utility\n */\nexports.expectTypes = require('./expectTypes');\n\n/*!\n * message utility\n */\n\nexports.getMessage = require('./getMessage');\n\n/*!\n * actual utility\n */\n\nexports.getActual = require('./getActual');\n\n/*!\n * Inspect util\n */\n\nexports.inspect = require('./inspect');\n\n/*!\n * Object Display util\n */\n\nexports.objDisplay = require('./objDisplay');\n\n/*!\n * Flag utility\n */\n\nexports.flag = require('./flag');\n\n/*!\n * Flag transferring utility\n */\n\nexports.transferFlags = require('./transferFlags');\n\n/*!\n * Deep equal utility\n */\n\nexports.eql = require('deep-eql');\n\n/*!\n * Deep path value\n */\n\nexports.getPathValue = require('./getPathValue');\n\n/*!\n * Deep path info\n */\n\nexports.getPathInfo = require('./getPathInfo');\n\n/*!\n * Check if a property exists\n */\n\nexports.hasProperty = require('./hasProperty');\n\n/*!\n * Function name\n */\n\nexports.getName = require('./getName');\n\n/*!\n * add Property\n */\n\nexports.addProperty = require('./addProperty');\n\n/*!\n * add Method\n */\n\nexports.addMethod = require('./addMethod');\n\n/*!\n * overwrite Property\n */\n\nexports.overwriteProperty = require('./overwriteProperty');\n\n/*!\n * overwrite Method\n */\n\nexports.overwriteMethod = require('./overwriteMethod');\n\n/*!\n * Add a chainable method\n */\n\nexports.addChainableMethod = require('./addChainableMethod');\n\n/*!\n * Overwrite chainable method\n */\n\nexports.overwriteChainableMethod = require('./overwriteChainableMethod');\n","// This is (almost) directly from Node.js utils\n// https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/util.js\n\nvar getName = require('./getName');\nvar getProperties = require('./getProperties');\nvar getEnumerableProperties = require('./getEnumerableProperties');\n\nmodule.exports = inspect;\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Boolean} showHidden Flag that shows hidden (not enumerable)\n * properties of objects.\n * @param {Number} depth Depth in which to descend in object. Default is 2.\n * @param {Boolean} colors Flag to turn on ANSI escape codes to color the\n * output. Default is false (no coloring).\n * @namespace Utils\n * @name inspect\n */\nfunction inspect(obj, showHidden, depth, colors) {\n var ctx = {\n showHidden: showHidden,\n seen: [],\n stylize: function (str) { return str; }\n };\n return formatValue(ctx, obj, (typeof depth === 'undefined' ? 2 : depth));\n}\n\n// Returns true if object is a DOM element.\nvar isDOMElement = function (object) {\n if (typeof HTMLElement === 'object') {\n return object instanceof HTMLElement;\n } else {\n return object &&\n typeof object === 'object' &&\n object.nodeType === 1 &&\n typeof object.nodeName === 'string';\n }\n};\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (value && typeof value.inspect === 'function' &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes);\n if (typeof ret !== 'string') {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // If this is a DOM element, try to get the outer HTML.\n if (isDOMElement(value)) {\n if ('outerHTML' in value) {\n return value.outerHTML;\n // This value does not have an outerHTML attribute,\n // it could still be an XML element\n } else {\n // Attempt to serialize it\n try {\n if (document.xmlVersion) {\n var xmlSerializer = new XMLSerializer();\n return xmlSerializer.serializeToString(value);\n } else {\n // Firefox 11- do not support outerHTML\n // It does, however, support innerHTML\n // Use the following to render the element\n var ns = \"http://www.w3.org/1999/xhtml\";\n var container = document.createElementNS(ns, '_');\n\n container.appendChild(value.cloneNode(false));\n html = container.innerHTML\n .replace('><', '>' + value.innerHTML + '<');\n container.innerHTML = '';\n return html;\n }\n } catch (err) {\n // This could be a non-native DOM implementation,\n // continue with the normal flow:\n // printing the element as if it is an object.\n }\n }\n }\n\n // Look up the keys of the object.\n var visibleKeys = getEnumerableProperties(value);\n var keys = ctx.showHidden ? getProperties(value) : visibleKeys;\n\n // Some type of object without properties can be shortcutted.\n // In IE, errors have a single `stack` property, or if they are vanilla `Error`,\n // a `stack` plus `description` property; ignore those for consistency.\n if (keys.length === 0 || (isError(value) && (\n (keys.length === 1 && keys[0] === 'stack') ||\n (keys.length === 2 && keys[0] === 'description' && keys[1] === 'stack')\n ))) {\n if (typeof value === 'function') {\n var name = getName(value);\n var nameSuffix = name ? ': ' + name : '';\n return ctx.stylize('[Function' + nameSuffix + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toUTCString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (typeof value === 'function') {\n var name = getName(value);\n var nameSuffix = name ? ': ' + name : '';\n base = ' [Function' + nameSuffix + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n return formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n switch (typeof value) {\n case 'undefined':\n return ctx.stylize('undefined', 'undefined');\n\n case 'string':\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n\n case 'number':\n if (value === 0 && (1/value) === -Infinity) {\n return ctx.stylize('-0', 'number');\n }\n return ctx.stylize('' + value, 'number');\n\n case 'boolean':\n return ctx.stylize('' + value, 'boolean');\n }\n // For some reason typeof null is \"object\", so special case here.\n if (value === null) {\n return ctx.stylize('null', 'null');\n }\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (Object.prototype.hasOwnProperty.call(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str;\n if (value.__lookupGetter__) {\n if (value.__lookupGetter__(key)) {\n if (value.__lookupSetter__(key)) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (value.__lookupSetter__(key)) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n }\n if (visibleKeys.indexOf(key) < 0) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(value[key]) < 0) {\n if (recurseTimes === null) {\n str = formatValue(ctx, value[key], null);\n } else {\n str = formatValue(ctx, value[key], recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (typeof name === 'undefined') {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\nfunction isArray(ar) {\n return Array.isArray(ar) ||\n (typeof ar === 'object' && objectToString(ar) === '[object Array]');\n}\n\nfunction isRegExp(re) {\n return typeof re === 'object' && objectToString(re) === '[object RegExp]';\n}\n\nfunction isDate(d) {\n return typeof d === 'object' && objectToString(d) === '[object Date]';\n}\n\nfunction isError(e) {\n return typeof e === 'object' && objectToString(e) === '[object Error]';\n}\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n","/*!\n * Chai - flag utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependancies\n */\n\nvar inspect = require('./inspect');\nvar config = require('../config');\n\n/**\n * ### .objDisplay (object)\n *\n * Determines if an object or an array matches\n * criteria to be inspected in-line for error\n * messages or should be truncated.\n *\n * @param {Mixed} javascript object to inspect\n * @name objDisplay\n * @namespace Utils\n * @api public\n */\n\nmodule.exports = function (obj) {\n var str = inspect(obj)\n , type = Object.prototype.toString.call(obj);\n\n if (config.truncateThreshold && str.length >= config.truncateThreshold) {\n if (type === '[object Function]') {\n return !obj.name || obj.name === ''\n ? '[Function]'\n : '[Function: ' + obj.name + ']';\n } else if (type === '[object Array]') {\n return '[ Array(' + obj.length + ') ]';\n } else if (type === '[object Object]') {\n var keys = Object.keys(obj)\n , kstr = keys.length > 2\n ? keys.splice(0, 2).join(', ') + ', ...'\n : keys.join(', ');\n return '{ Object (' + kstr + ') }';\n } else {\n return str;\n }\n } else {\n return str;\n }\n};\n","/*!\n * Chai - overwriteChainableMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### overwriteChainableMethod (ctx, name, method, chainingBehavior)\n *\n * Overwites an already existing chainable method\n * and provides access to the previous function or\n * property. Must return functions to be used for\n * name.\n *\n * utils.overwriteChainableMethod(chai.Assertion.prototype, 'length',\n * function (_super) {\n * }\n * , function (_super) {\n * }\n * );\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.overwriteChainableMethod('foo', fn, fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.have.length(3);\n * expect(myFoo).to.have.length.above(3);\n *\n * @param {Object} ctx object whose method / property is to be overwritten\n * @param {String} name of method / property to overwrite\n * @param {Function} method function that returns a function to be used for name\n * @param {Function} chainingBehavior function that returns a function to be used for property\n * @namespace Utils\n * @name overwriteChainableMethod\n * @api public\n */\n\nmodule.exports = function (ctx, name, method, chainingBehavior) {\n var chainableBehavior = ctx.__methods[name];\n\n var _chainingBehavior = chainableBehavior.chainingBehavior;\n chainableBehavior.chainingBehavior = function () {\n var result = chainingBehavior(_chainingBehavior).call(this);\n return result === undefined ? this : result;\n };\n\n var _method = chainableBehavior.method;\n chainableBehavior.method = function () {\n var result = method(_method).apply(this, arguments);\n return result === undefined ? this : result;\n };\n};\n","/*!\n * Chai - overwriteMethod utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### overwriteMethod (ctx, name, fn)\n *\n * Overwites an already existing method and provides\n * access to previous function. Must return function\n * to be used for name.\n *\n * utils.overwriteMethod(chai.Assertion.prototype, 'equal', function (_super) {\n * return function (str) {\n * var obj = utils.flag(this, 'object');\n * if (obj instanceof Foo) {\n * new chai.Assertion(obj.value).to.equal(str);\n * } else {\n * _super.apply(this, arguments);\n * }\n * }\n * });\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.overwriteMethod('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.equal('bar');\n *\n * @param {Object} ctx object whose method is to be overwritten\n * @param {String} name of method to overwrite\n * @param {Function} method function that returns a function to be used for name\n * @namespace Utils\n * @name overwriteMethod\n * @api public\n */\n\nmodule.exports = function (ctx, name, method) {\n var _method = ctx[name]\n , _super = function () { return this; };\n\n if (_method && 'function' === typeof _method)\n _super = _method;\n\n ctx[name] = function () {\n var result = method(_super).apply(this, arguments);\n return result === undefined ? this : result;\n }\n};\n","/*!\n * Chai - overwriteProperty utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### overwriteProperty (ctx, name, fn)\n *\n * Overwites an already existing property getter and provides\n * access to previous value. Must return function to use as getter.\n *\n * utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super) {\n * return function () {\n * var obj = utils.flag(this, 'object');\n * if (obj instanceof Foo) {\n * new chai.Assertion(obj.name).to.equal('bar');\n * } else {\n * _super.call(this);\n * }\n * }\n * });\n *\n *\n * Can also be accessed directly from `chai.Assertion`.\n *\n * chai.Assertion.overwriteProperty('foo', fn);\n *\n * Then can be used as any other assertion.\n *\n * expect(myFoo).to.be.ok;\n *\n * @param {Object} ctx object whose property is to be overwritten\n * @param {String} name of property to overwrite\n * @param {Function} getter function that returns a getter function to be used for name\n * @namespace Utils\n * @name overwriteProperty\n * @api public\n */\n\nmodule.exports = function (ctx, name, getter) {\n var _get = Object.getOwnPropertyDescriptor(ctx, name)\n , _super = function () {};\n\n if (_get && 'function' === typeof _get.get)\n _super = _get.get\n\n Object.defineProperty(ctx, name,\n { get: function () {\n var result = getter(_super).call(this);\n return result === undefined ? this : result;\n }\n , configurable: true\n });\n};\n","/*!\n * Chai - test utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependancies\n */\n\nvar flag = require('./flag');\n\n/**\n * # test(object, expression)\n *\n * Test and object for expression.\n *\n * @param {Object} object (constructed Assertion)\n * @param {Arguments} chai.Assertion.prototype.assert arguments\n * @namespace Utils\n * @name test\n */\n\nmodule.exports = function (obj, args) {\n var negate = flag(obj, 'negate')\n , expr = args[0];\n return negate ? !expr : expr;\n};\n","/*!\n * Chai - transferFlags utility\n * Copyright(c) 2012-2014 Jake Luer \n * MIT Licensed\n */\n\n/**\n * ### transferFlags(assertion, object, includeAll = true)\n *\n * Transfer all the flags for `assertion` to `object`. If\n * `includeAll` is set to `false`, then the base Chai\n * assertion flags (namely `object`, `ssfi`, and `message`)\n * will not be transferred.\n *\n *\n * var newAssertion = new Assertion();\n * utils.transferFlags(assertion, newAssertion);\n *\n * var anotherAsseriton = new Assertion(myObj);\n * utils.transferFlags(assertion, anotherAssertion, false);\n *\n * @param {Assertion} assertion the assertion to transfer the flags from\n * @param {Object} object the object to transfer the flags to; usually a new assertion\n * @param {Boolean} includeAll\n * @namespace Utils\n * @name transferFlags\n * @api private\n */\n\nmodule.exports = function (assertion, object, includeAll) {\n var flags = assertion.__flags || (assertion.__flags = Object.create(null));\n\n if (!object.__flags) {\n object.__flags = Object.create(null);\n }\n\n includeAll = arguments.length === 3 ? includeAll : true;\n\n for (var flag in flags) {\n if (includeAll ||\n (flag !== 'object' && flag !== 'ssfi' && flag != 'message')) {\n object.__flags[flag] = flags[flag];\n }\n }\n};\n","\"use strict\";\n\nfunction dedent(strings) {\n\n var raw = void 0;\n if (typeof strings === \"string\") {\n // dedent can be used as a plain function\n raw = [strings];\n } else {\n raw = strings.raw;\n }\n\n // first, perform interpolation\n var result = \"\";\n for (var i = 0; i < raw.length; i++) {\n result += raw[i].\n // join lines when there is a suppressed newline\n replace(/\\\\\\n[ \\t]*/g, \"\").\n\n // handle escaped backticks\n replace(/\\\\`/g, \"`\");\n\n if (i < (arguments.length <= 1 ? 0 : arguments.length - 1)) {\n result += arguments.length <= i + 1 ? undefined : arguments[i + 1];\n }\n }\n\n // now strip indentation\n var lines = result.split(\"\\n\");\n var mindent = null;\n lines.forEach(function (l) {\n var m = l.match(/^(\\s+)\\S+/);\n if (m) {\n var indent = m[1].length;\n if (!mindent) {\n // this is the first indented line\n mindent = indent;\n } else {\n mindent = Math.min(mindent, indent);\n }\n }\n });\n\n if (mindent !== null) {\n result = lines.map(function (l) {\n return l[0] === \" \" ? l.slice(mindent) : l;\n }).join(\"\\n\");\n }\n\n // dedent eats leading and trailing whitespace too\n result = result.trim();\n\n // handle escaped newlines at the end to ensure they don't get stripped too\n return result.replace(/\\\\n/g, \"\\n\");\n}\n\nif (typeof module !== \"undefined\") {\n module.exports = dedent;\n}\n","module.exports = require('./lib/eql');\n","/*!\n * deep-eql\n * Copyright(c) 2013 Jake Luer \n * MIT Licensed\n */\n\n/*!\n * Module dependencies\n */\n\nvar type = require('type-detect');\n\n/*!\n * Buffer.isBuffer browser shim\n */\n\nvar Buffer;\ntry { Buffer = require('buffer').Buffer; }\ncatch(ex) {\n Buffer = {};\n Buffer.isBuffer = function() { return false; }\n}\n\n/*!\n * Primary Export\n */\n\nmodule.exports = deepEqual;\n\n/**\n * Assert super-strict (egal) equality between\n * two objects of any type.\n *\n * @param {Mixed} a\n * @param {Mixed} b\n * @param {Array} memoised (optional)\n * @return {Boolean} equal match\n */\n\nfunction deepEqual(a, b, m) {\n if (sameValue(a, b)) {\n return true;\n } else if ('date' === type(a)) {\n return dateEqual(a, b);\n } else if ('regexp' === type(a)) {\n return regexpEqual(a, b);\n } else if (Buffer.isBuffer(a)) {\n return bufferEqual(a, b);\n } else if ('arguments' === type(a)) {\n return argumentsEqual(a, b, m);\n } else if (!typeEqual(a, b)) {\n return false;\n } else if (('object' !== type(a) && 'object' !== type(b))\n && ('array' !== type(a) && 'array' !== type(b))) {\n return sameValue(a, b);\n } else {\n return objectEqual(a, b, m);\n }\n}\n\n/*!\n * Strict (egal) equality test. Ensures that NaN always\n * equals NaN and `-0` does not equal `+0`.\n *\n * @param {Mixed} a\n * @param {Mixed} b\n * @return {Boolean} equal match\n */\n\nfunction sameValue(a, b) {\n if (a === b) return a !== 0 || 1 / a === 1 / b;\n return a !== a && b !== b;\n}\n\n/*!\n * Compare the types of two given objects and\n * return if they are equal. Note that an Array\n * has a type of `array` (not `object`) and arguments\n * have a type of `arguments` (not `array`/`object`).\n *\n * @param {Mixed} a\n * @param {Mixed} b\n * @return {Boolean} result\n */\n\nfunction typeEqual(a, b) {\n return type(a) === type(b);\n}\n\n/*!\n * Compare two Date objects by asserting that\n * the time values are equal using `saveValue`.\n *\n * @param {Date} a\n * @param {Date} b\n * @return {Boolean} result\n */\n\nfunction dateEqual(a, b) {\n if ('date' !== type(b)) return false;\n return sameValue(a.getTime(), b.getTime());\n}\n\n/*!\n * Compare two regular expressions by converting them\n * to string and checking for `sameValue`.\n *\n * @param {RegExp} a\n * @param {RegExp} b\n * @return {Boolean} result\n */\n\nfunction regexpEqual(a, b) {\n if ('regexp' !== type(b)) return false;\n return sameValue(a.toString(), b.toString());\n}\n\n/*!\n * Assert deep equality of two `arguments` objects.\n * Unfortunately, these must be sliced to arrays\n * prior to test to ensure no bad behavior.\n *\n * @param {Arguments} a\n * @param {Arguments} b\n * @param {Array} memoize (optional)\n * @return {Boolean} result\n */\n\nfunction argumentsEqual(a, b, m) {\n if ('arguments' !== type(b)) return false;\n a = [].slice.call(a);\n b = [].slice.call(b);\n return deepEqual(a, b, m);\n}\n\n/*!\n * Get enumerable properties of a given object.\n *\n * @param {Object} a\n * @return {Array} property names\n */\n\nfunction enumerable(a) {\n var res = [];\n for (var key in a) res.push(key);\n return res;\n}\n\n/*!\n * Simple equality for flat iterable objects\n * such as Arrays or Node.js buffers.\n *\n * @param {Iterable} a\n * @param {Iterable} b\n * @return {Boolean} result\n */\n\nfunction iterableEqual(a, b) {\n if (a.length !== b.length) return false;\n\n var i = 0;\n var match = true;\n\n for (; i < a.length; i++) {\n if (a[i] !== b[i]) {\n match = false;\n break;\n }\n }\n\n return match;\n}\n\n/*!\n * Extension to `iterableEqual` specifically\n * for Node.js Buffers.\n *\n * @param {Buffer} a\n * @param {Mixed} b\n * @return {Boolean} result\n */\n\nfunction bufferEqual(a, b) {\n if (!Buffer.isBuffer(b)) return false;\n return iterableEqual(a, b);\n}\n\n/*!\n * Block for `objectEqual` ensuring non-existing\n * values don't get in.\n *\n * @param {Mixed} object\n * @return {Boolean} result\n */\n\nfunction isValue(a) {\n return a !== null && a !== undefined;\n}\n\n/*!\n * Recursively check the equality of two objects.\n * Once basic sameness has been established it will\n * defer to `deepEqual` for each enumerable key\n * in the object.\n *\n * @param {Mixed} a\n * @param {Mixed} b\n * @return {Boolean} result\n */\n\nfunction objectEqual(a, b, m) {\n if (!isValue(a) || !isValue(b)) {\n return false;\n }\n\n if (a.prototype !== b.prototype) {\n return false;\n }\n\n var i;\n if (m) {\n for (i = 0; i < m.length; i++) {\n if ((m[i][0] === a && m[i][1] === b)\n || (m[i][0] === b && m[i][1] === a)) {\n return true;\n }\n }\n } else {\n m = [];\n }\n\n try {\n var ka = enumerable(a);\n var kb = enumerable(b);\n } catch (ex) {\n return false;\n }\n\n ka.sort();\n kb.sort();\n\n if (!iterableEqual(ka, kb)) {\n return false;\n }\n\n m.push([ a, b ]);\n\n var key;\n for (i = ka.length - 1; i >= 0; i--) {\n key = ka[i];\n if (!deepEqual(a[key], b[key], m)) {\n return false;\n }\n }\n\n return true;\n}\n","module.exports = require('./lib/type');\n","/*!\n * type-detect\n * Copyright(c) 2013 jake luer \n * MIT Licensed\n */\n\n/*!\n * Primary Exports\n */\n\nvar exports = module.exports = getType;\n\n/*!\n * Detectable javascript natives\n */\n\nvar natives = {\n '[object Array]': 'array'\n , '[object RegExp]': 'regexp'\n , '[object Function]': 'function'\n , '[object Arguments]': 'arguments'\n , '[object Date]': 'date'\n};\n\n/**\n * ### typeOf (obj)\n *\n * Use several different techniques to determine\n * the type of object being tested.\n *\n *\n * @param {Mixed} object\n * @return {String} object type\n * @api public\n */\n\nfunction getType (obj) {\n var str = Object.prototype.toString.call(obj);\n if (natives[str]) return natives[str];\n if (obj === null) return 'null';\n if (obj === undefined) return 'undefined';\n if (obj === Object(obj)) return 'object';\n return typeof obj;\n}\n\nexports.Library = Library;\n\n/**\n * ### Library\n *\n * Create a repository for custom type detection.\n *\n * ```js\n * var lib = new type.Library;\n * ```\n *\n */\n\nfunction Library () {\n this.tests = {};\n}\n\n/**\n * #### .of (obj)\n *\n * Expose replacement `typeof` detection to the library.\n *\n * ```js\n * if ('string' === lib.of('hello world')) {\n * // ...\n * }\n * ```\n *\n * @param {Mixed} object to test\n * @return {String} type\n */\n\nLibrary.prototype.of = getType;\n\n/**\n * #### .define (type, test)\n *\n * Add a test to for the `.test()` assertion.\n *\n * Can be defined as a regular expression:\n *\n * ```js\n * lib.define('int', /^[0-9]+$/);\n * ```\n *\n * ... or as a function:\n *\n * ```js\n * lib.define('bln', function (obj) {\n * if ('boolean' === lib.of(obj)) return true;\n * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ];\n * if ('string' === lib.of(obj)) obj = obj.toLowerCase();\n * return !! ~blns.indexOf(obj);\n * });\n * ```\n *\n * @param {String} type\n * @param {RegExp|Function} test\n * @api public\n */\n\nLibrary.prototype.define = function (type, test) {\n if (arguments.length === 1) return this.tests[type];\n this.tests[type] = test;\n return this;\n};\n\n/**\n * #### .test (obj, test)\n *\n * Assert that an object is of type. Will first\n * check natives, and if that does not pass it will\n * use the user defined custom tests.\n *\n * ```js\n * assert(lib.test('1', 'int'));\n * assert(lib.test('yes', 'bln'));\n * ```\n *\n * @param {Mixed} object\n * @param {String} type\n * @return {Boolean} result\n * @api public\n */\n\nLibrary.prototype.test = function (obj, type) {\n if (type === getType(obj)) return true;\n var test = this.tests[type];\n\n if (test && 'regexp' === getType(test)) {\n return test.test(obj);\n } else if (test && 'function' === getType(test)) {\n return test(obj);\n } else {\n throw new ReferenceError('Type test \"' + type + '\" not defined or invalid.');\n }\n};\n","'use strict';\n\nmodule.exports = [{\n name: 'Access Array by index (first)',\n time: 10,\n prompt: 'Return the first value of the Array',\n given: 'const fruits = [\\'apple\\', \\'banana\\'];\\r',\n answer: 'const fruits = [\\'apple\\', \\'banana\\'];\\n return fruits[0];',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, \\'apple\\') === undefined'\n }, {\n name: 'Returns a String',\n test: 'assert.isString(output) === undefined'\n }]\n}, {\n name: 'Access Array by index (first)',\n time: 10,\n prompt: 'Return the first value of the Array',\n given: 'const animals = [\\'chipmunk\\', \\'chimpanzee\\'];\\n ',\n answer: 'const animals = [\\'chipmunk\\', \\'chimpanzee\\'];\\n return animals[0];',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, \\'chipmunk\\') === undefined'\n }, {\n name: 'Returns a String',\n test: 'assert.isString(output) === undefined'\n }]\n}, {\n name: 'Access Array by index (last)',\n time: 10,\n prompt: 'Return the last value of the Array',\n given: 'const fruits = [\\'apple\\', \\'banana\\', \\'orange\\'];\\r',\n answer: 'const fruits = [\\'apple\\', \\'banana\\', \\'orange\\'];\\n return fruits[fruits.length - 1];',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, \\'orange\\') === undefined;'\n }, {\n name: 'Returns a String',\n test: 'assert.isString(output) === undefined;'\n }]\n}, {\n name: 'Access Array by index (last)',\n time: 10,\n prompt: 'Return the last value of the Array',\n given: 'const animals = [\\'dog\\', \\'hamster\\', \\'lion\\'];\\n ',\n answer: 'const animals = [\\'dog\\', \\'hamster\\', \\'lion\\'];\\n return animals[animals.length - 1];',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, \\'lion\\') === undefined;'\n }, {\n name: 'Returns a String',\n test: 'assert.isString(output) === undefined;'\n }]\n}, {\n name: 'Access Array by index (second)',\n time: 10,\n prompt: 'Return the second value of the Array',\n given: 'const fruits = [\\'apple\\', \\'banana\\'];\\r',\n answer: 'const fruits = [\\'apple\\', \\'banana\\'];\\n return fruits[1];',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, \\'banana\\') === undefined;'\n }, {\n name: 'Returns a String',\n test: 'assert.isString(output) === undefined;'\n }]\n}, {\n name: 'Access Array by index (second)',\n time: 10,\n prompt: 'Return the second value of the Array',\n given: 'const animals = [\\'kitten\\', \\'monkey\\'];\\n ',\n answer: 'const animals = [\\'kitten\\', \\'monkey\\'];\\n return animals[1];',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, \\'monkey\\') === undefined;'\n }, {\n name: 'Returns a String',\n test: 'assert.isString(output) === undefined;'\n }]\n}, {\n name: 'Array.forEach()',\n time: 20,\n prompt: 'Iterate through the array, add an \\'x\\' to the end of each fruit, return the array.',\n given: 'const fruits = [\\'apple\\', \\'banana\\'];\\r',\n answer: 'const fruits = [\\'apple\\', \\'banana\\'];\\n const newFruits = [];\\n fruits.forEach(function(item) {\\n newFruits.push(item+\\'x\\');\\n });\\n return newFruits;',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, [\\'applex\\', \\'bananax\\']) === undefined;'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 2 items',\n test: 'assert.lengthOf(output, 2) === undefined;'\n }]\n}, {\n name: 'Array.forEach()',\n time: 20,\n prompt: 'Iterate through the array, add a \\'ty\\' to the end of each animal, return the array.',\n given: 'const animals = [\\'parrot\\', \\'bat\\'];\\n ',\n answer: 'const animals = [\\'parrot\\', \\'bat\\'];\\n const newAnimals = [];\\n animals.forEach(function(item) {\\n newAnimals.push(item+\\'ty\\');\\n });\\n return newAnimals;',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, [\\'parrotty\\', \\'batty\\']) === undefined;'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 2 items',\n test: 'assert.lengthOf(output, 2) === undefined;'\n }]\n}, {\n name: 'Array.push()',\n time: 10,\n prompt: 'Add \\'orange\\' to the end of the \\'fruits\\' array and return \\'fruits\\'.',\n given: 'const fruits = [\\'apple\\', \\'banana\\'];\\r',\n answer: 'const fruits = [\\'apple\\', \\'banana\\'];\\n fruits.push(\\'orange\\');\\n return fruits;',\n tests: [{\n name: 'Correct output',\n test: '(assert.deepEqual(output, [\\'apple\\', \\'banana\\', \\'orange\\']) === undefined);'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 3 items',\n test: 'assert.lengthOf(output, 3) === undefined;'\n }]\n}, {\n name: 'Array.push()',\n time: 10,\n prompt: 'Add \\'sloth\\' to the end of the \\'animals\\' array and return \\'animals\\'.',\n given: 'const animals = [\\'crow\\', \\'ox\\'];\\r',\n answer: 'const animals = [\\'crow\\', \\'ox\\'];\\n animals.push(\\'sloth\\');\\n return animals;',\n tests: [{\n name: 'Correct output',\n test: '(assert.deepEqual(output, [\\'crow\\', \\'ox\\', \\'sloth\\']) === undefined);'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 3 items',\n test: 'assert.lengthOf(output, 3) === undefined;'\n }]\n}, {\n name: 'Array.shift()',\n time: 10,\n prompt: 'Remove \\'apple\\' from the front of the \\'fruits\\' array and return \\'fruits\\'.',\n given: 'const fruits = [\\'apple\\', \\'banana\\', \\'orange\\'];\\r',\n answer: 'const fruits = [\\'apple\\', \\'banana\\', \\'orange\\'];\\n fruits.shift();\\n return fruits;',\n tests: [{\n name: 'Output must be correct',\n test: 'assert.deepEqual(output, [\\'banana\\', \\'orange\\']) === undefined;'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 2 items',\n test: 'assert.lengthOf(output, 2) === undefined;'\n }]\n}, {\n name: 'Array.shift()',\n time: 10,\n prompt: 'Remove \\'lemur\\' from the front of the \\'animals\\' array and return \\'animals\\'.',\n given: 'const animals = [\\'lemur\\', \\'crocodile\\', \\'cat\\'];\\r',\n answer: 'const animals = [\\'lemur\\', \\'crocodile\\', \\'cat\\'];\\n animals.shift();\\n return animals;',\n tests: [{\n name: 'Output must be correct',\n test: 'assert.deepEqual(output, [\\'crocodile\\', \\'cat\\']) === undefined;'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 2 items',\n test: 'assert.lengthOf(output, 2) === undefined;'\n }]\n}, {\n name: 'Array.unshift()',\n time: 10,\n prompt: 'Add \\'strawberry\\' to the front of the \\'fruits\\' array and return \\'fruits\\'.',\n given: 'const fruits = [\\'apple\\', \\'banana\\', \\'orange\\'];\\r',\n answer: 'const fruits = [\\'apple\\', \\'banana\\', \\'orange\\'];\\n fruits.unshift(\\'strawberry\\');\\n return fruits;',\n tests: [{\n name: 'Output must be correct',\n test: '(assert.deepEqual(output, [\\n \\'strawberry\\',\\n \\'apple\\',\\n \\'banana\\',\\n \\'orange\\'\\n ]) === undefined)'\n }, {\n name: 'Must return an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 4 items',\n test: 'assert.lengthOf(output, 4) === undefined;'\n }]\n}, {\n name: 'Array.unshift()',\n time: 10,\n prompt: 'Add \\'octopus\\' to the front of the \\'animals\\' array and return \\'animals\\'.',\n given: 'const animals = [\\'pig\\', \\'colt\\', \\'antelope\\'];\\r',\n answer: 'const animals = [\\'pig\\', \\'colt\\', \\'antelope\\'];\\n animals.unshift(\\'octopus\\');\\n return animals;',\n tests: [{\n name: 'Output must be correct',\n test: '(assert.deepEqual(output, [\\n \\'octopus\\',\\n \\'pig\\',\\n \\'colt\\',\\n \\'antelope\\'\\n ]) === undefined)'\n }, {\n name: 'Must return an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 4 items',\n test: 'assert.lengthOf(output, 4) === undefined;'\n }]\n}, {\n name: 'Array.indexOf()',\n time: 10,\n prompt: 'Return the index of \\'banana\\' in the Array.',\n given: 'const fruits = [\\'strawberry\\', \\'banana\\', \\'mango\\'];\\r',\n answer: 'const fruits = [\\'strawberry\\', \\'banana\\', \\'mango\\'];\\n const ind = fruits.indexOf(\\'banana\\');\\n return ind;',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, 1) === undefined;'\n }, {\n name: 'Returns a Number',\n test: 'assert.isNumber(output) === undefined;'\n }]\n}, {\n name: 'Array.indexOf()',\n time: 10,\n prompt: 'Return the index of \\'fox\\' in the Array.',\n given: 'const animals = [\\'kangaroo\\', \\'fox\\', \\'bison\\'];\\r',\n answer: 'const animals = [\\'kangaroo\\', \\'fox\\', \\'bison\\'];\\n const ind = animals.indexOf(\\'fox\\');\\n return ind;',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, 1) === undefined;'\n }, {\n name: 'Returns a Number',\n test: 'assert.isNumber(output) === undefined;'\n }]\n}, {\n name: 'Array.concat()',\n time: 10,\n prompt: 'Merge the two arrays using Array\\'s \\'concat()\\' method. Return the resulting array.',\n given: 'const fruits = [\\'strawberry\\', \\'banana\\'];\\rconst otherFruits = [\\'pear\\',\\'peach\\'];\\r',\n answer: 'const fruits = [\\'strawberry\\', \\'banana\\'];\\n const otherFruits = [\\'pear\\',\\'peach\\'];\\n const allTheFruits = fruits.concat(otherFruits);\\n return allTheFruits;\\r',\n tests: [{\n name: 'Correct output',\n test: '(assert.deepEqual(output, [\\n \\'strawberry\\',\\n \\'banana\\',\\n \\'pear\\',\\n \\'peach\\'\\n ]) === undefined\\n );'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 4 items',\n test: 'assert.lengthOf(output, 4) === undefined;'\n }]\n}, {\n name: 'Array.concat()',\n time: 10,\n prompt: 'Merge the two arrays using Array\\'s \\'concat()\\' method. Return the resulting array.',\n given: 'const adjectives = [\\'giant\\', \\'chunky\\'];\\n const verbs = [\\'turn\\',\\'whisper\\'];\\n ',\n answer: 'const adjectives = [\\'giant\\', \\'chunky\\'];\\n const verbs = [\\'turn\\',\\'whisper\\'];\\n const words = adjectives.concat(verbs);\\n return words;',\n tests: [{\n name: 'Correct output',\n test: '(assert.deepEqual(output, [\\n \\'giant\\',\\n \\'chunky\\',\\n \\'turn\\',\\n \\'whisper\\'\\n ]) === undefined\\n );'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 4 items',\n test: 'assert.lengthOf(output, 4) === undefined;'\n }]\n}, {\n name: 'Array.join()',\n time: 10,\n prompt: 'Mix the two flavors with a \\'-\\' using Array\\'s \\'join\\' method. Return the resulting hybrid flavor.',\n given: 'const fruits = [\\'strawberry\\', \\'banana\\'];\\r',\n answer: 'const fruits = [\\'strawberry\\', \\'banana\\'];\\n const hybrid = fruits.join(\\'-\\');\\n return hybrid;\\r',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, \\'strawberry-banana\\') === undefined;'\n }, {\n name: 'Returns a String',\n test: 'assert.isString(output) === undefined;'\n }]\n}, {\n name: 'Array.join()',\n time: 10,\n prompt: 'Mix the two animals with a \\'-\\' using Array\\'s \\'join\\' method. Return the resulting hybrid animal.',\n given: 'const animals = [\\'alligator\\', \\'deer\\'];\\r',\n answer: 'const animals = [\\'alligator\\', \\'deer\\'];\\n const hybrid = animals.join(\\'-\\');\\n return hybrid;\\r',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, \\'alligator-deer\\') === undefined;'\n }, {\n name: 'Returns a String',\n test: 'assert.isString(output) === undefined;'\n }]\n}, {\n name: 'Array.slice()',\n time: 20,\n prompt: 'Return just the citrus fruits from the \\'fruits\\' array using \\'Array.slice()\\'',\n given: 'const fruits = [\\'strawberry\\', \\'orange\\', \\'lemon\\', \\'banana\\'];\\r',\n answer: 'const fruits = [\\'strawberry\\', \\'orange\\', \\'lemon\\', \\'banana\\'];\\n const citrus = fruits.slice(1, 3);\\n return citrus;',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, [\\'orange\\', \\'lemon\\']) === undefined;'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 2 items',\n test: 'assert.lengthOf(output, 2) === undefined;'\n }]\n}, {\n name: 'Array.slice()',\n time: 20,\n prompt: 'Return just the birds from the \\'animals\\' array using \\'Array.slice()\\'',\n given: 'const animals = [\\'hyena\\', \\'koala\\', \\'parrot\\', \\'canary\\'];\\n ',\n answer: 'const animals = [\\'hyena\\', \\'koala\\', \\'parrot\\', \\'canary\\'];\\n const birds = animals.slice(2, 4);\\n return birds;',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, [\\'parrot\\', \\'canary\\']) === undefined;'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 2 items',\n test: 'assert.lengthOf(output, 2) === undefined;'\n }]\n}, {\n name: 'Array.reverse()',\n time: 10,\n prompt: 'Reverse the order of the \\'fruit\\' array using \\'Array.reverse()\\'',\n given: 'const fruits = [\\'strawberry\\', \\'orange\\', \\'lemon\\', \\'banana\\'];\\r',\n answer: 'const fruits = [\\'strawberry\\', \\'orange\\', \\'lemon\\', \\'banana\\'];\\n const stiurf = fruits.reverse();\\n return stiurf;',\n tests: [{\n name: 'Correct output',\n test: '(assert.deepEqual(output, [\\n \\'banana\\',\\n \\'lemon\\',\\n \\'orange\\',\\n \\'strawberry\\'\\n ]) === undefined);'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 4 items',\n test: 'assert.lengthOf(output, 4) === undefined;'\n }, {\n name: 'First item is \\'banana\\'',\n test: 'assert.deepEqual(output[0], \\'banana\\') === undefined;'\n }]\n}, {\n name: 'Array.reverse()',\n time: 10,\n prompt: 'Reverse the order of the \\'animals\\' array using \\'Array.reverse()\\'',\n given: 'const animals = [\\'mongoose\\', \\'warthog\\', \\'elk\\', \\'baboon\\'];\\r',\n answer: 'const animals = [\\'mongoose\\', \\'warthog\\', \\'elk\\', \\'baboon\\'];\\n return animals.reverse();',\n tests: [{\n name: 'Correct output',\n test: '(assert.deepEqual(output, [\\n \\'baboon\\',\\n \\'elk\\',\\n \\'warthog\\',\\n \\'mongoose\\'\\n ]) === undefined);'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 4 items',\n test: 'assert.lengthOf(output, 4) === undefined;'\n }, {\n name: 'First item is \\'baboon\\'',\n test: 'assert.deepEqual(output[0], \\'baboon\\') === undefined;'\n }]\n}, {\n name: 'Array.sort()',\n time: 10,\n prompt: 'Return the \\'fruits\\' Array after sorting them using \\'Array.sort()\\'.',\n given: 'const fruits = [\\'strawberry\\', \\'orange\\', \\'lemon\\', \\'banana\\'];\\r',\n answer: 'const fruits = [\\'strawberry\\', \\'orange\\', \\'lemon\\', \\'banana\\'];\\n const orderlyFruit = fruits.sort();\\n return orderlyFruit;',\n tests: [{\n name: 'Correct output',\n test: '(assert.deepEqual(output, [\\n \\'banana\\',\\n \\'lemon\\',\\n \\'orange\\',\\n \\'strawberry\\'\\n ]) === undefined);'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 4 items',\n test: 'assert.lengthOf(output, 4) === undefined;'\n }, {\n name: 'First item is \\'banana\\'',\n test: 'assert.deepEqual(output[0], \\'banana\\') === undefined;'\n }]\n}, {\n name: 'Array.sort()',\n time: 10,\n prompt: 'Return the \\'animals\\' Array after sorting them using \\'Array.sort()\\'.',\n given: 'const animals = [\\'pig\\', \\'duck\\', \\'sheep\\', \\'cow\\'];\\r',\n answer: 'const animals = [\\'pig\\', \\'duck\\', \\'sheep\\', \\'cow\\'];\\n return animals.sort();',\n tests: [{\n name: 'Correct output',\n test: '(assert.deepEqual(output, [\\n \\'cow\\',\\n \\'duck\\',\\n \\'pig\\',\\n \\'sheep\\'\\n ]) === undefined);'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 4 items',\n test: 'assert.lengthOf(output, 4) === undefined;'\n }, {\n name: 'First item is \\'cow\\'',\n test: 'assert.deepEqual(output[0], \\'cow\\') === undefined;'\n }]\n}, {\n name: 'Array.lastIndexOf()',\n time: 10,\n prompt: 'Return the index of the last \\'peach\\' instance in the \\'fruit\\' array using \\'Array.lastIndexOf()\\'',\n given: 'const fruits = [\\'peach\\', \\'orange\\', \\'lemon\\', \\'peach\\'];\\r',\n answer: 'const fruits = [\\'peach\\', \\'orange\\', \\'lemon\\', \\'peach\\'];\\n const wheresTheLastPeach = fruits.lastIndexOf(\\'peach\\');\\n return wheresTheLastPeach;',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, 3) === undefined;'\n }, {\n name: 'Returns a Number',\n test: 'assert.isNumber(output) === undefined;'\n }]\n}, {\n name: 'Array.lastIndexOf()',\n time: 10,\n prompt: 'Return the index of the last \\'lynx\\' instance in the \\'animals\\' array using \\'Array.lastIndexOf()\\'',\n given: 'const animals = [\\'lynx\\', \\'rabbit\\', \\'lynx\\', \\'wombat\\'];\\r',\n answer: 'const animals = [\\'lynx\\', \\'rabbit\\', \\'lynx\\', \\'wombat\\'];\\n return animals.lastIndexOf(\\'lynx\\');',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, 2) === undefined;'\n }, {\n name: 'Returns a Number',\n test: 'assert.isNumber(output) === undefined;'\n }]\n}, {\n name: 'Array.filter()',\n time: 10,\n prompt: 'Return an array of the numbers greater than 5 in \\'numbers\\' using \\'Array.filter()\\'',\n given: 'const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\\r',\n answer: 'const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\\n const overFive = numbers.filter(num => num > 5);\\n return overFive;',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, [8, 13, 21]) === undefined;'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 3 items',\n test: 'assert.lengthOf(output, 3) === undefined;'\n }, {\n name: 'First item is 8',\n test: 'assert.deepEqual(output[0], 8) === undefined;'\n }]\n}, {\n name: 'Array.filter()',\n time: 10,\n prompt: 'Return an array of the numbers less than 12 or greater than 20 in \\'numbers\\' using \\'Array.filter()\\'',\n given: 'const numbers = [12, 10, 20, 3, 15, 8, 130, 25];\\n ',\n answer: 'const numbers = [12, 10, 20, 3, 15, 8, 130, 25];\\n return numbers.filter(num => (num < 12 || num > 20));',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, [ 10, 3, 8, 130, 25 ]) === undefined;'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 3 items',\n test: 'assert.lengthOf(output, 5) === undefined;'\n }, {\n name: 'First item is 8',\n test: 'assert.deepEqual(output[0], 10) === undefined;'\n }]\n}, {\n name: 'Array.map()',\n time: 10,\n prompt: 'Return an array of \\'numbers\\' array\\'s square roots, using \\'Array.map()\\' and \\'Math.sqrt()\\'',\n given: 'const numbers = [25, 121, 169];\\r',\n answer: 'const numbers = [25, 121, 169];\\n const roots = numbers.map(num => Math.sqrt(num));\\n return roots;',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, [5, 11, 13]) === undefined;'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 3 items',\n test: 'assert.lengthOf(output, 3) === undefined;'\n }, {\n name: 'First item is 5',\n test: 'assert.deepEqual(output[0], 5) === undefined;'\n }, {\n name: 'Last item is 13',\n test: 'assert.deepEqual(output[output.length - 1], 13) === undefined;'\n }]\n}, {\n name: 'Array.map()',\n time: 10,\n prompt: 'Return an array of \\'numbers\\' array\\'s numbers squared using \\'Array.map()\\'',\n given: 'const numbers = [8, 21, 32, 11];\\n ',\n answer: 'const numbers = [8, 21, 32, 11];\\n return numbers.map(num => num * num));',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, [64, 441, 1024, 121]) === undefined;'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 4 items',\n test: 'assert.lengthOf(output, 4) === undefined;'\n }, {\n name: 'First item is 64',\n test: 'assert.deepEqual(output[0], 64) === undefined;'\n }, {\n name: 'Last item is 121',\n test: 'assert.deepEqual(output[output.length - 1], 121) === undefined;'\n }]\n}, {\n name: 'Array.every()',\n time: 10,\n prompt: 'Return object that returns whether each array contains all even numbers using Array.every().',\n given: 'const evenNumbers = [2, 4, 6, 8];\\n const someOddNumbers = [2, 5, 6, 8];\\n function isEven(num) {\\n\\n }\\n return {\\n evenNumbers: evenNumbers.,\\n someOddNumbers: someOddNumbers.\\n };',\n answer: 'const evenNumbers = [2, 4, 6, 8];\\n const someOddNumbers = [2, 5, 6, 8];\\n function isEven(num) {\\n return num % 2 === 0\\n }\\n return {\\n evenNumbers: evenNumbers.every(isEven),\\n someOddNumbers: someOddNumbers.every(isEven)\\n };',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, {\\n evenNumbers: true,\\n someOddNumbers: false\\n }) === undefined;'\n }, {\n name: 'Returns an Object',\n test: 'assert.isObject(output) === undefined;'\n }, {\n name: 'Object has 2 items',\n test: 'assert.lengthOf(Object.keys(output), 2) === undefined;'\n }, {\n name: 'First value is true',\n test: 'assert.isTrue(output.evenNumbers) === undefined;'\n }, {\n name: 'Second value is false',\n test: 'assert.isFalse(output.someOddNumbers) === undefined;'\n }]\n}, {\n name: 'Array.some()',\n time: 10,\n prompt: 'Return \\'Object\\' that returns whether each array contains some odd numbers using \\'Array.some()\\'.',\n given: 'const evenNumbers = [2, 4, 6, 8];\\n const someOddNumbers = [2, 4, 7, 8];\\n function isOdd(num) {\\n\\n }\\n return {\\n evenNumbers: evenNumbers.,\\n someOddNumbers: someOddNumbers.\\n };',\n answer: 'const evenNumbers = [1, 3, 5, 7];\\n const someOddNumbers = [1, 3, 6, 7];\\n function isOdd(num) {\\n return num % 2 !== 0;\\n }\\n return {\\n evenNumbers: evenNumbers.some(isOdd),\\n someOddNumbers: someOddNumbers.some(isOdd)\\n };',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, {\\n evenNumbers: false,\\n someOddNumbers: true\\n }) === undefined;'\n }, {\n name: 'Returns an Object',\n test: 'assert.isObject(output) === undefined;'\n }, {\n name: 'Object has 2 items',\n test: 'assert.lengthOf(Object.keys(output), 2) === undefined;'\n }, {\n name: 'First value is false',\n test: 'assert.isFalse(output.evenNumbers) === undefined;'\n }, {\n name: 'Second value is true',\n test: 'assert.isTrue(output.someOddNumbers) === undefined;'\n }]\n}, {\n name: 'Array.reduce()',\n time: 10,\n prompt: 'Return the sum of the values in the \\'numbers\\' array using \\'Array.reduce()\\'',\n given: 'const numbers = [34, 12, 47, 112];\\n ',\n answer: 'const numbers = [34, 12, 47, 112];\\n return numbers.reduce((accumulator, currentValue) => {\\n return accumulator + currentValue;\\n } 0);',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, 205) === undefined;'\n }, {\n name: 'Returns a Number',\n test: 'assert.isNumber(output) === undefined;'\n }]\n}, {\n name: 'Array.reduce() and Array.concat()',\n time: 40,\n prompt: 'Return a flattened array using \\'Array.reduce() and Array.concat()\\'',\n given: 'const numbers = [[51, 2], [23, 5, 6], 78];\\n ',\n answer: 'const numbers = [[51, 2], [23, 5, 6], 78];\\n const flatten = arr => arr.reduce(\\n (acc, val) => acc.concat(\\n Array.isArray(val) ? flatten(val) : val\\n ),\\n []\\n );\\n return flatten(numbers)',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, [ 51, 2, 23, 5, 6, 78 ]) === undefined;'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 6 items',\n test: 'assert.lengthOf(output, 6) === undefined;'\n }, {\n name: 'First item is 51',\n test: 'assert.deepEqual(output[0], 51) === undefined;'\n }, {\n name: 'Last item is 78',\n test: 'assert.deepEqual(output[output.length - 1], 78) === undefined;'\n }]\n}, {\n name: 'Array.reduce() and Math.max()',\n time: 40,\n prompt: 'Return the highest number in the array using Array.reduce() and Math.max()\\'',\n given: 'const numbers = [4, 12, 3, 15, 7];\\n ',\n answer: 'const numbers = [4, 12, 3, 15, 7];\\n return numbers.reduce((max, current) => Math.max( max, current ));',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, 15) === undefined;'\n }, {\n name: 'Returns a Number',\n test: 'assert.isNumber(output) === undefined;'\n }]\n}];","'use strict';\n\nmodule.exports = [{\n name: 'Create Array',\n time: 10,\n prompt: 'Create and return an array that contains \\'apple\\' and \\'banana\\'',\n given: 'const fruits = [];\\rreturn fruits;',\n answer: 'const fruits = [\\'apple\\', \\'banana\\'];\\n return fruits;',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, [\\'apple\\', \\'banana\\']) === undefined;'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 2 items',\n test: 'assert.lengthOf(output, 2) === undefined;'\n }]\n}, {\n name: 'Array.pop()',\n time: 10,\n prompt: 'Remove \\'orange\\' from the end of the \\'fruits\\' array and return \\'fruits\\'.',\n given: 'const fruits = [\\'apple\\', \\'banana\\', \\'orange\\'];\\r',\n answer: 'const fruits = [\\'apple\\', \\'banana\\', \\'orange\\'];\\n fruits.pop();\\n return fruits;',\n tests: [{\n name: 'Correct output',\n test: 'assert.deepEqual(output, [\\'apple\\', \\'banana\\']) === undefined;'\n }, {\n name: 'Returns an Array',\n test: 'assert.isArray(output) === undefined;'\n }, {\n name: 'Array has 2 items',\n test: 'assert.lengthOf(output, 2) === undefined;'\n }]\n}];","// default\nconst normal = {\n initial: require('./problems/initial'),\n arrays: require('./problems/arrays')\n};\n\n// es5\nconst es5 = {\n initialES5: require('./es5/problems/initial'),\n arraysES5: require('./es5/problems/arrays')\n};\n\nmodule.exports = {\n default: normal,\n es5: es5\n};\n","module.exports = [\n {\n name: 'Access Array by index (first)',\n time: 10,\n prompt: 'Return the first value of the Array',\n given: `const fruits = ['apple', 'banana'];\\r`,\n answer: `const fruits = ['apple', 'banana'];\n return fruits[0];`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 'apple') === undefined`\n },\n {\n name: 'Returns a String',\n test: 'assert.isString(output) === undefined'\n }\n ]\n },\n {\n name: 'Access Array by index (first)',\n time: 10,\n prompt: 'Return the first value of the Array',\n given: `const animals = ['chipmunk', 'chimpanzee'];\n `,\n answer: `const animals = ['chipmunk', 'chimpanzee'];\n return animals[0];`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 'chipmunk') === undefined`\n },\n {\n name: 'Returns a String',\n test: 'assert.isString(output) === undefined'\n }\n ]\n },\n {\n name: 'Access Array by index (last)',\n time: 10,\n prompt: 'Return the last value of the Array',\n given: `const fruits = ['apple', 'banana', 'orange'];\\r`,\n answer: `const fruits = ['apple', 'banana', 'orange'];\n return fruits[fruits.length - 1];`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 'orange') === undefined;`\n },\n {\n name: 'Returns a String',\n test: `assert.isString(output) === undefined;`\n }\n ]\n },\n {\n name: 'Access Array by index (last)',\n time: 10,\n prompt: 'Return the last value of the Array',\n given: `const animals = ['dog', 'hamster', 'lion'];\n `,\n answer: `const animals = ['dog', 'hamster', 'lion'];\n return animals[animals.length - 1];`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 'lion') === undefined;`\n },\n {\n name: 'Returns a String',\n test: `assert.isString(output) === undefined;`\n }\n ]\n },\n {\n name: 'Access Array by index (second)',\n time: 10,\n prompt: 'Return the second value of the Array',\n given: `const fruits = ['apple', 'banana'];\\r`,\n answer: `const fruits = ['apple', 'banana'];\n return fruits[1];`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 'banana') === undefined;`\n },\n {\n name: 'Returns a String',\n test: `assert.isString(output) === undefined;`\n }\n ]\n },\n {\n name: 'Access Array by index (second)',\n time: 10,\n prompt: 'Return the second value of the Array',\n given: `const animals = ['kitten', 'monkey'];\n `,\n answer: `const animals = ['kitten', 'monkey'];\n return animals[1];`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 'monkey') === undefined;`\n },\n {\n name: 'Returns a String',\n test: `assert.isString(output) === undefined;`\n }\n ]\n },\n {\n name: 'Array.forEach()',\n time: 20,\n prompt: 'Iterate through the array, add an \\'x\\' to the end of each fruit, return the array.',\n given: `const fruits = ['apple', 'banana'];\\r`,\n answer: `const fruits = ['apple', 'banana'];\n const newFruits = [];\n fruits.forEach(function(item) {\n newFruits.push(item+'x');\n });\n return newFruits;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, ['applex', 'bananax']) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 2 items',\n test: `assert.lengthOf(output, 2) === undefined;`\n }\n ]\n },\n {\n name: 'Array.forEach()',\n time: 20,\n prompt: `Iterate through the array, add a 'ty' to the end of each animal, return the array.`,\n given: `const animals = ['parrot', 'bat'];\n `,\n answer: `const animals = ['parrot', 'bat'];\n const newAnimals = [];\n animals.forEach(function(item) {\n newAnimals.push(item+'ty');\n });\n return newAnimals;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, ['parrotty', 'batty']) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 2 items',\n test: `assert.lengthOf(output, 2) === undefined;`\n }\n ]\n },\n {\n name: 'Array.push()',\n time: 10,\n prompt: `Add 'orange' to the end of the 'fruits' array and return 'fruits'.`,\n given: `const fruits = ['apple', 'banana'];\\r`,\n answer: `const fruits = ['apple', 'banana'];\n fruits.push('orange');\n return fruits;`,\n tests: [\n {\n name: 'Correct output',\n test: `(assert.deepEqual(output, ['apple', 'banana', 'orange']) === undefined);`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 3 items',\n test: `assert.lengthOf(output, 3) === undefined;`\n }\n ]\n },\n {\n name: 'Array.push()',\n time: 10,\n prompt: `Add 'sloth' to the end of the 'animals' array and return 'animals'.`,\n given: `const animals = ['crow', 'ox'];\\r`,\n answer: `const animals = ['crow', 'ox'];\n animals.push('sloth');\n return animals;`,\n tests: [\n {\n name: 'Correct output',\n test: `(assert.deepEqual(output, ['crow', 'ox', 'sloth']) === undefined);`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 3 items',\n test: `assert.lengthOf(output, 3) === undefined;`\n }\n ]\n },\n {\n name: 'Array.shift()',\n time: 10,\n prompt: `Remove 'apple' from the front of the 'fruits' array and return 'fruits'.`,\n given: `const fruits = ['apple', 'banana', 'orange'];\\r`,\n answer: `const fruits = ['apple', 'banana', 'orange'];\n fruits.shift();\n return fruits;`,\n tests: [\n {\n name: 'Output must be correct',\n test: `assert.deepEqual(output, ['banana', 'orange']) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 2 items',\n test: `assert.lengthOf(output, 2) === undefined;`\n }\n ]\n },\n {\n name: 'Array.shift()',\n time: 10,\n prompt: `Remove 'lemur' from the front of the 'animals' array and return 'animals'.`,\n given: `const animals = ['lemur', 'crocodile', 'cat'];\\r`,\n answer: `const animals = ['lemur', 'crocodile', 'cat'];\n animals.shift();\n return animals;`,\n tests: [\n {\n name: 'Output must be correct',\n test: `assert.deepEqual(output, ['crocodile', 'cat']) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 2 items',\n test: `assert.lengthOf(output, 2) === undefined;`\n }\n ]\n },\n {\n name: 'Array.unshift()',\n time: 10,\n prompt: `Add 'strawberry' to the front of the 'fruits' array and return 'fruits'.`,\n given: `const fruits = ['apple', 'banana', 'orange'];\\r`,\n answer: `const fruits = ['apple', 'banana', 'orange'];\n fruits.unshift('strawberry');\n return fruits;`,\n tests: [\n {\n name: 'Output must be correct',\n test: `(assert.deepEqual(output, [\n 'strawberry',\n 'apple',\n 'banana',\n 'orange'\n ]) === undefined)`\n },\n {\n name: 'Must return an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 4 items',\n test: `assert.lengthOf(output, 4) === undefined;`\n }\n ]\n },\n {\n name: 'Array.unshift()',\n time: 10,\n prompt: `Add 'octopus' to the front of the 'animals' array and return 'animals'.`,\n given: `const animals = ['pig', 'colt', 'antelope'];\\r`,\n answer: `const animals = ['pig', 'colt', 'antelope'];\n animals.unshift('octopus');\n return animals;`,\n tests: [\n {\n name: 'Output must be correct',\n test: `(assert.deepEqual(output, [\n 'octopus',\n 'pig',\n 'colt',\n 'antelope'\n ]) === undefined)`\n },\n {\n name: 'Must return an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 4 items',\n test: `assert.lengthOf(output, 4) === undefined;`\n }\n ]\n },\n {\n name: 'Array.indexOf()',\n time: 10,\n prompt: `Return the index of 'banana' in the Array.`,\n given: `const fruits = ['strawberry', 'banana', 'mango'];\\r`,\n answer: `const fruits = ['strawberry', 'banana', 'mango'];\n const ind = fruits.indexOf('banana');\n return ind;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 1) === undefined;`\n },\n {\n name: 'Returns a Number',\n test: `assert.isNumber(output) === undefined;`\n }\n ]\n },\n {\n name: 'Array.indexOf()',\n time: 10,\n prompt: `Return the index of 'fox' in the Array.`,\n given: `const animals = ['kangaroo', 'fox', 'bison'];\\r`,\n answer: `const animals = ['kangaroo', 'fox', 'bison'];\n const ind = animals.indexOf('fox');\n return ind;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 1) === undefined;`\n },\n {\n name: 'Returns a Number',\n test: `assert.isNumber(output) === undefined;`\n }\n ]\n },\n {\n name: 'Array.concat()',\n time: 10,\n prompt: `Merge the two arrays using Array's 'concat()' method. Return the resulting array.`,\n given: `const fruits = ['strawberry', 'banana'];\\rconst otherFruits = ['pear','peach'];\\r`,\n answer: `const fruits = ['strawberry', 'banana'];\n const otherFruits = ['pear','peach'];\n const allTheFruits = fruits.concat(otherFruits);\n return allTheFruits;\\r`,\n tests: [\n {\n name: 'Correct output',\n test: `(assert.deepEqual(output, [\n 'strawberry',\n 'banana',\n 'pear',\n 'peach'\n ]) === undefined\n );`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 4 items',\n test: `assert.lengthOf(output, 4) === undefined;`\n }\n ]\n },\n {\n name: 'Array.concat()',\n time: 10,\n prompt: `Merge the two arrays using Array's 'concat()' method. Return the resulting array.`,\n given: `const adjectives = ['giant', 'chunky'];\n const verbs = ['turn','whisper'];\n `,\n answer: `const adjectives = ['giant', 'chunky'];\n const verbs = ['turn','whisper'];\n const words = adjectives.concat(verbs);\n return words;`,\n tests: [\n {\n name: 'Correct output',\n test: `(assert.deepEqual(output, [\n 'giant',\n 'chunky',\n 'turn',\n 'whisper'\n ]) === undefined\n );`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 4 items',\n test: `assert.lengthOf(output, 4) === undefined;`\n }\n ]\n },\n {\n name: 'Array.join()',\n time: 10,\n prompt: `Mix the two flavors with a '-' using Array's 'join' method. Return the resulting hybrid flavor.`,\n given: `const fruits = ['strawberry', 'banana'];\\r`,\n answer: `const fruits = ['strawberry', 'banana'];\n const hybrid = fruits.join('-');\n return hybrid;\\r`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 'strawberry-banana') === undefined;`\n },\n {\n name: 'Returns a String',\n test: `assert.isString(output) === undefined;`\n }\n ]\n },\n {\n name: 'Array.join()',\n time: 10,\n prompt: `Mix the two animals with a '-' using Array's 'join' method. Return the resulting hybrid animal.`,\n given: `const animals = ['alligator', 'deer'];\\r`,\n answer: `const animals = ['alligator', 'deer'];\n const hybrid = animals.join('-');\n return hybrid;\\r`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 'alligator-deer') === undefined;`\n },\n {\n name: 'Returns a String',\n test: `assert.isString(output) === undefined;`\n }\n ]\n },\n {\n name: 'Array.slice()',\n time: 20,\n prompt: `Return just the citrus fruits from the 'fruits' array using 'Array.slice()'`,\n given: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\\r`,\n answer: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const citrus = fruits.slice(1, 3);\n return citrus;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, ['orange', 'lemon']) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 2 items',\n test: `assert.lengthOf(output, 2) === undefined;`\n }\n ]\n },\n {\n name: 'Array.slice()',\n time: 20,\n prompt: `Return just the birds from the 'animals' array using 'Array.slice()'`,\n given: `const animals = ['hyena', 'koala', 'parrot', 'canary'];\n `,\n answer: `const animals = ['hyena', 'koala', 'parrot', 'canary'];\n const birds = animals.slice(2, 4);\n return birds;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, ['parrot', 'canary']) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 2 items',\n test: `assert.lengthOf(output, 2) === undefined;`\n }\n ]\n },\n {\n name: 'Array.reverse()',\n time: 10,\n prompt: `Reverse the order of the 'fruit' array using 'Array.reverse()'`,\n given: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\\r`,\n answer: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const stiurf = fruits.reverse();\n return stiurf;`,\n tests: [\n {\n name: 'Correct output',\n test: `(assert.deepEqual(output, [\n 'banana',\n 'lemon',\n 'orange',\n 'strawberry'\n ]) === undefined);`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 4 items',\n test: `assert.lengthOf(output, 4) === undefined;`\n },\n {\n name: `First item is 'banana'`,\n test: `assert.deepEqual(output[0], 'banana') === undefined;`\n }\n ]\n },\n {\n name: 'Array.reverse()',\n time: 10,\n prompt: `Reverse the order of the 'animals' array using 'Array.reverse()'`,\n given: `const animals = ['mongoose', 'warthog', 'elk', 'baboon'];\\r`,\n answer: `const animals = ['mongoose', 'warthog', 'elk', 'baboon'];\n return animals.reverse();`,\n tests: [\n {\n name: 'Correct output',\n test: `(assert.deepEqual(output, [\n 'baboon',\n 'elk',\n 'warthog',\n 'mongoose'\n ]) === undefined);`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 4 items',\n test: `assert.lengthOf(output, 4) === undefined;`\n },\n {\n name: `First item is 'baboon'`,\n test: `assert.deepEqual(output[0], 'baboon') === undefined;`\n }\n ]\n },\n {\n name: 'Array.sort()',\n time: 10,\n prompt: `Return the 'fruits' Array after sorting them using 'Array.sort()'.`,\n given: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\\r`,\n answer: `const fruits = ['strawberry', 'orange', 'lemon', 'banana'];\n const orderlyFruit = fruits.sort();\n return orderlyFruit;`,\n tests: [\n {\n name: 'Correct output',\n test: `(assert.deepEqual(output, [\n 'banana',\n 'lemon',\n 'orange',\n 'strawberry'\n ]) === undefined);`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 4 items',\n test: `assert.lengthOf(output, 4) === undefined;`\n },\n {\n name: `First item is 'banana'`,\n test: `assert.deepEqual(output[0], 'banana') === undefined;`\n }\n ]\n },\n {\n name: 'Array.sort()',\n time: 10,\n prompt: `Return the 'animals' Array after sorting them using 'Array.sort()'.`,\n given: `const animals = ['pig', 'duck', 'sheep', 'cow'];\\r`,\n answer: `const animals = ['pig', 'duck', 'sheep', 'cow'];\n return animals.sort();`,\n tests: [\n {\n name: 'Correct output',\n test: `(assert.deepEqual(output, [\n 'cow',\n 'duck',\n 'pig',\n 'sheep'\n ]) === undefined);`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 4 items',\n test: `assert.lengthOf(output, 4) === undefined;`\n },\n {\n name: `First item is 'cow'`,\n test: `assert.deepEqual(output[0], 'cow') === undefined;`\n }\n ]\n },\n {\n name: 'Array.lastIndexOf()',\n time: 10,\n prompt: `Return the index of the last 'peach' instance in the 'fruit' array using 'Array.lastIndexOf()'`,\n given: `const fruits = ['peach', 'orange', 'lemon', 'peach'];\\r`,\n answer: `const fruits = ['peach', 'orange', 'lemon', 'peach'];\n const wheresTheLastPeach = fruits.lastIndexOf('peach');\n return wheresTheLastPeach;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 3) === undefined;`\n },\n {\n name: 'Returns a Number',\n test: `assert.isNumber(output) === undefined;`\n }\n ]\n },\n {\n name: 'Array.lastIndexOf()',\n time: 10,\n prompt: `Return the index of the last 'lynx' instance in the 'animals' array using 'Array.lastIndexOf()'`,\n given: `const animals = ['lynx', 'rabbit', 'lynx', 'wombat'];\\r`,\n answer: `const animals = ['lynx', 'rabbit', 'lynx', 'wombat'];\n return animals.lastIndexOf('lynx');`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 2) === undefined;`\n },\n {\n name: 'Returns a Number',\n test: `assert.isNumber(output) === undefined;`\n }\n ]\n },\n {\n name: 'Array.filter()',\n time: 10,\n prompt: `Return an array of the numbers greater than 5 in 'numbers' using 'Array.filter()'`,\n given: `const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\\r`,\n answer: `const numbers = [1, 1, 2, 3, 5, 8, 13, 21];\n const overFive = numbers.filter(num => num > 5);\n return overFive;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, [8, 13, 21]) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 3 items',\n test: `assert.lengthOf(output, 3) === undefined;`\n },\n {\n name: `First item is 8`,\n test: `assert.deepEqual(output[0], 8) === undefined;`\n }\n ]\n },\n {\n name: 'Array.filter()',\n time: 10,\n prompt: `Return an array of the numbers less than 12 or greater than 20 in 'numbers' using 'Array.filter()'`,\n given: `const numbers = [12, 10, 20, 3, 15, 8, 130, 25];\n `,\n answer: `const numbers = [12, 10, 20, 3, 15, 8, 130, 25];\n return numbers.filter(num => (num < 12 || num > 20));`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, [ 10, 3, 8, 130, 25 ]) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 3 items',\n test: `assert.lengthOf(output, 5) === undefined;`\n },\n {\n name: `First item is 8`,\n test: `assert.deepEqual(output[0], 10) === undefined;`\n }\n ]\n },\n {\n name: 'Array.map()',\n time: 10,\n prompt: `Return an array of 'numbers' array's square roots, using 'Array.map()' and 'Math.sqrt()'`,\n given: `const numbers = [25, 121, 169];\\r`,\n answer: `const numbers = [25, 121, 169];\n const roots = numbers.map(num => Math.sqrt(num));\n return roots;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, [5, 11, 13]) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 3 items',\n test: `assert.lengthOf(output, 3) === undefined;`\n },\n {\n name: `First item is 5`,\n test: `assert.deepEqual(output[0], 5) === undefined;`\n },\n {\n name: `Last item is 13`,\n test: `assert.deepEqual(output[output.length - 1], 13) === undefined;`\n }\n ]\n },\n {\n name: 'Array.map()',\n time: 10,\n prompt: `Return an array of 'numbers' array's numbers squared using 'Array.map()'`,\n given: `const numbers = [8, 21, 32, 11];\n `,\n answer: `const numbers = [8, 21, 32, 11];\n return numbers.map(num => num * num));`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, [64, 441, 1024, 121]) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 4 items',\n test: `assert.lengthOf(output, 4) === undefined;`\n },\n {\n name: `First item is 64`,\n test: `assert.deepEqual(output[0], 64) === undefined;`\n },\n {\n name: `Last item is 121`,\n test: `assert.deepEqual(output[output.length - 1], 121) === undefined;`\n }\n ]\n },\n {\n name: 'Array.every()',\n time: 10,\n prompt: `Return object that returns whether each array contains all even numbers using Array.every().`,\n given: `const evenNumbers = [2, 4, 6, 8];\n const someOddNumbers = [2, 5, 6, 8];\n function isEven(num) {\n\n }\n return {\n evenNumbers: evenNumbers.,\n someOddNumbers: someOddNumbers.\n };`,\n answer: `const evenNumbers = [2, 4, 6, 8];\n const someOddNumbers = [2, 5, 6, 8];\n function isEven(num) {\n return num % 2 === 0\n }\n return {\n evenNumbers: evenNumbers.every(isEven),\n someOddNumbers: someOddNumbers.every(isEven)\n };`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, {\n evenNumbers: true,\n someOddNumbers: false\n }) === undefined;`\n },\n {\n name: 'Returns an Object',\n test: `assert.isObject(output) === undefined;`\n },\n {\n name: 'Object has 2 items',\n test: `assert.lengthOf(Object.keys(output), 2) === undefined;`\n },\n {\n name: `First value is true`,\n test: `assert.isTrue(output.evenNumbers) === undefined;`\n },\n {\n name: `Second value is false`,\n test: `assert.isFalse(output.someOddNumbers) === undefined;`\n }\n ]\n },\n {\n name: 'Array.some()',\n time: 10,\n prompt: `Return 'Object' that returns whether each array contains some odd numbers using 'Array.some()'.`,\n given: `const evenNumbers = [2, 4, 6, 8];\n const someOddNumbers = [2, 4, 7, 8];\n function isOdd(num) {\n\n }\n return {\n evenNumbers: evenNumbers.,\n someOddNumbers: someOddNumbers.\n };`,\n answer: `const evenNumbers = [1, 3, 5, 7];\n const someOddNumbers = [1, 3, 6, 7];\n function isOdd(num) {\n return num % 2 !== 0;\n }\n return {\n evenNumbers: evenNumbers.some(isOdd),\n someOddNumbers: someOddNumbers.some(isOdd)\n };`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, {\n evenNumbers: false,\n someOddNumbers: true\n }) === undefined;`\n },\n {\n name: 'Returns an Object',\n test: `assert.isObject(output) === undefined;`\n },\n {\n name: 'Object has 2 items',\n test: `assert.lengthOf(Object.keys(output), 2) === undefined;`\n },\n {\n name: `First value is false`,\n test: `assert.isFalse(output.evenNumbers) === undefined;`\n },\n {\n name: `Second value is true`,\n test: `assert.isTrue(output.someOddNumbers) === undefined;`\n }\n ]\n },\n {\n name: 'Array.reduce()',\n time: 10,\n prompt: `Return the sum of the values in the 'numbers' array using 'Array.reduce()'`,\n given: `const numbers = [34, 12, 47, 112];\n `,\n answer: `const numbers = [34, 12, 47, 112];\n return numbers.reduce((accumulator, currentValue) => {\n return accumulator + currentValue;\n } 0);`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 205) === undefined;`\n },\n {\n name: 'Returns a Number',\n test: `assert.isNumber(output) === undefined;`\n }\n ]\n },\n {\n name: 'Array.reduce() and Array.concat()',\n time: 40,\n prompt: `Return a flattened array using 'Array.reduce() and Array.concat()'`,\n given: `const numbers = [[51, 2], [23, 5, 6], 78];\n `,\n answer: `const numbers = [[51, 2], [23, 5, 6], 78];\n const flatten = arr => arr.reduce(\n (acc, val) => acc.concat(\n Array.isArray(val) ? flatten(val) : val\n ),\n []\n );\n return flatten(numbers)`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, [ 51, 2, 23, 5, 6, 78 ]) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },{\n name: 'Array has 6 items',\n test: `assert.lengthOf(output, 6) === undefined;`\n },\n {\n name: `First item is 51`,\n test: `assert.deepEqual(output[0], 51) === undefined;`\n },\n {\n name: `Last item is 78`,\n test: `assert.deepEqual(output[output.length - 1], 78) === undefined;`\n }\n ]\n },\n {\n name: 'Array.reduce() and Math.max()',\n time: 40,\n prompt: `Return the highest number in the array using Array.reduce() and Math.max()'`,\n given: `const numbers = [4, 12, 3, 15, 7];\n `,\n answer: `const numbers = [4, 12, 3, 15, 7];\n return numbers.reduce((max, current) => Math.max( max, current ));`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, 15) === undefined;`\n },\n {\n name: 'Returns a Number',\n test: `assert.isNumber(output) === undefined;`\n }\n ]\n },\n // Next problems to create:\n // reduceRight\n // splice 1, 2 items, shallow copy array\n // get array's length\n // push several items\n // decrease length to truncate array, deleting elements\n // .from()\n // .isArray()\n // .of()\n // .copyWithin()\n // .fill()\n // .sort() with a compare function\n // .inlcludes()\n // .toString()\n // .entries()\n // more .filter() problems\n // .find()\n // .findIndex()\n // .keys()\n // .values()\n // .map and template literals to return fullnames from first, last fields in object array\n // .sort() by a sub-field of objects in array, like birth years\n // .reduce() to know total dollar amount of week's spending\n // .sort() employees by how long they've been with the company\n // .reduce() sum the number of instances of each item in a repetitive array of words\n // \n];\n","module.exports = [\n {\n name: 'Create Array',\n time: 10,\n prompt: 'Create and return an array that contains \\'apple\\' and \\'banana\\'',\n given: `const fruits = [];\\rreturn fruits;`,\n answer: `const fruits = ['apple', 'banana'];\n return fruits;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, ['apple', 'banana']) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 2 items',\n test: `assert.lengthOf(output, 2) === undefined;`\n }\n ]\n },\n {\n name: 'Array.pop()',\n time: 10,\n prompt: `Remove 'orange' from the end of the 'fruits' array and return 'fruits'.`,\n given: `const fruits = ['apple', 'banana', 'orange'];\\r`,\n answer: `const fruits = ['apple', 'banana', 'orange'];\n fruits.pop();\n return fruits;`,\n tests: [\n {\n name: 'Correct output',\n test: `assert.deepEqual(output, ['apple', 'banana']) === undefined;`\n },\n {\n name: 'Returns an Array',\n test: `assert.isArray(output) === undefined;`\n },\n {\n name: 'Array has 2 items',\n test: `assert.lengthOf(output, 2) === undefined;`\n }\n ]\n }\n]\n","/*!\n * type-detect\n * Copyright(c) 2013 jake luer \n * MIT Licensed\n */\n\n/*!\n * Primary Exports\n */\n\nvar exports = module.exports = getType;\n\n/**\n * ### typeOf (obj)\n *\n * Use several different techniques to determine\n * the type of object being tested.\n *\n *\n * @param {Mixed} object\n * @return {String} object type\n * @api public\n */\nvar objectTypeRegexp = /^\\[object (.*)\\]$/;\n\nfunction getType(obj) {\n var type = Object.prototype.toString.call(obj).match(objectTypeRegexp)[1].toLowerCase();\n // Let \"new String('')\" return 'object'\n if (typeof Promise === 'function' && obj instanceof Promise) return 'promise';\n // PhantomJS has type \"DOMWindow\" for null\n if (obj === null) return 'null';\n // PhantomJS has type \"DOMWindow\" for undefined\n if (obj === undefined) return 'undefined';\n return type;\n}\n\nexports.Library = Library;\n\n/**\n * ### Library\n *\n * Create a repository for custom type detection.\n *\n * ```js\n * var lib = new type.Library;\n * ```\n *\n */\n\nfunction Library() {\n if (!(this instanceof Library)) return new Library();\n this.tests = {};\n}\n\n/**\n * #### .of (obj)\n *\n * Expose replacement `typeof` detection to the library.\n *\n * ```js\n * if ('string' === lib.of('hello world')) {\n * // ...\n * }\n * ```\n *\n * @param {Mixed} object to test\n * @return {String} type\n */\n\nLibrary.prototype.of = getType;\n\n/**\n * #### .define (type, test)\n *\n * Add a test to for the `.test()` assertion.\n *\n * Can be defined as a regular expression:\n *\n * ```js\n * lib.define('int', /^[0-9]+$/);\n * ```\n *\n * ... or as a function:\n *\n * ```js\n * lib.define('bln', function (obj) {\n * if ('boolean' === lib.of(obj)) return true;\n * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ];\n * if ('string' === lib.of(obj)) obj = obj.toLowerCase();\n * return !! ~blns.indexOf(obj);\n * });\n * ```\n *\n * @param {String} type\n * @param {RegExp|Function} test\n * @api public\n */\n\nLibrary.prototype.define = function(type, test) {\n if (arguments.length === 1) return this.tests[type];\n this.tests[type] = test;\n return this;\n};\n\n/**\n * #### .test (obj, test)\n *\n * Assert that an object is of type. Will first\n * check natives, and if that does not pass it will\n * use the user defined custom tests.\n *\n * ```js\n * assert(lib.test('1', 'int'));\n * assert(lib.test('yes', 'bln'));\n * ```\n *\n * @param {Mixed} object\n * @param {String} type\n * @return {Boolean} result\n * @api public\n */\n\nLibrary.prototype.test = function(obj, type) {\n if (type === getType(obj)) return true;\n var test = this.tests[type];\n\n if (test && 'regexp' === getType(test)) {\n return test.test(obj);\n } else if (test && 'function' === getType(test)) {\n return test(obj);\n } else {\n throw new ReferenceError('Type test \"' + type + '\" not defined or invalid.');\n }\n};\n","(function (document, window) {\n // DEPENDENCIES\n // ============================================================\n const probs = require('pjs-problems').es5;\n const dedent = require('dedent');\n const assert = require('chai').assert;\n\n // PROBLEM TEMPLATE NICE-IFICATION\n // ============================================================\n\n function dedentStrings(problems) {\n return problems.map(prob => {\n prob.given = dedent(prob.given)\n prob.answer = dedent(prob.answer)\n return prob\n });\n }\n\n\n // PROBLEMS\n // ============================================================\n\n let problems = [];\n Object.keys(probs).forEach(subject => {\n problems.push(...probs[subject]);\n });\n problems = dedentStrings(problems);\n\n\n // CONFIG\n // ============================================================\n\n // Hoist current problem\n let currentProblem;\n\n // Keys to ignore while user is navigating around the textarea but not changing any code\n const ignoreKeyCodes = [\n 9, // Tab\n 37, // Left arrow\n 39, // Right arrow\n 38, // Up arrow\n 40 // Down arrow\n ];\n\n let config = {\n shuffle: true,\n timer: false,\n currentIndex: 0\n };\n\n let state = {\n currentProblem: getCurrentProblem(problems)\n }\n\n\n // HELPERS\n // ============================================================\n\n function debounce(func, wait, immediate) {\n let timeout;\n return function () {\n const context = this;\n const args = arguments;\n const later = function () {\n timeout = null;\n if (!immediate) {\n func.apply(context, args);\n }\n };\n const callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) {\n func.apply(context, args);\n }\n };\n }\n\n // UI\n // ============================================================\n\n // elements\n const problemEl = document.getElementById('problem');\n const codeEl = document.getElementById('code');\n const testSuiteEl = document.getElementById('test-suite');\n const testTotalEl = document.getElementById('test-total');\n const evalConsoleEl = document.getElementById('eval-output');\n const assertConsoleEl = document.getElementById('assert-output');\n const shuffleProblemsButtonEl = document.getElementById('shuffle-problems');\n const previousProblemButtonEl = document.getElementById('prev-problem');\n const nextProblemButtonEl = document.getElementById('next-problem');\n\n // LOCALSTORE\n // --------------------------------------------------------------------------------\n\n // Pull config from localstorage\n if (window.localStorage) {\n const localConfig = localStorage.getItem('js_practice_config');\n if (localConfig) {\n try {\n config = JSON.parse(localConfig);\n loadApp(config);\n } catch (err) {\n console.log('LOCAL_CONFIG PARSE ERR:', err);\n }\n } else {\n console.log('LOCAL_CONFIG: No local config');\n loadApp(config);\n }\n }\n\n function updateLocalstore(config) {\n return new Promise((resolve, reject) => {\n if (window.localStorage) {\n localStorage.setItem('js_practice_config', JSON.stringify(config));\n console.log('Saved config: ', config);\n resolve();\n } else {\n reject();\n }\n });\n }\n\n // Get indexes\n function getRandomIndex(problemsArr) {\n const ind = Math.floor(Math.random() * problemsArr.length);\n config.currentIndex = ind;\n updateLocalstore(config);\n return ind;\n }\n\n function getPreviousIndex(problemsArr) {\n let probInd;\n const currentIndex = config.currentIndex;\n // If at beginning, go to end\n if (currentIndex === 0) {\n probInd = problemsArr.length - 1;\n } else {\n probInd = currentIndex - 1;\n }\n return probInd;\n }\n\n function getNextIndex(problemsArr) {\n let probInd;\n const currentIndex = config.currentIndex;\n // If at end or invalid, restart series\n if (currentIndex >= problemsArr.length - 1 || currentIndex < 0) {\n probInd = 0;\n } else {\n probInd = currentIndex + 1;\n }\n return probInd;\n }\n\n // Get problems\n function getCurrentProblem(problemsArr) {\n return problemsArr[config.currentIndex];\n }\n\n function previousProblem() {\n console.log('previousProblem!');\n // Activate back button, for visual queue of nav feedback\n previousProblemButtonEl.classList.add('active');\n config.currentIndex = config.shuffle\n ? getRandomIndex(problems)\n : getPreviousIndex(problems);\n updateLocalstore(config).then(() => {\n window.location.reload();\n });\n }\n\n function nextProblem() {\n console.log('nextProblem!');\n // Activate next button, for visual queue of nav feedback\n nextProblemButtonEl.classList.add('active');\n config.currentIndex = config.shuffle\n ? getRandomIndex(problems)\n : getNextIndex(problems);\n updateLocalstore(config).then(() => {\n window.location.reload();\n });\n }\n\n function toggleShuffle() {\n console.log('toggle shuffle!');\n config.shuffle = !config.shuffle; // Flip it\n shuffleProblemsButtonEl.classList.toggle('active');\n previousProblemButtonEl.parentNode.classList.toggle('hidden');\n updateLocalstore(config);\n }\n\n function loadProblem(problemObj) {\n state.currentProblem = problemObj;\n // Prob question\n problemEl.innerText = problemObj.prompt;\n // Prob given code\n if (problemObj.given) {\n codeEl.value = problemObj.given;\n }\n // Seed the tests, pass (init = true) as second param\n testSuite(null, true);\n }\n\n // TODO: Build the assert errors into the test dom on each update.\n function updateTests(testStatus, init) {\n if (init === true) {\n buildTests(state.currentProblem.tests);\n }\n updateTestStatus(testStatus);\n }\n\n function buildTests(tests) {\n if (tests) {\n const testsDom = tests\n .map(test => {\n return `
\n
[✘]
\n
${test.name}
\n
`;\n })\n .join('');\n testSuiteEl.innerHTML = testsDom;\n }\n }\n\n function updateTestStatus(testStatuses) {\n if (!testStatuses) {\n throw new Error('No testStatuses provided.');\n }\n // Find out if all tests have passed or not\n let allPassed = true;\n testStatuses.forEach(testPassed => {\n if (testPassed !== true) {\n allPassed = false;\n }\n });\n const testEls = [].slice.call(testSuiteEl.querySelectorAll('.test-state'));\n testEls.forEach((testStatusEl, iter) => {\n if (testStatuses[iter] === true) {\n testStatusEl.innerHTML = '[✓]';\n testStatusEl.classList.remove('fail');\n testStatusEl.classList.add('pass');\n } else {\n testStatusEl.innerHTML = '[✘]';\n testStatusEl.classList.remove('pass');\n testStatusEl.classList.add('fail');\n }\n });\n\n if (allPassed === true) {\n testTotalEl.innerText = 'PASS';\n testTotalEl.classList.remove('fail');\n testTotalEl.classList.add('pass');\n } else {\n testTotalEl.innerText = 'FAIL';\n testTotalEl.classList.remove('pass');\n testTotalEl.classList.add('fail');\n }\n }\n\n function printAssertError(errObj) {\n // Make element string\n let inner = '';\n if (errObj !== null) {\n inner = `\n
\n Expected: ${JSON.stringify(errObj.expected)}\n Actual: ${JSON.stringify(errObj.actual)}\n
`;\n }\n\n // Prepend element\n assertConsoleEl.innerHTML = inner;\n }\n\n function printEvalOutput(errObj, output) {\n // Make element string\n let inner = '';\n if (errObj && errObj.message !== undefined) {\n inner = `\n
\n Syntax Error: ${JSON.stringify(errObj.message)}\n
`;\n } else if (output) {\n inner = `\n
\n Output: ${JSON.stringify(output)}\n
`;\n }\n // Prepend element\n evalConsoleEl.innerHTML = inner;\n }\n\n\n // VERIFICATION LOGIC\n // ============================================================\n\n function testSuite(init) {\n // Show 'working' indicator\n testTotalEl.classList.toggle('working');\n // Run stuff\n const output = getOutput(codeEl.value);\n // Run tests on code, return object/array of test results\n const tested = runTests(output);\n // Hide 'working' indicator\n testTotalEl.classList.toggle('working');\n // Update UI with results\n updateTests(tested, init);\n }\n\n function getOutput(code) {\n let evald = false;\n try {\n evald = eval(`(function(){${code}})()`); // eslint-disable-line no-eval\n printEvalOutput(null, evald); // Print current output\n } catch (err) {\n printEvalOutput(err);\n }\n return evald;\n }\n\n function runTests(output) {\n let tested = false;\n tested = state.currentProblem.tests.map(test => {\n let testOutcome = false;\n try {\n if (output) {\n testOutcome = eval(test.test);\n }\n printAssertError(null);\n } catch (err) {\n printAssertError(err);\n }\n return testOutcome;\n });\n return tested;\n }\n\n // Wrapped to prevent race with local config retrieval\n function loadApp(config) {\n console.log('loading app!');\n\n // Show current toggle state\n if (config.shuffle === true) {\n shuffleProblemsButtonEl.classList.add('active');\n previousProblemButtonEl.parentNode.classList.add('hidden');\n }\n\n // Keybinding stuff\n // ============================================================\n\n // Debounced code validation\n const debouncedInputValidation = debounce(e => {\n // If not arrow keys or other non-character keys\n if (ignoreKeyCodes.indexOf(e.keyCode) === -1) {\n // Run test suite\n testSuite();\n }\n }, 200);\n\n function problemNav(e) {\n // Go to previous problem keybinding\n // If CMD/CTRL + SHIFT + RETURN/ENTER\n if (config.shuffle === false && e.keyCode === 13 && e.shiftKey && (e.metaKey || e.ctrlKey)) {\n // Go to next problem\n previousProblem();\n } else if (e.keyCode === 13 && !e.shiftKey && (e.metaKey || e.ctrlKey)) {\n // Go to next problem keybinding\n // If CMD/CTRL + RETURN/ENTER\n // Go to next problem\n nextProblem();\n }\n }\n\n // Event Bindings\n // ============================================================\n\n // Bind it up\n codeEl.addEventListener('keydown', debouncedInputValidation);\n document.addEventListener('keydown', problemNav);\n shuffleProblemsButtonEl.addEventListener('click', toggleShuffle);\n previousProblemButtonEl.addEventListener('click', previousProblem);\n nextProblemButtonEl.addEventListener('click', nextProblem);\n\n // Start it up!\n // Load current problem\n const currProb = getCurrentProblem(problems);\n loadProblem(currProb);\n // Initalized test suite with starting failures\n testSuite(true);\n }\n})(document, window);\n"]} \ No newline at end of file diff --git a/public/service-worker.js b/public/service-worker.js index 408294f..0e0f7c6 100644 --- a/public/service-worker.js +++ b/public/service-worker.js @@ -1,2 +1,2 @@ -"use strict";function setOfCachedUrls(e){return e.keys().then(function(e){return e.map(function(e){return e.url})}).then(function(e){return new Set(e)})}var precacheConfig=[["/dist/css/style.css","ba4d66c91d1ed66848154a34ab4948cf"],["/dist/img/back.svg","898ada2a32ec64bd5b6959c22e8f231d"],["/dist/img/monitor.svg","348592da5567b5a3c46acfb5dcd341bc"],["/dist/img/next.svg","045593410b9f51390e750b9e1e7fff15"],["/dist/img/reload.svg","a0ab1b765280e4d22e6fb747042f6503"],["/dist/img/shuffle.svg","3a5e3c1bf04eb3493d8a2ffa547aa58f"],["/dist/img/social-banner.png","7c1a8058bb3d00c2b40283c735748cfc"],["/dist/js/bundle.min.js","26e9f75378c4964e08802b99e960f4bc"],["/dist/js/loadJS.js","72c55936069f60560a386e46f462c73a"],["/dist/js/sw-registration.js","677217d8e642c1ccff69fc01c96b4431"],["/index.html","c7522a5d3255caca0f12c5282ef0644d"]],cacheName="sw-precache-v3--"+(self.registration?self.registration.scope:""),ignoreUrlParametersMatching=[/^utm_/],addDirectoryIndex=function(e,t){var n=new URL(e);return"/"===n.pathname.slice(-1)&&(n.pathname+=t),n.toString()},cleanResponse=function(e){return e.redirected?("body"in e?Promise.resolve(e.body):e.blob()).then(function(t){return new Response(t,{headers:e.headers,status:e.status,statusText:e.statusText})}):Promise.resolve(e)},createCacheKey=function(e,t,n,r){var a=new URL(e);return r&&a.pathname.match(r)||(a.search+=(a.search?"&":"")+encodeURIComponent(t)+"="+encodeURIComponent(n)),a.toString()},isPathWhitelisted=function(e,t){if(0===e.length)return!0;var n=new URL(t).pathname;return e.some(function(e){return n.match(e)})},stripIgnoredUrlParameters=function(e,t){var n=new URL(e);return n.hash="",n.search=n.search.slice(1).split("&").map(function(e){return e.split("=")}).filter(function(e){return t.every(function(t){return!t.test(e[0])})}).map(function(e){return e.join("=")}).join("&"),n.toString()},hashParamName="_sw-precache",urlsToCacheKeys=new Map(precacheConfig.map(function(e){var t=e[0],n=e[1],r=new URL(t,self.location),a=createCacheKey(r,hashParamName,n,!1);return[r.toString(),a]}));self.addEventListener("install",function(e){e.waitUntil(caches.open(cacheName).then(function(e){return setOfCachedUrls(e).then(function(t){return Promise.all(Array.from(urlsToCacheKeys.values()).map(function(n){if(!t.has(n)){var r=new Request(n,{credentials:"same-origin"});return fetch(r).then(function(t){if(!t.ok)throw new Error("Request for "+n+" returned a response with status "+t.status);return cleanResponse(t).then(function(t){return e.put(n,t)})})}}))})}).then(function(){return self.skipWaiting()}))}),self.addEventListener("activate",function(e){var t=new Set(urlsToCacheKeys.values());e.waitUntil(caches.open(cacheName).then(function(e){return e.keys().then(function(n){return Promise.all(n.map(function(n){if(!t.has(n.url))return e.delete(n)}))})}).then(function(){return self.clients.claim()}))}),self.addEventListener("fetch",function(e){if("GET"===e.request.method){var t,n=stripIgnoredUrlParameters(e.request.url,ignoreUrlParametersMatching);(t=urlsToCacheKeys.has(n))||(n=addDirectoryIndex(n,"index.html"),t=urlsToCacheKeys.has(n));t&&e.respondWith(caches.open(cacheName).then(function(e){return e.match(urlsToCacheKeys.get(n)).then(function(e){if(e)return e;throw Error("The cached response that was expected is missing.")})}).catch(function(t){return console.warn('Couldn\'t serve response for "%s" from cache: %O',e.request.url,t),fetch(e.request)}))}}); +"use strict";function setOfCachedUrls(e){return e.keys().then(function(e){return e.map(function(e){return e.url})}).then(function(e){return new Set(e)})}var precacheConfig=[["/dist/css/style.css","ba4d66c91d1ed66848154a34ab4948cf"],["/dist/img/back.svg","898ada2a32ec64bd5b6959c22e8f231d"],["/dist/img/monitor.svg","348592da5567b5a3c46acfb5dcd341bc"],["/dist/img/next.svg","045593410b9f51390e750b9e1e7fff15"],["/dist/img/reload.svg","a0ab1b765280e4d22e6fb747042f6503"],["/dist/img/shuffle.svg","3a5e3c1bf04eb3493d8a2ffa547aa58f"],["/dist/img/social-banner.png","7c1a8058bb3d00c2b40283c735748cfc"],["/dist/js/bundle.min.js","ba4cc9351b6d922df7a491a73df81778"],["/dist/js/loadJS.js","72c55936069f60560a386e46f462c73a"],["/dist/js/sw-registration.js","677217d8e642c1ccff69fc01c96b4431"],["/index.html","c7522a5d3255caca0f12c5282ef0644d"]],cacheName="sw-precache-v3--"+(self.registration?self.registration.scope:""),ignoreUrlParametersMatching=[/^utm_/],addDirectoryIndex=function(e,t){var n=new URL(e);return"/"===n.pathname.slice(-1)&&(n.pathname+=t),n.toString()},cleanResponse=function(e){return e.redirected?("body"in e?Promise.resolve(e.body):e.blob()).then(function(t){return new Response(t,{headers:e.headers,status:e.status,statusText:e.statusText})}):Promise.resolve(e)},createCacheKey=function(e,t,n,r){var a=new URL(e);return r&&a.pathname.match(r)||(a.search+=(a.search?"&":"")+encodeURIComponent(t)+"="+encodeURIComponent(n)),a.toString()},isPathWhitelisted=function(e,t){if(0===e.length)return!0;var n=new URL(t).pathname;return e.some(function(e){return n.match(e)})},stripIgnoredUrlParameters=function(e,t){var n=new URL(e);return n.hash="",n.search=n.search.slice(1).split("&").map(function(e){return e.split("=")}).filter(function(e){return t.every(function(t){return!t.test(e[0])})}).map(function(e){return e.join("=")}).join("&"),n.toString()},hashParamName="_sw-precache",urlsToCacheKeys=new Map(precacheConfig.map(function(e){var t=e[0],n=e[1],r=new URL(t,self.location),a=createCacheKey(r,hashParamName,n,!1);return[r.toString(),a]}));self.addEventListener("install",function(e){e.waitUntil(caches.open(cacheName).then(function(e){return setOfCachedUrls(e).then(function(t){return Promise.all(Array.from(urlsToCacheKeys.values()).map(function(n){if(!t.has(n)){var r=new Request(n,{credentials:"same-origin"});return fetch(r).then(function(t){if(!t.ok)throw new Error("Request for "+n+" returned a response with status "+t.status);return cleanResponse(t).then(function(t){return e.put(n,t)})})}}))})}).then(function(){return self.skipWaiting()}))}),self.addEventListener("activate",function(e){var t=new Set(urlsToCacheKeys.values());e.waitUntil(caches.open(cacheName).then(function(e){return e.keys().then(function(n){return Promise.all(n.map(function(n){if(!t.has(n.url))return e.delete(n)}))})}).then(function(){return self.clients.claim()}))}),self.addEventListener("fetch",function(e){if("GET"===e.request.method){var t,n=stripIgnoredUrlParameters(e.request.url,ignoreUrlParametersMatching);(t=urlsToCacheKeys.has(n))||(n=addDirectoryIndex(n,"index.html"),t=urlsToCacheKeys.has(n));t&&e.respondWith(caches.open(cacheName).then(function(e){return e.match(urlsToCacheKeys.get(n)).then(function(e){if(e)return e;throw Error("The cached response that was expected is missing.")})}).catch(function(t){return console.warn('Couldn\'t serve response for "%s" from cache: %O',e.request.url,t),fetch(e.request)}))}}); //# sourceMappingURL=service-worker.js.map diff --git a/public/service-worker.js.map b/public/service-worker.js.map index 7af7bdb..ecbc16d 100644 --- a/public/service-worker.js.map +++ b/public/service-worker.js.map @@ -1 +1 @@ -{"version":3,"sources":["service-worker.js"],"names":["setOfCachedUrls","cache","keys","then","requests","map","request","url","urls","Set","precacheConfig","cacheName","self","registration","scope","ignoreUrlParametersMatching","addDirectoryIndex","originalUrl","index","URL","pathname","slice","toString","cleanResponse","originalResponse","redirected","Promise","resolve","body","blob","Response","headers","status","statusText","createCacheKey","paramName","paramValue","dontCacheBustUrlsMatching","match","search","encodeURIComponent","isPathWhitelisted","whitelist","absoluteUrlString","length","path","some","whitelistedPathRegex","stripIgnoredUrlParameters","hash","split","kv","filter","every","ignoredRegex","test","join","hashParamName","urlsToCacheKeys","Map","item","relativeUrl","absoluteUrl","location","cacheKey","addEventListener","event","waitUntil","caches","open","cachedUrls","all","Array","from","values","has","Request","credentials","fetch","response","ok","Error","responseToCache","put","skipWaiting","setOfExpectedUrls","existingRequests","existingRequest","delete","clients","claim","method","shouldRespond","respondWith","get","catch","e","console","warn"],"mappings":"AAqCA,aAyGA,SAASA,gBAAgBC,GACvB,OAAOA,EAAMC,OAAOC,KAAK,SAASC,GAChC,OAAOA,EAASC,IAAI,SAASC,GAC3B,OAAOA,EAAQC,QAEhBJ,KAAK,SAASK,GACf,OAAO,IAAIC,IAAID,KA7GnB,IAAIE,iBAAmB,sBAAsB,qCAAqC,qBAAqB,qCAAqC,wBAAwB,qCAAqC,qBAAqB,qCAAqC,uBAAuB,qCAAqC,wBAAwB,qCAAqC,8BAA8B,qCAAqC,yBAAyB,qCAAqC,qBAAqB,qCAAqC,8BAA8B,qCAAqC,cAAc,qCACpoBC,UAAY,oBAAsBC,KAAKC,aAAeD,KAAKC,aAAaC,MAAQ,IAGhFC,6BAA+B,SAI/BC,kBAAoB,SAAUC,EAAaC,GAC3C,IAAIX,EAAM,IAAIY,IAAIF,GAIlB,MAH+B,MAA3BV,EAAIa,SAASC,OAAO,KACtBd,EAAIa,UAAYF,GAEXX,EAAIe,YAGXC,cAAgB,SAAUC,GAE1B,OAAKA,EAAiBC,YAMJ,SAAUD,EAC1BE,QAAQC,QAAQH,EAAiBI,MACjCJ,EAAiBK,QAEA1B,KAAK,SAASyB,GAE/B,OAAO,IAAIE,SAASF,GAClBG,QAASP,EAAiBO,QAC1BC,OAAQR,EAAiBQ,OACzBC,WAAYT,EAAiBS,eAdxBP,QAAQC,QAAQH,IAmBzBU,eAAiB,SAAUjB,EAAakB,EAAWC,EAC5BC,GAEvB,IAAI9B,EAAM,IAAIY,IAAIF,GAUlB,OANKoB,GACC9B,EAAIa,SAASkB,MAAMD,KACvB9B,EAAIgC,SAAWhC,EAAIgC,OAAS,IAAM,IAChCC,mBAAmBL,GAAa,IAAMK,mBAAmBJ,IAGtD7B,EAAIe,YAGXmB,kBAAoB,SAAUC,EAAWC,GAEzC,GAAyB,IAArBD,EAAUE,OACZ,OAAO,EAIT,IAAIC,EAAO,IAAK1B,IAAIwB,GAAoBvB,SACxC,OAAOsB,EAAUI,KAAK,SAASC,GAC7B,OAAOF,EAAKP,MAAMS,MAIpBC,0BAA4B,SAAU/B,EACtCF,GACA,IAAIR,EAAM,IAAIY,IAAIF,GAmBlB,OAjBAV,EAAI0C,KAAO,GAEX1C,EAAIgC,OAAShC,EAAIgC,OAAOlB,MAAM,GAC3B6B,MAAM,KACN7C,IAAI,SAAS8C,GACZ,OAAOA,EAAGD,MAAM,OAEjBE,OAAO,SAASD,GACf,OAAOpC,EAA4BsC,MAAM,SAASC,GAChD,OAAQA,EAAaC,KAAKJ,EAAG,QAGhC9C,IAAI,SAAS8C,GACZ,OAAOA,EAAGK,KAAK,OAEhBA,KAAK,KAEDjD,EAAIe,YAIXmC,cAAgB,eAChBC,gBAAkB,IAAIC,IACxBjD,eAAeL,IAAI,SAASuD,GAC1B,IAAIC,EAAcD,EAAK,GACnBX,EAAOW,EAAK,GACZE,EAAc,IAAI3C,IAAI0C,EAAajD,KAAKmD,UACxCC,EAAW9B,eAAe4B,EAAaL,cAAeR,GAAM,GAChE,OAAQa,EAAYxC,WAAY0C,MAcpCpD,KAAKqD,iBAAiB,UAAW,SAASC,GACxCA,EAAMC,UACJC,OAAOC,KAAK1D,WAAWR,KAAK,SAASF,GACnC,OAAOD,gBAAgBC,GAAOE,KAAK,SAASmE,GAC1C,OAAO5C,QAAQ6C,IACbC,MAAMC,KAAKf,gBAAgBgB,UAAUrE,IAAI,SAAS2D,GAEhD,IAAKM,EAAWK,IAAIX,GAAW,CAC7B,IAAI1D,EAAU,IAAIsE,QAAQZ,GAAWa,YAAa,gBAClD,OAAOC,MAAMxE,GAASH,KAAK,SAAS4E,GAGlC,IAAKA,EAASC,GACZ,MAAM,IAAIC,MAAM,eAAiBjB,EAAW,oCAChBe,EAAS/C,QAGvC,OAAOT,cAAcwD,GAAU5E,KAAK,SAAS+E,GAC3C,OAAOjF,EAAMkF,IAAInB,EAAUkB,eAOtC/E,KAAK,WAGN,OAAOS,KAAKwE,mBAMlBxE,KAAKqD,iBAAiB,WAAY,SAASC,GACzC,IAAImB,EAAoB,IAAI5E,IAAIiD,gBAAgBgB,UAEhDR,EAAMC,UACJC,OAAOC,KAAK1D,WAAWR,KAAK,SAASF,GACnC,OAAOA,EAAMC,OAAOC,KAAK,SAASmF,GAChC,OAAO5D,QAAQ6C,IACbe,EAAiBjF,IAAI,SAASkF,GAC5B,IAAKF,EAAkBV,IAAIY,EAAgBhF,KACzC,OAAON,EAAMuF,OAAOD,UAK3BpF,KAAK,WAEN,OAAOS,KAAK6E,QAAQC,aAO1B9E,KAAKqD,iBAAiB,QAAS,SAASC,GACtC,GAA6B,QAAzBA,EAAM5D,QAAQqF,OAAkB,CAIlC,IAAIC,EAIArF,EAAMyC,0BAA0BkB,EAAM5D,QAAQC,IAAKQ,8BACvD6E,EAAgBlC,gBAAgBiB,IAAIpE,MAMlCA,EAAMS,kBAAkBT,EAFL,cAGnBqF,EAAgBlC,gBAAgBiB,IAAIpE,IAgBlCqF,GACF1B,EAAM2B,YACJzB,OAAOC,KAAK1D,WAAWR,KAAK,SAASF,GACnC,OAAOA,EAAMqC,MAAMoB,gBAAgBoC,IAAIvF,IAAMJ,KAAK,SAAS4E,GACzD,GAAIA,EACF,OAAOA,EAET,MAAME,MAAM,yDAEbc,MAAM,SAASC,GAIhB,OADAC,QAAQC,KAAK,mDAAoDhC,EAAM5D,QAAQC,IAAKyF,GAC7ElB,MAAMZ,EAAM5D","file":"service-worker.js","sourcesContent":["/**\n * Copyright 2016 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n*/\n\n// DO NOT EDIT THIS GENERATED OUTPUT DIRECTLY!\n// This file should be overwritten as part of your build process.\n// If you need to extend the behavior of the generated service worker, the best approach is to write\n// additional code and include it using the importScripts option:\n// https://github.com/GoogleChrome/sw-precache#importscripts-arraystring\n//\n// Alternatively, it's possible to make changes to the underlying template file and then use that as the\n// new base for generating output, via the templateFilePath option:\n// https://github.com/GoogleChrome/sw-precache#templatefilepath-string\n//\n// If you go that route, make sure that whenever you update your sw-precache dependency, you reconcile any\n// changes made to this original template file with your modified copy.\n\n// This generated service worker JavaScript will precache your site's resources.\n// The code needs to be saved in a .js file at the top-level of your site, and registered\n// from your pages in order to be used. See\n// https://github.com/googlechrome/sw-precache/blob/master/demo/app/js/service-worker-registration.js\n// for an example of how you can register this script and handle various service worker events.\n\n/* eslint-env worker, serviceworker */\n/* eslint-disable indent, no-unused-vars, no-multiple-empty-lines, max-nested-callbacks, space-before-function-paren, quotes, comma-spacing */\n'use strict';\n\nvar precacheConfig = [[\"/dist/css/style.css\",\"ba4d66c91d1ed66848154a34ab4948cf\"],[\"/dist/img/back.svg\",\"898ada2a32ec64bd5b6959c22e8f231d\"],[\"/dist/img/monitor.svg\",\"348592da5567b5a3c46acfb5dcd341bc\"],[\"/dist/img/next.svg\",\"045593410b9f51390e750b9e1e7fff15\"],[\"/dist/img/reload.svg\",\"a0ab1b765280e4d22e6fb747042f6503\"],[\"/dist/img/shuffle.svg\",\"3a5e3c1bf04eb3493d8a2ffa547aa58f\"],[\"/dist/img/social-banner.png\",\"7c1a8058bb3d00c2b40283c735748cfc\"],[\"/dist/js/bundle.min.js\",\"26e9f75378c4964e08802b99e960f4bc\"],[\"/dist/js/loadJS.js\",\"72c55936069f60560a386e46f462c73a\"],[\"/dist/js/sw-registration.js\",\"677217d8e642c1ccff69fc01c96b4431\"],[\"/index.html\",\"c7522a5d3255caca0f12c5282ef0644d\"]];\nvar cacheName = 'sw-precache-v3--' + (self.registration ? self.registration.scope : '');\n\n\nvar ignoreUrlParametersMatching = [/^utm_/];\n\n\n\nvar addDirectoryIndex = function (originalUrl, index) {\n var url = new URL(originalUrl);\n if (url.pathname.slice(-1) === '/') {\n url.pathname += index;\n }\n return url.toString();\n };\n\nvar cleanResponse = function (originalResponse) {\n // If this is not a redirected response, then we don't have to do anything.\n if (!originalResponse.redirected) {\n return Promise.resolve(originalResponse);\n }\n\n // Firefox 50 and below doesn't support the Response.body stream, so we may\n // need to read the entire body to memory as a Blob.\n var bodyPromise = 'body' in originalResponse ?\n Promise.resolve(originalResponse.body) :\n originalResponse.blob();\n\n return bodyPromise.then(function(body) {\n // new Response() is happy when passed either a stream or a Blob.\n return new Response(body, {\n headers: originalResponse.headers,\n status: originalResponse.status,\n statusText: originalResponse.statusText\n });\n });\n };\n\nvar createCacheKey = function (originalUrl, paramName, paramValue,\n dontCacheBustUrlsMatching) {\n // Create a new URL object to avoid modifying originalUrl.\n var url = new URL(originalUrl);\n\n // If dontCacheBustUrlsMatching is not set, or if we don't have a match,\n // then add in the extra cache-busting URL parameter.\n if (!dontCacheBustUrlsMatching ||\n !(url.pathname.match(dontCacheBustUrlsMatching))) {\n url.search += (url.search ? '&' : '') +\n encodeURIComponent(paramName) + '=' + encodeURIComponent(paramValue);\n }\n\n return url.toString();\n };\n\nvar isPathWhitelisted = function (whitelist, absoluteUrlString) {\n // If the whitelist is empty, then consider all URLs to be whitelisted.\n if (whitelist.length === 0) {\n return true;\n }\n\n // Otherwise compare each path regex to the path of the URL passed in.\n var path = (new URL(absoluteUrlString)).pathname;\n return whitelist.some(function(whitelistedPathRegex) {\n return path.match(whitelistedPathRegex);\n });\n };\n\nvar stripIgnoredUrlParameters = function (originalUrl,\n ignoreUrlParametersMatching) {\n var url = new URL(originalUrl);\n // Remove the hash; see https://github.com/GoogleChrome/sw-precache/issues/290\n url.hash = '';\n\n url.search = url.search.slice(1) // Exclude initial '?'\n .split('&') // Split into an array of 'key=value' strings\n .map(function(kv) {\n return kv.split('='); // Split each 'key=value' string into a [key, value] array\n })\n .filter(function(kv) {\n return ignoreUrlParametersMatching.every(function(ignoredRegex) {\n return !ignoredRegex.test(kv[0]); // Return true iff the key doesn't match any of the regexes.\n });\n })\n .map(function(kv) {\n return kv.join('='); // Join each [key, value] array into a 'key=value' string\n })\n .join('&'); // Join the array of 'key=value' strings into a string with '&' in between each\n\n return url.toString();\n };\n\n\nvar hashParamName = '_sw-precache';\nvar urlsToCacheKeys = new Map(\n precacheConfig.map(function(item) {\n var relativeUrl = item[0];\n var hash = item[1];\n var absoluteUrl = new URL(relativeUrl, self.location);\n var cacheKey = createCacheKey(absoluteUrl, hashParamName, hash, false);\n return [absoluteUrl.toString(), cacheKey];\n })\n);\n\nfunction setOfCachedUrls(cache) {\n return cache.keys().then(function(requests) {\n return requests.map(function(request) {\n return request.url;\n });\n }).then(function(urls) {\n return new Set(urls);\n });\n}\n\nself.addEventListener('install', function(event) {\n event.waitUntil(\n caches.open(cacheName).then(function(cache) {\n return setOfCachedUrls(cache).then(function(cachedUrls) {\n return Promise.all(\n Array.from(urlsToCacheKeys.values()).map(function(cacheKey) {\n // If we don't have a key matching url in the cache already, add it.\n if (!cachedUrls.has(cacheKey)) {\n var request = new Request(cacheKey, {credentials: 'same-origin'});\n return fetch(request).then(function(response) {\n // Bail out of installation unless we get back a 200 OK for\n // every request.\n if (!response.ok) {\n throw new Error('Request for ' + cacheKey + ' returned a ' +\n 'response with status ' + response.status);\n }\n\n return cleanResponse(response).then(function(responseToCache) {\n return cache.put(cacheKey, responseToCache);\n });\n });\n }\n })\n );\n });\n }).then(function() {\n \n // Force the SW to transition from installing -> active state\n return self.skipWaiting();\n \n })\n );\n});\n\nself.addEventListener('activate', function(event) {\n var setOfExpectedUrls = new Set(urlsToCacheKeys.values());\n\n event.waitUntil(\n caches.open(cacheName).then(function(cache) {\n return cache.keys().then(function(existingRequests) {\n return Promise.all(\n existingRequests.map(function(existingRequest) {\n if (!setOfExpectedUrls.has(existingRequest.url)) {\n return cache.delete(existingRequest);\n }\n })\n );\n });\n }).then(function() {\n \n return self.clients.claim();\n \n })\n );\n});\n\n\nself.addEventListener('fetch', function(event) {\n if (event.request.method === 'GET') {\n // Should we call event.respondWith() inside this fetch event handler?\n // This needs to be determined synchronously, which will give other fetch\n // handlers a chance to handle the request if need be.\n var shouldRespond;\n\n // First, remove all the ignored parameters and hash fragment, and see if we\n // have that URL in our cache. If so, great! shouldRespond will be true.\n var url = stripIgnoredUrlParameters(event.request.url, ignoreUrlParametersMatching);\n shouldRespond = urlsToCacheKeys.has(url);\n\n // If shouldRespond is false, check again, this time with 'index.html'\n // (or whatever the directoryIndex option is set to) at the end.\n var directoryIndex = 'index.html';\n if (!shouldRespond && directoryIndex) {\n url = addDirectoryIndex(url, directoryIndex);\n shouldRespond = urlsToCacheKeys.has(url);\n }\n\n // If shouldRespond is still false, check to see if this is a navigation\n // request, and if so, whether the URL matches navigateFallbackWhitelist.\n var navigateFallback = '';\n if (!shouldRespond &&\n navigateFallback &&\n (event.request.mode === 'navigate') &&\n isPathWhitelisted([], event.request.url)) {\n url = new URL(navigateFallback, self.location).toString();\n shouldRespond = urlsToCacheKeys.has(url);\n }\n\n // If shouldRespond was set to true at any point, then call\n // event.respondWith(), using the appropriate cache key.\n if (shouldRespond) {\n event.respondWith(\n caches.open(cacheName).then(function(cache) {\n return cache.match(urlsToCacheKeys.get(url)).then(function(response) {\n if (response) {\n return response;\n }\n throw Error('The cached response that was expected is missing.');\n });\n }).catch(function(e) {\n // Fall back to just fetch()ing the request if some unexpected error\n // prevented the cached response from being valid.\n console.warn('Couldn\\'t serve response for \"%s\" from cache: %O', event.request.url, e);\n return fetch(event.request);\n })\n );\n }\n }\n});\n\n\n\n\n\n\n\n"]} \ No newline at end of file +{"version":3,"sources":["service-worker.js"],"names":["setOfCachedUrls","cache","keys","then","requests","map","request","url","urls","Set","precacheConfig","cacheName","self","registration","scope","ignoreUrlParametersMatching","addDirectoryIndex","originalUrl","index","URL","pathname","slice","toString","cleanResponse","originalResponse","redirected","Promise","resolve","body","blob","Response","headers","status","statusText","createCacheKey","paramName","paramValue","dontCacheBustUrlsMatching","match","search","encodeURIComponent","isPathWhitelisted","whitelist","absoluteUrlString","length","path","some","whitelistedPathRegex","stripIgnoredUrlParameters","hash","split","kv","filter","every","ignoredRegex","test","join","hashParamName","urlsToCacheKeys","Map","item","relativeUrl","absoluteUrl","location","cacheKey","addEventListener","event","waitUntil","caches","open","cachedUrls","all","Array","from","values","has","Request","credentials","fetch","response","ok","Error","responseToCache","put","skipWaiting","setOfExpectedUrls","existingRequests","existingRequest","delete","clients","claim","method","shouldRespond","respondWith","get","catch","e","console","warn"],"mappings":"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","file":"service-worker.js","sourcesContent":["/**\n * Copyright 2016 Google Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n*/\n\n// DO NOT EDIT THIS GENERATED OUTPUT DIRECTLY!\n// This file should be overwritten as part of your build process.\n// If you need to extend the behavior of the generated service worker, the best approach is to write\n// additional code and include it using the importScripts option:\n// https://github.com/GoogleChrome/sw-precache#importscripts-arraystring\n//\n// Alternatively, it's possible to make changes to the underlying template file and then use that as the\n// new base for generating output, via the templateFilePath option:\n// https://github.com/GoogleChrome/sw-precache#templatefilepath-string\n//\n// If you go that route, make sure that whenever you update your sw-precache dependency, you reconcile any\n// changes made to this original template file with your modified copy.\n\n// This generated service worker JavaScript will precache your site's resources.\n// The code needs to be saved in a .js file at the top-level of your site, and registered\n// from your pages in order to be used. See\n// https://github.com/googlechrome/sw-precache/blob/master/demo/app/js/service-worker-registration.js\n// for an example of how you can register this script and handle various service worker events.\n\n/* eslint-env worker, serviceworker */\n/* eslint-disable indent, no-unused-vars, no-multiple-empty-lines, max-nested-callbacks, space-before-function-paren, quotes, comma-spacing */\n'use strict';\n\nvar precacheConfig = [[\"/dist/css/style.css\",\"ba4d66c91d1ed66848154a34ab4948cf\"],[\"/dist/img/back.svg\",\"898ada2a32ec64bd5b6959c22e8f231d\"],[\"/dist/img/monitor.svg\",\"348592da5567b5a3c46acfb5dcd341bc\"],[\"/dist/img/next.svg\",\"045593410b9f51390e750b9e1e7fff15\"],[\"/dist/img/reload.svg\",\"a0ab1b765280e4d22e6fb747042f6503\"],[\"/dist/img/shuffle.svg\",\"3a5e3c1bf04eb3493d8a2ffa547aa58f\"],[\"/dist/img/social-banner.png\",\"7c1a8058bb3d00c2b40283c735748cfc\"],[\"/dist/js/bundle.min.js\",\"ba4cc9351b6d922df7a491a73df81778\"],[\"/dist/js/loadJS.js\",\"72c55936069f60560a386e46f462c73a\"],[\"/dist/js/sw-registration.js\",\"677217d8e642c1ccff69fc01c96b4431\"],[\"/index.html\",\"c7522a5d3255caca0f12c5282ef0644d\"]];\nvar cacheName = 'sw-precache-v3--' + (self.registration ? self.registration.scope : '');\n\n\nvar ignoreUrlParametersMatching = [/^utm_/];\n\n\n\nvar addDirectoryIndex = function (originalUrl, index) {\n var url = new URL(originalUrl);\n if (url.pathname.slice(-1) === '/') {\n url.pathname += index;\n }\n return url.toString();\n };\n\nvar cleanResponse = function (originalResponse) {\n // If this is not a redirected response, then we don't have to do anything.\n if (!originalResponse.redirected) {\n return Promise.resolve(originalResponse);\n }\n\n // Firefox 50 and below doesn't support the Response.body stream, so we may\n // need to read the entire body to memory as a Blob.\n var bodyPromise = 'body' in originalResponse ?\n Promise.resolve(originalResponse.body) :\n originalResponse.blob();\n\n return bodyPromise.then(function(body) {\n // new Response() is happy when passed either a stream or a Blob.\n return new Response(body, {\n headers: originalResponse.headers,\n status: originalResponse.status,\n statusText: originalResponse.statusText\n });\n });\n };\n\nvar createCacheKey = function (originalUrl, paramName, paramValue,\n dontCacheBustUrlsMatching) {\n // Create a new URL object to avoid modifying originalUrl.\n var url = new URL(originalUrl);\n\n // If dontCacheBustUrlsMatching is not set, or if we don't have a match,\n // then add in the extra cache-busting URL parameter.\n if (!dontCacheBustUrlsMatching ||\n !(url.pathname.match(dontCacheBustUrlsMatching))) {\n url.search += (url.search ? '&' : '') +\n encodeURIComponent(paramName) + '=' + encodeURIComponent(paramValue);\n }\n\n return url.toString();\n };\n\nvar isPathWhitelisted = function (whitelist, absoluteUrlString) {\n // If the whitelist is empty, then consider all URLs to be whitelisted.\n if (whitelist.length === 0) {\n return true;\n }\n\n // Otherwise compare each path regex to the path of the URL passed in.\n var path = (new URL(absoluteUrlString)).pathname;\n return whitelist.some(function(whitelistedPathRegex) {\n return path.match(whitelistedPathRegex);\n });\n };\n\nvar stripIgnoredUrlParameters = function (originalUrl,\n ignoreUrlParametersMatching) {\n var url = new URL(originalUrl);\n // Remove the hash; see https://github.com/GoogleChrome/sw-precache/issues/290\n url.hash = '';\n\n url.search = url.search.slice(1) // Exclude initial '?'\n .split('&') // Split into an array of 'key=value' strings\n .map(function(kv) {\n return kv.split('='); // Split each 'key=value' string into a [key, value] array\n })\n .filter(function(kv) {\n return ignoreUrlParametersMatching.every(function(ignoredRegex) {\n return !ignoredRegex.test(kv[0]); // Return true iff the key doesn't match any of the regexes.\n });\n })\n .map(function(kv) {\n return kv.join('='); // Join each [key, value] array into a 'key=value' string\n })\n .join('&'); // Join the array of 'key=value' strings into a string with '&' in between each\n\n return url.toString();\n };\n\n\nvar hashParamName = '_sw-precache';\nvar urlsToCacheKeys = new Map(\n precacheConfig.map(function(item) {\n var relativeUrl = item[0];\n var hash = item[1];\n var absoluteUrl = new URL(relativeUrl, self.location);\n var cacheKey = createCacheKey(absoluteUrl, hashParamName, hash, false);\n return [absoluteUrl.toString(), cacheKey];\n })\n);\n\nfunction setOfCachedUrls(cache) {\n return cache.keys().then(function(requests) {\n return requests.map(function(request) {\n return request.url;\n });\n }).then(function(urls) {\n return new Set(urls);\n });\n}\n\nself.addEventListener('install', function(event) {\n event.waitUntil(\n caches.open(cacheName).then(function(cache) {\n return setOfCachedUrls(cache).then(function(cachedUrls) {\n return Promise.all(\n Array.from(urlsToCacheKeys.values()).map(function(cacheKey) {\n // If we don't have a key matching url in the cache already, add it.\n if (!cachedUrls.has(cacheKey)) {\n var request = new Request(cacheKey, {credentials: 'same-origin'});\n return fetch(request).then(function(response) {\n // Bail out of installation unless we get back a 200 OK for\n // every request.\n if (!response.ok) {\n throw new Error('Request for ' + cacheKey + ' returned a ' +\n 'response with status ' + response.status);\n }\n\n return cleanResponse(response).then(function(responseToCache) {\n return cache.put(cacheKey, responseToCache);\n });\n });\n }\n })\n );\n });\n }).then(function() {\n \n // Force the SW to transition from installing -> active state\n return self.skipWaiting();\n \n })\n );\n});\n\nself.addEventListener('activate', function(event) {\n var setOfExpectedUrls = new Set(urlsToCacheKeys.values());\n\n event.waitUntil(\n caches.open(cacheName).then(function(cache) {\n return cache.keys().then(function(existingRequests) {\n return Promise.all(\n existingRequests.map(function(existingRequest) {\n if (!setOfExpectedUrls.has(existingRequest.url)) {\n return cache.delete(existingRequest);\n }\n })\n );\n });\n }).then(function() {\n \n return self.clients.claim();\n \n })\n );\n});\n\n\nself.addEventListener('fetch', function(event) {\n if (event.request.method === 'GET') {\n // Should we call event.respondWith() inside this fetch event handler?\n // This needs to be determined synchronously, which will give other fetch\n // handlers a chance to handle the request if need be.\n var shouldRespond;\n\n // First, remove all the ignored parameters and hash fragment, and see if we\n // have that URL in our cache. If so, great! shouldRespond will be true.\n var url = stripIgnoredUrlParameters(event.request.url, ignoreUrlParametersMatching);\n shouldRespond = urlsToCacheKeys.has(url);\n\n // If shouldRespond is false, check again, this time with 'index.html'\n // (or whatever the directoryIndex option is set to) at the end.\n var directoryIndex = 'index.html';\n if (!shouldRespond && directoryIndex) {\n url = addDirectoryIndex(url, directoryIndex);\n shouldRespond = urlsToCacheKeys.has(url);\n }\n\n // If shouldRespond is still false, check to see if this is a navigation\n // request, and if so, whether the URL matches navigateFallbackWhitelist.\n var navigateFallback = '';\n if (!shouldRespond &&\n navigateFallback &&\n (event.request.mode === 'navigate') &&\n isPathWhitelisted([], event.request.url)) {\n url = new URL(navigateFallback, self.location).toString();\n shouldRespond = urlsToCacheKeys.has(url);\n }\n\n // If shouldRespond was set to true at any point, then call\n // event.respondWith(), using the appropriate cache key.\n if (shouldRespond) {\n event.respondWith(\n caches.open(cacheName).then(function(cache) {\n return cache.match(urlsToCacheKeys.get(url)).then(function(response) {\n if (response) {\n return response;\n }\n throw Error('The cached response that was expected is missing.');\n });\n }).catch(function(e) {\n // Fall back to just fetch()ing the request if some unexpected error\n // prevented the cached response from being valid.\n console.warn('Couldn\\'t serve response for \"%s\" from cache: %O', event.request.url, e);\n return fetch(event.request);\n })\n );\n }\n }\n});\n\n\n\n\n\n\n\n"]} \ No newline at end of file diff --git a/src/js/index.js b/src/js/index.js index 841c6fd..ce10e0a 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -1,7 +1,7 @@ (function (document, window) { // DEPENDENCIES // ============================================================ - const probs = require('pjs-problems'); + const probs = require('pjs-problems').es5; const dedent = require('dedent'); const assert = require('chai').assert; diff --git a/src/service-worker.js b/src/service-worker.js index ac74976..3e82bcd 100644 --- a/src/service-worker.js +++ b/src/service-worker.js @@ -37,7 +37,7 @@ /* eslint-disable indent, no-unused-vars, no-multiple-empty-lines, max-nested-callbacks, space-before-function-paren, quotes, comma-spacing */ 'use strict'; -var precacheConfig = [["/dist/css/style.css","ba4d66c91d1ed66848154a34ab4948cf"],["/dist/img/back.svg","898ada2a32ec64bd5b6959c22e8f231d"],["/dist/img/monitor.svg","348592da5567b5a3c46acfb5dcd341bc"],["/dist/img/next.svg","045593410b9f51390e750b9e1e7fff15"],["/dist/img/reload.svg","a0ab1b765280e4d22e6fb747042f6503"],["/dist/img/shuffle.svg","3a5e3c1bf04eb3493d8a2ffa547aa58f"],["/dist/img/social-banner.png","7c1a8058bb3d00c2b40283c735748cfc"],["/dist/js/bundle.min.js","26e9f75378c4964e08802b99e960f4bc"],["/dist/js/loadJS.js","72c55936069f60560a386e46f462c73a"],["/dist/js/sw-registration.js","677217d8e642c1ccff69fc01c96b4431"],["/index.html","c7522a5d3255caca0f12c5282ef0644d"]]; +var precacheConfig = [["/dist/css/style.css","ba4d66c91d1ed66848154a34ab4948cf"],["/dist/img/back.svg","898ada2a32ec64bd5b6959c22e8f231d"],["/dist/img/monitor.svg","348592da5567b5a3c46acfb5dcd341bc"],["/dist/img/next.svg","045593410b9f51390e750b9e1e7fff15"],["/dist/img/reload.svg","a0ab1b765280e4d22e6fb747042f6503"],["/dist/img/shuffle.svg","3a5e3c1bf04eb3493d8a2ffa547aa58f"],["/dist/img/social-banner.png","7c1a8058bb3d00c2b40283c735748cfc"],["/dist/js/bundle.min.js","ba4cc9351b6d922df7a491a73df81778"],["/dist/js/loadJS.js","72c55936069f60560a386e46f462c73a"],["/dist/js/sw-registration.js","677217d8e642c1ccff69fc01c96b4431"],["/index.html","c7522a5d3255caca0f12c5282ef0644d"]]; var cacheName = 'sw-precache-v3--' + (self.registration ? self.registration.scope : ''); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..1071bf3 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,7646 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ava/babel-preset-stage-4@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@ava/babel-preset-stage-4/-/babel-preset-stage-4-1.0.0.tgz#a613b5e152f529305422546b072d47facfb26291" + dependencies: + babel-plugin-check-es2015-constants "^6.8.0" + babel-plugin-syntax-trailing-function-commas "^6.20.0" + babel-plugin-transform-async-to-generator "^6.16.0" + babel-plugin-transform-es2015-destructuring "^6.19.0" + babel-plugin-transform-es2015-function-name "^6.9.0" + babel-plugin-transform-es2015-modules-commonjs "^6.18.0" + babel-plugin-transform-es2015-parameters "^6.21.0" + babel-plugin-transform-es2015-spread "^6.8.0" + babel-plugin-transform-es2015-sticky-regex "^6.8.0" + babel-plugin-transform-es2015-unicode-regex "^6.11.0" + babel-plugin-transform-exponentiation-operator "^6.8.0" + package-hash "^1.2.0" + +"@ava/babel-preset-transform-test-files@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-2.0.1.tgz#d75232cc6d71dc9c7eae4b76a9004fd81501d0c1" + dependencies: + babel-plugin-ava-throws-helper "^1.0.0" + babel-plugin-espower "^2.3.2" + package-hash "^1.2.0" + +"@ava/pretty-format@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@ava/pretty-format/-/pretty-format-1.1.0.tgz#d0a57d25eb9aeab9643bdd1a030642b91c123e28" + dependencies: + ansi-styles "^2.2.1" + esutils "^2.0.2" + +"@gulp-sourcemaps/identity-map@1.X": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz#cfa23bc5840f9104ce32a65e74db7e7a974bbee1" + dependencies: + acorn "^5.0.3" + css "^2.2.1" + normalize-path "^2.1.1" + source-map "^0.5.6" + through2 "^2.0.3" + +"@gulp-sourcemaps/map-sources@1.X": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz#890ae7c5d8c877f6d384860215ace9d7ec945bda" + dependencies: + normalize-path "^2.0.1" + through2 "^2.0.3" + +JSONStream@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.10.0.tgz#74349d0d89522b71f30f0a03ff9bd20ca6f12ac0" + dependencies: + jsonparse "0.0.5" + through ">=2.2.7 <3" + +JSONStream@^1.0.3: + version "1.3.1" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.1.tgz#707f761e01dae9e16f1bcf93703b78c70966579a" + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abbrev@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@4.X, acorn@^4.0.3: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + +acorn@^1.0.3: + version "1.2.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-1.2.2.tgz#c8ce27de0acc76d896d2b1fad3df588d9e82f014" + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^5.0.1, acorn@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d" + +ajv-keywords@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" + +ajv@^4.7.0, ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-align@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-1.1.0.tgz#2f0c1658829739add5ebb15e6b0c6e3423f016ba" + dependencies: + string-width "^1.0.1" + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + dependencies: + string-width "^2.0.0" + +ansi-escapes@^1.0.0, ansi-escapes@^1.1.0, ansi-escapes@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@^0.2.0, ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" + +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + +app-root-path@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46" + +aproba@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" + +archive-type@^3.0.0, archive-type@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-3.2.0.tgz#9cd9c006957ebe95fadad5bd6098942a813737f6" + dependencies: + file-type "^3.1.0" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-exclude@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/arr-exclude/-/arr-exclude-1.0.0.tgz#dfc7c2e552a270723ccda04cf3128c8cbfe5c631" + +arr-flatten@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-map@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.0, array-uniq@^1.0.1, array-uniq@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asn1.js@^4.0.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + +assertion-error@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" + +ast-types@0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.15.tgz#8eef0827f04dff0ec8857ba925abe3fea6194e52" + +astw@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/astw/-/astw-2.2.0.tgz#7bd41784d32493987aeb239b6b4e1c57a873b917" + dependencies: + acorn "^4.0.3" + +async-each-series@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-1.1.0.tgz#f42fd8155d38f21a5b8ea07c28e063ed1700b138" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async-foreach@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + +async@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +atob@~1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/atob/-/atob-1.1.3.tgz#95f13629b12c3a51a5d215abdce2aa9f32f80773" + +auto-bind@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-1.1.0.tgz#93b864dc7ee01a326281775d5c75ca0a751e5961" + +autoprefixer@^6.3.1, autoprefixer@^6.7.7: + version "6.7.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" + dependencies: + browserslist "^1.7.6" + caniuse-db "^1.0.30000634" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^5.2.16" + postcss-value-parser "^3.2.3" + +ava-init@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ava-init/-/ava-init-0.2.0.tgz#9304c8b4c357d66e3dfdae1fbff47b1199d5c55d" + dependencies: + arr-exclude "^1.0.0" + execa "^0.5.0" + has-yarn "^1.0.0" + read-pkg-up "^2.0.0" + write-pkg "^2.0.0" + +ava@^0.18.2: + version "0.18.2" + resolved "https://registry.yarnpkg.com/ava/-/ava-0.18.2.tgz#79253d1636077034a2780bb55b5c3e6c3d7f312f" + dependencies: + "@ava/babel-preset-stage-4" "^1.0.0" + "@ava/babel-preset-transform-test-files" "^2.0.0" + "@ava/pretty-format" "^1.1.0" + arr-flatten "^1.0.1" + array-union "^1.0.1" + array-uniq "^1.0.2" + arrify "^1.0.0" + auto-bind "^1.1.0" + ava-init "^0.2.0" + babel-code-frame "^6.16.0" + babel-core "^6.17.0" + bluebird "^3.0.0" + caching-transform "^1.0.0" + chalk "^1.0.0" + chokidar "^1.4.2" + clean-stack "^1.1.1" + clean-yaml-object "^0.1.0" + cli-cursor "^2.1.0" + cli-spinners "^1.0.0" + cli-truncate "^0.2.0" + co-with-promise "^4.6.0" + code-excerpt "^2.1.0" + common-path-prefix "^1.0.0" + convert-source-map "^1.2.0" + core-assert "^0.2.0" + currently-unhandled "^0.4.1" + debug "^2.2.0" + diff "^3.0.1" + dot-prop "^4.1.0" + empower-core "^0.6.1" + equal-length "^1.0.0" + figures "^2.0.0" + find-cache-dir "^0.1.1" + fn-name "^2.0.0" + get-port "^2.1.0" + globby "^6.0.0" + has-flag "^2.0.0" + ignore-by-default "^1.0.0" + indent-string "^3.0.0" + is-ci "^1.0.7" + is-generator-fn "^1.0.0" + is-obj "^1.0.0" + is-observable "^0.2.0" + is-promise "^2.1.0" + jest-snapshot "^18.1.0" + last-line-stream "^1.0.0" + lodash.debounce "^4.0.3" + lodash.difference "^4.3.0" + lodash.flatten "^4.2.0" + lodash.isequal "^4.5.0" + loud-rejection "^1.2.0" + matcher "^0.1.1" + max-timeout "^1.0.0" + md5-hex "^2.0.0" + meow "^3.7.0" + ms "^0.7.1" + multimatch "^2.1.0" + observable-to-promise "^0.4.0" + option-chain "^0.1.0" + package-hash "^1.2.0" + pkg-conf "^2.0.0" + plur "^2.0.0" + pretty-ms "^2.0.0" + require-precompiled "^0.1.0" + resolve-cwd "^1.0.0" + slash "^1.0.0" + source-map-support "^0.4.0" + stack-utils "^1.0.0" + strip-ansi "^3.0.1" + strip-bom-buf "^1.0.0" + time-require "^0.1.2" + unique-temp-dir "^1.0.0" + update-notifier "^1.0.0" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +babel-core@^6.0.14, babel-core@^6.17.0, babel-core@^6.24.0, babel-core@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83" + dependencies: + babel-code-frame "^6.22.0" + babel-generator "^6.24.1" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babylon "^6.11.0" + convert-source-map "^1.1.0" + debug "^2.1.1" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" + path-is-absolute "^1.0.0" + private "^0.1.6" + slash "^1.0.0" + source-map "^0.5.0" + +babel-generator@^6.1.0, babel-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-ava-throws-helper@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ava-throws-helper/-/babel-plugin-ava-throws-helper-1.0.0.tgz#8fe6e79d2fd19838b5c3649f89cfb03fd563e241" + dependencies: + babel-template "^6.7.0" + babel-types "^6.7.2" + +babel-plugin-check-es2015-constants@^6.22.0, babel-plugin-check-es2015-constants@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-espower@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/babel-plugin-espower/-/babel-plugin-espower-2.3.2.tgz#5516b8fcdb26c9f0e1d8160749f6e4c65e71271e" + dependencies: + babel-generator "^6.1.0" + babylon "^6.1.0" + call-matcher "^1.0.0" + core-js "^2.0.0" + espower-location-detector "^1.0.0" + espurify "^1.6.0" + estraverse "^4.1.1" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-trailing-function-commas@^6.20.0, babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-to-generator@^6.16.0, babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.23.0, babel-plugin-transform-es2015-classes@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.22.0, babel-plugin-transform-es2015-computed-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.19.0, babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0, babel-plugin-transform-es2015-duplicate-keys@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0, babel-plugin-transform-es2015-function-name@^6.24.1, babel-plugin-transform-es2015-function-name@^6.9.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.18.0, babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0, babel-plugin-transform-es2015-modules-systemjs@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0, babel-plugin-transform-es2015-modules-umd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0, babel-plugin-transform-es2015-object-super@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.21.0, babel-plugin-transform-es2015-parameters@^6.23.0, babel-plugin-transform-es2015-parameters@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0, babel-plugin-transform-es2015-shorthand-properties@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0, babel-plugin-transform-es2015-spread@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0, babel-plugin-transform-es2015-sticky-regex@^6.24.1, babel-plugin-transform-es2015-sticky-regex@^6.8.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.11.0, babel-plugin-transform-es2015-unicode-regex@^6.22.0, babel-plugin-transform-es2015-unicode-regex@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1, babel-plugin-transform-exponentiation-operator@^6.8.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.22.0, babel-plugin-transform-regenerator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" + dependencies: + regenerator-transform "0.9.11" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-preset-env@^1.4.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.5.1.tgz#d2eca6af179edf27cdc305a84820f601b456dd0b" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^2.1.2" + invariant "^2.2.2" + semver "^5.3.0" + +babel-preset-es2015@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" + +babel-preset-es2016@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2016/-/babel-preset-es2016-6.24.1.tgz#f900bf93e2ebc0d276df9b8ab59724ebfd959f8b" + dependencies: + babel-plugin-transform-exponentiation-operator "^6.24.1" + +babel-preset-es2017@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2017/-/babel-preset-es2017-6.24.1.tgz#597beadfb9f7f208bcfd8a12e9b2b29b8b2f14d1" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.24.1" + +babel-preset-latest@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-latest/-/babel-preset-latest-6.24.1.tgz#677de069154a7485c2d25c577c02f624b85b85e8" + dependencies: + babel-preset-es2015 "^6.24.1" + babel-preset-es2016 "^6.24.1" + babel-preset-es2017 "^6.24.1" + +babel-register@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" + dependencies: + babel-core "^6.24.1" + babel-runtime "^6.22.0" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.24.1, babel-template@^6.7.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babylon "^6.11.0" + lodash "^4.2.0" + +babel-traverse@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babylon "^6.15.0" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.7.2: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babelify@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" + dependencies: + babel-core "^6.0.14" + object-assign "^4.0.0" + +babylon@^6.1.0, babylon@^6.11.0, babylon@^6.15.0: + version "6.17.2" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.2.tgz#201d25ef5f892c41bae49488b08db0dd476e9f5c" + +balanced-match@^0.4.1, balanced-match@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +base62@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/base62/-/base62-0.1.1.tgz#7b4174c2f94449753b11c2651c083da841a7b084" + +base64-js@^1.0.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +beeper@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" + +bin-build@^2.0.0, bin-build@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/bin-build/-/bin-build-2.2.0.tgz#11f8dd61f70ffcfa2bdcaa5b46f5e8fedd4221cc" + dependencies: + archive-type "^3.0.1" + decompress "^3.0.0" + download "^4.1.2" + exec-series "^1.0.0" + rimraf "^2.2.6" + tempfile "^1.0.0" + url-regex "^3.0.0" + +bin-check@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bin-check/-/bin-check-2.0.0.tgz#86f8e6f4253893df60dc316957f5af02acb05930" + dependencies: + executable "^1.0.0" + +bin-version-check@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/bin-version-check/-/bin-version-check-2.1.0.tgz#e4e5df290b9069f7d111324031efc13fdd11a5b0" + dependencies: + bin-version "^1.0.0" + minimist "^1.1.0" + semver "^4.0.3" + semver-truncate "^1.0.0" + +bin-version@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/bin-version/-/bin-version-1.0.4.tgz#9eb498ee6fd76f7ab9a7c160436f89579435d78e" + dependencies: + find-versions "^1.0.0" + +bin-wrapper@^3.0.0, bin-wrapper@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/bin-wrapper/-/bin-wrapper-3.0.2.tgz#67d3306262e4b1a5f2f88ee23464f6a655677aeb" + dependencies: + bin-check "^2.0.0" + bin-version-check "^2.1.0" + download "^4.0.0" + each-async "^1.1.1" + lazy-req "^1.0.0" + os-filter-obj "^1.0.0" + +binary-extensions@^1.0.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + +bl@^0.9.1: + version "0.9.5" + resolved "https://registry.yarnpkg.com/bl/-/bl-0.9.5.tgz#c06b797af085ea00bc527afc8efcf11de2232054" + dependencies: + readable-stream "~1.0.26" + +bl@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e" + dependencies: + readable-stream "^2.0.5" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.0.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + +body-parser@~1.14.0: + version "1.14.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.14.2.tgz#1015cb1fe2c443858259581db53332f8d0cf50f9" + dependencies: + bytes "2.2.0" + content-type "~1.0.1" + debug "~2.2.0" + depd "~1.1.0" + http-errors "~1.3.1" + iconv-lite "0.4.13" + on-finished "~2.3.0" + qs "5.2.0" + raw-body "~2.1.5" + type-is "~1.6.10" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +boxen@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-0.6.0.tgz#8364d4248ac34ff0ef1b2f2bf49a6c60ce0d81b6" + dependencies: + ansi-align "^1.1.0" + camelcase "^2.1.0" + chalk "^1.1.1" + cli-boxes "^1.0.0" + filled-array "^1.0.0" + object-assign "^4.0.1" + repeating "^2.0.0" + string-width "^1.0.1" + widest-line "^1.0.0" + +boxen@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.1.0.tgz#b1b69dd522305e807a99deee777dbd6e5167b102" + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^1.1.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^0.1.0" + widest-line "^1.0.0" + +brace-expansion@^1.0.0, brace-expansion@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + +browser-pack@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.0.2.tgz#f86cd6cef4f5300c8e63e07a4d512f65fbff4531" + dependencies: + JSONStream "^1.0.3" + combine-source-map "~0.7.1" + defined "^1.0.0" + through2 "^2.0.0" + umd "^3.0.0" + +browser-resolve@^1.11.0, browser-resolve@^1.7.0: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a" + dependencies: + buffer-xor "^1.0.2" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + inherits "^2.0.1" + +browserify-cache-api@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/browserify-cache-api/-/browserify-cache-api-3.0.1.tgz#96247e853f068fd6e0d45cc73f0bb2cd9778ef02" + dependencies: + async "^1.5.2" + through2 "^2.0.0" + xtend "^4.0.0" + +browserify-cipher@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + +browserify-incremental@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/browserify-incremental/-/browserify-incremental-3.1.1.tgz#0713cb7587247a632a9f08cf1bd169b878b62a8a" + dependencies: + JSONStream "^0.10.0" + browserify-cache-api "^3.0.0" + through2 "^2.0.0" + xtend "^4.0.0" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@~0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" + dependencies: + pako "~0.2.0" + +browserify@^14.0.0, browserify@^14.3.0: + version "14.4.0" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-14.4.0.tgz#089a3463af58d0e48d8cd4070b3f74654d5abca9" + dependencies: + JSONStream "^1.0.3" + assert "^1.4.0" + browser-pack "^6.0.1" + browser-resolve "^1.11.0" + browserify-zlib "~0.1.2" + buffer "^5.0.2" + cached-path-relative "^1.0.0" + concat-stream "~1.5.1" + console-browserify "^1.1.0" + constants-browserify "~1.0.0" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^2.0.0" + domain-browser "~1.1.0" + duplexer2 "~0.1.2" + events "~1.1.0" + glob "^7.1.0" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "^1.0.0" + inherits "~2.0.1" + insert-module-globals "^7.0.0" + labeled-stream-splicer "^2.0.0" + module-deps "^4.0.8" + os-browserify "~0.1.1" + parents "^1.0.1" + path-browserify "~0.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^2.0.0" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum "^1.0.0" + shell-quote "^1.6.1" + stream-browserify "^2.0.0" + stream-http "^2.0.0" + string_decoder "~1.0.0" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^2.0.0" + timers-browserify "^1.0.1" + tty-browserify "~0.0.0" + url "~0.11.0" + util "~0.10.1" + vm-browserify "~0.0.1" + xtend "^4.0.0" + +browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: + version "1.7.7" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" + dependencies: + caniuse-db "^1.0.30000639" + electron-to-chromium "^1.2.7" + +browserslist@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.1.4.tgz#cc526af4a1312b7d2e05653e56d0c8ab70c0e053" + dependencies: + caniuse-lite "^1.0.30000670" + electron-to-chromium "^1.3.11" + +buf-compare@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buf-compare/-/buf-compare-1.0.1.tgz#fef28da8b8113a0a0db4430b0b6467b69730b34a" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + +buffer-to-vinyl@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz#00f15faee3ab7a1dda2cde6d9121bffdd07b2262" + dependencies: + file-type "^3.1.0" + readable-stream "^2.0.2" + uuid "^2.0.1" + vinyl "^1.0.0" + +buffer-xor@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + +buffer@^5.0.2: + version "5.0.6" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.0.6.tgz#2ea669f7eec0b6eda05b08f8b5ff661b28573588" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +bufferstreams@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-1.1.1.tgz#0161373060ac5988eff99058731114f6e195d51e" + dependencies: + readable-stream "^2.0.2" + +builtin-modules@^1.0.0, builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + +bytes@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.2.0.tgz#fd35464a403f6f9117c2de3609ecff9cae000588" + +bytes@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + +cached-path-relative@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.1.tgz#d09c4b52800aa4c078e2dd81a869aac90d2e54e7" + +caching-transform@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" + dependencies: + md5-hex "^1.2.0" + mkdirp "^0.5.1" + write-file-atomic "^1.1.4" + +call-matcher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-matcher/-/call-matcher-1.0.1.tgz#5134d077984f712a54dad3cbf62de28dce416ca8" + dependencies: + core-js "^2.0.0" + deep-equal "^1.0.0" + espurify "^1.6.0" + estraverse "^4.0.0" + +call-signature@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/call-signature/-/call-signature-0.0.2.tgz#a84abc825a55ef4cb2b028bd74e205a65b9a4996" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +camel-case@3.0.x: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^2.0.0, camelcase@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +camelcase@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +caniuse-api@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" + dependencies: + browserslist "^1.3.6" + caniuse-db "^1.0.30000529" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: + version "1.0.30000677" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000677.tgz#13f421d40ae1434702103c494d2c4d716e2a8fcb" + +caniuse-lite@^1.0.30000670: + version "1.0.30000677" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000677.tgz#43090233d4b2c7190657f95455983d94d264baaa" + +capture-stack-trace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +caw@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/caw/-/caw-1.2.0.tgz#ffb226fe7efc547288dc62ee3e97073c212d1034" + dependencies: + get-proxy "^1.0.1" + is-obj "^1.0.0" + object-assign "^3.0.0" + tunnel-agent "^0.4.0" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chai@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" + dependencies: + assertion-error "^1.0.1" + deep-eql "^0.1.3" + type-detect "^1.0.0" + +chalk@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" + dependencies: + ansi-styles "~1.0.0" + has-color "~0.1.0" + strip-ansi "~0.1.0" + +chalk@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + dependencies: + ansi-styles "^1.1.0" + escape-string-regexp "^1.0.0" + has-ansi "^0.1.0" + strip-ansi "^0.3.0" + supports-color "^0.2.0" + +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chokidar@^1.0.0, chokidar@^1.4.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +ci-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07" + dependencies: + inherits "^2.0.1" + +circular-json@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" + +clap@^1.0.9: + version "1.1.3" + resolved "https://registry.yarnpkg.com/clap/-/clap-1.1.3.tgz#b3bd36e93dd4cbfb395a3c26896352445265c05b" + dependencies: + chalk "^1.1.3" + +clean-css@4.1.x: + version "4.1.3" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.3.tgz#07cfe8980edb20d455ddc23aadcf1e04c6e509ce" + dependencies: + source-map "0.5.x" + +clean-stack@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-1.3.0.tgz#9e821501ae979986c46b1d66d2d432db2fd4ae31" + +clean-yaml-object@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz#63fb110dc2ce1a84dc21f6d9334876d010ae8b68" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + +cli-cursor@^1.0.1, cli-cursor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + dependencies: + restore-cursor "^1.0.1" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-spinners@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" + +cli-spinners@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.0.0.tgz#ef987ed3d48391ac3dab9180b406a742180d6e6a" + +cli-truncate@^0.2.0, cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + dependencies: + slice-ansi "0.0.4" + string-width "^1.0.1" + +cli-width@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +clone-stats@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + +clone@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + +clone@^1.0.0, clone@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + +co-with-promise@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co-with-promise/-/co-with-promise-4.6.0.tgz#413e7db6f5893a60b942cf492c4bec93db415ab7" + dependencies: + pinkie-promise "^1.0.0" + +co@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +coa@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.2.tgz#2ba9fec3b4aa43d7a49d7e6c3561e92061b6bcec" + dependencies: + q "^1.1.2" + +code-excerpt@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-2.1.0.tgz#5dcc081e88f4a7e3b554e9e35d7ef232d47f8147" + dependencies: + convert-to-spaces "^1.0.1" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +color-convert@^1.3.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + dependencies: + color-name "^1.1.1" + +color-name@^1.0.0, color-name@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.2.tgz#5c8ab72b64bd2215d617ae9559ebb148475cf98d" + +color-string@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" + dependencies: + color-name "^1.0.0" + +color@^0.11.0: + version "0.11.4" + resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" + dependencies: + clone "^1.0.2" + color-convert "^1.3.0" + color-string "^0.3.0" + +colormin@^1.0.5: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" + dependencies: + color "^0.11.0" + css-color-names "0.0.4" + has "^1.0.1" + +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +colors@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +combine-source-map@~0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.7.2.tgz#0870312856b307a87cc4ac486f3a9a62aeccc09e" + dependencies: + convert-source-map "~1.1.0" + inline-source-map "~0.6.0" + lodash.memoize "~3.0.3" + source-map "~0.5.3" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@2.9.x, commander@^2.9.0, commander@~2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +commander@~2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" + dependencies: + graceful-readlink ">= 1.0.0" + +common-path-prefix@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-1.0.0.tgz#cd52f6f0712e0baab97d6f9732874f22f47752c0" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.4.6, concat-stream@^1.4.7, concat-stream@^1.5.2, concat-stream@~1.5.0, concat-stream@~1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" + dependencies: + inherits "~2.0.1" + readable-stream "~2.0.0" + typedarray "~0.0.5" + +configstore@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-2.1.0.tgz#737a3a7036e9886102aa6099e47bb33ab1aba1a1" + dependencies: + dot-prop "^3.0.0" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + object-assign "^4.0.1" + os-tmpdir "^1.0.0" + osenv "^0.1.0" + uuid "^2.0.1" + write-file-atomic "^1.1.2" + xdg-basedir "^2.0.0" + +configstore@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.0.tgz#45df907073e26dfa1cf4b2d52f5b60545eaa11d1" + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +console-stream@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44" + +constants-browserify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + +content-type@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +convert-source-map@1.X, convert-source-map@^1.1.0, convert-source-map@^1.1.1, convert-source-map@^1.2.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + +convert-source-map@~1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" + +convert-to-spaces@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" + +core-assert@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/core-assert/-/core-assert-0.2.1.tgz#f85e2cf9bfed28f773cc8b3fa5c5b69bdc02fe3f" + dependencies: + buf-compare "^1.0.0" + is-error "^2.2.0" + +core-js@^2.0.0, core-js@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +corser@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" + +cosmiconfig@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-1.1.0.tgz#0dea0f9804efdfb929fbb1b188e25553ea053d37" + dependencies: + graceful-fs "^4.1.2" + js-yaml "^3.4.3" + minimist "^1.2.0" + object-assign "^4.0.1" + os-homedir "^1.0.1" + parse-json "^2.2.0" + pinkie-promise "^2.0.0" + require-from-string "^1.1.0" + +cosmiconfig@^2.1.0, cosmiconfig@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-2.1.3.tgz#952771eb0dddc1cb3fa2f6fbe51a522e93b3ee0a" + dependencies: + is-directory "^0.3.1" + js-yaml "^3.4.3" + minimist "^1.2.0" + object-assign "^4.1.0" + os-homedir "^1.0.1" + parse-json "^2.2.0" + require-from-string "^1.1.0" + +create-ecdh@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-error-class@^3.0.0, create-error-class@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + +create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + ripemd160 "^2.0.0" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.6" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn-async@^2.1.1: + version "2.2.5" + resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" + dependencies: + lru-cache "^4.0.0" + which "^1.2.8" + +cross-spawn@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +crypto-browserify@^3.0.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.0.tgz#3652a0906ab9b2a7e0c3ce66a408e957a2485522" + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + +css-color-names@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + +css@2.X, css@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.1.tgz#73a4c81de85db664d4ee674f7d47085e3b2d55dc" + dependencies: + inherits "^2.0.1" + source-map "^0.1.38" + source-map-resolve "^0.3.0" + urix "^0.1.0" + +cssnano@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" + dependencies: + autoprefixer "^6.3.1" + decamelize "^1.1.2" + defined "^1.0.0" + has "^1.0.1" + object-assign "^4.0.1" + postcss "^5.0.14" + postcss-calc "^5.2.0" + postcss-colormin "^2.1.8" + postcss-convert-values "^2.3.4" + postcss-discard-comments "^2.0.4" + postcss-discard-duplicates "^2.0.1" + postcss-discard-empty "^2.0.1" + postcss-discard-overridden "^0.1.1" + postcss-discard-unused "^2.2.1" + postcss-filter-plugins "^2.0.0" + postcss-merge-idents "^2.1.5" + postcss-merge-longhand "^2.0.1" + postcss-merge-rules "^2.0.3" + postcss-minify-font-values "^1.0.2" + postcss-minify-gradients "^1.0.1" + postcss-minify-params "^1.0.4" + postcss-minify-selectors "^2.0.4" + postcss-normalize-charset "^1.1.0" + postcss-normalize-url "^3.0.7" + postcss-ordered-values "^2.1.0" + postcss-reduce-idents "^2.2.2" + postcss-reduce-initial "^1.0.0" + postcss-reduce-transforms "^1.0.3" + postcss-svgo "^2.1.1" + postcss-unique-selectors "^2.0.2" + postcss-value-parser "^3.2.3" + postcss-zindex "^2.0.1" + +csso@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-2.0.0.tgz#178b43a44621221c27756086f531e02f42900ee8" + dependencies: + clap "^1.0.9" + source-map "^0.5.3" + +csso@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" + dependencies: + clap "^1.0.9" + source-map "^0.5.3" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +date-fns@^1.27.2: + version "1.28.5" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.28.5.tgz#257cfc45d322df45ef5658665967ee841cd73faf" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + +date-time@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/date-time/-/date-time-0.1.1.tgz#ed2f6d93d9790ce2fd66d5b5ff3edd5bbcbf3b07" + +dateformat@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" + +debug-fabulous@0.1.X: + version "0.1.0" + resolved "https://registry.yarnpkg.com/debug-fabulous/-/debug-fabulous-0.1.0.tgz#ad0ea07a5d519324fb55842a8f34ee59c7f8ff6c" + dependencies: + debug "2.X" + object-assign "4.1.0" + +debug@2.2.0, debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +debug@2.X, debug@^2.1.0, debug@^2.1.1, debug@^2.2.0: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +decompress-tar@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-3.1.0.tgz#217c789f9b94450efaadc5c5e537978fc333c466" + dependencies: + is-tar "^1.0.0" + object-assign "^2.0.0" + strip-dirs "^1.0.0" + tar-stream "^1.1.1" + through2 "^0.6.1" + vinyl "^0.4.3" + +decompress-tarbz2@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz#8b23935681355f9f189d87256a0f8bdd96d9666d" + dependencies: + is-bzip2 "^1.0.0" + object-assign "^2.0.0" + seek-bzip "^1.0.3" + strip-dirs "^1.0.0" + tar-stream "^1.1.1" + through2 "^0.6.1" + vinyl "^0.4.3" + +decompress-targz@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-3.1.0.tgz#b2c13df98166268991b715d6447f642e9696f5a0" + dependencies: + is-gzip "^1.0.0" + object-assign "^2.0.0" + strip-dirs "^1.0.0" + tar-stream "^1.1.1" + through2 "^0.6.1" + vinyl "^0.4.3" + +decompress-unzip@^3.0.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-3.4.0.tgz#61475b4152066bbe3fee12f9d629d15fe6478eeb" + dependencies: + is-zip "^1.0.0" + read-all-stream "^3.0.0" + stat-mode "^0.2.0" + strip-dirs "^1.0.0" + through2 "^2.0.0" + vinyl "^1.0.0" + yauzl "^2.2.1" + +decompress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/decompress/-/decompress-3.0.0.tgz#af1dd50d06e3bfc432461d37de11b38c0d991bed" + dependencies: + buffer-to-vinyl "^1.0.0" + concat-stream "^1.4.6" + decompress-tar "^3.0.0" + decompress-tarbz2 "^3.0.0" + decompress-targz "^3.0.0" + decompress-unzip "^3.0.0" + stream-combiner2 "^1.1.1" + vinyl-assign "^1.0.1" + vinyl-fs "^2.2.0" + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + +deep-assign@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-1.0.0.tgz#b092743be8427dc621ea0067cdec7e70dd19f37b" + dependencies: + is-obj "^1.0.0" + +deep-eql@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" + dependencies: + type-detect "0.1.1" + +deep-equal@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +deep-strict-equal@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/deep-strict-equal/-/deep-strict-equal-0.2.0.tgz#4a078147a8ab57f6a0d4f5547243cd22f44eb4e4" + dependencies: + core-assert "^0.2.0" + +defaults@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + +deprecated@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" + +deps-sort@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5" + dependencies: + JSONStream "^1.0.3" + shasum "^1.0.0" + subarg "^1.0.0" + through2 "^2.0.0" + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +detect-file@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" + dependencies: + fs-exists-sync "^0.1.0" + +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + +detect-newline@2.X: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + +detective@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-4.5.0.tgz#6e5a8c6b26e6c7a254b1c6b6d7490d98ec91edd1" + dependencies: + acorn "^4.0.3" + defined "^1.0.0" + +diff@^3.0.0, diff@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + +diffie-hellman@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +dom-urls@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/dom-urls/-/dom-urls-1.1.0.tgz#001ddf81628cd1e706125c7176f53ccec55d918e" + dependencies: + urijs "^1.16.1" + +domain-browser@~1.1.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" + +dot-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" + dependencies: + is-obj "^1.0.0" + +dot-prop@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1" + dependencies: + is-obj "^1.0.0" + +download@^4.0.0, download@^4.1.2: + version "4.4.3" + resolved "https://registry.yarnpkg.com/download/-/download-4.4.3.tgz#aa55fdad392d95d4b68e8c2be03e0c2aa21ba9ac" + dependencies: + caw "^1.0.1" + concat-stream "^1.4.7" + each-async "^1.0.0" + filenamify "^1.0.1" + got "^5.0.0" + gulp-decompress "^1.2.0" + gulp-rename "^1.2.0" + is-url "^1.2.0" + object-assign "^4.0.1" + read-all-stream "^3.0.0" + readable-stream "^2.0.2" + stream-combiner2 "^1.1.1" + vinyl "^1.0.0" + vinyl-fs "^2.2.0" + ware "^1.2.0" + +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + dependencies: + readable-stream "~1.1.9" + +duplexer2@^0.1.2, duplexer2@^0.1.4, duplexer2@~0.1.0, duplexer2@~0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + dependencies: + readable-stream "^2.0.2" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +duplexify@^3.2.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" + dependencies: + end-of-stream "1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +each-async@^1.0.0, each-async@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/each-async/-/each-async-1.1.1.tgz#dee5229bdf0ab6ba2012a395e1b869abf8813473" + dependencies: + onetime "^1.0.0" + set-immediate-shim "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ecstatic@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-2.1.0.tgz#477a4a6b25cecb112f697dbd2c7fa354154ea6be" + dependencies: + he "^0.5.0" + mime "^1.2.11" + minimist "^1.1.0" + url-join "^1.0.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.11: + version "1.3.13" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.13.tgz#1b3a5eace6e087bb5e257a100b0cbfe81b2891fc" + +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + +elliptic@^6.0.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +empower-core@^0.6.1: + version "0.6.2" + resolved "https://registry.yarnpkg.com/empower-core/-/empower-core-0.6.2.tgz#5adef566088e31fba80ba0a36df47d7094169144" + dependencies: + call-signature "0.0.2" + core-js "^2.0.0" + +end-of-stream@1.0.0, end-of-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" + dependencies: + once "~1.3.0" + +end-of-stream@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" + dependencies: + once "~1.3.0" + +enhance-visitors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/enhance-visitors/-/enhance-visitors-1.0.0.tgz#aa945d05da465672a1ebd38fee2ed3da8518e95a" + dependencies: + lodash "^4.13.1" + +equal-length@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/equal-length/-/equal-length-1.0.1.tgz#21ca112d48ab24b4e1e7ffc0e5339d31fdfc274c" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +es3ify@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/es3ify/-/es3ify-0.1.4.tgz#ad9fa5df1ae34f3f31e1211b5818b2d51078dfd1" + dependencies: + esprima-fb "~3001.0001.0000-dev-harmony-fb" + jstransform "~3.0.0" + through "~2.3.4" + +es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.23" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.23.tgz#7578b51be974207a5487821b56538c224e4e7b38" + dependencies: + es6-iterator "2" + es6-symbol "~3.1" + +es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-symbol "^3.1" + +es6-map@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-promise@^4.0.5: + version "4.1.0" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.0.tgz#dda03ca8f9f89bc597e689842929de7ba8cebdf0" + +es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-symbol@3.1.1, es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-config-xo@^0.18.0: + version "0.18.2" + resolved "https://registry.yarnpkg.com/eslint-config-xo/-/eslint-config-xo-0.18.2.tgz#0a157120875619929e735ffd6b185c41e8a187af" + +eslint-formatter-pretty@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-formatter-pretty/-/eslint-formatter-pretty-1.1.0.tgz#ab4d06da02fed8c13ae9f0dc540a433ef7ed6f5e" + dependencies: + ansi-escapes "^1.4.0" + chalk "^1.1.3" + log-symbols "^1.0.2" + plur "^2.1.2" + string-width "^2.0.0" + +eslint-import-resolver-node@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz#5add8106e8c928db2cba232bcd9efa846e3da16c" + dependencies: + debug "^2.2.0" + object-assign "^4.0.1" + resolve "^1.1.6" + +eslint-module-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.0.0.tgz#a6f8c21d901358759cdc35dbac1982ae1ee58bce" + dependencies: + debug "2.2.0" + pkg-dir "^1.0.0" + +eslint-plugin-ava@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-ava/-/eslint-plugin-ava-4.2.0.tgz#12e4664659c1fae7895fa3f346c313ceb8907c77" + dependencies: + arrify "^1.0.1" + deep-strict-equal "^0.2.0" + enhance-visitors "^1.0.0" + espree "^3.1.3" + espurify "^1.5.0" + multimatch "^2.1.0" + pkg-up "^1.0.0" + req-all "^1.0.0" + +eslint-plugin-import@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.3.0.tgz#37c801e0ada0e296cbdf20c3f393acb5b52af36b" + dependencies: + builtin-modules "^1.1.1" + contains-path "^0.1.0" + debug "^2.2.0" + doctrine "1.5.0" + eslint-import-resolver-node "^0.2.0" + eslint-module-utils "^2.0.0" + has "^1.0.1" + lodash.cond "^4.3.0" + minimatch "^3.0.3" + read-pkg-up "^2.0.0" + +eslint-plugin-no-use-extend-native@^0.3.2: + version "0.3.12" + resolved "https://registry.yarnpkg.com/eslint-plugin-no-use-extend-native/-/eslint-plugin-no-use-extend-native-0.3.12.tgz#3ad9a00c2df23b5d7f7f6be91550985a4ab701ea" + dependencies: + is-get-set-prop "^1.0.0" + is-js-type "^2.0.0" + is-obj-prop "^1.0.0" + is-proto-prop "^1.0.0" + +eslint-plugin-promise@^3.4.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.5.0.tgz#78fbb6ffe047201627569e85a6c5373af2a68fca" + +eslint-plugin-unicorn@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-2.1.1.tgz#3e9294366799b715e16a6df89159495b68930cb3" + dependencies: + lodash.camelcase "^4.1.1" + lodash.kebabcase "^4.0.1" + lodash.snakecase "^4.0.1" + lodash.upperfirst "^4.2.0" + req-all "^1.0.0" + +eslint@^3.18.0: + version "3.19.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" + dependencies: + babel-code-frame "^6.16.0" + chalk "^1.1.3" + concat-stream "^1.5.2" + debug "^2.1.1" + doctrine "^2.0.0" + escope "^3.6.0" + espree "^3.4.0" + esquery "^1.0.0" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + glob "^7.0.3" + globals "^9.14.0" + ignore "^3.2.0" + imurmurhash "^0.1.4" + inquirer "^0.12.0" + is-my-json-valid "^2.10.0" + is-resolvable "^1.0.0" + js-yaml "^3.5.1" + json-stable-stringify "^1.0.0" + levn "^0.3.0" + lodash "^4.0.0" + mkdirp "^0.5.0" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.1" + pluralize "^1.2.1" + progress "^1.1.8" + require-uncached "^1.0.2" + shelljs "^0.7.5" + strip-bom "^3.0.0" + strip-json-comments "~2.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + +esmangle-evaluator@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esmangle-evaluator/-/esmangle-evaluator-1.0.1.tgz#620d866ef4861b3311f75766d52a8572bb3c6336" + +espower-location-detector@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/espower-location-detector/-/espower-location-detector-1.0.0.tgz#a17b7ecc59d30e179e2bef73fb4137704cb331b5" + dependencies: + is-url "^1.2.1" + path-is-absolute "^1.0.0" + source-map "^0.5.0" + xtend "^4.0.0" + +espree@^3.1.3, espree@^3.4.0: + version "3.4.3" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374" + dependencies: + acorn "^5.0.1" + acorn-jsx "^3.0.0" + +esprima-fb@~15001.1001.0-dev-harmony-fb: + version "15001.1001.0-dev-harmony-fb" + resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz#43beb57ec26e8cf237d3dd8b33e42533577f2659" + +esprima-fb@~3001.0001.0000-dev-harmony-fb, esprima-fb@~3001.1.0-dev-harmony-fb: + version "3001.1.0-dev-harmony-fb" + resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz#b77d37abcd38ea0b77426bb8bc2922ce6b426411" + +esprima@^2.6.0: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +espurify@^1.5.0, espurify@^1.6.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/espurify/-/espurify-1.7.0.tgz#1c5cf6cbccc32e6f639380bd4f991fab9ba9d226" + dependencies: + core-js "^2.0.0" + +esquery@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" + dependencies: + estraverse "~4.1.0" + object-assign "^4.0.1" + +estraverse@^4.0.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +estraverse@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + dependencies: + d "1" + es5-ext "~0.10.14" + +event-stream@^3.1.7: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +eventemitter3@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + +events@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +evp_bytestokey@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824ba1476b66e53" + dependencies: + create-hash "^1.1.1" + +exec-buffer@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/exec-buffer/-/exec-buffer-3.1.0.tgz#851b46d062fca9bcbc6ff8781693e28e8da80402" + dependencies: + execa "^0.5.0" + p-finally "^1.0.0" + pify "^2.3.0" + rimraf "^2.5.4" + tempfile "^1.0.0" + +exec-series@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/exec-series/-/exec-series-1.0.3.tgz#6d257a9beac482a872c7783bc8615839fc77143a" + dependencies: + async-each-series "^1.1.0" + object-assign "^4.1.0" + +execa@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3" + dependencies: + cross-spawn-async "^2.1.1" + is-stream "^1.1.0" + npm-run-path "^1.0.0" + object-assign "^4.0.1" + path-key "^1.0.0" + strip-eof "^1.0.0" + +execa@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.5.1.tgz#de3fb85cb8d6e91c85bcbceb164581785cb57b36" + dependencies: + cross-spawn "^4.0.0" + get-stream "^2.2.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^0.6.0: + version "0.6.3" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.6.3.tgz#57b69a594f081759c69e5370f0d17b9cb11658fe" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +executable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/executable/-/executable-1.1.0.tgz#877980e9112f3391066da37265de7ad8434ab4d9" + dependencies: + meow "^3.1.0" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expand-tilde@^1.2.1, expand-tilde@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" + dependencies: + os-homedir "^1.0.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-1.3.0.tgz#d1516fb0ff5624d2ebf9123ea1dac5a1994004f8" + +extend@^3.0.0, extend@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +falafel@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/falafel/-/falafel-1.2.0.tgz#c18d24ef5091174a497f318cd24b026a25cddab4" + dependencies: + acorn "^1.0.3" + foreach "^2.0.5" + isarray "0.0.1" + object-keys "^1.0.6" + +fancy-log@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" + dependencies: + chalk "^1.1.1" + time-stamp "^1.0.0" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +faye-websocket@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.7.3.tgz#cc4074c7f4a4dfd03af54dd65c354b135132ce11" + dependencies: + websocket-driver ">=0.3.6" + +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + dependencies: + pend "~1.2.0" + +figures@^1.3.5, figures@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +file-type@^3.1.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +filename-reserved-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4" + +filenamify@^1.0.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5" + dependencies: + filename-reserved-regex "^1.0.0" + strip-outer "^1.0.0" + trim-repeated "^1.0.0" + +filesize@^3.3.0: + version "3.5.10" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.10.tgz#fc8fa23ddb4ef9e5e0ab6e1e64f679a24a56761f" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +filled-array@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/filled-array/-/filled-array-1.1.0.tgz#c3c4f6c663b923459a9aa29912d2d031f1507f84" + +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + +find-index@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + +find-parent-dir@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +find-versions@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-1.2.1.tgz#cbde9f12e38575a0af1be1b9a2c5d5fd8f186b62" + dependencies: + array-uniq "^1.0.0" + get-stdin "^4.0.1" + meow "^3.5.0" + semver-regex "^1.0.0" + +findup-sync@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" + dependencies: + detect-file "^0.1.0" + is-glob "^2.0.1" + micromatch "^2.3.7" + resolve-dir "^0.1.0" + +fined@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.0.2.tgz#5b28424b760d7598960b7ef8480dff8ad3660e97" + dependencies: + expand-tilde "^1.2.1" + lodash.assignwith "^4.0.7" + lodash.isempty "^4.2.1" + lodash.isplainobject "^4.0.4" + lodash.isstring "^4.0.1" + lodash.pick "^4.2.1" + parse-filepath "^1.0.1" + +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + +flagged-respawn@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" + +flat-cache@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +flatten@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" + +fn-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + +fs-exists-sync@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.29" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" + dependencies: + globule "~0.1.0" + +gaze@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" + dependencies: + globule "^1.0.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +get-port@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-2.1.0.tgz#8783f9dcebd1eea495a334e1a6a251e78887ab1a" + dependencies: + pinkie-promise "^2.0.0" + +get-proxy@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-1.1.0.tgz#894854491bc591b0f147d7ae570f5c678b7256eb" + dependencies: + rc "^1.1.2" + +get-set-props@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-set-props/-/get-set-props-0.1.0.tgz#998475c178445686d0b32246da5df8dbcfbe8ea3" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +get-stdin@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" + +get-stream@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +gifsicle@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/gifsicle/-/gifsicle-3.0.4.tgz#f45cb5ed10165b665dc929e0e9328b6c821dfa3b" + dependencies: + bin-build "^2.0.0" + bin-wrapper "^3.0.0" + logalot "^2.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob-parent@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-stream@^3.1.5: + version "3.1.18" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" + dependencies: + glob "^4.3.1" + glob2base "^0.0.12" + minimatch "^2.0.1" + ordered-read-streams "^0.1.0" + through2 "^0.6.1" + unique-stream "^1.0.0" + +glob-stream@^5.3.2: + version "5.3.5" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" + dependencies: + extend "^3.0.0" + glob "^5.0.3" + glob-parent "^3.0.0" + micromatch "^2.3.7" + ordered-read-streams "^0.3.0" + through2 "^0.6.0" + to-absolute-glob "^0.1.1" + unique-stream "^2.0.2" + +glob-watcher@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" + dependencies: + gaze "^0.5.1" + +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + dependencies: + find-index "^0.1.1" + +glob@^4.3.1: + version "4.5.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "^2.0.1" + once "^1.3.0" + +glob@^5.0.3: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.0, glob@^7.1.1, glob@~7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + 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" + +glob@~3.1.21: + version "3.1.21" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" + dependencies: + graceful-fs "~1.2.0" + inherits "1" + minimatch "~0.2.11" + +global-modules@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" + dependencies: + global-prefix "^0.1.4" + is-windows "^0.2.0" + +global-prefix@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" + dependencies: + homedir-polyfill "^1.0.0" + ini "^1.3.4" + is-windows "^0.2.0" + which "^1.2.12" + +globals@^9.0.0, globals@^9.14.0: + version "9.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globule@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.1.0.tgz#c49352e4dc183d85893ee825385eb994bb6df45f" + dependencies: + glob "~7.1.1" + lodash "~4.16.4" + minimatch "~3.0.2" + +globule@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" + dependencies: + glob "~3.1.21" + lodash "~1.0.1" + minimatch "~0.2.11" + +glogg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" + dependencies: + sparkles "^1.0.0" + +got@^5.0.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" + dependencies: + create-error-class "^3.0.1" + duplexer2 "^0.1.4" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + node-status-codes "^1.0.0" + object-assign "^4.0.1" + parse-json "^2.1.0" + pinkie-promise "^2.0.0" + read-all-stream "^3.0.0" + readable-stream "^2.0.5" + timed-out "^3.0.0" + unzip-response "^1.0.2" + url-parse-lax "^1.0.0" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +graceful-fs@^3.0.0: + version "3.0.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + dependencies: + natives "^1.1.0" + +graceful-fs@~1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +guetzli@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/guetzli/-/guetzli-1.0.1.tgz#48cd01d18dbd60fb47318a1724a295a035d9b9f2" + dependencies: + bin-build "^2.2.0" + bin-wrapper "^3.0.2" + logalot "^2.1.0" + +gulp-bro@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/gulp-bro/-/gulp-bro-1.0.2.tgz#e56e060f3b9fde1809902ba7b2791df0d9c42b70" + dependencies: + browserify "^14.0.0" + browserify-incremental "^3.1.1" + concat-stream "^1.5.2" + gulp-util "^3.0.7" + through2 "^2.0.1" + +gulp-decompress@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gulp-decompress/-/gulp-decompress-1.2.0.tgz#8eeb65a5e015f8ed8532cafe28454960626f0dc7" + dependencies: + archive-type "^3.0.0" + decompress "^3.0.0" + gulp-util "^3.0.1" + readable-stream "^2.0.2" + +gulp-htmlmin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gulp-htmlmin/-/gulp-htmlmin-3.0.0.tgz#19ea8002d1231d6b1f18a12d20f2a66a77770fb3" + dependencies: + bufferstreams "^1.1.0" + gulp-util "^3.0.7" + html-minifier "^3.0.3" + object-assign "^4.0.1" + readable-stream "^2.0.2" + tryit "^1.0.1" + +gulp-image@^2.8.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/gulp-image/-/gulp-image-2.9.0.tgz#21fcbfdbbf7c55783cccb1b204c2d6fed881e03f" + dependencies: + exec-buffer "^3.1.0" + execa "^0.6.0" + filesize "^3.3.0" + gifsicle "^3.0.3" + guetzli "^1.0.1" + gulp-util "^3.0.7" + is-gif "^1.0.0" + is-jpg "^1.0.0" + is-png "^1.0.0" + is-svg "^2.0.1" + jpeg-recompress-bin "^3.0.1" + jpegoptim-bin "^3.0.0" + mozjpeg "^4.1.1" + optipng-bin "^4.0.0" + pngquant-bin "^3.1.0" + svgo "^0.7.0" + through2-concurrent "^1.1.1" + zopflipng-bin "^4.0.0" + +gulp-livereload@^3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/gulp-livereload/-/gulp-livereload-3.8.1.tgz#00f744b2d749d3e9e3746589c8a44acac779b50f" + dependencies: + chalk "^0.5.1" + debug "^2.1.0" + event-stream "^3.1.7" + gulp-util "^3.0.2" + lodash.assign "^3.0.0" + mini-lr "^0.1.8" + +gulp-postcss@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/gulp-postcss/-/gulp-postcss-6.4.0.tgz#78a32e3c87aa6cdcec5ae1c905e196d478e8c5d5" + dependencies: + gulp-util "^3.0.8" + postcss "^5.2.12" + postcss-load-config "^1.2.0" + vinyl-sourcemaps-apply "^0.2.1" + +gulp-rename@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/gulp-rename/-/gulp-rename-1.2.2.tgz#3ad4428763f05e2764dec1c67d868db275687817" + +gulp-sass@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/gulp-sass/-/gulp-sass-3.1.0.tgz#53dc4b68a1f5ddfe4424ab4c247655269a8b74b7" + dependencies: + gulp-util "^3.0" + lodash.clonedeep "^4.3.2" + node-sass "^4.2.0" + through2 "^2.0.0" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-sourcemaps@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c" + dependencies: + convert-source-map "^1.1.1" + graceful-fs "^4.1.2" + strip-bom "^2.0.0" + through2 "^2.0.0" + vinyl "^1.0.0" + +gulp-sourcemaps@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-2.6.0.tgz#7ccce899a8a3bfca1593a3348d0fbf41dd3f51e5" + dependencies: + "@gulp-sourcemaps/identity-map" "1.X" + "@gulp-sourcemaps/map-sources" "1.X" + acorn "4.X" + convert-source-map "1.X" + css "2.X" + debug-fabulous "0.1.X" + detect-newline "2.X" + graceful-fs "4.X" + source-map "0.X" + strip-bom-string "1.X" + through2 "2.X" + vinyl "1.X" + +gulp-svgo@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/gulp-svgo/-/gulp-svgo-1.0.3.tgz#f6ad219f281cdc9ac3e0e6c173d5c77bba8cd692" + dependencies: + svgo "^0.6.6" + +gulp-uglify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/gulp-uglify/-/gulp-uglify-3.0.0.tgz#0df0331d72a0d302e3e37e109485dddf33c6d1ca" + dependencies: + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash "^4.13.1" + make-error-cause "^1.1.1" + through2 "^2.0.0" + uglify-js "^3.0.5" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-util@^3.0, gulp-util@^3.0.0, gulp-util@^3.0.1, gulp-util@^3.0.2, gulp-util@^3.0.7, gulp-util@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^2.0.0" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulp@^3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" + dependencies: + archy "^1.0.0" + chalk "^1.0.0" + deprecated "^0.0.1" + gulp-util "^3.0.0" + interpret "^1.0.0" + liftoff "^2.1.0" + minimist "^1.1.0" + orchestrator "^0.3.0" + pretty-hrtime "^1.0.0" + semver "^4.1.0" + tildify "^1.0.0" + v8flags "^2.0.2" + vinyl-fs "^0.3.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + dependencies: + glogg "^1.0.0" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +has-ansi@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + dependencies: + ansi-regex "^0.2.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-color@~0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + dependencies: + sparkles "^1.0.0" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has-yarn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-1.0.0.tgz#89e25db604b725c8f5976fff0addc921b828a5a7" + +has@^1.0.0, has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +hash-base@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" + dependencies: + inherits "^2.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.0.3.tgz#1332ff00156c0a0ffdd8236013d07b77a0451573" + dependencies: + inherits "^2.0.1" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +he@1.1.x: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + +he@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/he/-/he-0.5.0.tgz#2c05ffaef90b68e860f3fd2b54ef580989277ee2" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +homedir-polyfill@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.4.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67" + +html-comment-regex@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" + +html-minifier@^3.0.3: + version "3.5.2" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.2.tgz#d73bc3ff448942408818ce609bf3fb0ea7ef4eb7" + dependencies: + camel-case "3.0.x" + clean-css "4.1.x" + commander "2.9.x" + he "1.1.x" + ncname "1.0.x" + param-case "2.1.x" + relateurl "0.2.x" + uglify-js "3.0.x" + +htmlescape@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" + +http-errors@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942" + dependencies: + inherits "~2.0.1" + statuses "1" + +http-proxy@^1.8.1: + version "1.16.2" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + dependencies: + eventemitter3 "1.x.x" + requires-port "1.x.x" + +http-server@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/http-server/-/http-server-0.10.0.tgz#b2a446b16a9db87ed3c622ba9beb1b085b1234a7" + dependencies: + colors "1.0.3" + corser "~2.0.0" + ecstatic "^2.0.0" + http-proxy "^1.8.1" + opener "~1.4.0" + optimist "0.6.x" + portfinder "^1.0.13" + union "~0.4.3" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + +husky@^0.13.3: + version "0.13.4" + resolved "https://registry.yarnpkg.com/husky/-/husky-0.13.4.tgz#48785c5028de3452a51c48c12c4f94b2124a1407" + dependencies: + chalk "^1.1.3" + find-parent-dir "^0.3.0" + is-ci "^1.0.9" + normalize-path "^1.0.0" + +iconv-lite@0.4.13: + version "0.4.13" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" + +ieee754@^1.1.4: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + +ignore-by-default@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + +ignore@^3.2.0, ignore@^3.2.6: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d" + +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +in-publish@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +indent-string@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.1.0.tgz#08ff4334603388399b329e6b9538dc7a3cf5de7d" + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" + +inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@^1.3.4, ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +inline-process-browser@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/inline-process-browser/-/inline-process-browser-1.0.0.tgz#46a61b153dd3c9b1624b1a00626edb4f7f414f22" + dependencies: + falafel "^1.0.1" + through2 "^0.6.5" + +inline-source-map@~0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" + dependencies: + source-map "~0.5.3" + +inquirer@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" + dependencies: + ansi-escapes "^1.1.0" + ansi-regex "^2.0.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + figures "^1.3.5" + lodash "^4.3.0" + readline2 "^1.0.1" + run-async "^0.1.0" + rx-lite "^3.1.2" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + +insert-module-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.0.1.tgz#c03bf4e01cb086d5b5e5ace8ad0afe7889d638c3" + dependencies: + JSONStream "^1.0.3" + combine-source-map "~0.7.1" + concat-stream "~1.5.1" + is-buffer "^1.1.0" + lexical-scope "^1.2.0" + process "~0.11.0" + through2 "^2.0.0" + xtend "^4.0.0" + +interpret@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" + +invariant@^2.2.0, invariant@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +ip-regex@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" + +irregular-plurals@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.2.0.tgz#38f299834ba8c00c30be9c554e137269752ff3ac" + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + +is-absolute@^0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f" + dependencies: + is-relative "^0.1.0" + +is-absolute@^0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" + dependencies: + is-relative "^0.2.1" + is-windows "^0.2.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.0, is-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-bzip2@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-bzip2/-/is-bzip2-1.0.0.tgz#5ee58eaa5a2e9c80e21407bedf23ae5ac091b3fc" + +is-ci@^1.0.7, is-ci@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" + dependencies: + ci-info "^1.0.0" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-error@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.1.tgz#684a96d84076577c98f4cdb40c6d26a5123bf19c" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-extglob@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-finite@^1.0.0, is-finite@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-generator-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" + +is-get-set-prop@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-get-set-prop/-/is-get-set-prop-1.0.0.tgz#2731877e4d78a6a69edcce6bb9d68b0779e76312" + dependencies: + get-set-props "^0.1.0" + lowercase-keys "^1.0.0" + +is-gif@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-gif/-/is-gif-1.0.0.tgz#a6d2ae98893007bffa97a1d8c01d63205832097e" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-gzip@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" + +is-jpg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-1.0.0.tgz#2959c17e73430db38264da75b90dd54f2d86da1c" + +is-js-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-js-type/-/is-js-type-2.0.0.tgz#73617006d659b4eb4729bba747d28782df0f7e22" + dependencies: + js-types "^1.0.0" + +is-my-json-valid@^2.10.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-natural-number@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-2.1.1.tgz#7d4c5728377ef386c3e194a9911bf57c6dc335e7" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-obj-prop@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-obj-prop/-/is-obj-prop-1.0.0.tgz#b34de79c450b8d7c73ab2cdf67dc875adb85f80e" + dependencies: + lowercase-keys "^1.0.0" + obj-props "^1.0.0" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-observable@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-0.2.0.tgz#b361311d83c6e5d726cabf5e250b0237106f5ae2" + dependencies: + symbol-observable "^0.2.2" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + +is-png@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-png/-/is-png-1.1.0.tgz#d574b12bf275c0350455570b0e5b57ab062077ce" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-proto-prop@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-proto-prop/-/is-proto-prop-1.0.0.tgz#b3951f95c089924fb5d4fcda6542ab3e83e2b220" + dependencies: + lowercase-keys "^1.0.0" + proto-props "^0.2.0" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-relative@^0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82" + +is-relative@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" + dependencies: + is-unc-path "^0.1.1" + +is-resolvable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" + dependencies: + tryit "^1.0.1" + +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-svg@^2.0.0, is-svg@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" + dependencies: + html-comment-regex "^1.1.0" + +is-tar@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-tar/-/is-tar-1.0.0.tgz#2f6b2e1792c1f5bb36519acaa9d65c0d26fe853d" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-unc-path@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" + dependencies: + unc-path-regex "^0.1.0" + +is-url@^1.2.0, is-url@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.2.tgz#498905a593bf47cc2d9e7f738372bbf7696c7f26" + +is-utf8@^0.2.0, is-utf8@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-valid-glob@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" + +is-windows@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + +is-zip@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-zip/-/is-zip-1.0.0.tgz#47b0a8ff4d38a76431ccfd99a8e15a4c86ba2325" + +isarray@0.0.1, isarray@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +jest-diff@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-18.1.0.tgz#4ff79e74dd988c139195b365dc65d87f606f4803" + dependencies: + chalk "^1.1.3" + diff "^3.0.0" + jest-matcher-utils "^18.1.0" + pretty-format "^18.1.0" + +jest-file-exists@^17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-17.0.0.tgz#7f63eb73a1c43a13f461be261768b45af2cdd169" + +jest-matcher-utils@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-18.1.0.tgz#1ac4651955ee2a60cef1e7fcc98cdfd773c0f932" + dependencies: + chalk "^1.1.3" + pretty-format "^18.1.0" + +jest-mock@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-18.0.0.tgz#5c248846ea33fa558b526f5312ab4a6765e489b3" + +jest-snapshot@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-18.1.0.tgz#55b96d2ee639c9bce76f87f2a3fd40b71c7a5916" + dependencies: + jest-diff "^18.1.0" + jest-file-exists "^17.0.0" + jest-matcher-utils "^18.1.0" + jest-util "^18.1.0" + natural-compare "^1.4.0" + pretty-format "^18.1.0" + +jest-util@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-18.1.0.tgz#3a99c32114ab17f84be094382527006e6d4bfc6a" + dependencies: + chalk "^1.1.1" + diff "^3.0.0" + graceful-fs "^4.1.6" + jest-file-exists "^17.0.0" + jest-mock "^18.0.0" + mkdirp "^0.5.1" + +jodid25519@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + +jpeg-recompress-bin@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jpeg-recompress-bin/-/jpeg-recompress-bin-3.0.1.tgz#46a3e7300ccab795b1b8db27ae802c27a28333a4" + dependencies: + bin-wrapper "^3.0.0" + logalot "^2.0.0" + +jpegoptim-bin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/jpegoptim-bin/-/jpegoptim-bin-3.0.0.tgz#9f7a05d83b302bd19913decf339a9dae1bda0c2b" + dependencies: + bin-build "^2.0.0" + bin-wrapper "^3.0.0" + logalot "^2.0.0" + +js-base64@^2.1.8, js-base64@^2.1.9: + version "2.1.9" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.1.9.tgz#f0e80ae039a4bd654b5f281fc93f04a914a7fcce" + +js-tokens@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" + +js-types@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/js-types/-/js-types-1.0.0.tgz#d242e6494ed572ad3c92809fc8bed7f7687cbf03" + +js-yaml@^3.4.3, js-yaml@^3.5.1, js-yaml@~3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + +js-yaml@~3.6.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stable-stringify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonparse@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-0.0.5.tgz#330542ad3f0a654665b778f3eb2d9a9fa507ac64" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + +jsonpointer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + +jsprim@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" + dependencies: + assert-plus "1.0.0" + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +jstransform@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/jstransform/-/jstransform-3.0.0.tgz#a2591ab6cee8d97bf3be830dbfa2313b87cd640b" + dependencies: + base62 "0.1.1" + esprima-fb "~3001.1.0-dev-harmony-fb" + source-map "0.1.31" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +labeled-stream-splicer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz#a52e1d138024c00b86b1c0c91f677918b8ae0a59" + dependencies: + inherits "^2.0.1" + isarray "~0.0.1" + stream-splicer "^2.0.0" + +last-line-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/last-line-stream/-/last-line-stream-1.0.0.tgz#d1b64d69f86ff24af2d04883a2ceee14520a5600" + dependencies: + through2 "^2.0.0" + +latest-version@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-2.0.0.tgz#56f8d6139620847b8017f8f1f4d78e211324168b" + dependencies: + package-json "^2.0.0" + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + dependencies: + package-json "^4.0.0" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lazy-req@^1.0.0, lazy-req@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac" + +lazy-req@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-2.0.0.tgz#c9450a363ecdda2e6f0c70132ad4f37f8f06f2b4" + +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + dependencies: + readable-stream "^2.0.5" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lexical-scope@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0afaf22df4" + dependencies: + astw "^2.0.0" + +lie@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.0.2.tgz#ffda21d7bba26f377cad865d3649b2fc8ce39fea" + dependencies: + es3ify "^0.1.3" + immediate "~3.0.5" + inline-process-browser "^1.0.0" + unreachable-branch-transform "^0.3.0" + +liftoff@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" + dependencies: + extend "^3.0.0" + findup-sync "^0.4.2" + fined "^1.0.1" + flagged-respawn "^0.3.2" + lodash.isplainobject "^4.0.4" + lodash.isstring "^4.0.1" + lodash.mapvalues "^4.4.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +lint-staged@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-3.6.0.tgz#cda8f0bef16e7928cc14b735186ae12cd662599c" + dependencies: + app-root-path "^2.0.0" + cosmiconfig "^1.1.0" + execa "^0.6.0" + listr "^0.12.0" + lodash.chunk "^4.2.0" + minimatch "^3.0.0" + npm-which "^3.0.1" + p-map "^1.1.1" + staged-git-files "0.0.4" + +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + +listr-update-renderer@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz#ca80e1779b4e70266807e8eed1ad6abe398550f9" + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^1.0.2" + strip-ansi "^3.0.1" + +listr-verbose-renderer@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.0.tgz#44dc01bb0c34a03c572154d4d08cde9b1dc5620f" + dependencies: + chalk "^1.1.3" + cli-cursor "^1.0.2" + date-fns "^1.27.2" + figures "^1.7.0" + +listr@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.12.0.tgz#6bce2c0f5603fa49580ea17cd6a00cc0e5fa451a" + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + figures "^1.7.0" + indent-string "^2.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.2.0" + listr-verbose-renderer "^0.4.0" + log-symbols "^1.0.2" + log-update "^1.0.2" + ora "^0.2.3" + p-map "^1.1.1" + rxjs "^5.0.0-beta.11" + stream-to-observable "^0.1.0" + strip-ansi "^3.0.1" + +livereload-js@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edcc1f8d0bc2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +localforage@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.5.0.tgz#6b994e19b56611fa85df3992df397ac4ab66e815" + dependencies: + lie "3.0.2" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + +lodash._bindcallback@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" + +lodash._createassigner@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" + dependencies: + lodash._bindcallback "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash.restparam "^3.0.0" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + +lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + +lodash.assign@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" + dependencies: + lodash._baseassign "^3.0.0" + lodash._createassigner "^3.0.0" + lodash.keys "^3.0.0" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.assignwith@^4.0.7: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz#127a97f02adc41751a954d24b0de17e100e038eb" + +lodash.camelcase@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + +lodash.chunk@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc" + +lodash.clonedeep@^4.3.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + +lodash.cond@^4.3.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" + +lodash.debounce@^4.0.3: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + +lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + +lodash.difference@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + dependencies: + lodash._root "^3.0.0" + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isempty@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" + +lodash.isequal@^4.0.0, lodash.isequal@^4.4.0, lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + +lodash.isplainobject@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + +lodash.kebabcase@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.mapvalues@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + +lodash.memoize@~3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" + +lodash.mergewith@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55" + +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.snakecase@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.template@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + dependencies: + lodash._reinterpolate "~3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +lodash.templatesettings@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + dependencies: + lodash._reinterpolate "~3.0.0" + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + +lodash.upperfirst@^4.2.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" + +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.2.0, lodash@^4.3.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +lodash@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" + +lodash@~4.16.4: + version "4.16.6" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.6.tgz#d22c9ac660288f3843e16ba7d2b5d06cca27d777" + +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + dependencies: + chalk "^1.0.0" + +log-update@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" + dependencies: + ansi-escapes "^1.0.0" + cli-cursor "^1.0.2" + +logalot@^2.0.0, logalot@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/logalot/-/logalot-2.1.0.tgz#5f8e8c90d304edf12530951a5554abb8c5e3f552" + dependencies: + figures "^1.3.5" + squeak "^1.0.0" + +longest@^1.0.0, longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +loud-rejection@^1.0.0, loud-rejection@^1.2.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +lpad-align@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/lpad-align/-/lpad-align-1.1.2.tgz#21f600ac1c3095c3c6e497ee67271ee08481fe9e" + dependencies: + get-stdin "^4.0.1" + indent-string "^2.1.0" + longest "^1.0.0" + meow "^3.3.0" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +lru-cache@^4.0.0, lru-cache@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" + dependencies: + pseudomap "^1.0.1" + yallist "^2.0.0" + +macaddress@^0.2.8: + version "0.2.8" + resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" + +make-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" + dependencies: + pify "^2.3.0" + +make-error-cause@^1.1.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/make-error-cause/-/make-error-cause-1.2.2.tgz#df0388fcd0b37816dff0a5fb8108939777dcbc9d" + dependencies: + make-error "^1.2.0" + +make-error@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" + +map-cache@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +matcher@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-0.1.2.tgz#ef20cbde64c24c50cc61af5b83ee0b1b8ff00101" + dependencies: + escape-string-regexp "^1.0.4" + +math-expression-evaluator@^1.2.14: + version "1.2.17" + resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" + +max-timeout@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/max-timeout/-/max-timeout-1.0.0.tgz#b68f69a2f99e0b476fd4cb23e2059ca750715e1f" + +md5-hex@^1.2.0, md5-hex@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" + dependencies: + md5-o-matic "^0.1.1" + +md5-hex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-2.0.0.tgz#d0588e9f1c74954492ecd24ac0ac6ce997d92e33" + dependencies: + md5-o-matic "^0.1.1" + +md5-o-matic@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +meow@^3.1.0, meow@^3.3.0, meow@^3.4.2, meow@^3.5.0, meow@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-stream@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + dependencies: + readable-stream "^2.0.1" + +micromatch@^2.1.5, micromatch@^2.3.7: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +miller-rabin@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@~1.27.0: + version "1.27.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" + +mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.7: + version "2.1.15" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" + dependencies: + mime-db "~1.27.0" + +mime@^1.2.11: + version "1.3.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" + +mimic-fn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + +mini-lr@^0.1.8: + version "0.1.9" + resolved "https://registry.yarnpkg.com/mini-lr/-/mini-lr-0.1.9.tgz#02199d27347953d1fd1d6dbded4261f187b2d0f6" + dependencies: + body-parser "~1.14.0" + debug "^2.2.0" + faye-websocket "~0.7.2" + livereload-js "^2.2.0" + parseurl "~1.3.0" + qs "~2.2.3" + +minimalistic-assert@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimatch@^2.0.1: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + dependencies: + brace-expansion "^1.0.0" + +minimatch@~0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +module-deps@^4.0.8: + version "4.1.1" + resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.1.1.tgz#23215833f1da13fd606ccb8087b44852dcb821fd" + dependencies: + JSONStream "^1.0.3" + browser-resolve "^1.7.0" + cached-path-relative "^1.0.0" + concat-stream "~1.5.0" + defined "^1.0.0" + detective "^4.0.0" + duplexer2 "^0.1.2" + inherits "^2.0.1" + parents "^1.0.0" + readable-stream "^2.0.2" + resolve "^1.1.3" + stream-combiner2 "^1.1.1" + subarg "^1.0.0" + through2 "^2.0.0" + xtend "^4.0.0" + +mozjpeg@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/mozjpeg/-/mozjpeg-4.1.1.tgz#859030b24f689a53db9b40f0160d89195b88fd50" + dependencies: + bin-build "^2.0.0" + bin-wrapper "^3.0.0" + logalot "^2.0.0" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +ms@^0.7.1: + version "0.7.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff" + +multimatch@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" + dependencies: + array-differ "^1.0.0" + array-union "^1.0.1" + arrify "^1.0.0" + minimatch "^3.0.0" + +multipipe@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + dependencies: + duplexer2 "0.0.2" + +mute-stream@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" + +nan@^2.3.0, nan@^2.3.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + +natives@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +ncname@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ncname/-/ncname-1.0.0.tgz#5b57ad18b1ca092864ef62b0b1ed8194f383b71c" + dependencies: + xml-char-classes "^1.0.0" + +no-case@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.1.tgz#7aeba1c73a52184265554b7dc03baf720df80081" + dependencies: + lower-case "^1.1.1" + +node-gyp@^3.3.1: + version "3.6.2" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + minimatch "^3.0.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "2" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-pre-gyp@^0.6.29: + version "0.6.36" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" + dependencies: + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "^2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +node-sass@^4.2.0: + version "4.5.3" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.5.3.tgz#d09c9d1179641239d1b97ffc6231fdcec53e1568" + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash.assign "^4.2.0" + lodash.clonedeep "^4.3.2" + lodash.mergewith "^4.6.0" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.3.2" + node-gyp "^3.3.1" + npmlog "^4.0.0" + request "^2.79.0" + sass-graph "^2.1.1" + stdout-stream "^1.4.0" + +node-status-codes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" + +"nopt@2 || 3": + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.3.8" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" + +normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + +normalize-url@^1.4.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +npm-path@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.3.tgz#15cff4e1c89a38da77f56f6055b24f975dfb2bbe" + dependencies: + which "^1.2.10" + +npm-run-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" + dependencies: + path-key "^1.0.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + +npm-which@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa" + dependencies: + commander "^2.9.0" + npm-path "^2.0.2" + which "^1.2.10" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +obj-props@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/obj-props/-/obj-props-1.1.0.tgz#626313faa442befd4a44e9a02c3cb6bde937b511" + +object-assign@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + +object-assign@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-keys@^1.0.6: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +observable-to-promise@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/observable-to-promise/-/observable-to-promise-0.4.0.tgz#28afe71645308f2d41d71f47ad3fece1a377e52b" + dependencies: + is-observable "^0.2.0" + symbol-observable "^0.2.2" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +once@^1.3.0, once@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +opener@~1.4.0: + version "1.4.3" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" + +optimist@0.6.x: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +option-chain@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/option-chain/-/option-chain-0.1.1.tgz#e9b811e006f1c0f54802f28295bfc8970f8dcfbd" + dependencies: + object-assign "^4.0.1" + +optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +optipng-bin@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/optipng-bin/-/optipng-bin-4.0.0.tgz#92b937d97ee67fe8a2d29bbcec6b8cee8f1a867e" + dependencies: + bin-build "^2.2.0" + bin-wrapper "^3.0.0" + logalot "^2.0.0" + +ora@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" + dependencies: + chalk "^1.1.1" + cli-cursor "^1.0.2" + cli-spinners "^0.1.2" + object-assign "^4.0.1" + +orchestrator@^0.3.0: + version "0.3.8" + resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" + dependencies: + end-of-stream "~0.1.5" + sequencify "~0.0.7" + stream-consume "~0.1.0" + +ordered-read-streams@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" + +ordered-read-streams@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" + dependencies: + is-stream "^1.0.1" + readable-stream "^2.0.1" + +os-browserify@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a617d8fe54" + +os-filter-obj@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-1.0.3.tgz#5915330d90eced557d2d938a31c6dd214d9c63ad" + +os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@0, osenv@^0.1.0, osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +outpipe@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2" + dependencies: + shell-quote "^1.4.2" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-map@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.1.1.tgz#05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a" + +package-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-1.2.0.tgz#003e56cd57b736a6ed6114cc2b81542672770e44" + dependencies: + md5-hex "^1.3.0" + +package-json@^2.0.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb" + dependencies: + got "^5.0.0" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +pako@~0.2.0: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + +param-case@2.1.x: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + dependencies: + no-case "^2.2.0" + +parents@^1.0.0, parents@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" + dependencies: + path-platform "~0.11.15" + +parse-asn1@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + +parse-filepath@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" + dependencies: + is-absolute "^0.2.3" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.1.0, parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse-ms@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-0.1.2.tgz#dd3fa25ed6c2efc7bdde12ad9b46c163aa29224e" + +parse-ms@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + +parseurl@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + +path-browserify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-key@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" + +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-platform@~0.11.15: + version "0.11.15" + resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + dependencies: + path-root-regex "^0.1.0" + +path-to-regexp@^1.0.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + dependencies: + isarray "0.0.1" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +pbkdf2@^3.0.3: + version "3.0.12" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.12.tgz#be36785c5067ea48d806ff923288c5f750b6b8a2" + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-1.0.0.tgz#d1da67f5482563bb7cf57f286ae2822ecfbf3670" + dependencies: + pinkie "^1.0.0" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-1.0.0.tgz#5a47f28ba1015d0201bda7bf0f358e47bec8c7e4" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pjs-problems@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pjs-problems/-/pjs-problems-2.0.1.tgz#c11f88f242024010486d270e00be7b41a3563c57" + +pkg-conf@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-2.0.0.tgz#071c87650403bccfb9c627f58751bfe47c067279" + dependencies: + find-up "^2.0.0" + load-json-file "^2.0.0" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + dependencies: + find-up "^1.0.0" + +pkg-up@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" + dependencies: + find-up "^1.0.0" + +plur@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" + +plur@^2.0.0, plur@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" + dependencies: + irregular-plurals "^1.0.0" + +pluralize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + +pngquant-bin@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pngquant-bin/-/pngquant-bin-3.1.1.tgz#d124d98a75a9487f40c1640b4dbfcbb2bd5a1fd1" + dependencies: + bin-build "^2.0.0" + bin-wrapper "^3.0.0" + logalot "^2.0.0" + +portfinder@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" + dependencies: + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" + +postcss-calc@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" + dependencies: + postcss "^5.0.2" + postcss-message-helpers "^2.0.0" + reduce-css-calc "^1.2.6" + +postcss-colormin@^2.1.8: + version "2.2.2" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" + dependencies: + colormin "^1.0.5" + postcss "^5.0.13" + postcss-value-parser "^3.2.3" + +postcss-convert-values@^2.3.4: + version "2.6.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" + dependencies: + postcss "^5.0.11" + postcss-value-parser "^3.1.2" + +postcss-discard-comments@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" + dependencies: + postcss "^5.0.14" + +postcss-discard-duplicates@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" + dependencies: + postcss "^5.0.4" + +postcss-discard-empty@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" + dependencies: + postcss "^5.0.14" + +postcss-discard-overridden@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" + dependencies: + postcss "^5.0.16" + +postcss-discard-unused@^2.2.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" + dependencies: + postcss "^5.0.14" + uniqs "^2.0.0" + +postcss-filter-plugins@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c" + dependencies: + postcss "^5.0.4" + uniqid "^4.0.0" + +postcss-load-config@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a" + dependencies: + cosmiconfig "^2.1.0" + object-assign "^4.1.0" + postcss-load-options "^1.2.0" + postcss-load-plugins "^2.3.0" + +postcss-load-options@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-load-options/-/postcss-load-options-1.2.0.tgz#b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c" + dependencies: + cosmiconfig "^2.1.0" + object-assign "^4.1.0" + +postcss-load-plugins@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz#745768116599aca2f009fad426b00175049d8d92" + dependencies: + cosmiconfig "^2.1.1" + object-assign "^4.1.0" + +postcss-merge-idents@^2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" + dependencies: + has "^1.0.1" + postcss "^5.0.10" + postcss-value-parser "^3.1.1" + +postcss-merge-longhand@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" + dependencies: + postcss "^5.0.4" + +postcss-merge-rules@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" + dependencies: + browserslist "^1.5.2" + caniuse-api "^1.5.2" + postcss "^5.0.4" + postcss-selector-parser "^2.2.2" + vendors "^1.0.0" + +postcss-message-helpers@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" + +postcss-minify-font-values@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" + dependencies: + object-assign "^4.0.1" + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-minify-gradients@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" + dependencies: + postcss "^5.0.12" + postcss-value-parser "^3.3.0" + +postcss-minify-params@^1.0.4: + version "1.2.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.2" + postcss-value-parser "^3.0.2" + uniqs "^2.0.0" + +postcss-minify-selectors@^2.0.4: + version "2.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" + dependencies: + alphanum-sort "^1.0.2" + has "^1.0.1" + postcss "^5.0.14" + postcss-selector-parser "^2.0.0" + +postcss-normalize-charset@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" + dependencies: + postcss "^5.0.5" + +postcss-normalize-url@^3.0.7: + version "3.0.8" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^1.4.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + +postcss-ordered-values@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.1" + +postcss-reduce-idents@^2.2.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" + dependencies: + postcss "^5.0.4" + postcss-value-parser "^3.0.2" + +postcss-reduce-initial@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" + dependencies: + postcss "^5.0.4" + +postcss-reduce-transforms@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" + dependencies: + has "^1.0.1" + postcss "^5.0.8" + postcss-value-parser "^3.0.1" + +postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-svgo@^2.1.1: + version "2.1.6" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" + dependencies: + is-svg "^2.0.0" + postcss "^5.0.14" + postcss-value-parser "^3.2.3" + svgo "^0.7.0" + +postcss-unique-selectors@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" + dependencies: + alphanum-sort "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + +postcss-zindex@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" + dependencies: + has "^1.0.1" + postcss "^5.0.4" + uniqs "^2.0.0" + +postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.8, postcss@^5.2.12, postcss@^5.2.16: + version "5.2.17" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.17.tgz#cf4f597b864d65c8a492b2eabe9d706c879c388b" + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.2.3" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.0, prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-bytes@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9" + +pretty-format@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-18.1.0.tgz#fb65a86f7a7f9194963eee91865c1bcf1039e284" + dependencies: + ansi-styles "^2.2.1" + +pretty-hrtime@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + +pretty-ms@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-0.2.2.tgz#da879a682ff33a37011046f13d627f67c73b84f6" + dependencies: + parse-ms "^0.1.0" + +pretty-ms@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-2.1.0.tgz#4257c256df3fb0b451d6affaab021884126981dc" + dependencies: + is-finite "^1.0.1" + parse-ms "^1.0.0" + plur "^1.0.0" + +private@^0.1.6, private@~0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +process@~0.11.0: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +proto-props@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/proto-props/-/proto-props-0.2.1.tgz#5e01dc2675a0de9abfa76e799dfa334d6f483f4b" + +pseudomap@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +public-encrypt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +punycode@^1.3.2, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +q@^1.1.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" + +qs@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.0.tgz#a9f31142af468cb72b25b30136ba2456834916be" + +qs@~2.2.3: + version "2.2.5" + resolved "https://registry.yarnpkg.com/qs/-/qs-2.2.5.tgz#1088abaf9dcc0ae5ae45b709e6c6b5888b23923c" + +qs@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz#e9e85adbe75da0bbe4c8e0476a086290f863b404" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@~0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +randomatic@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + +randombytes@^2.0.0, randombytes@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.4.tgz#9551df208422c8f80eb58e2326dd0b840ff22efd" + dependencies: + safe-buffer "^5.0.1" + +raw-body@~2.1.5: + version "2.1.7" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.13" + unpipe "1.0.0" + +rc@^1.0.1, rc@^1.1.2, rc@^1.1.6, rc@^1.1.7: + version "1.2.1" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +read-all-stream@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" + dependencies: + pinkie-promise "^2.0.0" + readable-stream "^2.0.0" + +read-only-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" + dependencies: + readable-stream "^2.0.2" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.26: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.6: + version "2.2.10" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.10.tgz#effe72bb7c884c0dd335e2379d526196d9d011ee" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "^5.0.1" + string_decoder "~1.0.0" + util-deprecate "~1.0.1" + +readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +readline2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + mute-stream "0.0.5" + +recast@^0.10.1: + version "0.10.43" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.43.tgz#b95d50f6d60761a5f6252e15d80678168491ce7f" + dependencies: + ast-types "0.8.15" + esprima-fb "~15001.1001.0-dev-harmony-fb" + private "~0.1.5" + source-map "~0.5.0" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +reduce-css-calc@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" + dependencies: + balanced-match "^0.4.2" + math-expression-evaluator "^1.2.14" + reduce-function-call "^1.0.1" + +reduce-function-call@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" + dependencies: + balanced-match "^0.4.2" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator-runtime@^0.10.0: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + +regenerator-transform@0.9.11: + version "0.9.11" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +registry-auth-token@^3.0.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +relateurl@0.2.x: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + +remove-trailing-separator@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + +req-all@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/req-all/-/req-all-1.0.0.tgz#d128569451c340b432409c656cf166260cd2628d" + +request@2, request@^2.79.0, request@^2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-from-string@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +require-precompiled@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/require-precompiled/-/require-precompiled-0.1.0.tgz#5a1b52eb70ebed43eb982e974c85ab59571e56fa" + +require-uncached@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +requires-port@1.x.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + +resolve-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-1.0.0.tgz#4eaeea41ed040d1702457df64a42b2b07d246f9f" + dependencies: + resolve-from "^2.0.0" + +resolve-dir@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" + dependencies: + expand-tilde "^1.2.2" + global-modules "^0.2.3" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve-from@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" + +resolve-url@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7: + version "1.3.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" + dependencies: + path-parse "^1.0.5" + +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.2.6, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" + dependencies: + hash-base "^2.0.0" + inherits "^2.0.1" + +rollup-stream@^1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/rollup-stream/-/rollup-stream-1.19.0.tgz#8ab70d3970d8ec8529f1c1d7a688d8d65f90599a" + dependencies: + rollup "^0.41.4" + +rollup@^0.41.4: + version "0.41.6" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.41.6.tgz#e0d05497877a398c104d816d2733a718a7a94e2a" + dependencies: + source-map-support "^0.4.0" + +run-async@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" + dependencies: + once "^1.3.0" + +rx-lite@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" + +rxjs@^5.0.0-beta.11: + version "5.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.0.tgz#a7db14ab157f9d7aac6a56e655e7a3860d39bf26" + dependencies: + symbol-observable "^1.0.1" + +safe-buffer@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.0.tgz#fe4c8460397f9eaaaa58e73be46273408a45e223" + +sass-graph@^2.1.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^7.0.0" + +sax@~1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" + +scss-tokenizer@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + dependencies: + js-base64 "^2.1.8" + source-map "^0.4.2" + +seek-bzip@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" + dependencies: + commander "~2.8.1" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +semver-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9" + +semver-truncate@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8" + dependencies: + semver "^5.3.0" + +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +semver@^4.0.3, semver@^4.1.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +sequencify@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" + +serviceworker-cache-polyfill@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz#de19ee73bef21ab3c0740a37b33db62464babdeb" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.0, set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: + version "2.4.8" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f" + dependencies: + inherits "^2.0.1" + +shasum@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" + dependencies: + json-stable-stringify "~0.0.0" + sha.js "~2.4.4" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shell-quote@^1.4.2, shell-quote@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + +shelljs@^0.7.5: + version "0.7.7" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.7.tgz#b2f5c77ef97148f4b4f6e22682e10bba8667cff1" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +sort-keys@^1.0.0, sort-keys@^1.1.1, sort-keys@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + dependencies: + is-plain-obj "^1.0.0" + +source-map-resolve@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.3.1.tgz#610f6122a445b8dd51535a2a71b783dfc1248761" + dependencies: + atob "~1.1.0" + resolve-url "~0.2.1" + source-map-url "~0.3.0" + urix "~0.1.0" + +source-map-support@^0.4.0, source-map-support@^0.4.2: + version "0.4.15" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" + dependencies: + source-map "^0.5.6" + +source-map-url@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" + +source-map@0.1.31: + version "0.1.31" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.31.tgz#9f704d0d69d9e138a81badf6ebb4fde33d151c61" + dependencies: + amdefine ">=0.0.4" + +source-map@0.5.x, source-map@0.X, source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.3: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +source-map@^0.1.38: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +sparkles@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +squeak@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/squeak/-/squeak-1.3.0.tgz#33045037b64388b567674b84322a6521073916c3" + dependencies: + chalk "^1.0.0" + console-stream "^0.1.1" + lpad-align "^1.0.1" + +sshpk@^1.7.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jodid25519 "^1.0.0" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stack-utils@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" + +staged-git-files@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-0.0.4.tgz#d797e1b551ca7a639dec0237dc6eb4bb9be17d35" + +stat-mode@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" + +statuses@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +stdout-stream@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" + dependencies: + readable-stream "^2.0.1" + +stream-browserify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-combiner2@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" + dependencies: + duplexer2 "~0.1.0" + readable-stream "^2.0.2" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-consume@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" + +stream-http@^2.0.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.1.tgz#546a51741ad5a6b07e9e31b0b10441a917df528a" + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.2.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +stream-splicer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.2" + +stream-to-observable@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.1.0.tgz#45bf1d9f2d7dc09bed81f1c307c430e68b84cffe" + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^3.0.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.1.tgz#62e200f039955a6810d8df0a33ffc0f013662d98" + dependencies: + safe-buffer "^5.0.1" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + dependencies: + ansi-regex "^0.2.1" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" + +strip-bom-buf@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz#1cb45aaf57530f4caf86c7f75179d2c9a51dd572" + dependencies: + is-utf8 "^0.2.1" + +strip-bom-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" + dependencies: + first-chunk-stream "^1.0.0" + strip-bom "^2.0.0" + +strip-bom-string@1.X: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + +strip-bom@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" + dependencies: + first-chunk-stream "^1.0.0" + is-utf8 "^0.2.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-dirs@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-1.1.1.tgz#960bbd1287844f3975a4558aa103a8255e2456a0" + dependencies: + chalk "^1.0.0" + get-stdin "^4.0.1" + is-absolute "^0.1.5" + is-natural-number "^2.0.0" + minimist "^1.1.0" + sum-up "^1.0.1" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +strip-outer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.0.tgz#aac0ba60d2e90c5d4f275fd8869fd9a2d310ffb8" + dependencies: + escape-string-regexp "^1.0.2" + +subarg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + dependencies: + minimist "^1.1.0" + +sum-up@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" + dependencies: + chalk "^1.0.0" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +svgo@^0.6.6: + version "0.6.6" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.6.6.tgz#b340889036f20f9b447543077d0f5573ed044c08" + dependencies: + coa "~1.0.1" + colors "~1.1.2" + csso "~2.0.0" + js-yaml "~3.6.0" + mkdirp "~0.5.1" + sax "~1.2.1" + whet.extend "~0.9.9" + +svgo@^0.7.0: + version "0.7.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" + dependencies: + coa "~1.0.1" + colors "~1.1.2" + csso "~2.3.1" + js-yaml "~3.7.0" + mkdirp "~0.5.1" + sax "~1.2.1" + whet.extend "~0.9.9" + +sw-precache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/sw-precache/-/sw-precache-5.1.1.tgz#928720957463e55ed56777e177c4699f35ec59b6" + dependencies: + dom-urls "^1.1.0" + es6-promise "^4.0.5" + glob "^7.1.1" + lodash.defaults "^4.2.0" + lodash.template "^4.4.0" + meow "^3.7.0" + mkdirp "^0.5.1" + pretty-bytes "^4.0.2" + sw-toolbox "^3.4.0" + update-notifier "^1.0.3" + +sw-toolbox@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/sw-toolbox/-/sw-toolbox-3.6.0.tgz#26df1d1c70348658e4dea2884319149b7b3183b5" + dependencies: + path-to-regexp "^1.0.1" + serviceworker-cache-polyfill "^4.0.0" + +symbol-observable@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" + +symbol-observable@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" + +syntax-error@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.3.0.tgz#1ed9266c4d40be75dc55bf9bb1cb77062bb96ca1" + dependencies: + acorn "^4.0.3" + +table@^3.7.8: + version "3.8.3" + resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" + dependencies: + ajv "^4.7.0" + ajv-keywords "^1.0.0" + chalk "^1.1.1" + lodash "^4.0.0" + slice-ansi "0.0.4" + string-width "^2.0.0" + +tar-pack@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar-stream@^1.1.1: + version "1.5.4" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.4.tgz#36549cf04ed1aee9b2a30c0143252238daf94016" + dependencies: + bl "^1.0.0" + end-of-stream "^1.0.0" + readable-stream "^2.0.0" + xtend "^4.0.0" + +tar@^2.0.0, tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +tempfile@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2" + dependencies: + os-tmpdir "^1.0.0" + uuid "^2.0.1" + +term-size@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-0.1.1.tgz#87360b96396cab5760963714cda0d0cbeecad9ca" + dependencies: + execa "^0.4.0" + +text-table@^0.2.0, text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +the-argv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/the-argv/-/the-argv-1.0.0.tgz#0084705005730dd84db755253c931ae398db9522" + +through2-concurrent@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/through2-concurrent/-/through2-concurrent-1.1.1.tgz#11cb4ea4c9e31bca6e4c1e6dba48d1c728c3524b" + dependencies: + through2 "^2.0.0" + +through2-filter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2@2.X, through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through2@^0.6.0, through2@^0.6.1, through2@^0.6.2, through2@^0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through@2, "through@>=2.2.7 <3", through@^2.3.6, through@~2.3, through@~2.3.1, through@~2.3.4: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +tildify@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + dependencies: + os-homedir "^1.0.0" + +time-require@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/time-require/-/time-require-0.1.2.tgz#f9e12cb370fc2605e11404582ba54ef5ca2b2d98" + dependencies: + chalk "^0.4.0" + date-time "^0.1.1" + pretty-ms "^0.2.1" + text-table "^0.2.0" + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + +timed-out@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + +timers-browserify@^1.0.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" + dependencies: + process "~0.11.0" + +to-absolute-glob@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" + dependencies: + extend-shallow "^2.0.1" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + +to-fast-properties@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-repeated@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" + dependencies: + escape-string-regexp "^1.0.2" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +tryit@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" + +tty-browserify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + +tunnel-agent@^0.4.0: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-detect@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" + +type-detect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" + +type-is@~1.6.10: + version "1.6.15" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.15" + +typedarray@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +uglify-es@^3.0.15: + version "3.0.15" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.0.15.tgz#4a23d0e9cb5f25f7bb3f1f0bbe0bb364e600d047" + dependencies: + commander "~2.9.0" + source-map "~0.5.1" + +uglify-js@2.x.x: + version "2.8.28" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.28.tgz#e335032df9bb20dcb918f164589d5af47f38834a" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-js@3.0.x, uglify-js@^3.0.5: + version "3.0.15" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.0.15.tgz#aacb323a846b234602270dead8a32441a8806f42" + dependencies: + commander "~2.9.0" + source-map "~0.5.1" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uglifyify@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/uglifyify/-/uglifyify-3.0.4.tgz#487e080a5a7798880e68e90def9b06681fb13bd2" + dependencies: + convert-source-map "~1.1.0" + extend "^1.2.1" + minimatch "^3.0.2" + through "~2.3.4" + uglify-js "2.x.x" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +uid2@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82" + +umd@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e" + +unc-path-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + +union@~0.4.3: + version "0.4.6" + resolved "https://registry.yarnpkg.com/union/-/union-0.4.6.tgz#198fbdaeba254e788b0efcb630bc11f24a2959e0" + dependencies: + qs "~2.3.3" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + +uniqid@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1" + dependencies: + macaddress "^0.2.8" + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + +unique-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" + +unique-stream@^2.0.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" + dependencies: + json-stable-stringify "^1.0.0" + through2-filter "^2.0.0" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + dependencies: + crypto-random-string "^1.0.0" + +unique-temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz#6dce95b2681ca003eebfb304a415f9cbabcc5385" + dependencies: + mkdirp "^0.5.1" + os-tmpdir "^1.0.1" + uid2 "0.0.3" + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +unreachable-branch-transform@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/unreachable-branch-transform/-/unreachable-branch-transform-0.3.0.tgz#d99cc4c6e746d264928845b611db54b0f3474caa" + dependencies: + esmangle-evaluator "^1.0.0" + recast "^0.10.1" + through2 "^0.6.2" + +unzip-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + +update-notifier@^1.0.0, update-notifier@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-1.0.3.tgz#8f92c515482bd6831b7c93013e70f87552c7cf5a" + dependencies: + boxen "^0.6.0" + chalk "^1.0.0" + configstore "^2.0.0" + is-npm "^1.0.0" + latest-version "^2.0.0" + lazy-req "^1.1.0" + semver-diff "^2.0.0" + xdg-basedir "^2.0.0" + +update-notifier@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.1.0.tgz#ec0c1e53536b76647a24b77cb83966d9315123d9" + dependencies: + boxen "^1.0.0" + chalk "^1.0.0" + configstore "^3.0.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + lazy-req "^2.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + +urijs@^1.16.1: + version "1.18.10" + resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.18.10.tgz#b94463eaba59a1a796036a467bb633c667f221ab" + +urix@^0.1.0, urix@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +url-join@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" + +url-regex@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724" + dependencies: + ip-regex "^1.0.1" + +url@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +user-home@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" + dependencies: + os-homedir "^1.0.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util@0.10.3, util@~0.10.1: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +uuid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +uuid@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + +v8flags@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +vali-date@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +vendors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +vinyl-assign@^1.0.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/vinyl-assign/-/vinyl-assign-1.2.1.tgz#4d198891b5515911d771a8cd9c5480a46a074a45" + dependencies: + object-assign "^4.0.1" + readable-stream "^2.0.0" + +vinyl-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vinyl-buffer/-/vinyl-buffer-1.0.0.tgz#ca067ea08431d507722b1de5083f602616ebc234" + dependencies: + bl "^0.9.1" + through2 "^0.6.1" + +vinyl-fs@^0.3.0: + version "0.3.14" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" + dependencies: + defaults "^1.0.0" + glob-stream "^3.1.5" + glob-watcher "^0.0.6" + graceful-fs "^3.0.0" + mkdirp "^0.5.0" + strip-bom "^1.0.0" + through2 "^0.6.1" + vinyl "^0.4.0" + +vinyl-fs@^2.2.0: + version "2.4.4" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239" + dependencies: + duplexify "^3.2.0" + glob-stream "^5.3.2" + graceful-fs "^4.0.0" + gulp-sourcemaps "1.6.0" + is-valid-glob "^0.3.0" + lazystream "^1.0.0" + lodash.isequal "^4.0.0" + merge-stream "^1.0.0" + mkdirp "^0.5.0" + object-assign "^4.0.0" + readable-stream "^2.0.4" + strip-bom "^2.0.0" + strip-bom-stream "^1.0.0" + through2 "^2.0.0" + through2-filter "^2.0.0" + vali-date "^1.0.0" + vinyl "^1.0.0" + +vinyl-source-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vinyl-source-stream/-/vinyl-source-stream-1.1.0.tgz#44cbe5108205279deb0c5653c094a2887938b1ab" + dependencies: + through2 "^0.6.1" + vinyl "^0.4.3" + +vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" + dependencies: + source-map "^0.5.1" + +vinyl@1.X, vinyl@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^0.4.0, vinyl@^0.4.3: + version "0.4.6" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" + dependencies: + clone "^0.2.0" + clone-stats "^0.0.1" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vm-browserify@~0.0.1: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + +ware@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ware/-/ware-1.3.0.tgz#d1b14f39d2e2cb4ab8c4098f756fe4b164e473d4" + dependencies: + wrap-fn "^0.1.0" + +watchify@^3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.9.0.tgz#f075fd2e8a86acde84cedba6e5c2a0bedd523d9e" + dependencies: + anymatch "^1.3.0" + browserify "^14.0.0" + chokidar "^1.0.0" + defined "^1.0.0" + outpipe "^1.1.0" + through2 "^2.0.0" + xtend "^4.0.0" + +websocket-driver@>=0.3.6: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + dependencies: + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" + +whet.extend@~0.9.9: + version "0.9.9" + resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which@1, which@^1.2.10, which@^1.2.12, which@^1.2.8, which@^1.2.9: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +widest-line@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" + dependencies: + string-width "^1.0.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrap-fn@^0.1.0: + version "0.1.5" + resolved "https://registry.yarnpkg.com/wrap-fn/-/wrap-fn-0.1.5.tgz#f21b6e41016ff4a7e31720dbc63a09016bdf9845" + dependencies: + co "3.1.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write-file-atomic@^1.1.2, write-file-atomic@^1.1.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write-file-atomic@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.1.0.tgz#1769f4b551eedce419f0505deae2e26763542d37" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write-json-file@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.2.0.tgz#51862506bbb3b619eefab7859f1fd6c6d0530876" + dependencies: + detect-indent "^5.0.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + pify "^2.0.0" + sort-keys "^1.1.1" + write-file-atomic "^2.0.0" + +write-pkg@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-2.1.0.tgz#353aa44c39c48c21440f5c08ce6abd46141c9c08" + dependencies: + sort-keys "^1.1.2" + write-json-file "^2.0.0" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + +xdg-basedir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" + dependencies: + os-homedir "^1.0.0" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + +xml-char-classes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/xml-char-classes/-/xml-char-classes-1.0.0.tgz#64657848a20ffc5df583a42ad8a277b4512bbc4d" + +xo-init@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/xo-init/-/xo-init-0.5.0.tgz#8e28dec79676cc5e042fde5fd8f710e2646b0e36" + dependencies: + arrify "^1.0.0" + execa "^0.5.0" + minimist "^1.1.3" + path-exists "^3.0.0" + read-pkg-up "^2.0.0" + the-argv "^1.0.0" + write-pkg "^2.0.0" + +xo@^0.18.2: + version "0.18.2" + resolved "https://registry.yarnpkg.com/xo/-/xo-0.18.2.tgz#92a42eb02a4fb149dfea5518021914f5aac84ff0" + dependencies: + arrify "^1.0.0" + debug "^2.2.0" + deep-assign "^1.0.0" + eslint "^3.18.0" + eslint-config-xo "^0.18.0" + eslint-formatter-pretty "^1.0.0" + eslint-plugin-ava "^4.2.0" + eslint-plugin-import "^2.0.0" + eslint-plugin-no-use-extend-native "^0.3.2" + eslint-plugin-promise "^3.4.0" + eslint-plugin-unicorn "^2.1.0" + get-stdin "^5.0.0" + globby "^6.0.0" + has-flag "^2.0.0" + ignore "^3.2.6" + lodash.isequal "^4.4.0" + meow "^3.4.2" + multimatch "^2.1.0" + path-exists "^3.0.0" + pkg-conf "^2.0.0" + resolve-cwd "^1.0.0" + resolve-from "^2.0.0" + slash "^1.0.0" + update-notifier "^2.1.0" + xo-init "^0.5.0" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yallist@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + dependencies: + camelcase "^3.0.0" + +yargs@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yauzl@^2.2.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.8.0.tgz#79450aff22b2a9c5a41ef54e02db907ccfbf9ee2" + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.0.1" + +zopflipng-bin@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/zopflipng-bin/-/zopflipng-bin-4.0.0.tgz#e3cd3d1264605f38f405a770c191e89520bfa22e" + dependencies: + bin-build "^2.0.0" + bin-wrapper "^3.0.0" + logalot "^2.0.0"